/* * Copyright (C) 2003-2007 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.ecm.webui.component.explorer.thumbnail; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import javax.jcr.AccessDeniedException; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.lock.LockException; import javax.jcr.version.VersionException; import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer; import org.exoplatform.ecm.webui.utils.JCRExceptionManager; import org.exoplatform.ecm.webui.utils.Utils; import org.exoplatform.services.cms.mimetype.DMSMimeTypeResolver; import org.exoplatform.services.cms.thumbnail.ThumbnailService; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.upload.UploadResource; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.ComponentConfigs; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.UIPopupComponent; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIForm; import org.exoplatform.webui.form.input.UIUploadInput; /** * Created by The eXo Platform SARL * Author : Dang Van Minh * minh.dang@exoplatform.com * Oct 24, 2008 10:52:13 AM */ @ComponentConfigs({ @ComponentConfig(lifecycle = UIFormLifecycle.class, template = "app:/groovy/webui/component/explorer/thumbnail/UIThumbnailForm.gtmpl", events = { @EventConfig(listeners = UIThumbnailForm.SaveActionListener.class), @EventConfig(listeners = UIThumbnailForm.CancelActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIThumbnailForm.RemoveThumbnailActionListener.class, confirm = "UIThumbnailForm.msg.confirm-delete", phase = Phase.DECODE), @EventConfig(listeners = UIThumbnailForm.PreviewActionListener.class) }), @ComponentConfig(id="mediumSize", type = UIUploadInput.class, template = "app:/groovy/webui/component/explorer/thumbnail/UIFormUploadInput.gtmpl") }) public class UIThumbnailForm extends UIForm implements UIPopupComponent { /** * Logger. */ private static final Log LOG = ExoLogger.getLogger(UIThumbnailForm.class.getName()); private static final String THUMBNAIL_FIELD = "mediumSize"; private UploadResource currentUploadResource; private BufferedImage currentUploadImage; private String currentPreviewLink; public UIThumbnailForm() throws Exception { initForm(); } private void initForm() throws Exception { currentUploadResource = null; currentUploadImage = null; currentPreviewLink = null; setMultiPart(true); UIUploadInput uiInput = new UIUploadInput(THUMBNAIL_FIELD, THUMBNAIL_FIELD); removeChild(UIUploadInput.class); addUIFormInput(uiInput); } public String getThumbnailImage(Node node) throws Exception { return Utils.getThumbnailImage(node, ThumbnailService.MEDIUM_SIZE); } public String getPreviewImage() throws Exception { UIUploadInput input = this.getUIInput(THUMBNAIL_FIELD); String uploadId = input.getUploadIds()[0]; if(input.getUploadResource(uploadId) == null) return null; return Utils.getThumbnailImage(input.getUploadDataAsStream(uploadId), input.getUploadResource(uploadId).getFileName()); } public Node getSelectedNode() throws Exception { return getAncestorOfType(UIJCRExplorer.class).getRealCurrentNode(); } /* (non-Javadoc) * @see org.exoplatform.webui.form.UIForm#processRender(org.exoplatform.webui.application.WebuiRequestContext) */ @Override public void processRender(WebuiRequestContext context) throws Exception { Node currentRealNode = getSelectedNode(); if (getThumbnailImage(currentRealNode) == null) { setActions(new String[] {"Save", "Cancel"}); } else { setActions(new String[] {"RemoveThumbnail", "Cancel"}); } super.processRender(context); } public Node getThumbnailNode(Node node) throws Exception { ThumbnailService thumbnailService = getApplicationComponent(ThumbnailService.class); return thumbnailService.getThumbnailNode(node); } /** * @return the currentUploadImage */ public BufferedImage getCurrentUploadImage() { return currentUploadImage; } /** * @param currentUploadImage the currentUploadImage to set */ public void setCurrentUploadImage(BufferedImage currentUploadImage) { this.currentUploadImage = currentUploadImage; } /** * @return the currentUploadResource */ public UploadResource getCurrentUploadResource() { return currentUploadResource; } /** * @param currentUploadResource the currentUploadResource to set */ public void setCurrentUploadResource(UploadResource currentUploadResource) { this.currentUploadResource = currentUploadResource; } /** * @param currentPreviewLink the currentPreviewLink to set */ public void setCurrentPreviewLink(String currentPreviewLink) { this.currentPreviewLink = currentPreviewLink; } /** * @return the currentPreviewLink */ public String getCurrentPreviewLink() { return currentPreviewLink; } static public class SaveActionListener extends EventListener<UIThumbnailForm> { public void execute(Event<UIThumbnailForm> event) throws Exception { UIThumbnailForm uiForm = event.getSource(); UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class) ; UIJCRExplorer uiExplorer = uiForm.getAncestorOfType(UIJCRExplorer.class); // Check resource available if(uiForm.getCurrentUploadResource() == null) { uiApp.addMessage(new ApplicationMessage("UIThumbnailForm.msg.fileName-error", null, ApplicationMessage.WARNING)); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm); return; } // Check if file is image String fileName = uiForm.getCurrentUploadResource().getFileName(); DMSMimeTypeResolver mimeTypeSolver = DMSMimeTypeResolver.getInstance(); String mimeType = mimeTypeSolver.getMimeType(fileName) ; if(!mimeType.startsWith("image")) { uiApp.addMessage(new ApplicationMessage("UIThumbnailForm.msg.mimetype-incorrect", null, ApplicationMessage.WARNING)); return; } // Add lock token Node selectedNode = uiExplorer.getRealCurrentNode(); uiExplorer.addLockToken(selectedNode); // Create thumbnail ThumbnailService thumbnailService = WCMCoreUtils.getService(ThumbnailService.class); try { thumbnailService.createThumbnailImage(selectedNode, uiForm.getCurrentUploadImage(), mimeType); selectedNode.getSession().save(); uiExplorer.updateAjax(event); } catch(AccessDeniedException ace) { uiApp.addMessage(new ApplicationMessage("UIThumbnailForm.msg.access-denied", null, ApplicationMessage.WARNING)); } catch(VersionException ver) { uiApp.addMessage(new ApplicationMessage("UIThumbnailForm.msg.is-checked-in", null, ApplicationMessage.WARNING)); } catch(LockException lock) { Object[] arg = { selectedNode.getPath() }; uiApp.addMessage(new ApplicationMessage("UIPopupMenu.msg.node-locked", arg, ApplicationMessage.WARNING)); } catch(PathNotFoundException path) { uiApp.addMessage(new ApplicationMessage("UIPopupMenu.msg.path-not-found-exception", null,ApplicationMessage.WARNING)); } catch(Exception e) { if (LOG.isErrorEnabled()) { LOG.error("An unexpected error occurs", e); } JCRExceptionManager.process(uiApp, e); } } } static public class PreviewActionListener extends EventListener<UIThumbnailForm> { public void execute(Event<UIThumbnailForm> event) throws Exception { UIThumbnailForm uiForm = event.getSource(); // Current review link UIUploadInput input = (UIUploadInput)uiForm.getUIInput(THUMBNAIL_FIELD); String uploadId = input.getUploadIds()[0]; if (input.getUploadDataAsStream(uploadId) != null) { uiForm.setCurrentPreviewLink(uiForm.getPreviewImage()); uiForm.setCurrentUploadImage(ImageIO.read(input.getUploadDataAsStream(uploadId))); uiForm.setCurrentUploadResource(input.getUploadResource(uploadId)); } else { uiForm.setCurrentPreviewLink(null); uiForm.setCurrentUploadImage(null); uiForm.setCurrentUploadResource(null); } // New upload input uiForm.removeChild(UIUploadInput.class); UIUploadInput uiInput = new UIUploadInput(THUMBNAIL_FIELD, THUMBNAIL_FIELD) ; uiForm.addUIFormInput(uiInput) ; } } static public class RemoveThumbnailActionListener extends EventListener<UIThumbnailForm> { public void execute(Event<UIThumbnailForm> event) throws Exception { UIThumbnailForm uiForm = event.getSource(); UIJCRExplorer uiExplorer = uiForm.getAncestorOfType(UIJCRExplorer.class); Node selectedNode = uiExplorer.getRealCurrentNode(); UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class); uiExplorer.addLockToken(selectedNode); ThumbnailService thumbnailService = uiForm.getApplicationComponent(ThumbnailService.class); Node thumbnailNode = thumbnailService.getThumbnailNode(selectedNode); if(thumbnailNode != null) { try { // Remove thumbmail thumbnailNode.remove(); selectedNode.getSession().save(); // Reset form uiForm.initForm(); event.getRequestContext().addUIComponentToUpdateByAjax(uiForm); } catch(LockException lock) { Object[] arg = { selectedNode.getPath() }; uiApp.addMessage(new ApplicationMessage("UIPopupMenu.msg.node-locked", arg, ApplicationMessage.WARNING)); } catch(AccessDeniedException ace) { uiApp.addMessage(new ApplicationMessage("UIPopupMenu.msg.access-denied", null, ApplicationMessage.WARNING)); uiExplorer.updateAjax(event); } catch(PathNotFoundException path) { uiApp.addMessage(new ApplicationMessage("UIPopupMenu.msg.path-not-found-exception", null,ApplicationMessage.WARNING)); } catch(Exception e) { if (LOG.isErrorEnabled()) { LOG.error("An unexpected error occurs", e); } JCRExceptionManager.process(uiApp, e); } } } } static public class CancelActionListener extends EventListener<UIThumbnailForm> { public void execute(Event<UIThumbnailForm> event) throws Exception { UIJCRExplorer uiExplorer = event.getSource().getAncestorOfType(UIJCRExplorer.class); uiExplorer.cancelAction(); } } public void activate() {} public void deActivate() {} }