blob: 4e186c14e9fe2ae2002efbc08ce463c6cb3df1c5 [file] [log] [blame]
/*
* Copyright (C) 2007 The Android Open Source Project
*
* 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.
*/
package javax.xml.parsers;
import org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl;
/**
* Provides a factory for {@link DocumentBuilder} instances. The class first
* needs to be instantiated using the {@link #newInstance()} method. The
* instance can be configured as desired. A call to
* {@link #newDocumentBuilder()} then provides a {@code DocumentBuilder}
* instance matching this configuration (if possible).
*
* @since Android 1.0
*/
public abstract class DocumentBuilderFactory extends Object {
private boolean coalesce;
private boolean expandEntityReferences;
private boolean ignoreComments;
private boolean ignoreElementContentWhitespace;
private boolean namespaceAware;
private boolean validate;
/**
* Do-nothing constructor. To be overridden by concrete document builders.
*
* @since Android 1.0
*/
protected DocumentBuilderFactory() {
// Does nothing.
}
/**
* Queries an attribute from the underlying implementation.
*
* @param name the name of the attribute.
* @return the value of the attribute.
*
* @throws IllegalArgumentException if the argument is unknown to the
* underlying implementation.
*
* @since Android 1.0
*/
public abstract Object getAttribute(String name)
throws IllegalArgumentException;
/**
* Queries a feature from the underlying implementation.
*
* @param name The name of the feature. The default Android implementation
* of {@link DocumentBuilder} supports only the following three
* features:
*
* <dl>
* <dt>{@code http://xml.org/sax/features/namespaces}</dt>
* <dd>Queries the state of namespace-awareness.</dd>
*
* <dt>
* {@code http://xml.org/sax/features/namespace-prefixes}
* </dt>
* <dd>Queries the state of namespace prefix processing</dd>
*
* <dt>
* {@code http://xml.org/sax/features/validation}
* </dt>
* <dd>Queries the state of validation.</dd>
* </dl>
*
* Note that despite the ability to query the validation
* feature, there is currently no validating parser available.
* Also note that currently either namespaces or
* namespace prefixes can be enabled, but not both at the same
* time.
*
* @return the status of the feature.
*
* @throws IllegalArgumentException if the feature is unknown to
* the underlying implementation.
* @throws ParserConfigurationException if the feature is
* known, but not supported.
*
* @since Android 1.0
*/
public abstract boolean getFeature(String name)
throws ParserConfigurationException;
// TODO No XSchema support in Android 1.0. Maybe later.
// /**
// * Queries the desired XML Schema object.
// *
// * @return The XML Schema object, if it has been set by a call to setSchema,
// * or null otherwise.
// */
// public javax.xml.validation.Schema getSchema() {
// return schema;
// }
/**
* Queries whether the factory is configured to deliver parsers that convert
* CDATA nodes to text nodes and melt them with neighboring nodes. This is
* called "coalescing".
*
* @return {@code true} if coalescing is desired, {@code false} otherwise.
*
* @since Android 1.0
*/
public boolean isCoalescing() {
return coalesce;
}
/**
* Queries whether the factory is configured to deliver parsers that expand
* entity references.
*
* @return {@code true} if entity expansion is desired, {@code false}
* otherwise.
*
* @since Android 1.0
*/
public boolean isExpandEntityReferences() {
return expandEntityReferences;
}
/**
* Queries whether the factory is configured to deliver parsers that ignore
* comments.
*
* @return {@code true} if comment ignorance is desired, {@code false}
* otherwise.
*
* @since Android 1.0
*/
public boolean isIgnoringComments() {
return ignoreComments;
}
/**
* Queries whether the factory is configured to deliver parsers that ignore
* whitespace in elements.
*
* @return {@code true} if whitespace ignorance is desired, {@code false}
* otherwise.
*
* @since Android 1.0
*/
public boolean isIgnoringElementContentWhitespace() {
return ignoreElementContentWhitespace;
}
/**
* Queries whether the factory is configured to deliver parsers that are
* namespace-aware.
*
* @return {@code true} if namespace-awareness is desired, {@code false}
* otherwise.
*
* @since Android 1.0
*/
public boolean isNamespaceAware() {
return namespaceAware;
}
/**
* Queries whether the factory is configured to deliver parsers that are
* validating.
*
* @return {@code true} if validating is desired, {@code false} otherwise.
*
* @since Android 1.0
*/
public boolean isValidating() {
return validate;
}
/**
* Queries whether the factory is configured to deliver parsers that are
* XInclude-aware.
*
* @return {@code true} if XInclude-awareness is desired, {@code false}
* otherwise.
*
* @since Android 1.0
*/
public boolean isXIncludeAware() {
throw new UnsupportedOperationException();
}
/**
* Creates a new {@link DocumentBuilder} that matches the current
* configuration of the factory.
*
* @return the DocumentBuilder.
* @throws ParserConfigurationException if no matching
* {@code DocumentBuilder} could be found.
*
* @since Android 1.0
*/
public abstract DocumentBuilder newDocumentBuilder()
throws ParserConfigurationException;
/**
* Creates a new DocumentBuilderFactory that can be configured and then be
* used for creating DocumentBuilder objects. The method first checks the
* value of the {@code DocumentBuilderFactory} property.
* If this is non-{@code null}, it is assumed to be the name of a class
* that serves as the factory. The class is instantiated, and the instance
* is returned. If the property value is {@code null}, the system's default
* factory implementation is returned.
*
* @return the DocumentBuilderFactory.
* @throws FactoryConfigurationError if no {@code DocumentBuilderFactory}
* can be created.
*
* @since Android 1.0
*/
public static DocumentBuilderFactory newInstance()
throws FactoryConfigurationError {
// TODO Properties file and META-INF case missing here. See spec.
String factory = System
.getProperty("javax.xml.parsers.DocumentBuilderFactory");
if (factory != null) {
try {
return (DocumentBuilderFactory) Class.forName(factory)
.newInstance();
} catch (Exception ex) {
// Ignore.
}
}
try {
return new DocumentBuilderFactoryImpl();
} catch (Exception ex) {
// Ignore.
}
throw new FactoryConfigurationError(
"Cannot create DocumentBuilderFactory");
}
/**
* Sets an attribute in the underlying implementation.
*
* @param name the name of the attribute.
* @param value the value of the attribute.
*
* @throws IllegalArgumentException if the argument is unknown to the
* underlying implementation.
*
* @since Android 1.0
*/
public abstract void setAttribute(String name, Object value)
throws IllegalArgumentException;
/**
* Determines whether the factory is configured to deliver parsers that
* convert CDATA nodes to text nodes and melt them with neighboring nodes.
* This is called "coalescing".
*
* @param value turns coalescing on or off.
*
* @since Android 1.0
*/
public void setCoalescing(boolean value) {
coalesce = value;
}
/**
* Determines whether the factory is configured to deliver parsers that
* expands entity references.
*
* @param value turns entity reference expansion on or off.
*
* @since Android 1.0
*/
public void setExpandEntityReferences(boolean value) {
expandEntityReferences = value;
}
/**
* Sets a feature in the underlying implementation.
*
* @param name the name of the feature. The default Android implementation
* of {@link DocumentBuilder} supports only the following three
* features:
*
* <dl>
* <dt>{@code http://xml.org/sax/features/namespaces}</dt>
* <dd>Sets the state of namespace-awareness.</dd>
*
* <dt>
* {@code http://xml.org/sax/features/namespace-prefixes}
* </dt>
* <dd>Sets the state of namespace prefix processing</dd>
*
* <dt>{@code http://xml.org/sax/features/validation}</dt>
* <dd>Sets the state of validation.</dd>
* </dl>
*
* Note that despite the ability to set the validation
* feature, there is currently no validating parser available.
* Also note that currently either namespaces or
* namespace prefixes can be enabled, but not both at the same
* time.
*
* @param value the value of the feature.
*
* @throws ParserConfigurationException if the feature is unknown to the
* underlying implementation.
*
* @since Android 1.0
*/
public abstract void setFeature(String name, boolean value)
throws ParserConfigurationException;
/**
* Determines whether the factory is configured to deliver parsers that
* ignore comments.
*
* @param value turns comment ignorance on or off.
*
* @since Android 1.0
*/
public void setIgnoringComments(boolean value) {
ignoreComments = value;
}
/**
* Determines whether the factory is configured to deliver parsers that
* ignores element whitespace.
*
* @param value turns element whitespace ignorance on or off.
*
* @since Android 1.0
*/
public void setIgnoringElementContentWhitespace(boolean value) {
ignoreElementContentWhitespace = value;
}
/**
* Determines whether the factory is configured to deliver parsers that are
* namespace-aware.
*
* @param value turns namespace-awareness on or off.
*
* @since Android 1.0
*/
public void setNamespaceAware(boolean value) {
namespaceAware = value;
}
// TODO No XSchema support in Android 1.0. Maybe later.
// /**
// * Sets the desired XML Schema object.
// *
// * @param schema The XML Schema object.
// */
// public void setSchema(Schema schema) {
// this.schema = schema;
// }
/**
* Determines whether the factory is configured to deliver parsers that are
* validating.
*
* @param value turns validation on or off.
*
* @since Android 1.0
*/
public void setValidating(boolean value) {
validate = value;
}
/**
* Determines whether the factory is configured to deliver parsers that are
* XInclude-aware.
*
* @param value turns XInclude-awareness on or off.
*
* @since Android 1.0
*/
public void setXIncludeAware(boolean value) {
throw new UnsupportedOperationException();
}
}