You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2012/05/03 16:59:57 UTC

svn commit: r1333491 - in /ofbiz/trunk/framework/minilang: dtd/ src/org/ofbiz/minilang/ src/org/ofbiz/minilang/method/ src/org/ofbiz/minilang/method/callops/

Author: adrianc
Date: Thu May  3 14:59:56 2012
New Revision: 1333491

URL: http://svn.apache.org/viewvc?rev=1333491&view=rev
Log:
Overhauled Mini-language <call-class-method> <call-object-method> <field> and <string> elements.

Modified:
    ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/MiniLangUtil.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/FieldObject.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/MethodObject.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/StringObject.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallBsh.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallClassMethod.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallObjectMethod.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CreateObject.java

Modified: ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd?rev=1333491&r1=1333490&r2=1333491&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd (original)
+++ ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd Thu May  3 14:59:56 2012
@@ -117,45 +117,44 @@ under the License.
     <xs:element name="field">
         <xs:annotation>
             <xs:documentation>
-                Used to specify a field to be passed as an argument to the method call.
-                The field can be in a map in the environment or if no map-name is specified
-                then the field will come directly from the environment.
-
-                With the "." Syntax, the map-name is typically no longer necessary because
-                you can do map-name.field-name in the field-name attribute, but those are still there for legacy purposes.
+                Specifies an environment field to be passed as an argument to a method call.
             </xs:documentation>
         </xs:annotation>
         <xs:complexType>
-            <xs:attributeGroup ref="attlist.field"/>
+            <xs:attribute type="xs:string" name="field" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the environment field to use.
+                        &lt;br/&gt;&lt;br/&gt;
+                        Required. Attribute type: expression.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute type="xs:string" name="type">
+                <xs:annotation>
+                    <xs:documentation>
+                        The Java class of the argument. Defaults to java.lang.String.
+                        If this is a method call or object creation and the type in the method signature being called is for a parent class or interface,
+                        then it should be the type in that parent class or interface and not the type of the object being
+                        passed in.
+                        &lt;br/&gt;&lt;br/&gt;
+                        Optional. Attribute type: constant.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
         </xs:complexType>
     </xs:element>
-    <xs:attributeGroup name="attlist.field">
-        <xs:attribute type="xs:string" name="field" use="required">
-            <xs:annotation><xs:documentation>Name of the field to put value in.</xs:documentation></xs:annotation>
-        </xs:attribute>
-        <xs:attribute type="xs:string" name="type">
-            <xs:annotation>
-                <xs:documentation>
-                    Type of the value put in the field.
-                    If this is a method call or object creation and the type in the method signature being called is for a parent class or interface,
-                    then it should be the type in that parent class or interface and not the type of the object being passed in.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-    </xs:attributeGroup>
     <xs:element name="string">
         <xs:annotation>
             <xs:documentation>
-                String of type java.lang.String. Inserts the value of the inline string where specified.
+                Specifies a java.lang.String to be passed as an argument to a method call.
+                The String can be contained in the value attribute or in the element body. 
             </xs:documentation>
         </xs:annotation>
-        <xs:complexType mixed="true">
-            <xs:attributeGroup ref="attlist.string"/>
+        <xs:complexType>
+            <xs:attribute type="xs:string" name="value" />
         </xs:complexType>
     </xs:element>
-    <xs:attributeGroup name="attlist.string">
-        <xs:attribute type="xs:string" name="value"/>
-    </xs:attributeGroup>
     <xs:element name="simple-methods">
         <xs:annotation>
             <xs:documentation>
@@ -164,13 +163,7 @@ under the License.
         </xs:annotation>
         <xs:complexType>
             <xs:sequence>
-                <xs:element maxOccurs="unbounded" ref="simple-method">
-                    <xs:annotation>
-                        <xs:documentation>
-                            Opening tag of a simple-method definition.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
+                <xs:element maxOccurs="unbounded" ref="simple-method"/>
             </xs:sequence>
         </xs:complexType>
     </xs:element>
@@ -885,10 +878,10 @@ under the License.
     <xs:element name="call-bsh" substitutionGroup="CallOperations">
         <xs:annotation>
             <xs:documentation>
-                Executes a BSH script. The script can be contained in a Java resource, or a short
-                script can be included in the element body.
+                Executes a BSH script. Deprecated - replace with &lt;script&gt;.
                 &lt;br/&gt;&lt;br/&gt;
-                Deprecated - replace with &lt;script&gt;.
+                The script can be contained in a Java resource, or a short
+                script can be included in the element body.
             </xs:documentation>
         </xs:annotation>
         <xs:complexType mixed="true">
