View Javadoc
1   /*
2    * Copyright 2007 Joachim Grueneis
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.castor.xml;
17  
18  import java.io.IOException;
19  import java.io.OutputStream;
20  import java.io.Writer;
21  
22  import org.exolab.castor.mapping.Mapping;
23  import org.exolab.castor.mapping.MappingException;
24  import org.exolab.castor.mapping.MappingLoader;
25  import org.exolab.castor.util.RegExpEvaluator;
26  import org.exolab.castor.xml.Introspector;
27  import org.exolab.castor.xml.NodeType;
28  import org.exolab.castor.xml.OutputFormat;
29  import org.exolab.castor.xml.ResolverException;
30  import org.exolab.castor.xml.Serializer;
31  import org.exolab.castor.xml.XMLClassDescriptorResolver;
32  import org.exolab.castor.xml.util.ResolverStrategy;
33  import org.xml.sax.DocumentHandler;
34  import org.xml.sax.Parser;
35  import org.xml.sax.XMLReader;
36  
37  /**
38   * The internal context is meant as center piece providing (and keeping) all
39   * information that is required by Marshaller, Unmarshaller, SourceGenerator,
40   * MappingTool, SchemaReader and SchemaWriter. It is created, filled with
41   * initial data and put into all other parts of Castor by {@link XMLContext}.
42   * It is NOT meant to be directly instantiated by user implementations!
43   * For all other objects it provides access to Castor state information
44   * (e.g. known descriptors) and configuration values.
45   * 
46   * @author <a href="mailto:jgrueneis At gmail DOT com">Joachim Grueneis</a>
47   * @since 1.1.2
48   */
49  public interface InternalContext extends PropertyChangeProvider {
50  
51      /**
52       * Instructs Castor to load class descriptors from the mapping given.
53       * @param mapping Castor XML mapping (file), from which the required class
54       * descriptors will be derived. 
55       * @throws MappingException If the {@link Mapping} cannot be loaded and analyzed successfully.
56       */
57      public abstract void addMapping(final Mapping mapping) throws MappingException;
58  
59      /**
60       * Loads the class descriptor for the class instance specified. The use of this method is useful
61       * when no mapping is used, as happens when the domain classes has been generated
62       * using the XML code generator (in which case instead of a mapping file class
63       * descriptor files will be generated).
64       * 
65       * @param clazz the class for which the associated descriptor should be loaded.
66       * @throws ResolverException in case that resolving the Class fails fatally
67       */
68      public abstract void addClass(final Class clazz) throws ResolverException;
69  
70      /**
71       * Loads the class descriptor for the class instance specified. The use of this method is useful
72       * when no mapping is used, as happens when the domain classes hase been generated
73       * using the XML code generator (in which case instead of a mapping file class
74       * descriptor files will be generated).
75       * 
76       * @param clazzes the classes for which the associated descriptor should be loaded.
77       * @throws ResolverException in case that resolving the Class fails fatally
78       */
79      public abstract void addClasses(final Class[] clazzes) throws ResolverException;
80  
81      /**
82       * Loads class descriptors from the package specified. The use of this method is useful
83       * when no mapping is used, as happens when the domain classes hase been generated
84       * using the XML code generator (in which case instead of a mapping file class
85       * descriptor files will be generated).
86       * <p>
87       * Please note that this functionality will work only if you provide the <tt>.castor.cdr</tt>
88       * file with your generated classes (as generated by the XML code generator).
89       * <p>
90       * @param packageName The package name for the (descriptor) classes
91       * @throws ResolverException 
92       *          If there's a problem loading class descriptors for the given package. 
93       */
94      public abstract void addPackage(final String packageName) throws ResolverException;
95  
96      /**
97       * Loads class descriptors from the packages specified. The use of this method is useful
98       * when no mapping is used, as happens when the domain classes hase been generated
99       * using the XML code generator (in which case instead of a mapping file class
100      * descriptor files will be generated).
101      * <p>
102      * Please note that this functionality will work only if you provide the <tt>.castor.cdr</tt>
103      * files with your generated classes (as generated by the XML code generator).
104      * <p>
105      * @param packageNames The package names for the (descriptor) classes
106      * @throws ResolverException 
107      *          If there's a problem loading class descriptors for the given package. 
108      */
109     public abstract void addPackages(final String[] packageNames) throws ResolverException;
110 
111     /**
112      * Sets an application-specific {@link XMLClassDescriptorResolver} instance.
113      * @param xmlClassDescriptorResolver the resolver to use
114      */
115     public abstract void setResolver(final XMLClassDescriptorResolver xmlClassDescriptorResolver);
116 
117     /**
118      * To set properties for marshalling and unmarshalling behavior. 
119      * @param propertyName name of the property to set
120      * @param value the value to set to
121      */
122     public abstract void setProperty(final String propertyName, final Object value);
123 
124     /**
125      * To get the value of a specific property.
126      * @param propertyName name of the Property
127      * @return the value (Object) of the property
128      */
129     public abstract Object getProperty(final String propertyName);
130 
131     /**
132      * Returns the naming conventions to use for the XML framework.
133      *
134      * @return the naming conventions to use for the XML framework     
135      */
136     public abstract XMLNaming getXMLNaming();
137 
138     /**
139      * Returns the naming conventions to use for the XML framework.
140      * @param classLoader the class loader to be used when instantiating a new naming instance
141      * @return the naming conventions to use for the XML framework
142      * @TODO: Joachim should be synchronized, shouldn't it be??
143      */
144     public abstract XMLNaming getXMLNaming(final ClassLoader classLoader); //-- getXMLNaming
145 
146     /**
147      * The {@link JavaNaming} instance to be used.
148      * @return {@link JavaNaming} instance to be used.
149      */
150     public abstract JavaNaming getJavaNaming();
151 
152     /**
153      * Return an XML document parser implementing the feature list
154      * specified in the configuration file.
155      *
156      * @return A suitable XML parser
157      */
158     public abstract Parser getParser();
159 
160     /**
161      * Returns an XML document parser implementing the requested
162      * set of features. The feature list is a comma separated list
163      * of features that parser may or may not support. No errors are
164      * generated for unsupported features. If the feature list is not
165      * null, it overrides the default feature list specified in the
166      * configuration file, including validation and Namespaces.
167      *
168      * @param features The requested feature list, null for the
169      *   defaults
170      * @return A suitable XML parser
171      */
172     public abstract Parser getParser(final String features);
173 
174     /**
175      * Returns an XML document parser implementing the requested set of
176      * features. The feature list is a comma separated list of features that
177      * parser may or may not support. No errors are generated for unsupported
178      * features. If the feature list is not null, it overrides the default
179      * feature list specified in the configuration file, including validation
180      * and Namespaces.
181      * 
182      * @return A suitable XML parser
183      */
184     public abstract XMLReader getXMLReader(); //-- getXMLReader
185 
186     /**
187      * Returns an XML document parser implementing the requested
188      * set of features. The feature list is a comma separated list
189      * of features that parser may or may not support. No errors are
190      * generated for unsupported features. If the feature list is not
191      * null, it overrides the default feature list specified in the
192      * configuration file, including validation and Namespaces.
193      *
194      * @param features the name of feature to set
195      * @return A suitable XML parser
196      */
197     public abstract XMLReader getXMLReader(final String features); //-- getXMLReader
198 
199     /**
200      * Returns the NodeType to use for Java primitives.
201      * A null value will be returned if no NodeType was specified,
202      * indicating the default NodeType should be used.
203      *
204      * @return the NodeType assigned to Java primitives, or null
205      * if no NodeType was specified.
206      **/
207     public abstract NodeType getPrimitiveNodeType(); //-- getPrimitiveNodeType
208 
209     /**
210      * Returns a new instance of the specified Regular Expression
211      * Evaluator, or null if no validator was specified.
212      *
213      * @return the regular expression evaluator,
214      *
215      **/
216     public abstract RegExpEvaluator getRegExpEvaluator(); // -- getRegExpEvaluator
217 
218     /**
219      * Returns a default serializer for producing an XML document. The caller
220      * can specify an alternative output format, may reuse this serializer
221      * across several streams, and may serialize both DOM and SAX events. If
222      * such control is not required, it is recommended to call one of the other
223      * two methods.
224      * 
225      * @return A suitable serializer
226      */
227     public abstract Serializer getSerializer();
228 
229     /**
230      * Returns the default OutputFormat for use with a Serializer.
231      *
232      * @return the default OutputFormat
233      **/
234     public abstract OutputFormat getOutputFormat(); //-- getOutputFormat
235 
236     /**
237      * Returns a default serializer for producing an XML document to
238      * the designated output stream using the default serialization
239      * format.
240      *
241      * @param output The output stream
242      * @return A suitable serializer
243      * @throws IOException if instantiation of the serializer fails
244      */
245     public abstract DocumentHandler getSerializer(final OutputStream output) throws IOException;
246 
247     /**
248      * Returns a default serializer for producing an XML document to the
249      * designated output stream using the default serialization format.
250      * 
251      * @param output
252      *            The output stream
253      * @return A suitable serializer
254      * @throws IOException if instantiation of serializer fails
255      */
256     public abstract DocumentHandler getSerializer(final Writer output) throws IOException;
257 
258     /**
259      * To get the XMLClassdescriptorResolver instance hold in the context.
260      * @return the XMLClassdescriptorResolver instance hold in the context
261      */
262     public abstract XMLClassDescriptorResolver getXMLClassDescriptorResolver();
263 
264     /**
265      * To get the Introspector assigned to this XMLContext.
266      * @return the Introspector assigned to this XMLContext
267      */
268     public abstract Introspector getIntrospector();
269 
270     /**
271      * To get the XMLClassDescriptor resolver strategy to be used when
272      * resolving classes into class descriptors.
273      * @return the ResolverStrategy to use
274      */
275     public abstract ResolverStrategy getResolverStrategy();
276 
277     /**
278      * To set the XMLClassDescriptor resolver strategy to be used.
279      * @param resolverStrategy the ResolverStrategy to use
280      */
281     public abstract void setResolverStrategy(final ResolverStrategy resolverStrategy);
282 
283     /**
284      * To set the {@link MappingLoader} to be used in this Castor session.
285      * @param mappingLoader the {@link MappingLoader} to use
286      */
287     public abstract void setMappingLoader(final MappingLoader mappingLoader);
288 
289     /**
290      * To get the {@link MappingLoader} specified to be used in this Castor session.
291      * @return the {@link MappingLoader} to use
292      */
293     public abstract MappingLoader getMappingLoader();
294 
295     /**
296      * To set the {@link JavaNaming}?property.
297      * @param javaNaming the {@link JavaNaming} to use
298      */
299     public abstract void setJavaNaming(final JavaNaming javaNaming);
300 
301     /**
302      * To set the {@link XMLNaming} property.
303      * @param xmlNaming the {@link XMLNaming} to use
304      */
305     abstract void setXMLNaming(final XMLNaming xmlNaming);
306     
307     /**
308      * To set any boolean property.
309      * @param propertyName name of the property to set
310      * @param value boolean value to set
311      */
312     public abstract void setProperty(final String propertyName, final boolean value);
313 
314     /**
315      * Providing access to Boolean properties of the configuration.
316      * @param propertyName name of the property
317      * @return null if property is not set or whichever value is set
318      */
319     public abstract Boolean getBooleanProperty(final String propertyName);
320 
321     /**
322      * Providing access to String properties of the configuration.
323      * @param propertyName name of the property
324      * @return null if the property is not set or whichever value is set
325      */
326     public abstract String getStringProperty(final String propertyName);
327 
328     /**
329      * To set the class loader to be used in all further marshalling, unmarshalling
330      * and other actions.
331      * @param classLoader the ClassLoader instance to use
332      */
333     public abstract void setClassLoader(final ClassLoader classLoader);
334 
335     /**
336      * To set the {@link XMLClassDescriptorResolver} to be used. Be aware, that the
337      * XMLClassDescriptorResolver instance holds a descriptor cache!! Maybe change it
338      * to have the descriptor cache as part of the context?
339      * @param xmlClassDescriptorResolver the {@link XMLClassDescriptorResolver} to use
340      */
341     public abstract void setXMLClassDescriptorResolver(
342             final XMLClassDescriptorResolver xmlClassDescriptorResolver);
343 
344     /**
345      * To specify which {@link Introspector}?is to be used.
346      * @param introspector {@link Introspector} to be used
347      */
348     public abstract void setIntrospector(final Introspector introspector);
349 
350     /**
351      * To get the ClassLoader to use for loading resources.
352      * @return the ClassLoader to use
353      */
354     public abstract ClassLoader getClassLoader();
355 
356     /**
357      * Get lenient id validation flag.
358      * @return lenient id validation flag
359      */
360     public abstract boolean getLenientIdValidation();
361 
362     /**
363      * Get lenient sequence order flag.
364      * @return lenient sequence order flag
365      */
366     public abstract boolean getLenientSequenceOrder();
367 
368     /**
369      * Get load package mapping flag.
370      * @return load package mapping flag
371      */
372     public abstract Boolean getLoadPackageMapping();
373 
374     /**
375      * To set the load package mapping flag.
376      * @param loadPackageMapping the load package mapping flag
377      */
378     public abstract void setLoadPackageMapping(final Boolean loadPackageMapping);
379 
380     /**
381      * To get use-introspection flag.
382      * @return use-introspection flag
383      */
384     public abstract Boolean getUseIntrospector();
385 
386     /**
387      * To set use-introspection flag.
388      * @param useIntrospector use-introspection flag
389      */
390     public abstract void setUseIntrospector(final Boolean useIntrospector);
391 
392     /**
393      * To get marshalling-validation flag.
394      * @return marshalling-validation flag
395      */
396     public abstract boolean marshallingValidation();
397 
398     /**
399      * To get strict-element flag.
400      * @return strict-element flag
401      */
402     public abstract boolean strictElements();
403 
404 }