Author: adrianc
Date: Thu May 17 18:23:20 2012
New Revision: 1339771
URL: http://svn.apache.org/viewvc?rev=1339771&view=rev
Log:
Overhauled Mini-language <if-instance-of> and <if-not-empty> elements.
Modified:
ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/CheckPermission.java
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfInstanceOf.java
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfNotEmpty.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=1339771&r1=1339770&r2=1339771&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd (original)
+++ ofbiz/trunk/framework/minilang/dtd/simple-methods-v2.xsd Thu May 17
18:23:20 2012
@@ -3921,32 +3921,32 @@ under the License.
<xs:documentation>
The else tag can be used to contain operations
that will run if the condition fails,
or in other words if the operations under the if
tag do not run.
-
It can contain any simple-method operation.
The else tag must be placed as the last tag under
the if-* tag.
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
- <xs:attributeGroup ref="attlist.if-instance-of"/>
+ <xs:attribute type="xs:string" name="field" use="required">
+ <xs:annotation>
+ <xs:documentation>
+ The name of the field to test.
+ <br/><br/>
+ Required. Attribute type: expression.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute type="xs:string" name="class" use="required">
+ <xs:annotation>
+ <xs:documentation>
+ The name of the class to test for.
+ <br/><br/>
+ Required. Attribute type: constant.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
</xs:complexType>
</xs:element>
- <xs:attributeGroup name="attlist.if-instance-of">
- <xs:attribute type="xs:string" name="field" use="required">
- <xs:annotation>
- <xs:documentation>
- The name of the map field that will be validated as being
an instance of the named class.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- <xs:attribute type="xs:string" name="class" use="required">
- <xs:annotation>
- <xs:documentation>
- The name of the class that named instance in field-name is
supposed to belong.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:attributeGroup>
<xs:element name="if-compare" substitutionGroup="IfBasicOperations">
<xs:annotation>
<xs:documentation>
@@ -4125,25 +4125,23 @@ under the License.
<xs:documentation>
The else tag can be used to contain operations
that will run if the condition fails,
or in other words if the operations under the if
tag do not run.
-
It can contain any simple-method operation.
The else tag must be placed as the last tag under
the if-* tag.
</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
- <xs:attributeGroup ref="attlist.if-not-empty"/>
+ <xs:attribute type="xs:string" name="field" use="required">
+ <xs:annotation>
+ <xs:documentation>
+ The name of the context field that will be compared.
+ <br/><br/>
+ Required. Attribute type: expression.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
</xs:complexType>
</xs:element>
- <xs:attributeGroup name="attlist.if-not-empty">
- <xs:attribute type="xs:string" name="field" use="required">
- <xs:annotation>
- <xs:documentation>
- The name of the context field that will be compared.
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
- </xs:attributeGroup>
<xs:element name="if-has-permission" substitutionGroup="IfBasicOperations">
<xs:annotation>
<xs:documentation>
Modified:
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/CheckPermission.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/CheckPermission.java?rev=1339771&r1=1339770&r2=1339771&view=diff
==============================================================================
---
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/CheckPermission.java
(original)
+++
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/CheckPermission.java
Thu May 17 18:23:20 2012
@@ -39,7 +39,7 @@ import org.ofbiz.security.authz.Authoriz
import org.w3c.dom.Element;
/**
- * If the user does not have the specified permission the fail-message or
fail-property sub-elements are used to add a message to the error-list.
+ * Implements the <check-permission> element.
*/
public final class CheckPermission extends MethodOperation {
@@ -127,11 +127,16 @@ public final class CheckPermission exten
return sb.toString();
}
+ /**
+ * A <check-permission> element factory.
+ */
public static final class CheckPermissionFactory implements
Factory<CheckPermission> {
+ @Override
public CheckPermission createMethodOperation(Element element,
SimpleMethod simpleMethod) throws MiniLangException {
return new CheckPermission(element, simpleMethod);
}
+ @Override
public String getName() {
return "check-permission";
}
Modified:
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfInstanceOf.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfInstanceOf.java?rev=1339771&r1=1339770&r2=1339771&view=diff
==============================================================================
---
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfInstanceOf.java
(original)
+++
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfInstanceOf.java
Thu May 17 18:23:20 2012
@@ -20,61 +20,70 @@ package org.ofbiz.minilang.method.ifops;
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.MiniLangRuntimeException;
+import org.ofbiz.minilang.MiniLangValidate;
import org.ofbiz.minilang.SimpleMethod;
-import org.ofbiz.minilang.method.ContextAccessor;
import org.ofbiz.minilang.method.MethodContext;
import org.ofbiz.minilang.method.MethodOperation;
import org.w3c.dom.Element;
-public class IfInstanceOf extends MethodOperation {
-
- public static final String module = IfInstanceOf.class.getName();
-
- protected String className = null;
- protected List<MethodOperation> elseSubOps = null;
- protected ContextAccessor<Object> fieldAcsr = null;
- protected ContextAccessor<Map<String, ? extends Object>> mapAcsr = null;
- protected List<MethodOperation> subOps;
+/**
+ * Implements the <if-instance-of> element.
+ */
+public final class IfInstanceOf extends MethodOperation {
+
+ private final String className;
+ private final Class<?> compareClass;
+ private final List<MethodOperation> elseSubOps;
+ private final FlexibleMapAccessor<Object> fieldFma;
+ private final List<MethodOperation> subOps;
public IfInstanceOf(Element element, SimpleMethod simpleMethod) throws
MiniLangException {
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
- this.fieldAcsr = new
ContextAccessor<Object>(element.getAttribute("field"),
element.getAttribute("field-name"));
- this.mapAcsr = new ContextAccessor<Map<String, ? extends
Object>>(element.getAttribute("map-name"));
+ if (MiniLangValidate.validationOn()) {
+ MiniLangValidate.attributeNames(simpleMethod, element, "field",
"class");
+ MiniLangValidate.requiredAttributes(simpleMethod, element,
"field", "class");
+ MiniLangValidate.constantAttributes(simpleMethod, element,
"class");
+ MiniLangValidate.expressionAttributes(simpleMethod, element,
"field");
+ }
+ this.fieldFma =
FlexibleMapAccessor.getInstance(element.getAttribute("field"));
this.className = element.getAttribute("class");
+ Class<?> compareClass = null;
+ if (!className.isEmpty()) {
+ try {
+ compareClass = ObjectType.loadClass(className);
+ } catch (ClassNotFoundException e) {
+ MiniLangValidate.handleError("Invalid class name " +
className, simpleMethod, element);
+ }
+ }
+ this.compareClass = compareClass;
this.subOps =
Collections.unmodifiableList(SimpleMethod.readOperations(element,
simpleMethod));
Element elseElement = UtilXml.firstChildElement(element, "else");
if (elseElement != null) {
this.elseSubOps =
Collections.unmodifiableList(SimpleMethod.readOperations(elseElement,
simpleMethod));
+ } else {
+ this.elseSubOps = null;
}
}
@Override
public boolean exec(MethodContext methodContext) throws MiniLangException {
- // only run subOps if element is instanceOf
+ if (this.compareClass == null) {
+ throw new MiniLangRuntimeException("Invalid class name " +
className, this);
+ }
boolean runSubOps = false;
- Object fieldVal = null;
- if (!mapAcsr.isEmpty()) {
- Map<String, ? extends Object> fromMap = mapAcsr.get(methodContext);
- if (fromMap == null) {
- if (Debug.infoOn())
- Debug.logInfo("Map not found with name " + mapAcsr + ",
running operations", module);
- } else {
- fieldVal = fieldAcsr.get(fromMap, methodContext);
- }
- } else {
- // no map name, try the env
- fieldVal = fieldAcsr.get(methodContext);
+ Object fieldVal = fieldFma.get(methodContext.getEnvMap());
+ if (fieldVal != null) {
+ runSubOps = ObjectType.instanceOf(fieldVal.getClass(),
compareClass);
}
- runSubOps = ObjectType.instanceOf(fieldVal, className);
if (runSubOps) {
return SimpleMethod.runSubOps(subOps, methodContext);
} else {
@@ -88,8 +97,7 @@ public class IfInstanceOf extends Method
@Override
public String expandedString(MethodContext methodContext) {
- // TODO: something more than a stub/dummy
- return this.rawString();
+ return FlexibleStringExpander.expandString(toString(),
methodContext.getEnvMap());
}
public List<MethodOperation> getAllSubOps() {
@@ -102,15 +110,30 @@ public class IfInstanceOf extends Method
@Override
public String rawString() {
- // TODO: add all attributes and other info
- return "<if-instance-of field-name=\"" + this.fieldAcsr + "\"
map-name=\"" + this.mapAcsr + "\"/>";
+ return toString();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("<if-instance-of ");
+ sb.append("field=\"").append(this.fieldFma).append("\" ");
+ if (compareClass != null) {
+ sb.append("class=\"").append(compareClass.getName()).append("\" ");
+ }
+ sb.append("/>");
+ return sb.toString();
}
+ /**
+ * A <if-instance-of> element factory.
+ */
public static final class IfInstanceOfFactory implements
Factory<IfInstanceOf> {
+ @Override
public IfInstanceOf createMethodOperation(Element element,
SimpleMethod simpleMethod) throws MiniLangException {
return new IfInstanceOf(element, simpleMethod);
}
+ @Override
public String getName() {
return "if-instance-of";
}
Modified:
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfNotEmpty.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfNotEmpty.java?rev=1339771&r1=1339770&r2=1339771&view=diff
==============================================================================
---
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfNotEmpty.java
(original)
+++
ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfNotEmpty.java
Thu May 17 18:23:20 2012
@@ -20,81 +20,49 @@ package org.ofbiz.minilang.method.ifops;
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.SimpleMethod;
-import org.ofbiz.minilang.method.ContextAccessor;
import org.ofbiz.minilang.method.MethodContext;
import org.ofbiz.minilang.method.MethodOperation;
import org.w3c.dom.Element;
/**
- * If the specified field is not empty process sub-operations
+ * Implements the <if-not-empty> element.
*/
-public class IfNotEmpty extends MethodOperation {
+public final class IfNotEmpty extends MethodOperation {
- public static final String module = IfNotEmpty.class.getName();
-
- protected List<MethodOperation> elseSubOps = null;
- protected ContextAccessor<Object> fieldAcsr;
- protected ContextAccessor<Map<String, ? extends Object>> mapAcsr;
- protected List<MethodOperation> subOps;
+ private final List<MethodOperation> elseSubOps;
+ private final FlexibleMapAccessor<Object> fieldFma;
+ private final List<MethodOperation> subOps;
public IfNotEmpty(Element element, SimpleMethod simpleMethod) throws
MiniLangException {
super(element, simpleMethod);
- // NOTE: this is still supported, but is deprecated
- this.mapAcsr = new ContextAccessor<Map<String, ? extends
Object>>(element.getAttribute("map-name"));
- this.fieldAcsr = new
ContextAccessor<Object>(element.getAttribute("field"));
- if (this.fieldAcsr.isEmpty()) {
- // NOTE: this is still supported, but is deprecated
- this.fieldAcsr = new
ContextAccessor<Object>(element.getAttribute("field-name"));
- }
+ this.fieldFma =
FlexibleMapAccessor.getInstance(element.getAttribute("field"));
this.subOps =
Collections.unmodifiableList(SimpleMethod.readOperations(element,
simpleMethod));
Element elseElement = UtilXml.firstChildElement(element, "else");
if (elseElement != null) {
this.elseSubOps =
Collections.unmodifiableList(SimpleMethod.readOperations(elseElement,
simpleMethod));
+ } else {
+ this.elseSubOps = null;
}
}
@Override
public boolean exec(MethodContext methodContext) throws MiniLangException {
- // if conditions fails, always return true; if a sub-op returns false
- // return false and stop, otherwise return true
- // return true;
- Object fieldVal = null;
- if (!mapAcsr.isEmpty()) {
- Map<String, ? extends Object> fromMap = mapAcsr.get(methodContext);
- if (fromMap == null) {
- if (Debug.verboseOn())
- Debug.logVerbose("Map not found with name " + mapAcsr + ",
not running operations", module);
- } else {
- fieldVal = fieldAcsr.get(fromMap, methodContext);
- }
- } else {
- // no map name, try the env
- fieldVal = fieldAcsr.get(methodContext);
- }
- if (fieldVal == null) {
- if (Debug.verboseOn())
- Debug.logVerbose("Field value not found with name " +
fieldAcsr + " in Map with name " + mapAcsr + ", not running operations",
module);
- }
- // only run subOps if element is not empty/null
- boolean runSubOps = !ObjectType.isEmpty(fieldVal);
- if (runSubOps) {
- // if (Debug.verboseOn()) Debug.logVerbose("IfNotEmpty: Running if
operations mapAcsr=" + mapAcsr + " fieldAcsr=" + fieldAcsr, module);
+ Object fieldVal = fieldFma.get(methodContext.getEnvMap());
+ if (!ObjectType.isEmpty(fieldVal)) {
return SimpleMethod.runSubOps(subOps, methodContext);
} else {
if (elseSubOps != null) {
- // if (Debug.verboseOn()) Debug.logVerbose("IfNotEmpty:
Running else operations mapAcsr=" + mapAcsr + " fieldAcsr=" + fieldAcsr,
module);
return SimpleMethod.runSubOps(elseSubOps, methodContext);
} else {
- // if (Debug.verboseOn()) Debug.logVerbose("IfNotEmpty: Not
Running any operations mapAcsr=" + mapAcsr + " fieldAcsr=" + fieldAcsr, module);
return true;
}
}
@@ -102,8 +70,7 @@ public class IfNotEmpty extends MethodOp
@Override
public String expandedString(MethodContext methodContext) {
- // TODO: something more than a stub/dummy
- return this.rawString();
+ return FlexibleStringExpander.expandString(toString(),
methodContext.getEnvMap());
}
public List<MethodOperation> getAllSubOps() {
@@ -116,15 +83,26 @@ public class IfNotEmpty extends MethodOp
@Override
public String rawString() {
- // TODO: add all attributes and other info
- return "<if-not-empty field-name=\"" + this.fieldAcsr + "\"
map-name=\"" + this.mapAcsr + "\"/>";
+ return toString();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("<if-instance-of ");
+ sb.append("field=\"").append(this.fieldFma).append("\"/>");
+ return sb.toString();
}
+ /**
+ * A <if-not-empty> element factory.
+ */
public static final class IfNotEmptyFactory implements Factory<IfNotEmpty>
{
+ @Override
public IfNotEmpty createMethodOperation(Element element, SimpleMethod
simpleMethod) throws MiniLangException {
return new IfNotEmpty(element, simpleMethod);
}
+ @Override
public String getName() {
return "if-not-empty";
}