001    /*
002     * Copyright 2002 - 2007 JEuclid, http://jeuclid.sf.net
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    
017    /* $Id: ResourceEntityResolver.java,v 2bab6eb875e8 2010/08/11 16:45:50 max $ */
018    
019    package net.sourceforge.jeuclid;
020    
021    import java.io.InputStream;
022    import java.util.HashMap;
023    import java.util.Map;
024    
025    import javax.annotation.concurrent.ThreadSafe;
026    
027    import org.xml.sax.EntityResolver;
028    import org.xml.sax.InputSource;
029    
030    /**
031     * Entity Resolver for standard MathML entities.
032     * <p>
033     * This class contains support for resolving all entities which are in the
034     * default MathML namespaces. It currently has support for
035     * <ul>
036     * <li>MathML 1.0.1</li>
037     * <li>OpenOffice MathML 1.0.1</li>
038     * <li>MathML 2.0</li>
039     * </ul>
040     * 
041     * @version $Revision: 2bab6eb875e8 $
042     */
043    @ThreadSafe
044    public class ResourceEntityResolver implements EntityResolver {
045    
046        /**
047         * The system ID for mathML.
048         */
049        public static final String MML2_SYSTEMID = "http://www.w3.org/TR/MathML2/dtd/mathml2.dtd";
050    
051        /**
052         * The public ID for mathML.
053         */
054        public static final String MML2_PUBLICID = "-//W3C//DTD MathML 2.0//EN";
055    
056        private static final String MML1_SYSTEMID_PATH = "http://www.w3.org/Math/DTD/mathml1";
057    
058        private static final Map<String, String> PUBLIC_ID_TO_INTERNAL = new HashMap<String, String>();
059    
060        private static final Map<String, String> PUBLIC_ID_TO_SYSYEM = new HashMap<String, String>();
061    
062        /**
063         * Default constructor.
064         */
065        public ResourceEntityResolver() {
066            // Empty on purpose.
067        }
068    
069        /** {@inheritDoc} */
070        public InputSource resolveEntity(final String publicId,
071                final String systemId) {
072            InputSource retval = null;
073    
074            String mappedPath = ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL
075                    .get(publicId);
076    
077            if ((mappedPath == null)
078                    && (systemId
079                            .startsWith(ResourceEntityResolver.MML1_SYSTEMID_PATH))) {
080                mappedPath = "/net/sourceforge/jeuclid/mathml.1.0.1"
081                        + systemId
082                                .substring(ResourceEntityResolver.MML1_SYSTEMID_PATH
083                                        .length());
084            }
085            if (mappedPath != null) {
086                retval = this.loadMappedResource(publicId, systemId, mappedPath);
087            }
088            return retval;
089        }
090    
091        private InputSource loadMappedResource(final String publicId,
092                final String systemId, final String mappedPath) {
093            InputSource retval = null;
094            final InputStream resourceStream = ResourceEntityResolver.class
095                    .getResourceAsStream(mappedPath);
096            if (resourceStream != null) {
097                retval = new InputSource(resourceStream);
098                retval.setPublicId(publicId);
099                String mappedSystemId = ResourceEntityResolver.PUBLIC_ID_TO_SYSYEM
100                        .get(publicId);
101                if (mappedSystemId == null) {
102                    mappedSystemId = systemId;
103                }
104                retval.setSystemId(mappedSystemId);
105            }
106            return retval;
107        }
108    
109        static {
110            // CHECKSTYLE:OFF
111            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
112                    "-//OpenOffice.org//DTD Modified W3C MathML 1.01//EN",
113                    "/net/sourceforge/jeuclid/openoffice.mathml.1.0.1/math.dtd");
114    
115            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
116                    ResourceEntityResolver.MML2_PUBLICID,
117                    "/net/sourceforge/jeuclid/mathml.2.0/mathml2.dtd");
118    
119            ResourceEntityResolver.PUBLIC_ID_TO_SYSYEM.put(
120                    ResourceEntityResolver.MML2_PUBLICID,
121                    ResourceEntityResolver.MML2_SYSTEMID);
122    
123            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
124                    "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN",
125                    "/net/sourceforge/jeuclid/mathml.2.0/xhtml-math11-f.dtd");
126            ResourceEntityResolver.PUBLIC_ID_TO_SYSYEM.put(
127                    "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN",
128                    "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd");
129    
130            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
131                    "-//W3C//ENTITIES MathML 2.0 Qualified Names 1.0//EN",
132                    "/net/sourceforge/jeuclid/mathml.2.0/mathml2-qname-1.mod");
133            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL
134                    .put(
135                            "-//W3C//ENTITIES Added Math Symbols: Arrow Relations for MathML 2.0//EN",
136                            "/net/sourceforge/jeuclid/mathml.2.0/iso9573-13/isoamsa.ent");
137            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL
138                    .put(
139                            "-//W3C//ENTITIES Added Math Symbols: Binary Operators for MathML 2.0//EN",
140                            "/net/sourceforge/jeuclid/mathml.2.0/iso9573-13/isoamsb.ent");
141            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL
142                    .put(
143                            "-//W3C//ENTITIES Added Math Symbols: Delimiters for MathML 2.0//EN",
144                            "/net/sourceforge/jeuclid/mathml.2.0/iso9573-13/isoamsc.ent");
145            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL
146                    .put(
147                            "-//W3C//ENTITIES Added Math Symbols: Negated Relations for MathML 2.0//EN",
148                            "/net/sourceforge/jeuclid/mathml.2.0/iso9573-13/isoamsn.ent");
149            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL
150                    .put(
151                            "-//W3C//ENTITIES Added Math Symbols: Ordinary for MathML 2.0//EN",
152                            "/net/sourceforge/jeuclid/mathml.2.0/iso9573-13/isoamso.ent");
153            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL
154                    .put(
155                            "-//W3C//ENTITIES Added Math Symbols: Relations for MathML 2.0//EN",
156                            "/net/sourceforge/jeuclid/mathml.2.0/iso9573-13/isoamsr.ent");
157            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
158                    "-//W3C//ENTITIES Greek Symbols for MathML 2.0//EN",
159                    "/net/sourceforge/jeuclid/mathml.2.0/iso9573-13/isogrk3.ent");
160            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
161                    "-//W3C//ENTITIES Math Alphabets: Fraktur for MathML 2.0//EN",
162                    "/net/sourceforge/jeuclid/mathml.2.0/iso9573-13/isomfrk.ent");
163            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL
164                    .put(
165                            "-//W3C//ENTITIES Math Alphabets: Open Face for MathML 2.0//EN",
166                            "/net/sourceforge/jeuclid/mathml.2.0/iso9573-13/isomopf.ent");
167            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
168                    "-//W3C//ENTITIES Math Alphabets: Script for MathML 2.0//EN",
169                    "/net/sourceforge/jeuclid/mathml.2.0/iso9573-13/isomscr.ent");
170            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
171                    "-//W3C//ENTITIES General Technical for MathML 2.0//EN",
172                    "/net/sourceforge/jeuclid/mathml.2.0/iso9573-13/isotech.ent");
173            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
174                    "-//W3C//ENTITIES Box and Line Drawing for MathML 2.0//EN",
175                    "/net/sourceforge/jeuclid/mathml.2.0/iso8879/isobox.ent");
176            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
177                    "-//W3C//ENTITIES Russian Cyrillic for MathML 2.0//EN",
178                    "/net/sourceforge/jeuclid/mathml.2.0/iso8879/isocyr1.ent");
179            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
180                    "-//W3C//ENTITIES Non-Russian Cyrillic for MathML 2.0//EN",
181                    "/net/sourceforge/jeuclid/mathml.2.0/iso8879/isocyr2.ent");
182            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
183                    "-//W3C//ENTITIES Diacritical Marks for MathML 2.0//EN",
184                    "/net/sourceforge/jeuclid/mathml.2.0/iso8879/isodia.ent");
185            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
186                    "-//W3C//ENTITIES Added Latin 1 for MathML 2.0//EN",
187                    "/net/sourceforge/jeuclid/mathml.2.0/iso8879/isolat1.ent");
188            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
189                    "-//W3C//ENTITIES Added Latin 2 for MathML 2.0//EN",
190                    "/net/sourceforge/jeuclid/mathml.2.0/iso8879/isolat2.ent");
191            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL
192                    .put(
193                            "-//W3C//ENTITIES Numeric and Special Graphic for MathML 2.0//EN",
194                            "/net/sourceforge/jeuclid/mathml.2.0/iso8879/isonum.ent");
195            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
196                    "-//W3C//ENTITIES Publishing for MathML 2.0//EN",
197                    "/net/sourceforge/jeuclid/mathml.2.0/iso8879/isopub.ent");
198            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
199                    "-//W3C//ENTITIES Extra for MathML 2.0//EN",
200                    "/net/sourceforge/jeuclid/mathml.2.0/mathml/mmlextra.ent");
201            ResourceEntityResolver.PUBLIC_ID_TO_INTERNAL.put(
202                    "-//W3C//ENTITIES Aliases for MathML 2.0//EN",
203                    "/net/sourceforge/jeuclid/mathml.2.0/mathml/mmlalias.ent");
204            // CHECKSTYLE:ON
205    
206        }
207    }