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/04/29 10:07:10 UTC

svn commit: r1331874 - in /ofbiz/trunk/framework/minilang: dtd/simple-methods-v2.xsd src/org/ofbiz/minilang/method/otherops/Log.java

Author: adrianc
Date: Sun Apr 29 08:07:10 2012
New Revision: 1331874

URL: http://svn.apache.org/viewvc?rev=1331874&view=rev
Log:
Overhauled Mini-language <log> element.

Modified:
    ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/otherops/Log.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=1331874&r1=1331873&r2=1331874&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd (original)
+++ ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd Sun Apr 29 08:07:10 2012
@@ -4400,61 +4400,44 @@ under the License.
     <xs:element name="log" substitutionGroup="OtherOperations">
         <xs:annotation>
             <xs:documentation>
-                The log tag logs a message used the OFBiz Debug class, which uses Log4J to log to the console, a file, or some other location.
-                The message is a concatenation of the message attribute and then all of the field and string sub-element values in the order they are specified.
+                Logs a message.
             </xs:documentation>
         </xs:annotation>
         <xs:complexType>
-            <xs:choice minOccurs="0" maxOccurs="unbounded">
-                <xs:element ref="field">
-                    <xs:annotation>
-                        <xs:documentation>
-                            Inserts the value of the field into the message where specified.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element ref="string">
-                    <xs:annotation>
-                        <xs:documentation>
-                            Inserts the value of the inline string into the message where specified.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-            </xs:choice>
-            <xs:attributeGroup ref="attlist.log"/>
+            <xs:attribute name="level" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The logging/debug level to use.
+                        Must be one of the following: verbose | timing | info | important | warning | error | fatal | always.
+                        Defaults to "info".
+                        &lt;br/&gt;&lt;br/&gt;
+                        Required. Attribute type: constant.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:simpleType>
+                    <xs:restriction base="xs:token">
+                        <xs:enumeration value="info" />
+                        <xs:enumeration value="verbose" />
+                        <xs:enumeration value="timing" />
+                        <xs:enumeration value="important" />
+                        <xs:enumeration value="warning" />
+                        <xs:enumeration value="error" />
+                        <xs:enumeration value="fatal" />
+                        <xs:enumeration value="always" />
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute type="xs:string" name="message" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The message to log.
+                        &lt;br/&gt;&lt;br/&gt;
+                        Required. Attribute type: constant+expr.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
         </xs:complexType>
     </xs:element>
-    <xs:attributeGroup name="attlist.log">
-        <xs:attribute name="level" use="required">
-            <xs:annotation>
-                <xs:documentation>
-                    The logging/debug level to use.
-                    Must be one of the following: verbose | timing | info | important | warning | error | fatal | always.
-                    These are the standard OFBiz logging levels.
-                </xs:documentation>
-            </xs:annotation>
-            <xs:simpleType>
-                <xs:restriction base="xs:token">
-                    <xs:enumeration value="verbose"/>
-                    <xs:enumeration value="timing"/>
-                    <xs:enumeration value="info"/>
-                    <xs:enumeration value="important"/>
-                    <xs:enumeration value="warning"/>
-                    <xs:enumeration value="error"/>
-                    <xs:enumeration value="fatal"/>
-                    <xs:enumeration value="always"/>
-                </xs:restriction>
-            </xs:simpleType>
-        </xs:attribute>
-        <xs:attribute type="xs:string" name="message">
-            <xs:annotation>
-                <xs:documentation>
-                    A shortcut for simple messages.
-                    If used along with field and/or string sub-elements the inline string in the message will come first.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-    </xs:attributeGroup>
     <xs:element name="now" substitutionGroup="OtherOperations">
         <xs:annotation>
             <xs:documentation>

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/otherops/Log.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/otherops/Log.java?rev=1331874&r1=1331873&r2=1331874&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/otherops/Log.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/otherops/Log.java Sun Apr 29 08:07:10 2012
@@ -18,108 +18,92 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.otherops;
 
-import java.util.List;
-
-import javolution.util.FastList;
-
 import org.ofbiz.base.util.Debug;
-import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.string.FlexibleStringExpander;
 import org.ofbiz.minilang.MiniLangException;
+import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
-import org.ofbiz.minilang.method.FieldString;
 import org.ofbiz.minilang.method.MethodContext;
 import org.ofbiz.minilang.method.MethodOperation;
-import org.ofbiz.minilang.method.MethodString;
-import org.ofbiz.minilang.method.StringString;
 import org.w3c.dom.Element;
 
 /**
- * Calculates a result based on nested calcops.
+ * Logs a message.
  */
