|
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"; } |
| Free forum by Nabble | Edit this page |
