Coverage Report - org.apache.commons.scxml.env.SimpleContext

Classes in this File Line Coverage Branch Coverage Complexity
SimpleContext
90% 
100% 
1.857

 1  
 /*
 2  
  *
 3  
  *   Copyright 2005-2006 The Apache Software Foundation.
 4  
  *
 5  
  *  Licensed under the Apache License, Version 2.0 (the "License");
 6  
  *  you may not use this file except in compliance with the License.
 7  
  *  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  
  */
 18  
 package org.apache.commons.scxml.env;
 19  
 
 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 {
 32  
 
 33  
     /** Implementation independent log category. */
 34  308
     private Log log = LogFactory.getLog(Context.class);
 35  
     /** The parent Context to this Context. */
 36  
     private Context parent;
 37  
     /** The Map of variables and their values in this Context. */
 38  
     private Map vars;
 39  
 
 40  
     /**
 41  
      * Constructor.
 42  
      *
 43  
      */
 44  
     public SimpleContext() {
 45  54
         this(null, null);
 46  54
     }
 47  
 
 48  
     /**
 49  
      * Constructor.
 50  
      *
 51  
      * @param parent A parent Context, can be null
 52  
      */
 53  
     public SimpleContext(final Context parent) {
 54  152
         this(parent, null);
 55  152
     }
 56  
     /**
 57  
      * Constructor.
 58  
      *
 59  
      * @param initialVars A pre-populated initial variables map
 60  
      */
 61  
     public SimpleContext(final Map initialVars) {
 62  90
         this(null, initialVars);
 63  90
     }
 64  
 
 65  
     /**
 66  
      * Constructor.
 67  
      *
 68  
      * @param parent A parent Context, can be null
 69  
      * @param initialVars A pre-populated initial variables map
 70  
      */
 71  301
     public SimpleContext(final Context parent, final Map initialVars) {
 72  301
         this.parent = parent;
 73  301
         if (initialVars == null) {
 74  206
             this.vars = new HashMap();
 75  
         } else {
 76  95
             this.vars = initialVars;
 77  
         }
 78  301
     }
 79  
 
 80  
     /**
 81  
      * Assigns a new value to an existing variable or creates a new one.
 82  
      * The method searches the chain of parent Contexts for variable
 83  
      * existence.
 84  
      *
 85  
      * @param name The variable name
 86  
      * @param value The variable value
 87  
      * @see org.apache.commons.scxml.Context#set(String, Object)
 88  
      */
 89  
     public void set(final String name, final Object value) {
 90  46
         if (vars.containsKey(name)) { //first try to override local
 91  21
             setLocal(name, value);
 92  25
         } else if (parent != null && parent.has(name)) { //then check for global
 93  19
             parent.set(name, value);
 94  
         } else { //otherwise create a new local variable
 95  6
             setLocal(name, value);
 96  
         }
 97  46
     }
 98  
 
 99  
     /**
 100  
      * Get the value of this variable; delegating to parent.
 101  
      *
 102  
      * @param name The variable name
 103  
      * @return Object The variable value
 104  
      * @see org.apache.commons.scxml.Context#get(java.lang.String)
 105  
      */
 106  
     public Object get(final String name) {
 107  366
         if (vars.containsKey(name)) {
 108  225
             return vars.get(name);
 109  141
         } else if (parent != null) {
 110  59
             return parent.get(name);
 111  
         } else {
 112  82
             return null;
 113  
         }
 114  
     }
 115  
 
 116  
     /**
 117  
      * Check if this variable exists, delegating to parent.
 118  
      *
 119  
      * @param name The variable name
 120  
      * @return boolean true if this variable exists
 121  
      * @see org.apache.commons.scxml.Context#has(java.lang.String)
 122  
      */
 123  
     public boolean has(final String name) {
 124  63
         if (vars.containsKey(name)) {
 125  39
             return true;
 126  24
         } else if (parent != null && parent.has(name)) {
 127  19
             return true;
 128  
         }
 129  5
         return false;
 130  
     }
 131  
 
 132  
     /**
 133  
      * Clear this Context.
 134  
      *
 135  
      * @see org.apache.commons.scxml.Context#reset()
 136  
      */
 137  
     public void reset() {
 138  11
         vars.clear();
 139  11
     }
 140  
 
 141  
     /**
 142  
      * Get the parent Context, may be null.
 143  
      *
 144  
      * @return Context The parent Context
 145  
      * @see org.apache.commons.scxml.Context#getParent()
 146  
      */
 147  
     public Context getParent() {
 148  233
         return parent;
 149  
     }
 150  
 
 151  
     /**
 152  
      * Assigns a new value to an existing variable or creates a new one.
 153  
      * The method allows to shaddow a variable of the same name up the
 154  
      * Context chain.
 155  
      *
 156  
      * @param name The variable name
 157  
      * @param value The variable value
 158  
      * @see org.apache.commons.scxml.Context#setLocal(String, Object)
 159  
      */
 160  
     public void setLocal(final String name, final Object value) {
 161  779
         vars.put(name, value);
 162  779
         if (log.isDebugEnabled() && !name.equals("_ALL_STATES")) {
 163  0
             log.debug(name + " = " + String.valueOf(value));
 164  
         }
 165  779
     }
 166  
 
 167  
     /**
 168  
      * Set the variables map.
 169  
      *
 170  
      * @param vars The new Map of variables.
 171  
      */
 172  
     protected void setVars(final Map vars) {
 173  12
         this.vars = vars;
 174  12
     }
 175  
 
 176  
     /**
 177  
      * Get the Map of all local variables in this Context.
 178  
      *
 179  
      * @return Returns the vars.
 180  
      */
 181  
     public Map getVars() {
 182  547
         return vars;
 183  
     }
 184  
 
 185  
     /**
 186  
      * Set the log used by this <code>Context</code> instance.
 187  
      *
 188  
      * @param log The new log.
 189  
      */
 190  
     protected void setLog(final Log log) {
 191  0
         this.log = log;
 192  0
     }
 193  
 
 194  
     /**
 195  
      * Get the log used by this <code>Context</code> instance.
 196  
      *
 197  
      * @return Log The log being used.
 198  
      */
 199  
     protected Log getLog() {
 200  0
         return log;
 201  
     }
 202  
 
 203  
 }
 204