Author: adrianc
Date: Tue Dec  9 11:08:19 2008
New Revision: 724835

URL: http://svn.apache.org/viewvc?rev=724835&view=rev
Log:
Finished building out the Unified Expression Language functions, added detailed 
JavaDocs.

Modified:
    ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelFunctions.java

Modified: 
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=724835&r1=724834&r2=724835&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelFunctions.java 
(original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/string/UelFunctions.java 
Tue Dec  9 11:08:19 2008
@@ -25,22 +25,80 @@
 
 import javolution.util.FastMap;
 
+import org.ofbiz.base.util.Debug;
+
 /** 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>
+ * <p>Built-in functions are divided into a number of
+ * namespace prefixes:</p>
+ * <table border="1">
+ * <tr><td colspan="2"><b><code>math:</code> maps to 
<code>java.lang.Math</code></b></td></tr>
+ * <tr><td><code>math:absDouble(double)</code></td><td>Returns the absolute 
value of a <code>double</code> value.</td></tr>
+ * <tr><td><code>math:absFloat(float)</code></td><td>Returns the absolute 
value of a <code>float</code> value.</td></tr>
+ * <tr><td><code>math:absInt(int)</code></td><td>Returns the absolute value of 
an <code>int</code> value.</td></tr>
+ * <tr><td><code>math:absLong(long)</code></td><td>Returns the absolute value 
of a <code>long</code> value.</td></tr>
+ * <tr><td><code>math:acos(double)</code></td><td>Returns the arc cosine of an 
angle, in the range of 0.0 through <i>pi</i>.</td></tr>
+ * <tr><td><code>math:asin(double)</code></td><td>Returns the arc sine of an 
angle, in the range of -<i>pi</i>/2 through <i>pi</i>/2.</td></tr>
+ * <tr><td><code>math:atan(double)</code></td><td>Returns the arc tangent of 
an angle, in the range of -<i>pi</i>/2 through <i>pi</i>/2.</td></tr>
+ * <tr><td><code>math:atan2(double, double)</code></td><td>Converts 
rectangular coordinates (<code>x</code>,&nbsp;<code>y</code>) to polar 
(r,&nbsp;<i>theta</i>).</td></tr>
+ * <tr><td><code>math:cbrt(double)</code></td><td>Returns the cube root of a 
<code>double</code> value.</td></tr>
+ * <tr><td><code>math:ceil(double)</code></td><td>Returns the smallest 
(closest to negative infinity) <code>double</code> value that is greater than 
or equal to the argument and is equal to a mathematical integer.</td></tr>
+ * <tr><td><code>math:cos(double)</code></td><td>Returns the trigonometric 
cosine of an angle.</td></tr>
+ * <tr><td><code>math:cosh(double)</code></td><td>Returns the hyperbolic 
cosine of a <code>double</code> value.</td></tr>
+ * <tr><td><code>math:exp(double)</code></td><td>Returns Euler's number 
<i>e</i> raised to the power of a <code>double</code> value.</td></tr>
+ * <tr><td><code>math:expm1(double)</code></td><td>Returns 
<i>e</i><sup>x</sup>&nbsp;-1.</td></tr>
+ * <tr><td><code>math:floor(double)</code></td><td>Returns the largest 
(closest to positive infinity) <code>double</code> value that is less than or 
equal to the argument and is equal to a mathematical integer.</td></tr>
+ * <tr><td><code>math:hypot(double, double)</code></td><td>Returns 
sqrt(<i>x</i><sup>2</sup>&nbsp;+<i>y</i><sup>2</sup>) without intermediate 
overflow or underflow.</td></tr>
+ * <tr><td><code>math:IEEEremainder(double, double)</code></td><td>Computes 
the remainder operation on two arguments as prescribed by the IEEE 754 
standard.</td></tr>
+ * <tr><td><code>math:log(double)</code></td><td>Returns the natural logarithm 
(base <i>e</i>) of a <code>double</code> value.</td></tr>
+ * <tr><td><code>math:log10(double)</code></td><td>Returns the base 10 
logarithm of a <code>double</code> value.</td></tr>
+ * <tr><td><code>math:log1p(double)</code></td><td>Returns the natural 
logarithm of the sum of the argument and 1.</td></tr>
+ * <tr><td><code>math:maxDouble(double, double)</code></td><td>Returns the 
greater of two <code>double</code> values.</td></tr>
+ * <tr><td><code>math:maxFloat(float, float)</code></td><td>Returns the 
greater of two <code>float</code> values.</td></tr>
+ * <tr><td><code>math:maxInt(int, int)</code></td><td>Returns the greater of 
two <code>int</code> values.</td></tr>
+ * <tr><td><code>math:maxLong(long, long)</code></td><td>Returns the greater 
of two <code>long</code> values.</td></tr>
+ * <tr><td><code>math:minDouble(double, double)</code></td><td>Returns the 
smaller of two <code>double</code> values.</td></tr>
+ * <tr><td><code>math:minFloat(float, float)</code></td><td>Returns the 
smaller of two <code>float</code> values.</td></tr>
+ * <tr><td><code>math:minInt(int, int)</code></td><td>Returns the smaller of 
two <code>int</code> values.</td></tr>
+ * <tr><td><code>math:minLong(long, long)</code></td><td>Returns the smaller 
of two <code>long</code> values.</td></tr>
+ * <tr><td><code>math:pow(double, double)</code></td><td>Returns the value of 
the first argument raised to the power of the second argument.</td></tr>
+ * <tr><td><code>math:random()</code></td><td>Returns a <code>double</code> 
value with a positive sign, greater than or equal to <code>0.0</code> and less 
than <code>1.0</code>.</td></tr>
+ * <tr><td><code>math:rint(double)</code></td><td>Returns the 
<code>double</code> value that is closest in value to the argument and is equal 
to a mathematical integer.</td></tr>
+ * <tr><td><code>math:roundDouble(double)</code></td><td>Returns the closest 
<code>long</code> to the argument.</td></tr>
+ * <tr><td><code>math:roundFloat(float)</code></td><td>Returns the closest 
<code>int</code> to the argument.</td></tr>
+ * <tr><td><code>math:signumDouble(double)</code></td><td>Returns the signum 
function of the argument; zero if the argument is zero, 1.0 if the argument is 
greater than zero, -1.0 if the argument is less than zero.</td></tr>
+ * <tr><td><code>math:signumFloat(float)</code></td><td>Returns the signum 
function of the argument; zero if the argument is zero, 1.0f if the argument is 
greater than zero, -1.0f if the argument is less than zero.</td></tr>
+ * <tr><td><code>math:sin(double)</code></td><td>Returns the trigonometric 
sine of an angle.</td></tr>
+ * <tr><td><code>math:sinh(double)</code></td><td>Returns the hyperbolic sine 
of a <code>double</code> value.</td></tr>
+ * <tr><td><code>math:sqrt(double)</code></td><td>Returns the correctly 
rounded positive square root of a <code>double</code> value.</td></tr>
+ * <tr><td><code>math:tan(double)</code></td><td>Returns the trigonometric 
tangent of an angle.</td></tr>
+ * <tr><td><code>math:tanh(double)</code></td><td>Returns the hyperbolic 
tangent of a <code>double</code> value.</td></tr>
+ * <tr><td><code>math:toDegrees(double)</code></td><td>Converts an angle 
measured in radians to an approximately equivalent angle measured in 
degrees.</td></tr>
+ * <tr><td><code>math:toRadians(double)</code></td><td>Converts an angle 
measured in degrees to an approximately equivalent angle measured in 
radians.</td></tr>
+ * <tr><td><code>math:ulpDouble(double)</code></td><td>Returns the size of an 
ulp (units in the last place) of the argument.</td></tr>
+ * <tr><td><code>math:ulpFloat(float)</code></td><td>Returns the size of an 
ulp (units in the last place) of the argument.</td></tr>
+ * <tr><td colspan="2"><b><code>str:</code> maps to 
<code>java.lang.String</code></b></td></tr>
+ * <tr><td><code>str:endsWith(String, String)</code></td><td>Returns 
<code>true</code> if this string ends with the specified suffix.</td></tr>
+ * <tr><td><code>str:indexOf(String, String)</code></td><td>Returns the index 
within this string of the first occurrence of the specified substring.</td></tr>
+ * <tr><td><code>str:lastIndexOf(String, String)</code></td><td>Returns the 
index within this string of the last occurrence of the specified 
character.</td></tr>
+ * <tr><td><code>str:length(String)</code></td><td>Returns the length of this 
string.</td></tr>
+ * <tr><td><code>str:replace(String, String, String)</code></td><td>Replaces 
each substring of this string that matches the literal target sequence with the 
specified literal replacement sequence.</td></tr>
+ * <tr><td><code>str:replaceAll(String, String, 
String)</code></td><td>Replaces each substring of this string that matches the 
given regular expression with the given replacement.</td></tr>
+ * <tr><td><code>str:replaceFirst(String, String, 
String)</code></td><td>Replaces the first substring of this string that matches 
the given regular expression with the given replacement.</td></tr>
+ * <tr><td><code>str:startsWith(String, String)</code></td><td>Returns 
<code>true</code> if this string starts with the specified prefix.</td></tr>
+ * <tr><td><code>str:endstring(String, int)</code></td><td>Returns a new 
string that is a substring of this string. The substring begins with the 
character at the specified index and extends to the end of this 
string.</td></tr>
+ * <tr><td><code>str:substring(String, int, int)</code></td><td>Returns a new 
string that is a substring of this string. The substring begins at the 
specified beginIndex and extends to the character at index endIndex - 1. Thus 
the length of the substring is endIndex-beginIndex.</td></tr>
+ * <tr><td><code>str:trim(String)</code></td><td>Returns a copy of the string, 
with leading and trailing whitespace omitted.</td></tr>
+ * <tr><td colspan="2"><b><code>sys:</code> maps to 
<code>java.lang.System</code></b></td></tr>
+ * <tr><td><code>sys:getenv(String)</code></td><td>Gets the value of the 
specified environment variable.</td></tr>
+ * <tr><td><code>sys:getProperty(String)</code></td><td>Gets the system 
property indicated by the specified key.</td></tr>
+ * <tr><td colspan="2"><b><code>util:</code> contains miscellaneous utility 
functions</b></td></tr>
+ * <tr><td><code>util:size(Object)</code></td><td>Returns the size of Maps,
+ *    Collections, and Strings. Invalid Object types return -1.</td></tr>
+ * </table>
  */
 public class UelFunctions {
 
+    public static final String module = UelFunctions.class.getName();
     protected static final FunctionMapper functionMapper = new Functions();
 
     /** Returns a <code>FunctionMapper</code> instance.
@@ -54,54 +112,68 @@
         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));
+                this.functionMap.put("math:absDouble", 
Math.class.getMethod("abs", double.class));
+                this.functionMap.put("math:absFloat", 
Math.class.getMethod("abs", float.class));
+                this.functionMap.put("math:absInt", 
Math.class.getMethod("abs", int.class));
+                this.functionMap.put("math:absLong", 
Math.class.getMethod("abs", long.class));
+                this.functionMap.put("math:acos", Math.class.getMethod("abs", 
double.class));
+                this.functionMap.put("math:asin", Math.class.getMethod("asin", 
double.class));
+                this.functionMap.put("math:atan", Math.class.getMethod("atan", 
double.class));
+                this.functionMap.put("math:atan2", Math.class.getMethod("max", 
double.class, double.class));
+                this.functionMap.put("math:cbrt", Math.class.getMethod("cbrt", 
double.class));
+                this.functionMap.put("math:ceil", Math.class.getMethod("ceil", 
double.class));
+                this.functionMap.put("math:cos", Math.class.getMethod("cos", 
double.class));
+                this.functionMap.put("math:cosh", Math.class.getMethod("cosh", 
double.class));
+                this.functionMap.put("math:exp", Math.class.getMethod("exp", 
double.class));
+                this.functionMap.put("math:expm1", 
Math.class.getMethod("expm1", double.class));
+                this.functionMap.put("math:floor", 
Math.class.getMethod("floor", double.class));
+                this.functionMap.put("math:hypot", 
Math.class.getMethod("hypot", double.class, double.class));
+                this.functionMap.put("math:IEEEremainder", 
Math.class.getMethod("IEEEremainder", double.class, double.class));
+                this.functionMap.put("math:log", Math.class.getMethod("log", 
double.class));
+                this.functionMap.put("math:log10", 
Math.class.getMethod("log10", double.class));
+                this.functionMap.put("math:log1p", 
Math.class.getMethod("log1p", double.class));
+                this.functionMap.put("math:maxDouble", 
Math.class.getMethod("max", double.class, double.class));
+                this.functionMap.put("math:maxFloat", 
Math.class.getMethod("max", float.class, float.class));
+                this.functionMap.put("math:maxInt", 
Math.class.getMethod("max", int.class, int.class));
+                this.functionMap.put("math:maxLong", 
Math.class.getMethod("max", long.class, long.class));
+                this.functionMap.put("math:minDouble", 
Math.class.getMethod("min", double.class, double.class));
+                this.functionMap.put("math:minFloat", 
Math.class.getMethod("min", float.class, float.class));
+                this.functionMap.put("math:minInt", 
Math.class.getMethod("min", int.class, int.class));
+                this.functionMap.put("math:minLong", 
Math.class.getMethod("min", long.class, long.class));
+                this.functionMap.put("math:pow", Math.class.getMethod("pow", 
double.class, double.class));
+                this.functionMap.put("math:random", 
Math.class.getMethod("random"));
+                this.functionMap.put("math:rint", Math.class.getMethod("rint", 
double.class));
+                this.functionMap.put("math:roundDouble", 
Math.class.getMethod("round", double.class));
+                this.functionMap.put("math:roundFloat", 
Math.class.getMethod("round", float.class));
+                this.functionMap.put("math:signumDouble", 
Math.class.getMethod("signum", double.class));
+                this.functionMap.put("math:signumFloat", 
Math.class.getMethod("signum", float.class));
+                this.functionMap.put("math:sin", Math.class.getMethod("sin", 
double.class));
+                this.functionMap.put("math:sinh", Math.class.getMethod("sinh", 
double.class));
+                this.functionMap.put("math:sqrt", Math.class.getMethod("sqrt", 
double.class));
+                this.functionMap.put("math:tan", Math.class.getMethod("tan", 
double.class));
+                this.functionMap.put("math:tanh", Math.class.getMethod("tanh", 
double.class));
+                this.functionMap.put("math:toDegrees", 
Math.class.getMethod("toDegrees", double.class));
+                this.functionMap.put("math:toRadians", 
Math.class.getMethod("toRadians", double.class));
+                this.functionMap.put("math:ulpDouble", 
Math.class.getMethod("ulp", double.class));
+                this.functionMap.put("math:ulpFloat", 
Math.class.getMethod("ulp", float.class));
+                this.functionMap.put("str:endsWith", 
UelFunctions.class.getMethod("endsWith", String.class, String.class));
+                this.functionMap.put("str:indexOf", 
UelFunctions.class.getMethod("indexOf", String.class, String.class));
+                this.functionMap.put("str:lastIndexOf", 
UelFunctions.class.getMethod("lastIndexOf", String.class, String.class));
+                this.functionMap.put("str:length", 
UelFunctions.class.getMethod("length", String.class));
+                this.functionMap.put("str:replace", 
UelFunctions.class.getMethod("replace", String.class, String.class, 
String.class));
+                this.functionMap.put("str:replaceAll", 
UelFunctions.class.getMethod("replaceAll", String.class, String.class, 
String.class));
+                this.functionMap.put("str:replaceFirst", 
UelFunctions.class.getMethod("replaceFirst", String.class, String.class, 
String.class));
+                this.functionMap.put("str:startsWith", 
UelFunctions.class.getMethod("startsWith", String.class, String.class));
+                this.functionMap.put("str:endstring", 
UelFunctions.class.getMethod("endString", String.class, int.class));
+                this.functionMap.put("str:substring", 
UelFunctions.class.getMethod("subString", String.class, int.class, int.class));
+                this.functionMap.put("str:trim", 
UelFunctions.class.getMethod("trim", String.class));
+                this.functionMap.put("sys:getenv", 
UelFunctions.class.getMethod("sysGetEnv", String.class));
+                this.functionMap.put("sys:getProperty", 
UelFunctions.class.getMethod("sysGetProp", String.class));
+                this.functionMap.put("util:size", 
UelFunctions.class.getMethod("getSize", Object.class));
             } catch (Exception e) {
-                
+                Debug.logWarning("Error while initializing 
UelFunctions.Functions instance: " + e, module);
             }
+            Debug.logVerbose("UelFunctions.Functions loaded " + 
this.functionMap.size() + " functions", module);
         }
         public void setFunction(String prefix, String localName, Method 
method) {
             synchronized(this) {
@@ -129,4 +201,96 @@
         } catch (Exception e) {}
         return -1;
     }
+
+    public static boolean endsWith(String str1, String str2) {
+        try {
+            return str1.endsWith(str2);
+        } catch (Exception e) {}
+        return false;
+    }
+
+    public static int indexOf(String str1, String str2) {
+        try {
+            return str1.indexOf(str2);
+        } catch (Exception e) {}
+        return -1;
+    }
+
+    public static int lastIndexOf(String str1, String str2) {
+        try {
+            return str1.lastIndexOf(str2);
+        } catch (Exception e) {}
+        return -1;
+    }
+
+    public static int length(String str1) {
+        try {
+            return str1.length();
+        } catch (Exception e) {}
+        return -1;
+    }
+
+    public static String replace(String str1, String str2, String str3) {
+        try {
+            return str1.replace(str2, str3);
+        } catch (Exception e) {}
+        return null;
+    }
+
+    public static String replaceAll(String str1, String str2, String str3) {
+        try {
+            return str1.replaceAll(str2, str3);
+        } catch (Exception e) {}
+        return null;
+    }
+
+    public static String replaceFirst(String str1, String str2, String str3) {
+        try {
+            return str1.replaceFirst(str2, str3);
+        } catch (Exception e) {}
+        return null;
+    }
+
+    public static boolean startsWith(String str1, String str2) {
+        try {
+            return str1.startsWith(str2);
+        } catch (Exception e) {}
+        return false;
+    }
+
+    public static String endString(String str, int index) {
+        try {
+            return str.substring(index);
+        } catch (Exception e) {}
+        return null;
+    }
+
+    public static String subString(String str, int beginIndex, int endIndex) {
+        try {
+            return str.substring(beginIndex, endIndex);
+        } catch (Exception e) {}
+        return null;
+    }
+
+    public static String trim(String str) {
+        try {
+            return str.trim();
+        } catch (Exception e) {}
+        return null;
+    }
+
+    public static String sysGetEnv(String str) {
+        try {
+            return System.getenv(str);
+        } catch (Exception e) {}
+        return null;
+    }
+
+    public static String sysGetProp(String str) {
+        try {
+            return System.getProperty(str);
+        } catch (Exception e) {}
+        return null;
+    }
+
 }


Reply via email to