/* * (C) Copyright 2011-2016 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * Nicolas Ulrich */ package org.nuxeo.ecm.platform.task; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.LifeCycleException; /** * @since 5.5 */ public class TaskImpl implements Task { private static final long serialVersionUID = 1L; private DocumentModel doc; public TaskImpl(DocumentModel doc) { this.doc = doc; } @Override public void addComment(String author, String text) { List<Map<String, Serializable>> existingTasks = getPropertyValue(TaskConstants.TASK_COMMENTS_PROPERTY_NAME); if (existingTasks == null) { existingTasks = new ArrayList<>(); } existingTasks.add(new TaskComment(author, text)); setPropertyValue(TaskConstants.TASK_COMMENTS_PROPERTY_NAME, existingTasks); } @Override public void cancel(CoreSession coreSession) { followTransition(coreSession, TaskConstants.TASK_CANCEL_LIFE_CYCLE_TRANSITION); } @Override public void end(CoreSession coreSession) { followTransition(coreSession, TaskConstants.TASK_END_LIFE_CYCLE_TRANSITION); } protected void followTransition(CoreSession coreSession, String transition) throws LifeCycleException { if (coreSession.getAllowedStateTransitions(doc.getRef()).contains(transition)) { coreSession.followTransition(doc.getRef(), transition); } else { throw new LifeCycleException( "Cannot follow transition " + transition + " on the document " + doc.getPathAsString()); } } @Override public List<String> getActors() { return getPropertyValue(TaskConstants.TASK_USERS_PROPERTY_NAME); } @Override public List<TaskComment> getComments() { List<Map<String, Serializable>> taskCommentsProperty = getPropertyValue( TaskConstants.TASK_COMMENTS_PROPERTY_NAME); List<TaskComment> taskComments = new ArrayList<>(taskCommentsProperty.size()); for (Map<String, Serializable> taskCommentMap : taskCommentsProperty) { taskComments.add(new TaskComment(taskCommentMap)); } return taskComments; } @Override public Date getCreated() { return getDatePropertyValue(TaskConstants.TASK_CREATED_PROPERTY_NAME); } protected Date getDatePropertyValue(String propertyName) { Calendar cal = (Calendar) doc.getPropertyValue(propertyName); if (cal != null) { return cal.getTime(); } return null; } @Override public List<String> getDelegatedActors() { return getPropertyValue(TaskConstants.TASK_DELEGATED_ACTORS_PROPERTY_NAME); } @Override public String getDescription() { return getPropertyValue(TaskConstants.TASK_DESCRIPTION_PROPERTY_NAME); } @Override public String getDirective() { return getPropertyValue(TaskConstants.TASK_DIRECTIVE_PROPERTY_NAME); } @Override public DocumentModel getDocument() { return doc; } @Override public Date getDueDate() { return getDatePropertyValue(TaskConstants.TASK_DUE_DATE_PROPERTY_NAME); } @Override public String getId() { return doc.getId(); } @Override public String getInitiator() { return getPropertyValue(TaskConstants.TASK_INITIATOR_PROPERTY_NAME); } @Override public String getName() { return getPropertyValue(TaskConstants.TASK_NAME_PROPERTY_NAME); } @Override public String getProcessId() { return getPropertyValue(TaskConstants.TASK_PROCESS_ID_PROPERTY_NAME); } /** * @since 7.4 */ @Override public String getProcessName() { return getPropertyValue(TaskConstants.TASK_PROCESS_NAME_PROPERTY_NAME); } @SuppressWarnings("unchecked") protected <T> T getPropertyValue(String propertyName) { Serializable value = doc.getPropertyValue(propertyName); if (value instanceof Object[]) { value = new ArrayList<>(Arrays.asList((Object[]) value)); } return (T) value; } @Override public List<String> getTargetDocumentsIds() { return getPropertyValue(TaskConstants.TASK_TARGET_DOCUMENTS_IDS_PROPERTY_NAME); } @Override public String getType() { return getPropertyValue(TaskConstants.TASK_TYPE_PROPERTY_NAME); } @Override public String getVariable(String key) { Map<String, String> variables = getVariables(); return variables.get(key); } @Override public Map<String, String> getVariables() { List<Map<String, String>> variables = getPropertyValue(TaskConstants.TASK_VARIABLES_PROPERTY_NAME); Map<String, String> variableMap = new HashMap<>(variables.size()); for (Map<String, String> map : variables) { variableMap.put(map.get("key"), map.get("value")); } return variableMap; } @Override public Boolean hasEnded() { return TaskConstants.TASK_ENDED_LIFE_CYCLE_STATE.equals(doc.getCurrentLifeCycleState()); } @Override public Boolean isAccepted() { Boolean isAccepted = getPropertyValue(TaskConstants.TASK_ACCEPTED_PROPERTY_NAME); return isAccepted == null ? false : isAccepted; } @Override public Boolean isCancelled() { return TaskConstants.TASK_CANCELLED_LIFE_CYCLE_STATE.equals(doc.getCurrentLifeCycleState()); } @Override public Boolean isOpened() { return TaskConstants.TASK_OPENED_LIFE_CYCLE_STATE.equals(doc.getCurrentLifeCycleState()); } @Override public void setAccepted(Boolean accepted) { setPropertyValue(TaskConstants.TASK_ACCEPTED_PROPERTY_NAME, accepted); } @Override public void setActors(List<String> users) { setPropertyValue(TaskConstants.TASK_USERS_PROPERTY_NAME, users); } @Override public void setCreated(Date created) { setPropertyValue(TaskConstants.TASK_CREATED_PROPERTY_NAME, created); } @Override public void setDelegatedActors(List<String> delegatedActors) { setPropertyValue(TaskConstants.TASK_DELEGATED_ACTORS_PROPERTY_NAME, delegatedActors); } @Override public void setDescription(String description) { setPropertyValue(TaskConstants.TASK_DESCRIPTION_PROPERTY_NAME, description); } @Override public void setDirective(String directive) { setPropertyValue(TaskConstants.TASK_DIRECTIVE_PROPERTY_NAME, directive); } @Override public void setDueDate(Date dueDate) { setPropertyValue(TaskConstants.TASK_DUE_DATE_PROPERTY_NAME, dueDate); } @Override public void setInitiator(String initiator) { setPropertyValue(TaskConstants.TASK_INITIATOR_PROPERTY_NAME, initiator); } @Override public void setName(String name) { setPropertyValue(TaskConstants.TASK_NAME_PROPERTY_NAME, name); } @Override public void setProcessId(String processId) { setPropertyValue(TaskConstants.TASK_PROCESS_ID_PROPERTY_NAME, processId); } /** * @since 7.4 */ @Override public void setProcessName(String processName) { setPropertyValue(TaskConstants.TASK_PROCESS_NAME_PROPERTY_NAME, processName); } protected void setPropertyValue(String propertyName, Object value) { if (value != null) { if (value instanceof Date) { Calendar cal = Calendar.getInstance(); cal.setTime((Date) value); doc.setPropertyValue(propertyName, cal); } else { doc.setPropertyValue(propertyName, (Serializable) value); } } } @Override public void setTargetDocumentsIds(List<String> ids) { setPropertyValue(TaskConstants.TASK_TARGET_DOCUMENTS_IDS_PROPERTY_NAME, ids); } @Override public void setType(String type) { setPropertyValue(TaskConstants.TASK_TYPE_PROPERTY_NAME, type); } @Override public void setVariable(String key, String value) { List<Map<String, Serializable>> variables = getPropertyValue(TaskConstants.TASK_VARIABLES_PROPERTY_NAME); if (variables == null) { variables = new ArrayList<>(); } Map<String, Serializable> variableMap = new HashMap<>(2); variableMap.put("key", key); variableMap.put("value", value); variables.add(variableMap); setPropertyValue(TaskConstants.TASK_VARIABLES_PROPERTY_NAME, variables); } @Override public void setVariables(Map<String, String> variables) { List<Map<String, Serializable>> variablesProperty = getPropertyValue( TaskConstants.TASK_VARIABLES_PROPERTY_NAME); if (variablesProperty == null) { variablesProperty = new ArrayList<>(); } Map<String, Serializable> variable; for (Entry<String, String> entry : variables.entrySet()) { if (entry.getValue() != null) { variable = new HashMap<>(2); variable.put("key", entry.getKey()); variable.put("value", entry.getValue()); variablesProperty.add(variable); } } setPropertyValue(TaskConstants.TASK_VARIABLES_PROPERTY_NAME, variablesProperty); } }