stephan 2002/09/17 05:07:44 Modified: . changes.xml module.xml properties.xml Added: src/blocks/chaperon/conf chaperon.generator.xmap chaperon.transformator.xmap src/blocks/chaperon/java/org/apache/cocoon/generation TextParserGenerator.java src/blocks/chaperon/java/org/apache/cocoon/transformation TextFragmentParserTransformer.java Removed: src/java/org/apache/cocoon/generation TextParserGenerator.java chaperon.xmap src/java/org/apache/cocoon/transformation TextFragmentParserTransformer.java chaperon.xmap Log: Enabled the chaperon text parser as block. Revision Changes Path 1.250 +4 -1 xml-cocoon2/changes.xml Index: changes.xml =================================================================== RCS file: /home/cvs/xml-cocoon2/changes.xml,v retrieving revision 1.249 retrieving revision 1.250 diff -u -r1.249 -r1.250 --- changes.xml 16 Sep 2002 15:35:33 -0000 1.249 +++ changes.xml 17 Sep 2002 12:07:44 -0000 1.250 @@ -40,6 +40,9 @@ </devs> <release version="@version@" date="@date@"> + <action dev="SMS" type="update"> + Enabled the chaperon text parser as block. + </action> <action dev="NKB" type="add"> Added initial support for compilation of Cocoon blocks, and migrated Fop and Batik classes and configuration to the src/blocks dir. 1.4 +21 -0 xml-cocoon2/module.xml Index: module.xml =================================================================== RCS file: /home/cvs/xml-cocoon2/module.xml,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- module.xml 16 Sep 2002 15:35:21 -0000 1.3 +++ module.xml 17 Sep 2002 12:07:44 -0000 1.4 @@ -56,6 +56,7 @@ <!-- <option project="jakarta-poi"/> --> <option project="commons-logging" version="supplied"/> <option project="jakarta-slide" ids="kernel" version="supplied"/> + <option project="chaperon" version="supplied"/> <work nested="build/cocoon/classes"/> <work nested="tools/anttasks"/> @@ -109,6 +110,26 @@ <home nested="build/cocoon"/> <jar name="batik-block.jar"/> + + <nag from="Nicola Ken Barozzi <[EMAIL PROTECTED]>" + to="[EMAIL PROTECTED]"/> + + </project> + + <project name="chaperon-block"> + <package>org.apache.cocoon</package> + + <ant target="block"> + <property name="block-name" value="chaperon"/> + </ant> + + <depend project="xml-cocoon2"/> + <depend project="chaperon" version="supplied"/> + + <work nested="tools/anttasks"/> + <home nested="build/cocoon"/> + + <jar name="chaperon-block.jar"/> <nag from="Nicola Ken Barozzi <[EMAIL PROTECTED]>" to="[EMAIL PROTECTED]"/> 1.4 +1 -0 xml-cocoon2/properties.xml Index: properties.xml =================================================================== RCS file: /home/cvs/xml-cocoon2/properties.xml,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- properties.xml 16 Sep 2002 15:35:14 -0000 1.3 +++ properties.xml 17 Sep 2002 12:07:44 -0000 1.4 @@ -103,6 +103,7 @@ <blocks> <fop include="true"/> <batik include="true"/> + <chaperon include="true"/> </blocks> </cocoon> 1.1 xml-cocoon2/src/blocks/chaperon/conf/chaperon.generator.xmap Index: chaperon.generator.xmap =================================================================== <?xml version="1.0"?> <xmap xpath="/sitemap/components/generators" unless="generator[@name='textparser']"> <map:generator label="content,data" logger="sitemap.generator.textparser" name="textparser" src="org.apache.cocoon.generation.TextParserGenerator"/> </xmap> 1.1 xml-cocoon2/src/blocks/chaperon/conf/chaperon.transformator.xmap Index: chaperon.transformator.xmap =================================================================== <?xml version="1.0"?> <xmap xpath="/sitemap/components/transformers" unless="transformer[@name='textparser']"> <map:transformer logger="sitemap.transformer.textparser" name="textparser" src="org.apache.cocoon.transformation.TextFragmentParserTransformer"/> </xmap> 1.1 xml-cocoon2/src/blocks/chaperon/java/org/apache/cocoon/generation/TextParserGenerator.java Index: TextParserGenerator.java =================================================================== /* * The Apache Software License, Version 1.1 * * * Copyright (c) 2001 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 "Apache Cocoon" 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 [EMAIL PROTECTED] * * 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. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.cocoon.generation; import org.apache.avalon.excalibur.pool.Recyclable; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.parameters.ParameterException; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.components.source.SourceUtil; import org.apache.cocoon.caching.CacheableProcessingComponent; import org.apache.cocoon.environment.Request; import org.apache.cocoon.environment.SourceResolver; import org.apache.cocoon.generation.ComposerGenerator; import org.apache.cocoon.util.HashUtil; import org.apache.cocoon.xml.EmbeddedXMLPipe; import org.apache.excalibur.source.Source; import org.apache.excalibur.source.SourceException; import org.apache.excalibur.source.SourceValidity; import org.apache.excalibur.source.impl.validity.AggregatedValidity; import org.apache.excalibur.store.Store; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.ContentHandler; import org.xml.sax.helpers.AttributesImpl; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.Serializable; import java.util.Map; import net.sourceforge.chaperon.grammar.Grammar; import net.sourceforge.chaperon.grammar.SyntaxErrorException; import net.sourceforge.chaperon.grammar.generator.SAXGrammarGenerator; import net.sourceforge.chaperon.parser.ParserException; import net.sourceforge.chaperon.parser.Parser; import net.sourceforge.chaperon.parser.ParserTable; import net.sourceforge.chaperon.parser.generator.ParserTableGenerator; import net.sourceforge.chaperon.parser.output.EventQueue; import net.sourceforge.chaperon.parser.output.SAXEventAdapter; /** * A generator that parse text via a LR Paser. * The generator owns two parameter 'includeignorabletokens', which * decides if the ignorable tokens should be included, and 'grammar', * which specified the grammar. * * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> * @version CVS $Id: TextParserGenerator.java,v 1.1 2002/09/17 12:07:44 stephan Exp $ */ public class TextParserGenerator extends ComposerGenerator implements CacheableProcessingComponent { /** The URI of the parser exception */ public final static String URI = "http://chaperon.sourceforge.net/schema/parser-exception/1.0"; /** Element name */ public final static String ELEMENT = "parser-exception"; /** Attribute name of the message property */ public final static String MESSAGE_ATTRIBUTE = "message"; /** Attribute name of the message property */ public final static String LINENUMBER_ATTRIBUTE = "linenr"; /** Attribute name of the message property */ public final static String COLUMNNUMBER_ATTRIBUTE = "columnnr"; /** Element name for acceptedsymbols */ public final static String ACCEPTEDSYMBOL_ELEMENT = "parser-exception-accept"; /** The input source */ private Source inputSource = null; private Source grammarSource = null; private String grammar = null; private boolean includeIgnorableTokens = false; private ParserTable parsertable = null; private Parser parser = null; /** * Recycle this component. * All instance variables are set to <code>null</code>. */ public void recycle() { if (this.inputSource!=null) super.resolver.release(this.inputSource); this.inputSource = null; if (this.grammarSource!=null) super.resolver.release(this.grammarSource); this.grammarSource = null; inputSource = null; grammarSource = null; grammar = null; includeIgnorableTokens = false; parsertable = null; parser = null; super.recycle(); } /** * Set the SourceResolver, objectModel Map, the source and sitemap * Parameters used to process the request. * * @param resolver Source resolver * @param objectmodel Object model * @param src Source * @param parameters Parameters * * @throws IOException * @throws ProcessingException * @throws SAXException */ public void setup(SourceResolver resolver, Map objectmodel, String src, Parameters parameters) throws ProcessingException, SAXException, IOException { super.setup(resolver, objectmodel, src, parameters); Store store = null; try { this.includeIgnorableTokens = parameters.getParameterAsBoolean("includeignorabletokens", false); this.grammar = parameters.getParameter("grammar"); this.grammarSource = resolver.resolveURI(this.grammar); // Retrieve the parser table from the transient store store = (Store)this.manager.lookup(Store.TRANSIENT_STORE); ParserTableEntry entry = (ParserTableEntry)store.get(this.grammarSource.getSystemId()); // If the parser table has changed, rebuild the parser table if ((entry==null) || (entry.getValidity()==null) || (!entry.getValidity().isValid(this.grammarSource.getValidity()))) { getLogger().debug("(Re)building the parsertable from '"+this.grammarSource.getSystemId()+"'"); SAXGrammarGenerator grammargenerator = new SAXGrammarGenerator(); SourceUtil.toSAX(this.grammarSource, grammargenerator, this.manager); Grammar grammar = grammargenerator.getGrammar(); SyntaxErrorException see = grammar.validate(); if (see!=null) { getLogger().error("Grammar is not correct", see); throw new ProcessingException("Grammar is not correct", see); } ParserTableGenerator parsertablegenerator = new ParserTableGenerator(grammar); this.parsertable = parsertablegenerator.getParserTable(); store.store(this.grammarSource.getSystemId(), new ParserTableEntry(this.parsertable, this.grammarSource.getValidity())); } else { getLogger().debug("Getting parsertable from store for '"+this.grammarSource.getSystemId()+"'"); this.parsertable = entry.getParserTable(); } this.inputSource = resolver.resolveURI(src); } catch (ParameterException pe) { getLogger().error("Error during retrieving a parameter", pe); throw new ProcessingException("Error during retrieving a parameter", pe); } catch (SourceException se) { getLogger().error("Error during resolving of '" + src + "'.", se); throw new ProcessingException("Error during resolving of '" + src + "'.", se); } catch (ComponentException ce) { getLogger().error("Could not lookup for component", ce); throw new ProcessingException("Could not lookup for component", ce); } catch (SyntaxErrorException see) { getLogger().error("Grammar is not correct", see); throw new ProcessingException("Grammar is not correct", see); } finally { if (store!=null) this.manager.release(store); } } /** * Generate the unique key. * This key must be unique inside the space of this component. * This method must be invoked before the generateValidity() method. * * @return The generated key or <code>null</code> if the component * is currently not cacheable. */ public Serializable generateKey() { return "TPG("+this.inputSource.getSystemId()+";"+this.grammarSource.getSystemId()+")"; } /** * Generate the validity object. * Before this method can be invoked the generateKey() method * must be invoked. * * @return The generated validity object or <code>null</code> if the * component is currently not cacheable. */ public SourceValidity generateValidity() { SourceValidity inputsourcevalidity = this.inputSource.getValidity(); SourceValidity grammarsourcevalidity = this.grammarSource.getValidity(); if ((inputsourcevalidity==null) && (grammarsourcevalidity==null)) return null; AggregatedValidity validity = new AggregatedValidity(); if (inputsourcevalidity!=null) validity.add(inputsourcevalidity); if (grammarsourcevalidity!=null) validity.add(grammarsourcevalidity); return validity; } /** * Generate XML data. */ public void generate() throws IOException, SAXException, ProcessingException { try { if (parser==null) { parser = new Parser(); parser.enableLogging(getLogger()); } EventQueue queue = parser.parse(this.parsertable, this.inputSource.getInputStream()); SAXEventAdapter adapter = new SAXEventAdapter(super.contentHandler, this.includeIgnorableTokens, false); queue.fireEvents(adapter); } catch (ParserException pe) { getLogger().error("Document ist not valid", pe); toSAX(super.contentHandler, pe); } catch (SourceException se) { getLogger().error("Could not get inputstream from source", se); throw new ProcessingException("Could not get inputstream from source", se); } } /** * Serialize the exception to a SAX stream * * @param handler The content handler, which receives the SAX events * * @throws SAXException */ public void toSAX(ContentHandler handler, ParserException pe) throws SAXException { handler.startDocument(); handler.startPrefixMapping("", URI); AttributesImpl attributes = new AttributesImpl(); attributes.addAttribute(URI, MESSAGE_ATTRIBUTE, MESSAGE_ATTRIBUTE, "CDATA", pe.getMessage()); attributes.addAttribute(URI, LINENUMBER_ATTRIBUTE, LINENUMBER_ATTRIBUTE, "CDATA", String.valueOf(pe.getLineNumber())); attributes.addAttribute(URI, COLUMNNUMBER_ATTRIBUTE, COLUMNNUMBER_ATTRIBUTE, "CDATA", String.valueOf(pe.getColumnNumber())); handler.startElement(URI, ELEMENT, ELEMENT, attributes); for(int i=0; i<pe.getAcceptedSymbols().length; i++) { handler.startElement(URI, ACCEPTEDSYMBOL_ELEMENT, ACCEPTEDSYMBOL_ELEMENT, new AttributesImpl()); handler.characters(pe.getAcceptedSymbols()[i].toCharArray(), 0, pe.getAcceptedSymbols()[i].length()); handler.endElement(URI, ACCEPTEDSYMBOL_ELEMENT, ACCEPTEDSYMBOL_ELEMENT); } handler.endElement(URI, ELEMENT, ELEMENT); handler.endPrefixMapping(""); handler.endDocument(); } /** * This class represent a entry in a store to cache the parsertable. */ public class ParserTableEntry implements Serializable { private SourceValidity validity = null; private ParserTable parsertable = null; public ParserTableEntry(ParserTable parsertable, SourceValidity validity) { this.parsertable = parsertable; this.validity = validity; } public SourceValidity getValidity() { return this.validity; } public ParserTable getParserTable() { return this.parsertable; } } } 1.1 xml-cocoon2/src/blocks/chaperon/java/org/apache/cocoon/transformation/TextFragmentParserTransformer.java Index: TextFragmentParserTransformer.java =================================================================== /* * Copyright (C) Chaperon. All rights reserved. * ------------------------------------------------------------------------- * This software is published under the terms of the Apache Software License * version 1.1, a copy of which has been included with this distribution in * the LICENSE file. */ package org.apache.cocoon.transformation; import org.apache.avalon.excalibur.pool.Recyclable; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.logger.LogEnabled; import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.parameters.ParameterException; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.caching.CacheableProcessingComponent; import org.apache.cocoon.components.source.SourceUtil; import org.apache.cocoon.environment.SourceResolver; import org.apache.cocoon.transformation.AbstractTransformer; import org.apache.cocoon.util.HashUtil; import org.apache.cocoon.xml.EmbeddedXMLPipe; import org.apache.excalibur.source.Source; import org.apache.excalibur.source.SourceException; import org.apache.excalibur.source.SourceValidity; import org.apache.excalibur.store.Store; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.ContentHandler; import org.xml.sax.helpers.AttributesImpl; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.Serializable; import java.util.Map; import net.sourceforge.chaperon.grammar.Grammar; import net.sourceforge.chaperon.grammar.SyntaxErrorException; import net.sourceforge.chaperon.grammar.generator.SAXGrammarGenerator; import net.sourceforge.chaperon.parser.ParserException; import net.sourceforge.chaperon.parser.Parser; import net.sourceforge.chaperon.parser.ParserTable; import net.sourceforge.chaperon.parser.generator.ParserTableGenerator; import net.sourceforge.chaperon.parser.output.EventQueue; import net.sourceforge.chaperon.parser.output.SAXEventAdapter; /** * The FragmentTextParser parse text in a XML document * * @author Stephan Michels * @version CVS $Id: TextFragmentParserTransformer.java,v 1.1 2002/09/17 12:07:44 stephan Exp $ */ public class TextFragmentParserTransformer extends AbstractTransformer implements Composable, Recyclable, Disposable, CacheableProcessingComponent { private static String EXTRACT_URI = "http://chaperon.sourceforge.net/schema/textfragment/1.0"; private static String EXTRACT_ELEMENT = "textfragment"; /** The URI of the parser exception DTD */ public final static String URI = "http://chaperon.sourceforge.net/schema/parser-exception/1.0"; /** Element name */ public final static String ELEMENT = "parser-exception"; /** Attribute name of the message property */ public final static String MESSAGE_ATTRIBUTE = "message"; /** Attribute name of the message property */ public final static String LINENUMBER_ATTRIBUTE = "linenr"; /** Attribute name of the message property */ public final static String COLUMNNUMBER_ATTRIBUTE = "columnnr"; /** Element name for acceptedsymbols */ public final static String ACCEPTEDSYMBOL_ELEMENT = "parser-exception-accept"; private int extractLevel = 0; private StringBuffer text = null; private Source grammarSource = null; private ComponentManager manager = null; private SourceResolver resolver = null; private String grammar = null; private boolean includeIgnorableTokens = false; private ParserTable parsertable = null; private Parser parser = null; /** * Pass the ComponentManager to the composer. The Composable * implementation should use the specified ComponentManager * to acquire the components it needs for execution. * * @param manager The ComponentManager which this Composable uses. */ public void compose(ComponentManager manager) { this.manager = manager; } /** * Recycle this component. * All instance variables are set to <code>null</code>. */ public void recycle() { if ((this.resolver!=null) && (this.grammarSource!=null)) { this.resolver.release(this.grammarSource); this.grammarSource = null; } this.parsertable = null; } /** * The dispose operation is called at the end of a * components lifecycle. */ public void dispose() { if ((this.resolver!=null) && (this.grammarSource!=null)) { this.resolver.release(this.grammarSource); this.grammarSource = null; } this.manager = null; } /** * Set the SourceResolver, objectModel Map, the source and sitemap * Parameters used to process the request. * * @param resolver Source resolver * @param objectmodel Object model * @param src Source * @param parameters Parameters */ public void setup(SourceResolver resolver, Map objectmodel, String src, Parameters parameters) throws ProcessingException, SAXException, IOException { this.resolver = resolver; Store store = null; try { this.includeIgnorableTokens = parameters.getParameterAsBoolean("includeignorabletokens", false); this.grammar = parameters.getParameter("grammar"); this.grammarSource = resolver.resolveURI(this.grammar); // Retrieve the parser table from the transient store store = (Store)this.manager.lookup(Store.TRANSIENT_STORE); ParserTableEntry entry = (ParserTableEntry)store.get(this.grammarSource.getSystemId()); // If the parser table has changed, rebuild the parser table if ((entry==null) || (entry.getValidity()==null) || (!entry.getValidity().isValid(this.grammarSource.getValidity()))) { getLogger().debug("(Re)building the parsertable from '"+this.grammarSource.getSystemId()+"'"); SAXGrammarGenerator grammargenerator = new SAXGrammarGenerator(); SourceUtil.toSAX(this.grammarSource, grammargenerator, this.manager); Grammar grammar = grammargenerator.getGrammar(); SyntaxErrorException see = grammar.validate(); if (see!=null) { getLogger().error("Grammar is not correct", see); throw new ProcessingException("Grammar is not correct", see); } ParserTableGenerator parsertablegenerator = new ParserTableGenerator(grammar); this.parsertable = parsertablegenerator.getParserTable(); store.store(this.grammarSource.getSystemId(), new ParserTableEntry(this.parsertable, this.grammarSource.getValidity())); } else { getLogger().debug("Getting parsertable from store for '"+this.grammarSource.getSystemId()+"'"); this.parsertable = entry.getParserTable(); } } catch (ParameterException pe) { getLogger().error("Error during retrieving a parameter", pe); throw new ProcessingException("Error during retrieving a parameter", pe); } catch (SourceException se) { getLogger().error("Error during resolving of '" + src + "'.", se); throw new ProcessingException("Error during resolving of '" + src + "'.", se); } catch (ComponentException ce) { getLogger().error("Could not lookup for component", ce); throw new ProcessingException("Could not lookup for component", ce); } catch (SyntaxErrorException see) { getLogger().error("Grammar is not correct", see); throw new ProcessingException("Grammar is not correct", see); } finally { if (store!=null) this.manager.release(store); } } /** * Generate the unique key. * This key must be unique inside the space of this component. * * @return The generated key hashes the src */ public Serializable generateKey() { return this.grammarSource.getSystemId(); } /** * Generate the validity object. * * @return The generated validity object or <code>null</code> if the * component is currently not cacheable. */ public SourceValidity generateValidity() { return this.grammarSource.getValidity(); } /** * Receive notification of the beginning of an element. * * @param uri The Namespace URI, or the empty string if the element has no * Namespace URI or if Namespace * processing is not being performed. * @param loc The local name (without prefix), or the empty string if * Namespace processing is not being performed. * @param raw The raw XML 1.0 name (with prefix), or the empty string if * raw names are not available. * @param a The attributes attached to the element. If there are no * attributes, it shall be an empty Attributes object. */ public void startElement(String uri, String loc, String raw, Attributes a) throws SAXException { if (this.EXTRACT_URI.equals(uri) && this.EXTRACT_ELEMENT.equals(loc) && (this.grammar != null)) { this.extractLevel++; this.text = new StringBuffer(); } else super.startElement(uri, loc, raw, a); } /** * Receive notification of the end of an element. * * @param uri The Namespace URI, or the empty string if the element has no * Namespace URI or if Namespace * processing is not being performed. * @param loc The local name (without prefix), or the empty string if * Namespace processing is not being performed. * @param raw The raw XML 1.0 name (with prefix), or the empty string if * raw names are not available. */ public void endElement(String uri, String loc, String raw) throws SAXException { if (this.EXTRACT_URI.equals(uri) && this.EXTRACT_ELEMENT.equals(loc) && (this.grammar != null)) { this.extractLevel--; try { if (parser==null) { parser = new Parser(); parser.enableLogging(getLogger()); } EventQueue queue = parser.parse(this.parsertable, new ByteArrayInputStream(this.text.toString().getBytes())); SAXEventAdapter adapter = new SAXEventAdapter(super.contentHandler, this.includeIgnorableTokens, true); //adapter.enableLogging(getLogger()); queue.fireEvents(adapter); } catch (ParserException pe) { getLogger().error("Document ist not valid", pe); EmbeddedXMLPipe pipe = new EmbeddedXMLPipe(super.contentHandler); toSAX(pipe, pe); } this.text = null; } else super.endElement(uri, loc, raw); } /** * Receive notification of character data. * * @param c The characters from the XML document. * @param start The start position in the array. * @param len The number of characters to read from the array. */ public void characters(char c[], int start, int len) throws SAXException { if (this.extractLevel > 0) this.text.append(c, start, len); else super.characters(c, start, len); } /** * Serialize the exception to a SAX stream * * @param handler The content handler, which receives the SAX events * * @throws SAXException */ public void toSAX(ContentHandler handler, ParserException pe) throws SAXException { handler.startDocument(); handler.startPrefixMapping("", URI); AttributesImpl attributes = new AttributesImpl(); attributes.addAttribute(URI, MESSAGE_ATTRIBUTE, MESSAGE_ATTRIBUTE, "CDATA", pe.getMessage()); attributes.addAttribute(URI, LINENUMBER_ATTRIBUTE, LINENUMBER_ATTRIBUTE, "CDATA", String.valueOf(pe.getLineNumber())); attributes.addAttribute(URI, COLUMNNUMBER_ATTRIBUTE, COLUMNNUMBER_ATTRIBUTE, "CDATA", String.valueOf(pe.getColumnNumber())); handler.startElement(URI, ELEMENT, ELEMENT, attributes); for(int i=0; i<pe.getAcceptedSymbols().length; i++) { handler.startElement(URI, ACCEPTEDSYMBOL_ELEMENT, ACCEPTEDSYMBOL_ELEMENT, new AttributesImpl()); handler.characters(pe.getAcceptedSymbols()[i].toCharArray(), 0, pe.getAcceptedSymbols()[i].length()); handler.endElement(URI, ACCEPTEDSYMBOL_ELEMENT, ACCEPTEDSYMBOL_ELEMENT); } handler.endElement(URI, ELEMENT, ELEMENT); handler.endPrefixMapping(""); handler.endDocument(); } /** * This class represent a entry in a store to cache the parsertable. */ public class ParserTableEntry implements Serializable { private SourceValidity validity = null; private ParserTable parsertable = null; public ParserTableEntry(ParserTable parsertable, SourceValidity validity) { this.parsertable = parsertable; this.validity = validity; } public SourceValidity getValidity() { return this.validity; } public ParserTable getParserTable() { return this.parsertable; } } }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]