Package org.jboss.seam.wiki.core.ui

Source Code of org.jboss.seam.wiki.core.ui.WikiUserPortraitResource

/*
* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.seam.wiki.core.ui;

import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.intercept.BypassInterceptors;

import static org.jboss.seam.ScopeType.APPLICATION;
import org.jboss.seam.web.AbstractResource;
import org.jboss.seam.log.Logging;
import org.jboss.seam.log.Log;
import org.jboss.seam.servlet.ContextualHttpServletRequest;
import org.jboss.seam.wiki.core.dao.UserDAO;
import org.jboss.seam.wiki.core.model.User;
import org.jboss.seam.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
* Serves user portraits from the database, so we don't have to use s:graphicImage anymore.
*
* This helps caching on the browser, as image URIs will be stable and not random keys into a current HttpSession.
*
* @author Christian Bauer
*/
@Scope(APPLICATION)
@Name("wikiUserPortraitThemeResource")
@BypassInterceptors
public class WikiUserPortraitResource extends AbstractResource {

    // Resources URIs end with /<userId>/<l|s>
    public static Pattern RESOURCE_PATTERN = Pattern.compile("^/([0-9]+)/([ls]{1})$");

    public static final String REGISTER_SEAM_RESOURCE = "/wikiUserPortrait";

    private Log log = Logging.getLog(WikiUserPortraitResource.class);

    @Override
    public String getResourcePath() {
        return REGISTER_SEAM_RESOURCE;
    }

    @Override
    public void getResource(final HttpServletRequest request, final HttpServletResponse response)
            throws ServletException, IOException {

        // Wrap this, we need an ApplicationContext
        new ContextualHttpServletRequest(request) {
            @Override
            public void process() throws IOException {
                doWork(request, response);
            }
        }.run();

    }

    public void doWork(HttpServletRequest request, HttpServletResponse response)
            throws IOException {

        String pathInfo = request.getPathInfo().substring(getResourcePath().length());

        String userId = null;
        String imageSize = null;
        Matcher matcher = RESOURCE_PATTERN.matcher(pathInfo);
        if (matcher.find()) {
            userId = matcher.group(1);
            imageSize = matcher.group(2);
            log.debug("request for user id: " + userId + ", image size: " + imageSize);
        }

        if (userId == null || imageSize == null) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid request path, use: /wikiUserPortrait/[0-9]+/(l|s)");
            return;
        }

        UserDAO userDAO = (UserDAO) Component.getInstance(UserDAO.class);
        User user = userDAO.findUser(Long.valueOf(userId));
        if (user == null || user.getProfile().getImageContentType() == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND, "User id not found or no portrait for user");
            return;
        }

        byte[] image = imageSize.equals("l") ? user.getProfile().getImage() : user.getProfile().getSmallImage();
        response.setContentType(user.getProfile().getImageContentType());
        response.setContentLength(image.length);
        response.getOutputStream().write(image);
        response.getOutputStream().flush();
    }

}
TOP

Related Classes of org.jboss.seam.wiki.core.ui.WikiUserPortraitResource

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.