You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by je...@apache.org on 2008/03/05 15:22:07 UTC

svn commit: r633855 - in /xmlgraphics/fop/branches/Temp_ProcessingFeedback: src/java/org/apache/fop/util/AdvancedMessageFormat.java test/java/org/apache/fop/util/AdvancedMessageFormatTestCase.java

Author: jeremias
Date: Wed Mar  5 06:21:57 2008
New Revision: 633855

URL: http://svn.apache.org/viewvc?rev=633855&view=rev
Log:
Added support for additional field styles:
{<fieldname>,if,<true-text>,<false-text>}
{<fieldname>,equals,<test-string>,<true-text>,<false-text>}

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=633855&r1=633854&r2=633855&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 Wed Mar  5 06:21:57 2008
@@ -41,6 +41,7 @@
  */
 public class AdvancedMessageFormat {
 
+    private static final String COMMA_SEPARATOR_REGEX = "(?<!\\\\),";
     private CompositePart rootPart;
     
     /**
@@ -116,8 +117,21 @@
     }
     
     private Part parseField(String field) {
-        //TODO Add advanced formatting like in MessageFormat here
-        return new SimpleFieldPart(field);
+        String[] parts = field.split(COMMA_SEPARATOR_REGEX, 3);
+        if (parts.length == 1) {
+            return new SimpleFieldPart(parts[0]);
+        } else {
+            String format = parts[1];
+            if (parts.length == 2) {
+                throw new IllegalArgumentException("Pattern must have three parts!");
+            }
+            if ("if".equals(format)) {
+                return new IfFieldPart(parts[0], parts[2]);
+            } else if ("equals".equals(format)) {
+                return new EqualsFieldPart(parts[0], parts[2]);
+            }
+            return new SimpleFieldPart(parts[0]);
+        }
     }
 
     /**
@@ -141,7 +155,7 @@
         boolean supportsObject(Object obj);
     }
     
-    private class TextPart implements Part {
+    private static class TextPart implements Part {
         
         private String text;
         
@@ -213,7 +227,98 @@
         }
     }
     
-    private class CompositePart implements Part {
+    private static class IfFieldPart implements Part {
+        
+        protected String fieldName;
+        protected String ifValue;
+        protected String elseValue;
+        
+        public IfFieldPart(String fieldName, String values) {
+            this.fieldName = fieldName;
+            parseValues(values);
+        }
+
+        protected void parseValues(String values) {
+            String[] parts = values.split(COMMA_SEPARATOR_REGEX, 2);
+            if (parts.length == 2) {
+                ifValue = unescapeComma(parts[0]);
+                elseValue = unescapeComma(parts[1]);
+            } else {
+                ifValue = unescapeComma(values);
+            }
+        }
+        
+        public void write(StringBuffer sb, Map params) {
+            boolean isTrue = isTrue(params);
+            if (isTrue) {
+                sb.append(ifValue);
+            } else if (elseValue != null) {
+                sb.append(elseValue);
+            }
+        }
+
+        protected boolean isTrue(Map params) {
+            Object obj = params.get(fieldName);
+            boolean isTrue;
+            if (obj instanceof Boolean) {
+                return ((Boolean)obj).booleanValue();
+            } else {
+                return (obj != null);
+            }
+        }
+
+        public boolean isGenerated(Map params) {
+            return isTrue(params) || (elseValue != null);
+        }
+        
+        /** {@inheritDoc} */
+        public String toString() {
+            return "{" + this.fieldName + ", if...}";
+        }
+    }
+    
+    private static class EqualsFieldPart extends IfFieldPart {
+        
+        private String equalsValue;
+        
+        public EqualsFieldPart(String fieldName, String values) {
+            super(fieldName, values);
+        }
+
+        /** {@inheritDoc} */
+        protected void parseValues(String values) {
+            String[] parts = values.split(COMMA_SEPARATOR_REGEX, 3);
+            this.equalsValue = parts[0];
+            if (parts.length == 1) {
+                throw new IllegalArgumentException(
+                        "'equals' format must have at least 2 parameters");
+            }
+            if (parts.length == 3) {
+                ifValue = unescapeComma(parts[1]);
+                elseValue = unescapeComma(parts[2]);
+            } else {
+                ifValue = unescapeComma(parts[1]);
+            }
+        }
+        
+        protected boolean isTrue(Map params) {
+            Object obj = params.get(fieldName);
+            if (obj != null) {
+                return String.valueOf(obj).equals(this.equalsValue);
+            } else {
+                return false;
+            }
+        }
+
+        /** {@inheritDoc} */
+        public String toString() {
+            return "{" + this.fieldName + ", equals " + this.equalsValue + "}";
+        }
+        
+    }
+    
+    
+    private static class CompositePart implements Part {
         
         private List parts = new java.util.ArrayList();
         private boolean conditional;
@@ -266,5 +371,9 @@
             return obj instanceof Locator;
         }
         
+    }
+
+    private static String unescapeComma(String string) {
+        return string.replaceAll("\\\\,", ",");
     }
 }

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=633855&r1=633854&r2=633855&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 Wed Mar  5 06:21:57 2008
@@ -25,6 +25,8 @@
 
 import org.xml.sax.helpers.LocatorImpl;
 
+import org.apache.fop.events.model.EventSeverity;
+
 /**
  * Tests for EventFormatter.
  */
@@ -75,4 +77,68 @@
         assertEquals("Here\'s a Locator: 12:7", msg);
     }
     
+    public void testIfFormatting() throws Exception {
+        String msg;
+        AdvancedMessageFormat format;
+        
+        format = new AdvancedMessageFormat("You are{isBad,if, not} nice!");
+
+        Map params = new java.util.HashMap();
+
+        params.put("isBad", Boolean.FALSE);
+        msg = format.format(params);
+        assertEquals("You are nice!", msg);
+
+        params.put("isBad", Boolean.TRUE);
+        msg = format.format(params);
+        assertEquals("You are not nice!", msg);
+
+        format = new AdvancedMessageFormat("You are{isGood,if, very, not so} nice!");
+
+        params = new java.util.HashMap();
+
+        msg = format.format(params); //isGood is missing
+        assertEquals("You are not so nice!", msg);
+
+        params.put("isGood", Boolean.FALSE);
+        msg = format.format(params);
+        assertEquals("You are not so nice!", msg);
+
+        params.put("isGood", Boolean.TRUE);
+        msg = format.format(params);
+        assertEquals("You are very nice!", msg);
+
+        format = new AdvancedMessageFormat("You are{isGood,if, very\\, very} nice!");
+
+        params = new java.util.HashMap();
+
+        msg = format.format(params); //isGood is missing
+        assertEquals("You are nice!", msg);
+
+        params.put("isGood", Boolean.FALSE);
+        msg = format.format(params);
+        assertEquals("You are nice!", msg);
+
+        params.put("isGood", Boolean.TRUE);
+        msg = format.format(params);
+        assertEquals("You are very, very nice!", msg);
+    }
+    
+    public void testEqualsFormatting() throws Exception {
+        String msg;
+        AdvancedMessageFormat format;
+        
+        format = new AdvancedMessageFormat(
+                "Error{severity,equals,EventSeverity:FATAL,,\nSome explanation!}");
+
+        Map params = new java.util.HashMap();
+
+        params.put("severity", EventSeverity.FATAL);
+        msg = format.format(params);
+        assertEquals("Error", msg);
+
+        params.put("severity", EventSeverity.WARN);
+        msg = format.format(params);
+        assertEquals("Error\nSome explanation!", msg);
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org