/** * Copyright 2010 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. * 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.jbpm.process.core.context.variable; import java.util.ArrayList; import java.util.List; import org.drools.core.process.core.datatype.impl.type.ObjectDataType; import org.jbpm.process.core.Context; import org.jbpm.process.core.context.AbstractContext; /** * */ public class VariableScope extends AbstractContext { private static boolean variableStrictEnabled = Boolean.parseBoolean(System.getProperty("org.jbpm.variable.strict", "false")); public static final String VARIABLE_SCOPE = "VariableScope"; public static final String CASE_FILE_PREFIX = "caseFile_"; private static final long serialVersionUID = 510l; private List<Variable> variables; public VariableScope() { this.variables = new ArrayList<Variable>(); } public String getType() { return VariableScope.VARIABLE_SCOPE; } public List<Variable> getVariables() { return this.variables; } public void setVariables(final List<Variable> variables) { if ( variables == null ) { throw new IllegalArgumentException( "Variables is null" ); } this.variables = variables; } public String[] getVariableNames() { final String[] result = new String[this.variables.size()]; if (this.variables != null) { for ( int i = 0; i < this.variables.size(); i++ ) { result[i] = ((Variable) this.variables.get( i )).getName(); } } return result; } public Variable findVariable(String variableName) { for (Variable variable: getVariables()) { if (variable.getName().equals(variableName)) { return variable; } } if (variableName.startsWith(CASE_FILE_PREFIX)) { Variable caseVariable = new Variable(); caseVariable.setName(CASE_FILE_PREFIX+variableName); caseVariable.setType(new ObjectDataType()); return caseVariable; } return null; } public Context resolveContext(Object param) { if (param instanceof String) { return findVariable((String) param) == null ? null : this; } throw new IllegalArgumentException( "VariableScopes can only resolve variable names: " + param); } public void validateVariable(String processName, String name, Object value) { if (!variableStrictEnabled) { return; } Variable var = findVariable(name); if (var == null) { throw new IllegalArgumentException("Variable '" + name +"' is not defined in process " + processName); } if (var.getType() != null && value != null) { boolean isValidType = var.getType().verifyDataType(value); if (!isValidType) { throw new IllegalArgumentException("Variable '" + name +"' has incorrect data type expected:" + var.getType().getStringType() + " actual:" + value.getClass().getName()); } } } /* * mainly for test coverage to easily switch between settings */ public static void setVariableStrictOption(boolean turnedOn) { variableStrictEnabled = turnedOn; } }