svn commit: r1649230 - in /ofbiz/trunk/framework/widget/src/org/ofbiz/widget: html/HtmlTreeRenderer.java screen/ModelScreenWidget.java tree/MacroTreeRenderer.java tree/ModelTree.java tree/ModelTreeAction.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r1649230 - in /ofbiz/trunk/framework/widget/src/org/ofbiz/widget: html/HtmlTreeRenderer.java screen/ModelScreenWidget.java tree/MacroTreeRenderer.java tree/ModelTree.java tree/ModelTreeAction.java

adrianc
Author: adrianc
Date: Sat Jan  3 18:40:39 2015
New Revision: 1649230

URL: http://svn.apache.org/r1649230
Log:
Second pass at making tree widget thread-safe. This is a WIP.

Modified:
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlTreeRenderer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/MacroTreeRenderer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTree.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTreeAction.java

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlTreeRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlTreeRenderer.java?rev=1649230&r1=1649229&r2=1649230&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlTreeRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlTreeRenderer.java Sat Jan  3 18:40:39 2015
@@ -71,7 +71,6 @@ public class HtmlTreeRenderer extends Ht
         }
         boolean hasChildren = node.hasChildren(context);
 
-        ModelTree.ModelNode.Link expandCollapseLink = new ModelTree.ModelNode.Link();
         // check to see if this node needs to be expanded.
         if (hasChildren && node.isExpandCollapse()) {
             String targetEntityId = null;
@@ -79,7 +78,8 @@ public class HtmlTreeRenderer extends Ht
             if (depth < targetNodeTrail.size()) {
                 targetEntityId = targetNodeTrail.get(depth);
             }
-
+            // FIXME: Using a widget model in this way is an ugly hack.
+            ModelTree.ModelNode.Link expandCollapseLink = null;
             int openDepth = node.getModelTree().getOpenDepth();
             if (depth >= openDepth && (targetEntityId == null || !targetEntityId.equals(entityId))) {
                 // Not on the trail
@@ -87,8 +87,6 @@ public class HtmlTreeRenderer extends Ht
                     context.put("processChildren", Boolean.FALSE);
                     //expandCollapseLink.setText("&nbsp;+&nbsp;");
                     currentNodeTrailPiped = StringUtil.join(currentNodeTrail, "|");
-                    expandCollapseLink.setStyle("collapsed");
-                    expandCollapseLink.setText(" ");
                     StringBuilder target = new StringBuilder(node.getModelTree().getExpandCollapseRequest(context));
                     String trailName = node.getModelTree().getTrailName(context);
                     if (target.indexOf("?") < 0) {
@@ -97,7 +95,7 @@ public class HtmlTreeRenderer extends Ht
                         target.append("&");
                     }
                     target.append(trailName).append("=").append(currentNodeTrailPiped);
-                    expandCollapseLink.setTarget(target.toString());
+                    expandCollapseLink = new ModelTree.ModelNode.Link("collapsed", target.toString(), " ");
                 }
             } else {
                 context.put("processChildren", Boolean.TRUE);
@@ -107,8 +105,6 @@ public class HtmlTreeRenderer extends Ht
                 if (currentNodeTrailPiped == null) {
                     currentNodeTrailPiped = "";
                 }
-                expandCollapseLink.setStyle("expanded");
-                expandCollapseLink.setText(" ");
                 StringBuilder target = new StringBuilder(node.getModelTree().getExpandCollapseRequest(context));
                 String trailName = node.getModelTree().getTrailName(context);
                 if (target.indexOf("?") < 0) {
@@ -117,15 +113,16 @@ public class HtmlTreeRenderer extends Ht
                     target.append("&");
                 }
                 target.append(trailName).append("=").append(currentNodeTrailPiped);
-                expandCollapseLink.setTarget(target.toString());
+                expandCollapseLink = new ModelTree.ModelNode.Link("expanded", target.toString(), " ");
                 // add it so it can be remove in renderNodeEnd
                 currentNodeTrail.add(lastContentId);
             }
