001: package org.apache.turbine.services.intake.transform;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: import java.io.IOException;
023: import java.io.InputStream;
024: import java.net.URL;
025:
026: import org.apache.commons.logging.Log;
027: import org.apache.commons.logging.LogFactory;
028:
029: import org.xml.sax.EntityResolver;
030: import org.xml.sax.InputSource;
031:
032: /**
033: * A resolver to get the database.dtd file for the XML parser from the jar.
034: * This does not work with jdk1.3 on linux and OSX, see
035: * <a href="http://developer.java.sun.com/developer/bugParade/bugs/4337703.html">
036: * Bug 4337703</a>
037: *
038: * @author <a href="mailto:mpoeschl@marmot.at">Martin Poeschl</a>
039: * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
040: * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
041: * @version $Id: DTDResolver.java 542370 2007-05-29 01:26:13Z seade $
042: */
043: public class DTDResolver implements EntityResolver {
044: private static final String WEB_SITE_DTD = "http://turbine.apache.org/dtd/intake_2_3_3.dtd";
045:
046: /** InputSource for <code>intake.dtd</code>. */
047: private InputSource intakeDTD = null;
048:
049: /** Logging */
050: private static Log log = LogFactory.getLog(DTDResolver.class);
051:
052: /**
053: * constructor
054: */
055: public DTDResolver() {
056: try {
057: InputStream dtdStream = getClass().getResourceAsStream(
058: "intake.dtd");
059:
060: // getResource was buggy on many systems including Linux,
061: // OSX, and some versions of windows in jdk1.3.
062: // getResourceAsStream works on linux, maybe others?
063: if (dtdStream != null) {
064: intakeDTD = new InputSource(dtdStream);
065: } else {
066: log.warn("Could not located the intake.dtd");
067: }
068: } catch (Exception ex) {
069: log.error("Could not get stream for dtd", ex);
070: }
071: }
072:
073: /**
074: * called by the XML parser
075: *
076: * @return an InputSource for the intake.dtd file
077: */
078: public InputSource resolveEntity(String publicId, String systemId) {
079: if (intakeDTD != null && WEB_SITE_DTD.equals(systemId)) {
080: String pkg = getClass().getName().substring(0,
081: getClass().getName().lastIndexOf("."));
082:
083: log.info("Resolver: used intake.dtd from " + pkg
084: + " package ");
085:
086: return intakeDTD;
087: } else if (systemId == null) {
088: log.info("Resolver: used intake.dtd from Turbine Web site");
089: return getInputSource(WEB_SITE_DTD);
090: } else {
091: log.info("Resolver: used System DTD for " + systemId);
092: return getInputSource(systemId);
093: }
094: }
095:
096: /**
097: * Retrieves a XML input source for the specified URL.
098: *
099: * @param urlString The URL of the input source.
100: * @return <code>InputSource</code> for the URL.
101: */
102: private InputSource getInputSource(String urlString) {
103: try {
104: URL url = new URL(urlString);
105: return new InputSource(url.openStream());
106: } catch (IOException ex) {
107: log.error("Could not get InputSource for " + urlString, ex);
108: }
109: return new InputSource();
110: }
111: }
|