/* * (C) Copyright 2006-2007 Nuxeo SAS (http://nuxeo.com/) and contributors. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public License * (LGPL) version 2.1 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * * This library 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. * * Contributors: * Nuxeo - initial API and implementation * * $Id: JOOoConvertPluginImpl.java 18651 2007-05-13 20:28:53Z sfermigier $ */ package org.nuxeo.ecm.webapp.documentsLists; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.DocumentRef; import org.nuxeo.ecm.platform.ui.web.util.DocumentsListsUtils; import org.nuxeo.runtime.api.Framework; public abstract class BaseDocumentsListsManager implements Serializable{ private static final long serialVersionUID = 98757690654316L; private static DocumentsListsService dlService; private transient DocumentsListsPersistenceManager persistenceManager; // ListName => DocumentModel List protected final Map<String, List<DocumentModel>> documentsLists = new HashMap<String, List<DocumentModel>>(); protected final Map<String, List<DocumentModel>> documentsListsPerConversation = new HashMap<String, List<DocumentModel>>(); // EventName => ListName protected final Map<String, List<String>> documentsLists_events = new HashMap<String, List<String>>(); // ListName => List Descriptor protected final Map<String, DocumentsListDescriptor> documentsLists_descriptors = new HashMap<String, DocumentsListDescriptor>(); protected DocumentsListsService getService() { if (dlService == null) { dlService = (DocumentsListsService) Framework.getRuntime().getComponent( DocumentsListsService.NAME); } return dlService; } protected String userName; protected String getUserName() { return userName; } protected void setUserName(String userName) { this.userName = userName; } protected abstract void notifyListUpdated(String listName); protected DocumentsListsPersistenceManager getPersistenceManager() { if (persistenceManager == null) { persistenceManager = new DocumentsListsPersistenceManager(); } return persistenceManager; } public List<DocumentModel> resetWorkingList(String listName) { if (!documentsLists.containsKey(listName)) { return null; } List<DocumentModel> docList = getWorkingList(listName); DocumentsListDescriptor desc = getWorkingListDescriptor(listName); if (desc.getPersistent()) { if (getPersistenceManager().clearPersistentList(userName, listName)) { docList.clear(); } } else { docList.clear(); } notifyListUpdated(listName); return docList; } public boolean isWorkingListEmpty(String listName) { if (!documentsLists.containsKey(listName)) { return true; } List<DocumentModel> docList = getWorkingList(listName); return docList.isEmpty(); } public void removeFromAllLists(List<DocumentModel> documentsToRemove) { for (String listName : documentsLists.keySet()) { removeFromWorkingList(listName, documentsToRemove); //DocumentsListsUtils.removeDocumentsFromList( // getWorkingList(listName), documentsToRemove); notifyListUpdated(listName); } } public void createWorkingList(String listName, DocumentsListDescriptor descriptor) { createWorkingList(listName, descriptor, null, null); } public void createWorkingList(String listName, DocumentsListDescriptor descriptor, CoreSession session, String userName) { if (documentsLists.containsKey(listName)) { return; } if (descriptor != null && descriptor.getPersistent() && session != null && userName != null) { // load persistent list documentsLists.put(listName, getPersistenceManager().loadPersistentDocumentsLists( session, userName, listName)); } else { // create empty list documentsLists.put(listName, new ArrayList<DocumentModel>()); } // create the descriptor if (descriptor == null) { descriptor = new DocumentsListDescriptor(listName); } documentsLists_descriptors.put(listName, descriptor); // manage events subscriptions for (String eventName : descriptor.getEventsName()) { if (documentsLists_events.containsKey(eventName)) { documentsLists_events.get(eventName).add(listName); } else { List<String> suscribersList = new ArrayList<String>(); suscribersList.add(listName); documentsLists_events.put(eventName, suscribersList); } } } public List<String> getWorkingListNamesForCategory(String categoryName) { List<String> res = new ArrayList<String>(); for (String listName : documentsLists_descriptors.keySet()) { if (documentsLists_descriptors.get(listName).getCategory().equals( categoryName)) { // default list in category is returned at start of the list ! if (documentsLists_descriptors.get(listName) .getDefaultInCategory()) { res.add(0, listName); } else { res.add(listName); } } } return res; } public List<DocumentModel> resetWorkingList(String listName, List<DocumentModel> newDocList) { resetWorkingList(listName); return addToWorkingList(listName, newDocList); } public List<DocumentModel> removeFromWorkingList(String listName, List<DocumentModel> lst) { if (!documentsLists.containsKey(listName)) { return null; } List<DocumentModel> docList = getWorkingList(listName); DocumentsListDescriptor desc = getWorkingListDescriptor(listName); // FIXME needs to be checked for (DocumentModel doc : lst) { if (desc.getPersistent()) { if (getPersistenceManager().removeDocumentFromPersistentList(userName, listName, doc)); docList.remove(doc); } else docList.remove(doc); } notifyListUpdated(listName); return docList; } public List<DocumentModel> removeFromWorkingList(String listName, DocumentModel doc) { if (!documentsLists.containsKey(listName)) { return null; } List<DocumentModel> docList = getWorkingList(listName); DocumentsListDescriptor desc = getWorkingListDescriptor(listName); // FIXME needs to be checked if (desc.getPersistent()) { if (getPersistenceManager().removeDocumentFromPersistentList(userName, listName, doc)); docList.remove(doc); } else docList.remove(doc); notifyListUpdated(listName); return docList; } public List<DocumentModel> addToWorkingList(String listName, List<DocumentModel> docList) { return addToWorkingList(listName, docList, false); } public List<DocumentModel> addToWorkingList(String listName, List<DocumentModel> docList, Boolean forceAppend) { if (!documentsLists.containsKey(listName)) { return null; } List<DocumentModel> currentDocList = getWorkingList(listName); DocumentsListDescriptor currentDescriptor = getWorkingListDescriptor(listName); Boolean currentListIsPersistent = false; if (currentDescriptor != null) { if (!forceAppend && !getWorkingListDescriptor( listName).getSupportAppends()) { currentDocList.clear(); } currentListIsPersistent = currentDescriptor.getPersistent(); } // filter for duplicate List<DocumentRef> docRefList = DocumentsListsUtils.getDocRefs(currentDocList); for (DocumentModel doc : docList) { if (!docRefList.contains(doc.getRef())) { if (currentListIsPersistent) { if (getPersistenceManager().addDocumentToPersistentList(userName, listName, doc)) { // Strange, CHECKME ; } currentDocList.add(doc); } else { currentDocList.add(doc); } } } notifyListUpdated(listName); return currentDocList; } public List<DocumentModel> addToWorkingList(String listName, DocumentModel doc) { if (!documentsLists.containsKey(listName)) { return null; } List<DocumentModel> docList = getWorkingList(listName); DocumentsListDescriptor currentDescriptor = getWorkingListDescriptor(listName); boolean currentListIsPersistent = false; if (currentDescriptor != null) { currentListIsPersistent = currentDescriptor.getPersistent(); } List<DocumentRef> docRefList = DocumentsListsUtils.getDocRefs(docList); if (!docRefList.contains(doc.getRef())) { if (currentListIsPersistent) { if (getPersistenceManager().addDocumentToPersistentList(userName, listName, doc)) { // Strange, CHECKME ; } docList.add(doc); } else { docList.add(doc); } } notifyListUpdated(listName); return docList; } public void setWorkingList(String listName, List<DocumentModel> docList) { if (documentsLists.containsKey(listName)) { documentsLists.put(listName, docList); } } public List<String> getWorkingListTypes(String listName) { if (!documentsLists.containsKey(listName)) { return null; } List<String> res = new ArrayList<String>(); for (DocumentModel doc : documentsLists.get(listName)) { String dt = doc.getType(); if (!res.contains(dt)) { res.add(dt); } } return res; } public DocumentsListDescriptor getWorkingListDescriptor(String listName) { if (!documentsLists.containsKey(listName)) { return null; } return documentsLists_descriptors.get(listName); } public List<DocumentModel> getWorkingList(String listName) { if (documentsLists.containsKey(listName)) { return documentsLists.get(listName); } else { return null; } } }