001: /*
002: * Copyright 2004 Clinton Begin
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package com.ibatis.sqlmap.engine.builder.xml;
017:
018: import com.ibatis.common.resources.Resources;
019: import org.xml.sax.EntityResolver;
020: import org.xml.sax.InputSource;
021: import org.xml.sax.SAXException;
022:
023: import java.io.IOException;
024: import java.io.InputStream;
025: import java.util.HashMap;
026: import java.util.Map;
027:
028: /**
029: * Offline entity resolver for the iBATIS DTDs
030: */
031: public class SqlMapClasspathEntityResolver implements EntityResolver {
032:
033: private static final String SQL_MAP_CONFIG_DTD = "com/ibatis/sqlmap/engine/builder/xml/sql-map-config-2.dtd";
034: private static final String SQL_MAP_DTD = "com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd";
035:
036: private static final Map doctypeMap = new HashMap();
037:
038: static {
039: doctypeMap.put("http://www.ibatis.com/dtd/sql-map-config-2.dtd"
040: .toUpperCase(), SQL_MAP_CONFIG_DTD);
041: doctypeMap.put(
042: "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"
043: .toUpperCase(), SQL_MAP_CONFIG_DTD);
044: doctypeMap.put("-//iBATIS.com//DTD SQL Map Config 2.0//EN"
045: .toUpperCase(), SQL_MAP_CONFIG_DTD);
046: doctypeMap.put(
047: "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
048: .toUpperCase(), SQL_MAP_CONFIG_DTD);
049:
050: doctypeMap.put("http://www.ibatis.com/dtd/sql-map-2.dtd"
051: .toUpperCase(), SQL_MAP_DTD);
052: doctypeMap.put("http://ibatis.apache.org/dtd/sql-map-2.dtd"
053: .toUpperCase(), SQL_MAP_DTD);
054: doctypeMap.put("-//iBATIS.com//DTD SQL Map 2.0//EN"
055: .toUpperCase(), SQL_MAP_DTD);
056: doctypeMap.put("-//ibatis.apache.org//DTD SQL Map 2.0//EN"
057: .toUpperCase(), SQL_MAP_DTD);
058: }
059:
060: /**
061: * Converts a public DTD into a local one
062: *
063: * @param publicId Unused but required by EntityResolver interface
064: * @param systemId The DTD that is being requested
065: * @return The InputSource for the DTD
066: * @throws SAXException If anything goes wrong
067: */
068: public InputSource resolveEntity(String publicId, String systemId)
069: throws SAXException {
070:
071: if (publicId != null)
072: publicId = publicId.toUpperCase();
073: if (systemId != null)
074: systemId = systemId.toUpperCase();
075:
076: InputSource source = null;
077: try {
078: String path = (String) doctypeMap.get(publicId);
079: source = getInputSource(path, source);
080: if (source == null) {
081: path = (String) doctypeMap.get(systemId);
082: source = getInputSource(path, source);
083: }
084: } catch (Exception e) {
085: throw new SAXException(e.toString());
086: }
087: return source;
088: }
089:
090: private InputSource getInputSource(String path, InputSource source) {
091: if (path != null) {
092: InputStream in = null;
093: try {
094: in = Resources.getResourceAsStream(path);
095: source = new InputSource(in);
096: } catch (IOException e) {
097: // ignore, null is ok
098: }
099: }
100: return source;
101: }
102:
103: }
|