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