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}