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.activities.threads; 017 018import java.util.ArrayList; 019import java.util.HashMap; 020import java.util.List; 021import java.util.Map; 022 023import javax.jcr.RepositoryException; 024 025import org.apache.avalon.framework.context.Context; 026import org.apache.avalon.framework.context.ContextException; 027import org.apache.avalon.framework.context.Contextualizable; 028import org.apache.avalon.framework.service.ServiceException; 029import org.apache.avalon.framework.service.ServiceManager; 030 031import org.ametys.core.observation.Event; 032import org.ametys.plugins.explorer.ObservationConstants; 033import org.ametys.plugins.explorer.threads.jcr.JCRThread; 034import org.ametys.plugins.repository.AmetysObject; 035import org.ametys.plugins.repository.activities.Activity; 036import org.ametys.plugins.repository.activities.ActivityType; 037import org.ametys.plugins.workspaces.activities.AbstractWorkspacesActivityType; 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 ActivityType} implementation for threads-related activities 044 */ 045public class ThreadsActivityType extends AbstractWorkspacesActivityType implements Contextualizable 046{ 047 /** data name for the thread id */ 048 public static final String THREAD_ID = "threadId"; 049 /** data name for the thread title */ 050 public static final String THREAD_TITLE = "threadTitle"; 051 /** Constant for activity's category */ 052 public static final String ACTIVITY_CATEGORY_THREADS = "threads"; 053 054 /** Thread Workspace Module */ 055 protected ThreadWorkspaceModule _threadModule; 056 057 /** avalon context */ 058 protected Context _context; 059 060 @Override 061 public void contextualize(Context context) throws ContextException 062 { 063 _context = context; 064 } 065 066 @Override 067 public void service(ServiceManager serviceManager) throws ServiceException 068 { 069 super.service(serviceManager); 070 WorkspaceModuleExtensionPoint moduleManagerEP = (WorkspaceModuleExtensionPoint) serviceManager.lookup(WorkspaceModuleExtensionPoint.ROLE); 071 _threadModule = moduleManagerEP.getModule(ThreadWorkspaceModule.THREAD_MODULE_ID); 072 } 073 074 @Override 075 public void setAdditionalActivityData(Activity activity, Map<String, Object> parameters) throws RepositoryException 076 { 077 super.setAdditionalActivityData(activity, parameters); 078 079 activity.setValue(PROJECT_CATEGORY, ACTIVITY_CATEGORY_THREADS); 080 } 081 082 @Override 083 public Map<String, Object> additionnalDataToJSONForClient(Activity activity) 084 { 085 Map<String, Object> json = super.additionnalDataToJSONForClient(activity); 086 087 String threadId = activity.getValue(THREAD_ID); 088 089 String projectName = activity.getValue(PROJECT_NAME); 090 Project project = _projectManager.getProject(projectName); 091 json.put("threadUrl", _threadModule.getThreadUri(project, threadId)); 092 093 return json; 094 } 095 096 @Override 097 public boolean isMergeable(Activity activity1, Activity activity2) 098 { 099 if (!super.isMergeable(activity1, activity2)) 100 { 101 return false; 102 } 103 104 String thread1 = activity1.getValue(THREAD_ID); 105 String thread2 = activity1.getValue(THREAD_ID); 106 107 return thread1 != null && thread2 != null && thread1.equals(thread2); 108 } 109 110 @Override 111 public Map<String, Object> mergeActivities(List<Activity> activities) 112 { 113 Map<String, Object> mergedActivities = super.mergeActivities(activities); 114 115 List<Map<String, Object>> mergedThreads = new ArrayList<>(); 116 117 for (Activity activity : activities) 118 { 119 Map<String, Object> json = activity.toJSONForClient(); 120 Map<String, Object> threadInfo = new HashMap<>(); 121 122 threadInfo.put(THREAD_TITLE, json.get(THREAD_TITLE)); 123 threadInfo.put(THREAD_ID, json.get(THREAD_ID)); 124 threadInfo.put("threadUrl", json.get("threadUrl")); 125 126 mergedThreads.add(threadInfo); 127 } 128 mergedActivities.put("threads", mergedThreads); 129 130 return mergedActivities; 131 } 132 133 @Override 134 public Project getProjectFromEvent(Event event) 135 { 136 Map<String, Object> args = event.getArguments(); 137 138 JCRThread thread = (JCRThread) args.get(ObservationConstants.ARGS_THREAD); 139 140 return getParentProject(thread); 141 } 142 143 @Override 144 public AmetysObject getTargetAmetysObject(Activity activity) 145 { 146 return _resolver.resolveById(activity.getValue(ThreadsActivityType.THREAD_ID)); 147 } 148 149 150 @Override 151 public List<String> getSubjectI18nParams(Activity activity) 152 { 153 List<String> i18nParams = super.getSubjectI18nParams(activity); 154 i18nParams.add(activity.getValue(ThreadsActivityType.THREAD_TITLE)); 155 return i18nParams; 156 } 157 158 @Override 159 public String getMailBodyURI(Activity activity) 160 { 161 return "cocoon://_plugins/workspaces/notification-mail-thread"; 162 } 163 164}