/* * Copyright 2008 biaoping.yin * * 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.frameworkset.orm.engine.transform; /* * * 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. */ import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.net.URL; import org.apache.log4j.Logger; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; /** * A resolver to get the database.dtd file for the XML parser from the jar. * * @author <a href="mailto:mpoeschl@marmot.at">Martin Poeschl</a> * @author <a href="mailto:kschrader@karmalab.org">Kurt Schrader</a> * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a> * @version $Id: DTDResolver.java,v 1.12 2004/10/12 22:02:01 dlr Exp $ */ public class DTDResolver implements EntityResolver,Serializable { /** Where the DTD is located on the web. */ public static final String WEB_SITE_DTD = "http://db.apache.org/torque/dtd/database_3_2.dtd"; /** InputSource for <code>database.dtd</code>. */ private InputSource databaseDTD = null; /** Logging class from commons.logging */ private static Logger log = Logger.getLogger(DTDResolver.class); /** * constructor */ public DTDResolver() throws SAXException { try { InputStream dtdStream = getClass().getResourceAsStream("database.dtd"); // getResource was buggy on many systems including Linux, // OSX, and some versions of windows in jdk1.3. // getResourceAsStream works on linux, maybe others? if (dtdStream != null) { databaseDTD = new InputSource(dtdStream); } else { log.warn("Could not locate database.dtd"); } } catch (Exception ex) { throw new SAXException("Could not get stream for database.dtd", ex); } } /** * An implementation of the SAX <code>EntityResolver</code> * interface to be called by the XML parser. * * @param publicId The public identifier of the external entity * @param systemId The system identifier of the external entity * @return An <code>InputSource</code> for the * <code>database.dtd</code> file. */ public InputSource resolveEntity(String publicId, String systemId) throws IOException { if (databaseDTD != null && WEB_SITE_DTD.equals(systemId)) { String pkg = getClass().getName().substring(0, getClass().getName().lastIndexOf('.')); log.info("Resolver: used database.dtd from '" + pkg + "' package"); return databaseDTD; } else if (systemId == null || "".equals(systemId.trim())) { log.info("Resolver: used '" + WEB_SITE_DTD + '\''); return getInputSource(WEB_SITE_DTD); } else { log.info("Resolver: used '" + systemId + '\''); return getInputSource(systemId); } } /** * Retrieves a XML input source for the specified URL. * * @param urlString The URL of the input source. * @return <code>InputSource</code> for the URL. */ private InputSource getInputSource(String urlString) throws IOException { URL url = new URL(urlString); return new InputSource(url.openStream()); } }