/**************************************************************************************
* Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. *
* http://aspectwerkz.codehaus.org *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package org.codehaus.aspectwerkz.expression;
import org.codehaus.aspectwerkz.annotation.AnnotationInfo;
import org.codehaus.aspectwerkz.expression.regexp.TypePattern;
import org.codehaus.aspectwerkz.reflect.ClassInfo;
import org.codehaus.aspectwerkz.reflect.ConstructorInfo;
import org.codehaus.aspectwerkz.reflect.FieldInfo;
import org.codehaus.aspectwerkz.reflect.MemberInfo;
import org.codehaus.aspectwerkz.reflect.MethodInfo;
import org.codehaus.aspectwerkz.reflect.ReflectionInfo;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.codehaus.aspectwerkz.expression.ast.*;
import org.codehaus.aspectwerkz.util.Strings;
/**
* The visitor that extract all possible arguments referenced by the expression.
* <p/>
* TODO handle pointcut reference and handle parameter transition
* + checks as done in the ArgIndexVisitor for this / target compliance.
*
* @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur </a>
*/
public class ExpressionValidateVisitor implements ExpressionParserVisitor {
protected Node m_root;
protected String m_expression;
protected String m_namespace;
/**
* Creates a new expression.
*
* @param expression the expression as a string
* @param namespace the namespace
* @param root the AST root
*/
public ExpressionValidateVisitor(final String expression,
final String namespace,
final Node root) {
m_expression = expression;
m_namespace = namespace;
m_root = root;
}
/**
* Populate data with the possible arguments
*
* @param data a list to feed with Strings
*/
public void populate(List data) {
visit(m_root, data);
}
// ============ Boot strap =============
public Object visit(Node node, Object data) {
return node.jjtGetChild(0).jjtAccept(this, data);
}
public Object visit(SimpleNode node, Object data) {
return node.jjtGetChild(0).jjtAccept(this, data);
}
public Object visit(ASTRoot node, Object data) {
return node.jjtGetChild(0).jjtAccept(this, data);
}
public Object visit(ASTExpression node, Object data) {
return node.jjtGetChild(0).jjtAccept(this, data);
}
// ============ Logical operators =============
public Object visit(ASTOr node, Object data) {
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
List args = (List) node.jjtGetChild(i).jjtAccept(this, data);
//((List) data).addAll(args);
}
return data;
}
public Object visit(ASTAnd node, Object data) {
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
node.jjtGetChild(i).jjtAccept(this, data);
}
return data;
}
public Object visit(ASTNot node, Object data) {
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
node.jjtGetChild(i).jjtAccept(this, data);
}
return data;
}
// ============ Pointcut types =============
public Object visit(ASTPointcutReference node, Object data) {
// visit the args - if any
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
node.jjtGetChild(i).jjtAccept(this, data);
}
return data;
}
public Object visit(ASTExecution node, Object data) {
return data;
}
public Object visit(ASTCall node, Object data) {
return data;
}
public Object visit(ASTSet node, Object data) {
return data;
}
public Object visit(ASTGet node, Object data) {
return data;
}
public Object visit(ASTHandler node, Object data) {
return data;
}
public Object visit(ASTStaticInitialization node, Object data) {
return data;
}
public Object visit(ASTIf node, Object data) {
return data;
}
public Object visit(ASTWithin node, Object data) {
return data;
}
public Object visit(ASTWithinCode node, Object data) {
return data;
}
public Object visit(ASTHasMethod node, Object data) {
return data;
}
public Object visit(ASTHasField node, Object data) {
return data;
}
public Object visit(ASTCflow node, Object data) {
// visit the sub expression
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
node.jjtGetChild(i).jjtAccept(this, data);
}
return data;
}
public Object visit(ASTCflowBelow node, Object data) {
// visit the sub expression
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
node.jjtGetChild(i).jjtAccept(this, data);
}
return data;
}
public Object visit(ASTTarget node, Object data) {
((List) data).add(node.getIdentifier());
return data;
}
public Object visit(ASTThis node, Object data) {
((List) data).add(node.getIdentifier());
return data;
}
// ============ Patterns =============
public Object visit(ASTClassPattern node, Object data) {
return data;
}
public Object visit(ASTMethodPattern node, Object data) {
return data;
}
public Object visit(ASTConstructorPattern node, Object data) {
return data;
}
public Object visit(ASTFieldPattern node, Object data) {
return data;
}
public Object visit(ASTParameter node, Object data) {
return data;
}
public Object visit(ASTArgs node, Object data) {
for (int i = 0; i < node.jjtGetNumChildren(); i++) {
List args = (List) node.jjtGetChild(i).jjtAccept(this, data);
((List) data).addAll(args);
}
return data;
}
public Object visit(ASTArgParameter node, Object data) {
TypePattern typePattern = node.getTypePattern();
((List) data).add(typePattern.getPattern());
return data;
}
public Object visit(ASTAttribute node, Object data) {
return data;
}
public Object visit(ASTModifier node, Object data) {
return data;
}
/**
* Returns the string representation of the expression.
*
* @return
*/
public String toString() {
return m_expression;
}
}