001/* 002 * (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and contributors. 003 * 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser General Public License 006 * (LGPL) version 2.1 which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/lgpl-2.1.html 008 * 009 * This library is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 * Lesser General Public License for more details. 013 * 014 * Contributors: 015 * <a href="mailto:grenard@nuxeo.com">Guillaume</a> 016 */ 017package org.nuxeo.ecm.collections.core; 018 019import java.util.Locale; 020import java.util.MissingResourceException; 021 022import org.nuxeo.common.utils.i18n.I18NUtils; 023import org.nuxeo.ecm.collections.api.CollectionManager; 024import org.nuxeo.ecm.collections.api.FavoritesConstants; 025import org.nuxeo.ecm.collections.api.FavoritesManager; 026import org.nuxeo.ecm.core.api.CoreSession; 027import org.nuxeo.ecm.core.api.DocumentModel; 028import org.nuxeo.ecm.core.api.DocumentRef; 029import org.nuxeo.ecm.core.api.PathRef; 030import org.nuxeo.ecm.core.api.security.ACE; 031import org.nuxeo.ecm.core.api.security.ACL; 032import org.nuxeo.ecm.core.api.security.ACP; 033import org.nuxeo.ecm.core.api.security.SecurityConstants; 034import org.nuxeo.ecm.core.api.security.impl.ACLImpl; 035import org.nuxeo.ecm.core.api.security.impl.ACPImpl; 036import org.nuxeo.ecm.platform.userworkspace.api.UserWorkspaceService; 037import org.nuxeo.ecm.platform.web.common.locale.LocaleProvider; 038import org.nuxeo.runtime.api.Framework; 039import org.nuxeo.runtime.model.DefaultComponent; 040import org.nuxeo.runtime.transaction.TransactionHelper; 041 042/** 043 * @since 5.9.4 044 */ 045public class FavoritesManagerImpl extends DefaultComponent implements FavoritesManager { 046 047 @Override 048 public void addToFavorites(DocumentModel document, CoreSession session) { 049 final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); 050 collectionManager.addToCollection(getFavorites(document, session), document, session); 051 } 052 053 @Override 054 public boolean canAddToFavorites(DocumentModel document) { 055 final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); 056 return collectionManager.isCollectable(document); 057 } 058 059 protected DocumentModel createFavorites(CoreSession session, DocumentModel userWorkspace) { 060 DocumentModel doc = session.createDocumentModel(userWorkspace.getPath().toString(), 061 FavoritesConstants.DEFAULT_FAVORITES_NAME, FavoritesConstants.FAVORITES_TYPE); 062 String title = null; 063 try { 064 title = I18NUtils.getMessageString("messages", FavoritesConstants.DEFAULT_FAVORITES_TITLE, new Object[0], 065 getLocale(session)); 066 } catch (MissingResourceException e) { 067 title = FavoritesConstants.DEFAULT_FAVORITES_NAME; 068 } 069 doc.setPropertyValue("dc:title", title); 070 doc.setPropertyValue("dc:description", ""); 071 doc = session.createDocument(doc); 072 073 ACP acp = new ACPImpl(); 074 ACE denyEverything = new ACE(SecurityConstants.EVERYONE, SecurityConstants.EVERYTHING, false); 075 ACE allowEverything = new ACE(session.getPrincipal().getName(), SecurityConstants.EVERYTHING, true); 076 ACL acl = new ACLImpl(); 077 acl.setACEs(new ACE[] { allowEverything, denyEverything }); 078 acp.addACL(acl); 079 doc.setACP(acp, true); 080 081 return doc; 082 } 083 084 @Override 085 public DocumentModel getFavorites(final DocumentModel context, final CoreSession session) { 086 final UserWorkspaceService userWorkspaceService = Framework.getLocalService(UserWorkspaceService.class); 087 final DocumentModel userWorkspace = userWorkspaceService.getCurrentUserPersonalWorkspace(session, context); 088 final DocumentRef lookupRef = new PathRef(userWorkspace.getPath().toString(), 089 FavoritesConstants.DEFAULT_FAVORITES_NAME); 090 if (session.exists(lookupRef)) { 091 return session.getChild(userWorkspace.getRef(), FavoritesConstants.DEFAULT_FAVORITES_NAME); 092 } else { 093 // does not exist yet, let's create it 094 synchronized (this) { 095 TransactionHelper.commitOrRollbackTransaction(); 096 TransactionHelper.startTransaction(); 097 if (!session.exists(lookupRef)) { 098 boolean succeed = false; 099 try { 100 createFavorites(session, userWorkspace); 101 succeed = true; 102 } finally { 103 if (succeed) { 104 TransactionHelper.commitOrRollbackTransaction(); 105 TransactionHelper.startTransaction(); 106 } 107 } 108 } 109 return session.getDocument(lookupRef); 110 } 111 } 112 } 113 114 protected Locale getLocale(final CoreSession session) { 115 Locale locale = null; 116 locale = Framework.getLocalService(LocaleProvider.class).getLocale(session); 117 if (locale == null) { 118 locale = Locale.getDefault(); 119 } 120 return new Locale(Locale.getDefault().getLanguage()); 121 } 122 123 @Override 124 public boolean isFavorite(DocumentModel document, CoreSession session) { 125 final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); 126 return collectionManager.isInCollection(getFavorites(document, session), document, session); 127 } 128 129 @Override 130 public void removeFromFavorites(DocumentModel document, CoreSession session) { 131 final CollectionManager collectionManager = Framework.getLocalService(CollectionManager.class); 132 collectionManager.removeFromCollection(getFavorites(document, session), document, session); 133 } 134 135}