/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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. */ package org.jbpm.services.task.commands; import org.jbpm.services.task.impl.model.xml.JaxbFaultData; import org.jbpm.services.task.impl.model.xml.JaxbI18NText; import org.kie.api.runtime.Context; import org.kie.api.task.model.I18NText; import org.kie.internal.task.api.TaskInstanceService; import org.kie.internal.task.api.model.FaultData; import org.kie.internal.task.api.model.SubTasksStrategy; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSchemaType; import java.util.Date; import java.util.List; @XmlRootElement(name="set-task-property-command") @XmlAccessorType(XmlAccessType.NONE) public class SetTaskPropertyCommand extends UserGroupCallbackTaskCommand<Void> { public static final int FAULT_PROPERTY = 1; public static final int OUTPUT_PROPERTY = 2; public static final int PRIORITY_PROPERTY = 3; public static final int TASK_NAMES_PROPERTY = 4; public static final int EXPIRATION_DATE_PROPERTY = 5; public static final int DESCRIPTION_PROPERTY = 6; public static final int SKIPPABLE_PROPERTY = 7; public static final int SUB_TASK_STRATEGY_PROPERTY = 8; private static final long serialVersionUID = -836520791223188840L; @XmlElement(required=true) @XmlSchemaType(name="integer") private Integer property; @XmlElement private JaxbFaultData faultData; @XmlElement private Object output; @XmlElement @XmlSchemaType(name="int") private Integer priority; @XmlElement(name="names-or-descriptions") private List<JaxbI18NText> namesOrDescriptions; @XmlElement(name="expiration-date") @XmlSchemaType(name="dateTime") private Date expirationDate; @XmlElement @XmlSchemaType(name="boolean") private Boolean skippable; @XmlElement(name="sub-tasks-strategy") private SubTasksStrategy subTasksStrategy; public SetTaskPropertyCommand() { } public SetTaskPropertyCommand(long taskId, String userId, Integer property, Object value) { this.taskId = taskId; this.userId = userId; this.property = property; JaxbFaultData newValue = null; List<JaxbI18NText> newListValue = null; switch (property) { case FAULT_PROPERTY: if( value != null ) { checkValueType(value, FaultData.class, property, true, false); newValue = new JaxbFaultData((FaultData) value); } this.faultData = newValue; break; case OUTPUT_PROPERTY: this.output = value; break; case PRIORITY_PROPERTY: checkValueType(value, Integer.class, property, false, false); this.priority = (Integer) value; break; case TASK_NAMES_PROPERTY: if( value != null ) { checkValueType(value, I18NText.class, property, true, true); newListValue = JaxbI18NText.convertListFromInterfaceToJaxbImpl(((List<I18NText>) value), I18NText.class, JaxbI18NText.class); } this.namesOrDescriptions = newListValue; break; case EXPIRATION_DATE_PROPERTY: checkValueType(value, Date.class, property, false, false); this.expirationDate = (Date) value; break; case DESCRIPTION_PROPERTY: if( value != null ) { checkValueType(value, I18NText.class, property, true, true); newListValue = JaxbI18NText.convertListFromInterfaceToJaxbImpl(((List<I18NText>) value), I18NText.class, JaxbI18NText.class); } this.namesOrDescriptions = newListValue; break; case SKIPPABLE_PROPERTY: checkValueType(value, Boolean.class, property, false, false); this.skippable = (Boolean) value; break; case SUB_TASK_STRATEGY_PROPERTY: checkValueType(value, SubTasksStrategy.class, property, false, false); this.subTasksStrategy = (SubTasksStrategy) value; break; default: throw new IllegalStateException("Unknown property in " + this.getClass().getSimpleName() + " constructor: " + property); } } private void checkValueType(Object value, Class expectedClass, int property, boolean assignable, boolean list) { if( value == null ) { return; } String propType = null; switch(property) { case FAULT_PROPERTY: propType = "FAULT_PROPERTY (" + property + ")"; break; case OUTPUT_PROPERTY: propType = "OUTPUT_PROPERTY (" + property + ")"; break; case PRIORITY_PROPERTY: propType = "PRIORITY_PROPERTY (" + property + ")"; break; case TASK_NAMES_PROPERTY: propType = "TASK_NAMES_PROPERTY (" + property + ")"; break; case EXPIRATION_DATE_PROPERTY: propType = "EXPIRATION_DATE_PROPERTY (" + property + ")"; break; case DESCRIPTION_PROPERTY: propType = "DESCRIPTION_PROPERTY (" + property + ")"; break; case SKIPPABLE_PROPERTY: propType = "SKIPPABLE_PROPERTY (" + property + ")"; break; case SUB_TASK_STRATEGY_PROPERTY: propType = "SUB_TASK_STRATEGY_PROPERTY (" + property + ")"; break; default: throw new IllegalStateException("Unknown property in " + this.getClass().getSimpleName() + " constructor check: " + property); } Class valueClass = value.getClass(); if( list ) { if( ! List.class.isAssignableFrom(valueClass) ) { throw new IllegalStateException("Expected a " + expectedClass.getSimpleName() + " for property " + propType + ", not a " + valueClass.getName() ); } List listVal = (List) value; if( listVal.isEmpty() ) { return; } value = listVal.get(0); valueClass = value.getClass(); } if( assignable ) { if( ! expectedClass.isAssignableFrom(valueClass) ) { throw new IllegalStateException("Expected a " + expectedClass.getSimpleName() + " for property " + propType + ", not a " + valueClass.getName() ); } } else { if( ! expectedClass.isInstance(value) ) { throw new IllegalStateException("Expected a " + expectedClass.getSimpleName() + " for property " + propType + ", not a " + valueClass.getName() ); } } } public Integer getProperty() { return property; } public void setProperty(Integer name) { this.property = name; } public JaxbFaultData getFaultData() { return faultData; } public void setFaultData( JaxbFaultData faultData ) { this.faultData = faultData; } public Object getOutput() { return output; } public void setOutput( Object output ) { this.output = output; } public Integer getPriority() { return priority; } public void setPriority( Integer priority ) { this.priority = priority; } public List<JaxbI18NText> getNamesOrDescriptions() { return namesOrDescriptions; } public void setNamesOrDescriptions( List<JaxbI18NText> namesOrDescriptions ) { this.namesOrDescriptions = namesOrDescriptions; } public Date getExpirationDate() { return expirationDate; } public void setExpirationDate( Date expirationDate ) { this.expirationDate = expirationDate; } public Boolean getSkippable() { return skippable; } public void setSkippable( Boolean skippable ) { this.skippable = skippable; } public SubTasksStrategy getSubTasksStrategy() { return subTasksStrategy; } public void setSubTasksStrategy( SubTasksStrategy subTasksStrategy ) { this.subTasksStrategy = subTasksStrategy; } public Void execute(Context cntxt) { TaskContext context = (TaskContext) cntxt; TaskInstanceService service = context.getTaskInstanceService(); switch (property) { case FAULT_PROPERTY: doCallbackUserOperation(userId, context); service.setFault(taskId, userId, faultData); break; case OUTPUT_PROPERTY: doCallbackUserOperation(userId, context); service.setOutput(taskId, userId, output); break; case PRIORITY_PROPERTY: service.setPriority(taskId, priority ); break; case TASK_NAMES_PROPERTY: List<I18NText> names = null; if( namesOrDescriptions != null ) { names = JaxbI18NText.convertListFromJaxbImplToInterface(namesOrDescriptions); } service.setTaskNames(taskId, names); break; case EXPIRATION_DATE_PROPERTY: service.setExpirationDate(taskId, expirationDate); break; case DESCRIPTION_PROPERTY: List<I18NText> descriptions = null; if( namesOrDescriptions != null ) { descriptions = JaxbI18NText.convertListFromJaxbImplToInterface(namesOrDescriptions); } service.setDescriptions(taskId, descriptions); break; case SKIPPABLE_PROPERTY: service.setSkipable(taskId, skippable); break; case SUB_TASK_STRATEGY_PROPERTY: service.setSubTaskStrategy(taskId, subTasksStrategy); break; default: throw new IllegalStateException("Unknown property in " + this.getClass().getSimpleName() + " execute: " + property); } return null; } }