Author: adrianc
Date: Mon Dec  8 21:58:18 2008
New Revision: 724616

URL: http://svn.apache.org/viewvc?rev=724616&view=rev
Log:
Added some functions to the Unified Expression Language. See the 
UelFunctions.java JavaDoc for details.

Added:
    ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelFunctions.java 
  (with props)
Modified:
    
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java
    ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java

Modified: 
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java?rev=724616&r1=724615&r2=724616&view=diff
==============================================================================
--- 
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java
 (original)
+++ 
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/FlexibleStringExpander.java
 Mon Dec  8 21:58:18 2008
@@ -50,8 +50,8 @@
     public static final String closeBracket = "}";
     protected static final UtilCache<String, FlexibleStringExpander> exprCache 
= new UtilCache<String, 
FlexibleStringExpander>("flexibleStringExpander.ExpressionCache");
     protected static final FlexibleStringExpander nullExpr = new 
FlexibleStringExpander(null);
-    protected String orig;
-    protected List<StrElem> strElems = null;
+    protected final String orig;
+    protected final List<StrElem> strElems;
     protected int hint = 20;
 
     /**
@@ -66,6 +66,8 @@
             if (original.length() > this.hint) {
                 this.hint = original.length();
             }
+        } else {
+            this.strElems = null;
         }
     }
     
@@ -269,7 +271,7 @@
     }
     
     protected static class ConstElem implements StrElem {
-        protected String str;
+        protected final String str;
         protected ConstElem(String value) {
             this.str = value.intern();
         }
@@ -279,7 +281,7 @@
     }
     
     protected static class BshElem implements StrElem {
-        protected String str;
+        protected final String str;
         protected BshElem(String scriptlet) {
             this.str = scriptlet;
         }
@@ -304,8 +306,8 @@
     }
 
     protected static class CurrElem implements StrElem {
-        protected String valueStr;
-        protected FlexibleStringExpander codeExpr = null;
+        protected final String valueStr;
+        protected final FlexibleStringExpander codeExpr;
         protected CurrElem(String original) {
             int currencyPos = original.indexOf("?currency(");
             int closeParen = original.indexOf(")", currencyPos + 10);
@@ -326,7 +328,7 @@
     }
         
     protected static class NestedVarElem implements StrElem {
-        protected List<StrElem> strElems = null;
+        protected final List<StrElem> strElems;
         protected int hint = 20;
         protected NestedVarElem(String original) {
             this.strElems = getStrElems(original);
@@ -359,8 +361,8 @@
     }
 
     protected static class VarElem implements StrElem {
-        protected String original = null;
-        protected String bracketedOriginal = null;
+        protected final String original;
+        protected final String bracketedOriginal;
         protected VarElem(String original) {
             this.original = original;
             this.bracketedOriginal = openBracket + original + closeBracket;

Added: 
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelFunctions.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelFunctions.java?rev=724616&view=auto
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelFunctions.java 
(added)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelFunctions.java 
Mon Dec  8 21:58:18 2008
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * 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.ofbiz.base.util.string;
+
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.Map;
+import javax.el.*;
+
+import javolution.util.FastMap;
+
+/** Implements Unified Expression Language functions.
+ * <p>Built-in functions are divided into two prefixes - <code>math</code>
+ *  and <code>util</code>.</p><p>The <code>math</code> prefix maps to
+ *  the <code>java.lang.Math</code> class. Overloaded 
<code>java.lang.Math</code>
+ *  methods have their parameter data types appended to the UEL function name
+ *  - so <code>java.lang.Math.max(double a, double b)</code>
+ *  becomes <code>${math:maxDouble(a, b)}</code>.</p><p>The
+ *  <code>util</code> prefix contains miscellaneous utility functions:<br/>
+ *  <ul>
+ *    <li><code>${util:size(Object)}</code> returns the size of Maps,
+ *    Collections, and Strings. Invalid Object types return -1.</li>
+ *  </ul>
+ *  </p>
+ */
+public class UelFunctions {
+
+    protected static final FunctionMapper functionMapper = new Functions();
+
+    /** Returns a <code>FunctionMapper</code> instance.
+     * @return <code>FunctionMapper</code> instance
+     */
+    public static FunctionMapper getFunctionMapper() {
+        return functionMapper;
+    }
+
+    protected static class Functions extends FunctionMapper {
+        protected final Map<String, Method> functionMap = 
FastMap.newInstance();
+        public Functions() {
+            try {
+                setFunction("math", "absDouble", Math.class.getMethod("abs", 
double.class));
+                setFunction("math", "absFloat", Math.class.getMethod("abs", 
float.class));
+                setFunction("math", "absInt", Math.class.getMethod("abs", 
int.class));
+                setFunction("math", "absLong", Math.class.getMethod("abs", 
long.class));
+                setFunction("math", "acos", Math.class.getMethod("abs", 
double.class));
+                setFunction("math", "asin", Math.class.getMethod("asin", 
double.class));
+                setFunction("math", "atan", Math.class.getMethod("atan", 
double.class));
+                setFunction("math", "atan2", Math.class.getMethod("max", 
double.class, double.class));
+                setFunction("math", "cbrt", Math.class.getMethod("cbrt", 
double.class));
+                setFunction("math", "ceil", Math.class.getMethod("ceil", 
double.class));
+                setFunction("math", "cos", Math.class.getMethod("cos", 
double.class));
+                setFunction("math", "cosh", Math.class.getMethod("cosh", 
double.class));
+                setFunction("math", "exp", Math.class.getMethod("exp", 
double.class));
+                setFunction("math", "expm1", Math.class.getMethod("expm1", 
double.class));
+                setFunction("math", "floor", Math.class.getMethod("floor", 
double.class));
+                setFunction("math", "hypot", Math.class.getMethod("hypot", 
double.class, double.class));
+                setFunction("math", "IEEEremainder", 
Math.class.getMethod("IEEEremainder", double.class, double.class));
+                setFunction("math", "log", Math.class.getMethod("log", 
double.class));
+                setFunction("math", "log10", Math.class.getMethod("log10", 
double.class));
+                setFunction("math", "log1p", Math.class.getMethod("log1p", 
double.class));
+                setFunction("math", "maxDouble", Math.class.getMethod("max", 
double.class, double.class));
+                setFunction("math", "maxFloat", Math.class.getMethod("max", 
float.class, float.class));
+                setFunction("math", "maxInt", Math.class.getMethod("max", 
int.class, int.class));
+                setFunction("math", "maxLong", Math.class.getMethod("max", 
long.class, long.class));
+                setFunction("math", "minDouble", Math.class.getMethod("min", 
double.class, double.class));
+                setFunction("math", "minFloat", Math.class.getMethod("min", 
float.class, float.class));
+                setFunction("math", "minInt", Math.class.getMethod("min", 
int.class, int.class));
+                setFunction("math", "minLong", Math.class.getMethod("min", 
long.class, long.class));
+                setFunction("math", "pow", Math.class.getMethod("pow", 
double.class, double.class));
+                setFunction("math", "random", Math.class.getMethod("random"));
+                setFunction("math", "rint", Math.class.getMethod("rint", 
double.class));
+                setFunction("math", "roundDouble", 
Math.class.getMethod("round", double.class));
+                setFunction("math", "roundFloat", 
Math.class.getMethod("round", float.class));
+                setFunction("math", "signumDouble", 
Math.class.getMethod("signum", double.class));
+                setFunction("math", "signumFloat", 
Math.class.getMethod("signum", float.class));
+                setFunction("math", "sin", Math.class.getMethod("sin", 
double.class));
+                setFunction("math", "sinh", Math.class.getMethod("sinh", 
double.class));
+                setFunction("math", "sqrt", Math.class.getMethod("sqrt", 
double.class));
+                setFunction("math", "tan", Math.class.getMethod("tan", 
double.class));
+                setFunction("math", "tanh", Math.class.getMethod("tanh", 
double.class));
+                setFunction("math", "toDegrees", 
Math.class.getMethod("toDegrees", double.class));
+                setFunction("math", "toRadians", 
Math.class.getMethod("toRadians", double.class));
+                setFunction("math", "ulpDouble", Math.class.getMethod("ulp", 
double.class));
+                setFunction("math", "ulpFloat", Math.class.getMethod("ulp", 
float.class));
+                setFunction("util", "size", 
UelFunctions.class.getMethod("getSize", Object.class));
+            } catch (Exception e) {
+                
+            }
+        }
+        public void setFunction(String prefix, String localName, Method 
method) {
+            synchronized(this) {
+                functionMap.put(prefix + ":" + localName, method);
+            }
+        }
+        public Method resolveFunction(String prefix, String localName) {
+            return functionMap.get(prefix + ":" + localName);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public static int getSize(Object obj) {
+        try {
+            Map map = (Map) obj;
+            return map.size();
+        } catch (Exception e) {}
+        try {
+            Collection coll = (Collection) obj;
+            return coll.size();
+        } catch (Exception e) {}
+        try {
+            String str = (String) obj;
+            return str.length();
+        } catch (Exception e) {}
+        return -1;
+    }
+}

Propchange: 
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelFunctions.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java?rev=724616&r1=724615&r2=724616&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java 
(original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelUtil.java Mon 
Dec  8 21:58:18 2008
@@ -18,7 +18,6 @@
  
*******************************************************************************/
 package org.ofbiz.base.util.string;
 
-import java.lang.reflect.Method;
 import java.util.Map;
 import javax.el.*;
 
@@ -27,8 +26,6 @@
 /** Implements the Unified Expression Language (JSR-245). */
 public class UelUtil {
     
-    protected static final String module = UelUtil.class.getName();
-    public static final FunctionMapper functionMapper = new Functions();
     protected static final ExpressionFactory exprFactory = new 
de.odysseus.el.ExpressionFactoryImpl();
     protected static final ELResolver defaultResolver = new 
CompositeELResolver() {
         {
@@ -61,14 +58,14 @@
             return defaultResolver;
         }
         public FunctionMapper getFunctionMapper() {
-            return functionMapper;
+            return UelFunctions.getFunctionMapper();
         }
         public VariableMapper getVariableMapper() {
             return this.variableMapper;
         }
         protected class BasicVariableMapper extends VariableMapper {
-            protected ELContext elContext;
-            protected Map<String, Object> variables = FastMap.newInstance();
+            protected final ELContext elContext;
+            protected final Map<String, Object> variables = 
FastMap.newInstance();
             protected BasicVariableMapper(Map<String, ? extends Object> 
context, ELContext parentContext) {
                 this.variables.putAll(context);
                 this.elContext = parentContext;
@@ -130,17 +127,4 @@
             }
         }
     }
-
-    protected static class Functions extends FunctionMapper {
-        protected Map<String, Method> functionMap = FastMap.newInstance();
-        public void setFunction(String prefix, String localName, Method 
method) {
-            synchronized(this) {
-                functionMap.put(prefix + ":" + localName, method);
-            }
-        }
-        public Method resolveFunction(String prefix, String localName) {
-            return functionMap.get(prefix + ":" + localName);
-        }
-    }
-
 }


Reply via email to