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.events.documents;
017
018import java.util.ArrayList;
019import java.util.List;
020import java.util.Map;
021
022import javax.jcr.Node;
023import javax.jcr.RepositoryException;
024
025import org.apache.avalon.framework.service.ServiceException;
026import org.apache.avalon.framework.service.ServiceManager;
027
028import org.ametys.core.util.I18nUtils;
029import org.ametys.plugins.explorer.ObservationConstants;
030import org.ametys.plugins.repository.AmetysObject;
031import org.ametys.plugins.repository.AmetysObjectResolver;
032import org.ametys.plugins.repository.RepositoryConstants;
033import org.ametys.plugins.repository.events.EventType;
034import org.ametys.plugins.workspaces.documents.DocumentWorkspaceModule;
035import org.ametys.plugins.workspaces.events.WorkspacesEventType;
036import org.ametys.plugins.workspaces.project.modules.WorkspaceModuleExtensionPoint;
037import org.ametys.plugins.workspaces.project.objects.Project;
038import org.ametys.runtime.i18n.I18nizableText;
039
040/**
041 * {@link EventType} implementation for documents-related events
042 */
043public class DocumentsEventType extends WorkspacesEventType
044{
045    /** Constant for event's category */
046    public static final String EVENT_CATEGORY_DOCUMENTS = "documents";
047    
048    /** Constant for parent folder's event property */
049    public static final String EVENT_PARENT_FOLDER_PROPERTY = RepositoryConstants.NAMESPACE_PREFIX + ":parentFolder";
050    /** Constant for parent folder's event property */
051    public static final String EVENT_PARENT_FOLDER_ID_PROPERTY = RepositoryConstants.NAMESPACE_PREFIX + ":parentFolderId";
052    
053    /** Resolver for Ametys objects */
054    protected AmetysObjectResolver _ametysObjectResolver;
055    
056    private I18nUtils _i18nUtils;
057
058    private DocumentWorkspaceModule _documentModule;
059    
060    @Override
061    public void service(ServiceManager serviceManager) throws ServiceException
062    {
063        super.service(serviceManager);
064        _ametysObjectResolver = (AmetysObjectResolver) serviceManager.lookup(AmetysObjectResolver.ROLE);
065        _i18nUtils = (I18nUtils) serviceManager.lookup(I18nUtils.ROLE);
066        WorkspaceModuleExtensionPoint moduleManagerEP = (WorkspaceModuleExtensionPoint) serviceManager.lookup(WorkspaceModuleExtensionPoint.ROLE);
067        _documentModule = moduleManagerEP.getModule(DocumentWorkspaceModule.DOCUMENT_MODULE_ID);
068    }
069
070    @Override
071    protected void storeAdditionalEventData(Node eventNode, Map<String, Object> parameters) throws RepositoryException
072    {
073        super.storeAdditionalEventData(eventNode, parameters);
074        
075        eventNode.setProperty(EVENT_PROJECT_CATEGORY_PROPERTY, EVENT_CATEGORY_DOCUMENTS);
076        
077        // Parent name
078        String folderId = (String) parameters.get(ObservationConstants.ARGS_PARENT_ID);
079        AmetysObject ametysObject = _ametysObjectResolver.resolveById(folderId);
080        
081        String parentFolder = ametysObject.getName();
082        eventNode.setProperty(EVENT_PARENT_FOLDER_PROPERTY, parentFolder.equals("ametys-internal:resources") ? _i18nUtils.translate(new I18nizableText("plugin.explorer", "PLUGINS_EXPLORER_ROOT_NODE")) 
083                                                                                               : parentFolder);
084        
085        if (parameters.containsKey(ObservationConstants.ARGS_PARENT_ID))
086        {
087            eventNode.setProperty(EVENT_PARENT_FOLDER_ID_PROPERTY, (String) parameters.get(ObservationConstants.ARGS_PARENT_ID));
088        }
089        
090    }
091    
092    @Override
093    public Map<String, Object> event2JSON(Node eventNode) throws RepositoryException
094    {
095        Map<String, Object> event = super.event2JSON(eventNode);
096        
097        // Parent folder
098        event.put("parentFolder", eventNode.getProperty(EVENT_PARENT_FOLDER_PROPERTY).getString());
099        
100        if (eventNode.hasProperty(EVENT_PARENT_FOLDER_ID_PROPERTY))
101        {
102            String parentId = eventNode.getProperty(EVENT_PARENT_FOLDER_ID_PROPERTY).getString();
103            event.put("parentFolderId", parentId);
104            
105            String projectName = eventNode.getProperty(EVENT_PROJECT_NAME_PROPERTY).getString();
106            Project project = _projectManager.getProject(projectName);
107            event.put("parentFolderUrl", _documentModule.getFolderUri(project, parentId));
108        }
109        
110        return event;
111    }
112    
113    @Override
114    public boolean isMergeable(Map<String, Object> event1, Map<String, Object> event2)
115    {
116        if (!super.isMergeable(event1, event2))
117        {
118            return false;
119        }
120        
121        String parentFolder1 = (String) event1.get("parentFolderId");
122        String parentFolder2 = (String) event2.get("parentFolderId");
123        
124        return parentFolder1 != null && parentFolder2 != null && parentFolder1.equals(parentFolder2);
125    }
126    
127    @SuppressWarnings("unchecked")
128    @Override
129    public Map<String, Object> mergeEvents(List<Map<String, Object>> events)
130    {
131        Map<String, Object> mergedEVent = super.mergeEvents(events);
132        
133        List<Map<String, Object>> files = new ArrayList<>();
134        
135        List<String> knownFiles = new ArrayList<>();
136        
137        for (Map<String, Object> event : events)
138        {
139            if (event.containsKey("file"))
140            {
141                Map<String, Object> file = (Map<String, Object>) event.get("file");
142                if (!knownFiles.contains(file.get("id")))
143                {
144                    files.add((Map<String, Object>) event.get("file"));
145                    knownFiles.add((String) file.get("id"));
146                }
147            }
148            else if (event.containsKey("files"))
149            {
150                files.addAll((List<Map<String, Object>>) event.get("files"));
151            }
152        }
153        
154        if (files.size() > 0)
155        {
156            mergedEVent.put("files", files);
157        }
158        
159        mergedEVent.put("amount", files.size());
160        
161        return mergedEVent;
162    }
163}