001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.commons.scxml.model; 018 019 import java.util.Collection; 020 021 import org.apache.commons.logging.Log; 022 import org.apache.commons.scxml.Context; 023 import org.apache.commons.scxml.ErrorReporter; 024 import org.apache.commons.scxml.Evaluator; 025 import org.apache.commons.scxml.EventDispatcher; 026 import org.apache.commons.scxml.SCInstance; 027 import org.apache.commons.scxml.SCXMLExpressionException; 028 import org.apache.commons.scxml.TriggerEvent; 029 030 /** 031 * The class in this SCXML object model that corresponds to the 032 * <var> SCXML element. 033 * 034 */ 035 public class Var extends Action { 036 037 /** 038 * Serial version UID. 039 */ 040 private static final long serialVersionUID = 1L; 041 042 /** 043 * The name of the variable to be created. 044 */ 045 private String name; 046 047 /** 048 * The expression that evaluates to the initial value of the variable. 049 */ 050 private String expr; 051 052 /** 053 * Constructor. 054 */ 055 public Var() { 056 super(); 057 } 058 059 /** 060 * Get the expression that evaluates to the initial value 061 * of the variable. 062 * 063 * @return String Returns the expr. 064 */ 065 public final String getExpr() { 066 return expr; 067 } 068 069 /** 070 * Set the expression that evaluates to the initial value 071 * of the variable. 072 * 073 * @param expr The expr to set. 074 */ 075 public final void setExpr(final String expr) { 076 this.expr = expr; 077 } 078 079 /** 080 * Get the name of the (new) variable. 081 * 082 * @return String Returns the name. 083 */ 084 public final String getName() { 085 return name; 086 } 087 088 /** 089 * Set the name of the (new) variable. 090 * 091 * @param name The name to set. 092 */ 093 public final void setName(final String name) { 094 this.name = name; 095 } 096 097 /** 098 * {@inheritDoc} 099 */ 100 public void execute(final EventDispatcher evtDispatcher, 101 final ErrorReporter errRep, final SCInstance scInstance, 102 final Log appLog, final Collection derivedEvents) 103 throws ModelException, SCXMLExpressionException { 104 Context ctx = scInstance.getContext(getParentTransitionTarget()); 105 Evaluator eval = scInstance.getEvaluator(); 106 ctx.setLocal(getNamespacesKey(), getNamespaces()); 107 Object varObj = eval.eval(ctx, expr); 108 ctx.setLocal(getNamespacesKey(), null); 109 ctx.setLocal(name, varObj); 110 if (appLog.isDebugEnabled()) { 111 appLog.debug("<var>: Defined variable '" + name 112 + "' with initial value '" + String.valueOf(varObj) + "'"); 113 } 114 TriggerEvent ev = new TriggerEvent(name + ".change", 115 TriggerEvent.CHANGE_EVENT); 116 derivedEvents.add(ev); 117 } 118 119 } 120