/* * 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(); } }