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}