Author: simonetripodi
Date: Sun Oct 16 17:44:54 2011
New Revision: 1184881
URL: http://svn.apache.org/viewvc?rev=1184881&view=rev
Log:
missing from r1184879 :/
Added:
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ToStringVisitor.java
(with props)
Added:
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ToStringVisitor.java
URL:
http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ToStringVisitor.java?rev=1184881&view=auto
==============================================================================
---
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ToStringVisitor.java
(added)
+++
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ToStringVisitor.java
Sun Oct 16 17:44:54 2011
@@ -0,0 +1,458 @@
+package org.apache.commons.ognl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+/**
+ * A NodeVisitor implementation which will build a String representation of
the AST tree.
+ * <p/>
+ * This class is meant to be used by SimpleNode.toString(), but you may use it
to
+ *
+ * @since 4.0
+ * @author Daniel Pitts
+ */
+public class ToStringVisitor
+ implements NodeVisitor<StringBuilder, StringBuilder>
+{
+ static final ToStringVisitor INSTANCE = new ToStringVisitor();
+
+ public StringBuilder visit( ASTSequence node, StringBuilder data )
+ {
+ return commaSeparatedChildren( node, data );
+ }
+
+ private StringBuilder commaSeparatedChildren( SimpleNode node,
StringBuilder data )
+ {
+ if ( ( node._children != null ) )
+ {
+ for ( int i = 0; i < node._children.length; ++i )
+ {
+ if ( i > 0 )
+ {
+ data.append( ", " );
+ }
+ recurse( node._children[i], data );
+ }
+ }
+ return data;
+ }
+
+ public StringBuilder visit( ASTAssign node, StringBuilder data )
+ {
+ return concatInfix( node, " = ", data );
+ }
+
+ public StringBuilder visit( ASTTest node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ private StringBuilder visitExpressionNode( ExpressionNode node,
StringBuilder data )
+ {
+ if ( node._parent != null )
+ {
+ data.append( "(" );
+ }
+
+ if ( ( node._children != null ) && ( node._children.length > 0 ) )
+ {
+ for ( int i = 0; i < node._children.length; ++i )
+ {
+ if ( i > 0 )
+ {
+ data.append( " " ).append( node.getExpressionOperator( i )
).append( " " );
+ }
+ recurse( node._children[i], data );
+ }
+ }
+
+ if ( node._parent != null )
+ {
+ data.append( ')' );
+ }
+ return data;
+ }
+
+ public StringBuilder visit( ASTOr node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTAnd node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTBitOr node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTXor node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTBitAnd node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTEq node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTNotEq node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTLess node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTGreater node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTLessEq node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTGreaterEq node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTIn node, StringBuilder data )
+ {
+ final String infix = " in ";
+ return concatInfix( node, infix, data );
+ }
+
+ private StringBuilder concatInfix( SimpleNode node, String infix,
StringBuilder data )
+ {
+ return concatInfix( node._children[0], infix, node._children[1], data
);
+ }
+
+ private StringBuilder concatInfix( Node left, String infix, Node right,
StringBuilder data )
+ {
+ recurse( left, data ).append( infix );
+ return recurse( right, data );
+ }
+
+ public StringBuilder visit( ASTNotIn node, StringBuilder data )
+ {
+ return concatInfix( node, " not in ", data );
+ }
+
+ public StringBuilder visit( ASTShiftLeft node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTShiftRight node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTUnsignedShiftRight node, StringBuilder data
)
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTAdd node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTSubtract node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTMultiply node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTDivide node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTRemainder node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTNegate node, StringBuilder data )
+ {
+ return appendPrefixed( "-", node, data );
+ }
+
+ public StringBuilder visit( ASTBitNegate node, StringBuilder data )
+ {
+ return appendPrefixed( "~", node, data );
+ }
+
+ private StringBuilder appendPrefixed( String prefix, SimpleNode node,
StringBuilder data )
+ {
+ data.append( prefix );
+ return recurse( node._children[0], data );
+ }
+
+ public StringBuilder visit( ASTNot node, StringBuilder data )
+ {
+ return visitExpressionNode( node, data );
+ }
+
+ public StringBuilder visit( ASTInstanceof node, StringBuilder data )
+ {
+ return recurse( node._children[0], data ).append( " instanceof "
).append( node.getTargetType() );
+ }
+
+ public StringBuilder visit( ASTChain node, StringBuilder data )
+ {
+
+ if ( ( node._children != null ) && ( node._children.length > 0 ) )
+ {
+ for ( int i = 0; i < node._children.length; i++ )
+ {
+ if ( i > 0 )
+ {
+ if ( !( node._children[i] instanceof ASTProperty )
+ || !( (ASTProperty) node._children[i]
).isIndexedAccess() )
+ {
+ data.append( "." );
+ }
+ }
+ recurse( node._children[i], data );
+ }
+ }
+ return data;
+ }
+
+ public StringBuilder visit( ASTEval node, StringBuilder data )
+ {
+ data.append( "(" );
+ concatInfix( node, ")(", data );
+ return data.append( ")" );
+ }
+
+ public StringBuilder visit( ASTConst node, StringBuilder data )
+ {
+ final Object value = node.getValue();
+ if ( value == null )
+ {
+ data.append( "null" );
+ }
+ else
+ {
+ if ( value instanceof String )
+ {
+ data.append( '\"' ).append( OgnlOps.getEscapeString(
value.toString() ) ).append( '\"' );
+ }
+ else
+ {
+ if ( value instanceof Character )
+ {
+ data.append( '\'' ).append( OgnlOps.getEscapedChar(
(Character) value ) ).append( '\'' );
+ }
+ else
+ {
+ if ( value instanceof Node )
+ {
+ data.append( ":[ " );
+ recurse( (Node) value, data );
+ data.append( " ]" );
+ }
+ else
+ {
+ data.append( value );
+ if ( value instanceof Long )
+ {
+ data.append( 'L' );
+ }
+ else if ( value instanceof BigDecimal )
+ {
+ data.append( 'B' );
+ }
+ else if ( value instanceof BigInteger )
+ {
+ data.append( 'H' );
+ }
+ }
+ }
+ }
+ }
+ return data;
+ }
+
+ public StringBuilder visit( ASTThisVarRef node, StringBuilder data )
+ {
+ return data.append( "#this" );
+ }
+
+ public StringBuilder visit( ASTRootVarRef node, StringBuilder data )
+ {
+ return data.append( "#root" );
+ }
+
+ public StringBuilder visit( ASTVarRef node, StringBuilder data )
+ {
+ return data.append( "#" ).append( node.getName() );
+ }
+
+ public StringBuilder visit( ASTList node, StringBuilder data )
+ {
+ return wrappedCommaSeparatedChildren( "{ ", node, " }", data );
+ }
+
+ public StringBuilder visit( ASTMap node, StringBuilder data )
+ {
+ data.append( "#" );
+
+ if ( node.getClassName() != null )
+ {
+ data.append( "@" ).append( node.getClassName() ).append( "@" );
+ }
+
+ data.append( "{ " );
+ for ( int i = 0; i < node.jjtGetNumChildren(); ++i )
+ {
+ ASTKeyValue kv = (ASTKeyValue) node._children[i];
+
+ if ( i > 0 )
+ {
+ data.append( ", " );
+ }
+ concatInfix( kv.getKey(), " : ", kv.getValue(), data );
+ }
+ return data.append( " }" );
+ }
+
+ public StringBuilder visit( ASTKeyValue node, StringBuilder data )
+ {
+ return concatInfix( node.getKey(), " -> ", node.getValue(), data );
+ }
+
+ public StringBuilder visit( ASTStaticField node, StringBuilder data )
+ {
+ return data.append( "@" ).append( node.getClassName() ).append( "@"
).append( node.getFieldName() );
+ }
+
+ public StringBuilder visit( ASTCtor node, StringBuilder data )
+ {
+ data.append( "new " ).append( node.getClassName() );
+
+ if ( node.isArray() )
+ {
+ if ( node._children[0] instanceof ASTConst )
+ {
+ indexedChild( node, data );
+ }
+ else
+ {
+ appendPrefixed( "[] ", node, data );
+ }
+ }
+ else
+ {
+ wrappedCommaSeparatedChildren( "(", node, ")", data );
+ }
+ return data;
+ }
+
+ private StringBuilder wrappedCommaSeparatedChildren( String prefix,
SimpleNode node, String suffix,
+ StringBuilder data )
+ {
+ data.append( prefix );
+ return commaSeparatedChildren( node, data ).append( suffix );
+ }
+
+ public StringBuilder visit( ASTProperty node, StringBuilder data )
+ {
+ if ( node.isIndexedAccess() )
+ {
+ indexedChild( node, data );
+ }
+ else
+ {
+ data.append( ( (ASTConst) node._children[0] ).getValue() );
+ }
+ return data;
+ }
+
+ private StringBuilder indexedChild( SimpleNode node, StringBuilder data )
+ {
+ return surroundedNode( "[", node._children[0], "]", data );
+ }
+
+ public StringBuilder visit( ASTStaticMethod node, StringBuilder data )
+ {
+ data.append( "@" ).append( node.getClassName() ).append( "@" ).append(
node.getMethodName() );
+ return wrappedCommaSeparatedChildren( "(", node, ")", data );
+ }
+
+ public StringBuilder visit( ASTMethod node, StringBuilder data )
+ {
+ data.append( node.getMethodName() );
+ return wrappedCommaSeparatedChildren( "(", node, ")", data );
+ }
+
+ public StringBuilder visit( ASTProject node, StringBuilder data )
+ {
+ return surroundedNode( "{ ", node._children[0], " }", data );
+ }
+
+ private StringBuilder surroundedNode( String open, Node inner, String
close, StringBuilder data )
+ {
+ data.append( open );
+ return recurse( inner, data ).append( close );
+ }
+
+ public StringBuilder visit( ASTSelect node, StringBuilder data )
+ {
+ return surroundedNode( "{? ", node._children[0], " }", data );
+ }
+
+ public StringBuilder visit( ASTSelectFirst node, StringBuilder data )
+ {
+ return surroundedNode( "{^ ", node._children[0], " }", data );
+ }
+
+ public StringBuilder visit( ASTSelectLast node, StringBuilder data )
+ {
+ return surroundedNode( "{$ ", node._children[0], " }", data );
+ }
+
+ private StringBuilder recurse( Node child, StringBuilder data )
+ {
+ return child == null ? data.append( "null" ) : child.accept( this,
data );
+ }
+
+}
Propchange:
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ToStringVisitor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ToStringVisitor.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange:
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ToStringVisitor.java
------------------------------------------------------------------------------
svn:mime-type = text/plain