Author: jeremias
Date: Tue Feb 5 08:07:08 2008
New Revision: 618682
URL: http://svn.apache.org/viewvc?rev=618682&view=rev
Log:
Add support for special object formatters (where toString() isn't good enough).
ATM, it's hard-coded but could later be hooked into dynamic discovery if we
have multiple such formatters. The SAX Locator is the only example for now.
Modified:
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/util/AdvancedMessageFormat.java
xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/util/AdvancedMessageFormatTestCase.java
Modified:
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/util/AdvancedMessageFormat.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/util/AdvancedMessageFormat.java?rev=618682&r1=618681&r2=618682&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/util/AdvancedMessageFormat.java
(original)
+++
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/util/AdvancedMessageFormat.java
Tue Feb 5 08:07:08 2008
@@ -23,6 +23,8 @@
import java.util.List;
import java.util.Map;
+import org.xml.sax.Locator;
+
/**
* Formats messages based on a template and with a set of named parameters.
This is similar to
* [EMAIL PROTECTED] java.util.MessageFormat} but uses named parameters and
supports conditional sub-groups.
@@ -30,11 +32,21 @@
* Example:
* </p>
* <p><code>Missing field "{fieldName}"[ at location: {location}]!</code></p>
+ * <ul>
+ * <li>Curly brackets ("{}") are used for fields.</li>
+ * <li>Square brackets ("[]") are used to delimit conditional sub-groups. A
sub-group is
+ * conditional when all fields inside the sub-group have a null value. In
the case, everything
+ * between the brackets is skipped.</li>
+ * </ul>
*/
public class AdvancedMessageFormat {
private CompositePart rootPart;
+ /**
+ * Construct a new message format.
+ * @param pattern the message format pattern.
+ */
public AdvancedMessageFormat(CharSequence pattern) {
parsePattern(pattern);
}
@@ -45,7 +57,8 @@
parseInnerPattern(pattern, rootPart, sb, 0);
}
- private int parseInnerPattern(CharSequence pattern, CompositePart parent,
StringBuffer sb, int start) {
+ private int parseInnerPattern(CharSequence pattern, CompositePart parent,
+ StringBuffer sb, int start) {
assert sb.length() == 0;
int i = start;
int len = pattern.length();
@@ -123,6 +136,11 @@
boolean isGenerated(Map params);
}
+ private interface ObjectFormatter {
+ void format(StringBuffer sb, Object obj);
+ boolean supportsObject(Object obj);
+ }
+
private class TextPart implements Part {
private String text;
@@ -145,7 +163,13 @@
}
}
- private class SimpleFieldPart implements Part {
+ private static class SimpleFieldPart implements Part {
+
+ private static final List OBJECT_FORMATTERS = new
java.util.ArrayList();
+
+ static {
+ OBJECT_FORMATTERS.add(new LocatorFormatter());
+ }
private String fieldName;
@@ -159,13 +183,23 @@
"Message pattern contains unsupported field name: " +
fieldName);
}
Object obj = params.get(fieldName);
- String value;
- if (obj == null) {
- value = "";
+ if (obj instanceof String) {
+ sb.append(obj);
} else {
- value = obj.toString();
+ boolean handled = false;
+ Iterator iter = OBJECT_FORMATTERS.iterator();
+ while (iter.hasNext()) {
+ ObjectFormatter formatter = (ObjectFormatter)iter.next();
+ if (formatter.supportsObject(obj)) {
+ formatter.format(sb, obj);
+ handled = true;
+ break;
+ }
+ }
+ if (!handled) {
+ sb.append(obj.toString());
+ }
}
- sb.append(value);
}
public boolean isGenerated(Map params) {
@@ -219,5 +253,18 @@
public String toString() {
return this.parts.toString();
}
+ }
+
+ private static class LocatorFormatter implements ObjectFormatter {
+
+ public void format(StringBuffer sb, Object obj) {
+ Locator loc = (Locator)obj;
+
sb.append(loc.getLineNumber()).append(":").append(loc.getColumnNumber());
+ }
+
+ public boolean supportsObject(Object obj) {
+ return obj instanceof Locator;
+ }
+
}
}
Modified:
xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/util/AdvancedMessageFormatTestCase.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/util/AdvancedMessageFormatTestCase.java?rev=618682&r1=618681&r2=618682&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/util/AdvancedMessageFormatTestCase.java
(original)
+++
xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/util/AdvancedMessageFormatTestCase.java
Tue Feb 5 08:07:08 2008
@@ -23,6 +23,8 @@
import junit.framework.TestCase;
+import org.xml.sax.helpers.LocatorImpl;
+
/**
* Tests for EventFormatter.
*/
@@ -53,6 +55,24 @@
format = new AdvancedMessageFormat(pattern);
msg = format.format(params);
assertEquals("Testing {escaped [characters], now a normal field
fo:external-graphic!", msg);
+ }
+
+ public void testObjectFormatting() throws Exception {
+ String msg;
+ AdvancedMessageFormat format;
+
+ String pattern
+ = "Here's a Locator: {locator}";
+ format = new AdvancedMessageFormat(pattern);
+
+ Map params = new java.util.HashMap();
+ LocatorImpl loc = new LocatorImpl();
+ loc.setColumnNumber(7);
+ loc.setLineNumber(12);
+ params.put("locator", loc);
+
+ msg = format.format(params);
+ assertEquals("Here\'s a Locator: 12:7", msg);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]