View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements.  See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache License, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License.  You may obtain a copy of the License at
    8    *
    9    *     http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17  package org.apache.commons.scxml.env;
    18
    19  import java.io.Serializable;
    20  import java.util.HashMap;
    21  import java.util.Map;
    22
    23  import org.apache.commons.logging.Log;
    24  import org.apache.commons.logging.LogFactory;
    25  import org.apache.commons.scxml.Context;
    26
    27  /***
    28   * Simple Context wrapping a map of variables.
    29   *
    30   */
    31  public class SimpleContext implements Context, Serializable {
    32
    33      /*** Serial version UID. */
    34      private static final long serialVersionUID = 1L;
    35      /*** Implementation independent log category. */
    36      private Log log = LogFactory.getLog(Context.class);
    37      /*** The parent Context to this Context. */
    38      private Context parent;
    39      /*** The Map of variables and their values in this Context. */
    40      private Map vars;
    41
    42      /***
    43       * Constructor.
    44       *
    45       */
    46      public SimpleContext() {
    47          this(null, null);
    48      }
    49
    50      /***
    51       * Constructor.
    52       *
    53       * @param parent A parent Context, can be null
    54       */
    55      public SimpleContext(final Context parent) {
    56          this(parent, null);
    57      }
    58      /***
    59       * Constructor.
    60       *
    61       * @param initialVars A pre-populated initial variables map
    62       */
    63      public SimpleContext(final Map initialVars) {
    64          this(null, initialVars);
    65      }
    66
    67      /***
    68       * Constructor.
    69       *
    70       * @param parent A parent Context, can be null
    71       * @param initialVars A pre-populated initial variables map
    72       */
    73      public SimpleContext(final Context parent, final Map initialVars) {
    74          this.parent = parent;
    75          if (initialVars == null) {
    76              this.vars = new HashMap();
    77          } else {
    78              this.vars = initialVars;
    79          }
    80      }
    81
    82      /***
    83       * Assigns a new value to an existing variable or creates a new one.
    84       * The method searches the chain of parent Contexts for variable
    85       * existence.
    86       *
    87       * @param name The variable name
    88       * @param value The variable value
    89       * @see org.apache.commons.scxml.Context#set(String, Object)
    90       */
    91      public void set(final String name, final Object value) {
    92          if (vars.containsKey(name)) { //first try to override local
    93              setLocal(name, value);
    94          } else if (parent != null && parent.has(name)) { //then check for global
    95              parent.set(name, value);
    96          } else { //otherwise create a new local variable
    97              setLocal(name, value);
    98          }
    99      }
    100
    101     /***
    102      * Get the value of this variable; delegating to parent.
    103      *
    104      * @param name The variable name
    105      * @return Object The variable value
    106      * @see org.apache.commons.scxml.Context#get(java.lang.String)
    107      */
    108     public Object get(final String name) {
    109         if (vars.containsKey(name)) {
    110             return vars.get(name);
    111         } else if (parent != null) {
    112             return parent.get(name);
    113         } else {
    114             return null;
    115         }
    116     }
    117
    118     /***
    119      * Check if this variable exists, delegating to parent.
    120      *
    121      * @param name The variable name
    122      * @return boolean true if this variable exists
    123      * @see org.apache.commons.scxml.Context#has(java.lang.String)
    124      */
    125     public boolean has(final String name) {
    126         if (vars.containsKey(name)) {
    127             return true;
    128         } else if (parent != null && parent.has(name)) {
    129             return true;
    130         }
    131         return false;
    132     }
    133
    134     /***
    135      * Clear this Context.
    136      *
    137      * @see org.apache.commons.scxml.Context#reset()
    138      */
    139     public void reset() {
    140         vars.clear();
    141     }
    142
    143     /***
    144      * Get the parent Context, may be null.
    145      *
    146      * @return Context The parent Context
    147      * @see org.apache.commons.scxml.Context#getParent()
    148      */
    149     public Context getParent() {
    150         return parent;
    151     }
    152
    153     /***
    154      * Assigns a new value to an existing variable or creates a new one.
    155      * The method allows to shaddow a variable of the same name up the
    156      * Context chain.
    157      *
    158      * @param name The variable name
    159      * @param value The variable value
    160      * @see org.apache.commons.scxml.Context#setLocal(String, Object)
    161      */
    162     public void setLocal(final String name, final Object value) {
    163         vars.put(name, value);
    164         if (log.isDebugEnabled() && !name.equals("_ALL_STATES")) {
    165             log.debug(name + " = " + String.valueOf(value));
    166         }
    167     }
    168
    169     /***
    170      * Set the variables map.
    171      *
    172      * @param vars The new Map of variables.
    173      */
    174     protected void setVars(final Map vars) {
    175         this.vars = vars;
    176     }
    177
    178     /***
    179      * Get the Map of all local variables in this Context.
    180      *
    181      * @return Returns the vars.
    182      */
    183     public Map getVars() {
    184         return vars;
    185     }
    186
    187     /***
    188      * Set the log used by this <code>Context</code> instance.
    189      *
    190      * @param log The new log.
    191      */
    192     protected void setLog(final Log log) {
    193         this.log = log;
    194     }
    195
    196     /***
    197      * Get the log used by this <code>Context</code> instance.
    198      *
    199      * @return Log The log being used.
    200      */
    201     protected Log getLog() {
    202         return log;
    203     }
    204
    205 }
    206