165 lines
6.3 KiB
Java
165 lines
6.3 KiB
Java
/*
|
|
* 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);
|
|
}
|
|
}
|