diff --git a/make/modules/java.xml/Copy.gmk b/make/modules/java.xml/Copy.gmk new file mode 100644 index 00000000000..3b6c66e42c5 --- /dev/null +++ b/make/modules/java.xml/Copy.gmk @@ -0,0 +1,37 @@ +# +# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +include CopyCommon.gmk + +################################################################################ + +XML_LIB_SRC := $(TOPDIR)/src/java.xml/share/conf + +$(CONF_DST_DIR)/jaxp.properties: $(XML_LIB_SRC)/jaxp.properties + $(call install-file) + +TARGETS := $(CONF_DST_DIR)/jaxp.properties + +################################################################################ diff --git a/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/utils/FeaturePropertyBase.java b/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/utils/FeaturePropertyBase.java index 61c8b6514dd..1ba2190b65f 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/utils/FeaturePropertyBase.java +++ b/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/utils/FeaturePropertyBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ import jdk.xml.internal.SecuritySupport; /** * This is the base class for features and properties * - * @LastModified: May 2021 + * @LastModified: Mar 2023 */ public abstract class FeaturePropertyBase { @@ -205,7 +205,7 @@ public abstract class FeaturePropertyBase { return; } - value = SecuritySupport.readJAXPProperty(systemProperty); + value = SecuritySupport.readConfig(systemProperty); if (value != null) { values[property.ordinal()] = value; states[property.ordinal()] = State.JAXPDOTPROPERTIES; diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java index 1bffeba6ac6..f3ab76285db 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java +++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -39,7 +39,7 @@ import org.xml.sax.SAXNotSupportedException; /** * @author Rajiv Mordani * @author Edwin Goei - * @LastModified: May 2021 + * @LastModified: Mar 2023 */ public class DocumentBuilderFactoryImpl extends DocumentBuilderFactory { /** These are DocumentBuilderFactory attributes not DOM attributes */ @@ -148,7 +148,7 @@ public class DocumentBuilderFactoryImpl extends DocumentBuilderFactory { //check if the property is managed by security manager String pName; if ((pName = fSecurityManager.find(name)) != null) { - return attributes.get(pName); + return fSecurityManager.getLimitAsString(pName); } else if ((pName = fSecurityPropertyMgr.find(name)) != null) { return attributes.get(pName); } diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityManager.java b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityManager.java index f4140b8eb41..0d02974c605 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityManager.java +++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -512,22 +512,17 @@ public final class XMLSecurityManager { } /** - * Read from system properties, or those in jaxp.properties + * Read system properties, or the configuration file */ private void readSystemProperties() { - for (Limit limit : Limit.values()) { - if (!getSystemProperty(limit, limit.systemProperty())) { - //if system property is not found, try the older form if any - for (NameMap nameMap : NameMap.values()) { - String oldName = nameMap.getOldName(limit.systemProperty()); - if (oldName != null) { - getSystemProperty(limit, oldName); - } - } + // attempts to read both the current and old system propery + if (!getSystemProperty(limit, limit.systemProperty()) + && (!getOldSystemProperty(limit))) { + //if system property is not found, try the config file + getPropertyConfig(limit, limit.systemProperty()); } } - } // Array list to store printed warnings for each SAX parser used @@ -548,9 +543,9 @@ public final class XMLSecurityManager { } /** - * Read from system properties, or those in jaxp.properties + * Reads a system property, sets value and state if found. * - * @param property the type of the property + * @param limit the limit property * @param sysPropertyName the name of system property */ private boolean getSystemProperty(Limit limit, String sysPropertyName) { @@ -561,8 +556,42 @@ public final class XMLSecurityManager { states[limit.ordinal()] = State.SYSTEMPROPERTY; return true; } + } catch (NumberFormatException e) { + //invalid setting + throw new NumberFormatException("Invalid setting for system property: " + limit.systemProperty()); + } + return false; + } - value = SecuritySupport.readJAXPProperty(sysPropertyName); + /** + * Reads the legacy system property. + * @param limit a limit object + * @return true if found, false otherwise + */ + private boolean getOldSystemProperty(Limit limit) { + boolean found = false; + for (NameMap nameMap : NameMap.values()) { + String oldName = nameMap.getOldName(limit.systemProperty()); + if (oldName != null) { + if (getSystemProperty(limit, oldName)) { + found = true; + break; + } + } + } + return found; + } + + /** + * Reads a property from a configuration file, if any. + * + * @param limit the limit property + * @param sysPropertyName the name of system property + * @return + */ + private boolean getPropertyConfig(Limit limit, String sysPropertyName) { + try { + String value = SecuritySupport.readConfig(sysPropertyName); if (value != null && !value.equals("")) { values[limit.ordinal()] = Integer.parseInt(value); states[limit.ordinal()] = State.JAXPDOTPROPERTIES; @@ -575,7 +604,6 @@ public final class XMLSecurityManager { return false; } - /** * Convert a value set through setProperty to XMLSecurityManager. * If the value is an instance of XMLSecurityManager, use it to override the default; diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityPropertyManager.java b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityPropertyManager.java index 24f4980348f..d89072fe277 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityPropertyManager.java +++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityPropertyManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -231,7 +231,7 @@ public final class XMLSecurityPropertyManager { return; } - value = SecuritySupport.readJAXPProperty(systemProperty); + value = SecuritySupport.readConfig(systemProperty); if (value != null) { values[property.ordinal()] = value; states[property.ordinal()] = State.JAXPDOTPROPERTIES; diff --git a/src/java.xml/share/classes/javax/xml/XMLConstants.java b/src/java.xml/share/classes/javax/xml/XMLConstants.java index 7de589087e7..d9851d88972 100644 --- a/src/java.xml/share/classes/javax/xml/XMLConstants.java +++ b/src/java.xml/share/classes/javax/xml/XMLConstants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,55 @@ package javax.xml; /** - *

