All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.xmlpull.infoset.xpath.jaxen.pattern.PatternHandler Maven / Gradle / Ivy

There is a newer version: 1.2.8
Show newest version
/*
 * $Header: /l/extreme/cvs/codes/xpp5/xis5/infoset_xpath_jaxen/org/xmlpull/infoset/xpath/jaxen/pattern/PatternHandler.java,v 1.1 2005/05/16 23:59:26 aslom Exp $
 * $Revision: 1.1 $
 * $Date: 2005/05/16 23:59:26 $
 *
 * ====================================================================
 *
 * Copyright (C) 2000-2002 bob mcwhirter & James Strachan.
 * 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 disclaimer that follows 
 *    these conditions in the documentation and/or other materials 
 *    provided with the distribution.
 *
 * 3. The name "Jaxen" must not be used to endorse or promote products
 *    derived from this software without prior written permission.  For
 *    written permission, please contact [email protected].
 * 
 * 4. Products derived from this software may not be called "Jaxen", nor
 *    may "Jaxen" appear in their name, without prior written permission
 *    from the Jaxen Project Management ([email protected]).
 * 
 * In addition, we request (but do not require) that you include in the 
 * end-user documentation provided with the redistribution and/or in the 
 * software itself an acknowledgement equivalent to the following:
 *     "This product includes software developed by the
 *      Jaxen Project (http://www.jaxen.org/)."
 * Alternatively, the acknowledgment may be graphical using the logos 
 * available at http://www.jaxen.org/
 *
 * 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 Jaxen AUTHORS OR THE PROJECT
 * 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 Jaxen Project and was originally 
 * created by bob mcwhirter  and 
 * James Strachan .  For more information on the 
 * Jaxen Project, please see .
 * 
 * $Id: PatternHandler.java,v 1.1 2005/05/16 23:59:26 aslom Exp $
 */


package org.xmlpull.infoset.xpath.jaxen.pattern;

import org.xmlpull.infoset.xpath.jaxen.JaxenException;
import org.xmlpull.infoset.xpath.jaxen.JaxenHandler;
import org.xmlpull.infoset.xpath.jaxen.expr.Expr;
import org.xmlpull.infoset.xpath.jaxen.expr.FilterExpr;
import org.xmlpull.infoset.xpath.saxpath.Axis;


import java.util.LinkedList;

/** SAXPath XPathHandler implementation capable
 *  of building Jaxen expression trees which can walk various
 *  different object models.
 *
 *  @author bob mcwhirter ([email protected])
 */
public class PatternHandler extends JaxenHandler
{
    private Pattern pattern;
    
    public PatternHandler()
    {
    }
    
