Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * 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.
  */
 
 package org.apache.el.lang;
 
 import static org.jboss.web.ELMessages.MESSAGES;
 
 
 

Author(s):
Jacob Hookom [jacob@hookom.net]
Version:
$Id: ExpressionBuilder.java 1882 2011-12-06 15:27:15Z remy.maucherat@jboss.com $
 
 public final class ExpressionBuilder implements NodeVisitor {
 
     private static final int CACHE_SIZE;
     private static final String CACHE_SIZE_PROP =
         "org.apache.el.lang.ExpressionBuilder.CACHE_SIZE";
 
     static {
         if (System.getSecurityManager() == null) {
              = Integer.parseInt(
                     System.getProperty("-1"));
         } else {
              = AccessController.doPrivileged(
                     new PrivilegedAction<Integer>() {
 
                     @Override
                     public Integer run() {
                         return Integer.valueOf(
                                 System.getProperty("-1"));
                     }
                 }).intValue();
         }
         if ( > 0) {
              = null;
              = new ConcurrentCache<StringNode>();
         } else {
              = null;
              = new ConcurrentHashMap<StringNode>(1024);
         }
     }
 
     private static final ConcurrentCache<StringNodecache;
     private static final ConcurrentHashMap<StringNodeunlimitedCache;
 
     private FunctionMapper fnMapper;
 
     private VariableMapper varMapper;
 
     private String expression;

    
 
     public ExpressionBuilder(String expressionELContext ctx)
             throws ELException {
         this. = expression;
 
         FunctionMapper ctxFn = ctx.getFunctionMapper();
        VariableMapper ctxVar = ctx.getVariableMapper();
        if (ctxFn != null) {
            this. = new FunctionMapperFactory(ctxFn);
        }
        if (ctxVar != null) {
            this. = new VariableMapperFactory(ctxVar);
        }
    }
    public static final Node createNode(String exprthrows ELException {
        Node n = createNodeInternal(expr);
        return n;
    }
    private static final Node createNodeInternal(String expr)
            throws ELException {
        if (expr == null) {
            throw new ELException(.errorNullExpression());
        }
		Node n = ( != null) ? .get(expr) : .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 < numChildreni++) {
                        child = n.jjtGetChild(i);
                        if (child instanceof AstLiteralExpression)
                            continue;
                        if (type == null)
                            type = child.getClass();
                        else {
                            if (!type.equals(child.getClass())) {
                                throw new ELException(.errorMixedExpression(expr));
                            }
                        }
                    }
                }
                if (n instanceof AstDeferredExpression
                        || n instanceof AstDynamicExpression) {
                    n = n.jjtGetChild(0);
                }
				if ( != null) {
                .put(exprn);
                } else {
                    .put(exprn);
                }
            } catch (Exception e) {
                throw new ELException(.errorParse(expr), e);
            }
        }
        return n;
    }
    private void prepare(Node nodethrows ELException {
        try {
            node.accept(this);
        } catch (Exception e) {
            if (e instanceof ELException) {
                throw (ELExceptione;
            } else {
                throw (new ELException(e));
            }
        }
        if (this. instanceof FunctionMapperFactory) {
            this. = ((FunctionMapperFactorythis.).create();
        }
        if (this. instanceof VariableMapperFactory) {
            this. = ((VariableMapperFactorythis.).create();
        }
    }
    private Node build() throws ELException {
        Node n = createNodeInternal(this.);
        this.prepare(n);
        if (n instanceof AstDeferredExpression
                || n instanceof AstDynamicExpression) {
            n = n.jjtGetChild(0);
        }
        return n;
    }
    /*
     * (non-Javadoc)
     *
     * @see com.sun.el.parser.NodeVisitor#visit(com.sun.el.parser.Node)
     */
    @Override
    public void visit(Node nodethrows ELException {
        if (node instanceof AstFunction) {
            AstFunction funcNode = (AstFunctionnode;
            if (this. == null) {
                throw new ELException(.missingFunctionMapper());
            }
            Method m = .resolveFunction(funcNode.getPrefix(), funcNode
                    .getLocalName());
            if (m == null) {
                throw new ELException(.functionNotFound(funcNode.getOutputName()));
            }
            int pcnt = m.getParameterTypes().length;
            if (node.jjtGetNumChildren() != pcnt) {
                throw new ELException(.functionWrongParameterCount(funcNode.getOutputName(),
                        pcntnode.jjtGetNumChildren()));
            }
        } else if (node instanceof AstIdentifier && this. != null) {
            String variable = ((AstIdentifiernode).getImage();
            // simply capture it
            this..resolveVariable(variable);
        }
    }
    public ValueExpression createValueExpression(Class<?> expectedType)
            throws ELException {
        Node n = this.build();
        return new ValueExpressionImpl(this.nthis.,
                this.expectedType);
    }
    public MethodExpression createMethodExpression(Class<?> expectedReturnType,
            Class<?>[] expectedParamTypesthrows ELException {
        Node n = this.build();
        if (!n.isParametersProvided() && expectedParamTypes == null) {
            throw new NullPointerException(.nullParameterTypes());
        }
        if (n instanceof AstValue || n instanceof AstIdentifier) {
            return new MethodExpressionImpl(nthis.,
                    this.expectedReturnTypeexpectedParamTypes);
        } else if (n instanceof AstLiteralExpression) {
            return new MethodExpressionLiteral(expectedReturnType,
                    expectedParamTypes);
        } else {
            throw new ELException(.invalidMethodExpression());
        }
    }
New to GrepCode? Check out our FAQ X