incrementalsaxsource_xerces.java

来自「JAVA 所有包」· Java 代码 · 共 453 行 · 第 1/2 页

JAVA
453
字号
/* * Copyright 1999-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* * $Id: IncrementalSAXSource_Xerces.java,v 1.2.4.1 2005/09/15 08:15:08 suresh_emailid Exp $ */package com.sun.org.apache.xml.internal.dtm.ref;import java.io.IOException;import java.lang.reflect.Constructor;import java.lang.reflect.Method;import com.sun.org.apache.xerces.internal.parsers.SAXParser;import com.sun.org.apache.xml.internal.res.XMLErrorResources;import com.sun.org.apache.xml.internal.res.XMLMessages;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;/** <p>IncrementalSAXSource_Xerces takes advantage of the fact that Xerces1 * incremental mode is already a coroutine of sorts, and just wraps our * IncrementalSAXSource API around it.</p> * * <p>Usage example: See main().</p> * * <p>Status: Passes simple main() unit-test. NEEDS JAVADOC.</p> * */public class IncrementalSAXSource_Xerces  implements IncrementalSAXSource{  //  // Reflection. To allow this to compile with both Xerces1 and Xerces2, which  // require very different methods and objects, we need to avoid static   // references to those APIs. So until Xerces2 is pervasive and we're willing   // to make it a prerequisite, we will rely upon relection.  //  Method fParseSomeSetup=null; // Xerces1 method  Method fParseSome=null; // Xerces1 method  Object fPullParserConfig=null; // Xerces2 pull control object  Method fConfigSetInput=null; // Xerces2 method  Method fConfigParse=null; // Xerces2 method  Method fSetInputSource=null; // Xerces2 pull control method  Constructor fConfigInputSourceCtor=null; // Xerces2 initialization method  Method fConfigSetByteStream=null; // Xerces2 initialization method  Method fConfigSetCharStream=null; // Xerces2 initialization method  Method fConfigSetEncoding=null; // Xerces2 initialization method  Method fReset=null; // Both Xerces1 and Xerces2, but diff. signatures    //  // Data  //  SAXParser fIncrementalParser;  private boolean fParseInProgress=false;  //  // Constructors  //  /** Create a IncrementalSAXSource_Xerces, and create a SAXParser   * to go with it. Xerces2 incremental parsing is only supported if   * this constructor is used, due to limitations in the Xerces2 API (as of   * Beta 3). If you don't like that restriction, tell the Xerces folks that   * there should be a simpler way to request incremental SAX parsing.   * */  public IncrementalSAXSource_Xerces() 		throws NoSuchMethodException	{		try		{			// Xerces-2 incremental parsing support (as of Beta 3)			// ContentHandlers still get set on fIncrementalParser (to get			// conversion from XNI events to SAX events), but			// _control_ for incremental parsing must be exercised via the config.			// 			// At this time there's no way to read the existing config, only 			// to assert a new one... and only when creating a brand-new parser.			//			// Reflection is used to allow us to continue to compile against			// Xerces1. If/when we can abandon the older versions of the parser,			// this will simplify significantly.						// If we can't get the magic constructor, no need to look further.			Class xniConfigClass=ObjectFactory.findProviderClass(                            "com.sun.org.apache.xerces.internal.xni.parser.XMLParserConfiguration",                            ObjectFactory.findClassLoader(), true);			Class[] args1={xniConfigClass};			Constructor ctor=SAXParser.class.getConstructor(args1);						// Build the parser configuration object. StandardParserConfiguration			// happens to implement XMLPullParserConfiguration, which is the API			// we're going to want to use.			Class xniStdConfigClass=ObjectFactory.findProviderClass(                            "com.sun.org.apache.xerces.internal.parsers.StandardParserConfiguration",                            ObjectFactory.findClassLoader(), true);			fPullParserConfig=xniStdConfigClass.newInstance();			Object[] args2={fPullParserConfig};			fIncrementalParser = (SAXParser)ctor.newInstance(args2);						// Preload all the needed the configuration methods... I want to know they're			// all here before we commit to trying to use them, just in case the			// API changes again.			Class fXniInputSourceClass=ObjectFactory.findProviderClass(                            "com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource",                            ObjectFactory.findClassLoader(), true);			Class[] args3={fXniInputSourceClass};			fConfigSetInput=xniStdConfigClass.getMethod("setInputSource",args3);			Class[] args4={String.class,String.class,String.class};			fConfigInputSourceCtor=fXniInputSourceClass.getConstructor(args4);			Class[] args5={java.io.InputStream.class};			fConfigSetByteStream=fXniInputSourceClass.getMethod("setByteStream",args5);			Class[] args6={java.io.Reader.class};			fConfigSetCharStream=fXniInputSourceClass.getMethod("setCharacterStream",args6);			Class[] args7={String.class};			fConfigSetEncoding=fXniInputSourceClass.getMethod("setEncoding",args7);			Class[] argsb={Boolean.TYPE};			fConfigParse=xniStdConfigClass.getMethod("parse",argsb);						Class[] noargs=new Class[0];			fReset=fIncrementalParser.getClass().getMethod("reset",noargs);		}		catch(Exception e)		{	    // Fallback if this fails (implemented in createIncrementalSAXSource) is			// to attempt Xerces-1 incremental setup. Can't do tail-call in			// constructor, so create new, copy Xerces-1 initialization, 			// then throw it away... Ugh.			IncrementalSAXSource_Xerces dummy=new IncrementalSAXSource_Xerces(new SAXParser());			this.fParseSomeSetup=dummy.fParseSomeSetup;			this.fParseSome=dummy.fParseSome;			this.fIncrementalParser=dummy.fIncrementalParser;		}  }  /** Create a IncrementalSAXSource_Xerces wrapped around   * an existing SAXParser. Currently this works only for recent   * releases of Xerces-1.  Xerces-2 incremental is currently possible   * only if we are allowed to create the parser instance, due to   * limitations in the API exposed by Xerces-2 Beta 3; see the   * no-args constructor for that code.   *    * @exception if the SAXParser class doesn't support the Xerces   * incremental parse operations. In that case, caller should   * fall back upon the IncrementalSAXSource_Filter approach.   * */  public IncrementalSAXSource_Xerces(SAXParser parser)     throws NoSuchMethodException    {		// Reflection is used to allow us to compile against		// Xerces2. If/when we can abandon the older versions of the parser,		// this constructor will simply have to fail until/unless the		// Xerces2 incremental support is made available on previously		// constructed SAXParser instances.    fIncrementalParser=parser;		Class me=parser.getClass();    Class[] parms={InputSource.class};    fParseSomeSetup=me.getMethod("parseSomeSetup",parms);    parms=new Class[0];    fParseSome=me.getMethod("parseSome",parms);    // Fallback if this fails (implemented in createIncrementalSAXSource) is    // to use IncrementalSAXSource_Filter rather than Xerces-specific code.  }  //  // Factories  //  static public IncrementalSAXSource createIncrementalSAXSource() 	{		try		{			return new IncrementalSAXSource_Xerces();		}		catch(NoSuchMethodException e)		{			// Xerces version mismatch; neither Xerces1 nor Xerces2 succeeded.			// Fall back on filtering solution.			IncrementalSAXSource_Filter iss=new IncrementalSAXSource_Filter();			iss.setXMLReader(new SAXParser());			return iss;		}  }	  static public IncrementalSAXSource  createIncrementalSAXSource(SAXParser parser) {		try		{			return new IncrementalSAXSource_Xerces(parser);		}		catch(NoSuchMethodException e)		{			// Xerces version mismatch; neither Xerces1 nor Xerces2 succeeded.			// Fall back on filtering solution.			IncrementalSAXSource_Filter iss=new IncrementalSAXSource_Filter();			iss.setXMLReader(parser);			return iss;		}  }  //  // Public methods  //  // Register handler directly with the incremental parser  public void setContentHandler(org.xml.sax.ContentHandler handler)  {    // Typecast required in Xerces2; SAXParser doesn't inheret XMLReader    // %OPT% Cast at asignment?    ((XMLReader)fIncrementalParser).setContentHandler(handler);  }  // Register handler directly with the incremental parser  public void setLexicalHandler(org.xml.sax.ext.LexicalHandler handler)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?