-public class Log extends MethodOperation {
+public final class Log extends MethodOperation {
 
     public static final String module = Log.class.getName();
+    private static final String[] LEVEL_ARRAY = {"always", "verbose", "timing", "info", "important", "warning", "error", "fatal", "notify"};
 
-    String levelStr;
-    String message;
-    List<MethodString> methodStrings = null;
-    Object startLine;
+    private final int level;
+    private final FlexibleStringExpander messageFse;
+    private final Object startLine;
 
     public Log(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
-        this.message = element.getAttribute("message");
-        this.levelStr = element.getAttribute("level");
-        this.startLine = element.getUserData("startLine");
-        List<? extends Element> methodStringElements = UtilXml.childElementList(element);
-        if (methodStringElements.size() > 0) {
-            methodStrings = FastList.newInstance();
-            for (Element methodStringElement : methodStringElements) {
-                if ("string".equals(methodStringElement.getNodeName())) {
-                    methodStrings.add(new StringString(methodStringElement, simpleMethod));
-                } else if ("field".equals(methodStringElement.getNodeName())) {
-                    methodStrings.add(new FieldString(methodStringElement, simpleMethod));
-                } else {
-                    // whoops, invalid tag here, print warning
-                    Debug.logWarning("Found an unsupported tag under the log tag: " + methodStringElement.getNodeName() + "; ignoring", module);
-                }
-            }
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.attributeNames(simpleMethod, element, "level", "message");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "level", "message");
+            MiniLangValidate.constantAttributes(simpleMethod, element, "level");
+            MiniLangValidate.constantPlusExpressionAttributes(simpleMethod, element, "message");
+            MiniLangValidate.noChildElements(simpleMethod, element);
+        }
+        this.messageFse = FlexibleStringExpander.getInstance(element.getAttribute("message"));
+        String levelAttribute = element.getAttribute("level");
+        if (levelAttribute.length() == 0) {
+            levelAttribute = "info";
         }
+        Integer levelInt = Debug.getLevelFromString(levelAttribute);
+        if (levelInt == null) {
+            MiniLangValidate.handleError("Invalid level attribute", simpleMethod, element);
+            this.level = Debug.INFO;
+        } else {
+            this.level = levelInt.intValue();
+        }
+        this.startLine = element.getUserData("startLine");
     }
 
     @Override
     public boolean exec(MethodContext methodContext) throws MiniLangException {
-        String levelStr = methodContext.expandString(this.levelStr);
-        String message = methodContext.expandString(this.message);
-        int level;
-        Integer levelInt = Debug.getLevelFromString(levelStr);
-        if (levelInt == null) {
-            Debug.logWarning("Specified level [" + levelStr + "] was not valid, using INFO", module);
-            level = Debug.INFO;
-        } else {
-            level = levelInt.intValue();
-        }
-        // bail out quick if the logging level isn't on, ie don't even create string
-        if (!Debug.isOn(level)) {
-            return true;
-        }
-        StringBuilder buf = new StringBuilder();
-        buf.append("[");
-        String methodLocation = this.simpleMethod.getFromLocation();
-        int pos = methodLocation.lastIndexOf("/");
-        if (pos != -1) {
-            methodLocation = methodLocation.substring(pos + 1);
-        }
-        buf.append(methodLocation);
-        buf.append("#");
-        buf.append(this.simpleMethod.getMethodName());
-        if (this.startLine != null) {
-            buf.append(" line ");
-            buf.append(this.startLine);
-        }
-        buf.append("] ");
-        if (message != null)
-            buf.append(message);
-        if (methodStrings != null) {
-            for (MethodString methodString : methodStrings) {
-                String strValue = methodString.getString(methodContext);
-                if (strValue != null)
-                    buf.append(strValue);
+        if (Debug.isOn(level)) {
+            String message = this.messageFse.expandString(methodContext.getEnvMap());
+            StringBuilder buf = new StringBuilder("[");
+            String methodLocation = this.simpleMethod.getFromLocation();
+            int pos = methodLocation.lastIndexOf("/");
+            if (pos != -1) {
+                methodLocation = methodLocation.substring(pos + 1);
+            }
+            buf.append(methodLocation);
+            buf.append("#");
+            buf.append(this.simpleMethod.getMethodName());
+            if (this.startLine != null) {
+                buf.append(" line ");
+                buf.append(this.startLine);
             }
+            buf.append("] ");
+            buf.append(message);
+            Debug.log(this.level, null, buf.toString(), module);
         }
-        Debug.log(level, null, buf.toString(), module);
         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: add all attributes and other info
-        return "<log level=\"" + this.levelStr + "\" message=\"" + this.message + "\"/>";
+        return toString();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<log ");
+        sb.append("level=\"").append(LEVEL_ARRAY[this.level]).append("\" ");
+        sb.append("message=\"").append(this.messageFse).append("\" ");
+        sb.append("/>");
+        return sb.toString();
     }
 
     public static final class LogFactory implements Factory<Log> {