001 // 002 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v1.0.1-05/30/2003 05:06 AM(java_re)-fcs 003 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 004 // Any modifications to this file will be lost upon recompilation of the source schema. 005 // Generated on: 2004.10.11 at 12:13:34 EDT 006 // 007 008 /* 009 * Copyright 2003 Sun Microsystems, Inc. All rights reserved. 010 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 011 */ 012 013 /* 014 * @(#)$Id: UnmarshallerImpl.java,v 1.7 2003/05/19 17:56:48 kk122374 Exp $ 015 */ 016 package astronomy.data.spectra.impl.runtime; 017 018 import java.io.IOException; 019 020 import javax.xml.bind.DatatypeConverter; 021 import javax.xml.bind.JAXBException; 022 import javax.xml.bind.UnmarshallerHandler; 023 import javax.xml.bind.helpers.AbstractUnmarshallerImpl; 024 025 import org.w3c.dom.Document; 026 import org.w3c.dom.Element; 027 import org.w3c.dom.Node; 028 import org.xml.sax.InputSource; 029 import org.xml.sax.SAXException; 030 import org.xml.sax.XMLReader; 031 import org.xml.sax.helpers.DefaultHandler; 032 033 import com.sun.xml.bind.DatatypeConverterImpl; 034 import com.sun.xml.bind.unmarshaller.DOMScanner; 035 import com.sun.xml.bind.validator.DOMLocator; 036 import com.sun.xml.bind.validator.Locator; 037 import com.sun.xml.bind.validator.SAXLocator; 038 039 /** 040 * Default Unmarshall implementation. 041 * 042 * <p> 043 * This class can be extended by the generated code to provide 044 * type-safe unmarshall methods. 045 * 046 * @author 047 * <a href="mailto:kohsuke.kawaguchi@sun.com>Kohsuke KAWAGUCHI</a> 048 */ 049 public class UnmarshallerImpl extends AbstractUnmarshallerImpl 050 { 051 /** parent JAXBContext object that created this unmarshaller */ 052 private DefaultJAXBContextImpl context = null; 053 054 private final GrammarInfo grammarInfo; 055 056 public UnmarshallerImpl( DefaultJAXBContextImpl context, GrammarInfo gi ) { 057 058 this.context = context; 059 this.grammarInfo = gi; 060 061 // initialize datatype converter with ours 062 DatatypeConverter.setDatatypeConverter(DatatypeConverterImpl.theInstance); 063 } 064 065 public void setValidating(boolean validating) throws JAXBException { 066 super.setValidating(validating); 067 if(validating==true) 068 // make sure that we can actually load the grammar. 069 // this could be a lengthy operation if your schema is big. 070 context.getGrammar(); 071 } 072 073 public UnmarshallerHandler getUnmarshallerHandler() { 074 // TODO: use only one instance. 075 076 // we don't know the Locator to be used, 077 // but SAXLocator would always be a good default, 078 // as the source of SAX2 events can always set org.xml.sax.Locator. 079 return createUnmarshallerHandler(new SAXLocator()); 080 } 081 082 083 084 /** 085 * Creates and configures a new unmarshalling pipe line. 086 * Depending on the setting, we put a validator as a filter. 087 * 088 * @return 089 * A component that implements both UnmarshallerHandler 090 * and ValidationEventHandler. All the parsing errors 091 * should be reported to this error handler for the unmarshalling 092 * process to work correctly. 093 * 094 * @param locator 095 * The object that is responsible to obtain the source 096 * location information for {@link ValidationEvent}s. 097 */ 098 public SAXUnmarshallerHandler createUnmarshallerHandler( Locator locator ) { 099 100 SAXUnmarshallerHandler unmarshaller = 101 new SAXUnmarshallerHandlerImpl( this, grammarInfo ); 102 103 try { 104 105 // use the simple check to determine if validation is on 106 if( isValidating() ) { 107 // if the validation is turned on, insert another 108 // component into the event pipe line. 109 unmarshaller = ValidatingUnmarshaller.create( 110 context.getGrammar(), unmarshaller, locator ); 111 } 112 } catch( JAXBException e ) { 113 // impossible since we've already made sure that a grammar is accessible. 114 e.printStackTrace(); 115 } 116 117 return unmarshaller; 118 } 119 120 121 protected Object unmarshal( XMLReader reader, InputSource source ) throws JAXBException { 122 123 SAXLocator locator = new SAXLocator(); 124 SAXUnmarshallerHandler handler = createUnmarshallerHandler(locator); 125 126 reader.setContentHandler(handler); 127 // saxErrorHandler will be set by the createUnmarshallerHandler method. 128 // configure XMLReader so that the error will be sent to it. 129 // This is essential for the UnmarshallerHandler to be able to abort 130 // unmarshalling when an error is found. 131 // 132 // Note that when this XMLReader is provided by the client code, 133 // it might be already configured to call a client error handler. 134 // This will clobber such handler, if any. 135 // 136 // Ryan noted that we might want to report errors to such a client 137 // error handler as well. 138 reader.setErrorHandler( 139 new ErrorHandlerAdaptor(handler,locator)); 140 141 try { 142 reader.parse(source); 143 } catch( IOException e ) { 144 throw new JAXBException(e); 145 } catch( SAXException e ) { 146 throw createUnmarshalException(e); 147 } 148 149 Object result = handler.getResult(); 150 151 // avoid keeping unnecessary references too long to let the GC 152 // reclaim more memory. 153 // setting null upsets some parsers, so use a dummy instance instead. 154 reader.setContentHandler(dummyHandler); 155 reader.setErrorHandler(dummyHandler); 156 157 return result; 158 } 159 160 public final Object unmarshal( Node node ) throws JAXBException { 161 try { 162 DOMScanner scanner = new DOMScanner(); 163 UnmarshallerHandler handler = createUnmarshallerHandler(new DOMLocator(scanner)); 164 165 if(node instanceof Element) 166 scanner.parse((Element)node,handler); 167 else 168 if(node instanceof Document) 169 scanner.parse(((Document)node).getDocumentElement(),handler); 170 else 171 // no other type of input is supported 172 throw new IllegalArgumentException(); 173 174 return handler.getResult(); 175 } catch( SAXException e ) { 176 throw createUnmarshalException(e); 177 } 178 } 179 180 181 private static void _assert( boolean b, String msg ) { 182 if( !b ) { 183 throw new InternalError( msg ); 184 } 185 } 186 187 private static final DefaultHandler dummyHandler = new DefaultHandler(); 188 }