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;
017
018import java.util.Map;
019
020import javax.jcr.Node;
021import javax.jcr.RepositoryException;
022
023import org.apache.avalon.framework.service.ServiceException;
024import org.apache.avalon.framework.service.ServiceManager;
025
026import org.ametys.plugins.repository.AmetysObjectResolver;
027import org.ametys.plugins.repository.RepositoryConstants;
028import org.ametys.plugins.repository.events.DefaultEventType;
029import org.ametys.plugins.workspaces.members.ProjectMemberManager;
030import org.ametys.plugins.workspaces.project.ProjectManager;
031import org.ametys.plugins.workspaces.project.objects.Project;
032
033/**
034 * Class representing a generic event type for workspaces
035 */
036public class WorkspacesEventType extends DefaultEventType
037{
038    /** Constant for project's name event properties */
039    public static final String EVENT_PROJECT_NAME_PROPERTY = RepositoryConstants.NAMESPACE_PREFIX + ":projectName";
040    /** Constant for project's title event properties */
041    public static final String EVENT_PROJECT_TITLE_PROPERTY = RepositoryConstants.NAMESPACE_PREFIX + ":projectTitle";
042    /** Constant for event's category */
043    public static final String EVENT_PROJECT_CATEGORY_PROPERTY = RepositoryConstants.NAMESPACE_PREFIX + ":category";
044    
045    /** Constant for project's name JSON key. The value is a {@link String}. */
046    public static final String PROJECT_NAME = "projectName";
047    /** Constant for project's title JSON key. The value is a {@link String}. */
048    public static final String PROJECT_TITLE = "projectTitle";
049    /** Constant for project's access JSON key. The value is a boolean. */
050    public static final String PROJECT_ACCESS = "hasProjectAccess";
051    /** Constant for project's url JSON key. The value is a {@link String}. */
052    public static final String PROJECT_URL = "projectUrl";
053    /** Constant for project's category JSON key. The value is a {@link String}. */
054    public static final String PROJECT_CATEGORY = "category";
055    /** Resolver */
056    protected AmetysObjectResolver _resolver;
057    
058    /** The project manager */
059    protected ProjectManager _projectManager;
060    /** The project member manager */
061    private ProjectMemberManager _projectMemberManager;
062    
063    @Override
064    public void service(ServiceManager serviceManager) throws ServiceException
065    {
066        super.service(serviceManager);
067        _projectManager = (ProjectManager) serviceManager.lookup(ProjectManager.ROLE);
068        _projectMemberManager = (ProjectMemberManager) serviceManager.lookup(ProjectMemberManager.ROLE);
069        _resolver = (AmetysObjectResolver) serviceManager.lookup(AmetysObjectResolver.ROLE);
070    }
071    
072    @Override
073    protected void storeAdditionalEventData(Node eventNode, Map<String, Object> parameters) throws RepositoryException
074    {
075        super.storeAdditionalEventData(eventNode, parameters);
076        
077        eventNode.setProperty(EVENT_PROJECT_NAME_PROPERTY, (String) parameters.get("projectName"));
078        eventNode.setProperty(EVENT_PROJECT_TITLE_PROPERTY, (String) parameters.get("projectTitle"));
079    }
080    
081    @Override
082    public Map<String, Object> event2JSON(Node eventNode) throws RepositoryException
083    {
084        Map<String, Object> event = super.event2JSON(eventNode);
085        
086        // Project
087        String projectName = eventNode.getProperty(EVENT_PROJECT_NAME_PROPERTY).getString();
088        event.put(PROJECT_NAME, projectName);
089        event.put(PROJECT_TITLE, eventNode.getProperty(EVENT_PROJECT_TITLE_PROPERTY).getString());
090        Project project = _projectManager.getProject(projectName);
091        if (project != null)
092        {
093            boolean hasAccess = _projectMemberManager.isProjectMember(project, _getAuthor(eventNode));
094            event.put(PROJECT_ACCESS, hasAccess);
095            String siteUrl = _projectManager.getProjectUrl(project, null);
096            if (siteUrl != null)
097            {
098                event.put(PROJECT_URL, siteUrl);
099            }
100        }
101        
102        if (eventNode.hasProperty(EVENT_PROJECT_CATEGORY_PROPERTY))
103        {
104            event.put(PROJECT_CATEGORY, eventNode.getProperty(EVENT_PROJECT_CATEGORY_PROPERTY).getString());
105        }
106        
107        return event;
108    }
109    
110    @Override
111    public boolean isMergeable(Map<String, Object> event1, Map<String, Object> event2)
112    {
113        if (!super.isMergeable(event1, event2))
114        {
115            return false;
116        }
117        
118        String project1 = (String) event1.get("projectName");
119        String project2 = (String) event2.get("projectName");
120        
121        return project1 != null && project2 != null && project1.equals(project2);
122    }
123}