/* * Copyright 2014 Effektif GmbH. * * 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. */ package com.effektif.workflow.impl.workflow; import java.util.ArrayList; import java.util.List; import com.effektif.workflow.api.workflow.Activity; import com.effektif.workflow.api.workflow.Scope; import com.effektif.workflow.impl.WorkflowParser; import com.effektif.workflow.impl.activity.ActivityType; import com.effektif.workflow.impl.activity.ActivityTypeService; /** * @author Tom Baeyens */ public class ActivityImpl extends ScopeImpl { public String id; public Activity activity; public ActivityType activityType; /** the list of transitions for which this activity is the destination. * This field is not persisted nor jsonned. It is derived from the parent's {@link ScopeImpl#transitions} */ public List<TransitionImpl> incomingTransitions; /** the list of transitions for which this activity is the source. * This field is not persisted nor jsonned. It is derived from the parent's {@link ScopeImpl#transitions} */ public List<TransitionImpl> outgoingTransitions; public TransitionImpl defaultTransition; /// Activity Definition Builder methods //////////////////////////////////////////////// public void parse(Activity activity, Scope parentScope, ScopeImpl parentScopeImpl, WorkflowParser parser) { super.parse(activity, parentScopeImpl, parser); this.id = activity.getId(); this.activity = activity; if (id==null) { parser.addError("Activity has no id"); } else if ("".equals(id)) { parser.addError("Activity has a empty string as id", id); } else if (id.contains(".")) { parser.addError("Activity '%s' has a dot in the id", id); } else if (parser.activityIds.contains(id)) { parser.addError("Duplicate activity id '%s'", id); } else { parser.activityIds.add(id); } ActivityTypeService activityTypeService = parser.getConfiguration(ActivityTypeService.class); this.activityType = activityTypeService.instantiateActivityType(activity); // some activity types need to validate incoming and outgoing transitions, // that's why they are NOT parsed here, but after the transitions. if (this.activityType==null) { parser.addError("Activity '%s' has no activityType configured", id); } } public boolean isMultiInstance() { return activityType.getMultiInstance() != null; } public String getIdText() { return id; } /// other methods //////////////////////////// public void addOutgoingTransition(TransitionImpl transitionDefinition) { if (outgoingTransitions==null) { outgoingTransitions = new ArrayList<TransitionImpl>(); } outgoingTransitions.add(transitionDefinition); } public boolean hasOutgoingTransitions() { return outgoingTransitions!=null && !outgoingTransitions.isEmpty(); } @SuppressWarnings({ "unchecked", "rawtypes" }) public List<TransitionImpl> getOutgoingTransitions() { return (List) outgoingTransitions; } public void setOutgoingTransitions(List<TransitionImpl> outgoingTransitionDefinitions) { this.outgoingTransitions = outgoingTransitionDefinitions; } public void addIncomingTransition(TransitionImpl transitionDefinition) { if (incomingTransitions==null) { incomingTransitions = new ArrayList<TransitionImpl>(); } incomingTransitions.add(transitionDefinition); } public boolean hasIncomingTransitionDefinitions() { return incomingTransitions!=null && !incomingTransitions.isEmpty(); } public List<TransitionImpl> getIncomingTransitions() { return incomingTransitions; } public void setIncomingTransitions(List<TransitionImpl> incomingTransitionDefinitions) { this.incomingTransitions = incomingTransitionDefinitions; } public ActivityType getActivityType() { return activityType; } public void setActivityType(ActivityType activityType) { this.activityType = activityType; } public TransitionImpl getDefaultTransition() { return defaultTransition; } public void setDefaultTransition(TransitionImpl defaultTransition) { this.defaultTransition = defaultTransition; } public String toString() { String activityName = activity.getName(); String activityTypeName = activityType.getActivityApiClass().getSimpleName(); return "["+activityTypeName+"|"+(activityName!=null?activityName+"|":"")+(id!=null?id.toString():Integer.toString(System.identityHashCode(this)))+"]"; } public String getId() { return id; } }