View Javadoc

1   package org.apache.velocity;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.    
20   */
21  
22  import java.util.HashMap;
23  import java.util.Map;
24  
25  import org.apache.velocity.context.AbstractContext;
26  import org.apache.velocity.context.Context;
27  
28  /**
29   *  General purpose implemention of the application Context
30   *  interface for general application use.  This class should
31   *  be used in place of the original Context class.
32   *
33   *  This implementation uses a HashMap  (@see java.util.HashMap )
34   *  for data storage.
35   *
36   *  This context implementation cannot be shared between threads
37   *  without those threads synchronizing access between them, as
38   *  the HashMap is not synchronized, nor are some of the fundamentals
39   *  of AbstractContext.  If you need to share a Context between
40   *  threads with simultaneous access for some reason, please create
41   *  your own and extend the interface Context
42   *
43   *  @see org.apache.velocity.context.Context
44   *
45   *  @author <a href="mailto:geirm@optonline.net">Geir Magnusson Jr.</a>
46   *  @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
47   *  @author <a href="mailto:fedor.karpelevitch@home.com">Fedor Karpelevitch</a>
48   *  @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a>
49   *  @version $Id: VelocityContext.java 463298 2006-10-12 16:10:32Z henning $
50   */
51  public class VelocityContext extends AbstractContext implements Cloneable
52  {
53      /**
54       * Version Id for serializable
55       */
56      private static final long serialVersionUID = 9033846851064645037L;
57  
58      /**
59       *  Storage for key/value pairs.
60       */
61      private Map context = null;
62  
63      /**
64       *  Creates a new instance (with no inner context).
65       */
66      public VelocityContext()
67      {
68          this(null, null);
69      }
70  
71      /**
72       *  Creates a new instance with the provided storage (and no inner
73       *  context).
74       * @param context
75       */
76      public VelocityContext(Map context)
77      {
78          this(context, null);
79      }
80  
81      /**
82       *  Chaining constructor, used when you want to
83       *  wrap a context in another.  The inner context
84       *  will be 'read only' - put() calls to the
85       *  wrapping context will only effect the outermost
86       *  context
87       *
88       *  @param innerContext The <code>Context</code> implementation to
89       *  wrap.
90       */
91      public VelocityContext( Context innerContext )
92      {
93          this(null, innerContext);
94      }
95  
96      /**
97       *  Initializes internal storage (never to <code>null</code>), and
98       *  inner context.
99       *
100      *  @param context Internal storage, or <code>null</code> to
101      *  create default storage.
102      *  @param innerContext Inner context.
103      */
104     public VelocityContext(Map context, Context innerContext)
105     {
106         super(innerContext);
107         this.context = (context == null ? new HashMap() : context);
108     }
109 
110     /**
111      *  retrieves value for key from internal
112      *  storage
113      *
114      *  @param key name of value to get
115      *  @return value as object
116      */
117     public Object internalGet( String key )
118     {
119         return context.get( key );
120     }
121 
122     /**
123      *  stores the value for key to internal
124      *  storage
125      *
126      *  @param key name of value to store
127      *  @param value value to store
128      *  @return previous value of key as Object
129      */
130     public Object internalPut( String key, Object value )
131     {
132         return context.put( key, value );
133     }
134 
135     /**
136      *  determines if there is a value for the
137      *  given key
138      *
139      *  @param key name of value to check
140      *  @return true if non-null value in store
141      */
142     public  boolean internalContainsKey(Object key)
143     {
144         return context.containsKey( key );
145     }
146 
147     /**
148      *  returns array of keys
149      *
150      *  @return keys as []
151      */
152     public  Object[] internalGetKeys()
153     {
154         return context.keySet().toArray();
155     }
156 
157     /**
158      *  remove a key/value pair from the
159      *  internal storage
160      *
161      *  @param key name of value to remove
162      *  @return value removed
163      */
164     public  Object internalRemove(Object key)
165     {
166         return context.remove( key );
167     }
168 
169     /**
170      * Clones this context object.
171      *
172      * @return A deep copy of this <code>Context</code>.
173      */
174     public Object clone()
175     {
176         VelocityContext clone = null;
177         try
178         {
179             clone = (VelocityContext) super.clone();
180             clone.context = new HashMap(context);
181         }
182         catch (CloneNotSupportedException ignored)
183         {
184         }
185         return clone;
186     }
187 }