001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.geronimo.system.configuration.condition;
019
020 import java.util.Map;
021 import java.util.HashMap;
022 import java.util.Collections;
023
024 import org.apache.commons.logging.Log;
025 import org.apache.commons.logging.LogFactory;
026
027 import ognl.Ognl;
028 import ognl.OgnlContext;
029
030 /**
031 * Provides a simple facility to evaluate condition expressions using the
032 * <a href="http://ognl.org">OGNL</a> language.
033 *
034 * <p>
035 * This class is thread-safe.
036 * </p>
037 *
038 * @version $Rev: 470597 $ $Date: 2006-11-02 15:30:55 -0800 (Thu, 02 Nov 2006) $
039 */
040 public class OgnlConditionParser
041 implements ConditionParser
042 {
043 private static final Log log = LogFactory.getLog(OgnlConditionParser.class);
044
045 private final Map vars;
046
047 public OgnlConditionParser() {
048 // Setup the default vars
049 vars = new HashMap();
050
051 vars.put("props", Collections.unmodifiableMap(System.getProperties()));
052 vars.put("java", new JavaVariable());
053 vars.put("os", new OsVariable());
054 }
055
056 /**
057 * Evaluate a condition expression.
058 *
059 * @param expression The condition expression to evaluate; must not be null
060 * @return True if the condition is satisfied
061 *
062 * @throws ConditionParserException Failed to evaluate condition expression
063 */
064 public boolean evaluate(final String expression) throws ConditionParserException {
065 if (expression == null) {
066 throw new IllegalArgumentException("Expression must not be null");
067 }
068
069 // Empty expressions are true
070 if (expression.trim().length() == 0) {
071 log.debug("Expression is empty; skipping evaluation");
072
073 return true;
074 }
075
076 Object result;
077 try {
078 result = doEvaluate(expression);
079 }
080 catch (Exception e) {
081 throw new ConditionParserException("Failed to evaluate expression: " + expression, e);
082 }
083
084 if (result instanceof Boolean) {
085 return ((Boolean)result).booleanValue();
086 }
087 else {
088 throw new ConditionParserException("Expression '" + expression + "' did not evaluate to a boolean value; found: " + result);
089 }
090 }
091
092 private Object doEvaluate(final String expression) throws Exception {
093 assert expression != null;
094
095 boolean debug = log.isDebugEnabled();
096
097 if (debug) {
098 log.debug("Evaluating expression: " + expression);
099 }
100
101 // Object root;
102 OgnlContext context = new OgnlContext(vars);
103
104 Object expr = Ognl.parseExpression(expression);
105 Object result = Ognl.getValue(expr, context);
106
107 if (debug) {
108 log.debug("Result: " + result);
109 }
110
111 return result;
112 }
113 }