001/* 002 * (C) Copyright 2006-2011 Nuxeo SA (http://nuxeo.com/) and others. 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 * 016 * Contributors: 017 * Thomas Roger <troger@nuxeo.com> 018 */ 019 020package org.nuxeo.ecm.activity; 021 022import java.io.Serializable; 023import java.util.ArrayList; 024import java.util.Collection; 025import java.util.HashMap; 026import java.util.List; 027import java.util.Locale; 028import java.util.Map; 029import java.util.Set; 030 031import org.nuxeo.common.utils.StringUtils; 032import org.nuxeo.ecm.core.api.CoreSession; 033import org.nuxeo.ecm.core.api.IterableQueryResult; 034import org.nuxeo.runtime.api.Framework; 035 036/** 037 * Default implementation of {@link ActivitiesList}. 038 * 039 * @author <a href="mailto:troger@nuxeo.com">Thomas Roger</a> 040 * @since 5.5 041 */ 042public class ActivitiesListImpl extends ArrayList<Activity> implements ActivitiesList { 043 044 private static final long serialVersionUID = 1L; 045 046 public ActivitiesListImpl() { 047 super(); 048 } 049 050 public ActivitiesListImpl(Collection<? extends Activity> c) { 051 super(c); 052 } 053 054 @Override 055 public ActivitiesList filterActivities(CoreSession session) { 056 ActivitiesList filteredActivities = new ActivitiesListImpl(this); 057 058 Map<String, List<Activity>> activitiesByDocument = getActivitiesByDocument(); 059 060 List<String> authorizedDocuments = filterAuthorizedDocuments(activitiesByDocument.keySet(), session); 061 // remove all activities the user has access to 062 for (String authorizedDocument : authorizedDocuments) { 063 activitiesByDocument.remove(authorizedDocument); 064 } 065 066 // extract all unauthorized activities 067 List<Activity> unauthorizedActivities = new ArrayList<Activity>(); 068 for (List<Activity> activities : activitiesByDocument.values()) { 069 unauthorizedActivities.addAll(activities); 070 } 071 072 // remove all unauthorized activities 073 filteredActivities.removeAll(unauthorizedActivities); 074 return filteredActivities; 075 } 076 077 protected Map<String, List<Activity>> getActivitiesByDocument() { 078 Map<String, List<Activity>> activitiesByDocuments = new HashMap<String, List<Activity>>(); 079 for (Activity activity : this) { 080 List<String> relatedDocuments = getRelatedDocuments(activity); 081 for (String doc : relatedDocuments) { 082 List<Activity> value = activitiesByDocuments.get(doc); 083 if (value == null) { 084 value = new ArrayList<Activity>(); 085 activitiesByDocuments.put(doc, value); 086 } 087 value.add(activity); 088 } 089 } 090 return activitiesByDocuments; 091 } 092 093 protected List<String> getRelatedDocuments(Activity activity) { 094 List<String> relatedDocuments = new ArrayList<String>(); 095 096 String activityObject = activity.getActor(); 097 if (activityObject != null && ActivityHelper.isDocument(activityObject)) { 098 relatedDocuments.add(ActivityHelper.getDocumentId(activityObject)); 099 } 100 activityObject = activity.getObject(); 101 if (activityObject != null && ActivityHelper.isDocument(activityObject)) { 102 relatedDocuments.add(ActivityHelper.getDocumentId(activityObject)); 103 } 104 activityObject = activity.getTarget(); 105 if (activityObject != null && ActivityHelper.isDocument(activityObject)) { 106 relatedDocuments.add(ActivityHelper.getDocumentId(activityObject)); 107 } 108 109 return relatedDocuments; 110 } 111 112 protected List<String> filterAuthorizedDocuments(Set<String> allDocuments, CoreSession session) { 113 String idsParam = "('" + StringUtils.join(allDocuments.toArray(new String[allDocuments.size()]), "', '") + "')"; 114 String query = String.format("SELECT ecm:uuid FROM Document WHERE ecm:uuid IN %s", idsParam); 115 IterableQueryResult res = session.queryAndFetch(query, "NXQL"); 116 117 try { 118 List<String> authorizedDocuments = new ArrayList<String>(); 119 for (Map<String, Serializable> map : res) { 120 authorizedDocuments.add((String) map.get("ecm:uuid")); 121 } 122 return authorizedDocuments; 123 } finally { 124 if (res != null) { 125 res.close(); 126 } 127 } 128 } 129 130 @Override 131 public List<ActivityMessage> toActivityMessages(Locale locale) { 132 ActivityStreamService activityStreamService = Framework.getLocalService(ActivityStreamService.class); 133 List<ActivityMessage> messages = new ArrayList<ActivityMessage>(); 134 for (Activity activity : this) { 135 messages.add(activityStreamService.toActivityMessage(activity, locale)); 136 } 137 return messages; 138 } 139 140 @Override 141 public List<ActivityMessage> toActivityMessages(Locale locale, String activityLinkBuilderName) { 142 ActivityStreamService activityStreamService = Framework.getLocalService(ActivityStreamService.class); 143 List<ActivityMessage> messages = new ArrayList<ActivityMessage>(); 144 for (Activity activity : this) { 145 messages.add(activityStreamService.toActivityMessage(activity, locale, activityLinkBuilderName)); 146 } 147 return messages; 148 } 149 150 @Override 151 public List<Serializable> toActivityIds() { 152 List<Serializable> activityIds = new ArrayList<Serializable>(); 153 for (Activity activity : this) { 154 activityIds.add(activity.getId()); 155 } 156 return activityIds; 157 } 158 159}