/* * Copyright (C) 2003-2013 eXo Platform SAS. * * 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 org.exoplatform.platform.portlet.juzu.branding.models; import java.awt.image.BufferedImage; import java.io.InputStream; import java.util.Calendar; import org.exoplatform.services.cms.impl.ImageUtils; import javax.imageio.ImageIO; import javax.jcr.Node; import javax.jcr.Session; import org.apache.commons.fileupload.FileItem; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.security.ConversationState; /** * Created by The eXo Platform SAS Author : Nguyen Viet Bang * bangnv@exoplatform.com Jan 22, 2013 */ public class BrandingDataStorageService { private static final Log LOG = ExoLogger.getExoLogger(BrandingDataStorageService.class); public static int logoHeight = 34; RepositoryService repositoryService; public static String logo_preview_name = "logo_preview.png"; public static String logo_name = "logo.png"; public BrandingDataStorageService() { repositoryService = (RepositoryService) ExoContainerContext.getCurrentContainer() .getComponentInstanceOfType(RepositoryService.class); } /** * Save logo file in the jcr * * @param item, item file */ public void saveLogoPreview(FileItem item) { SessionProvider sessionProvider = SessionProvider.createSystemProvider(); try { Session session = sessionProvider.getSession("collaboration", repositoryService.getCurrentRepository()); Node rootNode = session.getRootNode(); if (!rootNode.hasNode("Application Data")) { rootNode.addNode("Application Data", "nt:folder"); session.save(); } Node applicationDataNode = rootNode.getNode("Application Data"); if (!applicationDataNode.hasNode("logos")) { applicationDataNode.addNode("logos", "nt:folder"); session.save(); } Node logosNode = applicationDataNode.getNode("logos"); Node fileNode = null; if (logosNode.hasNode(logo_preview_name)) { fileNode = logosNode.getNode(logo_preview_name); fileNode.remove(); session.save(); } fileNode = logosNode.addNode(logo_preview_name, "nt:file"); Node jcrContent = fileNode.addNode("jcr:content", "nt:resource"); jcrContent.setProperty("jcr:data", resizeImage(item.getInputStream())); jcrContent.setProperty("jcr:lastModified", Calendar.getInstance()); jcrContent.setProperty("jcr:encoding", "UTF-8"); jcrContent.setProperty("jcr:mimeType", item.getContentType()); logosNode.save(); session.save(); } catch (Exception e) { LOG.error("Branding - Error while saving the logo: ", e.getMessage()); } finally { sessionProvider.close(); ConversationState state = ConversationState.getCurrent(); String userId = (state != null) ? state.getIdentity().getUserId() : null; if (userId != null) { // LOG.info("Branding - A new logo on the navigation bar has been saved by user :" + userId); } } } /** * Move logo preview file to logo file */ public void saveLogo() { SessionProvider sessionProvider = SessionProvider.createSystemProvider(); try { Session session = sessionProvider.getSession("collaboration", repositoryService.getCurrentRepository()); Node rootNode = session.getRootNode(); if (!rootNode.hasNode("Application Data")) { rootNode.addNode("Application Data", "nt:folder"); session.save(); } Node applicationDataNode = rootNode.getNode("Application Data"); if (!applicationDataNode.hasNode("logos")) { applicationDataNode.addNode("logos", "nt:folder"); session.save(); } Node logosNode = applicationDataNode.getNode("logos"); Node fileNode = null; if (logosNode.hasNode(logo_name)) { fileNode = logosNode.getNode(logo_name); fileNode.remove(); session.save(); } if (logosNode.hasNode(logo_preview_name)) { fileNode = logosNode.getNode(logo_preview_name); String newPath = fileNode.getPath().replace(logo_preview_name, logo_name); session.move(fileNode.getPath(), newPath); session.save(); } } catch (Exception e) { LOG.error("Branding - Error while saving the logo: ", e.getMessage()); } finally { sessionProvider.close(); ConversationState state = ConversationState.getCurrent(); String userId = (state != null) ? state.getIdentity().getUserId() : null; if (userId != null) { LOG.info("Branding - A new logo on the navigation bar has been saved by user :" + userId); } } } /** * resize image to scale, just used in custom size case. When 0 as specified as width then it will be calculated automatically to fit with expected height. * @param input * @return * @throws Exception */ private static InputStream resizeImage(InputStream input) throws Exception{ BufferedImage buffer = ImageIO.read(input); return ImageUtils.scaleImage(buffer, 0, logoHeight, false); } }