View Javadoc
1   /**
2    * Redistribution and use of this software and associated documentation
3    * ("Software"), with or without modification, are permitted provided
4    * that the following conditions are met:
5    *
6    * 1. Redistributions of source code must retain copyright
7    *    statements and notices.  Redistributions must also contain a
8    *    copy of this document.
9    *
10   * 2. Redistributions in binary form must reproduce the
11   *    above copyright notice, this list of conditions and the
12   *    following disclaimer in the documentation and/or other
13   *    materials provided with the distribution.
14   *
15   * 3. The name "Exolab" must not be used to endorse or promote
16   *    products derived from this Software without prior written
17   *    permission of Intalio, Inc.  For written permission,
18   *    please contact info@exolab.org.
19   *
20   * 4. Products derived from this Software may not be called "Exolab"
21   *    nor may "Exolab" appear in their names without prior written
22   *    permission of Intalio, Inc. Exolab is a registered
23   *    trademark of Intalio, Inc.
24   *
25   * 5. Due credit should be given to the Exolab Project
26   *    (http://www.exolab.org/).
27   *
28   * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
29   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
32   * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39   * OF THE POSSIBILITY OF SUCH DAMAGE.
40   *
41   * Copyright 1999 (C) Intalio, Inc. All Rights Reserved.
42   *
43   * $Id$
44   */
45  
46  package org.exolab.castor.xml.schema.reader;
47  
48  //-- imported classes and packages
49  import org.exolab.castor.xml.schema.Resolver;
50  import org.xml.sax.AttributeList;
51  import org.xml.sax.DocumentHandler;
52  import org.xml.sax.Locator;
53  import org.xml.sax.SAXException;
54  import org.xml.sax.SAXParseException;
55  
56  /**
57   * The base class for unmarshallers
58   * @author <a href="mailto:kvisco@intalio.com">Keith Visco</a>
59   * @version $Revision$ $Date: 2006-04-14 04:14:43 -0600 (Fri, 14 Apr 2006) $ 
60  **/
61  public abstract class SaxUnmarshaller 
62      implements DocumentHandler, org.xml.sax.ErrorHandler
63  {
64  
65      
66        //--------------------/
67       //- Member Variables -/
68      //--------------------/
69      
70      /**
71       * The document locator
72      **/
73      protected Locator _locator = null;
74      
75      /**
76       * The resolver to be used for resolving id references
77      **/
78      private Resolver _resolver;
79  
80        //----------------/
81       //- Constructors -/
82      //----------------/
83  
84      public SaxUnmarshaller() {
85          super();
86      } //-- SaxUnmarshaller
87  
88        //-----------/
89       //- Methods -/
90      //-----------/
91  
92      /**
93       * Returns the name of the element that this SaxUnmarshaller
94       * handles
95       * @return the name of the element that this SaxUnmarshaller
96       * handles
97      **/
98      public abstract String elementName();
99      
100     /**
101      * Returns the Object created by this Unmarshaller
102      * @return the Object created by this Unmarshaller
103     **/
104     public abstract Object getObject();
105     
106     /**
107      * Called to signal an end of unmarshalling. This method should
108      * be overridden to perform any necessary clean up by an unmarshaller
109     **/
110     public void finish() throws SAXException {}
111     
112     public Locator getDocumentLocator() {
113         return _locator;
114     } //-- getLocator
115     
116     /**
117      * Returns the resolver used for resolving id references.
118      * @return the resolver used for resolving id references.
119     **/
120     public Resolver getResolver() {
121         return _resolver;
122     } //-- getResolver
123     
124     /**
125      * Sets the Resolver to be used for resolving id references
126      * @param resolver the Resolver to be used for resolving
127      * id references
128     **/
129     public void setResolver(Resolver resolver) {
130         _resolver = resolver;
131     } //-- setResolver
132 
133     /**
134      * Determines if the given sequence of characters consists
135      * of whitespace characters
136      * @param chars an array of characters to check for whitespace
137      * @param start the start index into the character array
138      * @param length the number of characters to check
139      * @return true if the characters specficied consist only
140      * of whitespace characters
141     **/
142     public static boolean isWhiteSpace(char[] chars, int start, int length) {
143         int max = start+length;
144         for (int i = start; i < max; i++) {
145             char ch = chars[i];
146             switch(ch) {
147                 case ' ':
148                 case '\n':
149                 case '\t':
150                 case '\r':
151                     break;
152                 default:
153                     return false;
154             }
155         }
156         return true;
157     } //-- isWhiteSpace
158    
159     /**
160      * This method is called for a general error.
161      * @param err the error message to report
162      * @exception org.xml.sax.SAXException always thrown.
163     **/
164     public void error(String err) 
165         throws org.xml.sax.SAXException
166     {
167             
168         if (_locator != null) {
169             err += "\n   line: " + _locator.getLineNumber();
170         }
171         
172         throw new SAXException(err);
173     } //-- error
174     
175     /**
176      * This method is called when an illegal Attribute is encountered.
177      * @param attName the name of the illegal attribute.
178      * @exception org.xml.sax.SAXException always thrown.
179     **/
180     public void illegalAttribute(String attName) 
181         throws org.xml.sax.SAXException
182     {
183         String err = "Illegal attribute '" + attName + 
184             "' found on element <" + elementName() + ">.";
185             
186         if (_locator != null) {
187             err += "\n   line: " + _locator.getLineNumber();
188         }
189         
190         throw new SAXException(err);
191     } //-- illegalAttribute
192     
193     /**
194      * This method is called when an illegal Element is encountered.
195      * @param name the name of the illegal element
196      * @exception org.xml.sax.SAXException always thrown.
197     **/
198     public void illegalElement(String name) 
199         throws org.xml.sax.SAXException
200     {
201         String err = "Illegal element '" + name + 
202             "' found as child of <" + elementName() + ">.";
203             
204         if (_locator != null) {
205             err += "\n   line: " + _locator.getLineNumber();
206         }
207         
208         throw new SAXException(err);
209     } //-- illegalElement
210    
211    
212     /**
213      * This method is called when an element which may only
214      * be defined once, is redefined.
215      * @param name the name of the element
216      * @exception org.xml.sax.SAXException always thrown.
217     **/
218     public void redefinedElement(String name) 
219         throws org.xml.sax.SAXException
220     {
221         redefinedElement(name, null);
222     } //-- redefinedElement
223 
224     /**
225      * This method is called when an element which may only
226      * be defined once, is redefined.
227      * @param name the name of the element
228      * @exception org.xml.sax.SAXException always thrown.
229     **/
230     public void redefinedElement(String name, String xtraInfo) 
231         throws org.xml.sax.SAXException
232     {
233         String err = "redefintion of element '" + name + 
234             "' within element <" + elementName() + ">.";
235             
236         if (_locator != null) {
237             err += "\n   line: " + _locator.getLineNumber();
238         }
239         
240         if (xtraInfo != null) {
241             err += "\n   " + xtraInfo;
242         }
243         
244         throw new SAXException(err+"\n");
245     } //-- redefinedElement
246     
247     /**
248      * This method is called when an out of order element is encountered
249      * @exception org.xml.sax.SAXException always thrown.
250     **/
251     public void outOfOrder(String name) 
252         throws org.xml.sax.SAXException 
253     {
254         StringBuffer err = new StringBuffer("out of order element <");
255         err.append(name);
256         err.append("> found in <");
257         err.append(elementName());
258         err.append(">.");
259         throw new SAXException(err.toString());
260     }
261     
262     /**
263      * Converts the given String to an int
264      * @param str the String to convert to an int
265      * @return the int derived from the given String
266      * @exception IllegalArgumentException when the given
267      * String does not represent a valid int
268     **/
269     public static int toInt(String str) 
270         throws IllegalArgumentException
271     {
272         try {
273             return Integer.parseInt(str);
274         }
275         catch(NumberFormatException nfe) {
276             String err = str+" is not a valid integer. ";
277             throw new IllegalArgumentException(err);
278         }
279     } //-- toInt
280     
281     
282     //---------------------------------------/
283     //- org.xml.sax.DocumentHandler methods -/
284     //---------------------------------------/
285     
286     public void characters(char[] ch, int start, int length) 
287         throws org.xml.sax.SAXException
288     {
289         //-- do nothing
290         
291     } //-- characters
292     
293     public void endDocument()
294         throws org.xml.sax.SAXException
295     {
296         //-- do nothing
297         
298     } //-- endDocument
299     
300     public void endElement(String name) 
301         throws org.xml.sax.SAXException
302     {
303         //-- do nothing
304         
305     } //-- endElement
306 
307 
308     public void ignorableWhitespace(char[] ch, int start, int length) 
309         throws org.xml.sax.SAXException
310     {
311         //-- do nothing
312         
313     } //-- ignorableWhitespace
314 
315     public void processingInstruction(String target, String data) 
316         throws org.xml.sax.SAXException
317     {
318         //-- do nothing
319 
320     } //-- processingInstruction
321     
322     public void setDocumentLocator(Locator locator) {
323         this._locator = locator;
324     } //-- setDocumentLocator
325     
326     public void startDocument()
327         throws org.xml.sax.SAXException
328     {
329         //-- do nothing
330         
331     } //-- startDocument
332 
333     
334     public void startElement(String name, AttributeList atts) 
335         throws org.xml.sax.SAXException
336     {
337         //-- do nothing
338         
339     } //-- startElement
340     
341 
342     //------------------------------------/
343     //- org.xml.sax.ErrorHandler methods -/
344     //------------------------------------/
345     
346     public void error(SAXParseException exception)
347         throws org.xml.sax.SAXException
348     {
349         throw exception;
350         
351     } //-- error
352     
353     public void fatalError(SAXParseException exception)
354         throws org.xml.sax.SAXException
355     {
356         throw exception;
357         
358     } //-- fatalError
359     
360     
361     public void warning(SAXParseException exception)
362         throws org.xml.sax.SAXException
363     {
364         throw exception;
365         
366     } //-- warning
367     
368 } //-- SaxUnmarshaller
369