/* * 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; import java.io.Serializable; import javax.enterprise.context.SessionScoped; import javax.enterprise.event.Observes; import javax.enterprise.inject.Any; import javax.inject.Inject; import javax.inject.Named; import org.richfaces.component.UITree; import org.richfaces.photoalbum.model.Album; import org.richfaces.photoalbum.model.Event; import org.richfaces.photoalbum.model.Image; import org.richfaces.photoalbum.model.MetaTag; import org.richfaces.photoalbum.model.Shelf; import org.richfaces.photoalbum.model.User; import org.richfaces.photoalbum.model.event.AlbumEvent; import org.richfaces.photoalbum.model.event.ErrorEvent; import org.richfaces.photoalbum.model.event.EventType; import org.richfaces.photoalbum.model.event.EventTypeQualifier; import org.richfaces.photoalbum.model.event.Events; import org.richfaces.photoalbum.model.event.ImageEvent; import org.richfaces.photoalbum.model.event.ShelfEvent; import org.richfaces.photoalbum.model.event.SimpleEvent; import org.richfaces.photoalbum.social.facebook.FacebookAlbumCache; import org.richfaces.photoalbum.social.gplus.GooglePlusAlbumCache; import org.richfaces.photoalbum.util.Constants; import org.richfaces.photoalbum.util.Preferred; /** * This class represent 'C' in MVC pattern. It is logic that determine what actions invoked and what next page need to be * showed. Typically on almost all user actions, this class populates the model and determine new view to show. Also contain * utility logic, such as checking is the given shelf belongs to the specified user etc.. * * @author Andrey Markhel */ @Named @SessionScoped public class Controller implements Serializable { private static final long serialVersionUID = 5656562187249324512L; @Inject Model model; @Inject @Preferred private User loggedUser; @Inject UserBean loggedUserBean; @Inject FileManager fileManager; @Inject @EventType(Events.ADD_ERROR_EVENT) javax.enterprise.event.Event<ErrorEvent> error; @Inject @Any javax.enterprise.event.Event<SimpleEvent> event; @Inject FacebookAlbumCache fac; @Inject GooglePlusAlbumCache gpac; private int currentPage = 0; /** * Hack to prevent of returning 'null' user from @Produces method in UserBean. */ private User getLoggedUser() { return (loggedUser == null ? loggedUserBean.getUser() : loggedUser); } /** * This method invoked after the user want to see all predefined shelves, existed in application */ public void selectPublicShelves() { model.resetModel(NavigationEnum.ANONYM, getLoggedUser(), null, null, null, null); } /** * This method invoked after the user want to see all her shelves. */ public void selectShelves() { model.resetModel(NavigationEnum.ALL_SHELFS, getLoggedUser(), null, null, null, null); } /** * This method invoked after the user want to see all her albums. */ public void selectAlbums() { model.resetModel(NavigationEnum.ALL_ALBUMS, getLoggedUser(), null, null, null, null); } /** * This method invoked after the user want to see all her images. */ public void selectImages() { model.resetModel(NavigationEnum.ALL_IMAGES, getLoggedUser(), null, null, null, getLoggedUser().getImages()); } /** * This method invoked after the user want to edit specified shelf. * * @param shelf - shelf to edit */ public void startEditShelf(Shelf shelf) { if (getLoggedUser() == null) { return; } if (!canViewShelf(shelf)) { showError("", Constants.HAVENT_ACCESS); return; } model.resetModel(NavigationEnum.SHELF_EDIT, shelf.getOwner(), shelf, null, null, null); } /** * This method invoked after the user want to interrupt edit shelf process * */ public void cancelEditShelf() { model.resetModel(NavigationEnum.SHELF_PREVIEW, model.getSelectedShelf().getOwner(), model.getSelectedShelf(), null, null, null); } /** * This method invoked after the user want to see specified album independently is it her album or not. * * @param album - album to show */ public void showAlbum(Album album) { if (!canViewAlbum(album)) { showError("", Constants.HAVENT_ACCESS); return; } // FileManager fileManager = (FileManager) Contexts.getApplicationContext().get(Constants.FILE_MANAGER_COMPONENT); // Check, that album was not deleted recently. if (!fileManager.isDirectoryPresent(album.getPath())) { showError("", Constants.ALBUM_RECENTLY_DELETED_ERROR); model.resetModel(NavigationEnum.SHELF_PREVIEW, album.getOwner(), album.getShelf(), null, null, null); return; } setPage(0); // reset page when album changes/resets model.resetModel(NavigationEnum.ALBUM_PREVIEW, album.getOwner(), album.getShelf(), album, null, album.getImages()); } public void showFBAlbum(String albumId) { fac.setCurrentAlbumId(albumId); model.resetModel(NavigationEnum.FB_ALBUM_PREVIEW, getLoggedUser(), null, null, null, null); } public void showFbImage(String imageId) { setFPage(0); fac.setCurrentImageId(imageId); model.resetModel(NavigationEnum.FB_IMAGE_PREVIEW, getLoggedUser(), null, null, null, null); } public void showFbShelf() { model.resetModel(NavigationEnum.FB_SHELF, getLoggedUser(), null, null, null, null); } public void showGPlusShelf() { model.resetModel(NavigationEnum.GPLUS_SHELF, getLoggedUser(), null, null, null, null); } public void showGPlusAlbum() { model.resetModel(NavigationEnum.GPLUS_ALBUM_PREVIEW, getLoggedUser(), null, null, null, null); } public void showGPlusImage(String imageId) { setGplusPage(0); gpac.setCurrentImageId(imageId); model.resetModel(NavigationEnum.GPLUS_IMAGE_PREVIEW, getLoggedUser(), null, null, null, null); } /** * This method invoked in cases, when it is need to clear fileUpload component * */ public void resetFileUpload() { pushEvent(Events.CLEAR_FILE_UPLOAD_EVENT); } /** * This method invoked after the user want to see specified image independently is it her image or not. * * @param album - album to show */ public void showImage(Image image) { // Clear not-saved comment in editor pushEvent(Events.CLEAR_EDITOR_EVENT); if (!canViewImage(image)) { showError("", Constants.HAVENT_ACCESS); return; } // Check, that image was not deleted recently if (!fileManager.isFilePresent(image.getFullPath())) { showError("", Constants.IMAGE_RECENTLY_DELETED_ERROR); model.resetModel(NavigationEnum.ALBUM_PREVIEW, image.getAlbum().getOwner(), image.getAlbum().getShelf(), image.getAlbum(), null, image.getAlbum().getImages()); return; } model.resetModel(NavigationEnum.ALBUM_IMAGE_PREVIEW, image.getAlbum().getOwner(), image.getAlbum().getShelf(), image.getAlbum(), image, image.getAlbum().getImages()); image.setVisited(true); } public void showNextImage() { int id = model.getSelectedAlbum().getImages().indexOf(model.getSelectedImage()); int max = model.getSelectedAlbum().getImages().size() - 1; if (id == max) { id = -1; } setPage((id + 1) / 5 + 1); showImage(model.getSelectedAlbum().getImages().get(id + 1)); } public void showPrevImage() { int id = model.getSelectedAlbum().getImages().indexOf(model.getSelectedImage()); int max = model.getSelectedAlbum().getImages().size() - 1; if (id == 0) { id = max + 1; } setPage((id - 1) / 5 + 1); showImage(model.getSelectedAlbum().getImages().get(id - 1)); } public void showNextFbImage() { int id = fac.getCurrentImages().indexOf(fac.getCurrentImage()); int max = fac.getCurrentImages().size() - 1; if (id == max) { id = -1; } setPage((id + 1) / 5 + 1); showFbImage(fac.getCurrentImages().get(id + 1).optString("id")); } public void showPrevFbImage() { int id = fac.getCurrentImages().indexOf(fac.getCurrentImage()); int max = fac.getCurrentImages().size() - 1; if (id == 0) { id = max + 1; } setPage((id - 1) / 5 + 1); showFbImage(fac.getCurrentImages().get(id - 1).optString("id")); } public void showNextGPlusImage() { int id = gpac.getCurrentImages().indexOf(gpac.getCurrentImage()); int max = gpac.getCurrentImages().size() - 1; if (id == max) { id = -1; } setPage((id + 1) / 5 + 1); showGPlusImage(gpac.getCurrentImages().get(id + 1).optString("id")); } public void showPrevGPlusImage() { int id = gpac.getCurrentImages().indexOf(gpac.getCurrentImage()); int max = gpac.getCurrentImages().size() - 1; if (id == 0) { id = max + 1; } setPage((id - 1) / 5 + 1); showGPlusImage(gpac.getCurrentImages().get(id - 1).optString("id")); } /** * This method invoked after the user want to edit specified image. * * @param image - image to edit */ public void startEditImage(Image image) { if (getLoggedUser() == null) { return; } if (!canViewImage(image)) { showError("", Constants.HAVENT_ACCESS); return; } model.resetModel(NavigationEnum.ALBUM_IMAGE_EDIT, image.getOwner(), image.getAlbum().getShelf(), image.getAlbum(), image, image.getAlbum().getImages()); } /** * This method invoked after the user want to save just edited user to database. * */ public void editUser() { if (getLoggedUser() == null) { return; } pushEvent(Events.EDIT_USER_EVENT); } /** * This method invoked after the user want to interrupt edit user process * */ public void cancelEditUser() { pushEvent(Events.CANCEL_EDIT_USER_EVENT); } /** * This method invoked after the user want to interrupt edit image process * */ public void cancelEditImage() { model.resetModel(NavigationEnum.ALBUM_IMAGE_PREVIEW, model.getSelectedImage().getAlbum().getShelf().getOwner(), model .getSelectedImage().getAlbum().getShelf(), model.getSelectedImage().getAlbum(), model.getSelectedImage(), model .getSelectedImage().getAlbum().getImages()); } /** * This method invoked after the user want to see specified shelf independently is it her shelf or not. * * @param album - album to show */ public void showShelf(Shelf shelf) { if (!fileManager.isDirectoryPresent(shelf.getPath())) { showError("", Constants.SHELF_RECENTLY_DELETED_ERROR); model.resetModel(NavigationEnum.ANONYM, shelf.getOwner(), null, null, null, null); return; } model.resetModel(NavigationEnum.SHELF_PREVIEW, shelf.getOwner(), shelf, null, null, null); } public void showEvent(Event event) { model.resetModel(NavigationEnum.EVENT_PREVIEW, getLoggedUser(), null, null, null, null, event); pushEvent(Events.EVENT_DISPLAYED_EVENT); } /** * This method invoked after the user want to edit specified album. * * @param album - album to edit */ public void startEditAlbum(Album album) { if (getLoggedUser() == null) { return; } if (!album.isOwner(getLoggedUser())) { showError("", Constants.HAVENT_ACCESS); return; } model.resetModel(NavigationEnum.ALBUM_EDIT, album.getOwner(), album.getShelf(), album, null, album.getImages()); } /** * This method invoked after the user want to interrupt edit album process * */ public void cancelEditAlbum() { model.resetModel(NavigationEnum.ALBUM_PREVIEW, model.getSelectedAlbum().getOwner(), model.getSelectedAlbum().getShelf(), model.getSelectedAlbum(), null, model.getSelectedAlbum().getImages()); } /** * This method observes <code>Constants.ALBUM_ADDED_EVENT</code> and invoked after the user add new album * * @param album - added album */ public void onAlbumAdded(@Observes @EventType(Events.ALBUM_ADDED_EVENT) AlbumEvent ae) { Album album = ae.getAlbum(); if (album.isShowAfterCreate()) { model.resetModel(NavigationEnum.ALBUM_PREVIEW, album.getOwner(), album.getShelf(), album, null, album.getImages()); } } /** * This method observes <code>Constants.ALBUM_EDITED_EVENT</code> and invoked after the user edit her album * * @param album - edited album */ public void onAlbumEdited(@Observes @EventType(Events.ALBUM_EDITED_EVENT) AlbumEvent ae) { Album album = ae.getAlbum(); model.resetModel(NavigationEnum.ALBUM_PREVIEW, model.getSelectedUser(), model.getSelectedShelf(), album, null, album.getImages()); } /** * This method observes <code>Constants.ALBUM_DELETED_EVENT</code> and invoked after the user delete her album * * @param album - deleted album * @param path - relative path of the album directory */ public void onAlbumDeleted(@Observes @EventType(Events.ALBUM_DELETED_EVENT) AlbumEvent ae) { loggedUserBean.refreshUser(); model.resetModel(NavigationEnum.ALL_ALBUMS, getLoggedUser(), ae.getAlbum().getShelf(), null, null, null); } /** * This method observes <code>Constants.SHELF_DELETED_EVENT</code> and invoked after the user delete her shelf * * @param shelf - deleted shelf * @param path - relative path of the shelf directory */ public void onShelfDeleted(@Observes @EventType(Events.SHELF_DELETED_EVENT) ShelfEvent se) { loggedUserBean.refreshUser(); model.resetModel(NavigationEnum.ALL_SHELFS, getLoggedUser(), null, null, null, null); } /** * This method observes <code>Constants.SHELF_ADDED_EVENT</code> and invoked after the user add new shelf * * @param shelf - added shelf */ public void onShelfAdded(@Observes @EventType(Events.SHELF_ADDED_EVENT) ShelfEvent se) { Shelf shelf = se.getShelf(); model.resetModel(NavigationEnum.SHELF_PREVIEW, shelf.getOwner(), shelf, null, null, null); } /** * This method observes <code>Constants.SHELF_EDITED_EVENT</code> and invoked after the user edit her shelf * * @param shelf - edited shelf */ public void onShelfEdited(@Observes @EventType(Events.SHELF_EDITED_EVENT) ShelfEvent se) { Shelf shelf = se.getShelf(); model.resetModel(NavigationEnum.SHELF_PREVIEW, shelf.getOwner(), shelf, null, null, null); } public void onEventDeleted(@Observes @EventType(Events.EVENT_DELETED_EVENT) ShelfEvent se) { model.resetModel(NavigationEnum.ANONYM, getLoggedUser(), null, null, null, null, null); } public void onEventAdded(@Observes @EventType(Events.EVENT_ADDED_EVENT) ShelfEvent se) { model.resetModel(NavigationEnum.EVENT_PREVIEW, getLoggedUser(), null, null, null, null, se.getEvent()); pushEvent(Events.EVENT_DISPLAYED_EVENT); } public void onEventEdited(@Observes @EventType(Events.EVENT_EDITED_EVENT) ShelfEvent se) { model.resetModel(NavigationEnum.EVENT_PREVIEW, getLoggedUser(), null, null, null, null, se.getEvent()); pushEvent(Events.EVENT_DISPLAYED_EVENT); } /** * This method observes <code>Constants.IMAGE_DELETED_EVENT</code> and invoked after the user delete her image * * @param image - deleted image * @param path - relative path of the image file */ public void onImageDeleted(@Observes @EventType(Events.IMAGE_DELETED_EVENT) ImageEvent ie) { loggedUserBean.refreshUser(); Album album = ie.getImage().getAlbum(); model.resetModel(NavigationEnum.ALBUM_PREVIEW, getLoggedUser(), album.getShelf(), album, null, album.getImages()); } /** * This method observes <code>Constants.AUTHENTICATED_EVENT</code> and invoked after the user successfully authenticate to * the system * * @param u - authenticated user */ public void onAuthenticate(@Observes @EventType(Events.AUTHENTICATED_EVENT) SimpleEvent se) { model.resetModel(NavigationEnum.ALL_SHELFS, getLoggedUser(), null, null, null, null); } /** * This method invoked after the user want to go to the file-upload page * */ public void showFileUpload() { if (!(getLoggedUser().getShelves().size() > 0)) { // If user have no shelves, that can start fileupload process showError("", Constants.FILE_UPLOAD_SHOW_ERROR); return; } Album alb = null; // If selected album belongs to user alb = setDefaultAlbumToUpload(alb); model.resetModel(NavigationEnum.FILE_UPLOAD, getLoggedUser(), alb != null ? alb.getShelf() : null, alb, null, alb != null ? alb.getImages() : null); } /** * This method invoked after the user want to go to the file-upload page and download images to the specified album * * @param album - selected album * */ public void showFileUpload(Album album) { if (!isUserAlbum(album)) { showError("", Constants.YOU_CAN_T_ADD_IMAGES_TO_THAT_ALBUM_ERROR); return; } model.resetModel(NavigationEnum.FILE_UPLOAD, album.getShelf().getOwner(), album.getShelf(), album, null, album.getImages()); } /** * This method invoked after the user want to see all shared albums of the specified user * * @param user - user to see * */ public void showSharedAlbums(User user) { model.resetModel(NavigationEnum.USER_SHARED_ALBUMS, user, null, null, null, user.getSharedImages()); } /** * This method invoked after the user want to see all shared images of the specified user * * @param user - user to see * */ public void showSharedImages(User user) { model.resetModel(NavigationEnum.USER_SHARED_IMAGES, user, null, null, null, user.getSharedImages()); } /** * This method invoked after the user want to see profile of the specified user * * @param user - user to see * */ public void showUser(User user) { model.resetModel(NavigationEnum.USER_PREFS, user, null, null, null, null); // Contexts.getConversationContext().set(Constants.AVATAR_DATA_COMPONENT, null); } public void showCurrentUser() { showUser(getLoggedUser()); } /** * This method invoked after the user want to see all unvisited images, belongs to the of specified shelf * * @param shelf - shelf to see * */ public void showUnvisitedImages(Shelf shelf) { model.resetModel(NavigationEnum.SHELF_UNVISITED, shelf.getOwner(), shelf, null, null, shelf.getUnvisitedImages()); } /** * This method invoked after the user want to see all unvisited images, belongs to the of specified album * * @param album - album to see * */ public void showUnvisitedImages(Album album) { model.resetModel(NavigationEnum.ALBUM_UNVISITED, album.getOwner(), album.getShelf(), album, null, album.getUnvisitedImages()); } /** * This method invoked after the user want to see all images, related to the of specified album * * @param metatag - tag to see * */ public void showTag(MetaTag metatag) { model.resetModel(NavigationEnum.TAGS, model.getSelectedUser(), model.getSelectedShelf(), model.getSelectedAlbum(), model.getSelectedImage(), metatag.getImages()); model.setSelectedTag(metatag); } /** * This method observes <code>Constants.START_REGISTER_EVENT</code> and invoked after the user want to start registration * process. * */ public void startRegistration(@Observes @EventType(Events.START_REGISTER_EVENT) SimpleEvent se) { model.resetModel(NavigationEnum.REGISTER, getLoggedUser(), null, null, null, null); } /** * This method invoked after the user want to interrupt registration process * */ public void cancelRegistration() { model.resetModel(NavigationEnum.ANONYM, getLoggedUser(), null, null, null, null); } /** * This utility method determine if the specified node should be marked as selected. Used in internal rich:tree mechanism */ public Boolean adviseNodeSelected(UITree tree) { Object currentNode = tree.getRowData(); if (currentNode.equals(model.getSelectedAlbum()) || currentNode.equals(model.getSelectedShelf())) { return true; } return false; } /** * This utility method used by custom datascroller to determine images to show. Used in internal rich:tree mechanism */ public Integer getPage() { if (currentPage == 0) { Integer index = model.getSelectedAlbum().getIndex(model.getSelectedImage()); currentPage = index / 5 + 1; } return currentPage; } public void setPage(Integer page) { currentPage = page; } public Integer getFPage() { if (currentPage == 0) { Integer index = fac.getCurrentImages().indexOf(fac.getCurrentImage()); currentPage = index / 5 + 1; } return currentPage; } public void setFPage(Integer page) { currentPage = page; } public Integer getGplusPage() { if (currentPage == 0) { Integer index = gpac.getCurrentImages().indexOf(gpac.getCurrentImage()); currentPage = index / 5 + 1; } return currentPage; } public void setGplusPage(Integer page) { currentPage = page; } /** * This utility method used to determine if the specified image belongs to the logged user * * @param image - image to check */ public boolean isUserImage(Image image) { if (image == null || image.getOwner() == null || getLoggedUser() == null) { return false; } return getLoggedUser().equals(image.getOwner()); } /** * This utility method used to determine if the logged user have any shelves. * */ public boolean isUserHaveShelves() { return getLoggedUser().getShelves().size() > 0; // loggedUser might be null right after successful login } /** * This utility method used to determine if the logged user have any albums. * */ public boolean isUserHaveAlbums() { return getLoggedUser().getAlbums().size() > 0; } /** * This utility method used to determine if the specified shelf belongs to the logged user * * @param shelf - shelf to check */ public boolean isUserShelf(Shelf shelf) { return shelf != null && getLoggedUser() != null && getLoggedUser().equals(shelf.getOwner()); } /** * This utility method used to determine if the specified album belongs to the logged user * * @param album - album to check */ public boolean isUserAlbum(Album album) { return album != null && getLoggedUser() != null && getLoggedUser().equals(album.getOwner()); } /** * This utility method used to determine if the specified user can be edited * * @param user - user to check */ public boolean isProfileEditable(User selectedUser) { return selectedUser != null && selectedUser.equals(getLoggedUser()); } private boolean canViewShelf(Shelf shelf) { return shelf != null && shelf.isOwner(getLoggedUser()) || shelf.isShared(); } private boolean canViewAlbum(Album album) { return album != null && album.getShelf() != null && (album.getShelf().isShared() || album.isOwner(getLoggedUser())); } private boolean canViewImage(Image image) { return image != null && image.getAlbum() != null && (image.getAlbum().getShelf() != null && (image.getAlbum().getShelf().isShared() || image .isOwner(getLoggedUser()))); } /** * This utility method invoked in case if you want to show to the user specified error in popup * * @param error - error to show * */ public void showError(String summary, String errorMessage) { error.fire(new ErrorEvent(summary, errorMessage)); } private void pushEvent(Events eventType) { event.select(new EventTypeQualifier(eventType)).fire(new SimpleEvent()); } private Album setDefaultAlbumToUpload(Album alb) { if (isUserAlbum(model.getSelectedAlbum())) { alb = model.getSelectedAlbum(); } if (alb == null) { if (getLoggedUser() != null && getLoggedUser().getShelves().size() > 0 && getLoggedUser().getShelves().get(0).getAlbums().size() > 0) { for (Shelf s : getLoggedUser().getShelves()) { if (s.getAlbums().size() > 0) { alb = s.getAlbums().get(0); break; } } } } return alb; } /* * Checks if selected album belong to selected event */ public boolean isEventFacebookAlbum(String id) { return model.getSelectedEvent() != null && model.getSelectedEvent().getFacebookAlbumIds().contains(id); } public boolean isEventGoogleAlbum(String id) { return model.getSelectedEvent() != null && model.getSelectedEvent().getGooglePlusAlbumIds().contains(id); } }