/* * Copyright 2008 Lockheed Martin Corporation, except as stated in the file * entitled Licensing-Information. * All modifications copyright 2009-2016 Data Access Technologies, Inc. * Licensed under the Academic Free License version 3.0 * (http://www.opensource.org/licenses/afl-3.0.php), except as stated * in the file entitled Licensing-Information. * */ package org.modeldriven.fuml.environment; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import fUML.Semantics.Classes.Kernel.Value; import fUML.Semantics.CommonBehaviors.BasicBehaviors.ParameterValue; import fUML.Semantics.CommonBehaviors.BasicBehaviors.ParameterValueList; import fUML.Syntax.Classes.Kernel.Classifier; import fUML.Syntax.Classes.Kernel.ParameterDirectionKind; import fUML.Syntax.Classes.Kernel.ParameterList; import fUML.Syntax.Classes.Kernel.Type; import fUML.Syntax.CommonBehaviors.BasicBehaviors.Behavior; public class ExecutionEnvironment { private static Log log = LogFactory.getLog(ExecutionEnvironment.class); private Environment environment; @SuppressWarnings("unused") private ExecutionEnvironment() {} public ExecutionEnvironment(Environment environment) { this.environment = environment; } public ParameterValueList execute(Behavior behavior) { ParameterList parameters = behavior.ownedParameter; ParameterValueList parameterValues = this.createDefaultInputValues(parameters); if (parameterValues == null) return null; if (log.isDebugEnabled()) log.debug("executing the behavior..."); ParameterValueList outputParameterValues = this.environment.locus.executor.execute( behavior, null, parameterValues); for (int i = 0; i < outputParameterValues.size(); i++) { ParameterValue outputParameterValue = outputParameterValues.getValue(i); if (log.isDebugEnabled()) log.debug("output parameter '" + outputParameterValue.parameter.name + "' has " + outputParameterValue.values.size() + " value(s)"); for (int j = 0; j < outputParameterValue.values.size(); j++) { if (log.isDebugEnabled()) log.debug("value [" + j + "] = " + outputParameterValue.values.getValue(j)); } } return outputParameterValues; } protected ParameterValueList createDefaultInputValues(ParameterList parameters) { if (log.isDebugEnabled()) log.debug("creating " + parameters.size() + " parameter(s):"); ParameterValueList parameterValues = new ParameterValueList(); for (int i = 0; i < parameters.size(); i++) { if (log.isDebugEnabled()) log.debug("checking parameter '" + parameters.getValue(i).name + "'"); ParameterDirectionKind direction = parameters.getValue(i).direction; if (direction == null) throw new EnvironmentException("expected 'direction' for parameter, '" + parameters.getValue(i).name + "'"); if (direction.equals(ParameterDirectionKind.in) || direction.equals(ParameterDirectionKind.inout)) { if (log.isDebugEnabled()) log.debug("creating parameter value for parameter '" + parameters.getValue(i).name + "'"); ParameterValue parameterValue = new ParameterValue(); parameterValue.parameter = parameters.getValue(i); Type type = parameters.getValue(i).type; Value value = this.environment.makeValue((Classifier)(type)); if (value == null) { log.error("expected parameter value"); return null; } if (log.isDebugEnabled()) log.debug("value = " + value); parameterValue.values.addValue(value); parameterValues.addValue(parameterValue); } } return parameterValues; } }