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;
}
}
|