cachingparserpool.java
来自「JAVA 所有包」· Java 代码 · 共 428 行 · 第 1/2 页
JAVA
428 行
/* * Copyright 1999-2002,2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */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.2.6.1 2005/09/06 12:54:14 sunithareddy 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 { // // Data // /** Main grammar pool. */ private XMLGrammarPool fGrammarPool; // // Constructors // /** Constructs a synchronized grammar pool. */ public SynchronizedGrammarPool(XMLGrammarPool grammarPool) { fGrammarPool = grammarPool; } // <init>(XMLGrammarPool) // // GrammarPool methods //
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?