cachingparserpool.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 469 行 · 第 1/2 页

JAVA
469
字号
/* * The Apache Software License, Version 1.1 * * * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights  * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. The end-user documentation included with the redistribution, *    if any, must include the following acknowledgment:   *       "This product includes software developed by the *        Apache Software Foundation (http://www.apache.org/)." *    Alternately, this acknowledgment may appear in the software itself, *    if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xerces" and "Apache Software Foundation" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written  *    permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", *    nor may "Apache" appear in their name, without prior written *    permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 1999, International * Business Machines, Inc., http://www.apache.org.  For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */package com.sun.org.apache.xerces.internal.parsers;import com.sun.org.apache.xerces.internal.xni.grammars.Grammar;import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarPool;import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarDescription;import com.sun.org.apache.xerces.internal.util.XMLGrammarPoolImpl;import com.sun.org.apache.xerces.internal.util.ShadowedSymbolTable;import com.sun.org.apache.xerces.internal.util.SymbolTable;import com.sun.org.apache.xerces.internal.util.SynchronizedSymbolTable;/** * A parser pool that enables caching of grammars. The caching parser * pool is constructed with a specific symbol table and grammar pool * that has already been populated with the grammars used by the * application. * <p> * Once the caching parser pool is constructed, specific parser * instances are created by calling the appropriate factory method * on the parser pool. * <p> * <strong>Note:</strong> There is a performance penalty for using * a caching parser pool due to thread safety. Access to the symbol  * table and grammar pool must be synchronized to ensure the safe * operation of the symbol table and grammar pool. * <p> * <strong>Note:</strong> If performance is critical, then another * mechanism needs to be used instead of the caching parser pool. * One approach would be to create parser instances that do not * share these structures. Instead, each instance would get its * own copy to use while parsing. This avoids the synchronization * overhead at the expense of more memory and the time required * to copy the structures for each new parser instance. And even * when a parser instance is re-used, there is a potential for a * memory leak due to new symbols being added to the symbol table * over time. In other words, always take caution to make sure * that your application is thread-safe and avoids leaking memory. * * @author Andy Clark, IBM * * @version $Id: CachingParserPool.java,v 1.11 2002/06/01 16:36:36 elena Exp $ */public class CachingParserPool {    //    // Constants    //    /** Default shadow symbol table (false). */    public static final boolean DEFAULT_SHADOW_SYMBOL_TABLE = false;    /** Default shadow grammar pool (false). */    public static final boolean DEFAULT_SHADOW_GRAMMAR_POOL = false;    //    // Data    //    /**      * Symbol table. The symbol table that the caching parser pool is     * constructed with is automatically wrapped in a synchronized     * version for thread-safety.     */    protected SymbolTable fSynchronizedSymbolTable;    /**      * Grammar pool. The grammar pool that the caching parser pool is     * constructed with is automatically wrapped in a synchronized     * version for thread-safety.     */    protected XMLGrammarPool fSynchronizedGrammarPool;    /**      * Shadow the symbol table for new parser instances. If true,     * new parser instances use shadow copies of the main symbol     * table and are not allowed to add new symbols to the main     * symbol table. New symbols are added to the shadow symbol     * table and are local to the parser instance.     */    protected boolean fShadowSymbolTable = DEFAULT_SHADOW_SYMBOL_TABLE;    /**      * Shadow the grammar pool for new parser instances. If true,     * new parser instances use shadow copies of the main grammar     * pool and are not allowed to add new grammars to the main     * grammar pool. New grammars are added to the shadow grammar     * pool and are local to the parser instance.     */    protected boolean fShadowGrammarPool = DEFAULT_SHADOW_GRAMMAR_POOL;    //    // Constructors    //    /** Default constructor. */    public CachingParserPool() {        this(new SymbolTable(), new XMLGrammarPoolImpl());    } // <init>()    /**     * Constructs a caching parser pool with the specified symbol table     * and grammar pool.     *      * @param symbolTable The symbol table.     * @param grammarPool The grammar pool.     */    public CachingParserPool(SymbolTable symbolTable, XMLGrammarPool grammarPool) {        fSynchronizedSymbolTable = new SynchronizedSymbolTable(symbolTable);        fSynchronizedGrammarPool = new SynchronizedGrammarPool(grammarPool);    } // <init>(SymbolTable,XMLGrammarPool)    //    // Public methods    //    /** Returns the symbol table. */    public SymbolTable getSymbolTable() {        return fSynchronizedSymbolTable;    } // getSymbolTable():SymbolTable    /** Returns the grammar pool. */    public XMLGrammarPool getXMLGrammarPool() {        return fSynchronizedGrammarPool;    } // getXMLGrammarPool():XMLGrammarPool    // setters and getters    /**      * Sets whether new parser instance receive shadow copies of the     * main symbol table.     *     * @param shadow If true, new parser instances use shadow copies      *               of the main symbol table and are not allowed to     *               add new symbols to the main symbol table. New     *               symbols are added to the shadow symbol table and     *               are local to the parser instance. If false, new     *               parser instances are allowed to add new symbols     *               to the main symbol table.     */    public void setShadowSymbolTable(boolean shadow) {        fShadowSymbolTable = shadow;    } // setShadowSymbolTable(boolean)    // factory methods    /** Creates a new DOM parser. */    public DOMParser createDOMParser() {        SymbolTable symbolTable = fShadowSymbolTable                                ? new ShadowedSymbolTable(fSynchronizedSymbolTable)                                : fSynchronizedSymbolTable;        XMLGrammarPool grammarPool = fShadowGrammarPool                                ? new ShadowedGrammarPool(fSynchronizedGrammarPool)                                : fSynchronizedGrammarPool;        return new DOMParser(symbolTable, grammarPool);    } // createDOMParser():DOMParser    /** Creates a new SAX parser. */    public SAXParser createSAXParser() {        SymbolTable symbolTable = fShadowSymbolTable                                ? new ShadowedSymbolTable(fSynchronizedSymbolTable)                                : fSynchronizedSymbolTable;        XMLGrammarPool grammarPool = fShadowGrammarPool                                ? new ShadowedGrammarPool(fSynchronizedGrammarPool)                                : fSynchronizedGrammarPool;        return new SAXParser(symbolTable, grammarPool);    } // createSAXParser():SAXParser    //    // Classes    //    /**     * Synchronized grammar pool.     *     * @author Andy Clark, IBM     */    public static final class SynchronizedGrammarPool        implements XMLGrammarPool {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?