- package com.sun.org.apache.xerces.internal.parsers;
-
- import javax.xml.validation.Schema;
- import javax.xml.validation.ValidatorHandler;
-
- import com.sun.org.apache.xerces.internal.jaxp.JAXPValidatorComponent;
- import com.sun.org.apache.xerces.internal.jaxp.validation.InsulatedValidatorComponent;
- import com.sun.org.apache.xerces.internal.jaxp.validation.XercesSchema;
- import com.sun.org.apache.xerces.internal.xni.parser.XMLComponent;
- import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentFilter;
- /**
- * {@link com.sun.org.apache.xerces.internal.xni.parser.XMLParseException} that
- * includes a JAXP {@link ValidatorHandler} in the middle.
- *
- * @author
- * Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com)
- * Venu Gopal (k.venugopal@sun.com)
- */
- public class JAXPConfiguration extends XIncludeParserConfiguration {
-
- /** can be null. */
- private final Schema fSchema;
-
- /**
- *
- * @param grammar
- * when non-null, the parser will include validation /
- * infoset augmentation by this {@link Schema}.
- */
- public JAXPConfiguration(Schema schema){
- this.fSchema = schema;
- }
-
- protected void configurePipeline() {
- super.configurePipeline();
-
- if (fSchema != null) {
- if( isXNICapabaleSchema(fSchema) ) {
- // if the validator is also from this Xerces,
- // we will use the XNI-based validator for
- // better performance
- InsulatedValidatorComponent v = ((XercesSchema)fSchema).newXNIValidator();
- addComponent(v);
-
- fLastComponent.setDocumentHandler(v.getValidator());
- v.getValidator().setDocumentSource(fLastComponent);
- fLastComponent = v.getValidator();
- v.getValidator().setDocumentHandler(fDocumentHandler);
- } else {
- // otherwise wrap that into JAXPValidatorComponent.
- XMLDocumentFilter validator = null;
- ValidatorHandler validatorHandler = fSchema.newValidatorHandler();
-
- validator = new JAXPValidatorComponent(validatorHandler);
- addComponent((XMLComponent)validator);
-
- fLastComponent.setDocumentHandler(validator);
- validator.setDocumentSource(fLastComponent);
- fLastComponent = validator;
- validator.setDocumentHandler(fDocumentHandler);
- }
- }
- }
-
- /**
- * Checks if the given {@link Schema} speaks XNI.
- */
- private static boolean isXNICapabaleSchema( Schema s ) {
- if(!(s instanceof XercesSchema )) return false;
-
- try {
- String v = System.getProperty(JAXPConfiguration.class.getName()+".noSchemaOptimization");
- if(v==null)
- // there might be a bug in the optimization we do.
- // this property provides an escape hatch for such a situation
- // by forcing non-optimized way.
- return false;
- } catch( Throwable t ) {
- ;
- }
-
- // otherwise if schema derives from XercesSchema,
- // we set up better optimized pipeline.
- return true;
- }
-
- public boolean getFeatureDefaultValue(String featureId){
-
- // reset every component
- int count = fComponents.size();
- for (int i = 0; i < count; i++) {
- XMLComponent c = (XMLComponent) fComponents.get(i);
- Boolean bo = c.getFeatureDefault(featureId);
- if(bo != null){
- return bo.booleanValue();
- }
- //null if component doesn't recognize this feature.
- //continue it might be present in some other components.
- //it might make sense to store default values of feature for
- //the current configuration that would make the lookup faster.
-
- }
- //if it wasn't found in all the components return false;
- return false;
- }
-
- }
-