/* * (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * <a href="mailto:grenard@nuxeo.com">Guillaume</a> */ package org.nuxeo.ecm.collections.jsf.actions; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.event.ActionEvent; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jboss.seam.Component; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.intercept.BypassInterceptors; import org.jboss.seam.core.Events; import org.jboss.seam.faces.FacesMessages; import org.jboss.seam.international.Messages; import org.jboss.seam.international.StatusMessage; import org.nuxeo.ecm.collections.api.CollectionConstants; import org.nuxeo.ecm.collections.api.CollectionManager; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.DocumentNotFoundException; import org.nuxeo.ecm.core.api.DocumentRef; import org.nuxeo.ecm.core.api.IdRef; import org.nuxeo.ecm.core.api.PropertyException; import org.nuxeo.ecm.platform.ui.web.api.NavigationContext; import org.nuxeo.ecm.webapp.documentsLists.DocumentsListsManager; import org.nuxeo.ecm.webapp.helpers.EventNames; import org.nuxeo.runtime.api.Framework; /** * @since 5.9.3 */ @Name("collectionActions") @Scope(ScopeType.PAGE) @BypassInterceptors public class CollectionActionsBean implements Serializable { private static final long serialVersionUID = 1L; public static final String COLLECTION_CURRENT_SELECTION = "COLLECTION_CURRENT_SELECTION"; public static final String DOCUMENT_ADDED_TO_COLLECTION_EVENT = "documentAddedToCollection"; public static final String DOCUMENT_REMOVED_FROM_COLLECTION_EVENT = "documentRemovedFromCollection"; private static final Log log = LogFactory.getLog(CollectionActionsBean.class); protected static void addFacesMessage(StatusMessage.Severity severity, String message, String arguments) { final FacesMessages facesMessages = (FacesMessages) Component.getInstance("facesMessages", true); facesMessages.add(severity, Messages.instance().get(message), Messages.instance().get(arguments)); } private List<String> docUidsToBeAdded; private String newDescription; private String newTitle; private DocumentModel selectedCollection; private String selectedCollectionUid; public void addCurrentDocumentToSelectedCollection() { final NavigationContext navigationContext = (NavigationContext) Component.getInstance("navigationContext", true); final DocumentModel currentDocument = navigationContext.getCurrentDocument(); if (currentDocument != null) { final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); final CoreSession session = (CoreSession) Component.getInstance("documentManager", true); if (isCreateNewCollection()) { collectionManager.addToNewCollection(getNewTitle(), getNewDescription(), currentDocument, session); } else { collectionManager.addToCollection(getSelectedCollection(), currentDocument, session); } Events.instance().raiseEvent(EventNames.DOCUMENT_CHANGED); navigationContext.invalidateCurrentDocument(); addFacesMessage(StatusMessage.Severity.INFO, "collection.addedToCollection", isCreateNewCollection() ? getNewTitle() : getSelectedCollection().getTitle()); } } public void addCurrentSelectionToSelectedCollection() { final DocumentsListsManager documentsListsManager = getDocumentsListsManager(); addToSelectedCollection(documentsListsManager.getWorkingList(DocumentsListsManager.CURRENT_DOCUMENT_SELECTION)); } public void addDocUidsToBeAddedToCurrentCollection() { final NavigationContext navigationContext = (NavigationContext) Component.getInstance("navigationContext", true); final DocumentModel currentDocument = navigationContext.getCurrentDocument(); final CoreSession session = (CoreSession) Component.getInstance("documentManager", true); List<DocumentModel> documentListToBeAdded = new ArrayList<DocumentModel>(docUidsToBeAdded.size()); for (String uid : docUidsToBeAdded) { documentListToBeAdded.add(session.getDocument(new IdRef(uid))); } final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); collectionManager.addToCollection(currentDocument, documentListToBeAdded, session); Events.instance().raiseEvent(EventNames.DOCUMENT_CHANGED); addFacesMessage(StatusMessage.Severity.INFO, "collection.allAddedToCollection", currentDocument.getTitle()); } public void addToSelectedCollection(final List<DocumentModel> documentListToBeAdded) { if (documentListToBeAdded != null && !documentListToBeAdded.isEmpty()) { final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); final CoreSession session = (CoreSession) Component.getInstance("documentManager", true); if (isCreateNewCollection()) { collectionManager.addToNewCollection(getNewTitle(), getNewDescription(), documentListToBeAdded, session); } else { collectionManager.addToCollection(getSelectedCollection(), documentListToBeAdded, session); } Events.instance().raiseEvent(EventNames.DOCUMENT_CHANGED); addFacesMessage(StatusMessage.Severity.INFO, "collection.allAddedToCollection", isCreateNewCollection() ? getNewTitle() : getSelectedCollection().getTitle()); } } public boolean canAddSelectedDocumentBeCollected() { final DocumentsListsManager documentsListsManager = getDocumentsListsManager(); List<DocumentModel> documents = documentsListsManager.getWorkingList(DocumentsListsManager.CURRENT_DOCUMENT_SELECTION); if (documents == null || documents.isEmpty()) { return false; } final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); for (DocumentModel doc : documents) { if (!collectionManager.isCollectable(doc)) { return false; } } return true; } public boolean canAddToCollection(DocumentModel collection) { final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); final CoreSession session = (CoreSession) Component.getInstance("documentManager", true); final boolean result = collection != null && collectionManager.isCollection(collection) && collectionManager.canAddToCollection(collection, session); return result; } public boolean canAddToDocsToCurrentCollection() { final NavigationContext navigationContext = (NavigationContext) Component.getInstance("navigationContext", true); final DocumentModel currentDocument = navigationContext.getCurrentDocument(); if (currentDocument == null) { return false; } final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); final CoreSession session = (CoreSession) Component.getInstance("documentManager", true); return collectionManager.canAddToCollection(currentDocument, session); } public boolean canAddToSelectedCollection() { final boolean result = canAddToCollection(getSelectedCollection()) || isCreateNewCollection(); return result; } public void cancel() { selectedCollectionUid = null; newDescription = null; newTitle = null; docUidsToBeAdded = null; } public boolean canCurrentDocumentBeCollected() { final NavigationContext navigationContext = (NavigationContext) Component.getInstance("navigationContext", true); final DocumentModel currentDocument = navigationContext.getCurrentDocument(); if (currentDocument == null) { return false; } final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); return collectionManager.isCollectable(currentDocument); } public boolean canManage(final DocumentModel collection) { final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); final CoreSession session = (CoreSession) Component.getInstance("documentManager", true); return collectionManager.canManage(collection, session); } public boolean canRemoveFromCollection() { final DocumentsListsManager documentsListsManager = getDocumentsListsManager(); final List<DocumentModel> doccumentListToBeRemoved = documentsListsManager.getWorkingList(COLLECTION_CURRENT_SELECTION); if (doccumentListToBeRemoved == null || doccumentListToBeRemoved.isEmpty()) { return false; } final NavigationContext navigationContext = (NavigationContext) Component.getInstance("navigationContext", true); final DocumentModel currentDocument = navigationContext.getCurrentDocument(); return canAddToCollection(currentDocument); } public boolean canRemoveFromCollection(DocumentModel collection) { return canAddToCollection(collection); } public List<String> getDocUidsToBeAdded() { return docUidsToBeAdded; } protected DocumentsListsManager getDocumentsListsManager() { return (DocumentsListsManager) Component.getInstance("documentsListsManager", true); } public List<DocumentModel> getMultipleDocumentToBeAdded() { final DocumentsListsManager documentsListsManager = getDocumentsListsManager(); return documentsListsManager.getWorkingList(DocumentsListsManager.CURRENT_DOCUMENT_SELECTION); } public String getNewDescription() { return newDescription; } public String getNewTitle() { return newTitle; } public DocumentModel getSelectedCollection() { if (selectedCollection == null && StringUtils.isNotBlank(selectedCollectionUid) && !isCreateNewCollection()) { try { final CoreSession session = (CoreSession) Component.getInstance("documentManager", true); selectedCollection = session.getDocument(new IdRef(selectedCollectionUid)); } catch (DocumentNotFoundException e) { log.error("Cannot fetch collection"); } } return selectedCollection; } public String getSelectedCollectionDescription() throws PropertyException { if (isCreateNewCollection()) { return null; } else { return (String) getSelectedCollection().getProperty("dc:description").getValue(); } } public String getSelectedCollectionUid() { return selectedCollectionUid; } public boolean hasCurrentDocumentVisibleCollection() { final NavigationContext navigationContext = (NavigationContext) Component.getInstance("navigationContext", true); final DocumentModel currentDocument = navigationContext.getCurrentDocument(); return hasVisibleCollection(currentDocument); } public boolean hasVisibleCollection(DocumentModel doc) { final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); if (doc == null || !collectionManager.isCollectable(doc)) { return false; } if (collectionManager.isCollected(doc)) { final CoreSession session = (CoreSession) Component.getInstance("documentManager", true); return collectionManager.hasVisibleCollection(doc, session); } return false; } public boolean isCreateNewCollection() { return selectedCollectionUid != null && selectedCollectionUid.startsWith(CollectionConstants.MAGIC_PREFIX_ID); } public boolean isCurrentDocumentCollection() { final NavigationContext navigationContext = (NavigationContext) Component.getInstance("navigationContext", true); final DocumentModel currentDocument = navigationContext.getCurrentDocument(); if (currentDocument == null) { return false; } final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); return collectionManager.isCollection(currentDocument); } public void removeCurrentDocumentFromCollection(final ActionEvent event) { FacesContext context = FacesContext.getCurrentInstance(); ExternalContext eContext = context.getExternalContext(); String collectionId = eContext.getRequestParameterMap().get("collectionId"); if (StringUtils.isNotBlank(collectionId)) { final CoreSession session = (CoreSession) Component.getInstance("documentManager", true); final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); final DocumentRef collectionRef = new IdRef(collectionId); if (session.exists(collectionRef)) { final DocumentModel collection = session.getDocument(collectionRef); if (collectionManager.canAddToCollection(collection, session)) { final NavigationContext navigationContext = (NavigationContext) Component.getInstance( "navigationContext", true); final DocumentModel currentDocument = navigationContext.getCurrentDocument(); collectionManager.removeFromCollection(collection, currentDocument, session); Events.instance().raiseEvent(EventNames.DOCUMENT_CHANGED); addFacesMessage(StatusMessage.Severity.INFO, "collection.removeCurrentDocumentFromCollection", collection.getTitle()); } } } } public void removeCurrentSelectionFromCollection() { final DocumentsListsManager documentsListsManager = getDocumentsListsManager(); final List<DocumentModel> doccumentListToBeRemoved = documentsListsManager.getWorkingList(COLLECTION_CURRENT_SELECTION); final NavigationContext navigationContext = (NavigationContext) Component.getInstance("navigationContext", true); final DocumentModel collection = navigationContext.getCurrentDocument(); removeFromCollection(collection, doccumentListToBeRemoved); documentsListsManager.resetWorkingList(COLLECTION_CURRENT_SELECTION); } public void removeFromCollection(DocumentModel collection, List<DocumentModel> documentListToBeRemoved) { final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); final CoreSession session = (CoreSession) Component.getInstance("documentManager", true); collectionManager.removeAllFromCollection(collection, documentListToBeRemoved, session); Events.instance().raiseEvent(EventNames.DOCUMENT_CHANGED); addFacesMessage(StatusMessage.Severity.INFO, "collection.removeCurrentSelectionFromCollection", collection.getTitle()); } public void removeFromMultipleDocumentToBeAdded(ActionEvent event) { FacesContext context = FacesContext.getCurrentInstance(); ExternalContext eContext = context.getExternalContext(); String index = eContext.getRequestParameterMap().get("index"); final DocumentsListsManager documentsListsManager = getDocumentsListsManager(); final DocumentModel toBeRemovedFromWorkingList = documentsListsManager.getWorkingList( DocumentsListsManager.CURRENT_DOCUMENT_SELECTION).get(Integer.valueOf(index).intValue()); documentsListsManager.removeFromWorkingList(DocumentsListsManager.CURRENT_DOCUMENT_SELECTION, toBeRemovedFromWorkingList); } public void setDocUidsToBeAdded(final List<String> docUidsToBeAdded) { this.docUidsToBeAdded = docUidsToBeAdded; } public void setNewDescription(final String newDescription) { this.newDescription = newDescription; } public void setNewTitle(final String newTitle) { this.newTitle = newTitle; } public void setSelectedCollectionUid(final String selectedCollectionUid) { this.selectedCollection = null; this.selectedCollectionUid = selectedCollectionUid; if (isCreateNewCollection()) { setNewTitle(selectedCollectionUid.substring(CollectionConstants.MAGIC_PREFIX_ID.length())); } } }