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.threads; 017 018import java.util.ArrayList; 019import java.util.HashMap; 020import java.util.List; 021import java.util.Map; 022 023import javax.jcr.Node; 024import javax.jcr.RepositoryException; 025 026import org.apache.avalon.framework.context.Context; 027import org.apache.avalon.framework.context.ContextException; 028import org.apache.avalon.framework.context.Contextualizable; 029import org.apache.avalon.framework.service.ServiceException; 030import org.apache.avalon.framework.service.ServiceManager; 031import org.apache.cocoon.components.ContextHelper; 032import org.apache.cocoon.environment.Request; 033 034import org.ametys.plugins.repository.AmetysObjectResolver; 035import org.ametys.plugins.repository.RepositoryConstants; 036import org.ametys.plugins.repository.events.EventType; 037import org.ametys.plugins.workspaces.events.WorkspacesEventType; 038import org.ametys.plugins.workspaces.project.modules.WorkspaceModuleExtensionPoint; 039import org.ametys.plugins.workspaces.project.objects.Project; 040import org.ametys.plugins.workspaces.threads.ThreadWorkspaceModule; 041 042/** 043 * {@link EventType} implementation for threads-related events 044 */ 045public class ThreadsEventType extends WorkspacesEventType implements Contextualizable 046{ 047 /** Constant for event's category */ 048 public static final String EVENT_CATEGORY_THREADS = "threads"; 049 /** Constant for thread's title */ 050 public static final String EVENT_THREAD_TITLE_PROPERTY = RepositoryConstants.NAMESPACE_PREFIX + ":threadTitle"; 051 /** Constant for thread's title */ 052 public static final String EVENT_THREAD_ID_PROPERTY = RepositoryConstants.NAMESPACE_PREFIX + ":threadId"; 053 054 /** The Ametys object resolver */ 055 protected AmetysObjectResolver _resolver; 056 private ThreadWorkspaceModule _threadModule; 057 private Context _context; 058 059 @Override 060 public void contextualize(Context context) throws ContextException 061 { 062 _context = context; 063 } 064 065 @Override 066 public void service(ServiceManager serviceManager) throws ServiceException 067 { 068 super.service(serviceManager); 069 _resolver = (AmetysObjectResolver) serviceManager.lookup(AmetysObjectResolver.ROLE); 070 WorkspaceModuleExtensionPoint moduleManagerEP = (WorkspaceModuleExtensionPoint) serviceManager.lookup(WorkspaceModuleExtensionPoint.ROLE); 071 _threadModule = moduleManagerEP.getModule(ThreadWorkspaceModule.THREAD_MODULE_ID); 072 } 073 074 @Override 075 protected void storeAdditionalEventData(Node eventNode, Map<String, Object> parameters) throws RepositoryException 076 { 077 super.storeAdditionalEventData(eventNode, parameters); 078 079 eventNode.setProperty(EVENT_PROJECT_CATEGORY_PROPERTY, EVENT_CATEGORY_THREADS); 080 } 081 082 @Override 083 public Map<String, Object> event2JSON(Node eventNode) throws RepositoryException 084 { 085 Map<String, Object> event = super.event2JSON(eventNode); 086 087 event.put("threadTitle", eventNode.getProperty(EVENT_THREAD_TITLE_PROPERTY).getString()); 088 089 String threadId = eventNode.getProperty(EVENT_THREAD_ID_PROPERTY).getString(); 090 event.put("threadId", threadId); 091 092 Request request = ContextHelper.getRequest(_context); 093 String lang = (String) request.getAttribute("sitemapLanguage"); 094 095 String projectName = eventNode.getProperty(EVENT_PROJECT_NAME_PROPERTY).getString(); 096 Project project = _projectManager.getProject(projectName); 097 event.put("threadUrl", _threadModule.getThreadUri(project, threadId, lang)); 098 099 return event; 100 } 101 102 @Override 103 public Map<String, Object> mergeEvents(List<Map<String, Object>> events) 104 { 105 Map<String, Object> mergedEVent = super.mergeEvents(events); 106 107 List<Map<String, Object>> mergedThreads = new ArrayList<>(); 108 109 for (Map<String, Object> event : events) 110 { 111 Map<String, Object> threadInfo = new HashMap<>(); 112 113 threadInfo.put("threadTitle", event.get("threadTitle")); 114 threadInfo.put("threadId", event.get("threadId")); 115 threadInfo.put("threadUrl", event.get("threadUrl")); 116 117 mergedThreads.add(threadInfo); 118 } 119 mergedEVent.put("threads", mergedThreads); 120 121 return mergedEVent; 122 } 123 124 @Override 125 public boolean isMergeable(Map<String, Object> event1, Map<String, Object> event2) 126 { 127 if (!super.isMergeable(event1, event2)) 128 { 129 return false; 130 } 131 132 String thread1 = (String) event1.get("threadId"); 133 String thread2 = (String) event1.get("threadId"); 134 135 return thread1 != null && thread2 != null && thread1.equals(thread2); 136 } 137}