/* 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 org.activiti.workflow.simple.converter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.activiti.workflow.simple.converter.listener.DefaultWorkflowDefinitionConversionListener; import org.activiti.workflow.simple.converter.listener.WorkflowDefinitionConversionListener; import org.activiti.workflow.simple.converter.step.ChoiceStepsDefinitionConverter; import org.activiti.workflow.simple.converter.step.DelayStepDefinitionConverter; import org.activiti.workflow.simple.converter.step.FeedbackStepDefinitionConverter; import org.activiti.workflow.simple.converter.step.HumanStepDefinitionConverter; import org.activiti.workflow.simple.converter.step.ParallelStepsDefinitionConverter; import org.activiti.workflow.simple.converter.step.ScriptStepDefinitionConverter; import org.activiti.workflow.simple.converter.step.StepDefinitionConverter; import org.activiti.workflow.simple.definition.StepDefinition; import org.activiti.workflow.simple.definition.WorkflowDefinition; /** * Factory that is capable of creating {@link WorkflowDefinitionConversion} objects. * * It is necessary for a correct conversion to set (or inject) {@link StepDefinition} converters * (instances of {@link StepDefinitionConverter}) and conversion life cycle listeners * (instance of {@link WorkflowDefinitionConversionListener}). * * @author Frederik Heremans * @author Joram Barrez */ public class WorkflowDefinitionConversionFactory { private static final long serialVersionUID = 229288964476630200L; protected HashMap<Class< ? >, StepDefinitionConverter> defaultStepConverters; protected HashMap<Class< ? >, StepDefinitionConverter> stepConverters; protected List<WorkflowDefinitionConversionListener> defaultWorkflowDefinitionConversionListeners; protected List<WorkflowDefinitionConversionListener> workflowDefinitionConversionListeners; protected List<WorkflowDefinitionConversionListener> allWorkflowDefinitionConversionListeners; public WorkflowDefinitionConversionFactory() { initDefaultStepConverters(); initDefaultWorkflowDefinitionConversionListeners(); } @SuppressWarnings("rawtypes") protected void initDefaultStepConverters() { List<StepDefinitionConverter> converters = new ArrayList<StepDefinitionConverter>(); converters.add(new ParallelStepsDefinitionConverter()); converters.add(new ChoiceStepsDefinitionConverter()); converters.add(new HumanStepDefinitionConverter()); converters.add(new FeedbackStepDefinitionConverter()); converters.add(new ScriptStepDefinitionConverter()); converters.add(new DelayStepDefinitionConverter()); setDefaultStepDefinitionConverters(converters); } protected void initDefaultWorkflowDefinitionConversionListeners() { List<WorkflowDefinitionConversionListener> listeners = new ArrayList<WorkflowDefinitionConversionListener>(); listeners.add(new DefaultWorkflowDefinitionConversionListener()); setDefaultWorkflowDefinitionConversionListeners(listeners); } /** * @return a new, empty conversion to be used to store all converted * artifacts. */ public WorkflowDefinitionConversion createWorkflowDefinitionConversion() { return new WorkflowDefinitionConversion(this); } public WorkflowDefinitionConversion createWorkflowDefinitionConversion(WorkflowDefinition workflowDefinition) { return new WorkflowDefinitionConversion(this, workflowDefinition); } public void setDefaultStepDefinitionConverters(List<StepDefinitionConverter> stepConverters) { this.defaultStepConverters = new HashMap<Class<?>, StepDefinitionConverter>(); for (StepDefinitionConverter converter : stepConverters) { this.defaultStepConverters.put(converter.getHandledClass(), converter); } } public void setStepDefinitionConverters(List<StepDefinitionConverter> stepConverters) { this.stepConverters = new HashMap<Class< ? >, StepDefinitionConverter>(); for (StepDefinitionConverter converter : stepConverters) { this.stepConverters.put(converter.getHandledClass(), converter); } } /** * Returns all {@link WorkflowDefinitionConversionListener} instances, both the injected * and the default ones. */ public List<WorkflowDefinitionConversionListener> getAllWorkflowDefinitionConversionListeners() { if (allWorkflowDefinitionConversionListeners == null) { allWorkflowDefinitionConversionListeners = new ArrayList<WorkflowDefinitionConversionListener>(); if (defaultWorkflowDefinitionConversionListeners != null) { allWorkflowDefinitionConversionListeners.addAll(defaultWorkflowDefinitionConversionListeners); } if (workflowDefinitionConversionListeners != null) { allWorkflowDefinitionConversionListeners.addAll(workflowDefinitionConversionListeners); } } return allWorkflowDefinitionConversionListeners; } public void setDefaultWorkflowDefinitionConversionListeners(List<WorkflowDefinitionConversionListener> defaultWorkflowDefinitionConversionListeners) { this.defaultWorkflowDefinitionConversionListeners = defaultWorkflowDefinitionConversionListeners; this.allWorkflowDefinitionConversionListeners = null; } public void setWorkflowDefinitionConversionListeners(List<WorkflowDefinitionConversionListener> workflowDefinitionConversionListeners) { this.workflowDefinitionConversionListeners = workflowDefinitionConversionListeners; this.allWorkflowDefinitionConversionListeners = null; } /** * @param definition * {@link StepDefinition} to get converter for. First, the injected list * of {@link StepDefinitionConverter} is checked, before falling back * to the default list of {@link StepDefinitionConverter}. * @return Converter that can be used on the given definition. * @throws IllegalArgumentException * when there is no converter known for the given definition. */ public StepDefinitionConverter getStepConverterFor(StepDefinition definition) { StepDefinitionConverter converter = null; if (stepConverters != null) { converter = stepConverters.get(definition.getClass()); } if (converter == null && defaultStepConverters != null) { converter = defaultStepConverters.get(definition.getClass()); } if (converter == null) { // TODO: i18n and error-handling throw new IllegalArgumentException("No converter found for step: " + definition.getClass()); } return converter; } }