Author: pgil
Date: Sun Aug  5 09:18:20 2018
New Revision: 1837460

URL: http://svn.apache.org/viewvc?rev=1837460&view=rev
Log:
Improved : Use the stream API in FormRenderer
(OFBIZ-10505)

Thanks Mathieu for the patches

Modified:
    
ofbiz/ofbiz-framework/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/FormRenderer.java

Modified: 
ofbiz/ofbiz-framework/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/FormRenderer.java
URL: 
http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/FormRenderer.java?rev=1837460&r1=1837459&r2=1837460&view=diff
==============================================================================
--- 
ofbiz/ofbiz-framework/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/FormRenderer.java
 (original)
+++ 
ofbiz/ofbiz-framework/trunk/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/FormRenderer.java
 Sun Aug  5 09:18:20 2018
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -31,6 +32,8 @@ import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
+import java.util.function.Predicate;
+import java.util.stream.Collector;
 import java.util.stream.Collectors;
 
 import org.apache.ofbiz.base.util.Debug;
@@ -116,30 +119,16 @@ public class FormRenderer {
         this.focusFieldName = modelForm.getFocusFieldName();
     }
 
-    // Return a sorted collection of lists ordered by ascending position;
-    // each list contains all the fields with that position.
-    private Collection<List<ModelFormField>> 
getFieldListsByPosition(List<ModelFormField> modelFormFieldList) {
-        // The ordering of the returned collection is guaranteed by using 
`TreeMap`.
-        return modelFormFieldList.stream()
-                .collect(Collectors.groupingBy(ModelFormField::getPosition, 
TreeMap::new, Collectors.toList()))
-                .values();
-    }
+    // The ordering of the returned collection is guaranteed by using 
`TreeMap`.
+    private static Collector<ModelFormField, ?, Map<Integer, 
List<ModelFormField>>> groupingByPosition =
+            Collectors.groupingBy(ModelFormField::getPosition, TreeMap::new, 
Collectors.toList());
 
     public String getFocusFieldName() {
         return focusFieldName;
     }
 
-    private List<ModelFormField> getHiddenIgnoredFields(Map<String, Object> 
context, Set<String> alreadyRendered,
-            List<ModelFormField> fieldList, int position) {
-        /*
-         * Method does not reference internal state - should be moved to 
another class.
-         */
-        List<ModelFormField> hiddenIgnoredFieldList = new LinkedList<>();
-        for (ModelFormField modelFormField : fieldList) {
-            // with position == -1 then gets all the hidden fields
-            if (position != -1 && modelFormField.getPosition() != position) {
-                continue;
-            }
+    private static Predicate<ModelFormField> 
filteringIgnoredFields(Map<String, Object> context, Set<String> 
alreadyRendered) {
+       return  modelFormField -> {
             FieldInfo fieldInfo = modelFormField.getFieldInfo();
 
             // render hidden/ignored field widget
@@ -147,10 +136,10 @@ public class FormRenderer {
             case FieldInfo.HIDDEN:
             case FieldInfo.IGNORED:
                 if (modelFormField.shouldUse(context)) {
-                    hiddenIgnoredFieldList.add(modelFormField);
                     if (alreadyRendered != null) {
                         alreadyRendered.add(modelFormField.getName());
                     }
+                    return true;
                 }
                 break;
 
@@ -158,24 +147,33 @@ public class FormRenderer {
             case FieldInfo.DISPLAY_ENTITY:
                 ModelFormField.DisplayField displayField = 
(ModelFormField.DisplayField) fieldInfo;
                 if (displayField.getAlsoHidden() && 
modelFormField.shouldUse(context)) {
-                    hiddenIgnoredFieldList.add(modelFormField);
-                    // don't add to already rendered here, or the display 
won't ger rendered: if (alreadyRendered != null) 
alreadyRendered.add(modelFormField.getName());
+                    // don't add to already rendered here, or the display 
won't get rendered.
+                    return true;
                 }
                 break;
 
             case FieldInfo.HYPERLINK:
                 ModelFormField.HyperlinkField hyperlinkField = 
(ModelFormField.HyperlinkField) fieldInfo;
                 if (hyperlinkField.getAlsoHidden() && 
modelFormField.shouldUse(context)) {
-                    hiddenIgnoredFieldList.add(modelFormField);
-                    // don't add to already rendered here, or the hyperlink 
won't ger rendered: if (alreadyRendered != null) 
alreadyRendered.add(modelFormField.getName());
+                    // don't add to already rendered here, or the hyperlink 
won't get rendered.
+                    return true;
                 }
                 break;
 
             default:
                 break;
             }
-        }
-        return hiddenIgnoredFieldList;
+            return false;
+        };
+    }
+
+    private static List<ModelFormField> getHiddenIgnoredFields(Map<String, 
Object> context, Set<String> alreadyRendered,
+            List<ModelFormField> fields, int position) {
+        return fields.stream()
+                // with position == -1 then gets all the hidden fields
+                .filter(modelFormField -> position == -1 || 
modelFormField.getPosition() == position)
+                .filter(filteringIgnoredFields(context, alreadyRendered))
+                .collect(Collectors.toList());
     }
 
     private List<FieldGroupBase> getInbetweenList(FieldGroup startFieldGroup, 
FieldGroup endFieldGroup) {
@@ -279,6 +277,12 @@ public class FormRenderer {
         }
     }
 
+    // Return a stateful predicate that satisfies only the first time a field 
name is encountered.
+    static private Predicate<ModelFormField> filteringDuplicateNames() {
+        Set<String> seenFieldNames = new HashSet<>();
+        return field -> seenFieldNames.add(field.getName());
+    }
+
     private int renderHeaderRow(Appendable writer, Map<String, Object> context)
             throws IOException {
         int maxNumOfColumns = 0;
@@ -287,24 +291,17 @@ public class FormRenderer {
         // in this model: we can have more fields with the same name when 
use-when
         // conditions are used or when a form is extended or when the fields 
are
         // automatically retrieved by a service or entity definition.
-        List<ModelFormField> tempFieldList = new LinkedList<>();
-        tempFieldList.addAll(modelForm.getFieldList());
-        for (int j = 0; j < tempFieldList.size(); j++) {
-            ModelFormField modelFormField = tempFieldList.get(j);
-            for (int i = j + 1; i < tempFieldList.size(); i++) {
-                ModelFormField curField = tempFieldList.get(i);
-                if (curField.getName() != null && 
curField.getName().equals(modelFormField.getName())) {
-                    tempFieldList.remove(i--);
-                }
-            }
-        }
+        Collection<List<ModelFormField>> fieldListsByPosition = 
modelForm.getFieldList().stream()
+                .filter(filteringDuplicateNames())
+                .collect(groupingByPosition)
+                .values();
 
         // ===========================
         // Preprocessing
         // ===========================
         // `fieldRowsByPosition` will contain maps containing the list of 
fields for a position
         List<Map<String, List<ModelFormField>>> fieldRowsByPosition = new 
LinkedList<>();
-        for (List<ModelFormField> mainFieldList : 
getFieldListsByPosition(tempFieldList)) {
+        for (List<ModelFormField> mainFieldList : fieldListsByPosition) {
             int numOfColumns = 0;
 
             List<ModelFormField> innerDisplayHyperlinkFieldsBegin = new 
LinkedList<>();
@@ -791,7 +788,11 @@ public class FormRenderer {
                 // it contains the fields that are in the list header 
(columns).
                 // The positions lower than 1 are rendered in rows before the 
main one;
                 // positions higher than 1 are rendered after the main one.
-                for (List<ModelFormField> fieldListByPosition : 
getFieldListsByPosition(tempFieldList)) {
+                Collection<List<ModelFormField>> fieldListsByPosition = 
tempFieldList.stream()
+                        .collect(groupingByPosition)
+                        .values();
+
+                for (List<ModelFormField> fieldListByPosition : 
fieldListsByPosition) {
                     // For each position (the subset of fields with the same 
position attribute)
                     // we have two phases: preprocessing and rendering
 
@@ -1015,7 +1016,8 @@ public class FormRenderer {
         }
 
         // render all hidden & ignored fields
-        List<ModelFormField> hiddenIgnoredFieldList = 
this.getHiddenIgnoredFields(context, alreadyRendered, tempFieldList, -1);
+        List<ModelFormField> hiddenIgnoredFieldList =
+        getHiddenIgnoredFields(context, alreadyRendered, tempFieldList, -1);
         this.renderHiddenIgnoredFields(writer, context, formStringRenderer, 
hiddenIgnoredFieldList);
 
         // render formatting wrapper open


Reply via email to