Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/objectstyle/cayenne/access/types/ExtendedTypeMap.java


1   /* ====================================================================
2    * 
3    * The ObjectStyle Group Software License, Version 1.0 
4    *
5    * Copyright (c) 2002-2003 The ObjectStyle Group 
6    * and individual authors of the software.  All rights reserved.
7    *
8    * Redistribution and use in source and binary forms, with or without
9    * modification, are permitted provided that the following conditions
10   * are met:
11   *
12   * 1. Redistributions of source code must retain the above copyright
13   *    notice, this list of conditions and the following disclaimer. 
14   *
15   * 2. Redistributions in binary form must reproduce the above copyright
16   *    notice, this list of conditions and the following disclaimer in
17   *    the documentation and/or other materials provided with the
18   *    distribution.
19   *
20   * 3. The end-user documentation included with the redistribution, if
21   *    any, must include the following acknowlegement:  
22   *       "This product includes software developed by the 
23   *        ObjectStyle Group (http://objectstyle.org/)."
24   *    Alternately, this acknowlegement may appear in the software itself,
25   *    if and wherever such third-party acknowlegements normally appear.
26   *
27   * 4. The names "ObjectStyle Group" and "Cayenne" 
28   *    must not be used to endorse or promote products derived
29   *    from this software without prior written permission. For written 
30   *    permission, please contact andrus@objectstyle.org.
31   *
32   * 5. Products derived from this software may not be called "ObjectStyle"
33   *    nor may "ObjectStyle" appear in their names without prior written
34   *    permission of the ObjectStyle Group.
35   *
36   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39   * DISCLAIMED.  IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
40   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47   * SUCH DAMAGE.
48   * ====================================================================
49   *
50   * This software consists of voluntary contributions made by many
51   * individuals on behalf of the ObjectStyle Group.  For more
52   * information on the ObjectStyle Group, please see
53   * <http://objectstyle.org/>.
54   *
55   */
56  
57  package org.objectstyle.cayenne.access.types;
58  
59  import java.util.HashMap;
60  import java.util.Iterator;
61  import java.util.Map;
62  import java.util.Set;
63  
64  /** 
65   * Contains a map of ExtendedType objects, that serve as handlers for converting
66   * values between Java application and JDBC layer.
67   * 
68   * <p>Class uses singleton model, since mapping is usually shared within the
69   * application.</p>
70   * 
71   * @author Andrei Adamchik
72   */
73  public class ExtendedTypeMap {
74      protected Map typeMap = new HashMap();
75      protected DefaultType defaultType = new DefaultType();
76  
77      public ExtendedTypeMap() {
78          this.initDefaultTypes();
79      }
80  
81      /** 
82       * Registers default extended types. This method is called from
83       * constructor and exists mainly for the benefit of subclasses that can
84       * override it and configure their own extended types.
85       */
86      protected void initDefaultTypes() {
87          // register default types
88          Iterator it = DefaultType.defaultTypes();
89          while (it.hasNext()) {
90              registerType(new DefaultType((String) it.next()));
91          }
92      }
93  
94      /** Adds new type to the list of registered types. */
95      public void registerType(ExtendedType type) {
96          typeMap.put(type.getClassName(), type);
97      }
98  
99      public ExtendedType getDefaultType() {
100         return defaultType;
101     }
102 
103     /**
104      * Returns a type registered for the class name. If no such type exists,
105      * returns the default type. It is guaranteed that this method returns a
106      * non-null ExtendedType instance. Note that for array types class name must
107      * be in the form 'MyClass[]'.
108      */
109     public ExtendedType getRegisteredType(String javaClassName) {
110         ExtendedType type = (ExtendedType) typeMap.get(javaClassName);
111         return (type != null) ? type : defaultType;
112     }
113 
114     /**
115       * Returns a type registered for the class name. If no such type exists,
116       * returns the default type. It is guaranteed that this method returns a
117       * non-null ExtendedType instance.
118       */
119     public ExtendedType getRegisteredType(Class javaClass) {
120         String name = null;
121 
122         if (javaClass.isArray()) {
123             // only support single dimensional arrays now
124             name = javaClass.getComponentType() + "[]";
125         } else {
126             name = javaClass.getName();
127         }
128 
129         ExtendedType type = (ExtendedType) typeMap.get(name);
130         return (type != null) ? type : defaultType;
131     }
132 
133     /** 
134      * Removes registered ExtendedType object corresponding to
135      * <code>javaClassName</code> parameter. 
136      */
137     public void unregisterType(String javaClassName) {
138         typeMap.remove(javaClassName);
139     }
140 
141     /** 
142      * Returns array of Java class names supported by Cayenne 
143      * for JDBC mapping. 
144      */
145     public String[] getRegisteredTypeNames() {
146         Set keys = typeMap.keySet();
147         int len = keys.size();
148         String[] types = new String[len];
149 
150         Iterator it = keys.iterator();
151         for (int i = 0; i < len; i++) {
152             types[i] = (String) it.next();
153         }
154 
155         return types;
156     }
157 }