/* * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ // CatalogManager.java - Access CatalogManager.properties /* * Copyright 2001-2004 The Apache Software Foundation or its licensors, * as applicable. * * 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 com.sun.org.apache.xml.internal.resolver; import com.sun.org.apache.xerces.internal.utils.SecuritySupport; import com.sun.org.apache.xml.internal.resolver.helpers.BootstrapResolver; import com.sun.org.apache.xml.internal.resolver.helpers.Debug; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.MissingResourceException; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; import java.util.StringTokenizer; import java.util.Vector; import sun.reflect.misc.ReflectUtil; /** * CatalogManager provides an interface to the catalog properties. * *
Properties can come from two places: from system properties or * from a CatalogManager.properties file. This class provides a transparent * interface to both, with system properties preferred over property file values.
* *The following table summarizes the properties:
* *System Property | *CatalogManager.properties Property |
* Description | *
xml.catalog.ignoreMissing | ** | If true, a missing CatalogManager.properties file or missing properties * within that file will not generate warning messages. See also the * ignoreMissingProperties method. | *
xml.catalog.files | *catalogs | *The |
*
* | relative-catalogs | *If false, relative catalog URIs are made absolute with respect to the base URI of
* the CatalogManager.properties file. This setting only applies to catalog
* URIs obtained from the catalogs property |
*
xml.catalog.verbosity | *verbosity | *If non-zero, the Catalog classes will print informative and debugging messages. * The higher the number, the more messages. | *
xml.catalog.prefer | *prefer | *Which identifier is preferred, "public" or "system"? | *
xml.catalog.staticCatalog | *static-catalog | *Should a single catalog be constructed for all parsing, or should a different * catalog be created for each parser? | *
xml.catalog.allowPI | *allow-oasis-xml-catalog-pi | *If the source document contains "oasis-xml-catalog" processing instructions, * should they be used? | *
xml.catalog.className | *catalog-class-name | *If you're using the convenience classes * com.sun.org.apache.xml.internal.resolver.tools.*), this setting * allows you to specify an alternate class name to use for the underlying * catalog. | *
This field is public so that objects that have access to this * CatalogManager can use this debug object.
*/ public Debug debug = null; /** Constructor. */ public CatalogManager() { init(); } /** Constructor that specifies an explicit property file. */ public CatalogManager(String propertyFile) { this.propertyFile = propertyFile; init(); } private void init() { debug = new Debug(); // Note that we don't setDebug() here; we do that lazily. Either the // user will set it explicitly, or we'll do it automagically if they // read from the propertyFile for some other reason. That way, there's // no attempt to read from the file before the caller has had a chance // to avoid it. if (System.getSecurityManager() == null) { useServicesMechanism = true; } } /** Set the bootstrap resolver.*/ public void setBootstrapResolver(BootstrapResolver resolver) { bResolver = resolver; } /** Get the bootstrap resolver.*/ public BootstrapResolver getBootstrapResolver() { return bResolver; } /** * Load the properties from the propertyFile and build the * resources from it. */ private synchronized void readProperties() { try { propertyFileURI = CatalogManager.class.getResource("/"+propertyFile); InputStream in = CatalogManager.class.getResourceAsStream("/"+propertyFile); if (in==null) { if (!ignoreMissingProperties) { System.err.println("Cannot find "+propertyFile); // there's no reason to give this warning more than once ignoreMissingProperties = true; } return; } resources = new PropertyResourceBundle(in); } catch (MissingResourceException mre) { if (!ignoreMissingProperties) { System.err.println("Cannot read "+propertyFile); } } catch (java.io.IOException e) { if (!ignoreMissingProperties) { System.err.println("Failure trying to read "+propertyFile); } } // This is a bit of a hack. After we've successfully read the properties, // use them to set the default debug level, if the user hasn't already set // the default debug level. if (verbosity == null) { try { String verbStr = resources.getString("verbosity"); int verb = Integer.parseInt(verbStr.trim()); debug.setDebug(verb); verbosity = new Integer(verb); } catch (Exception e) { // nop } } } /** * Allow access to the static CatalogManager */ public static CatalogManager getStaticManager() { return staticManager; } /** * How are missing properties handled? * *If true, missing or unreadable property files will * not be reported. Otherwise, a message will be sent to System.err. *
*/ public boolean getIgnoreMissingProperties() { return ignoreMissingProperties; } /** * How should missing properties be handled? * *If ignore is true, missing or unreadable property files will * not be reported. Otherwise, a message will be sent to System.err. *
*/ public void setIgnoreMissingProperties(boolean ignore) { ignoreMissingProperties = ignore; } /** * How are missing properties handled? * *If ignore is true, missing or unreadable property files will * not be reported. Otherwise, a message will be sent to System.err. *
* * @deprecated No longer static; use get/set methods. */ public void ignoreMissingProperties(boolean ignore) { setIgnoreMissingProperties(ignore); } /** * Obtain the verbosity setting from the properties. * * @return The verbosity level from the propertyFile or the * defaultVerbosity. */ private int queryVerbosity () { String defaultVerbStr = Integer.toString(defaultVerbosity); String verbStr = SecuritySupport.getSystemProperty(pVerbosity); if (verbStr == null) { if (resources==null) readProperties(); if (resources != null) { try { verbStr = resources.getString("verbosity"); } catch (MissingResourceException e) { verbStr = defaultVerbStr; } } else { verbStr = defaultVerbStr; } } int verb = defaultVerbosity; try { verb = Integer.parseInt(verbStr.trim()); } catch (Exception e) { System.err.println("Cannot parse verbosity: \"" + verbStr + "\""); } // This is a bit of a hack. After we've successfully got the verbosity, // we have to use it to set the default debug level, // if the user hasn't already set the default debug level. if (verbosity == null) { debug.setDebug(verb); verbosity = new Integer(verb); } return verb; } /** * What is the current verbosity? */ public int getVerbosity() { if (verbosity == null) { verbosity = new Integer(queryVerbosity()); } return verbosity.intValue(); } /** * Set the current verbosity. */ public void setVerbosity (int verbosity) { this.verbosity = new Integer(verbosity); debug.setDebug(verbosity); } /** * What is the current verbosity? * * @deprecated No longer static; use get/set methods. */ public int verbosity () { return getVerbosity(); } /** * Obtain the relativeCatalogs setting from the properties. * * @return The relativeCatalogs setting from the propertyFile or the * defaultRelativeCatalogs. */ private boolean queryRelativeCatalogs () { if (resources==null) readProperties(); if (resources==null) return defaultRelativeCatalogs; try { String allow = resources.getString("relative-catalogs"); return (allow.equalsIgnoreCase("true") || allow.equalsIgnoreCase("yes") || allow.equalsIgnoreCase("1")); } catch (MissingResourceException e) { return defaultRelativeCatalogs; } } /** * Get the relativeCatalogs setting. * *This property is used when the catalogFiles property is * interrogated. If true, then relative catalog entry file names * are returned. If false, relative catalog entry file names are * made absolute with respect to the properties file before returning * them.
* *This property
In the properties, a value of 'yes', 'true', or '1' is considered * true, anything else is false.
* * @return The relativeCatalogs setting from the propertyFile or the * defaultRelativeCatalogs. */ public boolean getRelativeCatalogs () { if (relativeCatalogs == null) { relativeCatalogs = new Boolean(queryRelativeCatalogs()); } return relativeCatalogs.booleanValue(); } /** * Set the relativeCatalogs setting. * * @see #getRelativeCatalogs() */ public void setRelativeCatalogs (boolean relative) { relativeCatalogs = new Boolean(relative); } /** * Get the relativeCatalogs setting. * * @deprecated No longer static; use get/set methods. */ public boolean relativeCatalogs () { return getRelativeCatalogs(); } /** * Obtain the list of catalog files from the properties. * * @return A semicolon delimited list of catlog file URIs */ private String queryCatalogFiles () { String catalogList = SecuritySupport.getSystemProperty(pFiles); fromPropertiesFile = false; if (catalogList == null) { if (resources == null) readProperties(); if (resources != null) { try { catalogList = resources.getString("catalogs"); fromPropertiesFile = true; } catch (MissingResourceException e) { System.err.println(propertyFile + ": catalogs not found."); catalogList = null; } } } if (catalogList == null) { catalogList = defaultCatalogFiles; } return catalogList; } /** * Return the current list of catalog files. * * @return A vector of the catalog file names or null if no catalogs * are available in the properties. */ public Vector getCatalogFiles() { if (catalogFiles == null) { catalogFiles = queryCatalogFiles(); } StringTokenizer files = new StringTokenizer(catalogFiles, ";"); Vector catalogs = new Vector(); while (files.hasMoreTokens()) { String catalogFile = files.nextToken(); URL absURI = null; if (fromPropertiesFile && !relativeCatalogs()) { try { absURI = new URL(propertyFileURI, catalogFile); catalogFile = absURI.toString(); } catch (MalformedURLException mue) { absURI = null; } } catalogs.add(catalogFile); } return catalogs; } /** * Set the list of catalog files. */ public void setCatalogFiles(String fileList) { catalogFiles = fileList; fromPropertiesFile = false; } /** * Return the current list of catalog files. * * @return A vector of the catalog file names or null if no catalogs * are available in the properties. * * @deprecated No longer static; use get/set methods. */ public Vector catalogFiles() { return getCatalogFiles(); } /** * Obtain the preferPublic setting from the properties. * *In the properties, a value of 'public' is true, * anything else is false.
* * @return True if prefer is public or the * defaultPreferSetting. */ private boolean queryPreferPublic () { String prefer = SecuritySupport.getSystemProperty(pPrefer); if (prefer == null) { if (resources==null) readProperties(); if (resources==null) return defaultPreferPublic; try { prefer = resources.getString("prefer"); } catch (MissingResourceException e) { return defaultPreferPublic; } } if (prefer == null) { return defaultPreferPublic; } return (prefer.equalsIgnoreCase("public")); } /** * Return the current prefer public setting. * * @return True if public identifiers are preferred. */ public boolean getPreferPublic () { if (preferPublic == null) { preferPublic = new Boolean(queryPreferPublic()); } return preferPublic.booleanValue(); } /** * Set the prefer public setting. */ public void setPreferPublic (boolean preferPublic) { this.preferPublic = new Boolean(preferPublic); } /** * Return the current prefer public setting. * * @return True if public identifiers are preferred. * * @deprecated No longer static; use get/set methods. */ public boolean preferPublic () { return getPreferPublic(); } /** * Obtain the static-catalog setting from the properties. * *In the properties, a value of 'yes', 'true', or '1' is considered * true, anything else is false.
* * @return The static-catalog setting from the propertyFile or the * defaultUseStaticCatalog. */ private boolean queryUseStaticCatalog () { String staticCatalog = SecuritySupport.getSystemProperty(pStatic); if (staticCatalog == null) { if (resources==null) readProperties(); if (resources==null) return defaultUseStaticCatalog; try { staticCatalog = resources.getString("static-catalog"); } catch (MissingResourceException e) { return defaultUseStaticCatalog; } } if (staticCatalog == null) { return defaultUseStaticCatalog; } return (staticCatalog.equalsIgnoreCase("true") || staticCatalog.equalsIgnoreCase("yes") || staticCatalog.equalsIgnoreCase("1")); } /** * Get the current use static catalog setting. */ public boolean getUseStaticCatalog() { if (useStaticCatalog == null) { useStaticCatalog = new Boolean(queryUseStaticCatalog()); } return useStaticCatalog.booleanValue(); } /** * Set the use static catalog setting. */ public void setUseStaticCatalog(boolean useStatic) { useStaticCatalog = new Boolean(useStatic); } /** * Get the current use static catalog setting. * * @deprecated No longer static; use get/set methods. */ public boolean staticCatalog() { return getUseStaticCatalog(); } /** * Get a new catalog instance. * * This method always returns a new instance of the underlying catalog class. */ public Catalog getPrivateCatalog() { Catalog catalog = staticCatalog; if (useStaticCatalog == null) { useStaticCatalog = new Boolean(getUseStaticCatalog()); } if (catalog == null || !useStaticCatalog.booleanValue()) { try { String catalogClassName = getCatalogClassName(); if (catalogClassName == null) { catalog = new Catalog(); } else { try { catalog = (Catalog) ReflectUtil.forName(catalogClassName).newInstance(); } catch (ClassNotFoundException cnfe) { debug.message(1,"Catalog class named '" + catalogClassName + "' could not be found. Using default."); catalog = new Catalog(); } catch (ClassCastException cnfe) { debug.message(1,"Class named '" + catalogClassName + "' is not a Catalog. Using default."); catalog = new Catalog(); } } catalog.setCatalogManager(this); catalog.setupReaders(); catalog.loadSystemCatalogs(); } catch (Exception ex) { ex.printStackTrace(); } if (useStaticCatalog.booleanValue()) { staticCatalog = catalog; } } return catalog; } /** * Get a catalog instance. * * If this manager uses static catalogs, the same static catalog will * always be returned. Otherwise a new catalog will be returned. */ public Catalog getCatalog() { Catalog catalog = staticCatalog; if (useStaticCatalog == null) { useStaticCatalog = new Boolean(getUseStaticCatalog()); } if (catalog == null || !useStaticCatalog.booleanValue()) { catalog = getPrivateCatalog(); if (useStaticCatalog.booleanValue()) { staticCatalog = catalog; } } return catalog; } /** *Obtain the oasisXMLCatalogPI setting from the properties.
* *In the properties, a value of 'yes', 'true', or '1' is considered * true, anything else is false.
* * @return The oasisXMLCatalogPI setting from the propertyFile or the * defaultOasisXMLCatalogPI. */ public boolean queryAllowOasisXMLCatalogPI () { String allow = SecuritySupport.getSystemProperty(pAllowPI); if (allow == null) { if (resources==null) readProperties(); if (resources==null) return defaultOasisXMLCatalogPI; try { allow = resources.getString("allow-oasis-xml-catalog-pi"); } catch (MissingResourceException e) { return defaultOasisXMLCatalogPI; } } if (allow == null) { return defaultOasisXMLCatalogPI; } return (allow.equalsIgnoreCase("true") || allow.equalsIgnoreCase("yes") || allow.equalsIgnoreCase("1")); } /** * Get the current XML Catalog PI setting. */ public boolean getAllowOasisXMLCatalogPI () { if (oasisXMLCatalogPI == null) { oasisXMLCatalogPI = new Boolean(queryAllowOasisXMLCatalogPI()); } return oasisXMLCatalogPI.booleanValue(); } public boolean useServicesMechanism() { return useServicesMechanism; } /** * Set the XML Catalog PI setting */ public void setAllowOasisXMLCatalogPI(boolean allowPI) { oasisXMLCatalogPI = new Boolean(allowPI); } /** * Get the current XML Catalog PI setting. * * @deprecated No longer static; use get/set methods. */ public boolean allowOasisXMLCatalogPI() { return getAllowOasisXMLCatalogPI(); } /** * Obtain the Catalog class name setting from the properties. * */ public String queryCatalogClassName () { String className = SecuritySupport.getSystemProperty(pClassname); if (className == null) { if (resources==null) readProperties(); if (resources==null) return null; try { return resources.getString("catalog-class-name"); } catch (MissingResourceException e) { return null; } } return className; } /** * Get the current Catalog class name. */ public String getCatalogClassName() { if (catalogClassName == null) { catalogClassName = queryCatalogClassName(); } return catalogClassName; } /** * Set the Catalog class name. */ public void setCatalogClassName(String className) { catalogClassName = className; } /** * Get the current Catalog class name. * * @deprecated No longer static; use get/set methods. */ public String catalogClassName() { return getCatalogClassName(); } }