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   * <p>
73   * A simple String to Object mapping which preserves order.
74   * </p>
75   * <strong>Note:</strong>
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      * @param name the name
176      * @return the index of the Object which has been mapped (associated)
177      * to the given name
178      **/
179     public int indexOf( String name )
180     {
181 
182         for ( int i = 0; i < names.size(); i++ )
183         {
184             String iName = (String) names.elementAt( i );
185             if ( iName.equals( name ) ) return i;
186         }
187         return -1;
188 
189     } //-- indexOf
190 
191     /**
192      * Maps (associates) an Object with a name
193      *
194      * @param name the name to associate with the given Object
195      * @param obj the Object to be mapped
196      **/
197     public void put( String name, Object obj )
198     {
199 
200         int idx = indexOf( name );
201 
202         if ( idx >= 0 )
203             objects.setElementAt( obj, idx );
204         else
205         {
206             //-- we may need some synchronization here
207             //-- if we are in a multithreaded environment
208             names.addElement( name );
209             objects.addElement( obj );
210         }
211     } //-- put
212 
213     /**
214      * Removes and returns the Object located at the given index
215      *
216      * @param index the index of the Object to remove
217      * @return the object removed from the map.
218      **/
219     public Object remove( int index )
220         throws IndexOutOfBoundsException
221     {
222         Object obj = objects.elementAt( index );
223         objects.removeElementAt( index );
224         names.removeElementAt( index );
225         return obj;
226     } //-- remove
227 
228     /**
229      * Removes and returns the Object associated with the given name
230      *
231      * @param name the name of the Object to remove
232      * @return the object removed from the map.
233      **/
234     public Object remove( String name )
235     {
236 
237         Object obj = null;
238 
239         int idx = indexOf( name );
240         if ( idx >= 0 )
241         {
242             obj = objects.elementAt( idx );
243             objects.removeElementAt( idx );
244             names.removeElementAt( idx );
245         }
246         return obj;
247     } //-- remove
248 
249     /**
250      * Returns the number of Object associations currently in
251      * this named map
252      *
253      * @return the number of Object associations currently in
254      * this named map
255      **/
256     public int size()
257     {
258         return names.size();
259     } //-- size
260 
261 } //-- JNamedMap