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: AbstractUnmarshallingEventHandlerImpl.java,v 1.9 2003/05/14 18:36:17 lschwenk Exp $ 015 */ 016 package astronomy.data.spectra.impl.runtime; 017 018 import java.util.StringTokenizer; 019 020 import javax.xml.bind.Element; 021 import javax.xml.bind.ParseConversionEvent; 022 import javax.xml.bind.ValidationEvent; 023 import javax.xml.bind.helpers.ParseConversionEventImpl; 024 import javax.xml.bind.helpers.ValidationEventImpl; 025 import javax.xml.bind.helpers.ValidationEventLocatorImpl; 026 027 import org.xml.sax.Attributes; 028 import org.xml.sax.SAXException; 029 030 import com.sun.xml.bind.unmarshaller.Messages; 031 032 /** 033 * Convenient default implementation of 034 * {@link com.sun.xml.bind.unmarshaller.UnmarshallingEventHandler} 035 * to minimize code generation. 036 * 037 * <p> 038 * For historical reasons, sometimes this type is used where 039 * {@link com.sun.xml.bind.unmarshaller.UnmarshallingEventHandler} 040 * should be used. 041 * 042 * Once an exception is in the form of UnmarshalException, we consider 043 * it to be already reported to the client app. 044 */ 045 public abstract class AbstractUnmarshallingEventHandlerImpl implements UnmarshallingEventHandler 046 { 047 public AbstractUnmarshallingEventHandlerImpl(UnmarshallingContext _ctxt, 048 String _stateTextTypes ) { 049 050 this.context = _ctxt; 051 this.stateTextTypes = _stateTextTypes; 052 } 053 public final UnmarshallingContext context; 054 055 /** 056 * Text type of states encoded into a string. 057 * 'L' means a list state. 058 */ 059 private final String stateTextTypes; 060 061 // 062 // 063 // methods that will be provided by the generated code. 064 // 065 // 066 // internal events 067 public void enterElement(String uri, String local, String qname, Attributes atts) throws SAXException { 068 unexpectedEnterElement(uri,local,qname,atts); 069 } 070 public void leaveElement(String uri, String local, String qname) throws SAXException { 071 unexpectedLeaveElement(uri,local,qname); 072 } 073 public final void text(String text) throws SAXException { 074 if(isListState()) { 075 // in list state, we don't need to care about whitespaces. 076 // if the text is all whitespace, this won't generate a text event, 077 // so it would be just fine. 078 079 StringTokenizer tokens = new StringTokenizer(text); 080 if( tokens.countTokens()==1 ) { 081 handleText(text); 082 } else { 083 while(tokens.hasMoreTokens()) 084 // the handler can be switched during the text processing, 085 // so the current handler has to be obtained inside the loop 086 context.getCurrentHandler().text(tokens.nextToken()); 087 } 088 } else { 089 // otherwise process this token 090 handleText(text); 091 } 092 } 093 protected void handleText(String s) throws SAXException { 094 unexpectedText(s); 095 } 096 public void enterAttribute(String uri, String local, String qname) throws SAXException { 097 unexpectedEnterAttribute(uri,local,qname); 098 } 099 public void leaveAttribute(String uri, String local, String qname) throws SAXException { 100 unexpectedLeaveAttribute(uri,local,qname); 101 } 102 public void leaveChild(int nextState) throws SAXException { 103 this.state = nextState; 104 } 105 106 107 /** 108 * Checks if the current state is marked as a list state. 109 */ 110 protected final boolean isListState() { 111 return stateTextTypes.charAt(state)=='L'; 112 } 113 114 115 /** Current state of this automaton. */ 116 public int state; 117 118 119 120 121 // 122 // 123 // utility methods 124 // 125 // 126 /** Called when a RuntimeException is thrown during unmarshalling a text. */ 127 protected void handleUnexpectedTextException( String text, RuntimeException e ) throws SAXException { 128 // report this as an error 129 reportError( Messages.format(Messages.UNEXPECTED_TEXT,text), e, true ); 130 } 131 132 /** 133 * Last resort when something goes terribly wrong within the unmarshaller. 134 */ 135 protected void handleGenericException( Exception e ) throws SAXException { 136 reportError( e.getMessage(), e, false ); 137 } 138 139 140 protected final void dump() { 141 System.err.println("state is :"+state); 142 } 143 private void reportError( String msg, boolean canRecover ) throws SAXException { 144 reportError( msg, null, canRecover ); 145 } 146 private void reportError( String msg, Exception nested, boolean canRecover ) throws SAXException { 147 context.handleEvent( new ValidationEventImpl( 148 canRecover? ValidationEvent.ERROR : ValidationEvent.FATAL_ERROR, 149 msg, 150 new ValidationEventLocatorImpl(context.getLocator()), 151 nested ), canRecover ); 152 } 153 protected final void unexpectedEnterElement( String uri, String local, String qname, Attributes atts ) throws SAXException { 154 // notify the error 155 reportError( Messages.format(Messages.UNEXPECTED_ENTER_ELEMENT, uri, local ), true ); 156 // then recover by ignoring the whole element. 157 context.pushContentHandler(new Discarder(context),state); 158 context.getCurrentHandler().enterElement(uri,local,qname,atts); 159 } 160 protected final void unexpectedLeaveElement( String uri, String local, String qname ) throws SAXException { 161 reportError( Messages.format(Messages.UNEXPECTED_LEAVE_ELEMENT, uri, local ), false ); 162 } 163 protected final void unexpectedEnterAttribute( String uri, String local, String qname ) throws SAXException { 164 reportError( Messages.format(Messages.UNEXPECTED_ENTER_ATTRIBUTE, uri, local ), false ); 165 } 166 protected final void unexpectedLeaveAttribute( String uri, String local, String qname ) throws SAXException { 167 reportError( Messages.format(Messages.UNEXPECTED_LEAVE_ATTRIBUTE, uri, local ), false ); 168 } 169 protected final void unexpectedText( String str ) throws SAXException { 170 // make str printable 171 str = str.replace('\r',' ').replace('\n',' ').replace('\t',' ').trim(); 172 173 reportError( Messages.format(Messages.UNEXPECTED_TEXT, str ), true ); 174 } 175 protected final void unexpectedLeaveChild() throws SAXException { 176 // I believe this is really a bug of the compiler, 177 // since when an object spawns a child object, it must be "prepared" 178 // to receive this event. 179 dump(); 180 throw new InternalError( 181 Messages.format( Messages.UNEXPECTED_LEAVE_CHILD ) ); 182 } 183 /** 184 * This method is called by the generated derived class 185 * when a datatype parse method throws an exception. 186 */ 187 protected void handleParseConversionException(Exception e) throws SAXException { 188 if( e instanceof RuntimeException ) 189 throw (RuntimeException)e; // don't catch the runtime exception. just let it go. 190 191 // wrap it into a ParseConversionEvent and report it 192 ParseConversionEvent pce = new ParseConversionEventImpl( 193 ValidationEvent.ERROR, e.getMessage(), 194 new ValidationEventLocatorImpl(context.getLocator()), e ); 195 context.handleEvent(pce,true); 196 } 197 198 199 // 200 // 201 // spawn a new child object 202 // 203 // 204 private UnmarshallingEventHandler spawnChild( Class clazz, int memento ) { 205 206 UnmarshallableObject child; 207 try { 208 child = (UnmarshallableObject)clazz.newInstance(); 209 } catch (InstantiationException e) { 210 throw new InstantiationError(e.getMessage()); 211 } catch (IllegalAccessException e) { 212 throw new IllegalAccessError(e.getMessage()); 213 } 214 215 UnmarshallingEventHandler handler = child.createUnmarshaller(context); 216 context.pushContentHandler(handler,memento); 217 return handler; 218 } 219 220 protected final Object spawnChildFromEnterElement(Class clazz, int memento, String uri, String local, String qname, Attributes atts) 221 throws SAXException { 222 UnmarshallingEventHandler ueh = spawnChild(clazz,memento); 223 ueh.enterElement(uri,local,qname,atts); 224 return ueh.owner(); 225 } 226 227 protected final Object spawnChildFromEnterAttribute(Class clazz, int memento, String uri, String local, String qname) 228 throws SAXException { 229 UnmarshallingEventHandler ueh = spawnChild(clazz,memento); 230 ueh.enterAttribute(uri,local,qname); 231 return ueh.owner(); 232 } 233 234 protected final Object spawnChildFromText(Class clazz, int memento, String value) 235 throws SAXException { 236 UnmarshallingEventHandler ueh = spawnChild(clazz,memento); 237 ueh.text(value); 238 return ueh.owner(); 239 } 240 241 // these methods can be used if a child object can be nullable 242 protected final Object spawnChildFromLeaveElement(Class clazz, int memento, String uri, String local, String qname) 243 throws SAXException { 244 UnmarshallingEventHandler ueh = spawnChild(clazz,memento); 245 ueh.leaveElement(uri,local,qname); 246 return ueh.owner(); 247 } 248 249 protected final Object spawnChildFromLeaveAttribute(Class clazz, int memento, String uri, String local, String qname) 250 throws SAXException { 251 UnmarshallingEventHandler ueh = spawnChild(clazz,memento); 252 ueh.leaveAttribute(uri,local,qname); 253 return ueh.owner(); 254 } 255 256 protected final Element spawnWildcard( int memento, String uri, String local, String qname, Attributes atts ) 257 throws SAXException { 258 UnmarshallingEventHandler ueh = context.getGrammarInfo().createUnmarshaller(uri,local,context); 259 260 if(ueh!=null) { 261 context.pushContentHandler(ueh,memento); 262 ueh.enterElement(uri,local,qname,atts); 263 return (Element)ueh.owner(); 264 } else { 265 // if no class is available to unmarshal this element, discard 266 // the sub-tree by feeding events to discarder. 267 context.pushContentHandler( new Discarder(context), memento ); 268 context.getCurrentHandler().enterElement(uri,local,qname,atts); 269 return null; // return null so that the discarder will be ignored 270 } 271 } 272 // 273 // 274 // spawn a new child handler. 275 // used for super class and RELAXNG interleave handling. 276 // 277 278 279 protected final void spawnHandlerFromEnterElement( 280 UnmarshallingEventHandler unm, int memento, String uri, String local, String qname, Attributes atts ) 281 throws SAXException { 282 283 context.pushContentHandler(unm,memento); 284 unm.enterElement(uri,local,qname,atts); 285 } 286 287 protected final void spawnHandlerFromEnterAttribute( 288 UnmarshallingEventHandler unm, int memento, String uri, String local, String qname) 289 throws SAXException { 290 291 context.pushContentHandler(unm,memento); 292 unm.enterAttribute(uri,local,qname); 293 } 294 295 protected final void spawnHandlerFromFromText( 296 UnmarshallingEventHandler unm, int memento, String value) 297 throws SAXException { 298 299 context.pushContentHandler(unm,memento); 300 unm.text(value); 301 } 302 303 protected final void spawnHandlerFromLeaveElement( 304 UnmarshallingEventHandler unm, int memento, String uri, String local, String qname) 305 throws SAXException { 306 307 context.pushContentHandler(unm,memento); 308 unm.leaveElement(uri,local,qname); 309 } 310 311 protected final void spawnHandlerFromLeaveAttribute( 312 UnmarshallingEventHandler unm, int memento, String uri, String local, String qname) 313 throws SAXException { 314 315 context.pushContentHandler(unm,memento); 316 unm.leaveAttribute(uri,local,qname); 317 } 318 319 protected final void spawnHandlerFromText( 320 UnmarshallingEventHandler unm, int memento, String text ) 321 throws SAXException { 322 323 context.pushContentHandler(unm,memento); 324 unm.text(text); 325 } 326 327 328 // 329 // 330 // revert to parent 331 // 332 // 333 protected final void revertToParentFromEnterElement(String uri,String local, String qname,Attributes atts) 334 throws SAXException { 335 context.popContentHandler(); 336 context.getCurrentHandler().enterElement(uri,local,qname,atts); 337 } 338 protected final void revertToParentFromLeaveElement(String uri,String local, String qname) 339 throws SAXException { 340 context.popContentHandler(); 341 context.getCurrentHandler().leaveElement(uri,local,qname); 342 } 343 protected final void revertToParentFromEnterAttribute(String uri,String local, String qname) 344 throws SAXException { 345 context.popContentHandler(); 346 context.getCurrentHandler().enterAttribute(uri,local,qname); 347 } 348 protected final void revertToParentFromLeaveAttribute(String uri,String local, String qname) 349 throws SAXException { 350 context.popContentHandler(); 351 context.getCurrentHandler().leaveAttribute(uri,local,qname); 352 } 353 protected final void revertToParentFromText(String value) 354 throws SAXException { 355 context.popContentHandler(); 356 context.getCurrentHandler().text(value); 357 } 358 }