# HG changeset patch # User Ingo Weinzierl # Date 1303978460 0 # Node ID 2465dc2963955f8200f9a3078636648b58b2866c # Parent 6167ae622ce0bb21b9af3d1c28b28b7608bef1c1 The OutGenerator gets the theme of a facet while output creation. flys-artifacts/trunk@1754 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 6167ae622ce0 -r 2465dc296395 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Wed Apr 27 14:42:52 2011 +0000 +++ b/flys-artifacts/ChangeLog Thu Apr 28 08:14:20 2011 +0000 @@ -1,3 +1,10 @@ +2011-04-28 Ingo Weinzierl + + * src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java:: + A lot of new methods to retrieve the theme of a facet - used while + creating the output of a facet/artifact. If a facet has no theme yet, it + is initialized. + 2011-04-27 Ingo Weinzierl * src/main/java/de/intevation/flys/collections/AttributeParser.java, diff -r 6167ae622ce0 -r 2465dc296395 flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java --- a/flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java Wed Apr 27 14:42:52 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java Thu Apr 28 08:14:20 2011 +0000 @@ -24,6 +24,7 @@ import de.intevation.artifacts.CallContext; import de.intevation.artifacts.CallMeta; +import de.intevation.artifacts.common.utils.ClientProtocolUtils; import de.intevation.artifacts.common.utils.XMLUtils; import de.intevation.artifactdatabase.Backend; @@ -33,6 +34,8 @@ import de.intevation.flys.artifacts.context.FLYSContext; import de.intevation.flys.artifacts.model.ManagedFacet; import de.intevation.flys.exports.OutGenerator; +import de.intevation.flys.themes.Theme; +import de.intevation.flys.themes.ThemeFactory; /** @@ -142,7 +145,7 @@ generator.init(format, out, context); try { - doOut(generator, getAttribute(context, name), context); + doOut(generator, name, getAttribute(context, name), context); } catch (ArtifactDatabaseException adbe) { log.error(adbe, adbe); @@ -154,17 +157,19 @@ * This method creates the concrete output. * * @param generator The OutGenerator that creates the output. + * @param outputName The name of the requested output. * @param attributes The collection's attributes for this concrete output * type. * @param context The context object. */ protected void doOut( OutGenerator generator, + String outName, Document attributes, CallContext context) throws IOException { - log.debug("FLYSArtifactCollection.doOut"); + log.debug("FLYSArtifactCollection.doOut: " + outName); ThemeList themeList = new ThemeList(attributes); @@ -189,7 +194,11 @@ generator.doOut( getArtifact(art, context), - getArtifactAttribute(art, context)); + getFacetThemeFromAttribute( + art, + outName, + theme.getName(), + context)); } } catch (ArtifactDatabaseException ade) { @@ -339,17 +348,230 @@ * collection. * * @param uuid The Artifact's uuid. + * @param outname The name of the requested output. + * @param facet The name of the requested facet. * @param context The CallContext. * * @return an attribute in form of a document. */ - protected Document getArtifactAttribute(String uuid, CallContext context) + protected Document getFacetThemeFromAttribute( + String uuid, + String outName, + String facet, + CallContext context) throws ArtifactDatabaseException { - log.debug("FLYSArtifactCollection.getArtifactAttribute"); + log.debug("FLYSArtifactCollection.getFacetThemeFromAttribute"); - // TODO FILL ME - return null; + ArtifactDatabase db = context.getDatabase(); + CallMeta meta = context.getMeta(); + + FLYSContext flysContext = context instanceof FLYSContext + ? (FLYSContext) context + : (FLYSContext) context.globalContext(); + + Map mappings = (Map) + flysContext.get(FLYSContext.THEME_MAPPING); + + String themeName = mappings.get(facet); + + Document attr = db.getCollectionItemAttribute(identifier(), uuid, meta); + + if (attr == null) { + attr = initItemAttribute(uuid, facet, context); + + if (attr == null) { + return null; + } + } + + log.debug("Search attribute of collection item: " + uuid); + + Node tmp = (Node) XMLUtils.xpath( + attr, + "/art:attribute", + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + + if (tmp == null) { + log.warn("No attribute found. Operation failed."); + return null; + } + + log.debug("Search theme '" + themeName + "' in attribute."); + + Node theme = (Node) XMLUtils.xpath( + tmp, + "art:themes/theme[@name='" + themeName + "']", + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + + if (theme == null) { + log.warn("Could not find the theme in attribute of: " + uuid); + + Theme t = getThemeForFacet(uuid, facet, context); + + if (t == null) { + log.warn("No theme found for facet: " + facet); + return null; + } + + addThemeToAttribute(uuid, attr, t, context); + theme = t.toXML().getFirstChild(); + } + + Document doc = XMLUtils.newDocument(); + doc.appendChild(doc.importNode(theme, true)); + + return doc; + } + + + /** + * Adds the theme of a facet to a CollectionItem's attribute. + * + * @param uuid The uuid of the artifact. + * @param attr The current attribute of an artifact. + * @param t The theme to add. + * @param context The CallContext. + */ + protected void addThemeToAttribute( + String uuid, + Document attr, + Theme t, + CallContext context) + { + log.debug("FLYSArtifactCollection.addThemeToAttribute: " + uuid); + + if (t == null) { + log.warn("Theme is empty - cancel adding it to attribute!"); + return; + } + + XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( + attr, + ArtifactNamespaceContext.NAMESPACE_URI, + ArtifactNamespaceContext.NAMESPACE_PREFIX); + + Node tmp = (Node) XMLUtils.xpath( + attr, + "/art:attribute", + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + + if (tmp == null) { + tmp = ec.create("attribute"); + attr.appendChild(tmp); + } + + Node themes = (Node) XMLUtils.xpath( + tmp, + "art:themes", + XPathConstants.NODE, + ArtifactNamespaceContext.INSTANCE); + + if (themes == null) { + themes = ec.create("themes"); + tmp.appendChild(themes); + } + + themes.appendChild(attr.importNode(t.toXML().getFirstChild(), true)); + + try { + setCollectionItemAttribute(uuid, attr, context); + + log.debug("Successfully added theme to item attribute."); + } + catch (ArtifactDatabaseException e) { + // do nothing + log.warn("Cannot set attribute of item: " + uuid); + } + } + + + /** + * Initializes the attribute of an collection item with the theme of a + * specific facet. + * + * @param uuid The uuid of an artifact. + * @param facet The name of a facet. + * @param context The CallContext. + * + * @param the new attribute. + */ + protected Document initItemAttribute( + String uuid, + String facet, + CallContext context) + { + log.info("FLYSArtifactCollection.initItemAttribute"); + + Theme t = getThemeForFacet(uuid, facet, context); + + if (t == null) { + log.info("Could not find theme for facet. Cancel initialization."); + return null; + } + + Document attr = XMLUtils.newDocument(); + + addThemeToAttribute(uuid, attr, t, context); + + return attr; + } + + + /** + * Sets the attribute of a CollectionItem specified by uuid to a new + * value attr. + * + * @param uuid The uuid of the CollectionItem. + * @param attr The new attribute for the CollectionItem. + * @param context The CallContext. + */ + public void setCollectionItemAttribute( + String uuid, + Document attr, + CallContext context) + throws ArtifactDatabaseException + { + Document doc = ClientProtocolUtils.newSetItemAttributeDocument( + uuid, + attr); + + if (doc == null) { + log.warn("Cannot set item attribute: No attribute found."); + return; + } + + ArtifactDatabase db = context.getDatabase(); + CallMeta meta = context.getMeta(); + + db.setCollectionItemAttribute(identifier(), uuid, doc, meta); + } + + + /** + * Returns the theme of a specific facet. + * + * @param uuid The uuid of an artifact. + * @param facet The name of the facet. + * @param context The CallContext object. + * + * @return the desired theme. + */ + protected Theme getThemeForFacet( + String uuid, + String facet, + CallContext context) + { + log.info("FLYSArtifactCollection.getThemeForFacet: " + facet); + + FLYSContext flysContext = context instanceof FLYSContext + ? (FLYSContext) context + : (FLYSContext) context.globalContext(); + + return ThemeFactory.getTheme(flysContext, facet); }