blob: 081ea6b9a26b5d9b0d2e4fab1cec8a34d637977e [file] [log] [blame]
/*
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package com.sun.org.apache.xerces.internal.jaxp;
import com.sun.org.apache.xerces.internal.impl.Constants;
import com.sun.org.apache.xerces.internal.impl.XMLErrorReporter;
import com.sun.org.apache.xerces.internal.impl.validation.ValidationManager;
import com.sun.org.apache.xerces.internal.impl.xs.XSMessageFormatter;
import com.sun.org.apache.xerces.internal.jaxp.validation.XSGrammarPoolContainer;
import com.sun.org.apache.xerces.internal.util.FeatureState;
import com.sun.org.apache.xerces.internal.util.PropertyState;
import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarPool;
import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager;
import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException;
/**
* <p>Parser configuration for Xerces' XMLSchemaValidator.</p>
*
*/
final class SchemaValidatorConfiguration implements XMLComponentManager {
// feature identifiers
/** Feature identifier: schema validation. */
private static final String SCHEMA_VALIDATION =
Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_VALIDATION_FEATURE;
/** Feature identifier: validation. */
private static final String VALIDATION =
Constants.SAX_FEATURE_PREFIX + Constants.VALIDATION_FEATURE;
/** Feature identifier: use grammar pool only. */
private static final String USE_GRAMMAR_POOL_ONLY =
Constants.XERCES_FEATURE_PREFIX + Constants.USE_GRAMMAR_POOL_ONLY_FEATURE;
/** Feature identifier: parser settings. */
private static final String PARSER_SETTINGS =
Constants.XERCES_FEATURE_PREFIX + Constants.PARSER_SETTINGS;
// property identifiers
/** Property identifier: error reporter. */
private static final String ERROR_REPORTER =
Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY;
/** Property identifier: validation manager. */
private static final String VALIDATION_MANAGER =
Constants.XERCES_PROPERTY_PREFIX + Constants.VALIDATION_MANAGER_PROPERTY;
/** Property identifier: grammar pool. */
private static final String XMLGRAMMAR_POOL =
Constants.XERCES_PROPERTY_PREFIX + Constants.XMLGRAMMAR_POOL_PROPERTY;
//
// Data
//
/** Parent component manager. **/
private final XMLComponentManager fParentComponentManager;
/** The Schema's grammar pool. **/
private final XMLGrammarPool fGrammarPool;
/**
* Tracks whether the validator should use components from
* the grammar pool to the exclusion of all others.
*/
private final boolean fUseGrammarPoolOnly;
/** Validation manager. */
private final ValidationManager fValidationManager;
public SchemaValidatorConfiguration(XMLComponentManager parentManager,
XSGrammarPoolContainer grammarContainer, ValidationManager validationManager) {
fParentComponentManager = parentManager;
fGrammarPool = grammarContainer.getGrammarPool();
fUseGrammarPoolOnly = grammarContainer.isFullyComposed();
fValidationManager = validationManager;
// add schema message formatter to error reporter
try {
XMLErrorReporter errorReporter = (XMLErrorReporter) fParentComponentManager.getProperty(ERROR_REPORTER);
if (errorReporter != null) {
errorReporter.putMessageFormatter(XSMessageFormatter.SCHEMA_DOMAIN, new XSMessageFormatter());
}
}
// Ignore exception.
catch (XMLConfigurationException exc) {}
}
/**
* Returns the state of a feature.
*
* @param featureId The feature identifier.
* @return true if the feature is supported
*
* @throws XMLConfigurationException Thrown for configuration error.
* In general, components should
* only throw this exception if
* it is <strong>really</strong>
* a critical error.
*/
public boolean getFeature(String featureId)
throws XMLConfigurationException {
FeatureState state = getFeatureState(featureId);
if (state.isExceptional()) {
throw new XMLConfigurationException(state.status, featureId);
}
return state.state;
}
public FeatureState getFeatureState(String featureId) {
if (PARSER_SETTINGS.equals(featureId)) {
return fParentComponentManager.getFeatureState(featureId);
}
else if (VALIDATION.equals(featureId) || SCHEMA_VALIDATION.equals(featureId)) {
return FeatureState.is(true);
}
else if (USE_GRAMMAR_POOL_ONLY.equals(featureId)) {
return FeatureState.is(fUseGrammarPoolOnly);
}
return fParentComponentManager.getFeatureState(featureId);
}
public PropertyState getPropertyState(String propertyId) {
if (XMLGRAMMAR_POOL.equals(propertyId)) {
return PropertyState.is(fGrammarPool);
}
else if (VALIDATION_MANAGER.equals(propertyId)) {
return PropertyState.is(fValidationManager);
}
return fParentComponentManager.getPropertyState(propertyId);
}
/**
* Returns the value of a property.
*
* @param propertyId The property identifier.
* @return the value of the property
*
* @throws XMLConfigurationException Thrown for configuration error.
* In general, components should
* only throw this exception if
* it is <strong>really</strong>
* a critical error.
*/
public Object getProperty(String propertyId)
throws XMLConfigurationException {
PropertyState state = getPropertyState(propertyId);
if (state.isExceptional()) {
throw new XMLConfigurationException(state.status, propertyId);
}
return state.state;
}
public boolean getFeature(String featureId, boolean defaultValue) {
FeatureState state = getFeatureState(featureId);
if (state.isExceptional()) {
return defaultValue;
}
return state.state;
}
public Object getProperty(String propertyId, Object defaultValue) {
PropertyState state = getPropertyState(propertyId);
if (state.isExceptional()) {
return defaultValue;
}
return state.state;
}
}