aoqi@0: /* aoqi@0: * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. Oracle designates this aoqi@0: * particular file as subject to the "Classpath" exception as provided aoqi@0: * by Oracle in the LICENSE file that accompanied this code. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: package com.sun.xml.internal.messaging.saaj.util; aoqi@0: aoqi@0: aoqi@0: import org.xml.sax.SAXException; aoqi@0: import java.util.concurrent.ArrayBlockingQueue; aoqi@0: import java.util.concurrent.BlockingQueue; aoqi@0: import javax.xml.parsers.ParserConfigurationException; aoqi@0: import javax.xml.parsers.SAXParser; aoqi@0: import javax.xml.parsers.SAXParserFactory; aoqi@0: import org.xml.sax.SAXNotRecognizedException; aoqi@0: import org.xml.sax.SAXNotSupportedException; aoqi@0: aoqi@0: aoqi@0: /** aoqi@0: * Pool of SAXParser objects aoqi@0: */ aoqi@0: public class ParserPool { aoqi@0: private final BlockingQueue queue; aoqi@0: private SAXParserFactory factory; aoqi@0: private int capacity; aoqi@0: aoqi@0: public ParserPool(int capacity) { aoqi@0: this.capacity = capacity; aoqi@0: queue = new ArrayBlockingQueue(capacity); aoqi@0: //factory = SAXParserFactory.newInstance(); aoqi@0: factory = new com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl(); aoqi@0: factory.setNamespaceAware(true); aoqi@0: for (int i=0; i < capacity; i++) { aoqi@0: try { aoqi@0: queue.put(factory.newSAXParser()); aoqi@0: } catch (InterruptedException ex) { aoqi@0: Thread.currentThread().interrupt(); aoqi@0: throw new RuntimeException(ex); aoqi@0: } catch (ParserConfigurationException ex) { aoqi@0: throw new RuntimeException(ex); aoqi@0: } catch (SAXException ex) { aoqi@0: throw new RuntimeException(ex); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: public SAXParser get() throws ParserConfigurationException, aoqi@0: SAXException { aoqi@0: aoqi@0: try { aoqi@0: return (SAXParser) queue.take(); aoqi@0: } catch (InterruptedException ex) { aoqi@0: throw new SAXException(ex); aoqi@0: } aoqi@0: aoqi@0: } aoqi@0: aoqi@0: public void put(SAXParser parser) { aoqi@0: queue.offer(parser); aoqi@0: } aoqi@0: aoqi@0: public void returnParser(SAXParser saxParser) { aoqi@0: saxParser.reset(); aoqi@0: resetSaxParser(saxParser); aoqi@0: put(saxParser); aoqi@0: } aoqi@0: aoqi@0: aoqi@0: /** aoqi@0: * SAAJ Issue 46 :https://saaj.dev.java.net/issues/show_bug.cgi?id=46 aoqi@0: * Xerces does not provide a way to reset the SymbolTable aoqi@0: * So we are trying to reset it using the proprietary code below. aoqi@0: * Temporary Until the bug : https://jaxp.dev.java.net/issues/show_bug.cgi?id=59 aoqi@0: * is fixed. aoqi@0: * @param parser the parser from the pool whose Symbol Table needs to be reset. aoqi@0: */ aoqi@0: private void resetSaxParser(SAXParser parser) { aoqi@0: try { aoqi@0: //Object obj = parser.getProperty("http://apache.org/xml/properties/internal/symbol-table"); aoqi@0: com.sun.org.apache.xerces.internal.util.SymbolTable table = new com.sun.org.apache.xerces.internal.util.SymbolTable(); aoqi@0: parser.setProperty("http://apache.org/xml/properties/internal/symbol-table", table); aoqi@0: //obj = parser.getProperty("http://apache.org/xml/properties/internal/symbol-table"); aoqi@0: } catch (SAXNotRecognizedException ex) { aoqi@0: //nothing to do aoqi@0: } catch (SAXNotSupportedException ex) { aoqi@0: //nothing to do aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: }