View Javadoc

1   /**
2    * Redistribution and use of this software and associated documentation
3    * ("Software"), with or without modification, are permitted provided
4    * that the following conditions are met:
5    *
6    * 1. Redistributions of source code must retain copyright
7    *    statements and notices.  Redistributions must also contain a
8    *    copy of this document.
9    *
10   * 2. Redistributions in binary form must reproduce the
11   *    above copyright notice, this list of conditions and the
12   *    following disclaimer in the documentation and/or other
13   *    materials provided with the distribution.
14   *
15   * 3. The name "Exolab" must not be used to endorse or promote
16   *    products derived from this Software without prior written
17   *    permission of Intalio, Inc.  For written permission,
18   *    please contact info@codehaus.org.
19   *
20   * 4. Products derived from this Software may not be called "Exolab"
21   *    nor may "Exolab" appear in their names without prior written
22   *    permission of Intalio, Inc. Exolab is a registered
23   *    trademark of Intalio, Inc.
24   *
25   * 5. Due credit should be given to the Exolab Project
26   *    (http://www.codehaus.org/).
27   *
28   * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
29   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
32   * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39   * OF THE POSSIBILITY OF SUCH DAMAGE.
40   *
41   * Copyright 1999 (C) Intalio, Inc. All Rights Reserved.
42   *
43   * $Id$
44   */
45  package org.codehaus.modello.plugin.java.javasource;
46  
47  /*
48   * Copyright (c) 2004, Codehaus.org
49   *
50   * Permission is hereby granted, free of charge, to any person obtaining a copy of
51   * this software and associated documentation files (the "Software"), to deal in
52   * the Software without restriction, including without limitation the rights to
53   * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
54   * of the Software, and to permit persons to whom the Software is furnished to do
55   * so, subject to the following conditions:
56   *
57   * The above copyright notice and this permission notice shall be included in all
58   * copies or substantial portions of the Software.
59   *
60   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
61   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
62   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
63   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
64   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
65   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
66   * SOFTWARE.
67   */
68  
69  import java.util.Vector;
70  
71  /**
72   * A simple String to Object mapping which preserves order.
73   *
74   * <BR/>
75   * <B>Note:</B>
76   * This class is not synchronized. So be careful. :-)
77   *
78   * @author <a href="mailto:kvisco@intalio.com">Keith Visco</a>
79   **/
80  public class JNamedMap
81  {
82  
83      private Vector<String> names = null;
84      private Vector<Object> objects = null;
85  
86      /**
87       * Creates a new JNamedMap
88       **/
89      public JNamedMap()
90      {
91  
92          names = new Vector<String>();
93          objects = new Vector<Object>();
94  
95      } //-- JNamedMap
96  
97      /**
98       * Creates a new JNamedMap with the given size.
99       *
100      * @param size the initial size for this NamedMap
101      **/
102     public JNamedMap( int size )
103     {
104 
105         names = new Vector<String>( size );
106         objects = new Vector<Object>( size );
107 
108     } //-- JNamedMap
109 
110 
111     /**
112      * Returns the Object associated with the given name.
113      *
114      * @param name the name to search for
115      * @return the Object associated with the given name
116      **/
117     public Object get( String name )
118     {
119         int i = indexOf( name );
120         if ( i >= 0 ) return objects.elementAt( i );
121         return null;
122     } //-- get
123 
124     /**
125      * Returns the Object at the given index.
126      *
127      * @param index the index of the Object to return
128      * @return the Object at the given index
129      **/
130     public Object get( int index )
131         throws IndexOutOfBoundsException
132     {
133         return objects.elementAt( index );
134     } //-- get
135 
136     /**
137      * Returns the name associated with the given Object
138      *
139      * @param obj the Object to search for
140      * @return the name of the given Object
141      **/
142     public String getNameByObject( Object obj )
143     {
144         int i = objects.indexOf( obj );
145         if ( i >= 0 ) return (String) names.elementAt( i );
146         return null;
147     } //-- getNameByObject
148 
149     /**
150      * Return a Vector of names
151      *
152      * @return a Vector of names
153      **/
154     @SuppressWarnings( "unchecked" )
155     public Vector<String> getNames()
156     {
157         return (Vector<String>) names.clone();
158     } //-- getNames
159 
160     /**
161      * Return a Vector of Objects
162      *
163      * @return a Vector of Objects
164      **/
165     @SuppressWarnings( "unchecked" )
166     public Vector<Object> getObjects()
167     {
168         return (Vector<Object>) objects.clone();
169     } //-- getObjects
170 
171     /**
172      * Returns the index of the Object which has been
173      * mapped (associated) with the given name
174      *
175      * @return the index of the Object which has been mapped (associated)
176      * to the given name
177      **/
178     public int indexOf( String name )
179     {
180 
181         for ( int i = 0; i < names.size(); i++ )
182         {
183             String iName = (String) names.elementAt( i );
184             if ( iName.equals( name ) ) return i;
185         }
186         return -1;
187 
188     } //-- indexOf
189 
190     /**
191      * Maps (associates) an Object with a name
192      *
193      * @param name the name to associate with the given Object
194      * @param obj the Object to be mapped
195      **/
196     public void put( String name, Object obj )
197     {
198 
199         int idx = indexOf( name );
200 
201         if ( idx >= 0 )
202             objects.setElementAt( obj, idx );
203         else
204         {
205             //-- we may need some synchronization here
206             //-- if we are in a multithreaded environment
207             names.addElement( name );
208             objects.addElement( obj );
209         }
210     } //-- put
211 
212     /**
213      * Removes and returns the Object located at the given index
214      *
215      * @param name the name of the Object to remove
216      * @return the object removed from the map.
217      **/
218     public Object remove( int index )
219         throws IndexOutOfBoundsException
220     {
221         Object obj = objects.elementAt( index );
222         objects.removeElementAt( index );
223         names.removeElementAt( index );
224         return obj;
225     } //-- remove
226 
227     /**
228      * Removes and returns the Object associated with the given name
229      *
230      * @param name the name of the Object to remove
231      * @return the object removed from the map.
232      **/
233     public Object remove( String name )
234     {
235 
236         Object obj = null;
237 
238         int idx = indexOf( name );
239         if ( idx >= 0 )
240         {
241             obj = objects.elementAt( idx );
242             objects.removeElementAt( idx );
243             names.removeElementAt( idx );
244         }
245         return obj;
246     } //-- remove
247 
248     /**
249      * Returns the number of Object associations currently in
250      * this named map
251      *
252      * @return the number of Object associations currently in
253      * this named map
254      **/
255     public int size()
256     {
257         return names.size();
258     } //-- size
259 
260 } //-- JNamedMap