001/*
002 *  Copyright 2016 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.ametys.plugins.workspaces.documents;
017
018import java.util.HashMap;
019import java.util.Map;
020import java.util.Set;
021
022import org.apache.avalon.framework.context.Context;
023import org.apache.avalon.framework.context.ContextException;
024import org.apache.cocoon.components.ContextHelper;
025import org.apache.cocoon.environment.Request;
026import org.apache.commons.lang.IllegalClassException;
027
028import org.ametys.core.right.RightManager.RightResult;
029import org.ametys.core.ui.Callable;
030import org.ametys.core.user.UserIdentity;
031import org.ametys.plugins.explorer.ExplorerNode;
032import org.ametys.plugins.explorer.resources.ModifiableResourceCollection;
033import org.ametys.plugins.explorer.resources.jcr.JCRResourcesCollectionFactory;
034import org.ametys.plugins.repository.AmetysRepositoryException;
035import org.ametys.plugins.repository.data.holder.ModifiableModelAwareDataHolder;
036import org.ametys.plugins.workspaces.AbstractWorkspaceModule;
037import org.ametys.plugins.workspaces.project.objects.Project;
038import org.ametys.runtime.i18n.I18nizableText;
039import org.ametys.web.repository.page.ModifiablePage;
040import org.ametys.web.repository.page.ModifiableZone;
041import org.ametys.web.repository.page.ModifiableZoneItem;
042import org.ametys.web.repository.page.ZoneItem.ZoneType;
043
044import com.google.common.collect.ImmutableSet;
045
046/**
047 * Helper component for managing documents
048 */
049public class DocumentWorkspaceModule extends AbstractWorkspaceModule
050{
051    /** The id of document module */
052    public static final String DOCUMENT_MODULE_ID = DocumentWorkspaceModule.class.getName();
053    
054    /** Workspaces documents node name */
055    public static final String WORKSPACES_DOCUMENTS_NODE_NAME = "documents";
056    
057    @Override
058    public void contextualize(Context context) throws ContextException
059    {
060        _context = context;
061    }
062    
063    @Override
064    public String getId()
065    {
066        return DOCUMENT_MODULE_ID;
067    }
068    
069    @Override
070    public String getModuleName()
071    {
072        return WORKSPACES_DOCUMENTS_NODE_NAME;
073    }
074    
075    public int getOrder()
076    {
077        return ORDER_DOCUMENTS;
078    }
079    
080    @Override
081    protected String getModulePageName()
082    {
083        return "documents";
084    }
085    
086    public I18nizableText getModuleTitle()
087    {
088        return new I18nizableText("plugin." + _pluginName, "PLUGINS_WORKSPACES_PROJECT_SERVICE_MODULE_DOCUMENT_LABEL");
089    }
090    public I18nizableText getModuleDescription()
091    {
092        return new I18nizableText("plugin." + _pluginName, "PLUGINS_WORKSPACES_PROJECT_SERVICE_MODULE_DOCUMENT_DESCRIPTION");
093    }
094    @Override
095    protected I18nizableText getModulePageTitle()
096    {
097        return new I18nizableText("plugin." + _pluginName, "PLUGINS_WORKSPACES_PROJECT_WORKSPACE_PAGE_DOCUMENTS_TITLE");
098    }
099    
100    @Override
101    protected void initializeModulePage(ModifiablePage documentPage)
102    {
103        ModifiableZone defaultZone = documentPage.createZone("default");
104        
105        String serviceId = "org.ametys.plugins.workspaces.module.Document";
106        ModifiableZoneItem defaultZoneItem = defaultZone.addZoneItem();
107        defaultZoneItem.setType(ZoneType.SERVICE);
108        defaultZoneItem.setServiceId(serviceId);
109        
110        ModifiableModelAwareDataHolder serviceDataHolder = defaultZoneItem.getServiceParameters();
111        serviceDataHolder.setValue("xslt", _getDefaultXslt(serviceId));
112    }
113
114    /**
115     * Get the URI of a folder in project'site
116     * @param project The project
117     * @param collectionId The id of collection
118     * @return The thread uri
119     */
120    public String getFolderUri(Project project, String collectionId)
121    {
122        String moduleUrl = getModuleUrl(project);
123        if (moduleUrl != null)
124        {
125            StringBuilder sb = new StringBuilder();
126            sb.append(moduleUrl);
127            sb.append("#").append(collectionId);
128            
129            return sb.toString();
130        }
131        
132        return null;
133    }
134    
135    /**
136     * Retrieves the set of general rights used in the document module for the current user
137     * @return The map of right data. Keys are the rights id, and values indicates whether the current user has the right or not.
138     */
139    @Callable
140    public Map<String, Object> getModuleBaseRights()
141    {
142        Request request = ContextHelper.getRequest(_context);
143        
144        String projectName = (String) request.getAttribute("projectName");
145        Project project = _projectManager.getProject(projectName);
146        
147        ModifiableResourceCollection documentRoot = getModuleRoot(project, false);
148        
149        Map<String, Object> rightsData = new HashMap<>();
150        UserIdentity user = _currentUserProvider.getUser();
151        
152        // Add file / folder
153        rightsData.put("add-file", _rightManager.hasRight(user, "Plugin_Explorer_File_Add", documentRoot) == RightResult.RIGHT_ALLOW);
154        rightsData.put("add-folder", _rightManager.hasRight(user, "Plugin_Explorer_Folder_Add", documentRoot) == RightResult.RIGHT_ALLOW);
155        rightsData.put("add-cmis-folder", _rightManager.hasRight(user, "Plugin_Explorer_CMIS_Add", documentRoot) == RightResult.RIGHT_ALLOW);
156        
157        // Tags
158        rightsData.put("add-tag", _projectRightHelper.canAddTag(project));
159        rightsData.put("remove-tag", _projectRightHelper.canRemoveTag(project));
160        
161        return rightsData;
162    }
163    
164    @Override
165    public ModifiableResourceCollection getModuleRoot(Project project, boolean create)
166    {
167        try
168        {
169            ExplorerNode projectRootNode = project.getExplorerRootNode();
170            
171            if (projectRootNode instanceof ModifiableResourceCollection)
172            {
173                ModifiableResourceCollection projectRootNodeRc = (ModifiableResourceCollection) projectRootNode;
174                return _getAmetysObject(projectRootNodeRc, WORKSPACES_DOCUMENTS_NODE_NAME, JCRResourcesCollectionFactory.RESOURCESCOLLECTION_NODETYPE, create);
175            }
176            else
177            {
178                throw new IllegalClassException(ModifiableResourceCollection.class, projectRootNode.getClass());
179            }
180        }
181        catch (AmetysRepositoryException e)
182        {
183            throw new AmetysRepositoryException("Error getting the documents root node.", e);
184        }
185    }
186
187    @Override
188    public Set<String> getAllowedEventTypes()
189    {
190        return ImmutableSet.of("resource.created", "resource.updated", "resource.renamed");
191    }
192}