# HG changeset patch # User Ingo Weinzierl # Date 1303914944 0 # Node ID a63d8bdb2d793d087adf23550e652b1911242896 # Parent 16161de47662bb5a947c03ae17a49e2e6daabd60 Improved the out() operation of a Collection - the OutGenerator gets to know about the facets and its theme. flys-artifacts/trunk@1749 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 16161de47662 -r a63d8bdb2d79 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Tue Apr 26 13:29:18 2011 +0000 +++ b/flys-artifacts/ChangeLog Wed Apr 27 14:35:44 2011 +0000 @@ -1,3 +1,11 @@ +2011-04-27 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java: + Restructured the out() operation of a collection: Now, we collect a list + of artifacts/facets and use this for the OutGenerator. Its doOut() + method gets the attribute of an artifact - the position and the active + state is managed by the Collection itself. + 2011-04-26 Ingo Weinzierl * src/main/java/de/intevation/flys/artifacts/model/ManagedFacet.java: New. diff -r 16161de47662 -r a63d8bdb2d79 flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java --- a/flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java Tue Apr 26 13:29:18 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java Wed Apr 27 14:35:44 2011 +0000 @@ -4,6 +4,7 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,6 +31,7 @@ import de.intevation.artifactdatabase.DefaultArtifactCollection; import de.intevation.flys.artifacts.context.FLYSContext; +import de.intevation.flys.artifacts.model.ManagedFacet; import de.intevation.flys.exports.OutGenerator; @@ -140,10 +142,54 @@ generator.init(format, out, context); try { - Object[][] container = getArtifactsWithAttribute(context); + doOut(generator, getAttribute(context, name), context); + } + catch (ArtifactDatabaseException adbe) { + log.error(adbe, adbe); + } + } - for (Object[] obj: container) { - generator.doOut((Artifact) obj[0], (Document) obj[1]); + + /** + * This method creates the concrete output. + * + * @param generator The OutGenerator that creates the output. + * @param attributes The collection's attributes for this concrete output + * type. + * @param context The context object. + */ + protected void doOut( + OutGenerator generator, + Document attributes, + CallContext context) + throws IOException + { + log.debug("FLYSArtifactCollection.doOut"); + + ThemeList themeList = new ThemeList(attributes); + + int size = themeList.size(); + log.debug("Output will contain " + size + " elements."); + + try { + for (int i = 0; i < size; i++) { + ManagedFacet theme = themeList.get(i); + + if (theme == null) { + continue; + } + + String art = theme.getArtifact(); + + if (log.isDebugEnabled()) { + log.debug("Do output for..."); + log.debug("... artifact: " + art); + log.debug("... facet: " + theme.getName()); + } + + generator.doOut( + getArtifact(art, context), + getArtifactAttribute(art, context)); } } catch (ArtifactDatabaseException ade) { @@ -186,6 +232,41 @@ /** + * Returns the attribute for a specific output type. + * + * @param output The name of the desired output type. + * + * @return the attribute for the desired output type. + */ + protected Document getAttribute(CallContext context, String output) + throws ArtifactDatabaseException + { + Document attr = buildAttributes( + context.getDatabase(), + context, + getAttribute(), + getArtifactUUIDs(context)); + + Node out = (Node) XMLUtils.xpath( + attr, + "art:output[@name='" + output + "']", + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + + + if (out != null) { + Document o = XMLUtils.newDocument(); + + o.appendChild(o.importNode(out, true)); + + return o; + } + + return null; + } + + + /** * This method returns the list of artifact UUIDs that this collections * contains. * @@ -273,46 +354,6 @@ /** - * Returns a list of Artifact/Attribute pairs. - * - * @param context The CallContext. - * - * @return a list of Artifact/Attribute pairs. - */ - protected Object[][] getArtifactsWithAttribute(CallContext context) - throws ArtifactDatabaseException - { - log.debug("FLYSArtifactCollection.getArtifactWithAttribute"); - - ArtifactDatabase db = context.getDatabase(); - CallMeta meta = context.getMeta(); - - String[] uuids = getArtifactUUIDs(context); - Object[][] awa = new Object[uuids.length][2]; - - for (int i = 0; i < uuids.length; i++) { - try { - Artifact artifact = getArtifact(uuids[i], context); - Document attribute = getArtifactAttribute(uuids[i], context); - - if (artifact == null) { - log.warn("Artifact '" + uuids[i] + "' is not existing."); - continue; - } - - awa[i][0] = artifact; - awa[i][1] = attribute; - } - catch (ArtifactDatabaseException ade) { - log.warn(ade, ade); - } - } - - return awa; - } - - - /** * Returns the OutGenerator for a specified type. * * @param name The name of the output type. @@ -386,5 +427,86 @@ return ci; } + + + /** + * Inner class to structure/order the themes of a chart. + */ + private class ThemeList { + private Logger logger = Logger.getLogger(ThemeList.class); + protected Map themes; + + public ThemeList(Document output) { + themes = new HashMap(); + parse(output); + } + + protected void parse(Document output) { + NodeList themes = (NodeList) XMLUtils.xpath( + output, + "art:output/art:theme", + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + int num = themes != null ? themes.getLength() : 0; + + logger.debug("Output has " + num + " elements."); + + if (num == 0) { + return; + } + + for (int i = 0; i < num; i++) { + Node theme = themes.item(i); + + String name = XMLUtils.xpathString( + theme, "@art:facet", ArtifactNamespaceContext.INSTANCE); + + String uuid = XMLUtils.xpathString( + theme, "@art:artifact", ArtifactNamespaceContext.INSTANCE); + + String pos = XMLUtils.xpathString( + theme, "@art:pos", ArtifactNamespaceContext.INSTANCE); + + String active = XMLUtils.xpathString( + theme, "@art:active", ArtifactNamespaceContext.INSTANCE); + + addTheme(uuid, name, pos, active); + } + } + + protected void addTheme( + String uuid, + String name, + String position, + String active) + { + if (logger.isDebugEnabled()) { + logger.debug("Add theme: "); + logger.debug(".. name: " + name); + logger.debug(".. uuid: " + uuid); + logger.debug(".. position: " + position); + logger.debug(".. active: " + active); + } + + try { + Integer pos = new Integer(position); + Integer act = new Integer(active); + + themes.put(pos, new ManagedFacet(name, null, uuid, pos, act)); + } + catch (NumberFormatException nfe) { + // do nothing + } + } + + public ManagedFacet get(int idx) { + return themes.get(new Integer(idx)); + } + + public int size() { + return themes.size(); + } + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :