KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > openharmonise > rm > resources > metadata > properties > ranges > RangeFactory


1 /*
2  * The contents of this file are subject to the
3  * Mozilla Public License Version 1.1 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at http://www.mozilla.org/MPL/
6  *
7  * Software distributed under the License is distributed on an "AS IS"
8  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
9  * See the License for the specific language governing rights and
10  * limitations under the License.
11  *
12  * The Initial Developer of the Original Code is Simulacra Media Ltd.
13  * Portions created by Simulacra Media Ltd are Copyright (C) Simulacra Media Ltd, 2004.
14  *
15  * All Rights Reserved.
16  *
17  * Contributor(s):
18  */

19 package org.openharmonise.rm.resources.metadata.properties.ranges;
20
21 import java.net.*;
22 import java.util.*;
23
24 import org.openharmonise.commons.xml.*;
25 import org.openharmonise.rm.metadata.*;
26 import org.openharmonise.rm.resources.*;
27 import org.w3c.dom.*;
28
29
30 /**
31  * Class which generates the appropriate <code>Range</code> implementation
32  * for a given object description.
33  *
34  * @author Michael Bell
35  * @version $Revision: 1.1 $
36  *
37  */

38 public class RangeFactory {
39
40     /**
41      * The singleton instance of this class.
42      */

43     private static RangeFactory m_instance = null;
44     
45     /**
46      * A <code>Map</code> of range descriptions and their associated range class names
47      */

48     private Map m_rangeMappings = new Hashtable();
49     
50     private static Map m_RangeTagMap = new Hashtable();
51     
52     static {
53         m_RangeTagMap.put(AbsoluteChildObjectRange.TAG_ABSOLUTECHILDOBJECT_RANGE,AbsoluteChildObjectRange.class);
54         m_RangeTagMap.put(BooleanRange.TAG_BOOLEAN_RANGE,BooleanRange.class);
55         m_RangeTagMap.put(DateRange.TAG_DATE_RANGE,DateRange.class);
56         m_RangeTagMap.put(FloatRange.TAG_FLOAT_RANGE,FloatRange.class);
57         m_RangeTagMap.put(IntegerRange.TAG_INTEGER_RANGE,IntegerRange.class);
58         m_RangeTagMap.put(ProfileRange.TAG_PROFILE_RANGE,ProfileRange.class);
59         m_RangeTagMap.put(RelativeChildObjectRange.TAG_RELATIVECHILDOBJECT_RANGE,RelativeChildObjectRange.class);
60         m_RangeTagMap.put(StringRange.TAG_STRING_RANGE,StringRange.class);
61         m_RangeTagMap.put(URIRange.TAG_URI_RANGE,URIRange.class);
62     }
63
64     /**
65      * Constructs a new <code>RangeFactory</code>.
66      */

67     private RangeFactory() {
68
69     }
70
71     /**
72      * Returns the singleton instance of <code>RangeFactory</code>.
73      *
74      * @return the singleton instance of <code>RangeFactory</code>
75      */

76     public static RangeFactory getInstance() {
77         if (m_instance == null) {
78             m_instance = new RangeFactory();
79         }
80
81         return m_instance;
82     }
83
84     /**
85      * Returns the particular <code>Range</code> implementation which is
86      * appropriate for the range description given.
87      *
88      * Note: the range description is assumed to be a class name.
89      *
90      * @param sRangeDesc a class name which will determine which
91      * <code>Range</code> implementation should be returned
92      * @return a <code>Range</code> implementation appropriate to the
93      * specified class name
94      * @throws ClassNotFoundException if the class loader can not find the
95      * <code>Range</code> <code>Class</code>
96      */

97     public Range getRange(String JavaDoc sRangeDesc) throws ClassNotFoundException JavaDoc, InvalidRangeObjectException {
98         Range result = null;
99
100         if (sRangeDesc != null) {
101
102             Class JavaDoc clss;
103
104             clss = Class.forName(sRangeDesc);
105
106             if (String JavaDoc.class.isAssignableFrom(clss) == true) {
107                 result = new StringRange();
108             } else if (Date.class.isAssignableFrom(clss) == true) {
109                 result = new DateRange();
110             } else if (Integer JavaDoc.class.isAssignableFrom(clss) == true) {
111                 result = new IntegerRange();
112             } else if (Float JavaDoc.class.isAssignableFrom(clss) == true) {
113                 result = new FloatRange();
114             } else if (AbstractChildObject.class.isAssignableFrom(clss)) {
115                 result = new AbsoluteChildObjectRange(sRangeDesc);
116             } else if (Profile.class.isAssignableFrom(clss)) {
117                 result = new ProfileRange();
118             } else if (Boolean JavaDoc.class.isAssignableFrom(clss)) {
119                 result = new BooleanRange();
120             } else if (URL.class.isAssignableFrom(clss)) {
121                 result = new URIRange();
122             } else if (Range.class.isAssignableFrom(clss)) {
123                 try {
124                     result = (Range) clss.newInstance();
125                 } catch (InstantiationException JavaDoc e) {
126                     throw new InvalidRangeObjectException("Range object invalid - " + sRangeDesc);
127                 } catch (IllegalAccessException JavaDoc e) {
128                     throw new InvalidRangeObjectException("Range object invalid - " + sRangeDesc);
129                 }
130                 
131             } else {
132                 if(m_rangeMappings.containsKey(sRangeDesc) == true) {
133                     String JavaDoc sRangeClassName = (String JavaDoc) m_rangeMappings.get(sRangeDesc);
134                     try {
135                         result = (Range) Class.forName(sRangeClassName).newInstance();
136                     } catch (InstantiationException JavaDoc e) {
137                         throw new InvalidRangeObjectException("Range object invalid - " + sRangeDesc);
138                     } catch (IllegalAccessException JavaDoc e) {
139                         throw new InvalidRangeObjectException("Range object invalid - " + sRangeDesc);
140                     }
141                 } else {
142                     throw new InvalidRangeObjectException("Range object invalid - " + sRangeDesc);
143                 }
144             }
145         }
146
147         return result;
148     }
149     
150     /**
151      * Adds a mapping between a specified class name and a <code>Range</code>
152      * class name.
153      *
154      * @param sClassname the class name which will map to the specified
155      * <code>Range</code>
156      * @param sRangeClassName the <code>Range</code> implementation class name
157      */

158     public void addNewRange(String JavaDoc sClassname, String JavaDoc sRangeClassName) {
159         
160         m_rangeMappings.put(sClassname, sRangeClassName);
161     }
162     
163     /**
164      * Adds a mapping between a specified class name, a <code>Range</code>
165      * class name and an XML tag name.
166      *
167      * @param sClassname the class name which will map to the specified
168      * <code>Range</code>
169      * @param sRangeClassName the <code>Range</code> implementation class name
170      * @param sTagname the XML tag name
171      */

172     public void addNewRange(String JavaDoc sClassname, String JavaDoc sRangeClassName, String JavaDoc sTagname) throws ClassNotFoundException JavaDoc {
173         
174         m_rangeMappings.put(sClassname, sRangeClassName);
175         m_RangeTagMap.put(sTagname,Class.forName(sRangeClassName));
176     }
177     
178     /**
179      * Returns <code>true</code> if the specified XML tag name is
180      * associated to a <code>Range</code> implementation.
181      *
182      * @param sTagname the XML tag name
183      * @return <code>true</code> if the specified XML tag name is
184      * associated to a <code>Range</code> implementation
185      */

186     static public boolean isRangeTagName(String JavaDoc sTagname) {
187         return m_RangeTagMap.containsKey(sTagname);
188     }
189
190     /**
191      * Returns the appropriate <code>Range</code> implementation for the
192      * specified XML element.
193      *
194      * @param xmlElement the range XML element
195      * @return the appropriate <code>Range</code> implementation
196      * @throws InvalidRangeObjectException if no appropriate range exists
197      * @throws ClassNotFoundException if the class loader can not find the
198      * associated <code>Range</code> class
199      */

200     public Range getRange(Element xmlElement) throws InvalidRangeObjectException {
201         Range range = null;
202         String JavaDoc sTagname = xmlElement.getTagName();
203         
204         if(sTagname.equals(AbstractRange.TAG_RANGE)) {
205             Element objEl = XMLUtils.getFirstNamedChild(xmlElement, AbstractRange.TAG_RANGE_OBJECT);
206             
207             if(objEl != null) {
208                 String JavaDoc sObjName = objEl.getFirstChild().getNodeValue();
209                 try {
210                     range = getRange(sObjName);
211                 } catch (ClassNotFoundException JavaDoc e) {
212                     throw new InvalidRangeObjectException("Unable to instantiate range class for " + sObjName);
213                 }
214             } else {
215                 throw new InvalidRangeObjectException("No range object defined");
216             }
217         } else if(isRangeTagName(sTagname)) {
218             Class JavaDoc rangeClass = (Class JavaDoc) m_RangeTagMap.get(sTagname);
219             
220             try {
221                 range = (Range) rangeClass.newInstance();
222             } catch (InstantiationException JavaDoc e) {
223                 throw new InvalidRangeObjectException("Unable to instantiate range class " + rangeClass.getName());
224             } catch (IllegalAccessException JavaDoc e) {
225                 throw new InvalidRangeObjectException("Unable to instantiate range class " + rangeClass.getName());
226             }
227         }
228         
229         return range;
230     }
231 }
232
Popular Tags