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