Utility class to contain basic XML values as constants. + * Defines constants for XML Processing APIs. + * + *

External Access Properties

+ * The value of the external access properties, including {@link #ACCESS_EXTERNAL_DTD}, + * {@link #ACCESS_EXTERNAL_SCHEMA}, and {@link #ACCESS_EXTERNAL_STYLESHEET}, + * is defined as follows. + * + *

Value:

+ * A list of protocols separated by comma. A protocol is the scheme portion of a + * {@link java.net.URI}, or in the case of the JAR protocol, "jar" plus the scheme + * portion separated by colon. A scheme is defined as: + * + *
+ * scheme = alpha *( alpha | digit | "+" | "-" | "." )
+ * where alpha = a-z and A-Z.

+ * + * And the JAR protocol:
+ * + * jar[:scheme]

+ * + * Protocols including the keyword "jar" are case-insensitive. Any whitespaces as defined by + * {@link java.lang.Character#isSpaceChar } in the value will be ignored. + * Examples of protocols are file, http, jar:file. + * + *
+ * + *

Default value:

+ * The default value is implementation specific and therefore not specified. + * The following options are provided for consideration: + *
+ *
+ * When FEATURE_SECURE_PROCESSING is enabled, it is recommended that implementations + * restrict external connections by default, though this may cause problems for applications + * that process XML/XSD/XSL with external references. + *
+ * + *

Granting all access:

+ * The keyword "all" grants permission to all protocols. + * + *

Property Precedence

+ * Properties, including the External Access Properties and + * {@link #USE_CATALOG}, can be specified through multiple configuration sources. + * They follow the configuration process as defined in the + * Configuration section + * of the module summary. * * @author Jeff Suttor * @see Extensible Markup Language (XML) 1.1 @@ -184,6 +232,10 @@ public final class XMLConstants { * ignoring security issues such as limits on XML constructs to avoid conditions such as denial of service attacks. * * + * + * @implNote + * when the Java Security Manager is present, the JDK sets the value of + * this feature to true and does not allow it to be turned off. */ public static final String FEATURE_SECURE_PROCESSING = "http://javax.xml.XMLConstants/feature/secure-processing"; @@ -198,54 +250,15 @@ public final class XMLConstants { * for example, {@link org.xml.sax.SAXException} is thrown. * *

- * Value: a list of protocols separated by comma. A protocol is the scheme portion of a - * {@link java.net.URI}, or in the case of the JAR protocol, "jar" plus the scheme portion - * separated by colon. - * A scheme is defined as: - * - *

- * scheme = alpha *( alpha | digit | "+" | "-" | "." )
- * where alpha = a-z and A-Z.

- * - * And the JAR protocol:
- * - * jar[:scheme]

- * - * Protocols including the keyword "jar" are case-insensitive. Any whitespaces as defined by - * {@link java.lang.Character#isSpaceChar } in the value will be ignored. - * Examples of protocols are file, http, jar:file. - * - *
- * - *

- * Default value: The default value is implementation specific and therefore not specified. - * The following options are provided for consideration: - *

- *
- * When FEATURE_SECURE_PROCESSING is enabled, it is recommended that implementations - * restrict external connections by default, though this may cause problems for applications - * that process XML/XSD/XSL with external references. - *
+ * Value: as defined in the class description. * *

- * Granting all access: the keyword "all" grants permission to all protocols. + * System Property: {@code javax.xml.accessExternalDTD}. * *

- * System Property: The value of this property can be set or overridden by - * system property {@code javax.xml.accessExternalDTD}. - * - * - *

- * jaxp.properties: This configuration file is in standard - * {@link java.util.Properties} format and typically located in the {@code conf} - * directory of the Java installation. If the file exists and the system - * property is specified, its value will be used to override the default - * of the property. - * + * Configuration File: + * Yes. The property can be set in the + * configuration file. * * @since 1.7 */ @@ -262,53 +275,16 @@ public final class XMLConstants { * for example, org.xml.sax.SAXException is thrown. * *

- * Value: a list of protocols separated by comma. A protocol is the scheme portion of a - * {@link java.net.URI}, or in the case of the JAR protocol, "jar" plus the scheme portion - * separated by colon. - * A scheme is defined as: - * - *

- * scheme = alpha *( alpha | digit | "+" | "-" | "." )
- * where alpha = a-z and A-Z.

- * - * And the JAR protocol:
- * - * jar[:scheme]

- * - * Protocols including the keyword "jar" are case-insensitive. Any whitespaces as defined by - * {@link java.lang.Character#isSpaceChar } in the value will be ignored. - * Examples of protocols are file, http, jar:file. - * - *
+ * Value: as defined in the class description. * *

- * Default value: The default value is implementation specific and therefore not specified. - * The following options are provided for consideration: - *

- *
- * When FEATURE_SECURE_PROCESSING is enabled, it is recommended that implementations - * restrict external connections by default, though this may cause problems for applications - * that process XML/XSD/XSL with external references. - *
+ * System Property: {@code javax.xml.accessExternalSchema} * *

- * Granting all access: the keyword "all" grants permission to all protocols. - * - *

- * System Property: The value of this property can be set or overridden by - * system property {@code javax.xml.accessExternalSchema} - * - *

- * jaxp.properties: This configuration file is in standard - * {@link java.util.Properties} format and typically located in the {@code conf} - * directory of the Java installation. If the file exists and the system - * property is specified, its value will be used to override the default - * of the property. - * + * Configuration File: + * Yes. The property can be set in the + * configuration file. + * * @since 1.7 */ public static final String ACCESS_EXTERNAL_SCHEMA = "http://javax.xml.XMLConstants/property/accessExternalSchema"; @@ -326,52 +302,15 @@ public final class XMLConstants { * will be thrown by the {@link javax.xml.transform.TransformerFactory}. * *

- * Value: a list of protocols separated by comma. A protocol is the scheme portion of a - * {@link java.net.URI}, or in the case of the JAR protocol, "jar" plus the scheme portion - * separated by colon. - * A scheme is defined as: - * - *

- * scheme = alpha *( alpha | digit | "+" | "-" | "." )
- * where alpha = a-z and A-Z.

- * - * And the JAR protocol:
- * - * jar[:scheme]

- * - * Protocols including the keyword "jar" are case-insensitive. Any whitespaces as defined by - * {@link java.lang.Character#isSpaceChar } in the value will be ignored. - * Examples of protocols are file, http, jar:file. - * - *
+ * Value: as defined in the class description. * *

- * Default value: The default value is implementation specific and therefore not specified. - * The following options are provided for consideration: - *

- *
- * When FEATURE_SECURE_PROCESSING is enabled, it is recommended that implementations - * restrict external connections by default, though this may cause problems for applications - * that process XML/XSD/XSL with external references. - *
+ * System Property: {@code javax.xml.accessExternalStylesheet} * *

- * Granting all access: the keyword "all" grants permission to all protocols. - * - *

- * System Property: The value of this property can be set or overridden by - * system property {@code javax.xml.accessExternalStylesheet} - * - *

- * jaxp.properties: This configuration file is in standard - * {@link java.util.Properties} format and typically located in the {@code conf} - * directory of the Java installation. If the file exists and the system - * property is specified, its value will be used to override the default - * of the property. + * Configuration File: + * Yes. The property can be set in the + * configuration file. * * @since 1.7 */ @@ -384,15 +323,15 @@ public final class XMLConstants { *

* Instructs XML processors to use XML Catalogs to resolve entity references. * Catalogs may be set through JAXP factories, system properties, or - * jaxp.properties by using the {@code javax.xml.catalog.files} property + * configuration file by using the {@code javax.xml.catalog.files} property * defined in {@link javax.xml.catalog.CatalogFeatures}. * The following code enables Catalog on SAX parser: - *

{@code
+         * {@snippet :
          *      SAXParserFactory spf = SAXParserFactory.newInstance();
          *      spf.setFeature(XMLConstants.USE_CATALOG, true);
          *      SAXParser parser = spf.newSAXParser();
          *      parser.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), "catalog.xml");
-         * }
+ * } * *

* Value: a boolean. If the value is true, and a catalog is set, @@ -401,15 +340,12 @@ public final class XMLConstants { * XML Catalog is ignored even if one is set. The default value is true. * *

- * System Property: The value of this property can be set or overridden by - * system property {@code javax.xml.useCatalog} + * System Property: {@code javax.xml.useCatalog} * *

- * jaxp.properties: This configuration file is in standard - * {@link java.util.Properties} format and typically located in the {@code conf} - * directory of the Java installation. If the file exists and the system - * property is specified, its value will be used to override the default - * value of the property. + * Configuration File: + * Yes. The property can be set in the + * configuration file. * * @since 9 */ diff --git a/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java b/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java index 3e740c2a413..5d4c9c58215 100644 --- a/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java +++ b/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,8 +24,6 @@ */ package javax.xml.catalog; -import java.net.MalformedURLException; -import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; import jdk.xml.internal.SecuritySupport; @@ -42,7 +40,6 @@ import jdk.xml.internal.SecuritySupport; * Description * Property Name * System Property [1] - * jaxp.properties [1] * Value [2] * Action * @@ -61,7 +58,6 @@ import jdk.xml.internal.SecuritySupport; * * javax.xml.catalog.files * javax.xml.catalog.files - * javax.xml.catalog.files * String * URIs * @@ -76,7 +72,6 @@ import jdk.xml.internal.SecuritySupport; * identifiers. The default value is public [3]. * javax.xml.catalog.prefer * N/A - * N/A * String * {@code system} * @@ -97,7 +92,6 @@ import jdk.xml.internal.SecuritySupport; * needed. The default value is true. * javax.xml.catalog.defer [4] * javax.xml.catalog.defer - * javax.xml.catalog.defer * String * {@code true} * @@ -116,7 +110,6 @@ import jdk.xml.internal.SecuritySupport; * all of the specified catalogs are exhausted. The default is strict. * javax.xml.catalog.resolve [4] * javax.xml.catalog.resolve - * javax.xml.catalog.resolve * String * {@code strict} * @@ -140,7 +133,6 @@ import jdk.xml.internal.SecuritySupport; * *

* [1] There is no System property for the features that marked as "N/A". - * *

* [2] The value shall be exactly as listed in this table, case-sensitive. * Any unspecified value will result in {@link IllegalArgumentException}. @@ -164,33 +156,22 @@ import jdk.xml.internal.SecuritySupport; * set the property {@code javax.xml.catalog.defer} to false to allow the entire * catalog to be pre-loaded. * - *

Scope and Order

- * Features and properties can be set through the catalog file, the Catalog API, - * system properties, and {@code jaxp.properties}, with a preference in the same order. - *

- * Properties that are specified as attributes in the catalog file for the - * catalog and group entries shall take preference over any of the other settings. + *

Property Precedence

+ * The Catalog Features follow the + * Property Precedence + * as described in the module summary with regards to the priority with which + * their values are retrieved from the various configuration sources such as the + * JAXP configuration file, + * system and API properties. In addition to the general configuration sources, + * the Catalog Features are further supported in the catalog file itself where + * they can be specified as attributes of the catalog and group entries. When the + * attributes are specified, they shall take preference over any of the other + * configuration sources. * For example, if a {@code prefer} attribute is set in the catalog file as in * {@code }, any other input for the "prefer" property * is not necessary or will be ignored. - *

- * Properties set through the Catalog API override those that may have been set - * by system properties and/or in {@code jaxp.properties}. In case of multiple - * interfaces, the latest in a procedure shall take preference. For - * {@link Feature#FILES}, this means that the URI(s) specified through the methods - * of the {@link CatalogManager} will override any that may have been entered - * through the {@link Builder}. * *

- * System properties when set shall override those in {@code jaxp.properties}. - *

- * The {@code jaxp.properties} file is typically in the conf directory of the Java - * installation. The file is read only once by the JAXP implementation and - * its values are then cached for future use. If the file does not exist - * when the first attempt is made to read from it, no further attempts are - * made to check for its existence. It is not possible to change the value - * of any properties in {@code jaxp.properties} after it has been read. - *

* A CatalogFeatures instance can be created through its builder as illustrated * in the following sample code: *

{@code
@@ -489,7 +470,7 @@ public class CatalogFeatures {
 
     /**
      * States of the settings of a property, in the order: default value,
-     * jaxp.properties file, jaxp system properties, and jaxp api properties
+     * configuration file, jaxp system properties, and jaxp api properties
      */
     static enum State {
         /** represents the default state of a feature. */
@@ -622,7 +603,7 @@ public class CatalogFeatures {
                 return true;
             }
 
-            value = SecuritySupport.readJAXPProperty(sysPropertyName);
+            value = SecuritySupport.readConfig(sysPropertyName);
             if (value != null && !value.isEmpty()) {
                 setProperty(cf, State.JAXPDOTPROPERTIES, value);
                 return true;
diff --git a/src/java.xml/share/classes/javax/xml/catalog/package-info.java b/src/java.xml/share/classes/javax/xml/catalog/package-info.java
index b727bca77ef..70db1b31a6c 100644
--- a/src/java.xml/share/classes/javax/xml/catalog/package-info.java
+++ b/src/java.xml/share/classes/javax/xml/catalog/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -33,7 +33,7 @@
  * The Catalog API defines a standard solution for resolving external resources
  * referenced by XML documents. It is fully supported by the XML Processors
  * allowing application developers to configure a catalog through an XML processor
- * or system property or the jaxp.properties file to take advantage of the feature.
+ * or system property or the configuration file to take advantage of the feature.
  * 

* The XML Catalog API defines the following interfaces: *