141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan.
241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//
341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// TagSoup is licensed under the Apache License,
441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// Version 2.0.  You may obtain a copy of this license at
541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// http://www.apache.org/licenses/LICENSE-2.0 .  You may also have
641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// additional legal rights not granted by this license.
741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project//
841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// TagSoup is distributed in the hope that it will be useful, but
941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// unless required by applicable law or agreed to in writing, TagSoup
1041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
1141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// OF ANY KIND, either express or implied; not even the implied warranty
1241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
1441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectpackage org.ccil.cowan.tagsoup.jaxp;
1541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
1641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.io.*;
1741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.util.*;
1841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport javax.xml.parsers.*;
1941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
2041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.*;
2141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
2241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.ccil.cowan.tagsoup.Parser;
2341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
2441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project/**
2541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * This is a simple implementation of JAXP {@link SAXParser},
2641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * to allow easier integration of TagSoup with the default JDK
2741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * xml processing stack.
2841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project *
2941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @author Tatu Saloranta (cowtowncoder@yahoo.com)
3041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */
3141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectpublic class SAXParserImpl
3241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    extends SAXParser
3341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project{
3441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    final org.ccil.cowan.tagsoup.Parser parser;
3541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
3641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    protected SAXParserImpl() // used by factory, for prototypes
3741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
3841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        super();
3941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        parser = new org.ccil.cowan.tagsoup.Parser();
4041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
4141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
4241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public static SAXParserImpl newInstance(Map features)
4341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
4441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
4541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        SAXParserImpl parser = new SAXParserImpl();
4641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        if (features != null) {
4741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            Iterator it = features.entrySet().iterator();
4841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            while (it.hasNext()) {
4941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                Map.Entry entry = (Map.Entry) it.next();
5041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project                parser.setFeature((String) entry.getKey(), ((Boolean) entry.getValue()).booleanValue());
5141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            }
5241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
5341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        return parser;
5441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
5541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
5641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // // // JAXP API implementation:
5741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
5841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    /**
5941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * To support SAX1 interface, we'll need to use an adapter.
6041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     * @deprecated
6141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project     */
6241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public org.xml.sax.Parser getParser()
6341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXException
6441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
6541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        return new SAX1ParserAdapter(parser);
6641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
6741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
6841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public XMLReader getXMLReader() { return parser; }
6941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
7041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public boolean isNamespaceAware()
7141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
7241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        try {
7341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            return parser.getFeature(Parser.namespacesFeature);
7441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        } catch (SAXException sex) { // should never happen... so:
7541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            throw new RuntimeException(sex.getMessage());
7641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
7741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
7841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
7941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public boolean isValidating()
8041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
8141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        try {
8241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            return parser.getFeature(Parser.validationFeature);
8341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        } catch (SAXException sex) { // should never happen... so:
8441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project            throw new RuntimeException(sex.getMessage());
8541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        }
8641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
8741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
8841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void setProperty(String name, Object value)
8941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXNotRecognizedException, SAXNotSupportedException
9041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
9141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        parser.setProperty(name, value);
9241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
9341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
9441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public Object getProperty(String name)
9541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXNotRecognizedException, SAXNotSupportedException
9641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
9741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        return parser.getProperty(name);
9841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
9941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
10041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    // // // Additional convenience methods
10141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
10241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public void setFeature(String name, boolean value)
10341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXNotRecognizedException, SAXNotSupportedException
10441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
10541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        parser.setFeature(name, value);
10641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
10741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project
10841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    public boolean getFeature(String name)
10941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        throws SAXNotRecognizedException, SAXNotSupportedException
11041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    {
11141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project        return parser.getFeature(name);
11241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project    }
11341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project}
114