001 /* 002 * Copyright 2009 - 2010 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 $ */ 018 019 package net.sourceforge.jeuclid.biparser; 020 021 import java.io.IOException; 022 import java.io.StringReader; 023 024 import javax.xml.parsers.ParserConfigurationException; 025 import javax.xml.parsers.SAXParser; 026 import javax.xml.parsers.SAXParserFactory; 027 028 import org.xml.sax.InputSource; 029 import org.xml.sax.SAXException; 030 import org.xml.sax.SAXParseException; 031 import org.xml.sax.helpers.DefaultHandler; 032 033 /** 034 * this class is creates a SAXParser as singleton. 035 * 036 * @version $Revision: 0b66106c7ff7 $ 037 */ 038 public final class SAXBiParser { 039 040 /** hide constructor. */ 041 private SAXBiParser() { 042 } 043 044 /** make a new SAXBiParser object as singleton. */ 045 private static final class SingletonHolder { 046 047 /** make only one instance of SAXBiParser. */ 048 private static final SAXBiParser INSTANCE = new SAXBiParser(); 049 050 /** hide constructor. */ 051 private SingletonHolder() { 052 } 053 } 054 055 /** 056 * get the instance of the SAXParser. 057 * 058 * @return the singleton instance of the SAXParser 059 */ 060 public static SAXBiParser getInstance() { 061 return SAXBiParser.SingletonHolder.INSTANCE; 062 } 063 064 /** 065 * parse a text with SAXParser. 066 * 067 * @param text 068 * inputtext to parse 069 * @return result BiTree of parsed inputtext 070 * @throws NonIncrementalElementException 071 * if the subtree contains an element which cannot be 072 * incrementally updated. 073 */ 074 public BiTree parse(final String text) 075 throws NonIncrementalElementException { 076 BiTree tree; 077 DefaultHandler handler; 078 SAXParserFactory factory; 079 SAXParser saxParser; 080 StringReader inStream; 081 InputSource inSource; 082 083 tree = new BiTree(); 084 handler = new JEuclidSAXHandler(text, tree); 085 factory = SAXParserFactory.newInstance(); 086 inStream = new StringReader(text); 087 inSource = new InputSource(inStream); 088 089 try { 090 factory.setNamespaceAware(true); 091 factory.setValidating(false); 092 093 saxParser = factory.newSAXParser(); 094 saxParser.parse(inSource, handler); 095 } catch (final NonIncrementalElementException e) { 096 throw e; 097 } catch (final SAXParseException e) { 098 tree = null; 099 } catch (final ParserConfigurationException e) { 100 e.printStackTrace(); 101 tree = null; 102 } catch (final SAXException e) { 103 e.printStackTrace(); 104 tree = null; 105 } catch (final IOException e) { 106 e.printStackTrace(); 107 tree = null; 108 } 109 return tree; 110 } 111 }