📄 saxunmarshallerhandlerimpl.java
字号:
//// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v1.0.4-b18-fcs // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> // Any modifications to this file will be lost upon recompilation of the source schema. // Generated on: 2005.07.17 at 02:32:56 EDT //package jwsgrid.xsd.jobdescription.impl.runtime;import java.util.ArrayList;import java.util.Collections;import java.util.Hashtable;import java.util.Iterator;import java.util.List;import javax.xml.XMLConstants;import javax.xml.bind.JAXBException;import javax.xml.bind.UnmarshalException;import javax.xml.bind.ValidationEvent;import javax.xml.bind.ValidationEventHandler;import org.xml.sax.Attributes;import org.xml.sax.Locator;import org.xml.sax.SAXException;import org.xml.sax.SAXParseException;import com.sun.xml.bind.JAXBAssertionError;import com.sun.xml.bind.unmarshaller.Messages;import com.sun.xml.bind.unmarshaller.Tracer;import com.sun.xml.bind.util.AttributesImpl;/** * Implementation of {@link UnmarshallerHandler}. * * This object converts SAX events into unmarshaller events and * cooridnates the entire unmarshalling process. * * @author * <a href="mailto:kohsuke.kawaguchi@sun.com">Kohsuke KAWAGUCHI</a> */public class SAXUnmarshallerHandlerImpl implements SAXUnmarshallerHandler, UnmarshallingContext{ /** * This flag is set to true at the startDocument event * and false at the endDocument event. * * Until the first document is unmarshalled, we don't * want to return an object. So this variable is initialized * to true. */ private boolean isUnmarshalInProgress = true; public SAXUnmarshallerHandlerImpl( UnmarshallerImpl _parent, GrammarInfo _gi ) { this.parent = _parent; grammarInfo = _gi; startPrefixMapping("",""); // by default, the default ns is bound to "". } private final GrammarInfo grammarInfo; public GrammarInfo getGrammarInfo() { return grammarInfo; } /** * Returns true if we should be collecting characters in the current element. */ private final boolean shouldCollectText() { return collectText[stackTop]; } public void startDocument() throws SAXException { // reset the object result = null; handlerLen=0; patchers=null; patchersLen=0; aborted = false; isUnmarshalInProgress = true; stackTop=0; elementDepth=1; } public void endDocument() throws SAXException { runPatchers(); isUnmarshalInProgress = false; } public void startElement( String uri, String local, String qname, Attributes atts ) throws SAXException { // work gracefully with misconfigured parsers that don't support namespaces if( uri==null ) uri=""; if( local==null || local.length()==0 ) local=qname; if( qname==null || qname.length()==0 ) qname=local; if(result==null) { // this is the root element. // create a root object and start unmarshalling UnmarshallingEventHandler unmarshaller = grammarInfo.createUnmarshaller(uri,local,this); if(unmarshaller==null) { // the registry doesn't know about this element. // // the no.1 cause of this problem is that your application is configuring // an XML parser by your self and you forgot to call // the SAXParserFactory.setNamespaceAware(true). When this happens, you see // the namespace URI is reported as empty whereas you expect something else. throw new SAXParseException( Messages.format( Messages.UNEXPECTED_ROOT_ELEMENT2, uri, local, computeExpectedRootElements() ), getLocator() ); } result = unmarshaller.owner(); pushContentHandler(unmarshaller,0); } processText(true); getCurrentHandler().enterElement(uri,local,qname,atts); } public final void endElement( String uri, String local, String qname ) throws SAXException { // work gracefully with misconfigured parsers that don't support namespaces if( uri==null ) uri=""; if( local==null || local.length()==0 ) local=qname; if( qname==null || qname.length()==0 ) qname=local; processText(false); getCurrentHandler().leaveElement(uri,local,qname); } /** Root object that is being unmarshalled. */ private Object result; public Object getResult() throws UnmarshalException { if(isUnmarshalInProgress) throw new IllegalStateException(); if(!aborted) return result; // there was an error. throw new UnmarshalException((String)null); } ////// handler stack maintainance//// private UnmarshallingEventHandler[] handlers = new UnmarshallingEventHandler[16]; private int[] mementos = new int[16]; private int handlerLen=0; public void pushContentHandler( UnmarshallingEventHandler handler, int memento ) { if(handlerLen==handlers.length) { // expand buffer UnmarshallingEventHandler[] h = new UnmarshallingEventHandler[handlerLen*2]; int[] m = new int[handlerLen*2]; System.arraycopy(handlers,0,h,0,handlerLen); System.arraycopy(mementos,0,m,0,handlerLen); handlers = h; mementos = m; } handlers[handlerLen] = handler; mementos[handlerLen] = memento; handlerLen++; } public void popContentHandler() throws SAXException { handlerLen--; handlers[handlerLen]=null; // this handler is removed getCurrentHandler().leaveChild(mementos[handlerLen]); } public UnmarshallingEventHandler getCurrentHandler() { return handlers[handlerLen-1]; }////// text handling//// private StringBuffer buffer = new StringBuffer(); protected void consumeText( String str, boolean ignorable ) throws SAXException { if(ignorable && str.trim().length()==0) // if we are allowed to ignore text and // the text is ignorable, ignore. return; // otherwise perform a transition by this token. getCurrentHandler().text(str); } private void processText( boolean ignorable ) throws SAXException { if( shouldCollectText() ) consumeText(buffer.toString(),ignorable); // avoid excessive object allocation, but also avoid // keeping a huge array inside StringBuffer. if(buffer.length()<1024) buffer.setLength(0); else buffer = new StringBuffer(); } public final void characters( char[] buf, int start, int len ) { if( shouldCollectText() ) buffer.append(buf,start,len); } public final void ignorableWhitespace( char[] buf, int start, int len ) { characters(buf,start,len); } ////// namespace binding maintainance//// private String[] nsBind = new String[16]; private int nsLen=0; // in the current scope, nsBind[0] - nsBind[idxStack[idxStackTop]-1] // are active. // use {@link #elementDepth} and {@link stackTop} to access. private int[] idxStack = new int[16]; public void startPrefixMapping( String prefix, String uri ) { if(nsBind.length==nsLen) { // expand the buffer String[] n = new String[nsLen*2]; System.arraycopy(nsBind,0,n,0,nsLen); nsBind=n; } nsBind[nsLen++] = prefix; nsBind[nsLen++] = uri; } public void endPrefixMapping( String prefix ) { nsLen-=2; } public String resolveNamespacePrefix( String prefix ) { if(prefix.equals("xml")) return "http://www.w3.org/XML/1998/namespace"; for( int i=idxStack[stackTop]-2; i>=0; i-=2 ) { if(prefix.equals(nsBind[i])) return nsBind[i+1]; } return null; } public String[] getNewlyDeclaredPrefixes() { return getPrefixList( idxStack[stackTop-1] ); } public String[] getAllDeclaredPrefixes() { return getPrefixList( 2 ); // skip the default ""->"" mapping } private String[] getPrefixList( int startIndex ) { int size = (idxStack[stackTop]-startIndex)/2; String[] r = new String[size]; for( int i=0; i<r.length; i++ ) r[i] = nsBind[startIndex+i*2]; return r; } // // NamespaceContext2 implementation // public Iterator getPrefixes(String uri) { // wrap it into unmodifiable list so that the remove method // will throw UnsupportedOperationException. return Collections.unmodifiableList( getAllPrefixesInList(uri)).iterator(); } private List getAllPrefixesInList(String uri) { List a = new ArrayList(); if( uri.equals(XMLConstants.XML_NS_URI) ) { a.add(XMLConstants.XML_NS_PREFIX); return a; } if( uri.equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI) ) { a.add(XMLConstants.XMLNS_ATTRIBUTE); return a; } if( uri==null ) throw new IllegalArgumentException(); for( int i=nsLen-2; i>=0; i-=2 ) if(uri.equals(nsBind[i+1]))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -