예제 #1
0
  /*
   * (non-Javadoc)
   *
   * @see com.sun.el.parser.NodeVisitor#visit(com.sun.el.parser.Node)
   */
  @Override
  public void visit(Node node) throws ELException {
    if (node instanceof AstFunction) {

      AstFunction funcNode = (AstFunction) node;

      if (this.fnMapper == null) {
        throw new ELException(MESSAGES.missingFunctionMapper());
      }
      Method m = fnMapper.resolveFunction(funcNode.getPrefix(), funcNode.getLocalName());
      if (m == null) {
        throw new ELException(MESSAGES.functionNotFound(funcNode.getOutputName()));
      }
      int pcnt = m.getParameterTypes().length;
      if (node.jjtGetNumChildren() != pcnt) {
        throw new ELException(
            MESSAGES.functionWrongParameterCount(
                funcNode.getOutputName(), pcnt, node.jjtGetNumChildren()));
      }
    } else if (node instanceof AstIdentifier && this.varMapper != null) {
      String variable = ((AstIdentifier) node).getImage();

      // simply capture it
      this.varMapper.resolveVariable(variable);
    }
  }
예제 #2
0
  /*
   * (non-Javadoc)
   *
   * @see com.sun.el.parser.NodeVisitor#visit(com.sun.el.parser.Node)
   */
  public void visit(Node node) throws ELException {
    if (node instanceof AstFunction) {

      AstFunction funcNode = (AstFunction) node;

      if (this.fnMapper == null) {
        throw new ELException(MessageFactory.get("error.fnMapper.null"));
      }
      Method m = fnMapper.resolveFunction(funcNode.getPrefix(), funcNode.getLocalName());
      if (m == null) {
        throw new ELException(
            MessageFactory.get("error.fnMapper.method", funcNode.getOutputName()));
      }
      int pcnt = m.getParameterTypes().length;
      if (node.jjtGetNumChildren() != pcnt) {
        throw new ELException(
            MessageFactory.get(
                "error.fnMapper.paramcount",
                funcNode.getOutputName(),
                "" + pcnt,
                "" + node.jjtGetNumChildren()));
      }
    } else if (node instanceof AstIdentifier && this.varMapper != null) {
      String variable = ((AstIdentifier) node).getImage();

      // simply capture it
      this.varMapper.resolveVariable(variable);
    }
  }
예제 #3
0
 private Node build() throws ELException {
   Node n = createNodeInternal(this.expression);
   this.prepare(n);
   if (n instanceof AstDeferredExpression || n instanceof AstDynamicExpression) {
     n = n.jjtGetChild(0);
   }
   return n;
 }
예제 #4
0
 public MethodExpression createMethodExpression(
     Class<?> expectedReturnType, Class<?>[] expectedParamTypes) throws ELException {
   Node n = this.build();
   if (!n.isParametersProvided() && expectedParamTypes == null) {
     throw new NullPointerException(MESSAGES.nullParameterTypes());
   }
   if (n instanceof AstValue || n instanceof AstIdentifier) {
     return new MethodExpressionImpl(
         expression, n, this.fnMapper, this.varMapper, expectedReturnType, expectedParamTypes);
   } else if (n instanceof AstLiteralExpression) {
     return new MethodExpressionLiteral(expression, expectedReturnType, expectedParamTypes);
   } else {
     throw new ELException(MESSAGES.invalidMethodExpression(expression));
   }
 }
예제 #5
0
 private void prepare(Node node) throws ELException {
   try {
     node.accept(this);
   } catch (Exception e) {
     if (e instanceof ELException) {
       throw (ELException) e;
     } else {
       throw (new ELException(e));
     }
   }
   if (this.fnMapper instanceof FunctionMapperFactory) {
     this.fnMapper = ((FunctionMapperFactory) this.fnMapper).create();
   }
   if (this.varMapper instanceof VariableMapperFactory) {
     this.varMapper = ((VariableMapperFactory) this.varMapper).create();
   }
 }
예제 #6
0
  private static final Node createNodeInternal(String expr) throws ELException {
    if (expr == null) {
      throw new ELException(MESSAGES.errorNullExpression());
    }

    Node n = (cache != null) ? cache.get(expr) : unlimitedCache.get(expr);
    if (n == null) {
      try {
        n = (new ELParser(new StringReader(expr))).CompositeExpression();

        // validate composite expression
        int numChildren = n.jjtGetNumChildren();
        if (numChildren == 1) {
          n = n.jjtGetChild(0);
        } else {
          Class<?> type = null;
          Node child = null;
          for (int i = 0; i < numChildren; i++) {
            child = n.jjtGetChild(i);
            if (child instanceof AstLiteralExpression) continue;
            if (type == null) type = child.getClass();
            else {
              if (!type.equals(child.getClass())) {
                throw new ELException(MESSAGES.errorMixedExpression(expr));
              }
            }
          }
        }

        if (n instanceof AstDeferredExpression || n instanceof AstDynamicExpression) {
          n = n.jjtGetChild(0);
        }
        if (cache != null) {
          cache.put(expr, n);
        } else {
          unlimitedCache.put(expr, n);
        }
      } catch (Exception e) {
        throw new ELException(MESSAGES.errorParse(expr), e);
      }
    }
    return n;
  }
예제 #7
0
  private static final Node createNodeInternal(String expr) throws ELException {
    if (expr == null) {
      throw new ELException(MessageFactory.get("error.null"));
    }

    Node n = cache.get(expr);
    if (n == null) {
      try {
        n = (new ELParser(new StringReader(expr))).CompositeExpression();

        // validate composite expression
        if (n instanceof AstCompositeExpression) {
          int numChildren = n.jjtGetNumChildren();
          if (numChildren == 1) {
            n = n.jjtGetChild(0);
          } else {
            Class type = null;
            Node child = null;
            for (int i = 0; i < numChildren; i++) {
              child = n.jjtGetChild(i);
              if (child instanceof AstLiteralExpression) continue;
              if (type == null) type = child.getClass();
              else {
                if (!type.equals(child.getClass())) {
                  throw new ELException(MessageFactory.get("error.mixed", expr));
                }
              }
            }
          }
        }
        if (n instanceof AstDeferredExpression || n instanceof AstDynamicExpression) {
          n = n.jjtGetChild(0);
        }
        cache.put(expr, n);
      } catch (ParseException pe) {
        throw new ELException("Error Parsing: " + expr, pe);
      }
    }
    return n;
  }