GenericAddress

Bei der Ausgabe von GenericAddress und abgeleiteten CTs wird nun neben dem ISO-Country-Code auch das Land in übersetzter Form ausgegeben.

git-svn-id: https://svn.libreccm.org/ccm/trunk@623 8810af33-2d31-482b-a856-94f89814c4df
master
quasi 2010-11-18 19:14:57 +00:00
parent d02a207bba
commit 7bf1e264fa
4 changed files with 131 additions and 127 deletions

View File

@ -23,7 +23,7 @@
<xrd:property name="/object/type/displayName"/> <xrd:property name="/object/type/displayName"/>
<xrd:property name="/object/type/associatedObjectType"/> <xrd:property name="/object/type/associatedObjectType"/>
<xrd:property name="/object/type/className"/> <xrd:property name="/object/type/className"/>
<xrd:property name="/object/type/isInternal"/> <xrd:property name="/object/type/mode"/>
<xrd:property name="/object/type/itemFormID"/> <xrd:property name="/object/type/itemFormID"/>
</xrd:attributes> </xrd:attributes>
<xrd:associations rule="include"> <xrd:associations rule="include">

View File

@ -4,10 +4,12 @@
*/ */
package com.arsdigita.cms; package com.arsdigita.cms;
import com.arsdigita.cms.contenttypes.GenericAddress;
import com.arsdigita.dispatcher.DispatcherHelper; import com.arsdigita.dispatcher.DispatcherHelper;
import com.arsdigita.domain.DomainObject; import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.DomainObjectTraversalAdapter; import com.arsdigita.domain.DomainObjectTraversalAdapter;
import com.arsdigita.domain.DomainObjectXMLRenderer; import com.arsdigita.domain.DomainObjectXMLRenderer;
import com.arsdigita.persistence.metadata.Property;
import com.arsdigita.xml.Element; import com.arsdigita.xml.Element;
/** /**
@ -22,14 +24,12 @@ import com.arsdigita.xml.Element;
* *
* @author quasi * @author quasi
*/ */
public class ContentItemXMLRenderer extends DomainObjectXMLRenderer { public class ContentItemXMLRenderer extends DomainObjectXMLRenderer {
public ContentItemXMLRenderer(Element root) { public ContentItemXMLRenderer(Element root) {
super(root); super(root);
} }
// This method will be called by DomainObjectTraversal.walk() // This method will be called by DomainObjectTraversal.walk()
// It's purpose is to test for ContentBundle objects and if found, replace // It's purpose is to test for ContentBundle objects and if found, replace
// that object with the negotiated version of the content item. // that object with the negotiated version of the content item.
@ -50,4 +50,24 @@ public class ContentItemXMLRenderer extends DomainObjectXMLRenderer {
super.walk(adapter, nObj, path, context, linkObject); super.walk(adapter, nObj, path, context, linkObject);
} }
@Override
protected void handleAttribute(DomainObject obj,
String path,
Property property) {
String name = property.getName();
if (obj instanceof GenericAddress) {
if (name.equals("isoCountryCode")) {
super.handleAttribute(obj, path, property);
Element element = newElement(m_element, "country");
element.setText(GenericAddress.getCountryNameFromIsoCode(((GenericAddress) obj).getIsoCountryCode()));
return;
}
}
super.handleAttribute(obj, path, property);
}
} }

View File