-            renderLink(writer, context, expandCollapseLink);
+            if (expandCollapseLink != null) {
+                renderLink(writer, context, expandCollapseLink);
+            }
         } else if (!hasChildren) {
             context.put("processChildren", Boolean.FALSE);
-            expandCollapseLink.setStyle("leafnode");
-            expandCollapseLink.setText(" ");
+            ModelTree.ModelNode.Link expandCollapseLink = new ModelTree.ModelNode.Link("leafnode", "", " ");
             renderLink(writer, context, expandCollapseLink);
         }
     }

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java?rev=1649230&r1=1649229&r2=1649230&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java Sat Jan  3 18:40:39 2015
@@ -892,6 +892,7 @@ public abstract class ModelScreenWidget
 
         public String getText(Map<String, Object> context) {
             String text = this.textExdr.expandString(context);
+            // FIXME: Encoding should be done by the renderer, not by the model.
             UtilCodec.SimpleEncoder simpleEncoder = (UtilCodec.SimpleEncoder) context.get("simpleEncoder");
             if (simpleEncoder != null) {
                 text = simpleEncoder.encode(text);
@@ -1469,6 +1470,7 @@ public abstract class ModelScreenWidget
 
         public String getText(Map<String, Object> context) {
             String text = this.textExdr.expandString(context);
+            // FIXME: Encoding should be done by the renderer, not by the model.
             UtilCodec.SimpleEncoder simpleEncoder = (UtilCodec.SimpleEncoder) context.get("simpleEncoder");
             if (simpleEncoder != null) {
                 text = simpleEncoder.encode(text);
@@ -1631,6 +1633,7 @@ public abstract class ModelScreenWidget
 
         public String getAlt(Map<String, Object> context) {
             String alt = this.alt.expandString(context);
+            // FIXME: Encoding should be done by the renderer, not by the model.
             UtilCodec.SimpleEncoder simpleEncoder = (UtilCodec.SimpleEncoder) context.get("simpleEncoder");
             if (simpleEncoder != null) {
                 alt = simpleEncoder.encode(alt);

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/MacroTreeRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/MacroTreeRenderer.java?rev=1649230&r1=1649229&r2=1649230&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/MacroTreeRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/MacroTreeRenderer.java Sat Jan  3 18:40:39 2015
@@ -162,9 +162,10 @@ public class MacroTreeRenderer implement
         }
         boolean hasChildren = node.hasChildren(context);
 
-        ModelTree.ModelNode.Link expandCollapseLink = new ModelTree.ModelNode.Link();
         // check to see if this node needs to be expanded.
         if (hasChildren && node.isExpandCollapse()) {
+            // FIXME: Using a widget model in this way is an ugly hack.
+            ModelTree.ModelNode.Link expandCollapseLink = null;
             String targetEntityId = null;
             List<String> targetNodeTrail = UtilGenerics.toList(context.get("targetNodeTrail"));
             if (depth < targetNodeTrail.size()) {
@@ -178,7 +179,6 @@ public class MacroTreeRenderer implement
                     context.put("processChildren", Boolean.FALSE);
                     //expandCollapseLink.setText("&nbsp;+&nbsp;");
                     currentNodeTrailPiped = StringUtil.join(currentNodeTrail, "|");
-                    expandCollapseLink.setStyle("collapsed");
                     StringBuilder target = new StringBuilder(node.getModelTree().getExpandCollapseRequest(context));
                     String trailName = node.getModelTree().getTrailName(context);
                     if (target.indexOf("?") < 0) {
@@ -187,7 +187,7 @@ public class MacroTreeRenderer implement
                         target.append("&");
                     }
                     target.append(trailName).append("=").append(currentNodeTrailPiped);
-                    expandCollapseLink.setTarget(target.toString());
+                    expandCollapseLink = new ModelTree.ModelNode.Link("collapsed", target.toString(), " ");
                 }
             } else {
                 context.put("processChildren", Boolean.TRUE);
@@ -197,7 +197,6 @@ public class MacroTreeRenderer implement
                 if (currentNodeTrailPiped == null) {
                     currentNodeTrailPiped = "";
                 }
-                expandCollapseLink.setStyle("expanded");
                 StringBuilder target = new StringBuilder(node.getModelTree().getExpandCollapseRequest(context));
                 String trailName = node.getModelTree().getTrailName(context);
                 if (target.indexOf("?") < 0) {
@@ -206,14 +205,16 @@ public class MacroTreeRenderer implement
                     target.append("&");
                 }
                 target.append(trailName).append("=").append(currentNodeTrailPiped);
-                expandCollapseLink.setTarget(target.toString());
+                expandCollapseLink = new ModelTree.ModelNode.Link("expanded", target.toString(), " ");
                 // add it so it can be remove in renderNodeEnd
                 currentNodeTrail.add(lastContentId);
             }
-            renderLink(writer, context, expandCollapseLink);
+            if (expandCollapseLink != null) {
+                renderLink(writer, context, expandCollapseLink);
+            }
         } else if (!hasChildren) {
             context.put("processChildren", Boolean.FALSE);
-            expandCollapseLink.setStyle("leafnode");
+            ModelTree.ModelNode.Link expandCollapseLink = new ModelTree.ModelNode.Link("leafnode", "", " ");
             renderLink(writer, context, expandCollapseLink);
         }
     }

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTree.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTree.java?rev=1649230&r1=1649229&r2=1649230&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTree.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTree.java Sat Jan  3 18:40:39 2015
@@ -36,7 +36,6 @@ import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.GeneralException;
 import org.ofbiz.base.util.StringUtil;
 import org.ofbiz.base.util.UtilCodec;
-import org.ofbiz.base.util.UtilFormatOut;
 import org.ofbiz.base.util.UtilGenerics;
 import org.ofbiz.base.util.UtilHttp;
 import org.ofbiz.base.util.UtilValidate;
@@ -54,6 +53,7 @@ import org.ofbiz.widget.ModelWidget;
 import org.ofbiz.widget.ModelWidgetAction;
 import org.ofbiz.widget.ModelWidgetVisitor;
 import org.ofbiz.widget.WidgetWorker;
+import org.ofbiz.widget.WidgetWorker.Parameter;
 import org.ofbiz.widget.screen.ModelScreen;
 import org.ofbiz.widget.screen.ScreenFactory;
 import org.ofbiz.widget.screen.ScreenRenderException;
@@ -90,17 +90,17 @@ public class ModelTree extends ModelWidg
         super(treeElement);
         this.location = location;
         this.rootNodeName = treeElement.getAttribute("root-node-name");
-        String defaultRenderStyle = UtilFormatOut.checkEmpty(treeElement.getAttribute("default-render-style"), "simple");
+        String defaultRenderStyle = UtilXml.checkEmpty(treeElement.getAttribute("default-render-style"), "simple");
         // A temporary hack to accommodate those who might still be using "render-style" instead of "default-render-style"
-        if (UtilValidate.isEmpty(defaultRenderStyle) || defaultRenderStyle.equals("simple")) {
+        if (defaultRenderStyle.isEmpty() || defaultRenderStyle.equals("simple")) {
             String rStyle = treeElement.getAttribute("render-style");
-            if (UtilValidate.isNotEmpty(rStyle))
+            if (!rStyle.isEmpty())
                 defaultRenderStyle = rStyle;
         }
         this.defaultRenderStyle = defaultRenderStyle;
         this.defaultWrapStyleExdr = FlexibleStringExpander.getInstance(treeElement.getAttribute("default-wrap-style"));
         this.expandCollapseRequestExdr = FlexibleStringExpander.getInstance(treeElement.getAttribute("expand-collapse-request"));
-        this.trailNameExdr = FlexibleStringExpander.getInstance(UtilFormatOut.checkEmpty(treeElement.getAttribute("trail-name"),
+        this.trailNameExdr = FlexibleStringExpander.getInstance(UtilXml.checkEmpty(treeElement.getAttribute("trail-name"),
                 "trail"));
         this.forceChildCheck = !"false".equals(treeElement.getAttribute("force-child-check"));
         this.defaultEntityName = treeElement.getAttribute("entity-name");
@@ -151,6 +151,15 @@ public class ModelTree extends ModelWidg
         return this.defaultEntityName;
     }
 
+    public String getDefaultPkName(Map<String, Object> context) {
+        ModelEntity modelEntity = WidgetWorker.getDelegator(context).getModelEntity(this.defaultEntityName);
+        if (modelEntity.getPksSize() == 1) {
+            ModelField modelField = modelEntity.getOnlyPk();
+            return modelField.getName();
+        }
+        return null;
+    }
+
     public String getExpandCollapseRequest(Map<String, Object> context) {
         String expColReq = this.expandCollapseRequestExdr.expandString(context);
         if (UtilValidate.isEmpty(expColReq)) {
@@ -252,34 +261,23 @@ public class ModelTree extends ModelWidg
         }
     }
 
-    public String getDefaultPkName(Map<String, Object> context) {
-        ModelEntity modelEntity = WidgetWorker.getDelegator(context).getModelEntity(this.defaultEntityName);
-        if (modelEntity.getPksSize() == 1) {
-            ModelField modelField = modelEntity.getOnlyPk();
-            return modelField.getName();
-        }
-        return null;
-    }
-
     public static class ModelNode extends ModelWidget {
 
         private final List<ModelWidgetAction> actions;
-        protected ModelTreeCondition condition;
-        protected String entityName;
-        protected String entryName;
-        protected String expandCollapseStyle;
-        protected Image image;
-        protected Label label;
-        protected Link link;
-        protected ModelTree modelTree;
-        protected String pkName;
-        protected String renderStyle;
-        protected FlexibleStringExpander screenLocationExdr;
-        protected FlexibleStringExpander screenNameExdr;
-        protected String shareScope;
-        protected List<ModelSubNode> subNodeList = new ArrayList<ModelSubNode>();
-        protected List<Object[]> subNodeValues;
-        protected FlexibleStringExpander wrapStyleExdr;
+        private final ModelTreeCondition condition;
+        private final String entityName;
+        private final String entryName;
+        private final String expandCollapseStyle;
+        private final Label label;
+        private final Link link;
+        private final ModelTree modelTree;
+        private final String pkName;
+        private final String renderStyle;
+        private final FlexibleStringExpander screenLocationExdr;
+        private final FlexibleStringExpander screenNameExdr;
+        private final String shareScope;
+        private final List<ModelSubNode> subNodeList;
+        private final FlexibleStringExpander wrapStyleExdr;
 
         public ModelNode(Element nodeElement, ModelTree modelTree) {
             super(nodeElement);
@@ -287,15 +285,15 @@ public class ModelTree extends ModelWidg
             this.expandCollapseStyle = nodeElement.getAttribute("expand-collapse-style");
             this.wrapStyleExdr = FlexibleStringExpander.getInstance(nodeElement.getAttribute("wrap-style"));
             this.renderStyle = nodeElement.getAttribute("render-style");
-            this.entryName = UtilFormatOut.checkEmpty(nodeElement.getAttribute("entry-name"), null);
+            this.entryName = nodeElement.getAttribute("entry-name");
             this.entityName = nodeElement.getAttribute("entity-name");
-            if (this.pkName == null || nodeElement.hasAttribute("join-field-name"))
-                this.pkName = nodeElement.getAttribute("join-field-name");
+            this.pkName = nodeElement.getAttribute("join-field-name");
             ArrayList<ModelWidgetAction> actions = new ArrayList<ModelWidgetAction>();
             Element actionsElement = UtilXml.firstChildElement(nodeElement, "actions");
             if (actionsElement != null) {
                 actions.addAll(ModelTreeAction.readNodeActions(this, actionsElement));
             }
+            // FIXME: Validate child elements, should be only one of entity-one, service, script.
             Element actionElement = UtilXml.firstChildElement(nodeElement, "entity-one");
             if (actionElement != null) {
                 actions.add(new ModelWidgetAction.EntityOne(this, actionElement));
@@ -315,26 +313,39 @@ public class ModelTree extends ModelWidg
                 this.screenNameExdr = FlexibleStringExpander.getInstance(screenElement.getAttribute("name"));
                 this.screenLocationExdr = FlexibleStringExpander.getInstance(screenElement.getAttribute("location"));
                 this.shareScope = screenElement.getAttribute("share-scope");
+            } else {
+                this.screenNameExdr = FlexibleStringExpander.getInstance("");
+                this.screenLocationExdr = FlexibleStringExpander.getInstance("");
+                this.shareScope = "";
             }
             Element labelElement = UtilXml.firstChildElement(nodeElement, "label");
             if (labelElement != null) {
                 this.label = new Label(labelElement);
+            } else {
+                this.label = null;
             }
             Element linkElement = UtilXml.firstChildElement(nodeElement, "link");
             if (linkElement != null) {
                 this.link = new Link(linkElement);
-            }
-            Element imageElement = UtilXml.firstChildElement(nodeElement, "image");
-            if (imageElement != null) {
-                this.image = new Image(imageElement);
+            } else {
+                this.link = null;
             }
             Element conditionElement = UtilXml.firstChildElement(nodeElement, "condition");
             if (conditionElement != null) {
                 this.condition = new ModelTreeCondition(modelTree, conditionElement);
+            } else {
+                this.condition = null;
             }
-            for (Element subNodeElementEntry : UtilXml.childElementList(nodeElement, "sub-node")) {
-                ModelSubNode subNode = new ModelSubNode(subNodeElementEntry, this);
-                subNodeList.add(subNode);
+            List<? extends Element> nodeElements = UtilXml.childElementList(nodeElement, "sub-node");
+            if (!nodeElements.isEmpty()) {
+                List<ModelSubNode> subNodeList = new ArrayList<ModelSubNode>();
+                for (Element subNodeElementEntry : nodeElements) {
+                    ModelSubNode subNode = new ModelSubNode(subNodeElementEntry, this);
+                    subNodeList.add(subNode);
+                }
+                this.subNodeList = Collections.unmodifiableList(subNodeList);
+            } else {
+                this.subNodeList = Collections.emptyList();
             }
         }
 
@@ -343,8 +354,8 @@ public class ModelTree extends ModelWidg
             visitor.visit(this);
         }
 
-        public void getChildren(Map<String, Object> context) {
-            this.subNodeValues = new ArrayList<Object[]>();
+        private List<Object[]> getChildren(Map<String, Object> context) {
+            List<Object[]> subNodeValues = new ArrayList<Object[]>();
             for (ModelSubNode subNode : subNodeList) {
                 String nodeName = subNode.getNodeName(context);
                 ModelNode node = modelTree.nodeMap.get(nodeName);
@@ -352,13 +363,13 @@ public class ModelTree extends ModelWidg
                 //if (Debug.infoOn()) Debug.logInfo(" context.currentValue:" + context.get("currentValue"), module);
                 ModelWidgetAction.runSubActions(subNodeActions, context);
                 // List dataFound = (List)context.get("dataFound");
-                Iterator<? extends Map<String, ? extends Object>> dataIter = subNode.getListIterator();
+                Iterator<? extends Map<String, ? extends Object>> dataIter = subNode.getListIterator(context);
                 if (dataIter instanceof EntityListIterator) {
                     EntityListIterator eli = (EntityListIterator) dataIter;
                     Map<String, Object> val = null;
                     while ((val = eli.next()) != null) {
                         Object[] arr = { node, val };
-                        this.subNodeValues.add(arr);
+                        subNodeValues.add(arr);
                     }
                     try {
                         eli.close();
@@ -370,14 +381,15 @@ public class ModelTree extends ModelWidg
                     while (dataIter.hasNext()) {
                         Map<String, ? extends Object> val = dataIter.next();
                         Object[] arr = { node, val };
-                        this.subNodeValues.add(arr);
+                        subNodeValues.add(arr);
                     }
                 }
             }
+            return subNodeValues;
         }
 
         public String getEntityName() {
-            if (UtilValidate.isNotEmpty(this.entityName)) {
+            if (!this.entityName.isEmpty()) {
                 return this.entityName;
             } else {
                 return this.modelTree.getDefaultEntityName();
@@ -405,26 +417,26 @@ public class ModelTree extends ModelWidg
         }
 
         public String getRenderStyle() {
-            String rStyle = this.renderStyle;
-            if (UtilValidate.isEmpty(rStyle))
-                rStyle = modelTree.getRenderStyle();
-            return rStyle;
+            if (this.renderStyle.isEmpty())
+                return modelTree.getRenderStyle();
+            return this.renderStyle;
         }
 
         public String getWrapStyle(Map<String, Object> context) {
             String val = this.wrapStyleExdr.expandString(context);
-            if (UtilValidate.isEmpty(val)) {
+            if (val.isEmpty()) {
                 val = this.modelTree.getWrapStyle(context);
             }
             return val;
         }
 
         public boolean hasChildren(Map<String, Object> context) {
+            List<Object[]> subNodeValues = getChildren(context);
             boolean hasChildren = false;
             Long nodeCount = null;
             String countFieldName = "childBranchCount";
             Object obj = null;
-            if (UtilValidate.isNotEmpty(this.entryName)) {
+            if (!this.entryName.isEmpty()) {
                 Map<String, Object> map = UtilGenerics.cast(context.get(this.entryName));
                 if (map instanceof GenericValue) {
                     ModelEntity modelEntity = ((GenericValue) map).getModelEntity();
@@ -462,10 +474,10 @@ public class ModelTree extends ModelWidg
                     }
                 }
                 */
-                nodeCount = Long.valueOf(this.subNodeValues.size());
+                nodeCount = Long.valueOf(subNodeValues.size());
                 String pkName = this.getPkName(context);
                 String id = null;
-                if (UtilValidate.isNotEmpty(this.entryName)) {
+                if (!this.entryName.isEmpty()) {
                     id = UtilGenerics.<Map<String, String>> cast(context.get(this.entryName)).get(pkName);
                 } else {
                     id = (String) context.get(pkName);
@@ -531,7 +543,7 @@ public class ModelTree extends ModelWidg
                 ModelTreeAction.runSubActions(this.actions, context);
                 String pkName = getPkName(context);
                 String id = null;
-                if (UtilValidate.isNotEmpty(this.entryName)) {
+                if (!this.entryName.isEmpty()) {
                     id = UtilGenerics.<Map<String, String>> cast(context.get(this.entryName)).get(pkName);
                 } else {
                     id = (String) context.get(pkName);
@@ -542,10 +554,10 @@ public class ModelTree extends ModelWidg
                 // context.entrySet(), module);
                 try {
                     String screenName = null;
-                    if (screenNameExdr != null)
+                    if (!screenNameExdr.isEmpty())
                         screenName = screenNameExdr.expandString(context);
                     String screenLocation = null;
-                    if (screenLocationExdr != null)
+                    if (!screenLocationExdr.isEmpty())
                         screenLocation = screenLocationExdr.expandString(context);
                     if (screenName != null && screenLocation != null) {
                         ScreenStringRenderer screenStringRenderer = treeStringRenderer.getScreenStringRenderer(context);
@@ -562,9 +574,9 @@ public class ModelTree extends ModelWidg
                     Boolean processChildren = (Boolean) context.get("processChildren");
                     //if (Debug.infoOn()) Debug.logInfo(" processChildren:" + processChildren, module);
                     if (processChildren.booleanValue()) {
-                        getChildren(context);
+                        List<Object[]> subNodeValues = getChildren(context);
                         int newDepth = depth + 1;
-                        for (Object[] arr : this.subNodeValues) {
+                        for (Object[] arr : subNodeValues) {
                             ModelNode node = (ModelNode) arr[0];
                             Map<String, Object> val = UtilGenerics.checkMap(arr[1]);
                             //GenericPK pk = val.getPrimaryKey();
@@ -575,7 +587,7 @@ public class ModelTree extends ModelWidg
                             MapStack<String> newContext = MapStack.create(context);
                             newContext.push();
                             String nodeEntryName = node.getEntryName();
-                            if (UtilValidate.isNotEmpty(nodeEntryName)) {
+                            if (!nodeEntryName.isEmpty()) {
                                 newContext.put(nodeEntryName, val);
                             } else {
                                 newContext.putAll(val);
@@ -615,10 +627,6 @@ public class ModelTree extends ModelWidg
             }
         }
 
-        public void setPkName(String pkName) {
-            this.pkName = pkName;
-        }
-
         public boolean showPeers(int currentDepth, Map<String, Object> context) {
             int trailSize = 0;
             List<?> trail = UtilGenerics.checkList(context.get("targetNodeTrail"));
@@ -648,32 +656,23 @@ public class ModelTree extends ModelWidg
 
         public static class Image {
 
-            protected FlexibleStringExpander borderExdr;
-            protected FlexibleStringExpander heightExdr;
-            protected FlexibleStringExpander idExdr;
-            protected FlexibleStringExpander srcExdr;
-            protected FlexibleStringExpander styleExdr;
-            protected String urlMode;
-            protected FlexibleStringExpander widthExdr;
-
-            public Image() {
-                setSrc(null);
-                setId(null);
-                setStyle(null);
-                setWidth(null);
-                setHeight(null);
-                setBorder("0");
-                setUrlMode(null);
-            }
+            private final FlexibleStringExpander borderExdr;
+            private final FlexibleStringExpander heightExdr;
+            private final FlexibleStringExpander idExdr;
+            private final FlexibleStringExpander srcExdr;
+            private final FlexibleStringExpander styleExdr;
+            private final String urlMode;
+            private final FlexibleStringExpander widthExdr;
 
             public Image(Element imageElement) {
-                setSrc(imageElement.getAttribute("src"));
-                setId(imageElement.getAttribute("id"));
-                setStyle(imageElement.getAttribute("style"));
-                setWidth(imageElement.getAttribute("width"));
-                setHeight(imageElement.getAttribute("height"));
-                setBorder(UtilFormatOut.checkEmpty(imageElement.getAttribute("border"), "0"));
-                setUrlMode(UtilFormatOut.checkEmpty(imageElement.getAttribute("url-mode"), "content"));
+                this.borderExdr = FlexibleStringExpander
+                        .getInstance(UtilXml.checkEmpty(imageElement.getAttribute("border"), "0"));
+                this.heightExdr = FlexibleStringExpander.getInstance(imageElement.getAttribute("height"));
+                this.idExdr = FlexibleStringExpander.getInstance(imageElement.getAttribute("id"));
+                this.srcExdr = FlexibleStringExpander.getInstance(imageElement.getAttribute("src"));
+                this.styleExdr = FlexibleStringExpander.getInstance(imageElement.getAttribute("style"));
+                this.urlMode = UtilXml.checkEmpty(imageElement.getAttribute("url-mode"), "content");
+                this.widthExdr = FlexibleStringExpander.getInstance(imageElement.getAttribute("width"));
             }
 
             public String getBorder(Map<String, Object> context) {
@@ -713,50 +712,16 @@ public class ModelTree extends ModelWidg
                     throw new RuntimeException(errMsg);
                 }
             }
-
-            public void setBorder(String val) {
-                this.borderExdr = FlexibleStringExpander.getInstance(val);
-            }
-
-            public void setHeight(String val) {
-                this.heightExdr = FlexibleStringExpander.getInstance(val);
-            }
-
-            public void setId(String val) {
-                this.idExdr = FlexibleStringExpander.getInstance(val);
-            }
-
-            public void setSrc(String val) {
-                String textAttr = UtilFormatOut.checkNull(val);
-                this.srcExdr = FlexibleStringExpander.getInstance(textAttr);
-            }
-
-            public void setStyle(String val) {
-                this.styleExdr = FlexibleStringExpander.getInstance(val);
-            }
-
-            public void setUrlMode(String val) {
-                if (UtilValidate.isEmpty(val)) {
-                    this.urlMode = "content";
-                } else {
-                    this.urlMode = val;
-                }
-            }
-
-            public void setWidth(String val) {
-                this.widthExdr = FlexibleStringExpander.getInstance(val);
-            }
         }
 
-        public static class Label {
-            protected FlexibleStringExpander idExdr;
-            protected FlexibleStringExpander styleExdr;
-            protected FlexibleStringExpander textExdr;
+        public static final class Label {
+            private final FlexibleStringExpander idExdr;
+            private final FlexibleStringExpander styleExdr;
+            private final FlexibleStringExpander textExdr;
 
             public Label(Element labelElement) {
-                // put the text attribute first, then the pcdata under the element, if both are there of course
-                String textAttr = UtilFormatOut.checkNull(labelElement.getAttribute("text"));
-                String pcdata = UtilFormatOut.checkNull(UtilXml.elementValue(labelElement));
+                String textAttr = labelElement.getAttribute("text");
+                String pcdata = UtilXml.checkEmpty(UtilXml.elementValue(labelElement), "");
                 this.textExdr = FlexibleStringExpander.getInstance(textAttr + pcdata);
                 this.idExdr = FlexibleStringExpander.getInstance(labelElement.getAttribute("id"));
                 this.styleExdr = FlexibleStringExpander.getInstance(labelElement.getAttribute("style"));
@@ -772,6 +737,7 @@ public class ModelTree extends ModelWidg
 
             public String getText(Map<String, Object> context) {
                 String text = this.textExdr.expandString(context);
+                // FIXME: Encoding should be done by the renderer, not by the model.
                 UtilCodec.SimpleEncoder simpleEncoder = (UtilCodec.SimpleEncoder) context.get("simpleEncoder");
                 if (simpleEncoder != null) {
                     text = simpleEncoder.encode(text);
@@ -791,59 +757,71 @@ public class ModelTree extends ModelWidg
         }
 
         public static class Link {
-            protected boolean encode = false;
-            protected boolean fullPath = false;
-            protected FlexibleStringExpander idExdr;
-            protected Image image;
-            protected String linkType;
-            protected FlexibleStringExpander nameExdr;
-            protected List<WidgetWorker.Parameter> parameterList = new ArrayList<WidgetWorker.Parameter>();
-            protected FlexibleStringExpander prefixExdr;
-            protected boolean secure = false;
-            protected FlexibleStringExpander styleExdr;
-            protected FlexibleStringExpander targetExdr;
-            protected FlexibleStringExpander targetWindowExdr;
-            protected FlexibleStringExpander textExdr;
-            protected FlexibleStringExpander titleExdr;
-            protected String urlMode = "intra-app";
-
-            public Link() {
-                setText(null);
-                setId(null);
-                setStyle(null);
-                setTarget(null);
-                setTargetWindow(null);
-                setPrefix(null);
-                setUrlMode(null);
-                setFullPath(null);
-                setSecure(null);
-                setEncode(null);
-                setName(null);
-                setTitle(null);
-            }
+            private final boolean encode;
+            private final boolean fullPath;
+            private final FlexibleStringExpander idExdr;
+            private final Image image;
+            private final String linkType;
+            private final FlexibleStringExpander nameExdr;
+            private final List<Parameter> parameterList;
+            private final FlexibleStringExpander prefixExdr;
+            private final boolean secure;
+            private final FlexibleStringExpander styleExdr;
+            private final FlexibleStringExpander targetExdr;
+            private final FlexibleStringExpander targetWindowExdr;
+            private final FlexibleStringExpander textExdr;
+            private final FlexibleStringExpander titleExdr;
+            private final String urlMode;
 
             public Link(Element linkElement) {
-                setText(linkElement.getAttribute("text"));
-                setId(linkElement.getAttribute("id"));
-                setStyle(linkElement.getAttribute("style"));
-                setTarget(linkElement.getAttribute("target"));
-                setTargetWindow(linkElement.getAttribute("target-window"));
-                setPrefix(linkElement.getAttribute("prefix"));
-                setUrlMode(linkElement.getAttribute("url-mode"));
-                setFullPath(linkElement.getAttribute("full-path"));
-                setSecure(linkElement.getAttribute("secure"));
-                setEncode(linkElement.getAttribute("encode"));
-                setName(linkElement.getAttribute("name"));
-                setTitle(linkElement.getAttribute("title"));
+                this.encode = "true".equals(linkElement.getAttribute("encode"));
+                this.fullPath = "true".equals(linkElement.getAttribute("full-path"));
+                this.idExdr = FlexibleStringExpander.getInstance(linkElement.getAttribute("id"));
                 Element imageElement = UtilXml.firstChildElement(linkElement, "image");
                 if (imageElement != null) {
                     this.image = new Image(imageElement);
+                } else {
+                    this.image = null;
                 }
                 this.linkType = linkElement.getAttribute("link-type");
+                this.nameExdr = FlexibleStringExpander.getInstance(linkElement.getAttribute("name"));
                 List<? extends Element> parameterElementList = UtilXml.childElementList(linkElement, "parameter");
-                for (Element parameterElement : parameterElementList) {
-                    this.parameterList.add(new WidgetWorker.Parameter(parameterElement));
+                if (!parameterElementList.isEmpty()) {
+                    List<Parameter> parameterList = new ArrayList<Parameter>(parameterElementList.size());
+                    for (Element parameterElement : parameterElementList) {
+                        parameterList.add(new Parameter(parameterElement));
+                    }
+                    this.parameterList = Collections.unmodifiableList(parameterList);
+                } else {
+                    this.parameterList = Collections.emptyList();
                 }
+                this.prefixExdr = FlexibleStringExpander.getInstance(linkElement.getAttribute("prefix"));
+                this.secure = "true".equals(linkElement.getAttribute("secure"));
+                this.styleExdr = FlexibleStringExpander.getInstance(linkElement.getAttribute("style"));
+                this.targetExdr = FlexibleStringExpander.getInstance(linkElement.getAttribute("target"));
+                this.targetWindowExdr = FlexibleStringExpander.getInstance(linkElement.getAttribute("target-window"));
+                this.textExdr = FlexibleStringExpander.getInstance(linkElement.getAttribute("text"));
+                this.titleExdr = FlexibleStringExpander.getInstance(linkElement.getAttribute("title"));
+                this.urlMode = UtilXml.checkEmpty(linkElement.getAttribute("link-type"), "intra-app");
+            }
+
+            // FIXME: Using a widget model in this way is an ugly hack.
+            public Link(String style, String target, String text) {
+                this.encode = false;
+                this.fullPath = false;
+                this.idExdr = FlexibleStringExpander.getInstance("");
+                this.image = null;
+                this.linkType = "";
+                this.nameExdr = FlexibleStringExpander.getInstance("");
+                this.parameterList = Collections.emptyList();
+                this.prefixExdr = FlexibleStringExpander.getInstance("");
+                this.secure = false;
+                this.styleExdr = FlexibleStringExpander.getInstance(style);
+                this.targetExdr = FlexibleStringExpander.getInstance(target);
+                this.targetWindowExdr = FlexibleStringExpander.getInstance("");
+                this.textExdr = FlexibleStringExpander.getInstance(text);
+                this.titleExdr = FlexibleStringExpander.getInstance("");
+                this.urlMode = "intra-app";
             }
 
             public boolean getEncode() {
@@ -912,6 +890,7 @@ public class ModelTree extends ModelWidg
 
             public String getText(Map<String, Object> context) {
                 String text = this.textExdr.expandString(context);
+                // FIXME: Encoding should be done by the renderer, not by the model.
                 UtilCodec.SimpleEncoder simpleEncoder = (UtilCodec.SimpleEncoder) context.get("simpleEncoder");
                 if (simpleEncoder != null) {
                     text = simpleEncoder.encode(text);
@@ -921,6 +900,7 @@ public class ModelTree extends ModelWidg
 
             public String getTitle(Map<String, Object> context) {
                 String title = this.titleExdr.expandString(context);
+                // FIXME: Encoding should be done by the renderer, not by the model.
                 UtilCodec.SimpleEncoder simpleEncoder = (UtilCodec.SimpleEncoder) context.get("simpleEncoder");
                 if (simpleEncoder != null) {
                     title = simpleEncoder.encode(title);
@@ -941,81 +921,14 @@ public class ModelTree extends ModelWidg
                     throw new RuntimeException(errMsg);
                 }
             }
-
-            public void setEncode(String val) {
-                String sEncode = val;
-                if (sEncode != null && sEncode.equalsIgnoreCase("true"))
-                    this.encode = true;
-                else
-                    this.encode = false;
-            }
-
-            public void setFullPath(String val) {
-                String sFullPath = val;
-                if (sFullPath != null && sFullPath.equalsIgnoreCase("true"))
-                    this.fullPath = true;
-                else
-                    this.fullPath = false;
-            }
-
-            public void setId(String val) {
-                this.idExdr = FlexibleStringExpander.getInstance(val);
-            }
-
-            public void setImage(Image img) {
-                this.image = img;
-            }
-
-            public void setName(String val) {
-                this.nameExdr = FlexibleStringExpander.getInstance(val);
-            }
-
-            public void setPrefix(String val) {
-                this.prefixExdr = FlexibleStringExpander.getInstance(val);
-            }
-
-            public void setSecure(String val) {
-                String sSecure = val;
-                if (sSecure != null && sSecure.equalsIgnoreCase("true"))
-                    this.secure = true;
-                else
-                    this.secure = false;
-            }
-
-            public void setStyle(String val) {
-                this.styleExdr = FlexibleStringExpander.getInstance(val);
-            }
-
-            public void setTarget(String val) {
-                this.targetExdr = FlexibleStringExpander.getInstance(val);
-            }
-
-            public void setTargetWindow(String val) {
-                this.targetWindowExdr = FlexibleStringExpander.getInstance(val);
-            }
-
-            public void setText(String val) {
-                String textAttr = UtilFormatOut.checkNull(val);
-                this.textExdr = FlexibleStringExpander.getInstance(textAttr);
-            }
-
-            public void setTitle(String val) {
-                this.titleExdr = FlexibleStringExpander.getInstance(val);
-            }
-
-            public void setUrlMode(String val) {
-                if (UtilValidate.isNotEmpty(val))
-                    this.urlMode = val;
-            }
-
         }
 
         public static class ModelSubNode extends ModelWidget {
 
             private final List<ModelWidgetAction> actions;
-            protected ListIterator<? extends Map<String, ? extends Object>> listIterator;
-            protected FlexibleStringExpander nodeNameExdr;
-            protected ModelNode rootNode;
+            private final FlexibleStringExpander nodeNameExdr;
+            private final ModelNode rootNode;
+            private final String iteratorKey;
 
             public ModelSubNode(Element subNodeElement, ModelNode modelNode) {
                 super(subNodeElement);
@@ -1044,6 +957,8 @@ public class ModelTree extends ModelWidg
                 }
                 actions.trimToSize();
                 this.actions = Collections.unmodifiableList(actions);
+                this.iteratorKey = this.rootNode.getName().concat(".").concat(this.nodeNameExdr.getOriginal())
+                        .concat(".ITERATOR");
             }
 
             @Override
@@ -1055,8 +970,9 @@ public class ModelTree extends ModelWidg
                 return actions;
             }
 
-            public ListIterator<? extends Map<String, ? extends Object>> getListIterator() {
-                return listIterator;
+            @SuppressWarnings("unchecked")
+            public ListIterator<? extends Map<String, ? extends Object>> getListIterator(Map<String, Object> context) {
+                return (ListIterator<? extends Map<String, ? extends Object>>) context.get(this.iteratorKey);
             }
 
             public ModelTree.ModelNode getNode() {
@@ -1067,8 +983,8 @@ public class ModelTree extends ModelWidg
                 return this.nodeNameExdr.expandString(context);
             }
 
-            public void setListIterator(ListIterator<? extends Map<String, ? extends Object>> iter) {
-                listIterator = iter;
+            public void setListIterator(ListIterator<? extends Map<String, ? extends Object>> iter, Map<String, Object> context) {
+                context.put(this.iteratorKey, iter);
             }
         }
     }

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTreeAction.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTreeAction.java?rev=1649230&r1=1649229&r2=1649230&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTreeAction.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTreeAction.java Sat Jan  3 18:40:39 2015
@@ -122,11 +122,11 @@ public abstract class ModelTreeAction ex
             if (this.modelSubNode != null) {
                 if (obj != null && (obj instanceof EntityListIterator || obj instanceof ListIterator<?>)) {
                     ListIterator<? extends Map<String, ? extends Object>> listIt = UtilGenerics.cast(obj);
-                    this.modelSubNode.setListIterator(listIt);
+                    this.modelSubNode.setListIterator(listIt, context);
                 } else {
                     if (obj instanceof List<?>) {
                         List<? extends Map<String, ? extends Object>> list = UtilGenerics.checkList(obj);
-                        this.modelSubNode.setListIterator(list.listIterator());
+                        this.modelSubNode.setListIterator(list.listIterator(), context);
                     }
                 }
             }
@@ -225,9 +225,9 @@ public abstract class ModelTreeAction ex
                         if (lst != null) {
                             if (lst instanceof ListIterator<?>) {
                                 ListIterator<? extends Map<String, ? extends Object>> listIt = UtilGenerics.cast(lst);
-                                this.modelSubNode.setListIterator(listIt);
+                                this.modelSubNode.setListIterator(listIt, context);
                             } else {
-                                this.modelSubNode.setListIterator(lst.listIterator());
+                                this.modelSubNode.setListIterator(lst.listIterator(), context);
                             }
                         }
                     }
@@ -279,11 +279,11 @@ public abstract class ModelTreeAction ex
                 Object obj = context.get(this.listName);
                 if (obj != null && (obj instanceof EntityListIterator || obj instanceof ListIterator<?>)) {
                     ListIterator<? extends Map<String, ? extends Object>> listIt = UtilGenerics.cast(obj);
-                    this.modelSubNode.setListIterator(listIt);
+                    this.modelSubNode.setListIterator(listIt, context);
                 } else {
                     if (obj instanceof List<?>) {
                         List<? extends Map<String, ? extends Object>> list = UtilGenerics.checkList(obj);
-                        this.modelSubNode.setListIterator(list.listIterator());
+                        this.modelSubNode.setListIterator(list.listIterator(), context);
                     }
                 }
             } catch (GeneralException e) {
@@ -324,11 +324,11 @@ public abstract class ModelTreeAction ex
                 Object obj = context.get(this.listName);
                 if (obj != null && (obj instanceof EntityListIterator || obj instanceof ListIterator<?>)) {
                     ListIterator<? extends Map<String, ? extends Object>> listIt = UtilGenerics.cast(obj);
-                    this.modelSubNode.setListIterator(listIt);
+                    this.modelSubNode.setListIterator(listIt, context);
                 } else {
                     if (obj instanceof List<?>) {
                         List<? extends Map<String, ? extends Object>> list = UtilGenerics.cast(obj);
-                        this.modelSubNode.setListIterator(list.listIterator());
+                        this.modelSubNode.setListIterator(list.listIterator(), context);
                     }
                 }
             } catch (GeneralException e) {