001: /*
002: * The Apache Software License, Version 1.1
003: *
004: *
005: * Copyright (c) 1999 The Apache Software Foundation. All rights
006: * reserved.
007: *
008: * Redistribution and use in source and binary forms, with or without
009: * modification, are permitted provided that the following conditions
010: * are met:
011: *
012: * 1. Redistributions of source code must retain the above copyright
013: * notice, this list of conditions and the following disclaimer.
014: *
015: * 2. Redistributions in binary form must reproduce the above copyright
016: * notice, this list of conditions and the following disclaimer in
017: * the documentation and/or other materials provided with the
018: * distribution.
019: *
020: * 3. The end-user documentation included with the redistribution,
021: * if any, must include the following acknowledgment:
022: * "This product includes software developed by the
023: * Apache Software Foundation (http://www.apache.org/)."
024: * Alternately, this acknowledgment may appear in the software itself,
025: * if and wherever such third-party acknowledgments normally appear.
026: *
027: * 4. The names "Xerces" and "Apache Software Foundation" must
028: * not be used to endorse or promote products derived from this
029: * software without prior written permission. For written
030: * permission, please contact apache@apache.org.
031: *
032: * 5. Products derived from this software may not be called "Apache",
033: * nor may "Apache" appear in their name, without prior written
034: * permission of the Apache Software Foundation.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
040: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: * ====================================================================
049: *
050: * This software consists of voluntary contributions made by many
051: * individuals on behalf of the Apache Software Foundation and was
052: * originally based on software copyright (c) 1999, International
053: * Business Machines, Inc., http://www.apache.org. For more
054: * information on the Apache Software Foundation, please see
055: * <http://www.apache.org/>.
056: */
057:
058: package org.apache.xerces.readers;
059:
060: import java.io.IOException;
061: import java.util.Enumeration;
062: import java.util.Hashtable;
063:
064: import org.xml.sax.EntityResolver;
065: import org.xml.sax.InputSource;
066: import org.xml.sax.SAXException;
067:
068: /**
069: * Interface for implementing basic catalog support in the parser.
070: * To implement and use a Catalog, implement this interface and
071: * install your catalog instance as the EntityResolver in the
072: * parser's entity handler. For example:
073: * <pre>
074: * XMLParser parser = new AnyParser();
075: * <font color="blue">parser.addCatalogHandler(new MyCatalog());</font>
076: * </pre>
077: * <p>
078: * This default catalog implementation does not provide a method
079: * for loading multiple catalogs from various input sources.
080: * Instead, it is a convenient base class for other catalog
081: * implementations.
082: * <p>
083: * To create a catalog implementation, simply extend this class
084: * and implement the <tt>loadCatalog</tt> method. Public and system
085: * identifier mappings can be stored and accessed using the
086: * convenient public methods on this class.
087: *
088: * @author Andy Clark, IBM
089: * @version
090: *
091: * @see org.xml.sax.EntityResolver
092: */
093: public abstract class XMLCatalogHandler implements EntityResolver {
094:
095: /**
096: * Loads the catalog stream specified by the given input source and
097: * appends the contents to the catalog.
098: *
099: * @param source The catalog source.
100: *
101: * @exception java.lang.Exception Throws an exception if an error
102: * occurs while loading the catalog source.
103: */
104: public abstract void loadCatalog(InputSource source)
105: throws Exception;
106:
107: //
108: // Data
109: //
110:
111: /** Public identifier mappings. */
112: private Hashtable publicMap = new Hashtable();
113:
114: /** System identifier mappings (aliases). */
115: private Hashtable systemMap = new Hashtable();
116:
117: //
118: // Public methods
119: //
120:
121: /**
122: * Adds a public to system identifier mapping.
123: *
124: * @param publicId The public identifier, or "key".
125: * @param systemId The system identifier, or "value".
126: */
127: public void addPublicMapping(String publicId, String systemId) {
128: publicMap.put(publicId, systemId);
129: }
130:
131: /**
132: * Removes a public identifier mapping.
133: *
134: * @param publicId The public identifier to remove.
135: */
136: public void removePublicMapping(System publicId) {
137: publicMap.remove(publicId);
138: }
139:
140: /** Returns an enumeration of public identifier mapping keys. */
141: public Enumeration getPublicMappingKeys() {
142: return publicMap.keys();
143: }
144:
145: /**
146: * Returns a public identifier mapping.
147: *
148: * @param publicId The public identifier, or "key".
149: *
150: * @return Returns the system identifier value or null if there
151: * is no mapping defined.
152: */
153: public String getPublicMapping(String publicId) {
154: return (String) publicMap.get(publicId);
155: }
156:
157: /**
158: * Adds a system identifier alias.
159: *
160: * @param publicId The system identifier "key".
161: * @param systemId The system identifier "value".
162: */
163: public void addSystemMapping(String systemId1, String systemId2) {
164: systemMap.put(systemId1, systemId2);
165: }
166:
167: /**
168: * Removes a system identifier alias.
169: *
170: * @param systemId The system identifier to remove.
171: */
172: public void removeSystemMapping(String systemId) {
173: systemMap.remove(systemId);
174: }
175:
176: /** Returns an enumeration of system identifier mapping keys. */
177: public Enumeration getSystemMappingKeys() {
178: return systemMap.keys();
179: }
180:
181: /**
182: * Returns a system identifier alias.
183: *
184: * @param systemId The system identifier "key".
185: *
186: * @return Returns the system identifier alias value or null if there
187: * is no alias defined.
188: */
189: public String getSystemMapping(String systemId) {
190: return (String) systemMap.get(systemId);
191: }
192:
193: /**
194: * Resolves external entities.
195: *
196: * @param publicId The public identifier used for entity resolution.
197: * @param systemId If the publicId is not null, this systemId is
198: * to be considered the default system identifier;
199: * else a system identifier alias mapping is
200: * requested.
201: *
202: * @return Returns the input source of the resolved entity or null
203: * if no resolution is possible.
204: *
205: * @exception org.xml.sax.SAXException Exception thrown on SAX error.
206: * @exception java.io.IOException Exception thrown on i/o error.
207: */
208: public InputSource resolveEntity(String publicId, String systemId)
209: throws SAXException, IOException {
210:
211: // public id -> system id
212: if (publicId != null) {
213: String value = getPublicMapping(publicId);
214: if (value != null) {
215: return new InputSource(value);
216: }
217: }
218:
219: // system id(1) -> system id(2)
220: if (systemId != null) {
221: String value = getSystemMapping(systemId);
222: if (value == null) {
223: value = systemId;
224: }
225:
226: return new InputSource(value);
227: }
228:
229: return null;
230:
231: }
232: }
|