@ -115,10 +115,7 @@ public class SimpleXMLGenerator implements XMLGenerator {
if (!item.getClass().getName().equals(className)) { if (!item.getClass().getName().equals(className)) {
s_log.info("Specializing item"); s_log.info("Specializing item");
try { try {
item = (ContentItem) DomainObjectFactory.newInstance(new OID(item. item = (ContentItem) DomainObjectFactory.newInstance(new OID(item. getObjectType().getQualifiedName(), item.getID()));
getObjectType().getQualifiedName(),
item.
getID()));
} catch (DataObjectNotFoundException ex) { } catch (DataObjectNotFoundException ex) {
throw new UncheckedWrapperException( throw new UncheckedWrapperException(
(String) GlobalizationUtil.globalize( (String) GlobalizationUtil.globalize(
@ -133,8 +130,7 @@ public class SimpleXMLGenerator implements XMLGenerator {
XMLGenerator xitem = (XMLGenerator) item; XMLGenerator xitem = (XMLGenerator) item;
xitem.generateXML(state, parent, useContext); xitem.generateXML(state, parent, useContext);
} else if (className.equals( } else if (className.equals("com.arsdigita.cms.UserDefinedContentItem")) {
"com.arsdigita.cms.UserDefinedContentItem")) {
s_log.info("Item is a user defined content item"); s_log.info("Item is a user defined content item");
UserDefinedContentItem UDItem = (UserDefinedContentItem) item; UserDefinedContentItem UDItem = (UserDefinedContentItem) item;
generateUDItemXML(UDItem, state, parent, useContext); generateUDItemXML(UDItem, state, parent, useContext);
@ -145,8 +141,7 @@ public class SimpleXMLGenerator implements XMLGenerator {
// This is the preferred method // This is the preferred method
Element content = startElement(useContext); Element content = startElement(useContext);
ContentItemXMLRenderer renderer = ContentItemXMLRenderer renderer = new ContentItemXMLRenderer(content);
new ContentItemXMLRenderer(content);
renderer.setWrapAttributes(true); renderer.setWrapAttributes(true);
renderer.setWrapRoot(false); renderer.setWrapRoot(false);

View File

@ -45,10 +45,19 @@ import org.apache.log4j.Logger;
*/ */
public class DomainObjectXMLRenderer extends DomainObjectTraversal { public class DomainObjectXMLRenderer extends DomainObjectTraversal {
private static final Logger s_log = Logger.getLogger private static final Logger s_log = Logger.getLogger(DomainObjectXMLRenderer.class);
(DomainObjectXMLRenderer.class);
private static Map s_formatters = new HashMap(); private static Map s_formatters = new HashMap();
private Stack m_elements = new Stack();
protected Element m_element;
private boolean m_wrapRoot = false;
private boolean m_wrapObjects = false;
private boolean m_wrapAttributes = false;
private boolean m_revisitFullObject = false;
private Map m_objectElements;
private String m_namespaceURI;
private String m_namespacePrefix;
private DomainObjectXMLFormatter m_formatter;
private String m_context;
/** /**
* Registers a traversal formatter for an object type in a given * Registers a traversal formatter for an object type in a given
@ -59,8 +68,8 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
* @param context the context in which the formatter should be used * @param context the context in which the formatter should be used
*/ */
public static void registerFormatter(ObjectType type, public static void registerFormatter(ObjectType type,
DomainObjectXMLFormatter formatter, DomainObjectXMLFormatter formatter,
String context) { String context) {
s_formatters.put(new AdapterKey(type, context), formatter); s_formatters.put(new AdapterKey(type, context), formatter);
} }
@ -72,7 +81,7 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
* @param context the context in which the formatter should be used * @param context the context in which the formatter should be used
*/ */
public static void unregisterFormatter(ObjectType type, public static void unregisterFormatter(ObjectType type,
String context) { String context) {
s_formatters.remove(new AdapterKey(type, context)); s_formatters.remove(new AdapterKey(type, context));
} }
@ -85,17 +94,17 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
* @param context the context in which the formatter should be used * @param context the context in which the formatter should be used
*/ */
public static void registerFormatter(String type, public static void registerFormatter(String type,
DomainObjectXMLFormatter formatter, DomainObjectXMLFormatter formatter,
String context) { String context) {
if( s_log.isDebugEnabled() ) { if (s_log.isDebugEnabled()) {
s_log.debug( "Registering formatter " + s_log.debug("Registering formatter "
formatter.getClass().getName() + " for type " + type + + formatter.getClass().getName() + " for type " + type
" in context " + context ); + " in context " + context);
} }
registerFormatter(MetadataRoot.getMetadataRoot().getObjectType(type), registerFormatter(MetadataRoot.getMetadataRoot().getObjectType(type),
formatter, formatter,
context); context);
} }
/** /**
@ -106,9 +115,9 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
* @param context the context in which the formatter should be used * @param context the context in which the formatter should be used
*/ */
public static void unregisterFormatter(String type, public static void unregisterFormatter(String type,
String context) { String context) {
unregisterFormatter(MetadataRoot.getMetadataRoot().getObjectType(type), unregisterFormatter(MetadataRoot.getMetadataRoot().getObjectType(type),
context); context);
} }
/** /**
@ -119,10 +128,9 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
* @param context the formatter context * @param context the formatter context
*/ */
public static DomainObjectXMLFormatter getFormatter( public static DomainObjectXMLFormatter getFormatter(
ObjectType type, ObjectType type,
String context) { String context) {
return (DomainObjectXMLFormatter)s_formatters return (DomainObjectXMLFormatter) s_formatters.get(new AdapterKey(type, context));
.get(new AdapterKey(type, context));
} }
/** /**
@ -135,34 +143,18 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
* @param context the formatter context * @param context the formatter context
*/ */
public static DomainObjectXMLFormatter findFormatter(ObjectType type, public static DomainObjectXMLFormatter findFormatter(ObjectType type,
String context) { String context) {
DomainObjectXMLFormatter formatter = null; DomainObjectXMLFormatter formatter = null;
while (formatter == null && type != null) { while (formatter == null && type != null) {
formatter = getFormatter(type, context); formatter = getFormatter(type, context);
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("getFormatter("+type+","+context+")="+formatter); s_log.debug("getFormatter(" + type + "," + context + ")=" + formatter);
} }
type = type.getSupertype(); type = type.getSupertype();
} }
return formatter; return formatter;
} }
private Stack m_elements = new Stack();
private Element m_element;
private boolean m_wrapRoot = false;
private boolean m_wrapObjects = false;
private boolean m_wrapAttributes = false;
private boolean m_revisitFullObject = false;
private Map m_objectElements;
private String m_namespaceURI;
private String m_namespacePrefix;
private DomainObjectXMLFormatter m_formatter;
private String m_context;
/** /**
* Creates a new DomainObject XML renderer * Creates a new DomainObject XML renderer
* that outputs XML into the element passed into * that outputs XML into the element passed into
@ -176,22 +168,22 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
} }
public void setNamespace(String prefix, public void setNamespace(String prefix,
String uri) { String uri) {
m_namespacePrefix = prefix; m_namespacePrefix = prefix;
m_namespaceURI = uri; m_namespaceURI = uri;
} }
protected Object format(DomainObject obj, protected Object format(DomainObject obj,
String path, String path,
Property prop, Property prop,
Object value) { Object value) {
if (m_formatter != null) { if (m_formatter != null) {
String propertyPath = appendToPath(path, prop.getName()); String propertyPath = appendToPath(path, prop.getName());
Object rendered = m_formatter.format(obj, Object rendered = m_formatter.format(obj,
propertyPath, propertyPath,
prop, value); prop, value);
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("FORMAT "+obj+" m_formatter="+m_formatter+" rendered="+rendered); s_log.debug("FORMAT " + obj + " m_formatter=" + m_formatter + " rendered=" + rendered);
} }
if (rendered == null) { if (rendered == null) {
// try supertype formatters // try supertype formatters
@ -205,7 +197,7 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
rendered = null; rendered = null;
} }
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("FALLBACK supertype "+objectType+" formatter="+formatter+" rendered="+rendered); s_log.debug("FALLBACK supertype " + objectType + " formatter=" + formatter + " rendered=" + rendered);
} }
objectType = objectType.getSupertype(); objectType = objectType.getSupertype();
} }
@ -220,11 +212,11 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
@Override @Override
protected void walk(DomainObject obj, protected void walk(DomainObject obj,
String context, String context,
DomainObjectTraversalAdapter adapter) { DomainObjectTraversalAdapter adapter) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Traversing " + obj + " for context " + context + " " + s_log.debug("Traversing " + obj + " for context " + context + " "
"using adapter " + adapter); + "using adapter " + adapter);
} }
m_formatter = findFormatter(obj.getObjectType(), context); m_formatter = findFormatter(obj.getObjectType(), context);
@ -237,7 +229,6 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
super.walk(obj, context, adapter); super.walk(obj, context, adapter);
} }
/** /**
* Determines XML output for root object. * Determines XML output for root object.
* If set to true a separate element will * If set to true a separate element will
@ -281,7 +272,6 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
m_revisitFullObject = value; m_revisitFullObject = value;
} }
public boolean isWrappingAttributes() { public boolean isWrappingAttributes() {
return m_wrapAttributes; return m_wrapAttributes;
} }
@ -295,7 +285,7 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
} }
protected void beginObject(DomainObject obj, protected void beginObject(DomainObject obj,
String path) { String path) {
if (m_wrapRoot || !path.equals("/object")) { if (m_wrapRoot || !path.equals("/object")) {
String name = m_wrapObjects ? "object" : nameFromPath(path); String name = m_wrapObjects ? "object" : nameFromPath(path);
Element element = newElement(m_element, name); Element element = newElement(m_element, name);
@ -310,19 +300,19 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
} }
protected void endObject(DomainObject obj, protected void endObject(DomainObject obj,
String path) { String path) {
if (m_wrapRoot || !path.equals("/object")) { if (m_wrapRoot || !path.equals("/object")) {
m_element = (Element)m_elements.pop(); m_element = (Element) m_elements.pop();
} }
} }
protected void revisitObject(DomainObject obj, protected void revisitObject(DomainObject obj,
String path) { String path) {
Element priorElement = null; Element priorElement = null;
if (m_revisitFullObject) { if (m_revisitFullObject) {
priorElement = (Element) m_objectElements.get(obj.getOID()); priorElement = (Element) m_objectElements.get(obj.getOID());
} }
if (priorElement != null && (m_elements.search(priorElement)==-1)) { if (priorElement != null && (m_elements.search(priorElement) == -1)) {
String name = m_wrapObjects ? "object" : nameFromPath(path); String name = m_wrapObjects ? "object" : nameFromPath(path);
Element element = newElement(m_element, name, priorElement); Element element = newElement(m_element, name, priorElement);
} else { } else {
@ -333,54 +323,54 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
} }
protected void handleAttribute(DomainObject obj, protected void handleAttribute(DomainObject obj,
String path, String path,
Property property) { Property property) {
String name = property.getName(); String name = property.getName();
Object value = obj.get(name); Object value = obj.get(name);
if (value != null) { if (value != null) {
if (m_wrapAttributes) { if (m_wrapAttributes) {
Object formattedValue = format(obj, path, property, value); Object formattedValue = format(obj, path, property, value);
if (formattedValue instanceof Element) { if (formattedValue instanceof Element) {
m_element.addContent((Element)formattedValue); m_element.addContent((Element) formattedValue);
} else { } else {
Element element = newElement(m_element, name); Element element = newElement(m_element, name);
element.setText((String)format(obj, path, property, value)); element.setText((String) format(obj, path, property, value));
// locale-independent date output // locale-independent date output
if (value instanceof Date) { if (value instanceof Date) {
Date date = (Date) value; Date date = (Date) value;
Calendar calDate = Calendar.getInstance(); Calendar calDate = Calendar.getInstance();
calDate.setTime(date); calDate.setTime(date);
element.addAttribute("year", Integer.toString(calDate.get(Calendar.YEAR))); element.addAttribute("year", Integer.toString(calDate.get(Calendar.YEAR)));
element.addAttribute("month", Integer.toString(calDate.get(Calendar.MONTH)+1)); element.addAttribute("month", Integer.toString(calDate.get(Calendar.MONTH) + 1));
element.addAttribute("day", Integer.toString(calDate.get(Calendar.DAY_OF_MONTH))); element.addAttribute("day", Integer.toString(calDate.get(Calendar.DAY_OF_MONTH)));
element.addAttribute("hour", Integer.toString(calDate.get(Calendar.HOUR_OF_DAY))); element.addAttribute("hour", Integer.toString(calDate.get(Calendar.HOUR_OF_DAY)));
element.addAttribute("minute", Integer.toString(calDate.get(Calendar.MINUTE))); element.addAttribute("minute", Integer.toString(calDate.get(Calendar.MINUTE)));
element.addAttribute("second", Integer.toString(calDate.get(Calendar.SECOND))); element.addAttribute("second", Integer.toString(calDate.get(Calendar.SECOND)));
// Quasimodo: BEGIN // Quasimodo: BEGIN
// Add attributes for date and time // Add attributes for date and time
Locale negLocale = com.arsdigita.dispatcher.DispatcherHelper.getNegotiatedLocale(); Locale negLocale = com.arsdigita.dispatcher.DispatcherHelper.getNegotiatedLocale();
DateFormat dateFormatter = DateFormat.getDateInstance(DateFormat.MEDIUM, negLocale); DateFormat dateFormatter = DateFormat.getDateInstance(DateFormat.MEDIUM, negLocale);
DateFormat timeFormatter = DateFormat.getTimeInstance(DateFormat.SHORT, negLocale); DateFormat timeFormatter = DateFormat.getTimeInstance(DateFormat.SHORT, negLocale);
element.addAttribute("date", dateFormatter.format(date)); element.addAttribute("date", dateFormatter.format(date));
element.addAttribute("time", timeFormatter.format(date)); element.addAttribute("time", timeFormatter.format(date));
// Quasimodo: END // Quasimodo: END
}
} }
}
} else { } else {
m_element.addAttribute(property.getName(), m_element.addAttribute(property.getName(),
(String)format(obj, path, property, value)); (String) format(obj, path, property, value));
} }
} }
} }
protected void beginRole(DomainObject obj, protected void beginRole(DomainObject obj,
String path, String path,
Property property) { Property property) {
if (m_wrapObjects) { if (m_wrapObjects) {
Element element = newElement(m_element, property.getName()); Element element = newElement(m_element, property.getName());
m_elements.push(m_element); m_elements.push(m_element);
@ -389,17 +379,16 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
} }
protected void endRole(DomainObject obj, protected void endRole(DomainObject obj,
String path, String path,
Property property) { Property property) {
if (m_wrapObjects) { if (m_wrapObjects) {
m_element = (Element)m_elements.pop(); m_element = (Element) m_elements.pop();
} }
} }
protected void beginAssociation(DomainObject obj, protected void beginAssociation(DomainObject obj,
String path, String path,
Property property) { Property property) {
if (m_wrapObjects) { if (m_wrapObjects) {
Element element = newElement(m_element, property.getName()); Element element = newElement(m_element, property.getName());
m_elements.push(m_element); m_elements.push(m_element);
@ -408,10 +397,10 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
} }
protected void endAssociation(DomainObject obj, protected void endAssociation(DomainObject obj,
String path, String path,
Property property) { Property property) {
if (m_wrapObjects) { if (m_wrapObjects) {
m_element = (Element)m_elements.pop(); m_element = (Element) m_elements.pop();
} }
} }
@ -428,20 +417,20 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
} }
protected Element newElement(Element parent, protected Element newElement(Element parent,
String name) { String name) {
return m_namespaceURI == null ? return m_namespaceURI == null
parent.newChildElement(name) : ? parent.newChildElement(name)
parent.newChildElement(m_namespacePrefix + ":" + name, : parent.newChildElement(m_namespacePrefix + ":" + name,
m_namespaceURI); m_namespaceURI);
} }
protected Element newElement(Element parent, protected Element newElement(Element parent,
String name, String name,
Element copy) { Element copy) {
return m_namespaceURI == null ? return m_namespaceURI == null
parent.newChildElement(name, copy) : ? parent.newChildElement(name, copy)
parent.newChildElement(m_namespacePrefix + ":" + name, : parent.newChildElement(m_namespacePrefix + ":" + name,
m_namespaceURI, m_namespaceURI,
copy); copy);
} }
} }