You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2014/11/02 01:06:35 UTC

svn commit: r1636073 - in /ofbiz/trunk/framework: webtools/src/org/ofbiz/webtools/artifactinfo/ widget/src/org/ofbiz/widget/ widget/src/org/ofbiz/widget/artifact/ widget/src/org/ofbiz/widget/form/

Author: adrianc
Date: Sun Nov  2 00:06:34 2014
New Revision: 1636073

URL: http://svn.apache.org/r1636073
Log:
Revert rev 1636071. I broke something.

Modified:
    ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/FormWidgetArtifactInfo.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelActionVisitor.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoContext.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoGatherer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormAction.java

Modified: ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/FormWidgetArtifactInfo.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/FormWidgetArtifactInfo.java?rev=1636073&r1=1636072&r2=1636073&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/FormWidgetArtifactInfo.java (original)
+++ ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/FormWidgetArtifactInfo.java Sun Nov  2 00:06:34 2014
@@ -31,8 +31,6 @@ import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.GeneralException;
 import org.ofbiz.base.util.UtilMisc;
 import org.ofbiz.base.util.UtilURL;
-import org.ofbiz.widget.artifact.ArtifactInfoContext;
-import org.ofbiz.widget.artifact.ArtifactInfoGatherer;
 import org.ofbiz.widget.form.ModelForm;
 import org.xml.sax.SAXException;
 
@@ -70,14 +68,12 @@ public class FormWidgetArtifactInfo exte
 
     /** note this is mean to be called after the object is created and added to the ArtifactInfoFactory.allFormInfos in ArtifactInfoFactory.getFormWidgetArtifactInfo */
     public void populateAll() throws GeneralException {
-        ArtifactInfoContext infoContext = new ArtifactInfoContext();
-        ArtifactInfoGatherer infoGatherer = new ArtifactInfoGatherer(infoContext);
-        infoGatherer.visit(this.modelForm);
-        populateEntitiesFromNameSet(infoContext.getEntityNames());
-        populateServicesFromNameSet(infoContext.getServiceNames());
+        // populate entitiesUsedInThisForm, servicesUsedInThisForm, formThisFormExtends (and reverse in aif.allFormInfosExtendingForm)
+        this.populateUsedEntities();
+        this.populateUsedServices();
         this.populateFormExtended();
-        this.populateLinkedRequests(infoContext.getRequestLocations());
-        this.populateTargetedRequests(infoContext.getTargetLocations());
+        this.populateLinkedRequests();
+        this.populateTargetedRequests();
     }
 
     protected void populateFormExtended() throws GeneralException {
@@ -101,7 +97,11 @@ public class FormWidgetArtifactInfo exte
             UtilMisc.addToSortedSetInMap(this, aif.allFormInfosExtendingForm, formName);
         }
     }
