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

org.navimatrix.jaxen.pattern.PatternHandler Maven / Gradle / Ivy

There is a newer version: 1.0.5
Show newest version
/*
 * $Header: /cvs/jaxen/jaxen/src/java/main/org/jaxen/pattern/PatternHandler.java,v 1.8 2006/02/05 21:47:42 elharo Exp $
 * $Revision: 1.8 $
 * $Date: 2006/02/05 21:47:42 $
 *
 * ====================================================================
 *
 * Copyright 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:
 * 
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 
 *   * 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.
 * 
 *   * Neither the name of the Jaxen Project nor the names of its
 *     contributors may be used to endorse or promote products derived 
 *     from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS 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 COPYRIGHT OWNER
 * OR 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.8 2006/02/05 21:47:42 elharo Exp $
 */


package org.navimatrix.jaxen.pattern;

import java.util.LinkedList;

import org.navimatrix.jaxen.JaxenException;
import org.navimatrix.jaxen.JaxenHandler;
import org.navimatrix.jaxen.expr.Expr;
import org.navimatrix.jaxen.expr.FilterExpr;
import org.navimatrix.jaxen.saxpath.Axis;

/** 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. *

* * @param shouldSimplify ???? * * @return The Pattern expression tree. */ public Pattern getPattern(boolean shouldSimplify) { if ( shouldSimplify && ! this.simplified ) { //System.err.println("simplifying...."); this.pattern.simplify(); this.simplified = true; } return this.pattern; } public void endXPath() { this.pattern = (Pattern) pop(); System.out.println( "stack is: " + stack ); popFrame(); } public void endPathExpr() { //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() { //System.err.println("startAbsoluteLocationPath()"); pushFrame(); push( createAbsoluteLocationPath() ); } public void endAbsoluteLocationPath() throws JaxenException { //System.err.println("endAbsoluteLocationPath()"); endLocationPath(); } public void startRelativeLocationPath() { //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) { //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) { //System.err.println("startTextNodeStep()"); pushFrame(); push( new NodeTypeTest( Pattern.TEXT_NODE ) ); } public void startCommentNodeStep(int axis) { //System.err.println("startCommentNodeStep()"); pushFrame(); push( new NodeTypeTest( Pattern.COMMENT_NODE ) ); } public void startAllNodeStep(int axis) { //System.err.println("startAllNodeStep()"); pushFrame(); push( AnyNodeTest.getInstance() ); } public void startProcessingInstructionNodeStep(int axis, String name) { //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() { //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 - 2024 Weber Informatics LLC | Privacy Policy