KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sun > tools > xjc > runtime > GrammarInfoImpl


1 package com.sun.tools.xjc.runtime;
2
3 import java.io.InputStream JavaDoc;
4 import java.io.ObjectInputStream JavaDoc;
5 import java.util.ArrayList JavaDoc;
6 import java.util.Iterator JavaDoc;
7 import java.util.List JavaDoc;
8 import java.util.Map JavaDoc;
9
10 import javax.xml.bind.JAXBException;
11 import javax.xml.namespace.QName JavaDoc;
12
13 import com.sun.xml.bind.Messages;
14
15 /**
16  * Keeps the information about the grammar as a whole.
17  *
18  * This object is immutable and thread-safe.
19  *
20  * @author
21  * <a HREF="mailto:kohsuke.kawaguchi@sun.com">Kohsuke KAWAGUCHI</a>
22  */

23 public class GrammarInfoImpl implements GrammarInfo
24 {
25     /**
26      * Map from {@link QName}s (root tag names) to {@link Class}es of the
27      * content interface that should be instanciated.
28      */

29     private final Map JavaDoc rootTagMap;
30     
31     /**
32      * Enclosing ObjectFactory class. Used to load resources.
33      */

34     private final Class JavaDoc objectFactoryClass;
35     
36     /**
37      * Map from {@link Class}es that represent content interfaces
38      * to {@link String}s that represent names of the corresponding
39      * implementation classes.
40      */

41     private final Map JavaDoc defaultImplementationMap;
42     
43     /**
44      * ClassLoader that should be used to load impl classes.
45      */

46     private final ClassLoader JavaDoc classLoader;
47     
48     public GrammarInfoImpl( Map JavaDoc _rootTagMap, Map JavaDoc _defaultImplementationMap, Class JavaDoc _objectFactoryClass ) {
49         this.rootTagMap = _rootTagMap;
50         this.defaultImplementationMap = _defaultImplementationMap;
51         this.objectFactoryClass = _objectFactoryClass;
52         // the assumption is that the content interfaces and their impls
53
// are loaded from the same class loader.
54
this.classLoader = objectFactoryClass.getClassLoader();
55     }
56     
57 // META-IF(U)
58
/**
59      * @return the name of the content interface that is registered with
60      * the specified element name.
61      */

62     private final Class JavaDoc lookupRootMap( String JavaDoc nsUri, String JavaDoc localName ) {
63         // note that the value of rootTagMap could be null.
64
QName JavaDoc qn;
65         
66         qn = new QName JavaDoc(nsUri,localName);
67         if(rootTagMap.containsKey(qn)) return (Class JavaDoc)rootTagMap.get(qn);
68
69         qn = new QName JavaDoc(nsUri,"*");
70         if(rootTagMap.containsKey(qn)) return (Class JavaDoc)rootTagMap.get(qn);
71
72         qn = new QName JavaDoc("*","*");
73         return (Class JavaDoc)rootTagMap.get(qn);
74     }
75     
76     public final Class JavaDoc getRootElement(String JavaDoc namespaceUri, String JavaDoc localName) {
77         Class JavaDoc intfCls = lookupRootMap(namespaceUri,localName);
78         if(intfCls==null) return null;
79         else return getDefaultImplementation(intfCls);
80     }
81
82     public final UnmarshallingEventHandler createUnmarshaller(
83         String JavaDoc namespaceUri, String JavaDoc localName, UnmarshallingContext context ) {
84         
85         Class JavaDoc impl = getRootElement(namespaceUri,localName);
86         if(impl==null) return null;
87         
88         try {
89             return ((UnmarshallableObject)impl.newInstance()).createUnmarshaller(context);
90         } catch (InstantiationException JavaDoc e) {
91             throw new InstantiationError JavaDoc(e.toString());
92         } catch (IllegalAccessException JavaDoc e) {
93             throw new IllegalAccessError JavaDoc(e.toString());
94         }
95     }
96     
97     public final String JavaDoc[] getProbePoints() {
98         List JavaDoc r = new ArrayList JavaDoc();
99         for (Iterator JavaDoc itr = rootTagMap.keySet().iterator(); itr.hasNext();) {
100             QName JavaDoc qn = (QName JavaDoc) itr.next();
101             r.add(qn.getNamespaceURI());
102             r.add(qn.getLocalPart());
103         }
104         return (String JavaDoc[]) r.toArray(new String JavaDoc[r.size()]);
105     }
106     
107     public final boolean recognize( String JavaDoc nsUri, String JavaDoc localName ) {
108         return lookupRootMap(nsUri,localName)!=null;
109     }
110 // META-ENDIF
111

112     public final Class JavaDoc getDefaultImplementation( Class JavaDoc javaContentInterface ) {
113         try {
114             // by caching the obtained Class objects.
115
return Class.forName((String JavaDoc)defaultImplementationMap.get(javaContentInterface), true, classLoader );
116         } catch (ClassNotFoundException JavaDoc e) {
117             throw new NoClassDefFoundError JavaDoc(e.toString());
118         }
119     }
120
121 // META-IF(W)
122
/**
123      * Gets the MSV AGM which can be used to validate XML during
124      * marshalling/unmarshalling.
125      */

126     public final com.sun.msv.grammar.Grammar getGrammar() throws JAXBException {
127         try {
128             InputStream JavaDoc is = objectFactoryClass.getResourceAsStream("bgm.ser");
129             
130             if( is==null ) {
131                 // unable to find bgm.ser
132
String JavaDoc name = objectFactoryClass.getName();
133                 int idx = name.lastIndexOf('.');
134                 name = '/'+name.substring(0,idx+1).replace('.','/')+"bgm.ser";
135                 throw new JAXBException(
136                     Messages.format( Messages.NO_BGM, name ) );
137             }
138             
139             // deserialize the bgm
140
ObjectInputStream JavaDoc ois = new ObjectInputStream JavaDoc( is );
141             com.sun.xml.bind.GrammarImpl g = (com.sun.xml.bind.GrammarImpl)ois.readObject();
142             ois.close();
143             
144             g.connect(new com.sun.msv.grammar.Grammar[]{g}); // connect to itself
145

146             return g;
147         } catch( Exception JavaDoc e ) {
148             throw new JAXBException(
149                 Messages.format( Messages.UNABLE_TO_READ_BGM ),
150                 e );
151         }
152     }
153 // META-ENDIF
154

155 // META-IF(V|M)
156
/**
157      * @see com.sun.tools.xjc.runtime.GrammarInfo#castToXMLSerializable(java.lang.Object)
158      */

159     public XMLSerializable castToXMLSerializable(Object JavaDoc o) {
160         if( o instanceof XMLSerializable ) {
161              return (XMLSerializable)o;
162         } else {
163             return null;
164         }
165     }
166 // META-ENDIF
167

168 // META-IF(V)
169
/**
170      * @see com.sun.tools.xjc.runtime.GrammarInfo#castToValidatableObject(java.lang.Object)
171      */

172     public ValidatableObject castToValidatableObject(Object JavaDoc o) {
173         if( o instanceof ValidatableObject ) {
174              return (ValidatableObject)o;
175         } else {
176             return null;
177         }
178     }
179 // META-ENDIF
180
}
181
Popular Tags