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}