/* * JBoss, Home of Professional Open Source * Copyright 2013, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.richfaces.photoalbum.manager; /** * Class encapsulated all functionality, related to working with image. * * @author Andrey Markhel */ import java.util.Date; import java.util.List; import java.util.Set; import javax.enterprise.context.RequestScoped; import javax.enterprise.event.Event; import javax.enterprise.inject.Any; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.inject.Inject; import javax.inject.Named; import javax.servlet.http.HttpServletRequest; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import org.richfaces.photoalbum.model.Comment; import org.richfaces.photoalbum.model.Image; import org.richfaces.photoalbum.model.MetaTag; import org.richfaces.photoalbum.model.User; import org.richfaces.photoalbum.model.actions.IImageAction; import org.richfaces.photoalbum.model.event.ErrorEvent; import org.richfaces.photoalbum.model.event.EventType; import org.richfaces.photoalbum.model.event.Events; import org.richfaces.photoalbum.model.event.ImageEvent; import org.richfaces.photoalbum.model.event.NavEvent; import org.richfaces.photoalbum.model.event.SimpleEvent; import org.richfaces.photoalbum.util.Constants; import org.richfaces.photoalbum.util.Preferred; @Named @RequestScoped public class ImageManager { private static final String IMAGE_DIRECT_LINK = "/includes/directImage.seam?imageId="; @Inject IImageAction imageAction; @Inject @Preferred User user; @Inject @EventType(Events.ADD_ERROR_EVENT) Event<ErrorEvent> error; @Inject @Any Event<SimpleEvent> event; @Inject @EventType(Events.UPDATE_MAIN_AREA_EVENT) Event<NavEvent> navEvent; @Inject @EventType(Events.IMAGE_DELETED_EVENT) Event<ImageEvent> imageEvent; private String message = ""; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } /** * Method, that invoked when user click 'Delete image' button. Only registered users can delete images. * * @param image - image to delete * */ public void deleteImage(Image image) { if (user == null) { return; } String pathToDelete = image.getFullPath(); try { imageAction.deleteImage(image); } catch (Exception e) { error.fire(new ErrorEvent("Error", Constants.IMAGE_DELETING_ERROR + " <br/>" + e.getMessage())); return; } // Raise 'imageDeleted' event, parameter path - path of file to delete imageEvent.fire(new ImageEvent(image, pathToDelete)); } /** * Method, that invoked when user click 'Edit image' button. Only registered users can edit images. * * @param image - image to edit * @param editFromInplace - indicate whether edit process was initiated by inplaceInput component */ public void editImage(Image image, boolean editFromInplace) { if (user == null) { return; } try { if (user.hasImageWithName(image)) { error.fire(new ErrorEvent("Error", Constants.SAME_IMAGE_EXIST_ERROR)); imageAction.resetImage(image); return; } if (editFromInplace) { // We need validate image name manually Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set<ConstraintViolation<Image>> constraintViolations = validator.validate(image); if (constraintViolations.size() > 0) { for (ConstraintViolation<Image> cv : constraintViolations) { error.fire(new ErrorEvent("Constraint violation", cv.getMessage())); } // If error occurred we need refresh album to display correct value in inplaceInput imageAction.resetImage(image); return; } } imageAction.editImage(image, !editFromInplace); } catch (Exception e) { error.fire(new ErrorEvent("Error", Constants.IMAGE_SAVING_ERROR + " <br/>" + e.getMessage())); imageAction.resetImage(image); return; } navEvent.fire(new NavEvent(NavigationEnum.ALBUM_IMAGE_PREVIEW)); } /** * Method, that invoked when user add comment to image. Only registered users can add comments to image. * * @param image - image * @param message - comment text * */ public void addComment(Image image) { if (user == null) { return; } if (null == user.getLogin()) { error.fire(new ErrorEvent(Constants.ADDING_COMMENT_ERROR)); return; } if (message.trim().equals("")) { error.fire(new ErrorEvent(Constants.NULL_COMMENT_ERROR)); return; } Comment comment = new Comment(); comment.setAuthor(user); comment.setImage(image); comment.setDate(new Date()); comment.setMessage(message); try { imageAction.addComment(comment); } catch (Exception e) { error.fire(new ErrorEvent("Error", Constants.SAVE_COMMENT_ERROR + " <br/>" + e.getMessage())); return; } message = ""; } /** * Method, that invoked when user delete comment. Only registered users can delete comments. * * @param comment - comment to delete * */ public void deleteComment(Comment comment) { if (user == null) { return; } try { imageAction.deleteComment(comment); } catch (Exception e) { error.fire(new ErrorEvent("Error", Constants.DELETE_COMMENT_ERROR + " <br/>" + e.getMessage())); return; } } /** * Method, that invoked to retrieve most popular metatags. * * @return List of most popular metatags * */ public List<MetaTag> popularTags() { return imageAction.getPopularTags(); } /** * Method, that used to autocomplete 'metatags' field while typing. * * @param suggest - text to autocomplete * @return List of similar metatags * */ public List<MetaTag> autoComplete(Object suggest) { String temp = (String) suggest; if (temp == null || temp.trim().equals("")) { return null; } return imageAction.getTagsLikeString(temp); } /** * Method, that invoked to retrieve direct link to image, to represent in UI. * * @param image - image to get direct link * @return List of similar metatags * */ public String getImageDirectLink(Image image) { String directLink = null; FacesContext context = FacesContext.getCurrentInstance(); if (context == null) { return null; } String value = context.getApplication().getViewHandler().getResourceURL(context, IMAGE_DIRECT_LINK + image.getId()); ExternalContext externalContext = context.getExternalContext(); String relativeURL = externalContext.encodeResourceURL(value); Object request = externalContext.getRequest(); if (request instanceof HttpServletRequest) { directLink = createServerURL((HttpServletRequest) request) + relativeURL; } return directLink; } private String createServerURL(HttpServletRequest request) { StringBuffer url = new StringBuffer(); if (request != null) { String name = request.getServerName(); String protocol = (request.getProtocol().split(Constants.SLASH))[0].toLowerCase(); int port = request.getServerPort(); url.append(protocol); url.append("://"); url.append(name); url.append(":"); url.append(Integer.toString(port)); } return url.toString(); } }