View Javadoc

1   /*
2    * Copyright (c) 2003, Henri Yandell
3    * All rights reserved.
4    * 
5    * Redistribution and use in source and binary forms, with or 
6    * without modification, are permitted provided that the 
7    * following conditions are met:
8    * 
9    * + Redistributions of source code must retain the above copyright notice, 
10   *   this list of conditions and the following disclaimer.
11   * 
12   * + Redistributions in binary form must reproduce the above copyright notice, 
13   *   this list of conditions and the following disclaimer in the documentation 
14   *   and/or other materials provided with the distribution.
15   * 
16   * + Neither the name of Genjava-Core nor the names of its contributors 
17   *   may be used to endorse or promote products derived from this software 
18   *   without specific prior written permission.
19   * 
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
23   * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
30   * POSSIBILITY OF SUCH DAMAGE.
31   */
32  package com.generationjava.collections;
33  
34  import java.util.Map;
35  import org.apache.commons.collections.ProxyMap;
36  
37  /***
38   * A map which stores objects by a key Class.
39   * When obtaining the object, it will check inheritence and 
40   * interface trees to see if the Class matches.
41   */
42  public class ClassMap extends ProxyMap {
43  
44      public ClassMap(Map m) {
45          super(m);
46      }
47  
48      /***
49       * Get the object from the map. If the key is not 
50       * a Class object, then it uses the Class of the object.
51       */
52      public Object get(Object key) {
53          if(key == null) {
54              return null;
55          }
56          Class clss = null;
57  
58          if(key instanceof Class) {
59              clss = (Class)key;
60          } else {
61              clss = key.getClass();
62          }
63  
64          Object obj = super.get(clss);
65  
66          if(obj == null) {
67              
68              // if this is null, let's go up the inheritence tree
69              obj = getInterfaces(clss);
70  
71              if(obj == null) {
72                  obj = getSuperclass(clss);
73              }
74          }
75  
76          return obj;
77      }
78  
79      private Object getInterfaces(Class clss) {
80          if(clss == null) {
81              return null;
82          }
83          Object obj = null;
84          Class[] interfaces = clss.getInterfaces();
85          for(int i=0; i<interfaces.length; i++) {
86              obj = (Object)super.get(interfaces[i]);
87              if(obj != null) {
88                  return obj; 
89              }
90              obj = getInterfaces(interfaces[i]);
91              if(obj != null) {
92                  return obj; 
93              }
94              obj = getSuperclass(interfaces[i]);
95              if(obj != null) {
96                  return obj; 
97              }
98          }
99          return null;
100     }
101 
102     private Object getSuperclass(Class clss) {
103         if(clss == null) {
104             return null;
105         }
106         Object obj = null;
107         Class superclass = clss.getSuperclass();
108         obj = (Object)super.get(superclass);
109         if(obj != null) {
110             return obj; 
111         }
112         obj = getInterfaces(superclass);
113         if(obj != null) {
114             return obj; 
115         }
116         obj = getSuperclass(superclass);
117         if(obj != null) {
118             return obj; 
119         }
120         return null;
121     }
122 
123 }