001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.openide.loaders;
043:
044: import java.io.IOException;
045: import java.io.InputStream;
046: import java.util.HashMap;
047: import java.util.Map;
048: import org.openide.xml.EntityCatalog;
049: import org.xml.sax.InputSource;
050: import org.xml.sax.SAXException;
051:
052: /**
053: * Implements non-persistent catalog functionality as EntityResolver.
054: * <p>Registations using this resolver are:
055: * <li>transient
056: * <li>of the hihgest priority
057: * <li>last registration prevails
058: */
059: public final class RuntimeCatalog extends EntityCatalog {
060:
061: /** Public constructor for lookup. */
062: public RuntimeCatalog() {
063: }
064:
065: // table mapping public IDs to (local) URIs
066: private Map<String, String> id2uri;
067:
068: // tables mapping public IDs to resources and classloaders
069: private Map<String, String> id2resource;
070: private Map<String, ClassLoader> id2loader;
071:
072: /** SAX entity resolver */
073: public InputSource resolveEntity(String name, String uri)
074: throws IOException, SAXException {
075:
076: InputSource retval;
077: String mappedURI = name2uri(name);
078: InputStream stream = mapResource(name);
079:
080: // prefer explicit URI mappings, then bundled resources...
081: if (mappedURI != null) {
082: retval = new InputSource(mappedURI);
083: retval.setPublicId(name);
084: return retval;
085:
086: } else if (stream != null) {
087: // XXX unused var, what is it for?
088: uri = "java:resource:" + id2resource.get(name); // NOI18N
089: retval = new InputSource(stream);
090: retval.setPublicId(name);
091: return retval;
092:
093: } else {
094: return null;
095: }
096: }
097:
098: public void registerCatalogEntry(String publicId, String uri) {
099: if (id2uri == null) {
100: id2uri = new HashMap<String, String>();
101: }
102: id2uri.put(publicId, uri);
103: }
104:
105: /** Map publicid to a resource accessible by a classloader. */
106: public void registerCatalogEntry(String publicId,
107: String resourceName, ClassLoader loader) {
108: if (id2resource == null) {
109: id2resource = new HashMap<String, String>();
110: }
111: id2resource.put(publicId, resourceName);
112:
113: if (loader != null) {
114: if (id2loader == null) {
115: id2loader = new HashMap<String, ClassLoader>();
116: }
117: id2loader.put(publicId, loader);
118: }
119: }
120:
121: // maps the public ID to an alternate URI, if one is registered
122: private String name2uri(String publicId) {
123:
124: if (publicId == null || id2uri == null) {
125: return null;
126: }
127: return id2uri.get(publicId);
128: }
129:
130: // return the resource as a stream
131: private InputStream mapResource(String publicId) {
132: if (publicId == null || id2resource == null) {
133: return null;
134: }
135:
136: String resourceName = id2resource.get(publicId);
137: ClassLoader loader = null;
138:
139: if (resourceName == null) {
140: return null;
141: }
142:
143: if (id2loader != null) {
144: loader = id2loader.get(publicId);
145: }
146:
147: if (loader == null) {
148: return ClassLoader.getSystemResourceAsStream(resourceName);
149: }
150: return loader.getResourceAsStream(resourceName);
151: }
152:
153: }
|