@@ -967,110 +960,78 @@ under the License.
     <xs:element name="call-object-method" substitutionGroup="CallOperations">
         <xs:annotation>
             <xs:documentation>
-                Calls a method on an existing object that exists in a field in the environment or in a map in the environment.
-
+                Calls a method on an existing Java object. Deprecated - replace with &lt;script&gt;.
+                &lt;br/&gt;&lt;br/&gt;
                 The string and field sub-elements are passed to the method as arguments in the order they are specified.
-                If the sub-elements do not match the method arguments an error will be returned.
-
-                The return value will be put in the named field if an value is returned and
-                if a field and optionally a map name are specified.
+                If the method returns a value, the value will be put in the named field.
             </xs:documentation>
         </xs:annotation>
         <xs:complexType>
             <xs:choice minOccurs="0" maxOccurs="unbounded">
-                <xs:element ref="string">
-                    <xs:annotation>
-                        <xs:documentation>
-                            Used to specify an inline String argument to the method call.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element ref="field"/>
+                <xs:element ref="string" />
+                <xs:element ref="field" />
             </xs:choice>
-            <xs:attributeGroup ref="attlist.call-object-method"/>
+            <xs:attribute type="xs:string" name="obj-field" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the field the object is in that has the method to be called.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute type="xs:string" name="method-name" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the method to call on the given object.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute type="xs:string" name="ret-field">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the field to put the result in.
+                        If not specified any return value will be ignored.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
         </xs:complexType>
     </xs:element>
-    <xs:attributeGroup name="attlist.call-object-method">
-        <xs:attribute type="xs:string" name="obj-field" use="required">
-            <xs:annotation>
-                <xs:documentation>
-                    The name of the field the object is in that has the method to be called.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-        <xs:attribute type="xs:string" name="method-name" use="required">
-            <xs:annotation>
-                <xs:documentation>
-                    The name of the method to call on the given object.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-        <xs:attribute type="xs:string" name="ret-field">
-            <xs:annotation>
-                <xs:documentation>
-                    The name of the field to put the result in.
-                    If not specified any return value will be ignored.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-    </xs:attributeGroup>
     <xs:element name="call-class-method" substitutionGroup="CallOperations">
         <xs:annotation>
             <xs:documentation>
-                Calls a static method on a class.
-
+                Calls a static method on a Java class. Deprecated - replace with &lt;script&gt;.
+                &lt;br/&gt;&lt;br/&gt;
                 The string and field sub-elements are passed to the method as arguments in the order they are specified.
-                If the sub-elements do not match the method arguments an error will be returned.
-
-                The return value will be put in the named field if an value is returned and if a
-                field and optionally a map name are specified.
+                If the method returns a value, the value will be put in the named field.
             </xs:documentation>
         </xs:annotation>
         <xs:complexType>
             <xs:choice minOccurs="0" maxOccurs="unbounded">
-                <xs:element ref="string">
-                    <xs:annotation>
-                        <xs:documentation>
-                            Used to specify an inline String argument to the method call.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element ref="field">
-                    <xs:annotation>
-                        <xs:documentation>
-                            Used to specify a field to be passed as an argument to the constructor method.
-                            The field can be in a map in the environment or if no map-name is specified then
-                            the field will come directly from the environment.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
+                <xs:element ref="string"/>
+                <xs:element ref="field"/>
             </xs:choice>
-            <xs:attributeGroup ref="attlist.call-class-method"/>
+            <xs:attribute type="xs:string" name="class-name" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the class to call the static method on.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute type="xs:string" name="method-name" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the static method to call on the given class.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute type="xs:string" name="ret-field">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the field to put the result in. If not specified any return value will be ignored.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
         </xs:complexType>
     </xs:element>
-    <xs:attributeGroup name="attlist.call-class-method">
-        <xs:attribute type="xs:string" name="class-name" use="required">
-            <xs:annotation>
-                <xs:documentation>
-                    The name of the class to call the static method on.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-        <xs:attribute type="xs:string" name="method-name" use="required">
-            <xs:annotation>
-                <xs:documentation>
-                    The name of the static method to call on the given class.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-        <xs:attribute type="xs:string" name="ret-field">
-            <xs:annotation>
-                <xs:documentation>
-                    The name of the field to put the result in. If not specified any return value will be ignored.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-    </xs:attributeGroup>
     <xs:element name="create-object" substitutionGroup="CallOperations">
         <xs:annotation>
             <xs:documentation>

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/MiniLangUtil.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/MiniLangUtil.java?rev=1333491&r1=1333490&r2=1333491&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/MiniLangUtil.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/MiniLangUtil.java Thu May  3 14:59:56 2012
@@ -21,9 +21,11 @@ package org.ofbiz.minilang;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.Method;
 import java.net.URL;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import javax.xml.transform.Transformer;
