diff flys-artifacts/src/main/java/de/intevation/flys/collections/AttributeWriter.java @ 1639:12235a2ace21

Add positional-conflict-awareness when merging Facets in attribute of a collection. Apply "first come first serve"-rule. flys-artifacts/trunk@2824 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Mon, 26 Sep 2011 13:17:55 +0000
parents 1b5204203e18
children f643ea084213
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/collections/AttributeWriter.java	Mon Sep 26 13:10:40 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/collections/AttributeWriter.java	Mon Sep 26 13:17:55 2011 +0000
@@ -1,5 +1,6 @@
 package de.intevation.flys.collections;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -129,11 +130,42 @@
 
         // Add all new Facets either in their old state or (if really
         // new) as they are.
+        List<ManagedFacet> currentFacets      = new ArrayList<ManagedFacet>();
+        List<ManagedFacet> genuinelyNewFacets = new ArrayList<ManagedFacet>();
         for (int i = 0; i < num; i++) {
             ManagedFacet facet = (ManagedFacet) newFacets.get(i);
 
             ManagedFacet picked = pickFacet(facet, oldFacets);
-            Node         node   = picked.toXML(doc);
+            if (facet.equals(picked)) {
+                genuinelyNewFacets.add(picked);
+            }
+            else {
+                currentFacets.add(picked);
+            }
+        }
+
+        // For each genuinely new Facet check positional conflicts.
+        for (ManagedFacet newMF: genuinelyNewFacets) {
+            boolean conflicts = true;
+            // Loop until all conflicts resolved.
+            while (conflicts) {
+                conflicts = false;
+                for (ManagedFacet oldMF: currentFacets) {
+                    if (newMF.getPosition() == oldMF.getPosition()) {
+                        conflicts = true;
+                        logger.debug("Positional conflict while merging " +
+                            "facets, pushing newest facet 1 up ("+newMF.getPosition()+")");
+                        newMF.setPosition(newMF.getPosition() + 1);
+                        break;
+                    }
+                }
+            }
+            currentFacets.add(newMF);
+        }
+
+        // Now add all facets.
+        for (ManagedFacet oldMF: currentFacets) {
+            Node node = oldMF.toXML(doc);
             if (node != null) {
                 output.appendChild(node);
             }

http://dive4elements.wald.intevation.org