-
+    protected void populateUsedEntities() throws GeneralException {
+        // populate entitiesUsedInThisForm and for each the reverse-associate cache in the aif
+        Set<String> allEntityNameSet = this.modelForm.getAllEntityNamesUsed();
+        populateEntitiesFromNameSet(allEntityNameSet);
+    }
     protected void populateEntitiesFromNameSet(Set<String> allEntityNameSet) throws GeneralException {
         for (String entityName: allEntityNameSet) {
             if (entityName.contains("${")) {
@@ -118,6 +118,11 @@ public class FormWidgetArtifactInfo exte
             UtilMisc.addToSortedSetInMap(this, aif.allFormInfosReferringToEntityName, entityName);
         }
     }
+    protected void populateUsedServices() throws GeneralException {
+        // populate servicesUsedInThisForm and for each the reverse-associate cache in the aif
+        Set<String> allServiceNameSet = this.modelForm.getAllServiceNamesUsed();
+        populateServicesFromNameSet(allServiceNameSet);
+    }
     protected void populateServicesFromNameSet(Set<String> allServiceNameSet) throws GeneralException {
         for (String serviceName: allServiceNameSet) {
             if (serviceName.contains("${")) {
@@ -137,7 +142,8 @@ public class FormWidgetArtifactInfo exte
         }
     }
 
-    protected void populateLinkedRequests(Set<String> allRequestUniqueId) throws GeneralException{
+    protected void populateLinkedRequests() throws GeneralException{
+        Set<String> allRequestUniqueId = this.modelForm.getLinkedRequestsLocationAndUri();
 
         for (String requestUniqueId: allRequestUniqueId) {
             if (requestUniqueId.contains("${")) {
@@ -154,7 +160,8 @@ public class FormWidgetArtifactInfo exte
             }
         }
     }
-    protected void populateTargetedRequests(Set<String> allRequestUniqueId) throws GeneralException{
+    protected void populateTargetedRequests() throws GeneralException{
+        Set<String> allRequestUniqueId = this.modelForm.getTargetedRequestsLocationAndUri();
 
         for (String requestUniqueId: allRequestUniqueId) {
             if (requestUniqueId.contains("${")) {

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelActionVisitor.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelActionVisitor.java?rev=1636073&r1=1636072&r2=1636073&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelActionVisitor.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelActionVisitor.java Sun Nov  2 00:06:34 2014
@@ -18,15 +18,12 @@
  *******************************************************************************/
 package org.ofbiz.widget;
 
-import org.ofbiz.widget.form.ModelFormAction;
 
 /**
  *  A <code>ModelWidgetAction</code> visitor.
  */
 public interface ModelActionVisitor {
 
-    void visit(ModelFormAction.CallParentActions callParentActions);
-
     void visit(ModelWidgetAction.EntityAnd entityAnd);
 
     void visit(ModelWidgetAction.EntityCondition entityCondition);

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java?rev=1636073&r1=1636072&r2=1636073&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java Sun Nov  2 00:06:34 2014
@@ -76,37 +76,33 @@ public abstract class ModelWidgetAction 
 
     public abstract void accept(ModelActionVisitor visitor);
 
-    public static ModelWidgetAction toModelWidgetAction(ModelWidget modelWidget, Element actionElement) {
-        if ("set".equals(actionElement.getNodeName())) {
-            return new SetField(modelWidget, actionElement);
-        } else if ("property-map".equals(actionElement.getNodeName())) {
-            return new PropertyMap(modelWidget, actionElement);
-        } else if ("property-to-field".equals(actionElement.getNodeName())) {
-            return new PropertyToField(modelWidget, actionElement);
-        } else if ("script".equals(actionElement.getNodeName())) {
-            return new Script(modelWidget, actionElement);
-        } else if ("service".equals(actionElement.getNodeName())) {
-            return new Service(modelWidget, actionElement);
-        } else if ("entity-one".equals(actionElement.getNodeName())) {
-            return new EntityOne(modelWidget, actionElement);
-        } else if ("entity-and".equals(actionElement.getNodeName())) {
-            return new EntityAnd(modelWidget, actionElement);
-        } else if ("entity-condition".equals(actionElement.getNodeName())) {
-            return new EntityCondition(modelWidget, actionElement);
-        } else if ("get-related-one".equals(actionElement.getNodeName())) {
-            return new GetRelatedOne(modelWidget, actionElement);
-        } else if ("get-related".equals(actionElement.getNodeName())) {
-            return new GetRelated(modelWidget, actionElement);
-        } else {
-            throw new IllegalArgumentException("Action element not supported with name: " + actionElement.getNodeName());
-        }
-    }
-    
     public static List<ModelWidgetAction> readSubActions(ModelWidget modelWidget, Element parentElement) {
         List<? extends Element> actionElementList = UtilXml.childElementList(parentElement);
         List<ModelWidgetAction> actions = new ArrayList<ModelWidgetAction>(actionElementList.size());
         for (Element actionElement: actionElementList) {
-            actions.add(toModelWidgetAction(modelWidget, actionElement));
+            if ("set".equals(actionElement.getNodeName())) {
+                actions.add(new SetField(modelWidget, actionElement));
+            } else if ("property-map".equals(actionElement.getNodeName())) {
+                actions.add(new PropertyMap(modelWidget, actionElement));
+            } else if ("property-to-field".equals(actionElement.getNodeName())) {
+                actions.add(new PropertyToField(modelWidget, actionElement));
+            } else if ("script".equals(actionElement.getNodeName())) {
+                actions.add(new Script(modelWidget, actionElement));
+            } else if ("service".equals(actionElement.getNodeName())) {
+                actions.add(new Service(modelWidget, actionElement));
+            } else if ("entity-one".equals(actionElement.getNodeName())) {
+                actions.add(new EntityOne(modelWidget, actionElement));
+            } else if ("entity-and".equals(actionElement.getNodeName())) {
+                actions.add(new EntityAnd(modelWidget, actionElement));
+            } else if ("entity-condition".equals(actionElement.getNodeName())) {
+                actions.add(new EntityCondition(modelWidget, actionElement));
+            } else if ("get-related-one".equals(actionElement.getNodeName())) {
+                actions.add(new GetRelatedOne(modelWidget, actionElement));
+            } else if ("get-related".equals(actionElement.getNodeName())) {
+                actions.add(new GetRelated(modelWidget, actionElement));
+            } else {
+                throw new IllegalArgumentException("Action element not supported with name: " + actionElement.getNodeName());
+            }
         }
         return actions;
     }

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoContext.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoContext.java?rev=1636073&r1=1636072&r2=1636073&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoContext.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoContext.java Sun Nov  2 00:06:34 2014
@@ -31,7 +31,6 @@ public final class ArtifactInfoContext {
     private final Set<String> screenLocationSet = new HashSet<String>();
     private final Set<String> formLocationSet = new HashSet<String>();
     private final Set<String> requestLocationSet = new HashSet<String>();
-    private final Set<String> targetLocationSet = new HashSet<String>();
 
     /**
      * Adds an entity name to this context.
@@ -84,16 +83,6 @@ public final class ArtifactInfoContext {
     }
 
     /**
-     * Adds a target location to this context.
-     * @param name The target location to add to this context
-     */
-    public void addTargetLocation(String name) {
-        if (name != null) {
-            this.targetLocationSet.add(name);
-        }
-    }
-
-    /**
      * Returns the entity names in this context.
      * @return The entity names in this context
      */
@@ -132,12 +121,4 @@ public final class ArtifactInfoContext {
     public Set<String> getServiceNames() {
         return this.serviceNameSet;
     }
-
-    /**
-     * Returns the target locations in this context.
-     * @return The target locations in this context
-     */
-    public Set<String> getTargetLocations() {
-        return this.targetLocationSet;
-    }
 }

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoGatherer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoGatherer.java?rev=1636073&r1=1636072&r2=1636073&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoGatherer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoGatherer.java Sun Nov  2 00:06:34 2014
@@ -21,10 +21,8 @@ package org.ofbiz.widget.artifact;
 import java.util.Set;
 
 import org.ofbiz.base.util.GeneralException;
-import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.webapp.control.ConfigXMLReader;
 import org.ofbiz.widget.ModelActionVisitor;
-import org.ofbiz.widget.ModelFieldVisitor;
 import org.ofbiz.widget.ModelWidgetAction;
 import org.ofbiz.widget.ModelWidgetAction.EntityAnd;
 import org.ofbiz.widget.ModelWidgetAction.EntityCondition;
@@ -38,33 +36,6 @@ import org.ofbiz.widget.ModelWidgetActio
 import org.ofbiz.widget.ModelWidgetAction.SetField;
 import org.ofbiz.widget.ModelWidgetVisitor;
 import org.ofbiz.widget.form.ModelForm;
-import org.ofbiz.widget.form.ModelForm.AltTarget;
-import org.ofbiz.widget.form.ModelForm.AutoFieldsEntity;
-import org.ofbiz.widget.form.ModelForm.AutoFieldsService;
-import org.ofbiz.widget.form.ModelFormAction.CallParentActions;
-import org.ofbiz.widget.form.ModelFormField;
-import org.ofbiz.widget.form.ModelFormField.CheckField;
-import org.ofbiz.widget.form.ModelFormField.ContainerField;
-import org.ofbiz.widget.form.ModelFormField.DateFindField;
-import org.ofbiz.widget.form.ModelFormField.DateTimeField;
-import org.ofbiz.widget.form.ModelFormField.DisplayEntityField;
-import org.ofbiz.widget.form.ModelFormField.DisplayField;
-import org.ofbiz.widget.form.ModelFormField.DropDownField;
-import org.ofbiz.widget.form.ModelFormField.FieldInfo;
-import org.ofbiz.widget.form.ModelFormField.FileField;
-import org.ofbiz.widget.form.ModelFormField.HiddenField;
-import org.ofbiz.widget.form.ModelFormField.HyperlinkField;
-import org.ofbiz.widget.form.ModelFormField.IgnoredField;
-import org.ofbiz.widget.form.ModelFormField.ImageField;
-import org.ofbiz.widget.form.ModelFormField.LookupField;
-import org.ofbiz.widget.form.ModelFormField.PasswordField;
-import org.ofbiz.widget.form.ModelFormField.RadioField;
-import org.ofbiz.widget.form.ModelFormField.RangeFindField;
-import org.ofbiz.widget.form.ModelFormField.ResetField;
-import org.ofbiz.widget.form.ModelFormField.SubmitField;
-import org.ofbiz.widget.form.ModelFormField.TextField;
-import org.ofbiz.widget.form.ModelFormField.TextFindField;
-import org.ofbiz.widget.form.ModelFormField.TextareaField;
 import org.ofbiz.widget.menu.ModelMenu;
 import org.ofbiz.widget.screen.HtmlWidget;
 import org.ofbiz.widget.screen.HtmlWidget.HtmlTemplate;
@@ -106,10 +77,6 @@ public final class ArtifactInfoGatherer 
     }
 
     @Override
-    public void visit(CallParentActions callParentActions) {
-    }
-
-    @Override
     public void visit(EntityAnd entityAnd) {
         infoContext.addEntityName(entityAnd.getFinder().getEntityName());
     }
@@ -180,80 +147,6 @@ public final class ArtifactInfoGatherer 
 
     @Override
     public void visit(ModelForm modelForm) {
-        if (modelForm.getActions() != null) {
-            for (ModelWidgetAction action : modelForm.getActions()) {
-                action.accept(this);
-            }
-        }
-        if (modelForm.getRowActions() != null) {
-            for (ModelWidgetAction action : modelForm.getRowActions()) {
-                action.accept(this);
-            }
-        }
-        for (AutoFieldsEntity autoFieldsEntity : modelForm.getAutoFieldsEntities()) {
-            infoContext.addEntityName(autoFieldsEntity.entityName);
-        }
-        for (AutoFieldsService autoFieldsService : modelForm.getAutoFieldsServices()) {
-            infoContext.addServiceName(autoFieldsService.serviceName);
-        }
-        if (modelForm.getAltTargets() != null) {
-            for (AltTarget altTarget : modelForm.getAltTargets()) {
-                String target = altTarget.targetExdr.getOriginal();
-                String urlMode = "intra-app";
-                try {
-                    Set<String> controllerLocAndRequestSet = ConfigXMLReader.findControllerRequestUniqueForTargetType(target,
-                            urlMode);
-                    if (controllerLocAndRequestSet != null) {
-                        for (String requestLocation : controllerLocAndRequestSet) {
-                            infoContext.addTargetLocation(requestLocation);
-                        }
-                    }
-                } catch (GeneralException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        }
-        if (!modelForm.getTarget().isEmpty()) {
-            String target = modelForm.getTarget();
-            String urlMode = UtilValidate.isNotEmpty(modelForm.getTargetType()) ? modelForm.getTargetType() : "intra-app";
-            if (target.indexOf("${") < 0) {
-                try {
-                    Set<String> controllerLocAndRequestSet = ConfigXMLReader.findControllerRequestUniqueForTargetType(target,
-                            urlMode);
-                    if (controllerLocAndRequestSet != null) {
-                        for (String requestLocation : controllerLocAndRequestSet) {
-                            infoContext.addTargetLocation(requestLocation);
-                        }
-                    }
-                } catch (GeneralException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        }
-        FieldInfoGatherer fieldInfoGatherer = new FieldInfoGatherer();
-        for (ModelFormField modelFormField : modelForm.getFieldList()) {
-            if (UtilValidate.isNotEmpty(modelFormField.getEntityName())) {
-                infoContext.addEntityName(modelFormField.getEntityName());
-            }
-            if (modelFormField.getFieldInfo() instanceof ModelFormField.DisplayEntityField) {
-                infoContext.addEntityName(((ModelFormField.DisplayEntityField) modelFormField.getFieldInfo()).getEntityName());
-            }
-            if (modelFormField.getFieldInfo() instanceof ModelFormField.FieldInfoWithOptions) {
-                for (ModelFormField.OptionSource optionSource : ((ModelFormField.FieldInfoWithOptions) modelFormField
-                        .getFieldInfo()).getOptionSources()) {
-                    if (optionSource instanceof ModelFormField.EntityOptions) {
-                        infoContext.addEntityName(((ModelFormField.EntityOptions) optionSource).getEntityName());
-                    }
-                }
-            }
-            if (UtilValidate.isNotEmpty(modelFormField.getServiceName())) {
-                infoContext.addServiceName(modelFormField.getServiceName());
-            }
-            FieldInfo fieldInfo = modelFormField.getFieldInfo();
-            if (fieldInfo != null) {
-                fieldInfo.accept(fieldInfoGatherer);
-            }
-        }
     }
 
     @Override
@@ -264,8 +157,7 @@ public final class ArtifactInfoGatherer 
     public void visit(ModelScreen modelScreen) {
         String screenLocation = modelScreen.getSourceLocation().concat("#").concat(modelScreen.getName());
         infoContext.addScreenLocation(screenLocation);
-        modelScreen.getSection().accept(this);
-        ;
+        modelScreen.getSection().accept(this);;
     }
 
     @Override
@@ -387,128 +279,4 @@ public final class ArtifactInfoGatherer 
     @Override
     public void visit(ModelTree modelTree) {
     }
-
-    private class FieldInfoGatherer implements ModelFieldVisitor {
-
-        private void addRequestLocations(String target, String urlMode) {
-            try {
-                Set<String> controllerLocAndRequestSet = ConfigXMLReader
-                        .findControllerRequestUniqueForTargetType(target, urlMode);
-                if (controllerLocAndRequestSet != null) {
-                    for (String requestLocation : controllerLocAndRequestSet) {
-                        infoContext.addRequestLocation(requestLocation);
-                    }
-                }
-            } catch (GeneralException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        @Override
-        public void visit(CheckField checkField) {
-        }
-
-        @Override
-        public void visit(ContainerField containerField) {
-        }
-
-        @Override
-        public void visit(DateFindField dateTimeField) {
-        }
-
-        @Override
-        public void visit(DateTimeField dateTimeField) {
-        }
-
-        @Override
-        public void visit(DisplayEntityField displayField) {
-            if (displayField.getSubHyperlink() != null) {
-                String target = displayField.getSubHyperlink().getTarget(null);
-                String urlMode = displayField.getSubHyperlink().getTargetType();
-                addRequestLocations(target, urlMode);
-            }
-        }
-
-        @Override
-        public void visit(DisplayField displayField) {
-        }
-
-        @Override
-        public void visit(DropDownField dropDownField) {
-            if (dropDownField.getSubHyperlink() != null) {
-                String target = dropDownField.getSubHyperlink().getTarget(null);
-                String urlMode = dropDownField.getSubHyperlink().getTargetType();
-                addRequestLocations(target, urlMode);
-            }
-        }
-
-        @Override
-        public void visit(FileField textField) {
-            if (textField.getSubHyperlink() != null) {
-                String target = textField.getSubHyperlink().getTarget(null);
-                String urlMode = textField.getSubHyperlink().getTargetType();
-                addRequestLocations(target, urlMode);
-            }
-        }
-
-        @Override
-        public void visit(HiddenField hiddenField) {
-        }
-
-        @Override
-        public void visit(HyperlinkField hyperlinkField) {
-            String target = hyperlinkField.getTarget(null);
-            String urlMode = hyperlinkField.getTargetType();
-            addRequestLocations(target, urlMode);
-        }
-
-        @Override
-        public void visit(IgnoredField ignoredField) {
-        }
-
-        @Override
-        public void visit(ImageField imageField) {
-            if (imageField.getSubHyperlink() != null) {
-                String target = imageField.getSubHyperlink().getTarget(null);
-                String urlMode = imageField.getSubHyperlink().getTargetType();
-                addRequestLocations(target, urlMode);
-            }
-        }
-
-        @Override
-        public void visit(LookupField textField) {
-        }
-
-        @Override
-        public void visit(PasswordField textField) {
-        }
-
-        @Override
-        public void visit(RadioField radioField) {
-        }
-
-        @Override
-        public void visit(RangeFindField textField) {
-        }
-
-        @Override
-        public void visit(ResetField resetField) {
-        }
-
-        @Override
-        public void visit(SubmitField submitField) {
-        }
-
-        @Override
-        public void visit(TextareaField textareaField) {
-        }
-
-        @Override
-        public void visit(TextField textField) {
-        }
-
-        @Override
-        public void visit(TextFindField textField) {
-        }
-    }
 }

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java?rev=1636073&r1=1636072&r2=1636073&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java Sun Nov  2 00:06:34 2014
@@ -35,6 +35,7 @@ import java.util.TreeSet;
 
 import org.ofbiz.base.util.BshUtil;
 import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.GeneralException;
 import org.ofbiz.base.util.StringUtil;
 import org.ofbiz.base.util.UtilGenerics;
 import org.ofbiz.base.util.UtilMisc;
@@ -54,8 +55,8 @@ import org.ofbiz.service.DispatchContext
 import org.ofbiz.service.GenericServiceException;
 import org.ofbiz.service.ModelParam;
 import org.ofbiz.service.ModelService;
+import org.ofbiz.webapp.control.ConfigXMLReader;
 import org.ofbiz.widget.ModelWidget;
-import org.ofbiz.widget.ModelWidgetAction;
 import org.ofbiz.widget.ModelWidgetVisitor;
 import org.ofbiz.widget.WidgetWorker;
 import org.w3c.dom.Element;
@@ -188,8 +189,8 @@ public class ModelForm extends ModelWidg
     public static String DEFAULT_SORT_FIELD_ASC_STYLE = "sort-order-asc";
     public static String DEFAULT_SORT_FIELD_DESC_STYLE = "sort-order-desc";
 
-    protected List<ModelWidgetAction> actions;
-    protected List<ModelWidgetAction> rowActions;
+    protected List<ModelFormAction> actions;
+    protected List<ModelFormAction> rowActions;
     protected FlexibleStringExpander rowCountExdr;
     protected List<ModelFormField> multiSubmitFields = new ArrayList<ModelFormField>();
     protected int rowCount = 0;
@@ -222,30 +223,6 @@ public class ModelForm extends ModelWidg
         initForm(formElement);
     }
 
-    public String getTarget() {
-        return target.getOriginal();
-    }
-
-    public List<AltTarget> getAltTargets() {
-        return altTargets;
-    }
-
-    public List<ModelWidgetAction> getActions() {
-        return actions;
-    }
-
-    public List<ModelWidgetAction> getRowActions() {
-        return rowActions;
-    }
-
-    public List<AutoFieldsEntity> getAutoFieldsEntities() {
-        return autoFieldsEntities;
-    }
-
-    public List<AutoFieldsService> getAutoFieldsServices() {
-        return autoFieldsServices;
-    }
-
     public void initForm(Element formElement) {
 
         setDefaultViewSize(UtilProperties.getPropertyValue("widget.properties", "widget.form.defaultViewSize"));
@@ -3183,6 +3160,166 @@ public class ModelForm extends ModelWidg
         }
     }
 
+    public Set<String> getAllEntityNamesUsed() {
+        Set<String> allEntityNamesUsed = new HashSet<String>();
+        for (AutoFieldsEntity autoFieldsEntity: this.autoFieldsEntities) {
+            allEntityNamesUsed.add(autoFieldsEntity.entityName);
+        }
+        if (this.actions != null) {
+            for (ModelFormAction modelFormAction: this.actions) {
+                if (modelFormAction instanceof ModelFormAction.EntityOne) {
+                    allEntityNamesUsed.add(((ModelFormAction.EntityOne)modelFormAction).finder.getEntityName());
+                } else if (modelFormAction instanceof ModelFormAction.EntityAnd) {
+                    allEntityNamesUsed.add(((ModelFormAction.EntityAnd)modelFormAction).finder.getEntityName());
+                } else if (modelFormAction instanceof ModelFormAction.EntityCondition) {
+                    allEntityNamesUsed.add(((ModelFormAction.EntityCondition)modelFormAction).finder.getEntityName());
+                }
+
+            }
+        }
+        if (this.rowActions != null) {
+            for (ModelFormAction modelFormAction: this.rowActions) {
+                if (modelFormAction instanceof ModelFormAction.EntityOne) {
+                    allEntityNamesUsed.add(((ModelFormAction.EntityOne)modelFormAction).finder.getEntityName());
+                } else if (modelFormAction instanceof ModelFormAction.EntityAnd) {
+                    allEntityNamesUsed.add(((ModelFormAction.EntityAnd)modelFormAction).finder.getEntityName());
+                } else if (modelFormAction instanceof ModelFormAction.EntityCondition) {
+                    allEntityNamesUsed.add(((ModelFormAction.EntityCondition)modelFormAction).finder.getEntityName());
+                }
+            }
+        }
+        for (ModelFormField modelFormField: this.fieldList) {
+            if (UtilValidate.isNotEmpty(modelFormField.getEntityName())) {
+                allEntityNamesUsed.add(modelFormField.getEntityName());
+            }
+            if (modelFormField.getFieldInfo() instanceof ModelFormField.DisplayEntityField) {
+                allEntityNamesUsed.add(((ModelFormField.DisplayEntityField)modelFormField.getFieldInfo()).entityName);
+            }
+            if (modelFormField.getFieldInfo() instanceof ModelFormField.FieldInfoWithOptions) {
+                for (ModelFormField.OptionSource optionSource: ((ModelFormField.FieldInfoWithOptions)modelFormField.getFieldInfo()).optionSources) {
+                    if (optionSource instanceof ModelFormField.EntityOptions) {
+                        allEntityNamesUsed.add(((ModelFormField.EntityOptions)optionSource).entityName);
+                    }
+                }
+            }
+        }
+        return allEntityNamesUsed;
+    }
+
+    public Set<String> getAllServiceNamesUsed() {
+        Set<String> allServiceNamesUsed = new HashSet<String>();
+        for (AutoFieldsService autoFieldsService: this.autoFieldsServices) {
+            allServiceNamesUsed.add(autoFieldsService.serviceName);
+        }
+        if (this.actions != null) {
+            for (ModelFormAction modelFormAction: this.actions) {
+                try {
+                    ModelFormAction.Service service = (ModelFormAction.Service) modelFormAction;
+                    if (!service.serviceNameExdr.isEmpty()) {
+                        allServiceNamesUsed.add(service.serviceNameExdr.toString());
+                    }
+                } catch (ClassCastException e) {}
+            }
+        }
+        if (this.rowActions != null) {
+            for (ModelFormAction modelFormAction: this.rowActions) {
+                try {
+                    ModelFormAction.Service service = (ModelFormAction.Service) modelFormAction;
+                    if (!service.serviceNameExdr.isEmpty()) {
+                        allServiceNamesUsed.add(service.serviceNameExdr.toString());
+                    }
+                } catch (ClassCastException e) {}
+            }
+        }
+        for (ModelFormField modelFormField: this.fieldList) {
+            if (UtilValidate.isNotEmpty(modelFormField.getServiceName())) {
+                allServiceNamesUsed.add(modelFormField.getServiceName());
+            }
+        }
+        return allServiceNamesUsed;
+    }
+
+    public Set<String> getLinkedRequestsLocationAndUri() throws GeneralException {
+        Set<String> allRequestsUsed = new HashSet<String>();
+
+        if (this.fieldList != null) {
+            for (ModelFormField modelFormField: this.fieldList) {
+                if (modelFormField.getFieldInfo() instanceof ModelFormField.HyperlinkField) {
+                    ModelFormField.HyperlinkField link = (ModelFormField.HyperlinkField) modelFormField.getFieldInfo();
+                    String target = link.getTarget(null);
+                    String urlMode = link.getTargetType();
+
+                    Set<String> controllerLocAndRequestSet = ConfigXMLReader.findControllerRequestUniqueForTargetType(target, urlMode);
+                    if (controllerLocAndRequestSet != null) {
+                        allRequestsUsed.addAll(controllerLocAndRequestSet);
+                    }
+                } else if (modelFormField.getFieldInfo() instanceof ModelFormField.DisplayEntityField) {
+                    ModelFormField.DisplayEntityField parentField = (ModelFormField.DisplayEntityField) modelFormField.getFieldInfo();
+                    if (parentField.subHyperlink != null) {
+                        Set<String> controllerLocAndRequestSet = ConfigXMLReader.findControllerRequestUniqueForTargetType(parentField.subHyperlink.getTarget(null), parentField.subHyperlink.getTargetType());
+                        if (controllerLocAndRequestSet != null) {
+                            allRequestsUsed.addAll(controllerLocAndRequestSet);
+                        }
+                    }
+                } else if (modelFormField.getFieldInfo() instanceof ModelFormField.TextField) {
+                    ModelFormField.TextField parentField = (ModelFormField.TextField) modelFormField.getFieldInfo();
+                    if (parentField.subHyperlink != null) {
+                        Set<String> controllerLocAndRequestSet = ConfigXMLReader.findControllerRequestUniqueForTargetType(parentField.subHyperlink.getTarget(null), parentField.subHyperlink.getTargetType());
+                        if (controllerLocAndRequestSet != null) {
+                            allRequestsUsed.addAll(controllerLocAndRequestSet);
+                        }
+                    }
+                } else if (modelFormField.getFieldInfo() instanceof ModelFormField.DropDownField) {
+                    ModelFormField.DropDownField parentField = (ModelFormField.DropDownField) modelFormField.getFieldInfo();
+                    if (parentField.subHyperlink != null) {
+                        Set<String> controllerLocAndRequestSet = ConfigXMLReader.findControllerRequestUniqueForTargetType(parentField.subHyperlink.getTarget(null), parentField.subHyperlink.getTargetType());
+                        if (controllerLocAndRequestSet != null) {
+                            allRequestsUsed.addAll(controllerLocAndRequestSet);
+                        }
+                    }
+                } else if (modelFormField.getFieldInfo() instanceof ModelFormField.ImageField) {
+                    ModelFormField.ImageField parentField = (ModelFormField.ImageField) modelFormField.getFieldInfo();
+                    if (parentField.subHyperlink != null) {
+                        Set<String> controllerLocAndRequestSet = ConfigXMLReader.findControllerRequestUniqueForTargetType(parentField.subHyperlink.getTarget(null), parentField.subHyperlink.getTargetType());
+                        if (controllerLocAndRequestSet != null) {
+                            allRequestsUsed.addAll(controllerLocAndRequestSet);
+                        }
+                    }
+                }
+            }
+        }
+        return allRequestsUsed;
+    }
+
+    public Set<String> getTargetedRequestsLocationAndUri() throws GeneralException {
+        Set<String> allRequestsUsed = new HashSet<String>();
+
+        if (this.altTargets != null) {
+            for (AltTarget altTarget: this.altTargets) {
+                String target = altTarget.targetExdr.getOriginal();
+                String urlMode = "intra-app";
+
+                Set<String> controllerLocAndRequestSet = ConfigXMLReader.findControllerRequestUniqueForTargetType(target, urlMode);
+                if (controllerLocAndRequestSet != null) {
+                    allRequestsUsed.addAll(controllerLocAndRequestSet);
+                }
+            }
+        }
+
+        if (!this.target.isEmpty()) {
+            String target = this.target.getOriginal();
+            String urlMode = UtilValidate.isNotEmpty(this.targetType) ? this.targetType : "intra-app";
+            if (target.indexOf("${") < 0) {
+                Set<String> controllerLocAndRequestSet = ConfigXMLReader.findControllerRequestUniqueForTargetType(target, urlMode);
+                if (controllerLocAndRequestSet != null) {
+                    allRequestsUsed.addAll(controllerLocAndRequestSet);
+                }
+            }
+        }
+
+        return allRequestsUsed;
+    }
+
     @Override
     public void accept(ModelWidgetVisitor visitor) {
         visitor.visit(this);

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormAction.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormAction.java?rev=1636073&r1=1636072&r2=1636073&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormAction.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormAction.java Sun Nov  2 00:06:34 2014
@@ -18,62 +18,518 @@
  *******************************************************************************/
 package org.ofbiz.widget.form;
 
-import java.util.ArrayList;
-import java.util.Collections;
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.ListIterator;
+import java.util.Locale;
 import java.util.Map;
+import java.util.TimeZone;
+import java.util.regex.PatternSyntaxException;
 
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.GeneralException;
+import org.ofbiz.base.util.ObjectType;
+import org.ofbiz.base.util.ScriptUtil;
+import org.ofbiz.base.util.UtilGenerics;
+import org.ofbiz.base.util.UtilProperties;
+import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.base.util.UtilXml;
-import org.ofbiz.widget.ModelActionVisitor;
-import org.ofbiz.widget.ModelWidgetAction;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
+import org.ofbiz.base.util.string.FlexibleStringExpander;
+import org.ofbiz.entity.finder.ByAndFinder;
+import org.ofbiz.entity.finder.ByConditionFinder;
+import org.ofbiz.entity.finder.EntityFinderUtil;
+import org.ofbiz.entity.finder.PrimaryKeyFinder;
+import org.ofbiz.entity.util.EntityUtilProperties;
+import org.ofbiz.minilang.MiniLangException;
+import org.ofbiz.minilang.SimpleMethod;
+import org.ofbiz.minilang.method.MethodContext;
+import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.GenericServiceException;
+import org.ofbiz.service.ModelService;
+import org.ofbiz.widget.WidgetWorker;
 import org.w3c.dom.Element;
 
+
 /**
  * Widget Library - Screen model class
  */
-public class ModelFormAction {
-
+public abstract class ModelFormAction {
     public static final String module = ModelFormAction.class.getName();
 
-    public static List<ModelWidgetAction> readSubActions(ModelForm modelForm, Element parentElement) {
-        List<? extends Element> elementList = UtilXml.childElementList(parentElement);
-        if (elementList.isEmpty()) {
-            return Collections.emptyList();
-        }
-        List<ModelWidgetAction> actions = new ArrayList<ModelWidgetAction>(elementList.size());
+    protected ModelForm modelForm;
+
+    public ModelFormAction(ModelForm modelForm, Element actionElement) {
+        this.modelForm = modelForm;
+        if (Debug.verboseOn()) Debug.logVerbose("Reading Screen action with name: " + actionElement.getNodeName(), module);
+    }
+
+    public abstract void runAction(Map<String, Object> context);
+
+    public static List<ModelFormAction> readSubActions(ModelForm modelForm, Element parentElement) {
+        List<ModelFormAction> actions = new LinkedList<ModelFormAction>();
+
         for (Element actionElement: UtilXml.childElementList(parentElement)) {
-            if ("call-parent-actions".equals(actionElement.getNodeName())) {
+            if ("set".equals(actionElement.getNodeName())) {
+                actions.add(new SetField(modelForm, actionElement));
+            } else if ("property-map".equals(actionElement.getNodeName())) {
+                actions.add(new PropertyMap(modelForm, actionElement));
+            } else if ("property-to-field".equals(actionElement.getNodeName())) {
+                actions.add(new PropertyToField(modelForm, actionElement));
+            } else if ("script".equals(actionElement.getNodeName())) {
+                actions.add(new Script(modelForm, actionElement));
+            } else if ("service".equals(actionElement.getNodeName())) {
+                actions.add(new Service(modelForm, actionElement));
+            } else if ("entity-one".equals(actionElement.getNodeName())) {
+                actions.add(new EntityOne(modelForm, actionElement));
+            } else if ("entity-and".equals(actionElement.getNodeName())) {
+                actions.add(new EntityAnd(modelForm, actionElement));
+            } else if ("entity-condition".equals(actionElement.getNodeName())) {
+                actions.add(new EntityCondition(modelForm, actionElement));
+            } else if ("call-parent-actions".equals(actionElement.getNodeName())) {
                 actions.add(new CallParentActions(modelForm, actionElement));
             } else {
-                actions.add(ModelWidgetAction.toModelWidgetAction(modelForm, actionElement));
+                throw new IllegalArgumentException("Action element not supported with name: " + actionElement.getNodeName());
             }
         }
-        return Collections.unmodifiableList(actions);
+
+        return actions;
     }
 
-    public static void runSubActions(List<ModelWidgetAction> actions, Map<String, Object> context) {
+    public static void runSubActions(List<ModelFormAction> actions, Map<String, Object> context) {
         if (actions == null) return;
-        for (ModelWidgetAction action: actions) {
-            if (Debug.verboseOn()) Debug.logVerbose("Running form action " + action.getClass().getName(), module);
+
+        for (ModelFormAction action: actions) {
+            if (Debug.verboseOn()) Debug.logVerbose("Running screen action " + action.getClass().getName(), module);
+            action.runAction(context);
+        }
+    }
+
+    public static class SetField extends ModelFormAction {
+        protected FlexibleMapAccessor<Object> field;
+        protected FlexibleMapAccessor<String> fromField;
+        protected FlexibleStringExpander valueExdr;
+        protected FlexibleStringExpander defaultExdr;
+        protected FlexibleStringExpander globalExdr;
+        protected String type;
+
+        public SetField(ModelForm modelForm, Element setElement) {
+            super (modelForm, setElement);
+            this.field = FlexibleMapAccessor.getInstance(setElement.getAttribute("field"));
+            this.fromField = FlexibleMapAccessor.getInstance(setElement.getAttribute("from-field"));
+            this.valueExdr = FlexibleStringExpander.getInstance(setElement.getAttribute("value"));
+            this.defaultExdr = FlexibleStringExpander.getInstance(setElement.getAttribute("default-value"));
+            this.globalExdr = FlexibleStringExpander.getInstance(setElement.getAttribute("global"));
+            this.type = setElement.getAttribute("type");
+            if (!this.fromField.isEmpty() && !this.valueExdr.isEmpty()) {
+                throw new IllegalArgumentException("Cannot specify a from-field [" + setElement.getAttribute("from-field") + "] and a value [" + setElement.getAttribute("value") + "] on the set action in a screen widget");
+            }
+        }
+
+        @SuppressWarnings("rawtypes")
+        @Override
+        public void runAction(Map<String, Object> context) {
+            String globalStr = this.globalExdr.expandString(context);
+            // default to false
+            boolean global = "true".equals(globalStr);
+
+            Object newValue = null;
+            if (!this.fromField.isEmpty()) {
+                newValue = this.fromField.get(context);
+                if (Debug.verboseOn()) Debug.logVerbose("In screen getting value for field from [" + this.fromField.getOriginalName() + "]: " + newValue, module);
+            } else if (!this.valueExdr.isEmpty()) {
+                newValue = this.valueExdr.expand(context);
+            }
+
+            // If newValue is still empty, use the default value
+            if (ObjectType.isEmpty(newValue) && !this.defaultExdr.isEmpty()) {
+                newValue = this.defaultExdr.expand(context);
+            }
+
+            if (UtilValidate.isNotEmpty(this.type)) {
+                if ("NewMap".equals(this.type)) {
+                    newValue = new HashMap();
+                } else if ("NewList".equals(this.type)) {
+                    newValue = new LinkedList();
+                } else {
+                    try {
+                        newValue = ObjectType.simpleTypeConvert(newValue, this.type, null, (TimeZone) context.get("timeZone"), (Locale) context.get("locale"), true);
+                    } catch (GeneralException e) {
+                        String errMsg = "Could not convert field value for the field: [" + this.field.getOriginalName() + "] to the [" + this.type + "] type for the value [" + newValue + "]: " + e.toString();
+                        Debug.logError(e, errMsg, module);
+                        throw new IllegalArgumentException(errMsg);
+                    }
+                }
+            }
+            if (Debug.verboseOn()) Debug.logVerbose("In screen setting field [" + this.field.getOriginalName() + "] to value: " + newValue, module);
+            this.field.put(context, newValue);
+
+            if (global) {
+                Map<String, Object> globalCtx = UtilGenerics.checkMap(context.get("globalContext"));
+                if (globalCtx != null) {
+                    this.field.put(globalCtx, newValue);
+                }
+            }
+
+            // this is a hack for backward compatibility with the JPublish page object
+            Map<String, Object> page = UtilGenerics.checkMap(context.get("page"));
+            if (page != null) {
+                this.field.put(page, newValue);
+            }
+        }
+    }
+
+    public static class PropertyMap extends ModelFormAction {
+        protected FlexibleStringExpander resourceExdr;
+        protected FlexibleMapAccessor<Map<String, Object>> mapNameAcsr;
+        protected FlexibleStringExpander globalExdr;
+
+        public PropertyMap(ModelForm modelForm, Element setElement) {
+            super (modelForm, setElement);
+            this.resourceExdr = FlexibleStringExpander.getInstance(setElement.getAttribute("resource"));
+            this.mapNameAcsr = FlexibleMapAccessor.getInstance(setElement.getAttribute("map-name"));
+            this.globalExdr = FlexibleStringExpander.getInstance(setElement.getAttribute("global"));
+        }
+
+        @Override
+        public void runAction(Map<String, Object> context) {
+            String globalStr = this.globalExdr.expandString(context);
+            // default to false
+            boolean global = "true".equals(globalStr);
+
+            Locale locale = (Locale) context.get("locale");
+            String resource = this.resourceExdr.expandString(context, locale);
+            Map<String, Object> propertyMap = UtilProperties.getResourceBundleMap(resource, locale);
+            this.mapNameAcsr.put(context, propertyMap);
+
+            if (global) {
+                Map<String, Object> globalCtx = UtilGenerics.checkMap(context.get("globalContext"));
+                if (globalCtx != null) {
+                    this.mapNameAcsr.put(globalCtx, propertyMap);
+                }
+            }
+        }
+    }
+
+    public static class PropertyToField extends ModelFormAction {
+
+        protected FlexibleStringExpander resourceExdr;
+        protected FlexibleStringExpander propertyExdr;
+        protected FlexibleMapAccessor<String> fieldAcsr;
+        protected FlexibleStringExpander defaultExdr;
+        protected boolean noLocale;
+        protected FlexibleMapAccessor<List<Object>> argListAcsr;
+        protected FlexibleStringExpander globalExdr;
+
+        public PropertyToField(ModelForm modelForm, Element setElement) {
+            super (modelForm, setElement);
+            this.resourceExdr = FlexibleStringExpander.getInstance(setElement.getAttribute("resource"));
+            this.propertyExdr = FlexibleStringExpander.getInstance(setElement.getAttribute("property"));
+            this.fieldAcsr = FlexibleMapAccessor.getInstance(setElement.getAttribute("field"));
+            this.defaultExdr = FlexibleStringExpander.getInstance(setElement.getAttribute("default"));
+            noLocale = "true".equals(setElement.getAttribute("no-locale"));
+            this.argListAcsr = FlexibleMapAccessor.getInstance(setElement.getAttribute("arg-list-name"));
+            this.globalExdr = FlexibleStringExpander.getInstance(setElement.getAttribute("global"));
+        }
+
+        @Override
+        public void runAction(Map<String, Object> context) {
+            //String globalStr = this.globalExdr.expandString(context);
+            // default to false
+            //boolean global = "true".equals(globalStr);
+
+            Locale locale = (Locale) context.get("locale");
+            String resource = this.resourceExdr.expandString(context, locale);
+            String property = this.propertyExdr.expandString(context, locale);
+
+            String value = null;
+            if (noLocale) {
+                value = EntityUtilProperties.getPropertyValue(resource, property, WidgetWorker.getDelegator(context));
+            } else {
+                value = EntityUtilProperties.getMessage(resource, property, locale, WidgetWorker.getDelegator(context));
+            }
+            if (UtilValidate.isEmpty(value)) {
+                value = this.defaultExdr.expandString(context);
+            }
+
+            // note that expanding the value string here will handle defaultValue and the string from
+            //  the properties file; if we decide later that we don't want the string from the properties
+            //  file to be expanded we should just expand the defaultValue at the beginning of this method.
+            value = FlexibleStringExpander.expandString(value, context);
+
+            if (!argListAcsr.isEmpty()) {
+                List<Object> argList = argListAcsr.get(context);
+                if (UtilValidate.isNotEmpty(argList)) {
+                    value = MessageFormat.format(value, argList.toArray());
+                }
+            }
+
+            fieldAcsr.put(context, value);
+        }
+    }
+
+    public static class Script extends ModelFormAction {
+        protected String location;
+        protected String method;
+
+        public Script(ModelForm modelForm, Element scriptElement) {
+            super (modelForm, scriptElement);
+            String scriptLocation = scriptElement.getAttribute("location");
+            this.location = WidgetWorker.getScriptLocation(scriptLocation);
+            this.method = WidgetWorker.getScriptMethodName(scriptLocation);
+        }
+
+        @Override
+        public void runAction(Map<String, Object> context) {
+            if (location.endsWith(".xml")) {
+                Map<String, Object> localContext = new HashMap<String, Object>();
+                localContext.putAll(context);
+                DispatchContext ctx = this.modelForm.dispatchContext;
+                MethodContext methodContext = new MethodContext(ctx, localContext, null);
+                try {
+                    SimpleMethod.runSimpleMethod(location, method, methodContext);
+                    context.putAll(methodContext.getResults());
+                } catch (MiniLangException e) {
+                    throw new IllegalArgumentException("Error running simple method at location [" + location + "]", e);
+                }
+            } else {
+                ScriptUtil.executeScript(this.location, this.method, context);
+            }
+        }
+    }
+
+    public static class Service extends ModelFormAction {
+        protected FlexibleStringExpander serviceNameExdr;
+        protected FlexibleMapAccessor<Map<String, Object>> resultMapNameAcsr;
+        protected FlexibleStringExpander autoFieldMapExdr;
+        protected FlexibleStringExpander resultMapListNameExdr;
+        protected Map<FlexibleMapAccessor<Object>, Object> fieldMap;
+        protected boolean ignoreError = false;
+
+        public Service(ModelForm modelForm, Element serviceElement) {
+            super (modelForm, serviceElement);
+            this.serviceNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("service-name"));
+            this.resultMapNameAcsr = FlexibleMapAccessor.getInstance(serviceElement.getAttribute("result-map"));
+            if (this.resultMapNameAcsr.isEmpty()) this.resultMapNameAcsr = FlexibleMapAccessor.getInstance(serviceElement.getAttribute("result-map-name"));
+            this.autoFieldMapExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("auto-field-map"));
+            if (UtilValidate.isEmpty(serviceElement.getAttribute("result-map-list")) && UtilValidate.isEmpty(serviceElement.getAttribute("result-map-list-name"))) {
+                if (UtilValidate.isEmpty(serviceElement.getAttribute("result-map-list-iterator")) && UtilValidate.isEmpty(serviceElement.getAttribute("result-map-list-iterator-name"))) {
+                    String lstNm = modelForm.getListName();
+                    if (UtilValidate.isEmpty(lstNm)) {
+                        lstNm = ModelForm.DEFAULT_FORM_RESULT_LIST_NAME;
+                    }
+                    this.resultMapListNameExdr = FlexibleStringExpander.getInstance(lstNm);
+                } else {
+                    // this is deprecated, but support it for now anyway
+                    this.resultMapListNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("result-map-list-iterator"));
+                    if (this.resultMapListNameExdr.isEmpty()) this.resultMapListNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("result-map-list-iterator-name"));
+                }
+            } else {
+                this.resultMapListNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("result-map-list"));
+                if (this.resultMapListNameExdr.isEmpty()) this.resultMapListNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("result-map-list-name"));
+            }
+
+            this.fieldMap = EntityFinderUtil.makeFieldMap(serviceElement);
+            this.ignoreError = "true".equals(serviceElement.getAttribute("ignore-error"));
+        }
+
+        @Override
+        public void runAction(Map<String, Object> context) {
+            String serviceNameExpanded = this.serviceNameExdr.expandString(context);
+            if (UtilValidate.isEmpty(serviceNameExpanded)) {
+                throw new IllegalArgumentException("Service name was empty, expanded from: " + this.serviceNameExdr.getOriginal());
+            }
+
+            String autoFieldMapString = this.autoFieldMapExdr.expandString(context);
+            boolean autoFieldMapBool = !"false".equals(autoFieldMapString);
+
+            try {
+                Map<String, Object> serviceContext = null;
+                if (autoFieldMapBool) {
+                    if (! "true".equals(autoFieldMapString)) {
+                        Map<String, Object> autoFieldMap = UtilGenerics.checkMap(context.get(autoFieldMapString));
+                        serviceContext = WidgetWorker.getDispatcher(context).getDispatchContext().makeValidContext(serviceNameExpanded, ModelService.IN_PARAM, autoFieldMap);
+                    } else {
+                        serviceContext = WidgetWorker.getDispatcher(context).getDispatchContext().makeValidContext(serviceNameExpanded, ModelService.IN_PARAM, context);
+                    }
+                } else {
+                    serviceContext = new HashMap<String, Object>();
+                }
+
+                if (this.fieldMap != null) {
+                    EntityFinderUtil.expandFieldMapToContext(this.fieldMap, context, serviceContext);
+                }
+
+                Map<String, Object> result = null;
+                if (this.ignoreError) {
+                    result = WidgetWorker.getDispatcher(context).runSync(serviceNameExpanded, serviceContext, -1, true);
+                } else {
+                    result = WidgetWorker.getDispatcher(context).runSync(serviceNameExpanded, serviceContext);
+                }
+
+                if (!this.resultMapNameAcsr.isEmpty()) {
+                    this.resultMapNameAcsr.put(context, result);
+                    String queryString = (String)result.get("queryString");
+                    context.put("queryString", queryString);
+                    context.put("queryStringMap", result.get("queryStringMap"));
+                    if (UtilValidate.isNotEmpty(queryString)) {
+                        try {
+                            String queryStringEncoded = queryString.replaceAll("&", "%26");
+                            context.put("queryStringEncoded", queryStringEncoded);
+                        } catch (PatternSyntaxException e) {
+
+                        }
+                    }
+                } else {
+                    context.putAll(result);
+                }
+                String listName = resultMapListNameExdr.expandString(context);
+                Object listObj = result.get(listName);
+                if (listObj != null) {
+                    if (!(listObj instanceof List<?>) && !(listObj instanceof ListIterator<?>)) {
+                        throw new IllegalArgumentException("Error in form [" + this.modelForm.getName() + "] calling service with name [" + serviceNameExpanded + "]: the result that is supposed to be a List or ListIterator and is not.");
+                    }
+                    context.put("listName", listName);
+                    context.put(listName, listObj);
+                }
+            } catch (GenericServiceException e) {
+                String errMsg = "Error in form [" + this.modelForm.getName() + "] calling service with name [" + serviceNameExpanded + "]: " + e.toString();
+                Debug.logError(e, errMsg, module);
+                if (!this.ignoreError) {
+                    throw new IllegalArgumentException(errMsg);
+                }
+            }
+        }
+    }
+
+    public static class EntityOne extends ModelFormAction {
+        protected PrimaryKeyFinder finder;
+
+        public EntityOne(ModelForm modelForm, Element entityOneElement) {
+            super (modelForm, entityOneElement);
+            finder = new PrimaryKeyFinder(entityOneElement);
+        }
+
+        @Override
+        public void runAction(Map<String, Object> context) {
             try {
-                action.runAction(context);
+                finder.runFind(context, WidgetWorker.getDelegator(context));
             } catch (GeneralException e) {
-                throw new RuntimeException(e);
+                String errMsg = "Error doing entity query by condition: " + e.toString();
+                Debug.logError(e, errMsg, module);
+                throw new IllegalArgumentException(errMsg);
             }
         }
     }
 
-    @SuppressWarnings("serial")
-    public static class CallParentActions extends ModelWidgetAction {
+    public static class EntityAnd extends ModelFormAction {
+        protected ByAndFinder finder;
+        String actualListName;
+
+        public EntityAnd(ModelForm modelForm, Element entityAndElement) {
+            super (modelForm, entityAndElement);
+
+            //don't want to default to the iterator, should be specified explicitly, not the default
+            // Document ownerDoc = entityAndElement.getOwnerDocument();
+            // boolean useCache = "true".equalsIgnoreCase(entityAndElement.getAttribute("use-cache"));
+            // if (!useCache) UtilXml.addChildElement(entityAndElement, "use-iterator", ownerDoc);
+
+            // make list-name optional
+            if (UtilValidate.isEmpty(entityAndElement.getAttribute("list")) && UtilValidate.isEmpty(entityAndElement.getAttribute("list-name"))) {
+                String lstNm = modelForm.getListName();
+                if (UtilValidate.isEmpty(lstNm)) {
+                    lstNm = ModelForm.DEFAULT_FORM_RESULT_LIST_NAME;
+                }
+                entityAndElement.setAttribute("list", lstNm);
+            }
+            this.actualListName = entityAndElement.getAttribute("list");
+            if (UtilValidate.isEmpty(this.actualListName)) this.actualListName = entityAndElement.getAttribute("list-name");
+            finder = new ByAndFinder(entityAndElement);
+        }
+
+        @Override
+        public void runAction(Map<String, Object> context) {
+            try {
+                // don't want to do this: context.put("defaultFormResultList", null);
+                finder.runFind(context, WidgetWorker.getDelegator(context));
+                
+                /* NOTE DEJ20100925: this should not be running any more as it causes actions in a list or multi 
+                 * form definition to overwrite the desired list elsewhere, this was the really old way of doing 
+                 * it that was removed a long time ago and needs to stay gone to avoid issues; the form's list 
+                 * should be found by explicitly matching the name:
+                Object obj = context.get(this.actualListName);
+                if (obj != null && ((obj instanceof List) || (obj instanceof EntityListIterator))) {
+                    String modelFormListName = modelForm.getListName();
+                    context.put(modelFormListName, obj);
+                }
+                 */
+            } catch (GeneralException e) {
+                String errMsg = "Error doing entity query by condition: " + e.toString();
+                Debug.logError(e, errMsg, module);
+                throw new IllegalArgumentException(errMsg);
+            }
+        }
+
+    }
+
+    public static class EntityCondition extends ModelFormAction {
+        ByConditionFinder finder;
+        String actualListName;
+
+        public EntityCondition(ModelForm modelForm, Element entityConditionElement) {
+            super (modelForm, entityConditionElement);
+
+            //don't want to default to the iterator, should be specified explicitly, not the default
+            // Document ownerDoc = entityConditionElement.getOwnerDocument();
+            // boolean useCache = "true".equalsIgnoreCase(entityConditionElement.getAttribute("use-cache"));
+            // if (!useCache) UtilXml.addChildElement(entityConditionElement, "use-iterator", ownerDoc);
+
+            // make list-name optional
+            if (UtilValidate.isEmpty(entityConditionElement.getAttribute("list")) && UtilValidate.isEmpty(entityConditionElement.getAttribute("list-name"))) {
+                String lstNm = modelForm.getListName();
+                if (UtilValidate.isEmpty(lstNm)) {
+                    lstNm = ModelForm.DEFAULT_FORM_RESULT_LIST_NAME;
+                }
+                entityConditionElement.setAttribute("list", lstNm);
+            }
+            this.actualListName = entityConditionElement.getAttribute("list");
+            if (UtilValidate.isEmpty(this.actualListName)) this.actualListName = entityConditionElement.getAttribute("list-name");
+            finder = new ByConditionFinder(entityConditionElement);
+        }
+
+        @Override
+        public void runAction(Map<String, Object> context) {
+            try {
+                // don't want to do this: context.put("defaultFormResultList", null);
+                finder.runFind(context, WidgetWorker.getDelegator(context));
+                
+                /* NOTE DEJ20100925: this should not be running any more as it causes actions in a list or multi 
+                 * form definition to overwrite the desired list elsewhere, this was the really old way of doing 
+                 * it that was removed a long time ago and needs to stay gone to avoid issues; the form's list 
+                 * should be found by explicitly matching the name:
+                Object obj = context.get(this.actualListName);
+                if (obj != null && ((obj instanceof List) || (obj instanceof EntityListIterator))) {
+                    String modelFormListName = modelForm.getListName();
+                    context.put(modelFormListName, obj);
+                }
+                 */
+            } catch (GeneralException e) {
+                String errMsg = "Error doing entity query by condition: " + e.toString();
+                Debug.logError(e, errMsg, module);
+                throw new IllegalArgumentException(errMsg);
+            }
+        }
+    }
+
+    public static class CallParentActions extends ModelFormAction {
         protected static enum ActionsKind {
             ACTIONS,
             ROW_ACTIONS
         };
 
         protected ActionsKind kind;
-        private final ModelForm modelForm;
 
         public CallParentActions(ModelForm modelForm, Element callParentActionsElement) {
             super(modelForm, callParentActionsElement);
@@ -85,11 +541,11 @@ public class ModelFormAction {
             } else {
                 throw new IllegalArgumentException("Action element not supported for call-parent-actions : " + parentName);
             }
+
             ModelForm parentModel = modelForm.getParentModelForm();
             if (parentModel == null) {
                 throw new IllegalArgumentException("call-parent-actions can only be used with form extending another form");
             }
-            this.modelForm = modelForm;
         }
 
         @Override
@@ -104,10 +560,5 @@ public class ModelFormAction {
                     break;
             }
         }
-
-        @Override
-        public void accept(ModelActionVisitor visitor) {
-            visitor.visit(this);
-        }
     }
 }