@@ -35,7 +37,11 @@ import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.ScriptUtil;
 import org.ofbiz.base.util.UtilProperties;
 import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
 import org.ofbiz.base.util.string.FlexibleStringExpander;
+import org.ofbiz.minilang.method.MethodContext;
+import org.ofbiz.minilang.method.MethodObject;
+import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
@@ -72,6 +78,36 @@ public final class MiniLangUtil {
         return "true".equals(UtilProperties.getPropertyValue("minilang.properties", "autocorrect"));
     }
 
+    public static void callMethod(MethodOperation operation, MethodContext methodContext, List<MethodObject<?>> parameters, Class<?> methodClass, Object methodObject, String methodName, FlexibleMapAccessor<Object> retFieldFma) throws MiniLangRuntimeException {
+        Object[] args = null;
+        Class<?>[] parameterTypes = null;
+        if (parameters != null) {
+            args = new Object[parameters.size()];
+            parameterTypes = new Class<?>[parameters.size()];
+            int i = 0;
+            for (MethodObject<?> methodObjectDef : parameters) {
+                args[i] = methodObjectDef.getObject(methodContext);
+                Class<?> typeClass = null;
+                try {
+                    typeClass = methodObjectDef.getTypeClass(methodContext);
+                } catch (ClassNotFoundException e) {
+                    throw new MiniLangRuntimeException(e, operation);
+                }
+                parameterTypes[i] = typeClass;
+                i++;
+            }
+        }
+        try {
+            Method method = methodClass.getMethod(methodName, parameterTypes);
+            Object retValue = method.invoke(methodObject, args);
+            if (!retFieldFma.isEmpty()) {
+                retFieldFma.put(methodContext.getEnvMap(), retValue);
+            }
+        } catch (Exception e) {
+            throw new MiniLangRuntimeException(e, operation);
+        }
+    }
+
     public static void flagDocumentAsCorrected(Element element) {
         Document doc = element.getOwnerDocument();
         if (doc != null) {

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/FieldObject.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/FieldObject.java?rev=1333491&r1=1333490&r2=1333491&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/FieldObject.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/FieldObject.java Thu May  3 14:59:56 2012
@@ -18,72 +18,44 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method;
 
-import java.util.Map;
-
-import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.ObjectType;
 import org.ofbiz.base.util.UtilGenerics;
-import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
 import org.ofbiz.minilang.SimpleMethod;
 import org.w3c.dom.Element;
 
 /**
- * A type of MethodObject that represents an Object value in a certain location
+ * Specifies an environment field to be passed as an argument to a method call.
  */
-public class FieldObject<T> extends MethodObject<T> {
-
-    public static final String module = FieldObject.class.getName();
+public final class FieldObject<T> extends MethodObject<T> {
 
-    ContextAccessor<T> fieldAcsr;
-    ContextAccessor<Map<String, ? extends Object>> mapAcsr;
-    String type;
+    private final FlexibleMapAccessor<Object> fieldFma;
+    private final String type;
 
     public FieldObject(Element element, SimpleMethod simpleMethod) {
         super(element, simpleMethod);
-        // the schema for this element now just has the "field" attribute, though the old "field-name" and "map-name" pair is still supported
-        fieldAcsr = new ContextAccessor<T>(element.getAttribute("field"), element.getAttribute("field-name"));
-        mapAcsr = new ContextAccessor<Map<String, ? extends Object>>(element.getAttribute("map-name"));
-        type = element.getAttribute("type");
-        if (UtilValidate.isEmpty(type)) {
-            type = "String";
+        this.fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("field"));
+        String typeAttribute = element.getAttribute("type");
+        if (typeAttribute.isEmpty()) {
+            this.type = "java.lang.String";
+        } else {
+            this.type = typeAttribute;
         }
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public T getObject(MethodContext methodContext) {
-        T fieldVal = null;
-        if (!mapAcsr.isEmpty()) {
-            Map<String, ? extends Object> fromMap = mapAcsr.get(methodContext);
-            if (fromMap == null) {
-                Debug.logWarning("Map not found with name " + mapAcsr + ", not getting Object value, returning null.", module);
-                return null;
-            }
-            fieldVal = fieldAcsr.get(fromMap, methodContext);
-        } else {
-            // no map name, try the env
-            fieldVal = fieldAcsr.get(methodContext);
-        }
-        if (fieldVal == null) {
-            if (Debug.infoOn())
-                Debug.logInfo("Field value not found with name " + fieldAcsr + " in Map with name " + mapAcsr + ", not getting Object value, returning null.", module);
-            return null;
-        }
-        return fieldVal;
+        return (T) this.fieldFma.get(methodContext.getEnvMap());
     }
 
     @Override
-    public Class<T> getTypeClass(ClassLoader loader) {
-        try {
-            return UtilGenerics.cast(ObjectType.loadClass(type, loader));
-        } catch (ClassNotFoundException e) {
-            Debug.logError(e, "Could not find class for type: " + type, module);
-            return null;
-        }
+    public Class<T> getTypeClass(MethodContext methodContext) throws ClassNotFoundException {
+        return UtilGenerics.cast(ObjectType.loadClass(this.type, methodContext.getLoader()));
     }
 
-    /** Get the name for the type of the object */
     @Override
     public String getTypeName() {
-        return type;
+        return this.type;
     }
 }

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/MethodObject.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/MethodObject.java?rev=1333491&r1=1333490&r2=1333491&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/MethodObject.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/MethodObject.java Thu May  3 14:59:56 2012
@@ -18,25 +18,24 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method;
 
+import org.ofbiz.minilang.MiniLangElement;
 import org.ofbiz.minilang.SimpleMethod;
 import org.w3c.dom.Element;
 
 /**
  * A single Object value to be used as a parameter or whatever
  */
-public abstract class MethodObject<T> {
-
-    protected SimpleMethod simpleMethod;
+public abstract class MethodObject<T> extends MiniLangElement {
 
     public MethodObject(Element element, SimpleMethod simpleMethod) {
-        this.simpleMethod = simpleMethod;
+        super(element, simpleMethod);
     }
 
     /** Get the Object value */
     public abstract T getObject(MethodContext methodContext);
 
     /** Get the Class for the type of the object */
-    public abstract Class<T> getTypeClass(ClassLoader loader);
+    public abstract Class<T> getTypeClass(MethodContext methodContext) throws ClassNotFoundException;
 
     /** Get the name for the type of the object */
     public abstract String getTypeName();

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/StringObject.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/StringObject.java?rev=1333491&r1=1333490&r2=1333491&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/StringObject.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/StringObject.java Thu May  3 14:59:56 2012
@@ -18,44 +18,34 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method;
 
-import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.string.FlexibleStringExpander;
 import org.ofbiz.minilang.SimpleMethod;
 import org.w3c.dom.Element;
 
 /**
- * A type of MethodObject that represents a String constant value to be used as an Object
+ * Specifies a <code>java.lang.String</code> to be passed as an argument to a method call.
  */
-public class StringObject extends MethodObject<String> {
+public final class StringObject extends MethodObject<String> {
 
-    String cdataValue;
-    String value;
+    private final FlexibleStringExpander cdataValueFse;
+    private final FlexibleStringExpander valueFse;
 
     public StringObject(Element element, SimpleMethod simpleMethod) {
         super(element, simpleMethod);
-        value = element.getAttribute("value");
-        cdataValue = UtilXml.elementValue(element);
+        this.cdataValueFse = FlexibleStringExpander.getInstance(UtilXml.elementValue(element));
+        this.valueFse = FlexibleStringExpander.getInstance(element.getAttribute("value"));
     }
 
     @Override
     public String getObject(MethodContext methodContext) {
-        String value = methodContext.expandString(this.value);
-        String cdataValue = methodContext.expandString(this.cdataValue);
-        boolean valueExists = UtilValidate.isNotEmpty(value);
-        boolean cdataValueExists = UtilValidate.isNotEmpty(cdataValue);
-        if (valueExists && cdataValueExists) {
-            return value + cdataValue;
-        } else {
-            if (valueExists) {
-                return value;
-            } else {
-                return cdataValue;
-            }
-        }
+        String value = this.valueFse.expandString(methodContext.getEnvMap());
+        String cdataValue = this.cdataValueFse.expandString(methodContext.getEnvMap());
+        return value.concat(cdataValue);
     }
 
     @Override
-    public Class<String> getTypeClass(ClassLoader loader) {
+    public Class<String> getTypeClass(MethodContext methodContext) throws ClassNotFoundException {
         return java.lang.String.class;
     }
 

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallBsh.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallBsh.java?rev=1333491&r1=1333490&r2=1333491&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallBsh.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallBsh.java Thu May  3 14:59:56 2012
@@ -131,7 +131,7 @@ public final class CallBsh extends Metho
                 methodContext.putAllEnv(UtilGenerics.<String, Object> checkMap(inlineResult));
             }
         } catch (EvalError e) {
-            Debug.logError(e, "BeanShell execution caused an error", module);
+            Debug.logWarning(e, "BeanShell execution caused an error", module);
             addErrorMessage(methodContext, "BeanShell execution caused an error: " + e.getMessage());
         }
         // always return true, error messages just go on the error list

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallClassMethod.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallClassMethod.java?rev=1333491&r1=1333490&r2=1333491&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallClassMethod.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallClassMethod.java Thu May  3 14:59:56 2012
@@ -19,17 +19,18 @@
 
 package org.ofbiz.minilang.method.callops;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 
-import javolution.util.FastList;
-
-import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.ObjectType;
 import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
+import org.ofbiz.base.util.string.FlexibleStringExpander;
 import org.ofbiz.minilang.MiniLangException;
+import org.ofbiz.minilang.MiniLangUtil;
+import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
-import org.ofbiz.minilang.method.ContextAccessor;
 import org.ofbiz.minilang.method.FieldObject;
 import org.ofbiz.minilang.method.MethodContext;
 import org.ofbiz.minilang.method.MethodObject;
@@ -38,74 +39,84 @@ import org.ofbiz.minilang.method.StringO
 import org.w3c.dom.Element;
 
 /**
- * Calls a Java class method using the given fields as parameters
+ * Calls a static method on a Java class.
  */
-public class CallClassMethod extends MethodOperation {
+public final class CallClassMethod extends MethodOperation {
 
     public static final String module = CallClassMethod.class.getName();
 
-    String className;
-    String methodName;
-    /** A list of MethodObject objects to use as the method call parameters */
-    List<MethodObject<?>> parameters;
-    ContextAccessor<Object> retFieldAcsr;
-    ContextAccessor<Map<String, Object>> retMapAcsr;
+    private final String className;
+    private final Class<?> methodClass;
+    private final String methodName;
+    private final List<MethodObject<?>> parameters;
+    private final FlexibleMapAccessor<Object> retFieldFma;
 
     public CallClassMethod(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
-        className = element.getAttribute("class-name");
-        methodName = element.getAttribute("method-name");
-        // the schema for this element now just has the "ret-field" attribute, though the
-        // old "ret-field-name" and "ret-map-name" pair is still supported
-        retFieldAcsr = new ContextAccessor<Object>(element.getAttribute("ret-field"), element.getAttribute("ret-field-name"));
-        retMapAcsr = new ContextAccessor<Map<String, Object>>(element.getAttribute("ret-map-name"));
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.handleError("<call-class-method> element is deprecated (use <script>)", simpleMethod, element);
+            MiniLangValidate.attributeNames(simpleMethod, element, "class-name", "method-name", "ret-field");
+            MiniLangValidate.constantAttributes(simpleMethod, element, "class-name", "method-name");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "class-name", "method-name");
+            MiniLangValidate.childElements(simpleMethod, element, "string", "field");
+        }
+        this.className = element.getAttribute("class-name");
+        Class<?> methodClass = null;
+        try {
+            methodClass = ObjectType.loadClass(this.className);
+        } catch (ClassNotFoundException e) {
+            MiniLangValidate.handleError("Class not found with name " + this.className, simpleMethod, element);
+        }
+        this.methodClass = methodClass;
+        this.methodName = element.getAttribute("method-name");
+        this.retFieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("ret-field"));
         List<? extends Element> parameterElements = UtilXml.childElementList(element);
         if (parameterElements.size() > 0) {
-            parameters = FastList.newInstance();
+            ArrayList<MethodObject<?>> parameterList = new ArrayList<MethodObject<?>>(parameterElements.size());
             for (Element parameterElement : parameterElements) {
-                MethodObject<?> methodObject = null;
                 if ("string".equals(parameterElement.getNodeName())) {
-                    methodObject = new StringObject(parameterElement, simpleMethod);
+                    parameterList.add(new StringObject(parameterElement, simpleMethod));
                 } else if ("field".equals(parameterElement.getNodeName())) {
-                    methodObject = new FieldObject<Object>(parameterElement, simpleMethod);
-                } else {
-                    // whoops, invalid tag here, print warning
-                    Debug.logWarning("Found an unsupported tag under the call-object-method tag: " + parameterElement.getNodeName() + "; ignoring", module);
-                }
-                if (methodObject != null) {
-                    parameters.add(methodObject);
+                    parameterList.add(new FieldObject<Object>(parameterElement, simpleMethod));
                 }
             }
+            parameterList.trimToSize();
+            this.parameters = Collections.unmodifiableList(parameterList);
+        } else {
+            this.parameters = null;
         }
     }
 
     @Override
     public boolean exec(MethodContext methodContext) throws MiniLangException {
-        String className = methodContext.expandString(this.className);
-        String methodName = methodContext.expandString(this.methodName);
-        Class<?> methodClass = null;
-        try {
-            methodClass = ObjectType.loadClass(className, methodContext.getLoader());
-        } catch (ClassNotFoundException e) {
-            Debug.logError(e, "Class to create not found with name " + className + " in create-object operation", module);
-
-            String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Class to create not found with name " + className + ": " + e.toString() + "]";
-            methodContext.setErrorReturn(errMsg, simpleMethod);
-            return false;
-        }
-        return CallObjectMethod.callMethod(simpleMethod, methodContext, parameters, methodClass, null, methodName, retFieldAcsr, retMapAcsr);
+        MiniLangUtil.callMethod(this, methodContext, parameters, methodClass, null, methodName, retFieldFma);
+        return true;
     }
 
     @Override
     public String expandedString(MethodContext methodContext) {
-        // TODO: something more than a stub/dummy
-        return this.rawString();
+        return FlexibleStringExpander.expandString(toString(), methodContext.getEnvMap());
     }
 
     @Override
     public String rawString() {
-        // TODO: something more than the empty tag
-        return "<call-class-method/>";
+        return toString();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<call-class-method ");
+        if (!this.className.isEmpty()) {
+            sb.append("class-name=\"").append(this.className).append("\" ");
+        }
+        if (!this.methodName.isEmpty()) {
+            sb.append("method-name=\"").append(this.methodName).append("\" ");
+        }
+        if (!this.retFieldFma.isEmpty()) {
+            sb.append("ret-field=\"").append(this.retFieldFma).append("\" ");
+        }
+        sb.append("/>");
+        return sb.toString();
     }
 
     public static final class CallClassMethodFactory implements Factory<CallClassMethod> {

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallObjectMethod.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallObjectMethod.java?rev=1333491&r1=1333490&r2=1333491&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallObjectMethod.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CallObjectMethod.java Thu May  3 14:59:56 2012
@@ -18,19 +18,18 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.callops;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 
-import javolution.util.FastList;
-import javolution.util.FastMap;
-
-import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
+import org.ofbiz.base.util.string.FlexibleStringExpander;
 import org.ofbiz.minilang.MiniLangException;
+import org.ofbiz.minilang.MiniLangRuntimeException;
+import org.ofbiz.minilang.MiniLangUtil;
+import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
-import org.ofbiz.minilang.method.ContextAccessor;
 import org.ofbiz.minilang.method.FieldObject;
 import org.ofbiz.minilang.method.MethodContext;
 import org.ofbiz.minilang.method.MethodObject;
@@ -41,155 +40,78 @@ import org.w3c.dom.Element;
 /**
  * Calls a Java object method using the given fields as parameters
  */
-public class CallObjectMethod extends MethodOperation {
+public final class CallObjectMethod extends MethodOperation {
 
     public static final String module = CallClassMethod.class.getName();
 
-    public static boolean callMethod(SimpleMethod simpleMethod, MethodContext methodContext, List<MethodObject<?>> parameters, Class<?> methodClass, Object methodObject, String methodName, ContextAccessor<Object> retFieldAcsr, ContextAccessor<Map<String, Object>> retMapAcsr) {
-        Object[] args = null;
-        Class<?>[] parameterTypes = null;
-        if (parameters != null) {
-            args = new Object[parameters.size()];
-            parameterTypes = new Class<?>[parameters.size()];
-            int i = 0;
-            for (MethodObject<?> methodObjectDef : parameters) {
-                args[i] = methodObjectDef.getObject(methodContext);
-                Class<?> typeClass = methodObjectDef.getTypeClass(methodContext.getLoader());
-                if (typeClass == null) {
-                    String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Parameter type not found with name " + methodObjectDef.getTypeName() + "]";
-                    Debug.logError(errMsg, module);
-                    methodContext.setErrorReturn(errMsg, simpleMethod);
-                    return false;
-                }
-                parameterTypes[i] = typeClass;
-                i++;
-            }
-        }
-        try {
-            Method method = methodClass.getMethod(methodName, parameterTypes);
-            try {
-                Object retValue = method.invoke(methodObject, args);
-                // if retFieldAcsr is empty, ignore return value
-                if (!retFieldAcsr.isEmpty()) {
-                    if (!retMapAcsr.isEmpty()) {
-                        Map<String, Object> retMap = retMapAcsr.get(methodContext);
-                        if (retMap == null) {
-                            retMap = FastMap.newInstance();
-                            retMapAcsr.put(methodContext, retMap);
-                        }
-                        retFieldAcsr.put(retMap, retValue, methodContext);
-                    } else {
-                        // no map name, use the env
-                        retFieldAcsr.put(methodContext, retValue);
-                    }
-                }
-            } catch (IllegalAccessException e) {
-                Debug.logError(e, "Could not access method in call method operation", module);
-                String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Could not access method to execute named " + methodName + ": " + e.toString() + "]";
-                methodContext.setErrorReturn(errMsg, simpleMethod);
-                return false;
-            } catch (IllegalArgumentException e) {
-                Debug.logError(e, "Illegal argument calling method in call method operation", module);
-                String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Illegal argument calling method to execute named " + methodName + ": " + e.toString() + "]";
-                methodContext.setErrorReturn(errMsg, simpleMethod);
-                return false;
-            } catch (InvocationTargetException e) {
-                Debug.logError(e.getTargetException(), "Method in call method operation threw an exception", module);
-                String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Method to execute named " + methodName + " threw an exception: " + e.getTargetException() + "]";
-                methodContext.setErrorReturn(errMsg, simpleMethod);
-                return false;
-            }
-        } catch (NoSuchMethodException e) {
-            Debug.logError(e, "Could not find method to execute in simple-method call method operation", module);
-            String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Could not find method to execute named " + methodName + ": " + e.toString() + "]";
-            methodContext.setErrorReturn(errMsg, simpleMethod);
-            return false;
-        } catch (SecurityException e) {
-            Debug.logError(e, "Security exception finding method to execute in simple-method call method operation", module);
-            String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Security exception finding method to execute named " + methodName + ": " + e.toString() + "]";
-            methodContext.setErrorReturn(errMsg, simpleMethod);
-            return false;
-        }
-        return true;
-    }
-
-    String methodName;
-    ContextAccessor<Object> objFieldAcsr;
-    ContextAccessor<Map<String, ? extends Object>> objMapAcsr;
-    /** A list of MethodObject objects to use as the method call parameters */
-    List<MethodObject<?>> parameters;
-    ContextAccessor<Object> retFieldAcsr;
-    ContextAccessor<Map<String, Object>> retMapAcsr;
+    private final String methodName;
+    private final FlexibleMapAccessor<Object> objFieldFma;
+    private final List<MethodObject<?>> parameters;
+    private final FlexibleMapAccessor<Object> retFieldFma;
 
     public CallObjectMethod(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
-        // the schema for this element now just has the "obj-field" attribute, though the
-        // old "obj-field-name" and "obj-map-name" pair is still supported
-        objFieldAcsr = new ContextAccessor<Object>(element.getAttribute("obj-field"), element.getAttribute("obj-field-name"));
-        objMapAcsr = new ContextAccessor<Map<String, ? extends Object>>(element.getAttribute("obj-map-name"));
-        methodName = element.getAttribute("method-name");
-        // the schema for this element now just has the "ret-field" attribute, though the
-        // old "ret-field-name" and "ret-map-name" pair is still supported
-        retFieldAcsr = new ContextAccessor<Object>(element.getAttribute("ret-field"), element.getAttribute("ret-field-name"));
-        retMapAcsr = new ContextAccessor<Map<String, Object>>(element.getAttribute("ret-map-name"));
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.handleError("<call-object-method> element is deprecated (use <script>)", simpleMethod, element);
+            MiniLangValidate.attributeNames(simpleMethod, element, "obj-field", "method-name", "ret-field");
+            MiniLangValidate.constantAttributes(simpleMethod, element, "method-name");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "obj-field", "method-name");
+            MiniLangValidate.childElements(simpleMethod, element, "string", "field");
+        }
+        this.methodName = element.getAttribute("method-name");
+        this.objFieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("obj-field"));
+        this.retFieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("ret-field"));
         List<? extends Element> parameterElements = UtilXml.childElementList(element);
         if (parameterElements.size() > 0) {
-            parameters = FastList.newInstance();
+            ArrayList<MethodObject<?>> parameterList = new ArrayList<MethodObject<?>>(parameterElements.size());
             for (Element parameterElement : parameterElements) {
-                MethodObject<?> methodObject = null;
                 if ("string".equals(parameterElement.getNodeName())) {
-                    methodObject = new StringObject(parameterElement, simpleMethod);
+                    parameterList.add(new StringObject(parameterElement, simpleMethod));
                 } else if ("field".equals(parameterElement.getNodeName())) {
-                    methodObject = new FieldObject<Object>(parameterElement, simpleMethod);
-                } else {
-                    // whoops, invalid tag here, print warning
-                    Debug.logWarning("Found an unsupported tag under the call-object-method tag: " + parameterElement.getNodeName() + "; ignoring", module);
-                }
-                if (methodObject != null) {
-                    parameters.add(methodObject);
+                    parameterList.add(new FieldObject<Object>(parameterElement, simpleMethod));
                 }
             }
+            parameterList.trimToSize();
+            this.parameters = Collections.unmodifiableList(parameterList);
+        } else {
+            this.parameters = null;
         }
     }
 
     @Override
     public boolean exec(MethodContext methodContext) throws MiniLangException {
-        String methodName = methodContext.expandString(this.methodName);
-        Object methodObject = null;
-        if (!objMapAcsr.isEmpty()) {
-            Map<String, ? extends Object> fromMap = objMapAcsr.get(methodContext);
-            if (fromMap == null) {
-                Debug.logWarning("Map not found with name " + objMapAcsr + ", which should contain the object to execute a method on; not executing method, rerturning error.", module);
-                String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Map not found with name " + objMapAcsr + ", which should contain the object to execute a method on]";
-                methodContext.setErrorReturn(errMsg, simpleMethod);
-                return false;
-            }
-            methodObject = objFieldAcsr.get(fromMap, methodContext);
-        } else {
-            // no map name, try the env
-            methodObject = objFieldAcsr.get(methodContext);
-        }
+        Object methodObject = this.objFieldFma.get(methodContext.getEnvMap());
         if (methodObject == null) {
-            if (Debug.infoOn())
-                Debug.logInfo("Object not found to execute method on with name " + objFieldAcsr + " in Map with name " + objMapAcsr + ", not executing method, rerturning error.", module);
-            String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Object not found to execute method on with name " + objFieldAcsr + " in Map with name " + objMapAcsr + "]";
-            methodContext.setErrorReturn(errMsg, simpleMethod);
-            return false;
+            throw new MiniLangRuntimeException("Object not found: " + this.objFieldFma, this);
         }
