/* * * Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under * one or more contributor license agreements (see COPYRIGHT for details). * The CA licenses this file to you under the GNU Affero General Public * License version 3, (the "License"); you may not use this file except in * compliance with the License. This file is part of kune. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * \*/ package cc.kune.core.server.manager.file; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.List; import javax.activation.MimetypesFileTypeMap; import javax.persistence.NoResultException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.waveprotocol.box.server.CoreSettings; import cc.kune.core.server.access.FinderService; import cc.kune.core.server.manager.GroupManager; import cc.kune.core.shared.FileConstants; import cc.kune.core.shared.domain.utils.StateToken; import cc.kune.domain.Content; import cc.kune.domain.Group; import cc.kune.initials.InitialsAvatarsServerUtils; import com.google.inject.Inject; import com.google.inject.name.Named; // TODO: Auto-generated Javadoc /** * The Class EntityLogoDownloadManager. * * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado) */ public class EntityLogoDownloadManager extends HttpServlet { /** The Constant serialVersionUID. */ private static final long serialVersionUID = -1958945058088446881L; private final byte[] clearLogo; private final String clearMime; private final FinderService contentFinder; /** The current last modified. */ private long currentLastModified; /** The default last modified. */ final private long defaultLastModified; private final String domain; /** The group logo. */ private final byte[] groupLogo; /** The group manager. */ GroupManager groupManager; /** The group mime. */ private final String groupMime; /** The unknown logo. */ private final byte[] unknownLogo; /** The unknown mime. */ private final String unknownMime; /** * Instantiates a new entity logo download manager. * * @param resourceBases * the resource bases * @param groupManager * the group manager * @throws IOException * Signals that an I/O exception has occurred. */ @Inject public EntityLogoDownloadManager(@Named(CoreSettings.RESOURCE_BASES) final List<String> resourceBases, final GroupManager groupManager, @Named(CoreSettings.WAVE_SERVER_DOMAIN) final String domain, final FinderService contentFinder) throws IOException { this.groupManager = groupManager; this.domain = domain; this.contentFinder = contentFinder; final File groupFile = getFile(resourceBases, FileConstants.GROUP_NO_AVATAR_IMAGE); groupMime = getMime(groupFile); groupLogo = getBy(groupFile); final File unknownFile = getFile(resourceBases, FileConstants.NO_RESULT_AVATAR_IMAGE); unknownMime = getMime(unknownFile); unknownLogo = getBy(unknownFile); final File clearFile = getFile(resourceBases, FileConstants.TRANSPARENT_PIXEL); clearMime = getMime(clearFile); clearLogo = getBy(clearFile); defaultLastModified = 0l; } private void clearResult(final HttpServletResponse resp) throws IOException { reply(resp, clearLogo, clearMime); } /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ @Override protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { currentLastModified = defaultLastModified; String parameter = req.getParameter(FileConstants.WAVE_URI); if (parameter != null) { // Is a waveref request for a group logo of content try { final String waveRef = parameter; // FIXME get this from a wave constant final Content content = contentFinder.getContainerByWaveRef(waveRef); final Group group = content.getOwner(); replyWithGroupLogo(resp, group); return; } catch (final javax.persistence.NoResultException e) { // Return transparent pixel clearResult(resp); return; } } parameter = req.getParameter(FileConstants.TOKEN); final StateToken stateToken = new StateToken(parameter); final String onlyUserS = req.getParameter(FileConstants.ONLY_USERS); final boolean onlyUsers = Boolean.parseBoolean(onlyUserS); Group group = Group.NO_GROUP; try { group = groupManager.findByShortName(stateToken.getGroup()); if (group == Group.NO_GROUP) { unknownResult(resp); return; } if (onlyUsers && !group.isPersonal()) { unknownResult(resp); return; } replyWithGroupLogo(resp, group); } catch (final NoResultException e) { unknownResult(resp); } } /** * Gets the by. * * @param file * the file * @return the by * @throws IOException * Signals that an I/O exception has occurred. */ private byte[] getBy(final File file) throws IOException { final BufferedInputStream is = new BufferedInputStream(new FileInputStream(file)); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); org.apache.commons.io.IOUtils.copy(is, baos); return baos.toByteArray(); } /** * Gets the file. * * @param resourceBases * the resource bases * @param location * the location * @return the file */ private File getFile(final List<String> resourceBases, final String location) { final File file = FileDownloadManagerUtils.searchFileInResourceBases(resourceBases, location); return file; } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServlet#getLastModified(javax.servlet.http. * HttpServletRequest) */ @Override protected long getLastModified(final HttpServletRequest req) { // http://oreilly.com/catalog/jservlet/chapter/ch03.html#14260 // (...)to play it safe, getLastModified() should always round down to the // nearest thousand milliseconds. return currentLastModified / 1000 * 1000; } /** * Gets the mime. * * @param file * the file * @return the mime */ private String getMime(final File file) { return new MimetypesFileTypeMap().getContentType(file); } /** * Reply. * * @param resp * the resp * @param logo * the logo * @param mime * the mime * @throws IOException * Signals that an I/O exception has occurred. */ private void reply(final HttpServletResponse resp, final byte[] logo, final String mime) throws IOException { resp.setContentLength(logo.length); resp.setContentType(mime); CacheUtils.setCache1Day(resp); resp.getOutputStream().write(logo); } private void replyWithGroupLogo(final HttpServletResponse resp, final Group group) throws IOException { if (!group.hasLogo()) { if (group.isPersonal()) { InitialsAvatarsServerUtils.doInitialsResponse(resp, 100, 100, group.getShortName() + "@" + domain); } else { reply(resp, groupLogo, groupMime); } } else { // Has logo currentLastModified = group.getLogoLastModifiedTime(); reply(resp, group.getLogo(), group.getLogoMime().toString()); } } /** * Unknown result. * * @param resp * the resp * @throws IOException * Signals that an I/O exception has occurred. */ private void unknownResult(final HttpServletResponse resp) throws IOException { reply(resp, unknownLogo, unknownMime); } }