001/* 002 * (C) Copyright 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 * Nicolas Ulrich 018 */ 019package org.nuxeo.ecm.platform.task; 020 021import java.io.Serializable; 022import java.util.ArrayList; 023import java.util.Arrays; 024import java.util.Calendar; 025import java.util.Date; 026import java.util.HashMap; 027import java.util.List; 028import java.util.Map; 029 030import org.nuxeo.ecm.core.api.CoreSession; 031import org.nuxeo.ecm.core.api.DocumentModel; 032import org.nuxeo.ecm.core.api.LifeCycleException; 033 034/** 035 * @since 5.5 036 */ 037public class TaskImpl implements Task { 038 039 private static final long serialVersionUID = 1L; 040 041 private DocumentModel doc; 042 043 public TaskImpl(DocumentModel doc) { 044 this.doc = doc; 045 } 046 047 @Override 048 public void addComment(String author, String text) { 049 List<Map<String, Serializable>> existingTasks = getPropertyValue(TaskConstants.TASK_COMMENTS_PROPERTY_NAME); 050 if (existingTasks == null) { 051 existingTasks = new ArrayList<Map<String, Serializable>>(); 052 } 053 existingTasks.add(new TaskComment(author, text)); 054 setPropertyValue(TaskConstants.TASK_COMMENTS_PROPERTY_NAME, existingTasks); 055 } 056 057 @Override 058 public void cancel(CoreSession coreSession) { 059 followTransition(coreSession, TaskConstants.TASK_CANCEL_LIFE_CYCLE_TRANSITION); 060 } 061 062 @Override 063 public void end(CoreSession coreSession) { 064 followTransition(coreSession, TaskConstants.TASK_END_LIFE_CYCLE_TRANSITION); 065 } 066 067 protected void followTransition(CoreSession coreSession, String transition) throws LifeCycleException { 068 if (doc.getAllowedStateTransitions().contains(transition)) { 069 coreSession.followTransition(doc.getRef(), transition); 070 } else { 071 throw new LifeCycleException( 072 "Cannot follow transition " + transition + " on the document " + doc.getPathAsString()); 073 } 074 075 } 076 077 @Override 078 public List<String> getActors() { 079 return getPropertyValue(TaskConstants.TASK_USERS_PROPERTY_NAME); 080 } 081 082 @Override 083 public List<TaskComment> getComments() { 084 List<Map<String, Serializable>> taskCommentsProperty = getPropertyValue( 085 TaskConstants.TASK_COMMENTS_PROPERTY_NAME); 086 List<TaskComment> taskComments = new ArrayList<TaskComment>(taskCommentsProperty.size()); 087 for (Map<String, Serializable> taskCommentMap : taskCommentsProperty) { 088 taskComments.add(new TaskComment(taskCommentMap)); 089 } 090 return taskComments; 091 } 092 093 @Override 094 public Date getCreated() { 095 return getDatePropertyValue(TaskConstants.TASK_CREATED_PROPERTY_NAME); 096 } 097 098 protected Date getDatePropertyValue(String propertyName) { 099 Calendar cal = (Calendar) doc.getPropertyValue(propertyName); 100 if (cal != null) { 101 return cal.getTime(); 102 } 103 return null; 104 } 105 106 @Override 107 public List<String> getDelegatedActors() { 108 return getPropertyValue(TaskConstants.TASK_DELEGATED_ACTORS_PROPERTY_NAME); 109 } 110 111 @Override 112 public String getDescription() { 113 return getPropertyValue(TaskConstants.TASK_DESCRIPTION_PROPERTY_NAME); 114 } 115 116 @Override 117 public String getDirective() { 118 return getPropertyValue(TaskConstants.TASK_DIRECTIVE_PROPERTY_NAME); 119 120 } 121 122 @Override 123 public DocumentModel getDocument() { 124 return doc; 125 } 126 127 @Override 128 public Date getDueDate() { 129 return getDatePropertyValue(TaskConstants.TASK_DUE_DATE_PROPERTY_NAME); 130 131 } 132 133 @Override 134 public String getId() { 135 return doc.getId(); 136 } 137 138 @Override 139 public String getInitiator() { 140 return getPropertyValue(TaskConstants.TASK_INITIATOR_PROPERTY_NAME); 141 } 142 143 @Override 144 public String getName() { 145 return getPropertyValue(TaskConstants.TASK_NAME_PROPERTY_NAME); 146 } 147 148 @Override 149 public String getProcessId() { 150 return getPropertyValue(TaskConstants.TASK_PROCESS_ID_PROPERTY_NAME); 151 } 152 153 /** 154 * @since 7.4 155 */ 156 @Override 157 public String getProcessName() { 158 return getPropertyValue(TaskConstants.TASK_PROCESS_NAME_PROPERTY_NAME); 159 } 160 161 @SuppressWarnings("unchecked") 162 protected <T> T getPropertyValue(String propertyName) { 163 Serializable value = doc.getPropertyValue(propertyName); 164 if (value instanceof Object[]) { 165 value = new ArrayList<Object>(Arrays.asList((Object[]) value)); 166 } 167 return (T) value; 168 } 169 170 @Override 171 public String getTargetDocumentId() { 172 String targetDocumentId = getPropertyValue(TaskConstants.TASK_TARGET_DOCUMENT_ID_PROPERTY_NAME); 173 if (targetDocumentId == null) { 174 List<String> targetDocIds = getPropertyValue(TaskConstants.TASK_TARGET_DOCUMENTS_IDS_PROPERTY_NAME); 175 targetDocumentId = targetDocIds != null && targetDocIds.size() > 0 ? targetDocIds.get(0) : null; 176 } 177 return targetDocumentId; 178 } 179 180 @Override 181 public List<String> getTargetDocumentsIds() { 182 return getPropertyValue(TaskConstants.TASK_TARGET_DOCUMENTS_IDS_PROPERTY_NAME); 183 } 184 185 @Override 186 public String getType() { 187 return getPropertyValue(TaskConstants.TASK_TYPE_PROPERTY_NAME); 188 } 189 190 @Override 191 public String getVariable(String key) { 192 Map<String, String> variables = getVariables(); 193 return variables.get(key); 194 } 195 196 @Override 197 public Map<String, String> getVariables() { 198 List<Map<String, String>> variables = getPropertyValue(TaskConstants.TASK_VARIABLES_PROPERTY_NAME); 199 Map<String, String> variableMap = new HashMap<String, String>(variables.size()); 200 for (Map<String, String> map : variables) { 201 variableMap.put(map.get("key"), map.get("value")); 202 } 203 return variableMap; 204 } 205 206 @Override 207 public Boolean hasEnded() { 208 return TaskConstants.TASK_ENDED_LIFE_CYCLE_STATE.equals(doc.getCurrentLifeCycleState()); 209 } 210 211 @Override 212 public Boolean isAccepted() { 213 Boolean isAccepted = getPropertyValue(TaskConstants.TASK_ACCEPTED_PROPERTY_NAME); 214 return isAccepted == null ? false : isAccepted; 215 } 216 217 @Override 218 public Boolean isCancelled() { 219 return TaskConstants.TASK_CANCELLED_LIFE_CYCLE_STATE.equals(doc.getCurrentLifeCycleState()); 220 } 221 222 @Override 223 public Boolean isOpened() { 224 return TaskConstants.TASK_OPENED_LIFE_CYCLE_STATE.equals(doc.getCurrentLifeCycleState()); 225 } 226 227 @Override 228 public void setAccepted(Boolean accepted) { 229 setPropertyValue(TaskConstants.TASK_ACCEPTED_PROPERTY_NAME, accepted); 230 } 231 232 @Override 233 public void setActors(List<String> users) { 234 setPropertyValue(TaskConstants.TASK_USERS_PROPERTY_NAME, users); 235 } 236 237 @Override 238 public void setCreated(Date created) { 239 setPropertyValue(TaskConstants.TASK_CREATED_PROPERTY_NAME, created); 240 } 241 242 @Override 243 public void setDelegatedActors(List<String> delegatedActors) { 244 setPropertyValue(TaskConstants.TASK_DELEGATED_ACTORS_PROPERTY_NAME, delegatedActors); 245 } 246 247 @Override 248 public void setDescription(String description) { 249 setPropertyValue(TaskConstants.TASK_DESCRIPTION_PROPERTY_NAME, description); 250 } 251 252 @Override 253 public void setDirective(String directive) { 254 setPropertyValue(TaskConstants.TASK_DIRECTIVE_PROPERTY_NAME, directive); 255 } 256 257 @Override 258 public void setDueDate(Date dueDate) { 259 setPropertyValue(TaskConstants.TASK_DUE_DATE_PROPERTY_NAME, dueDate); 260 261 } 262 263 @Override 264 public void setInitiator(String initiator) { 265 setPropertyValue(TaskConstants.TASK_INITIATOR_PROPERTY_NAME, initiator); 266 } 267 268 @Override 269 public void setName(String name) { 270 setPropertyValue(TaskConstants.TASK_NAME_PROPERTY_NAME, name); 271 } 272 273 @Override 274 public void setProcessId(String processId) { 275 setPropertyValue(TaskConstants.TASK_PROCESS_ID_PROPERTY_NAME, processId); 276 } 277 278 /** 279 * @since 7.4 280 */ 281 @Override 282 public void setProcessName(String processName) { 283 setPropertyValue(TaskConstants.TASK_PROCESS_NAME_PROPERTY_NAME, processName); 284 } 285 286 protected void setPropertyValue(String propertyName, Object value) { 287 if (value != null) { 288 if (value instanceof Date) { 289 Calendar cal = Calendar.getInstance(); 290 cal.setTime((Date) value); 291 doc.setPropertyValue(propertyName, cal); 292 } else { 293 doc.setPropertyValue(propertyName, (Serializable) value); 294 } 295 } 296 } 297 298 @Override 299 public void setTargetDocumentId(String targetDocId) { 300 List<String> ids = new ArrayList<String>(); 301 ids.add(targetDocId); 302 // handle compatibility before @5.8 303 setPropertyValue(TaskConstants.TASK_TARGET_DOCUMENTS_IDS_PROPERTY_NAME, ids); 304 setPropertyValue(TaskConstants.TASK_TARGET_DOCUMENT_ID_PROPERTY_NAME, targetDocId); 305 } 306 307 @Override 308 public void setTargetDocumentsIds(List<String> ids) { 309 // handle compatibility before @5.8 310 if (ids != null && ids.size() > 0) { 311 setPropertyValue(TaskConstants.TASK_TARGET_DOCUMENT_ID_PROPERTY_NAME, ids.get(0)); 312 } 313 setPropertyValue(TaskConstants.TASK_TARGET_DOCUMENTS_IDS_PROPERTY_NAME, ids); 314 } 315 316 @Override 317 public void setType(String type) { 318 setPropertyValue(TaskConstants.TASK_TYPE_PROPERTY_NAME, type); 319 } 320 321 @Override 322 public void setVariable(String key, String value) { 323 List<Map<String, Serializable>> variables = getPropertyValue(TaskConstants.TASK_VARIABLES_PROPERTY_NAME); 324 if (variables == null) { 325 variables = new ArrayList<Map<String, Serializable>>(); 326 } 327 Map<String, Serializable> variableMap = new HashMap<String, Serializable>(2); 328 variableMap.put("key", key); 329 variableMap.put("value", value); 330 variables.add(variableMap); 331 setPropertyValue(TaskConstants.TASK_VARIABLES_PROPERTY_NAME, variables); 332 } 333 334 @Override 335 public void setVariables(Map<String, String> variables) { 336 List<Map<String, Serializable>> variablesProperty = getPropertyValue( 337 TaskConstants.TASK_VARIABLES_PROPERTY_NAME); 338 if (variablesProperty == null) { 339 variablesProperty = new ArrayList<Map<String, Serializable>>(); 340 } 341 Map<String, Serializable> variable; 342 for (String key : variables.keySet()) { 343 Object value = variables.get(key); 344 if (value instanceof String) { 345 variable = new HashMap<String, Serializable>(1); 346 variable.put("key", key); 347 variable.put("value", (Serializable) value); 348 variablesProperty.add(variable); 349 } 350 } 351 setPropertyValue(TaskConstants.TASK_VARIABLES_PROPERTY_NAME, variablesProperty); 352 } 353 354}