/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.arsdigita.cms; import com.arsdigita.cms.contenttypes.GenericAddress; import com.arsdigita.dispatcher.DispatcherHelper; import com.arsdigita.domain.DomainObject; import com.arsdigita.domain.DomainObjectTraversalAdapter; import com.arsdigita.domain.DomainObjectXMLRenderer; import com.arsdigita.globalization.GlobalizationHelper; import com.arsdigita.persistence.metadata.Property; import com.arsdigita.xml.Element; import org.apache.log4j.Logger; /** * This is a special ContentItemXMLRenderer for CMS to get a more transparent * way to handle ContentBundles during XML output. * * The problem was to change RelatedLinks and therefore Link to always link to * the corresponding ContentBundle instead of the content item. To get the * corresponding content item during XML generation, I have to test for * ContentBundle and negotiate the language version. * This is not possible in com.arsdigita.ccm * * @author quasi */ public class ContentItemXMLRenderer extends DomainObjectXMLRenderer { private static final Logger logger = Logger.getLogger(ContentItemXMLRenderer.class); private String m_propertyName = ""; private String m_keyName = ""; private String m_relationAttribute = ""; public ContentItemXMLRenderer(Element root) { super(root); } // This method will be called by DomainObjectTraversal.walk() // It's purpose is to test for ContentBundle objects and if found, replace // that object with the negotiated version of the content item. // Otherwise this methd will do nothing. @Override protected void walk(final DomainObjectTraversalAdapter adapter, final DomainObject obj, final String path, final String context, final DomainObject linkObject) { DomainObject nObj = obj; if (nObj instanceof ContentBundle) { nObj = ((ContentBundle) obj). getInstance(GlobalizationHelper.getNegotiatedLocale(), true); } super.walk(adapter, nObj, path, context, linkObject); } @Override protected void handleAttribute(DomainObject obj, String path, Property property) { String propertyName = property.getName(); // Special handling for the isoCountryCode field in GenericAddress if (obj instanceof GenericAddress) { if (propertyName.equals("isoCountryCode")) { super.handleAttribute(obj, path, property); Element element = newElement(m_element, "country"); element.setText(GenericAddress.getCountryNameFromIsoCode(((GenericAddress) obj). getIsoCountryCode())); return; } } // Special handling for the relation attribute keys if (!m_relationAttribute.isEmpty()) { String key = ""; // The RelationAttribute is part of this domain object as field if (obj instanceof RelationAttributeInterface && ((RelationAttributeInterface) obj). hasRelationAttributeProperty(propertyName)) { RelationAttributeInterface relationAttributeObject = (RelationAttributeInterface) obj; key = relationAttributeObject.getRelationAttributeKey( propertyName); } // This RelationAttribute is part of an n:m association as link attribute if (obj instanceof LinkDomainObject && propertyName.equals(m_keyName)) { key = (String) ((LinkDomainObject) obj).get(m_keyName); } // Replace value of the property defined in RELATION_ATTRIBUTES string // of the primary domain object with the localized String. if (!key.isEmpty()) { logger.debug(String.format( "Getting relation attribute value for key '%s' of relation attribute '%s'", key, m_relationAttribute)); RelationAttributeCollection relationAttributeCollection = new RelationAttributeCollection( m_relationAttribute, key); relationAttributeCollection.addLanguageFilter(GlobalizationHelper. getNegotiatedLocale().getLanguage()); if (relationAttributeCollection.size() > 0) { relationAttributeCollection.next(); Element element = newElement(m_element, m_keyName); element.setText(relationAttributeCollection.getName()); Element elementId = newElement(m_element, m_keyName + "Id"); elementId.setText(relationAttributeCollection.getKey()); relationAttributeCollection.close(); } return; } } super.handleAttribute(obj, path, property); } @Override protected void beginAssociation(DomainObject obj, String path, Property property) { super.beginAssociation(obj, path, property); String propertyName = property.getName(); if (obj instanceof RelationAttributeInterface && ((RelationAttributeInterface) obj).hasRelationAttributeProperty( propertyName)) { RelationAttributeInterface relationAttributeObject = (RelationAttributeInterface) obj; m_propertyName = propertyName; m_keyName = relationAttributeObject.getRelationAttributeKeyName( propertyName); m_relationAttribute = relationAttributeObject. getRelationAttributeName(propertyName); } } @Override protected void endAssociation(DomainObject obj, String path, Property property) { m_propertyName = ""; m_keyName = ""; m_relationAttribute = ""; super.endAssociation(obj, path, property); } }