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]

Reply via email to