-        Class<?> methodClass = methodObject.getClass();
-        return CallObjectMethod.callMethod(simpleMethod, methodContext, parameters, methodClass, methodObject, methodName, retFieldAcsr, retMapAcsr);
+        MiniLangUtil.callMethod(this, methodContext, parameters, methodObject.getClass(), methodObject, methodName, retFieldFma);
+        return true;
     }
 
     @Override
     public String expandedString(MethodContext methodContext) {
-        // TODO: something more than a stub/dummy
-        return this.rawString();
+        return FlexibleStringExpander.expandString(toString(), methodContext.getEnvMap());
     }
 
     @Override
     public String rawString() {
-        // TODO: something more than the empty tag
-        return "<call-object-method/>";
+        return toString();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<call-class-method ");
+        if (!this.objFieldFma.isEmpty()) {
+            sb.append("obj-field=\"").append(this.objFieldFma).append("\" ");
+        }
+        if (!this.methodName.isEmpty()) {
+            sb.append("method-name=\"").append(this.methodName).append("\" ");
+        }
+        if (!this.retFieldFma.isEmpty()) {
+            sb.append("ret-field=\"").append(this.retFieldFma).append("\" ");
+        }
+        sb.append("/>");
+        return sb.toString();
     }
 
     public static final class CallObjectMethodFactory implements Factory<CallObjectMethod> {

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CreateObject.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CreateObject.java?rev=1333491&r1=1333490&r2=1333491&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CreateObject.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/callops/CreateObject.java Thu May  3 14:59:56 2012
@@ -99,8 +99,10 @@ public class CreateObject extends Method
             int i = 0;
             for (MethodObject<?> methodObjectDef : parameters) {
                 args[i] = methodObjectDef.getObject(methodContext);
-                Class<?> typeClass = methodObjectDef.getTypeClass(methodContext.getLoader());
-                if (typeClass == null) {
+                Class<?> typeClass = null;
+                try {
+                    typeClass = methodObjectDef.getTypeClass(methodContext);
+                } catch (ClassNotFoundException e) {
                     String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Parameter type not found with name " + methodObjectDef.getTypeName() + "]";
                     Debug.logError(errMsg, module);
                     methodContext.setErrorReturn(errMsg, simpleMethod);