|
Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Break.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Break.java?rev=1359626&r1=1359625&r2=1359626&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Break.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Break.java Tue Jul 10 12:05:55 2012 @@ -25,7 +25,9 @@ import org.ofbiz.minilang.method.MethodO import org.w3c.dom.Element; /** - * Causes script execution to exit the nearest loop element. + * Implements the <break> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cbreak%3E}}">Mini-language Reference</a> */ public class Break extends MethodOperation { @@ -39,12 +41,7 @@ public class Break extends MethodOperati } @Override - public String expandedString(MethodContext methodContext) { - return this.rawString(); - } - - @Override - public String rawString() { + public String toString() { return "<break/>"; } @@ -65,11 +62,16 @@ public class Break extends MethodOperati } } + /** + * A factory for the <break> element. + */ public static final class BreakFactory implements Factory<Break> { + @Override public Break createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new Break(element, simpleMethod); } + @Override public String getName() { return "break"; } Copied: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckErrors.java (from r1335018, ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckErrors.java) URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckErrors.java?p2=ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckErrors.java&p1=ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckErrors.java&r1=1335018&r2=1359626&rev=1359626&view=diff ============================================================================== --- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckErrors.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckErrors.java Tue Jul 10 12:05:55 2012 @@ -22,7 +22,6 @@ import java.util.List; 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.MethodContext; @@ -30,87 +29,83 @@ import org.ofbiz.minilang.method.MethodO import org.w3c.dom.Element; /** - * Halts script execution if the error message list contains any messages. + * Implements the <check-errors> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Ccheckerrors%3E}}">Mini-language Reference</a> */ public final class CheckErrors extends MethodOperation { - // This method is needed only during the v1 to v2 transition - private static boolean autoCorrect(Element element) { - String errorListAttr = element.getAttribute("error-list-name"); - if (errorListAttr.length() > 0) { - element.removeAttribute("error-list-name"); - return true; - } - return false; - } - private final FlexibleStringExpander errorCodeFse; + private final FlexibleStringExpander errorListNameFse; public CheckErrors(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); if (MiniLangValidate.validationOn()) { - MiniLangValidate.attributeNames(simpleMethod, element, "error-code"); - MiniLangValidate.constantPlusExpressionAttributes(simpleMethod, element, "error-code"); + MiniLangValidate.attributeNames(simpleMethod, element, "error-code", "error-list-name"); MiniLangValidate.noChildElements(simpleMethod, element); } - boolean elementModified = autoCorrect(element); - if (elementModified && MiniLangUtil.autoCorrectOn()) { - MiniLangUtil.flagDocumentAsCorrected(element); - } this.errorCodeFse = FlexibleStringExpander.getInstance(element.getAttribute("error-code")); + this.errorListNameFse = FlexibleStringExpander.getInstance(MiniLangValidate.checkAttribute(element.getAttribute("error-list-name"), "error_list")); } @Override public boolean exec(MethodContext methodContext) throws MiniLangException { - if (methodContext.getMethodType() == MethodContext.EVENT) { - List<Object> messages = methodContext.getEnv(this.simpleMethod.getEventErrorMessageListName()); - if (messages != null && messages.size() > 0) { + if (methodContext.isTraceOn()) { + outputTraceMessage(methodContext, "Begin check-errors."); + } + List<Object> messages = methodContext.getEnv(this.errorListNameFse.expandString(methodContext.getEnvMap())); + if (messages != null && messages.size() > 0) { + if (methodContext.getMethodType() == MethodContext.EVENT) { + methodContext.putEnv(simpleMethod.getEventErrorMessageListName(), messages); methodContext.putEnv(this.simpleMethod.getEventResponseCodeName(), getErrorCode(methodContext)); - return false; - } - } else { - List<Object> messages = methodContext.getEnv(this.simpleMethod.getServiceErrorMessageListName()); - if (messages != null && messages.size() > 0) { + } else { + methodContext.putEnv(simpleMethod.getServiceErrorMessageListName(), messages); methodContext.putEnv(this.simpleMethod.getServiceResponseMessageName(), getErrorCode(methodContext)); - return false; } + if (methodContext.isTraceOn()) { + outputTraceMessage(methodContext, "Found error messages. Setting error status and halting script execution."); + outputTraceMessage(methodContext, "End check-errors."); + } + return false; + } + if (methodContext.isTraceOn()) { + outputTraceMessage(methodContext, "No error messages found. Continuing script execution."); + outputTraceMessage(methodContext, "End check-errors."); } return true; } - @Override - public String expandedString(MethodContext methodContext) { - return FlexibleStringExpander.expandString(toString(), methodContext.getEnvMap()); - } - private String getErrorCode(MethodContext methodContext) { String errorCode = this.errorCodeFse.expandString(methodContext.getEnvMap()); - if (errorCode.length() == 0) { + if (errorCode.isEmpty()) { errorCode = this.simpleMethod.getDefaultErrorCode(); } return errorCode; } @Override - public String rawString() { - return toString(); - } - - @Override public String toString() { StringBuilder sb = new StringBuilder("<check-errors "); if (!this.errorCodeFse.isEmpty()) { sb.append("error-code=\"").append(this.errorCodeFse).append("\" "); } + if (!"error_list".equals(this.errorListNameFse.getOriginal())) { + sb.append("error-list-name=\"").append(this.errorListNameFse).append("\" "); + } sb.append("/>"); return sb.toString(); } + /** + * A factory for the <check-errors> element. + */ public static final class CheckErrorsFactory implements Factory<CheckErrors> { + @Override public CheckErrors createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new CheckErrors(element, simpleMethod); } + @Override public String getName() { return "check-errors"; } Copied: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckId.java (from r1334971, ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckId.java) URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckId.java?p2=ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckId.java&p1=ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckId.java&r1=1334971&r2=1359626&rev=1359626&view=diff ============================================================================== --- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckId.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/CheckId.java Tue Jul 10 12:05:55 2012 @@ -35,7 +35,9 @@ import org.ofbiz.minilang.method.MethodO import org.w3c.dom.Element; /** - * If the given ID field is not valid the fail-message or fail-property sub-elements are used to add a message to the error-list. + * Implements the <check-id> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Ccheckid%3E}}">Mini-language Reference</a> */ public final class CheckId extends MethodOperation { @@ -50,10 +52,11 @@ public final class CheckId extends Metho public CheckId(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); if (MiniLangValidate.validationOn()) { - MiniLangValidate.attributeNames(simpleMethod, element, "error-list-name"); + MiniLangValidate.attributeNames(simpleMethod, element, "field", "error-list-name"); + MiniLangValidate.requiredAttributes(simpleMethod, element, "field"); MiniLangValidate.constantAttributes(simpleMethod, element, "error-list-name"); + MiniLangValidate.expressionAttributes(simpleMethod, element, "field"); MiniLangValidate.childElements(simpleMethod, element, "fail-message", "fail-property"); - MiniLangValidate.requireAnyChildElement(simpleMethod, element, "fail-message", "fail-property"); } this.errorListFma = FlexibleMapAccessor.getInstance(MiniLangValidate.checkAttribute(element.getAttribute("error-list-name"), "error_list")); this.fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("field")); @@ -115,16 +118,6 @@ public final class CheckId extends Metho } @Override - public String expandedString(MethodContext methodContext) { - return FlexibleStringExpander.expandString(toString(), methodContext.getEnvMap()); - } - - @Override - public String rawString() { - return toString(); - } - - @Override public String toString() { StringBuilder sb = new StringBuilder("<check-id "); if (!this.fieldFma.isEmpty()) { @@ -144,11 +137,16 @@ public final class CheckId extends Metho return sb.toString(); } + /** + * A factory for the <check-id> element. + */ public static final class CheckIdFactory implements Factory<CheckId> { + @Override public CheckId createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new CheckId(element, simpleMethod); } + @Override public String getName() { return "check-id"; } Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/ClearField.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/ClearField.java?rev=1359626&r1=1359625&r2=1359626&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/ClearField.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/ClearField.java Tue Jul 10 12:05:55 2012 @@ -18,70 +18,57 @@ *******************************************************************************/ package org.ofbiz.minilang.method.envops; -import java.util.Map; - -import javolution.util.FastMap; - -import org.ofbiz.base.util.Debug; +import org.ofbiz.base.util.collections.FlexibleMapAccessor; import org.ofbiz.minilang.MiniLangException; +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; /** - * Clears the specified field + * Implements the <clear-field> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{<clearfield>}}">Mini-language Reference</a> */ -public class ClearField extends MethodOperation { +public final class ClearField extends MethodOperation { - public static final String module = ClearField.class.getName(); - - ContextAccessor<Object> fieldAcsr; - ContextAccessor<Map<String, Object>> mapAcsr; + private final FlexibleMapAccessor<Object> fieldFma; public ClearField(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 - fieldAcsr = new ContextAccessor<Object>(element.getAttribute("field"), element.getAttribute("field-name")); - mapAcsr = new ContextAccessor<Map<String, Object>>(element.getAttribute("map-name")); + if (MiniLangValidate.validationOn()) { + MiniLangValidate.attributeNames(simpleMethod, element, "field"); + MiniLangValidate.requiredAttributes(simpleMethod, element, "field"); + MiniLangValidate.expressionAttributes(simpleMethod, element, "field"); + MiniLangValidate.noChildElements(simpleMethod, element); + } + this.fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("field")); } @Override public boolean exec(MethodContext methodContext) throws MiniLangException { - if (!mapAcsr.isEmpty()) { - Map<String, Object> toMap = mapAcsr.get(methodContext); - if (toMap == null) { - // it seems silly to create a new map, but necessary since whenever - // an env field like a Map or List is referenced it should be created, even if empty - if (Debug.verboseOn()) - Debug.logVerbose("Map not found with name " + mapAcsr + ", creating new map", module); - toMap = FastMap.newInstance(); - mapAcsr.put(methodContext, toMap); - } - fieldAcsr.put(toMap, null, methodContext); - } else { - fieldAcsr.put(methodContext, null); - } + fieldFma.put(methodContext.getEnvMap(), null); return true; } @Override - public String expandedString(MethodContext methodContext) { - // TODO: something more than a stub/dummy - return this.rawString(); - } - - @Override - public String rawString() { - return "<clear-field field-name=\"" + this.fieldAcsr + "\" map-name=\"" + this.mapAcsr + "\"/>"; + public String toString() { + StringBuilder sb = new StringBuilder("<set "); + sb.append("field=\"").append(this.fieldFma).append("\" />"); + return sb.toString(); } + /** + * A factory for the <clear-field> element. + */ public static final class ClearFieldFactory implements Factory<ClearField> { + @Override public ClearField createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new ClearField(element, simpleMethod); } + @Override public String getName() { return "clear-field"; } Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Continue.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Continue.java?rev=1359626&r1=1359625&r2=1359626&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Continue.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Continue.java Tue Jul 10 12:05:55 2012 @@ -25,7 +25,9 @@ import org.ofbiz.minilang.method.MethodO import org.w3c.dom.Element; /** - * Causes script execution to return to the beginning of the nearest enclosing loop element. + * Implements the <continue> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Ccontinue%3E}}">Mini-language Reference</a> */ public class Continue extends MethodOperation { @@ -39,12 +41,7 @@ public class Continue extends MethodOper } @Override - public String expandedString(MethodContext methodContext) { - return this.rawString(); - } - - @Override - public String rawString() { + public String toString() { return "<continue/>"; } @@ -65,11 +62,16 @@ public class Continue extends MethodOper } } + /** + * A factory for the <continue> element. + */ public static final class ContinueFactory implements Factory<Continue> { + @Override public Continue createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new Continue(element, simpleMethod); } + @Override public String getName() { return "continue"; } Copied: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/CreateObject.java (from r1335018, ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/CreateObject.java) URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/CreateObject.java?p2=ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/CreateObject.java&p1=ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/CreateObject.java&r1=1335018&r2=1359626&rev=1359626&view=diff ============================================================================== --- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/envops/CreateObject.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/CreateObject.java Tue Jul 10 12:05:55 2012 @@ -19,19 +19,18 @@ package org.ofbiz.minilang.method.envops; import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; +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.ObjectType; import org.ofbiz.base.util.UtilXml; +import org.ofbiz.base.util.collections.FlexibleMapAccessor; 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.FieldObject; import org.ofbiz.minilang.method.MethodContext; import org.ofbiz.minilang.method.MethodObject; @@ -40,57 +39,56 @@ import org.ofbiz.minilang.method.StringO import org.w3c.dom.Element; /** - * Creates a Java object using the given fields as parameters + * Implements the <create-object> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{<createobject>}}">Mini-language Reference</a> */ -public class CreateObject extends MethodOperation { +public final class CreateObject extends MethodOperation { public static final String module = CreateObject.class.getName(); - String className; - ContextAccessor<Object> fieldAcsr; - ContextAccessor<Map<String, Object>> mapAcsr; - /** A list of MethodObject objects to use as the method call parameters */ - List<MethodObject<?>> parameters; + private final String className; + private final Class<?> targetClass; + private final FlexibleMapAccessor<Object> fieldFma; + private final List<MethodObject<?>> parameters; public CreateObject(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); + if (MiniLangValidate.validationOn()) { + MiniLangValidate.handleError("<create-object> element is deprecated (use <script>)", simpleMethod, element); + MiniLangValidate.attributeNames(simpleMethod, element, "class-name", "field"); + MiniLangValidate.expressionAttributes(simpleMethod, element, "field"); + MiniLangValidate.requiredAttributes(simpleMethod, element, "class-name", "field"); + MiniLangValidate.childElements(simpleMethod, element, "string", "field"); + } className = element.getAttribute("class-name"); - // 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<Object>(element.getAttribute("field"), element.getAttribute("field-name")); - mapAcsr = new ContextAccessor<Map<String, Object>>(element.getAttribute("map-name")); + Class<?> targetClass = null; + try { + targetClass = ObjectType.loadClass(this.className); + } catch (ClassNotFoundException e) { + MiniLangValidate.handleError("Class not found with name " + this.className, simpleMethod, element); + } + this.targetClass = targetClass; + fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("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); - 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; - } Object[] args = null; Class<?>[] parameterTypes = null; if (parameters != null) { @@ -104,8 +102,8 @@ public class CreateObject extends Method 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); + Debug.logWarning(e, errMsg, module); + simpleMethod.addErrorMessage(methodContext, errMsg); return false; } parameterTypes[i] = typeClass; @@ -113,75 +111,32 @@ public class CreateObject extends Method } } try { - Constructor<?> constructor = methodClass.getConstructor(parameterTypes); - try { - Object newObject = constructor.newInstance(args); - // if fieldAcsr is empty, ignore return value - if (!fieldAcsr.isEmpty()) { - if (!mapAcsr.isEmpty()) { - Map<String, Object> retMap = mapAcsr.get(methodContext); - if (retMap == null) { - retMap = FastMap.newInstance(); - mapAcsr.put(methodContext, retMap); - } - fieldAcsr.put(retMap, newObject, methodContext); - } else { - // no map name, use the env - fieldAcsr.put(methodContext, newObject); - } - } - } catch (InstantiationException e) { - Debug.logError(e, "Could not instantiate object in create-object operation", module); - String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Could not instantiate object: " + e.toString() + "]"; - methodContext.setErrorReturn(errMsg, simpleMethod); - return false; - } catch (IllegalAccessException e) { - Debug.logError(e, "Illegal access constructing object in create-object operation", module); - String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Illegal access constructing object: " + e.toString() + "]"; - methodContext.setErrorReturn(errMsg, simpleMethod); - return false; - } catch (IllegalArgumentException e) { - Debug.logError(e, "Illegal argument calling method in create-object operation", module); - String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Illegal argument calling constructor: " + e.toString() + "]"; - methodContext.setErrorReturn(errMsg, simpleMethod); - return false; - } catch (InvocationTargetException e) { - Debug.logError(e.getTargetException(), "Constructor in create-object operation threw an exception", module); - String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Constructor in create-object threw an exception: " + e.getTargetException() + "]"; - methodContext.setErrorReturn(errMsg, simpleMethod); - return false; - } - } catch (NoSuchMethodException e) { - Debug.logError(e, "Could not find constructor to execute in simple-method create-object operation", module); - String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Could not find constructor to execute: " + e.toString() + "]"; - methodContext.setErrorReturn(errMsg, simpleMethod); - return false; - } catch (SecurityException e) { - Debug.logError(e, "Security exception finding constructor to execute in simple-method create-object operation", module); - String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [Security exception finding constructor to execute: " + e.toString() + "]"; - methodContext.setErrorReturn(errMsg, simpleMethod); - return false; + Constructor<?> constructor = targetClass.getConstructor(parameterTypes); + fieldFma.put(methodContext.getEnvMap(),constructor.newInstance(args)); + } catch (Exception e) { + throw new MiniLangRuntimeException(e, this); } return true; } @Override - public String expandedString(MethodContext methodContext) { - // TODO: something more than a stub/dummy - return this.rawString(); - } - - @Override - public String rawString() { - // TODO: something more than the empty tag - return "<create-object/>"; + public String toString() { + StringBuilder sb = new StringBuilder("<create-object "); + sb.append("class-name=\"").append(this.className).append("\" "); + sb.append("field=\"").append(this.fieldFma).append("\" />"); + return sb.toString(); } + /** + * A factory for the <create-object> element. + */ public static final class CreateObjectFactory implements Factory<CreateObject> { + @Override public CreateObject createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new CreateObject(element, simpleMethod); } + @Override public String getName() { return "create-object"; } Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/FieldToList.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/FieldToList.java?rev=1359626&r1=1359625&r2=1359626&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/FieldToList.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/FieldToList.java Tue Jul 10 12:05:55 2012 @@ -19,82 +19,72 @@ package org.ofbiz.minilang.method.envops; import java.util.List; -import java.util.Map; import javolution.util.FastList; -import org.ofbiz.base.util.Debug; +import org.ofbiz.base.util.collections.FlexibleMapAccessor; import org.ofbiz.minilang.MiniLangException; +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; /** - * Copies an environment field to a list - */ -public class FieldToList extends MethodOperation { - - public static final String module = FieldToList.class.getName(); - - ContextAccessor<Object> fieldAcsr; - ContextAccessor<List<Object>> listAcsr; - ContextAccessor<Map<String, ? extends Object>> mapAcsr; + * Implements the <field-to-list> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cfieldtolist%3E}}">Mini-language Reference</a> +*/ +public final class FieldToList extends MethodOperation { + + private final FlexibleMapAccessor<Object> fieldFma; + private final FlexibleMapAccessor<List<Object>> listFma; public FieldToList(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 - mapAcsr = new ContextAccessor<Map<String, ? extends Object>>(element.getAttribute("map-name")); - fieldAcsr = new ContextAccessor<Object>(element.getAttribute("field"), element.getAttribute("field-name")); - listAcsr = new ContextAccessor<List<Object>>(element.getAttribute("list"), element.getAttribute("list-name")); + if (MiniLangValidate.validationOn()) { + MiniLangValidate.handleError("<field-to-list> element is deprecated (use <set>)", simpleMethod, element); + MiniLangValidate.attributeNames(simpleMethod, element, "field", "list"); + MiniLangValidate.requiredAttributes(simpleMethod, element, "field", "list"); + MiniLangValidate.expressionAttributes(simpleMethod, element, "field", "list"); + MiniLangValidate.noChildElements(simpleMethod, element); + } + fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("field")); + listFma = FlexibleMapAccessor.getInstance(element.getAttribute("list")); } @Override public boolean exec(MethodContext methodContext) throws MiniLangException { - Object 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 copying to list", module); - return true; + Object fieldVal = fieldFma.get(methodContext.getEnvMap()); + if (fieldVal != null) { + List<Object> toList = listFma.get(methodContext.getEnvMap()); + if (toList == null) { + toList = FastList.newInstance(); + listFma.put(methodContext.getEnvMap(), toList); } - fieldVal = fieldAcsr.get(fromMap, methodContext); - } else { - // no map name, try the env - fieldVal = fieldAcsr.get(methodContext); - } - if (fieldVal == null) { - Debug.logWarning("Field value not found with name " + fieldAcsr + " in Map with name " + mapAcsr + ", Not copying to list", module); - return true; - } - List<Object> toList = listAcsr.get(methodContext); - if (toList == null) { - if (Debug.verboseOn()) - Debug.logVerbose("List not found with name " + listAcsr + ", creating new list", module); - toList = FastList.newInstance(); - listAcsr.put(methodContext, toList); + toList.add(fieldVal); } - toList.add(fieldVal); return true; } @Override - public String expandedString(MethodContext methodContext) { - // TODO: something more than a stub/dummy - return this.rawString(); - } - - @Override - public String rawString() { - return "<field-to-list list-name=\"" + this.listAcsr + "\" field-name=\"" + this.fieldAcsr + "\" map-name=\"" + this.mapAcsr + "\"/>"; + public String toString() { + StringBuilder sb = new StringBuilder("<field-to-list "); + sb.append("field=\"").append(this.fieldFma).append("\" "); + sb.append("list=\"").append(this.listFma).append("\" />"); + return sb.toString(); } + /** + * A factory for the <field-to-list> element. + */ public static final class FieldToListFactory implements Factory<FieldToList> { + @Override public FieldToList createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new FieldToList(element, simpleMethod); } + @Override public String getName() { return "field-to-list"; } Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/FirstFromList.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/FirstFromList.java?rev=1359626&r1=1359625&r2=1359626&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/FirstFromList.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/FirstFromList.java Tue Jul 10 12:05:55 2012 @@ -20,62 +20,67 @@ package org.ofbiz.minilang.method.envops import java.util.List; -import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.UtilValidate; +import org.ofbiz.base.util.collections.FlexibleMapAccessor; import org.ofbiz.minilang.MiniLangException; +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; /** - * Get the first entry from the list + * Implements the <first-from-list> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cfirstfromlist%3E}}">Mini-language Reference</a> */ -public class FirstFromList extends MethodOperation { +public final class FirstFromList extends MethodOperation { - public static final String module = FirstFromList.class.getName(); - - ContextAccessor<Object> entryAcsr; - ContextAccessor<List<? extends Object>> listAcsr; + private final FlexibleMapAccessor<Object> entryFma; + private final FlexibleMapAccessor<List<Object>> listFma; public FirstFromList(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); - this.entryAcsr = new ContextAccessor<Object>(element.getAttribute("entry"), element.getAttribute("entry-name")); - this.listAcsr = new ContextAccessor<List<? extends Object>>(element.getAttribute("list"), element.getAttribute("list-name")); + if (MiniLangValidate.validationOn()) { + MiniLangValidate.handleError("<first-from-list> element is deprecated (use <set>)", simpleMethod, element); + MiniLangValidate.attributeNames(simpleMethod, element, "entry", "list"); + MiniLangValidate.requiredAttributes(simpleMethod, element, "entry", "list"); + MiniLangValidate.expressionAttributes(simpleMethod, element, "entry", "list"); + MiniLangValidate.noChildElements(simpleMethod, element); + } + entryFma = FlexibleMapAccessor.getInstance(element.getAttribute("entry")); + listFma = FlexibleMapAccessor.getInstance(element.getAttribute("list")); } @Override public boolean exec(MethodContext methodContext) throws MiniLangException { - if (listAcsr.isEmpty()) { - Debug.logWarning("No list-name specified in iterate tag, doing nothing", module); - return true; - } - List<? extends Object> theList = listAcsr.get(methodContext); + List<? extends Object> theList = listFma.get(methodContext.getEnvMap()); if (UtilValidate.isEmpty(theList)) { - entryAcsr.put(methodContext, null); - return true; + entryFma.put(methodContext.getEnvMap(), null); + } else { + entryFma.put(methodContext.getEnvMap(), theList.get(0)); } - entryAcsr.put(methodContext, theList.get(0)); return true; } @Override - public String expandedString(MethodContext methodContext) { - // TODO: something more than a stub/dummy - return this.rawString(); - } - - @Override - public String rawString() { - return "<first-from-list list-name=\"" + this.listAcsr + "\" entry-name=\"" + this.entryAcsr + "\"/>"; + public String toString() { + StringBuilder sb = new StringBuilder("<first-from-list "); + sb.append("entry=\"").append(this.entryFma).append("\" "); + sb.append("list=\"").append(this.listFma).append("\" />"); + return sb.toString(); } + /** + * A factory for the <first-from-list> element. + */ public static final class FirstFromListFactory implements Factory<FirstFromList> { + @Override public FirstFromList createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new FirstFromList(element, simpleMethod); } + @Override public String getName() { return "first-from-list"; } Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Iterate.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Iterate.java?rev=1359626&r1=1359625&r2=1359626&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Iterate.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Iterate.java Tue Jul 10 12:05:55 2012 @@ -25,12 +25,15 @@ import java.util.List; import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.UtilGenerics; +import org.ofbiz.base.util.collections.FlexibleMapAccessor; import org.ofbiz.entity.GenericEntityException; import org.ofbiz.entity.GenericValue; import org.ofbiz.entity.util.EntityListIterator; 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.artifact.ArtifactInfoContext; import org.ofbiz.minilang.method.MethodContext; import org.ofbiz.minilang.method.MethodOperation; import org.ofbiz.minilang.method.envops.Break.BreakElementException; @@ -38,37 +41,45 @@ import org.ofbiz.minilang.method.envops. import org.w3c.dom.Element; /** - * Process sub-operations for each entry in the list + * Implements the <iterate> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Citerate%3E}}">Mini-language Reference</a> */ -public class Iterate extends MethodOperation { +public final class Iterate extends MethodOperation { public static final String module = Iterate.class.getName(); - protected ContextAccessor<Object> entryAcsr; - protected ContextAccessor<Object> listAcsr; - protected List<MethodOperation> subOps; + private final FlexibleMapAccessor<Object> entryFma; + private final FlexibleMapAccessor<Object> listFma; + private final List<MethodOperation> subOps; public Iterate(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); - this.entryAcsr = new ContextAccessor<Object>(element.getAttribute("entry"), element.getAttribute("entry-name")); - this.listAcsr = new ContextAccessor<Object>(element.getAttribute("list"), element.getAttribute("list-name")); + if (MiniLangValidate.validationOn()) { + MiniLangValidate.attributeNames(simpleMethod, element, "entry", "list"); + MiniLangValidate.expressionAttributes(simpleMethod, element, "entry", "list"); + MiniLangValidate.requiredAttributes(simpleMethod, element, "entry", "list"); + } + this.entryFma = FlexibleMapAccessor.getInstance(element.getAttribute("entry")); + this.listFma = FlexibleMapAccessor.getInstance(element.getAttribute("list")); this.subOps = Collections.unmodifiableList(SimpleMethod.readOperations(element, simpleMethod)); } @Override public boolean exec(MethodContext methodContext) throws MiniLangException { - if (listAcsr.isEmpty()) { - Debug.logWarning("No list-name specified in iterate tag, doing nothing: " + rawString(), module); + if (listFma.isEmpty()) { + if (Debug.verboseOn()) + Debug.logVerbose("Collection not found, doing nothing: " + this, module); return true; } - Object oldEntryValue = entryAcsr.get(methodContext); - Object objList = listAcsr.get(methodContext); + Object oldEntryValue = entryFma.get(methodContext.getEnvMap()); + Object objList = listFma.get(methodContext.getEnvMap()); if (objList instanceof EntityListIterator) { EntityListIterator eli = (EntityListIterator) objList; GenericValue theEntry; try { while ((theEntry = eli.next()) != null) { - entryAcsr.put(methodContext, theEntry); + entryFma.put(methodContext.getEnvMap(), theEntry); try { for (MethodOperation methodOperation : subOps) { if (!methodOperation.exec(methodContext)) { @@ -86,81 +97,102 @@ public class Iterate extends MethodOpera } } } finally { - // close the iterator try { eli.close(); } catch (GenericEntityException e) { - Debug.logError(e, module); - String errMsg = "ERROR: Error closing entityListIterator in " + simpleMethod.getShortDescription() + " [" + e.getMessage() + "]: " + rawString(); - if (methodContext.getMethodType() == MethodContext.EVENT) { - methodContext.putEnv(simpleMethod.getEventErrorMessageName(), errMsg); - methodContext.putEnv(simpleMethod.getEventResponseCodeName(), simpleMethod.getDefaultErrorCode()); - } else if (methodContext.getMethodType() == MethodContext.SERVICE) { - methodContext.putEnv(simpleMethod.getServiceErrorMessageName(), errMsg); - methodContext.putEnv(simpleMethod.getServiceResponseMessageName(), simpleMethod.getDefaultErrorCode()); - } - return false; + throw new MiniLangRuntimeException("Error closing entityListIterator: " + e.getMessage(), this); } } } else if (objList instanceof Collection<?>) { Collection<Object> theCollection = UtilGenerics.checkCollection(objList); if (theCollection.size() == 0) { if (Debug.verboseOn()) - Debug.logVerbose("Collection with name " + listAcsr + " has zero entries, doing nothing: " + rawString(), module); + Debug.logVerbose("Collection has zero entries, doing nothing: " + this, module); return true; } for (Object theEntry : theCollection) { - entryAcsr.put(methodContext, theEntry); - if (!SimpleMethod.runSubOps(subOps, methodContext)) { - // only return here if it returns false, otherwise just carry on - return false; + entryFma.put(methodContext.getEnvMap(), theEntry); + try { + for (MethodOperation methodOperation : subOps) { + if (!methodOperation.exec(methodContext)) { + return false; + } + } + } catch (MiniLangException e) { + if (e instanceof BreakElementException) { + break; + } + if (e instanceof ContinueElementException) { + continue; + } + throw e; } } } else if (objList instanceof Iterator<?>) { Iterator<Object> theIterator = UtilGenerics.cast(objList); if (!theIterator.hasNext()) { if (Debug.verboseOn()) - Debug.logVerbose("List with name " + listAcsr + " has no more entries, doing nothing: " + rawString(), module); + Debug.logVerbose("Iterator has zero entries, doing nothing: " + this, module); return true; } while (theIterator.hasNext()) { Object theEntry = theIterator.next(); - entryAcsr.put(methodContext, theEntry); - if (!SimpleMethod.runSubOps(subOps, methodContext)) { - // only return here if it returns false, otherwise just carry on - return false; + entryFma.put(methodContext.getEnvMap(), theEntry); + try { + for (MethodOperation methodOperation : subOps) { + if (!methodOperation.exec(methodContext)) { + return false; + } + } + } catch (MiniLangException e) { + if (e instanceof BreakElementException) { + break; + } + if (e instanceof ContinueElementException) { + continue; + } + throw e; } } } else { - if (Debug.infoOn()) - Debug.logInfo("List not found with name " + listAcsr + ", doing nothing: " + rawString(), module); + if (Debug.verboseOn()) + Debug.logVerbose("Cannot iterate over a " + objList.getClass().getName() + ", doing nothing: " + this, module); return true; } - entryAcsr.put(methodContext, oldEntryValue); + entryFma.put(methodContext.getEnvMap(), oldEntryValue); return true; } @Override - public String expandedString(MethodContext methodContext) { - // TODO: something more than a stub/dummy - return this.rawString(); - } - - public List<MethodOperation> getSubOps() { - return this.subOps; + public void gatherArtifactInfo(ArtifactInfoContext aic) { + for (MethodOperation method : this.subOps) { + method.gatherArtifactInfo(aic); + } } @Override - public String rawString() { - // TODO: something more than the empty tag - return "<iterate list-name=\"" + this.listAcsr + "\" entry-name=\"" + this.entryAcsr + "\"/>"; + public String toString() { + StringBuilder sb = new StringBuilder("<iterate "); + if (!this.entryFma.isEmpty()) { + sb.append("entry=\"").append(this.entryFma).append("\" "); + } + if (!this.listFma.isEmpty()) { + sb.append("list=\"").append(this.listFma).append("\" "); + } + sb.append("/>"); + return sb.toString(); } + /** + * A factory for the <iterate> element. + */ public static final class IterateFactory implements Factory<Iterate> { + @Override public Iterate createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new Iterate(element, simpleMethod); } + @Override public String getName() { return "iterate"; } Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/IterateMap.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/IterateMap.java?rev=1359626&r1=1359625&r2=1359626&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/IterateMap.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/IterateMap.java Tue Jul 10 12:05:55 2012 @@ -23,9 +23,12 @@ import java.util.List; import java.util.Map; import org.ofbiz.base.util.Debug; +import org.ofbiz.base.util.collections.FlexibleMapAccessor; 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.artifact.ArtifactInfoContext; import org.ofbiz.minilang.method.MethodContext; import org.ofbiz.minilang.method.MethodOperation; import org.ofbiz.minilang.method.envops.Break.BreakElementException; @@ -33,53 +36,61 @@ import org.ofbiz.minilang.method.envops. import org.w3c.dom.Element; /** - * Process sub-operations for each entry in the map + * Implements the <iterate-map> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Citeratemap%3E}}">Mini-language Reference</a> */ -public class IterateMap extends MethodOperation { +public final class IterateMap extends MethodOperation { public static final String module = IterateMap.class.getName(); - ContextAccessor<Object> keyAcsr; - ContextAccessor<Map<? extends Object, ? extends Object>> mapAcsr; - List<MethodOperation> subOps; - ContextAccessor<Object> valueAcsr; + private final FlexibleMapAccessor<Object> keyFma; + private final FlexibleMapAccessor<Map<? extends Object, ? extends Object>> mapFma; + private final List<MethodOperation> subOps; + private final FlexibleMapAccessor<Object> valueFma; public IterateMap(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); - this.keyAcsr = new ContextAccessor<Object>(element.getAttribute("key"), element.getAttribute("key-name")); - this.valueAcsr = new ContextAccessor<Object>(element.getAttribute("value"), element.getAttribute("value-name")); - this.mapAcsr = new ContextAccessor<Map<? extends Object, ? extends Object>>(element.getAttribute("map"), element.getAttribute("map-name")); + if (MiniLangValidate.validationOn()) { + MiniLangValidate.attributeNames(simpleMethod, element, "key", "map", "value"); + MiniLangValidate.requiredAttributes(simpleMethod, element, "key", "map", "value"); + MiniLangValidate.expressionAttributes(simpleMethod, element, "key", "map", "value"); + } + this.keyFma = FlexibleMapAccessor.getInstance(element.getAttribute("key")); + this.mapFma = FlexibleMapAccessor.getInstance(element.getAttribute("map")); + this.valueFma = FlexibleMapAccessor.getInstance(element.getAttribute("value")); this.subOps = Collections.unmodifiableList(SimpleMethod.readOperations(element, simpleMethod)); } @Override public boolean exec(MethodContext methodContext) throws MiniLangException { - if (mapAcsr.isEmpty()) { - Debug.logWarning("No map-name specified in iterate tag, doing nothing: " + rawString(), module); - return true; + if (mapFma.isEmpty()) { + throw new MiniLangRuntimeException("No map specified.", this); } - Object oldKey = keyAcsr.get(methodContext); - Object oldValue = valueAcsr.get(methodContext); + Object oldKey = keyFma.get(methodContext.getEnvMap()); + Object oldValue = valueFma.get(methodContext.getEnvMap()); if (oldKey != null) { - Debug.logWarning("In iterate-map the key had a non-null value before entering the loop for the operation: " + this.rawString(), module); + if (Debug.verboseOn()) + Debug.logVerbose("In iterate-map the key had a non-null value before entering the loop for the operation: " + this, module); } if (oldValue != null) { - Debug.logWarning("In iterate-map the value had a non-null value before entering the loop for the operation: " + this.rawString(), module); + if (Debug.verboseOn()) + Debug.logVerbose("In iterate-map the value had a non-null value before entering the loop for the operation: " + this, module); } - Map<? extends Object, ? extends Object> theMap = mapAcsr.get(methodContext); + Map<? extends Object, ? extends Object> theMap = mapFma.get(methodContext.getEnvMap()); if (theMap == null) { - if (Debug.infoOn()) - Debug.logInfo("Map not found with name " + mapAcsr + ", doing nothing: " + rawString(), module); + if (Debug.verboseOn()) + Debug.logVerbose("Map not found with name " + mapFma + ", doing nothing: " + this, module); return true; } if (theMap.size() == 0) { if (Debug.verboseOn()) - Debug.logVerbose("Map with name " + mapAcsr + " has zero entries, doing nothing: " + rawString(), module); + Debug.logVerbose("Map with name " + mapFma + " has zero entries, doing nothing: " + this, module); return true; } for (Map.Entry<? extends Object, ? extends Object> theEntry : theMap.entrySet()) { - keyAcsr.put(methodContext, theEntry.getKey()); - valueAcsr.put(methodContext, theEntry.getValue()); + keyFma.put(methodContext.getEnvMap(), theEntry.getKey()); + valueFma.put(methodContext.getEnvMap(), theEntry.getValue()); try { for (MethodOperation methodOperation : subOps) { if (!methodOperation.exec(methodContext)) { @@ -100,25 +111,38 @@ public class IterateMap extends MethodOp } @Override - public String expandedString(MethodContext methodContext) { - // TODO: something more than a stub/dummy - return this.rawString(); - } - - public List<MethodOperation> getSubOps() { - return this.subOps; + public void gatherArtifactInfo(ArtifactInfoContext aic) { + for (MethodOperation method : this.subOps) { + method.gatherArtifactInfo(aic); + } } @Override - public String rawString() { - return "<iterate-map map-name=\"" + this.mapAcsr + "\" key=\"" + this.keyAcsr + "\" value=\"" + this.valueAcsr + "\"/>"; + public String toString() { + StringBuilder sb = new StringBuilder("<iterate-map "); + if (!this.mapFma.isEmpty()) { + sb.append("map=\"").append(this.mapFma).append("\" "); + } + if (!this.keyFma.isEmpty()) { + sb.append("key=\"").append(this.keyFma).append("\" "); + } + if (!this.valueFma.isEmpty()) { + sb.append("value=\"").append(this.valueFma).append("\" "); + } + sb.append("/>"); + return sb.toString(); } + /** + * A factory for the <iterate-map> element. + */ public static final class IterateMapFactory implements Factory<IterateMap> { + @Override public IterateMap createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new IterateMap(element, simpleMethod); } + @Override public String getName() { return "iterate-map"; } Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/ListToList.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/ListToList.java?rev=1359626&r1=1359625&r2=1359626&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/ListToList.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/ListToList.java Tue Jul 10 12:05:55 2012 @@ -22,66 +22,68 @@ import java.util.List; import javolution.util.FastList; -import org.ofbiz.base.util.Debug; +import org.ofbiz.base.util.collections.FlexibleMapAccessor; import org.ofbiz.minilang.MiniLangException; +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; /** - * Copies an environment field to a list + * Implements the <list-to-list> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Clisttolist%3E}}">Mini-language Reference</a> */ -public class ListToList extends MethodOperation { +public final class ListToList extends MethodOperation { - public static final String module = ListToList.class.getName(); - - ContextAccessor<List<Object>> listAcsr; - ContextAccessor<List<Object>> toListAcsr; + private final FlexibleMapAccessor<List<Object>> listFma; + private final FlexibleMapAccessor<List<Object>> toListFma; public ListToList(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); - listAcsr = new ContextAccessor<List<Object>>(element.getAttribute("list"), element.getAttribute("list-name")); - toListAcsr = new ContextAccessor<List<Object>>(element.getAttribute("to-list"), element.getAttribute("to-list-name")); + if (MiniLangValidate.validationOn()) { + MiniLangValidate.attributeNames(simpleMethod, element, "to-list", "list"); + MiniLangValidate.requiredAttributes(simpleMethod, element, "to-list", "list"); + MiniLangValidate.expressionAttributes(simpleMethod, element, "to-list", "list"); + MiniLangValidate.noChildElements(simpleMethod, element); + } + toListFma = FlexibleMapAccessor.getInstance(element.getAttribute("to-list")); + listFma = FlexibleMapAccessor.getInstance(element.getAttribute("list")); } @Override public boolean exec(MethodContext methodContext) throws MiniLangException { - List<Object> fromList = listAcsr.get(methodContext); - List<Object> toList = toListAcsr.get(methodContext); - if (fromList == null) { - if (Debug.infoOn()) - Debug.logInfo("List not found with name " + listAcsr + ", not copying list", module); - return true; - } - if (toList == null) { - if (Debug.verboseOn()) - Debug.logVerbose("List not found with name " + toListAcsr + ", creating new list", module); - toList = FastList.newInstance(); - toListAcsr.put(methodContext, toList); + List<Object> fromList = listFma.get(methodContext.getEnvMap()); + if (fromList != null) { + List<Object> toList = toListFma.get(methodContext.getEnvMap()); + if (toList == null) { + toList = FastList.newInstance(); + toListFma.put(methodContext.getEnvMap(), toList); + } + toList.addAll(fromList); } - toList.addAll(fromList); return true; } @Override - public String expandedString(MethodContext methodContext) { - // TODO: something more than a stub/dummy - return this.rawString(); - } - - @Override - public String rawString() { - // TODO: something more than the empty tag - return "<list-to-list/>"; + public String toString() { + StringBuilder sb = new StringBuilder("<list-to-list "); + sb.append("to-list=\"").append(this.toListFma).append("\" "); + sb.append("list=\"").append(this.listFma).append("\" />"); + return sb.toString(); } + /** + * A factory for the <list-to-list> element. + */ public static final class ListToListFactory implements Factory<ListToList> { + @Override public ListToList createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new ListToList(element, simpleMethod); } + @Override public String getName() { return "list-to-list"; } Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Loop.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Loop.java?rev=1359626&r1=1359625&r2=1359626&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Loop.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Loop.java Tue Jul 10 12:05:55 2012 @@ -21,10 +21,13 @@ package org.ofbiz.minilang.method.envops import java.util.Collections; import java.util.List; -import org.ofbiz.base.util.Debug; +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.artifact.ArtifactInfoContext; import org.ofbiz.minilang.method.MethodContext; import org.ofbiz.minilang.method.MethodOperation; import org.ofbiz.minilang.method.envops.Break.BreakElementException; @@ -32,42 +35,44 @@ import org.ofbiz.minilang.method.envops. import org.w3c.dom.Element; /** - * Loop + * Implements the <loop> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cloop%3E}}">Mini-language Reference</a> */ -public class Loop extends MethodOperation { +public final class Loop extends MethodOperation { public static final String module = Loop.class.getName(); - protected String countStr; - protected ContextAccessor<Integer> fieldAcsr; - protected List<MethodOperation> subOps; + private final FlexibleStringExpander countFse; + private final FlexibleMapAccessor<Integer> fieldFma; + private final List<MethodOperation> subOps; public Loop(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); - this.fieldAcsr = new ContextAccessor<Integer>(element.getAttribute("field")); - this.countStr = element.getAttribute("count"); + if (MiniLangValidate.validationOn()) { + MiniLangValidate.attributeNames(simpleMethod, element, "count", "field"); + MiniLangValidate.requiredAttributes(simpleMethod, element, "count"); + MiniLangValidate.expressionAttributes(simpleMethod, element, "count", "field"); + } + this.countFse = FlexibleStringExpander.getInstance(element.getAttribute("count")); + this.fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("field")); this.subOps = Collections.unmodifiableList(SimpleMethod.readOperations(element, simpleMethod)); } @Override public boolean exec(MethodContext methodContext) throws MiniLangException { - String countStrExp = methodContext.expandString(this.countStr); + String countStr = this.countFse.expandString(methodContext.getEnvMap()); int count = 0; try { - Double ctDbl = Double.valueOf(countStrExp); - if (ctDbl != null) { - count = ctDbl.intValue(); - } + count = Double.valueOf(countStr).intValue(); } catch (NumberFormatException e) { - Debug.logError(e, module); - return false; + throw new MiniLangRuntimeException("Error while converting \"" + countStr + "\" to a number: " + e.getMessage(), this); } if (count < 0) { - Debug.logWarning("Unable to execute loop operation because the count variable is negative: " + rawString(), module); - return false; + throw new MiniLangRuntimeException("Unable to execute loop operation because the count is negative: " + countStr, this); } for (int i = 0; i < count; i++) { - fieldAcsr.put(methodContext, i); + this.fieldFma.put(methodContext.getEnvMap(), i); try { for (MethodOperation methodOperation : subOps) { if (!methodOperation.exec(methodContext)) { @@ -88,24 +93,35 @@ public class Loop extends MethodOperatio } @Override - public String expandedString(MethodContext methodContext) { - return this.rawString(); - } - - public List<MethodOperation> getSubOps() { - return this.subOps; + public void gatherArtifactInfo(ArtifactInfoContext aic) { + for (MethodOperation method : this.subOps) { + method.gatherArtifactInfo(aic); + } } @Override - public String rawString() { - return "<loop field=\"" + this.fieldAcsr + "\" count=\"" + this.countStr + "\"/>"; + public String toString() { + StringBuilder sb = new StringBuilder("<loop "); + if (!this.countFse.isEmpty()) { + sb.append("count=\"").append(this.countFse).append("\" "); + } + if (!this.fieldFma.isEmpty()) { + sb.append("field=\"").append(this.fieldFma).append("\" "); + } + sb.append("/>"); + return sb.toString(); } + /** + * A factory for the <loop> element. + */ public static final class LoopFactory implements Factory<Loop> { + @Override public Loop createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new Loop(element, simpleMethod); } + @Override public String getName() { return "loop"; } Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/MapToMap.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/MapToMap.java?rev=1359626&r1=1359625&r2=1359626&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/MapToMap.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/MapToMap.java Tue Jul 10 12:05:55 2012 @@ -22,74 +22,75 @@ import java.util.Map; import javolution.util.FastMap; -import org.ofbiz.base.util.Debug; +import org.ofbiz.base.util.collections.FlexibleMapAccessor; import org.ofbiz.minilang.MiniLangException; +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; /** - * Copies a map field to a map field + * Implements the <map-to-map> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cmaptomap%3E}}">Mini-language Reference</a> */ -public class MapToMap extends MethodOperation { +public final class MapToMap extends MethodOperation { - public static final String module = MapToMap.class.getName(); - - ContextAccessor<Map<String, Object>> mapAcsr; - ContextAccessor<Map<String, Object>> toMapAcsr; + private final FlexibleMapAccessor<Map<String, Object>> mapFma; + private final FlexibleMapAccessor<Map<String, Object>> toMapFma; public MapToMap(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); - mapAcsr = new ContextAccessor<Map<String, Object>>(element.getAttribute("map"), element.getAttribute("map-name")); - toMapAcsr = new ContextAccessor<Map<String, Object>>(element.getAttribute("to-map"), element.getAttribute("to-map-name")); + if (MiniLangValidate.validationOn()) { + MiniLangValidate.attributeNames(simpleMethod, element, "to-map", "map"); + MiniLangValidate.requiredAttributes(simpleMethod, element, "map"); + MiniLangValidate.expressionAttributes(simpleMethod, element, "to-map", "map"); + MiniLangValidate.noChildElements(simpleMethod, element); + } + mapFma = FlexibleMapAccessor.getInstance(element.getAttribute("map")); + toMapFma = FlexibleMapAccessor.getInstance(element.getAttribute("to-map")); } @Override public boolean exec(MethodContext methodContext) throws MiniLangException { - Map<String, Object> fromMap = null; - if (!mapAcsr.isEmpty()) { - fromMap = mapAcsr.get(methodContext); - if (fromMap == null) { - if (Debug.infoOn()) - Debug.logInfo("Map not found with name " + mapAcsr + ", not copying from this map", module); - fromMap = FastMap.newInstance(); - mapAcsr.put(methodContext, fromMap); - } - } - if (!toMapAcsr.isEmpty()) { - Map<String, Object> toMap = toMapAcsr.get(methodContext); - if (toMap == null) { - if (Debug.verboseOn()) - Debug.logVerbose("Map not found with name " + toMapAcsr + ", creating new map", module); - toMap = FastMap.newInstance(); - toMapAcsr.put(methodContext, toMap); + Map<String, Object> fromMap = mapFma.get(methodContext.getEnvMap()); + if (fromMap != null) { + if (!toMapFma.isEmpty()) { + Map<String, Object> toMap = toMapFma.get(methodContext.getEnvMap()); + if (toMap == null) { + toMap = FastMap.newInstance(); + toMapFma.put(methodContext.getEnvMap(), toMap); + toMap.putAll(fromMap); + } + } else { + methodContext.putAllEnv(fromMap); } - toMap.putAll(fromMap); - } else { - methodContext.putAllEnv(fromMap); } return true; } @Override - public String expandedString(MethodContext methodContext) { - // TODO: something more than a stub/dummy - return this.rawString(); - } - - @Override - public String rawString() { - // TODO: something more than the empty tag - return "<map-to-map/>"; + public String toString() { + StringBuilder sb = new StringBuilder("<map-to-map "); + sb.append("map=\"").append(this.mapFma).append("\" "); + if (!toMapFma.isEmpty()) { + sb.append("to-map=\"").append(this.toMapFma).append("\" "); + } + sb.append("/>"); + return sb.toString(); } + /** + * A factory for the <map-to-map> element. + */ public static final class MapToMapFactory implements Factory<MapToMap> { + @Override public MapToMap createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new MapToMap(element, simpleMethod); } + @Override public String getName() { return "map-to-map"; } Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Now.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Now.java?rev=1359626&r1=1359625&r2=1359626&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Now.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/Now.java Tue Jul 10 12:05:55 2012 @@ -23,21 +23,41 @@ import org.ofbiz.base.conversion.Convert import org.ofbiz.base.conversion.Converters; import org.ofbiz.base.util.ObjectType; 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.ValidationException; import org.ofbiz.minilang.method.MethodContext; import org.ofbiz.minilang.method.MethodOperation; +import org.w3c.dom.Document; import org.w3c.dom.Element; /** - * Sets a field to the current system time. + * Implements the <now>, <now-date-to-env>, and <now-timestamp> elements. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cnow%3E}}">Mini-language Reference</a> */ public final class Now extends MethodOperation { + // This method is needed only during the v1 to v2 transition + private static boolean autoCorrect(Element element) { + String tagName = element.getTagName(); + if ("now-date-to-env".equals(tagName) || "now-timestamp".equals(tagName)) { + Document doc = element.getOwnerDocument(); + Element newElement = doc.createElement("now"); + newElement.setAttribute("field", element.getAttribute("field")); + if ("now-date-to-env".equals(tagName)) { + element.setAttribute("type", "java.sql.Date"); + newElement.setAttribute("type", "java.sql.Date"); + } + element.getParentNode().replaceChild(newElement, element); + return true; + } + return false; + } + private final FlexibleMapAccessor<Object> fieldFma; private final String type; private final Converter<Long, ? extends Object> converter; @@ -45,17 +65,25 @@ public final class Now extends MethodOpe public Now(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); if (MiniLangValidate.validationOn()) { + String tagName = element.getTagName(); + if ("now-date-to-env".equals(tagName) || "now-timestamp".equals(tagName)) { + MiniLangValidate.handleError("Deprecated - use <now>", simpleMethod, element); + } MiniLangValidate.attributeNames(simpleMethod, element, "field", "type"); MiniLangValidate.requiredAttributes(simpleMethod, element, "field"); MiniLangValidate.expressionAttributes(simpleMethod, element, "field"); MiniLangValidate.constantAttributes(simpleMethod, element, "type"); MiniLangValidate.noChildElements(simpleMethod, element); } + boolean elementModified = autoCorrect(element); + if (elementModified && MiniLangUtil.autoCorrectOn()) { + MiniLangUtil.flagDocumentAsCorrected(element); + } this.fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("field")); this.type = element.getAttribute("type"); Class<?> targetClass = null; try { - if (this.type.length() > 0) { + if (!this.type.isEmpty()) { targetClass = ObjectType.loadClass(this.type); } if (targetClass == null) { @@ -78,22 +106,12 @@ public final class Now extends MethodOpe } @Override - public String expandedString(MethodContext methodContext) { - return FlexibleStringExpander.expandString(toString(), methodContext.getEnvMap()); - } - - @Override - public String rawString() { - return toString(); - } - - @Override public String toString() { StringBuilder sb = new StringBuilder("<now "); if (!this.fieldFma.isEmpty()) { sb.append("field=\"").append(this.fieldFma).append("\" "); } - if (this.type.length() > 0) { + if (!this.type.isEmpty()) { sb.append("type=\"").append(this.type).append("\" "); } sb.append("/>"); @@ -101,13 +119,48 @@ public final class Now extends MethodOpe } + /** + * A factory for the <now> element. + */ public static final class NowFactory implements Factory<Now> { + @Override public Now createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new Now(element, simpleMethod); } + @Override public String getName() { return "now"; } } + + /** + * A factory for the <now-date-to-env> element. + */ + public static final class NowDateToEnvFactory implements Factory<Now> { + @Override + public Now createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { + return new Now(element, simpleMethod); + } + + @Override + public String getName() { + return "now-date-to-env"; + } + } + + /** + * A factory for the <now-timestamp> element. + */ + public static final class NowTimestampFactory implements Factory<Now> { + @Override + public Now createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { + return new Now(element, simpleMethod); + } + + @Override + public String getName() { + return "now-timestamp"; + } + } } Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/OrderMapList.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/OrderMapList.java?rev=1359626&r1=1359625&r2=1359626&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/OrderMapList.java (original) +++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/envops/OrderMapList.java Tue Jul 10 12:05:55 2012 @@ -18,73 +18,84 @@ *******************************************************************************/ package org.ofbiz.minilang.method.envops; +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.UtilValidate; import org.ofbiz.base.util.UtilXml; import org.ofbiz.base.util.collections.FlexibleMapAccessor; import org.ofbiz.base.util.collections.MapComparator; 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; /** - * Copies an environment field to a list + * Implements the <order-map-list> element. + * + * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cordermaplist%3E}}">Mini-language Reference</a> */ -public class OrderMapList extends MethodOperation { - - public static final String module = FieldToList.class.getName(); +public final class OrderMapList extends MethodOperation { - protected ContextAccessor<List<Map<Object, Object>>> listAcsr; - protected MapComparator mc; - protected List<FlexibleMapAccessor<String>> orderByAcsrList = FastList.newInstance(); + private final FlexibleMapAccessor<List<Map<Object, Object>>> listFma; + private final MapComparator mc; public OrderMapList(Element element, SimpleMethod simpleMethod) throws MiniLangException { super(element, simpleMethod); - listAcsr = new ContextAccessor<List<Map<Object, Object>>>(element.getAttribute("list"), element.getAttribute("list-name")); - for (Element orderByElement : UtilXml.childElementList(element, "order-by")) { - FlexibleMapAccessor<String> fma = FlexibleMapAccessor.getInstance(UtilValidate.isNotEmpty(orderByElement.getAttribute("field")) ? orderByElement.getAttribute("field") : orderByElement.getAttribute("field-name")); - this.orderByAcsrList.add(fma); + if (MiniLangValidate.validationOn()) { + MiniLangValidate.attributeNames(simpleMethod, element, "list"); + MiniLangValidate.requiredAttributes(simpleMethod, element, "list"); + MiniLangValidate.expressionAttributes(simpleMethod, element, "list"); + MiniLangValidate.childElements(simpleMethod, element, "order-by"); + MiniLangValidate.requiredChildElements(simpleMethod, element, "order-by"); + } + listFma = FlexibleMapAccessor.getInstance(element.getAttribute("list")); + List<? extends Element> orderByElements = UtilXml.childElementList(element, "order-by"); + if (orderByElements.size() > 0) { + ArrayList<FlexibleMapAccessor<String>> orderByList = new ArrayList<FlexibleMapAccessor<String>>(orderByElements.size()); + for (Element orderByElement : orderByElements) { + FlexibleMapAccessor<String> fma = FlexibleMapAccessor.getInstance(orderByElement.getAttribute("field")); + orderByList.add(fma); + } + mc = new MapComparator(orderByList); + } else { + mc = null; } - this.mc = new MapComparator(this.orderByAcsrList); } @Override public boolean exec(MethodContext methodContext) throws MiniLangException { - List<Map<Object, Object>> orderList = listAcsr.get(methodContext); - if (orderList == null) { - if (Debug.infoOn()) - Debug.logInfo("List not found with name " + listAcsr + ", not ordering/sorting list.", module); - return true; + if (mc == null) { + throw new MiniLangRuntimeException("order-by sub-elements not found.", this); + } + List<Map<Object, Object>> orderList = listFma.get(methodContext.getEnvMap()); + if (orderList != null) { + Collections.sort(orderList, mc); } - Collections.sort(orderList, mc); return true; } @Override - public String expandedString(MethodContext methodContext) { - // TODO: something more than a stub/dummy - return this.rawString(); - } - - @Override - public String rawString() { - return "<order-map-list list-name=\"" + this.listAcsr + "\"/>"; + public String toString() { + StringBuilder sb = new StringBuilder("<order-map-list "); + sb.append("list=\"").append(this.listFma).append("\" />"); + return sb.toString(); } + /** + * A factory for the <order-map-list> element. + */ public static final class OrderMapListFactory implements Factory<OrderMapList> { + @Override public OrderMapList createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException { return new OrderMapList(element, simpleMethod); } + @Override public String getName() { return "order-map-list"; } |
| Free forum by Nabble | Edit this page |
