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}