comparison 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
comparison
equal deleted inserted replaced
1638:f45bbc80bd3d 1639:12235a2ace21
1 package de.intevation.flys.collections; 1 package de.intevation.flys.collections;
2 2
3 import java.util.ArrayList;
3 import java.util.List; 4 import java.util.List;
4 import java.util.Map; 5 import java.util.Map;
5 6
6 import org.apache.log4j.Logger; 7 import org.apache.log4j.Logger;
7 8
127 { 128 {
128 int num = newFacets.size(); 129 int num = newFacets.size();
129 130
130 // Add all new Facets either in their old state or (if really 131 // Add all new Facets either in their old state or (if really
131 // new) as they are. 132 // new) as they are.
133 List<ManagedFacet> currentFacets = new ArrayList<ManagedFacet>();
134 List<ManagedFacet> genuinelyNewFacets = new ArrayList<ManagedFacet>();
132 for (int i = 0; i < num; i++) { 135 for (int i = 0; i < num; i++) {
133 ManagedFacet facet = (ManagedFacet) newFacets.get(i); 136 ManagedFacet facet = (ManagedFacet) newFacets.get(i);
134 137
135 ManagedFacet picked = pickFacet(facet, oldFacets); 138 ManagedFacet picked = pickFacet(facet, oldFacets);
136 Node node = picked.toXML(doc); 139 if (facet.equals(picked)) {
140 genuinelyNewFacets.add(picked);
141 }
142 else {
143 currentFacets.add(picked);
144 }
145 }
146
147 // For each genuinely new Facet check positional conflicts.
148 for (ManagedFacet newMF: genuinelyNewFacets) {
149 boolean conflicts = true;
150 // Loop until all conflicts resolved.
151 while (conflicts) {
152 conflicts = false;
153 for (ManagedFacet oldMF: currentFacets) {
154 if (newMF.getPosition() == oldMF.getPosition()) {
155 conflicts = true;
156 logger.debug("Positional conflict while merging " +
157 "facets, pushing newest facet 1 up ("+newMF.getPosition()+")");
158 newMF.setPosition(newMF.getPosition() + 1);
159 break;
160 }
161 }
162 }
163 currentFacets.add(newMF);
164 }
165
166 // Now add all facets.
167 for (ManagedFacet oldMF: currentFacets) {
168 Node node = oldMF.toXML(doc);
137 if (node != null) { 169 if (node != null) {
138 output.appendChild(node); 170 output.appendChild(node);
139 } 171 }
140 } 172 }
141 } 173 }

http://dive4elements.wald.intevation.org