# HG changeset patch # User Ingo Weinzierl # Date 1311333480 0 # Node ID d0c9a5f32c30febeeb0a3ebf8f967d26e5efdfed # Parent e456aca4eb7bfd6d02ccfab19ff08888ec9a134d Prepared the FLYSArtifactCollection to support the storage of already loaded recommendations. flys-artifacts/trunk@2396 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r e456aca4eb7b -r d0c9a5f32c30 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Fri Jul 22 10:41:30 2011 +0000 +++ b/flys-artifacts/ChangeLog Fri Jul 22 11:18:00 2011 +0000 @@ -1,3 +1,9 @@ +2011-07-22 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Prepared the FLYSArtifactCollection to support the storage of already + loaded recommendations in its attribute document. + 2011-07-21 Sascha L. Teichmann * src/main/java/de/intevation/flys/artifacts/services/MetaDataService.java: diff -r e456aca4eb7b -r d0c9a5f32c30 flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java --- a/flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java Fri Jul 22 10:41:30 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java Fri Jul 22 11:18:00 2011 +0000 @@ -58,6 +58,9 @@ public static final String XPATH_OUT_TYPE = "/art:action/@art:type"; + public static final String XPATH_LOADED_RECOMMENDATIONS = + "/art:attribute/art:loaded-recommendations"; + @Override @@ -88,23 +91,15 @@ doc.appendChild(collection); ArtifactDatabase db = context.getDatabase(); + Document oldAttrs = getAttribute(); try { - String[] artifactUUIDs = getArtifactUUIDs(context); - - Document oldAttrs = getAttribute(); + String[] aUUIDs = getArtifactUUIDs(context); + Node newAttr = mergeAttributes(db, context, oldAttrs, aUUIDs); - Document attrs = buildAttributes( - db, context, - oldAttrs, - artifactUUIDs); + collection.appendChild(doc.importNode(newAttr, true)); - collection.appendChild(doc.importNode(attrs.getFirstChild(), true)); - - // save the merged document into database - db.setCollectionAttribute(identifier(), context.getMeta(), attrs); - - for (String uuid: artifactUUIDs) { + for (String uuid: aUUIDs) { try { artifacts.appendChild( buildArtifactNode(db, uuid, context, ec)); @@ -116,12 +111,64 @@ } catch (ArtifactDatabaseException ade) { log.error(ade, ade); + + collection.appendChild( + doc.importNode(oldAttrs.getFirstChild(), true)); } return doc; } + /** + * Merge the current art:outputs nodes with the the outputs provided by the + * artifacts in the Collection. + */ + protected Node mergeAttributes( + ArtifactDatabase db, + CallContext context, + Document oldAttrs, + String[] uuids) + { + Document doc = buildOutAttributes(db, context, oldAttrs, uuids); + Node newAttr = doc.getFirstChild(); + + newAttr = mergeLoadedRecommendations(oldAttrs, newAttr); + + try { + // save the merged document into database + db.setCollectionAttribute(identifier(), context.getMeta(), doc); + } + catch (ArtifactDatabaseException adb) { + log.error(adb, adb); + } + + return newAttr; + } + + + /** + * Merge the recommendations which have already been loaded from the old + * attribute document into the new attribute document. This is necessary, + * because mergeAttributes() only merges the art:outputs nodes - all + * other nodes are skiped. + */ + protected Node mergeLoadedRecommendations(Document oldAttrs, Node newAttrs){ + Element loadedRecoms = (Element) XMLUtils.xpath( + oldAttrs, + XPATH_LOADED_RECOMMENDATIONS, + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + + if (loadedRecoms != null) { + Document doc = newAttrs.getOwnerDocument(); + newAttrs.appendChild(doc.importNode(loadedRecoms, true)); + } + + return newAttrs; + } + + @Override public void out( String type, @@ -251,7 +298,7 @@ } - protected Document buildAttributes( + protected Document buildOutAttributes( ArtifactDatabase db, CallContext context, Document oldAttr, @@ -292,7 +339,7 @@ protected Document getAttribute(CallContext context, String output) throws ArtifactDatabaseException { - Document attr = buildAttributes( + Document attr = buildOutAttributes( context.getDatabase(), context, getAttribute(),