001 package org.apache.fulcrum.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 542371 2007-05-29 01:29:44Z seade $
042 */
043 public class DTDResolver implements EntityResolver
044 {
045 private static final String WEB_SITE_DTD =
046 "http://turbine.apache.org/dtd/intake_2_4.dtd";
047
048 /** InputSource for <code>intake.dtd</code>. */
049 private InputSource intakeDTD = null;
050
051 /** Logging */
052 private static Log log = LogFactory.getLog(DTDResolver.class);
053
054 /**
055 * constructor
056 */
057 public DTDResolver()
058 {
059 try
060 {
061 // Search for DTD
062 ClassLoader classLoader = this.getClass().getClassLoader();
063
064 InputStream dtdStream =
065 classLoader.getResourceAsStream("intake.dtd");
066
067 // getResource was buggy on many systems including Linux,
068 // OSX, and some versions of windows in jdk1.3.
069 // getResourceAsStream works on linux, maybe others?
070 if (dtdStream != null)
071 {
072 intakeDTD = new InputSource(dtdStream);
073 }
074 else
075 {
076 log.warn("Could not locate the intake.dtd");
077 }
078 }
079 catch (Exception ex)
080 {
081 log.error("Could not get stream for dtd", ex);
082 }
083 }
084
085 /**
086 * called by the XML parser
087 *
088 * @return an InputSource for the intake.dtd file
089 */
090 public InputSource resolveEntity(String publicId, String systemId)
091 {
092 if (intakeDTD != null && WEB_SITE_DTD.equals(systemId))
093 {
094 String pkg = getClass().getName()
095 .substring(0, getClass().getName().lastIndexOf("."));
096
097 log.info("Resolver: used intake.dtd from " +
098 pkg + " package ");
099
100 return intakeDTD;
101 }
102 else if (systemId == null)
103 {
104 log.info("Resolver: used intake.dtd from Turbine Web site");
105 return getInputSource(WEB_SITE_DTD);
106 }
107 else
108 {
109 log.info("Resolver: used System DTD for " + systemId);
110 return getInputSource(systemId);
111 }
112 }
113
114 /**
115 * Retrieves a XML input source for the specified URL.
116 *
117 * @param urlString The URL of the input source.
118 * @return <code>InputSource</code> for the URL.
119 */
120 private InputSource getInputSource(String urlString)
121 {
122 try
123 {
124 URL url = new URL(urlString);
125 return new InputSource(url.openStream());
126 }
127 catch (IOException ex)
128 {
129 log.error("Could not get InputSource for " + urlString, ex);
130 }
131 return new InputSource();
132 }
133 }