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; }
private static final Node createNodeInternal(String expr) throws ELException { if (expr == null) { throw new ELException(MessageFactory.get("error.null")); } Node n = (Node) cache.get(expr); if (n == null && (n = (Node) cache2.get(expr)) == 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); } if (cache.size() > SIZE) { cache2.clear(); cache2.putAll(cache); cache.clear(); } cache.put(expr, n); } catch (ParseException pe) { throw new ELException("Error Parsing: " + expr, pe); } } return n; }