    /** Retrieve the simplified Jaxen Pattern expression tree.
     *
     *  

* This method is only valid once XPathReader.parse(...) * successfully returned. *

* * @return The Pattern expression tree. */ public Pattern getPattern() { return getPattern( true ); } /** Retrieve the Jaxen Pattern expression tree, optionally * simplified. * *

* This method is only valid once XPathReader.parse(...) * successfully returned. *

* * @return The Pattern expression tree. */ public Pattern getPattern(boolean shouldSimplify) { if ( shouldSimplify && ! this.simplified ) { //System.err.println("simplifyin...."); this.pattern.simplify(); this.simplified = true; } return this.pattern; } public void endXPath() throws JaxenException { this.pattern = (Pattern) pop(); System.out.println( "stack is: " + stack ); popFrame(); } public void endPathExpr() throws JaxenException { //System.err.println("endPathExpr()"); // PathExpr ::= LocationPath // | FilterExpr // | FilterExpr / RelativeLocationPath // | FilterExpr // RelativeLocationPath // // If the current stack-frame has two items, it's a // FilterExpr and a LocationPath (of some flavor). // // If the current stack-frame has one item, it's simply // a FilterExpr, and more than like boils down to a // primary expr of some flavor. But that's for another // method... LinkedList frame = popFrame(); System.out.println( "endPathExpr(): " + frame ); push( frame.removeFirst() ); /* LocationPathPattern locationPath = new LocationPathPattern(); push( locationPath ); while (! frame.isEmpty() ) { Object filter = frame.removeLast(); if ( filter instanceof NodeTest ) { locationPath.setNodeTest( (NodeTest) filter ); } else if ( filter instanceof FilterExpr ) { locationPath.addFilter( (FilterExpr) filter ); } else if ( filter instanceof LocationPathPattern ) { LocationPathPattern parent = (LocationPathPattern) filter; locationPath.setParentPattern( parent ); locationPath = parent; } else if ( filter != null ) { throw new JaxenException( "Unknown filter: " + filter ); } } */ } public void startAbsoluteLocationPath() throws JaxenException { //System.err.println("startAbsoluteLocationPath()"); pushFrame(); push( createAbsoluteLocationPath() ); } public void endAbsoluteLocationPath() throws JaxenException { //System.err.println("endAbsoluteLocationPath()"); endLocationPath(); } public void startRelativeLocationPath() throws JaxenException { //System.err.println("startRelativeLocationPath()"); pushFrame(); push( createRelativeLocationPath() ); } public void endRelativeLocationPath() throws JaxenException { //System.err.println("endRelativeLocationPath()"); endLocationPath(); } protected void endLocationPath() throws JaxenException { // start at the back, its the main pattern then add everything else as LinkedList list = popFrame(); System.out.println( "endLocationPath: " + list ); LocationPathPattern locationPath = (LocationPathPattern) list.removeFirst(); push( locationPath ); boolean doneNodeTest = false; while ( ! list.isEmpty() ) { Object filter = list.removeFirst(); if ( filter instanceof NodeTest ) { if ( doneNodeTest ) { LocationPathPattern parent = new LocationPathPattern( (NodeTest) filter ); locationPath.setParentPattern( parent ); locationPath = parent; doneNodeTest = false; } else { locationPath.setNodeTest( (NodeTest) filter ); } } else if ( filter instanceof FilterExpr ) { locationPath.addFilter( (FilterExpr) filter ); } else if ( filter instanceof LocationPathPattern ) { LocationPathPattern parent = (LocationPathPattern) filter; locationPath.setParentPattern( parent ); locationPath = parent; doneNodeTest = false; } } } public void startNameStep(int axis, String prefix, String localName) throws JaxenException { //System.err.println("startNameStep(" + axis + ", " + prefix + ", " + localName + ")"); pushFrame(); short nodeType = Pattern.ELEMENT_NODE; switch ( axis ) { case Axis.ATTRIBUTE: nodeType = Pattern.ATTRIBUTE_NODE; break; case Axis.NAMESPACE: nodeType = Pattern.NAMESPACE_NODE; break; } if ( prefix != null && prefix.length() > 0 && ! prefix.equals( "*" ) ) { push( new NamespaceTest( prefix, nodeType ) ); } if ( localName != null && localName.length() > 0 && ! localName.equals( "*" ) ) { push( new NameTest( localName, nodeType ) ); } } public void startTextNodeStep(int axis) throws JaxenException { //System.err.println("startTextNodeStep()"); pushFrame(); push( new NodeTypeTest( Pattern.TEXT_NODE ) ); } public void startCommentNodeStep(int axis) throws JaxenException { //System.err.println("startCommentNodeStep()"); pushFrame(); push( new NodeTypeTest( Pattern.COMMENT_NODE ) ); } public void startAllNodeStep(int axis) throws JaxenException { //System.err.println("startAllNodeStep()"); pushFrame(); push( AnyNodeTest.getInstance() ); } public void startProcessingInstructionNodeStep(int axis, String name) throws JaxenException { //System.err.println("startProcessingInstructionStep()"); pushFrame(); // XXXX: should we throw an exception if name is present? push( new NodeTypeTest( Pattern.PROCESSING_INSTRUCTION_NODE ) ); } protected void endStep() { LinkedList list = popFrame(); if ( ! list.isEmpty() ) { push( list.removeFirst() ); if ( ! list.isEmpty() ) { System.out.println( "List should now be empty!" + list ); } } } public void startUnionExpr() throws JaxenException { //System.err.println("startUnionExpr()"); } public void endUnionExpr(boolean create) throws JaxenException { //System.err.println("endUnionExpr()"); if ( create ) { //System.err.println("makeUnionExpr"); Expr rhs = (Expr) pop(); Expr lhs = (Expr) pop(); push( getXPathFactory().createUnionExpr( lhs, rhs ) ); } } protected Pattern createAbsoluteLocationPath() { return new LocationPathPattern( NodeTypeTest.DOCUMENT_TEST ); } protected Pattern createRelativeLocationPath() { return new LocationPathPattern(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy