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