- Added some attributes to the date output in the XML (see #2092)

- Added missing text in search-paginator file of foundry-base


git-svn-id: https://svn.libreccm.org/ccm/trunk@3112 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2015-02-03 08:58:58 +00:00
parent c63f52f14e
commit d3ac65f9e1
2 changed files with 104 additions and 71 deletions

View File

@ -18,6 +18,7 @@
*/
package com.arsdigita.domain;
import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.persistence.metadata.Property;
import com.arsdigita.persistence.metadata.ObjectType;
import com.arsdigita.persistence.metadata.MetadataRoot;
@ -25,20 +26,23 @@ import com.arsdigita.xml.Element;
import java.util.Calendar;
import java.util.Date;
import com.arsdigita.xml.XML;
import java.text.DateFormat;
import java.text.FieldPosition;
import java.util.Stack;
import java.util.Map;
import java.util.HashMap;
import java.util.Locale;
import org.apache.log4j.Logger;
/**
* An implementation of DomainObjectTraversal that generates an XML tree representing the DomainObject. The output
* format of the XML can be controlled using the various setWrapXXX methods detailed below.
* An implementation of DomainObjectTraversal that generates an XML tree representing the
* DomainObject. The output format of the XML can be controlled using the various setWrapXXX methods
* detailed below.
*
* @version $Id: DomainObjectXMLRenderer.java 2141 2011-01-16 12:17:15Z pboy $
*/
@ -61,9 +65,9 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
/**
* Registers a traversal formatter for an object type in a given context.
*
* @param type the object type whose items will be traversed
* @param type the object type whose items will be traversed
* @param formatter the formatter for controlling object traversal
* @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(final ObjectType type,
final DomainObjectXMLFormatter formatter,
@ -74,7 +78,7 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
/**
* Unregisteres a traversal formatter for an object type in a given context
*
* @param type the object type whose items will be traversed
* @param type the object type whose items will be traversed
* @param context the context in which the formatter should be used
*/
public static void unregisterFormatter(final ObjectType type, final String context) {
@ -84,17 +88,17 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
/**
* Registers a traversal formatter for an object type in a given context.
*
* @param type the object type whose items will be traversed
* @param type the object type whose items will be traversed
* @param formatter the formatter for controlling object traversal
* @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(final String type,
final DomainObjectXMLFormatter formatter,
final String context) {
if (s_log.isDebugEnabled()) {
s_log.debug("Registering formatter "
+ formatter.getClass().getName() + " for type " + type
+ " in context " + context);
+ formatter.getClass().getName() + " for type " + type
+ " in context " + context);
}
registerFormatter(MetadataRoot.getMetadataRoot().getObjectType(type),
@ -105,7 +109,7 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
/**
* Unregisteres a traversal formatter for an object type in a given context
*
* @param type the object type whose items will be traversed
* @param type the object type whose items will be traversed
* @param context the context in which the formatter should be used
*/
public static void unregisterFormatter(final String type,
@ -117,7 +121,7 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
/**
* Retrieves the traversal formatter for an object type in a given context.
*
* @param type the object type to lookup
* @param type the object type to lookup
* @param context the formatter context
*/
public static DomainObjectXMLFormatter getFormatter(final ObjectType type, final String context) {
@ -125,12 +129,13 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
}
/**
* Retrieves the closest matching traversal formatter for an object type in a given context. The algorithm looks for
* an exact match, then considers the supertype, and the supertype's supertype. If no match could be found at all,
* returns null
* Retrieves the closest matching traversal formatter for an object type in a given context. The
* algorithm looks for an exact match, then considers the supertype, and the supertype's
* supertype. If no match could be found at all, returns null
*
* @param type the object type to search for
* @param type the object type to search for
* @param context the formatter context
*
* @return
*/
public static DomainObjectXMLFormatter findFormatter(final ObjectType type, final String context) {
@ -147,7 +152,8 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
}
/**
* Creates a new DomainObject XML renderer that outputs XML into the element passed into the constructor.
* Creates a new DomainObject XML renderer that outputs XML into the element passed into the
* constructor.
*
* @param root the XML element in which to output children
*/
@ -161,12 +167,14 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
m_namespaceURI = uri;
}
protected Object format(final DomainObject obj, final String path, final Property prop, final Object value) {
protected Object format(final DomainObject obj, final String path, final Property prop,
final Object value) {
if (m_formatter != null) {
final String propertyPath = appendToPath(path, prop.getName());
Object rendered = m_formatter.format(obj, propertyPath, prop, value);
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) {
@ -181,8 +189,9 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
rendered = formatter.format(obj, propertyPath, prop, value);
}
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();
}
@ -196,10 +205,11 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
}
@Override
protected void walk(final DomainObject obj, final String context, final DomainObjectTraversalAdapter adapter) {
protected void walk(final DomainObject obj, final String context,
final DomainObjectTraversalAdapter adapter) {
if (s_log.isDebugEnabled()) {
s_log.debug("Traversing " + obj + " for context " + context + " "
+ "using adapter " + adapter);
+ "using adapter " + adapter);
}
m_formatter = findFormatter(obj.getObjectType(), context);
@ -214,8 +224,9 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
}
/**
* Determines XML output for root object. If set to true a separate element will be output for the root object, if
* false, then the element passed into the constructor will be used.
* Determines XML output for root object. If set to true a separate element will be output for
* the root object, if false, then the element passed into the constructor will be used.
*
* @param value
*/
public void setWrapRoot(final boolean value) {
@ -223,9 +234,10 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
}
/**
* Determines XML output used for objects. If set to true, then a wrapper XML element will be generated for the
* association, and then individual elements generated for each object. If false then no wrapper XML element will be
* produced.
* Determines XML output used for objects. If set to true, then a wrapper XML element will be
* generated for the association, and then individual elements generated for each object. If
* false then no wrapper XML element will be produced.
*
* @param value
*/
public void setWrapObjects(final boolean value) {
@ -233,16 +245,16 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
}
/**
* Determines XML output used for scalar attributes. If set to true, then each attribute is output as a separate
* element, otherwise, attributes are output as simple attributes.
* Determines XML output used for scalar attributes. If set to true, then each attribute is
* output as a separate element, otherwise, attributes are output as simple attributes.
*/
public void setWrapAttributes(final boolean value) {
m_wrapAttributes = value;
}
/**
* Determines XML output used for objects. If set to true, then repeated objects will generate full xml. If false
* then only the OID will be printed.
* Determines XML output used for objects. If set to true, then repeated objects will generate
* full xml. If false then only the OID will be printed.
*/
public void setRevisitFullObject(final boolean value) {
m_revisitFullObject = value;
@ -304,7 +316,8 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
}
}
protected void handleAttribute(final DomainObject obj, final String path, final Property property) {
protected void handleAttribute(final DomainObject obj, final String path,
final Property property) {
final String name = property.getName();
final Object value = obj.get(name);
@ -327,24 +340,40 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
calDate.setTime(date);
// locale-independent date output
element.addAttribute("year", Integer.toString(calDate.get(Calendar.YEAR)));
element.addAttribute("month", Integer.toString(calDate.get(Calendar.MONTH) + 1));
element.addAttribute("day", Integer.toString(calDate.get(Calendar.DAY_OF_MONTH)));
element.addAttribute("hour", Integer.toString(calDate.get(Calendar.HOUR_OF_DAY)));
element.addAttribute("minute", Integer.toString(calDate.get(Calendar.MINUTE)));
element.addAttribute("second", Integer.toString(calDate.get(Calendar.SECOND)));
element.addAttribute("year",
Integer.toString(calDate.get(Calendar.YEAR)));
element.addAttribute("month",
Integer.toString(calDate.get(Calendar.MONTH) + 1));
element.addAttribute("day",
Integer.toString(calDate.get(Calendar.DAY_OF_MONTH)));
element.addAttribute("dayOfWeek",
Integer.toString(calDate.get(Calendar.DAY_OF_WEEK)));
element.addAttribute("hour",
Integer.toString(calDate.get(Calendar.HOUR_OF_DAY)));
element.addAttribute("minute",
Integer.toString(calDate.get(Calendar.MINUTE)));
element.addAttribute("second",
Integer.toString(calDate.get(Calendar.SECOND)));
// Quasimodo: BEGIN
// Add attributes for date and time
final Locale negLocale = com.arsdigita.globalization.GlobalizationHelper.getNegotiatedLocale();
final DateFormat dateFormatter = DateFormat.getDateInstance(DateFormat.MEDIUM, negLocale);
final DateFormat longDateFormatter = DateFormat.getDateInstance(DateFormat.LONG, negLocale);
final DateFormat timeFormatter = DateFormat.getTimeInstance(DateFormat.SHORT, negLocale);
final Locale negLocale = GlobalizationHelper.getNegotiatedLocale();
final DateFormat dateFormatter = DateFormat.getDateInstance(
DateFormat.MEDIUM, negLocale);
final DateFormat longDateFormatter = DateFormat.getDateInstance(
DateFormat.LONG, negLocale);
final DateFormat timeFormatter = DateFormat.getTimeInstance(
DateFormat.SHORT, negLocale);
element.addAttribute("date", dateFormatter.format(date));
element.addAttribute("longDate", longDateFormatter.format(date));
element.addAttribute("time", timeFormatter.format(date));
element.addAttribute("monthName", calDate.getDisplayName(Calendar.MONTH, Calendar.LONG,
negLocale));
element.addAttribute("monthName", calDate.getDisplayName(
Calendar.MONTH, Calendar.LONG, negLocale));
element.addAttribute("dayName", calDate.getDisplayName(Calendar.DAY_OF_WEEK,
Calendar.LONG,
negLocale));
element.addAttribute("dayNameShort", calDate.getDisplayName(
Calendar.DAY_OF_WEEK, Calendar.SHORT, negLocale));
// Quasimodo: END
}
@ -370,7 +399,8 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
}
}
protected void beginAssociation(final DomainObject obj, final String path, final Property property) {
protected void beginAssociation(final DomainObject obj, final String path,
final Property property) {
if (m_wrapObjects) {
final Element element = newElement(m_element, property.getName());
m_elements.push(m_element);
@ -397,17 +427,16 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
}
protected Element newElement(final Element parent, final String name) {
if (m_namespaceURI == null) {
return parent.newChildElement(name);
} else {
final StringBuffer nameBuffer = new StringBuffer();
nameBuffer.append(m_namespacePrefix);
nameBuffer.append(':');
nameBuffer.append(name);
return parent.newChildElement(name, m_namespaceURI);
}
if (m_namespaceURI == null) {
return parent.newChildElement(name);
} else {
final StringBuffer nameBuffer = new StringBuffer();
nameBuffer.append(m_namespacePrefix);
nameBuffer.append(':');
nameBuffer.append(name);
return parent.newChildElement(name, m_namespaceURI);
}
// return m_namespaceURI == null
// ? parent.newChildElement(name)
@ -417,15 +446,15 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
protected Element newElement(final Element parent, final String name, final Element copy) {
if (m_namespaceURI == null) {
return parent.newChildElement(name, copy);
} else {
final StringBuffer nameBuffer = new StringBuffer();
nameBuffer.append(m_namespacePrefix);
nameBuffer.append(':');
nameBuffer.append(name);
return parent.newChildElement(name, copy);
} else {
final StringBuffer nameBuffer = new StringBuffer();
nameBuffer.append(m_namespacePrefix);
nameBuffer.append(':');
nameBuffer.append(name);
return parent.newChildElement(name, m_namespaceURI, copy);
}
return parent.newChildElement(name, m_namespaceURI, copy);
}
// return m_namespaceURI == null
// ? parent.newChildElement(name, copy)

View File

@ -33,6 +33,10 @@
<translation lang="de"> von </translation>
<translation lang="en"> from </translation>
</text>
<text id="navbar/separator">
<translation lang="de"> </translation>
<translation lang="en"> </translation>
</text>
<text id="header/resultinfo/text/begin">
<translation lang="de"> Zeige Ergebnisse </translation>