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/01/31 19:14:27 UTC

svn commit: r617176 - in /xmlgraphics/fop/branches/Temp_ProcessingFeedback: ./ src/codegen/java/org/apache/fop/tools/ src/java/org/apache/fop/events/ src/java/org/apache/fop/events/model/ src/java/org/apache/fop/fo/ test/java/org/apache/fop/events/

Author: jeremias
Date: Thu Jan 31 10:14:19 2008
New Revision: 617176

URL: http://svn.apache.org/viewvc?rev=617176&view=rev
Log:
Renamed FopEvent to Event as suggested by Simon.
EventProducerCollectorTask.java now reads the EventSeverity from a doclet tag.
Added generation of EventProducer translations (including simple merging, no validation, yet)
EventFormatter introduced (only basic functionality, yet).
Added a simple EventListener implementation that uses EventFormatter to convert the events to human-readable, localized messages that are sent to the log via Commons Logging.

Added:
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/merge-translation.xsl   (with props)
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/model2translation.xsl   (with props)
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/Event.java
      - copied, changed from r615779, xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/FopEvent.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.java   (with props)
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.xml   (with props)
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventListener.java
      - copied, changed from r615779, xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/FopEventListener.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/LoggingEventListener.java   (with props)
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/FOValidationEventProducer.java   (with props)
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/EventFormatterTestCase.java   (with props)
Removed:
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/FopEvent.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/FopEventListener.java
Modified:
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/build.xml
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollector.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollectorTask.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/DefaultEventBroadcaster.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventBroadcaster.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventSeverity.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/BasicEventTestCase.java
    xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/TestEventProducer.java

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/build.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/build.xml?rev=617176&r1=617175&r2=617176&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/build.xml (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/build.xml Thu Jan 31 10:14:19 2008
@@ -438,6 +438,11 @@
         <pathelement location="${build.classes.dir}"/>
       </classpath>
     </javac>
+    <copy todir="${build.codegen-classes.dir}">
+      <fileset dir="${src.codegen.dir}/java">
+        <include name="**/*.xsl"/>
+      </fileset>
+    </copy>
     
     <taskdef name="eventResourceGenerator"
       classname="org.apache.fop.tools.EventProducerCollectorTask">
@@ -448,7 +453,9 @@
       </classpath>
     </taskdef>
   
-    <eventResourceGenerator modelfile="${build.gensrc.dir}/org/apache/fop/events/event-model.xml">
+    <eventResourceGenerator
+        modelfile="${build.gensrc.dir}/org/apache/fop/events/event-model.xml"
+        translationfile="${src.java.dir}/org/apache/fop/events/EventFormatter.xml">
       <fileset dir="${src.java.dir}">
         <include name="**/*.java"/>
       </fileset>

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollector.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollector.java?rev=617176&r1=617175&r2=617176&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollector.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollector.java Thu Jan 31 10:14:19 2008
@@ -32,6 +32,7 @@
 
 import com.thoughtworks.qdox.JavaDocBuilder;
 import com.thoughtworks.qdox.model.DefaultDocletTagFactory;
+import com.thoughtworks.qdox.model.DocletTag;
 import com.thoughtworks.qdox.model.DocletTagFactory;
 import com.thoughtworks.qdox.model.JavaClass;
 import com.thoughtworks.qdox.model.JavaMethod;
@@ -116,8 +117,15 @@
             }
             
             //build method model
+            DocletTag tag = method.getTagByName("event.severity");
+            EventSeverity severity;
+            if (tag != null) {
+                severity = EventSeverity.valueOf(tag.getValue());
+            } else { 
+                severity = EventSeverity.INFO;
+            }
             EventMethodModel methodMeta = new EventMethodModel(
-                    method.getName(), EventSeverity.INFO);
+                    method.getName(), severity);
             if (params.length > 1) {
                 for (int j = 1, cj = params.length; j < cj; j++) {
                     JavaParameter p = params[j];

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollectorTask.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollectorTask.java?rev=617176&r1=617175&r2=617176&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollectorTask.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollectorTask.java Thu Jan 31 10:14:19 2008
@@ -20,10 +20,24 @@
 package org.apache.fop.tools;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.Iterator;
 import java.util.List;
 
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.w3c.dom.Node;
+
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.DirectoryScanner;
 import org.apache.tools.ant.Project;
@@ -35,6 +49,7 @@
 
     private List filesets = new java.util.ArrayList();
     private File modelFile;
+    private File translationFile;
     
     /** {@inheritDoc} */
     public void execute() throws BuildException {
@@ -44,6 +59,9 @@
             getModelFile().getParentFile().mkdirs();
             collector.saveModelToXML(getModelFile());
             log("Event model written to " + getModelFile());
+            if (getTranslationFile() != null) {
+                updateTranslationFile();
+            }
         } catch (ClassNotFoundException e) {
             throw new BuildException(e);
         } catch (EventConventionException ece) {
@@ -53,6 +71,66 @@
         }
     }
     
+    private static final String MODEL2TRANSLATION = "model2translation.xsl";
+    private static final String MERGETRANSLATION = "merge-translation.xsl";
+    
+    protected void updateTranslationFile() throws IOException {
+        try {
+            boolean resultExists = getTranslationFile().exists();
+            SAXTransformerFactory tFactory
+                = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
+            
+            //Generate fresh generated translation file as template
+            Source src = new StreamSource(getModelFile());
+            StreamSource xslt1 = new StreamSource(
+                    getClass().getResourceAsStream(MODEL2TRANSLATION));
+            if (xslt1.getInputStream() == null) {
+                throw new FileNotFoundException(MODEL2TRANSLATION + " not found");
+            }
+            DOMResult domres = new DOMResult();
+            Transformer transformer = tFactory.newTransformer(xslt1);
+            transformer.transform(src, domres);
+            final Node generated = domres.getNode();
+            
+            Node sourceDocument;
+            if (resultExists) {
+                //Load existing translation file into memory (because we overwrite it later)
+                src = new StreamSource(getTranslationFile());
+                domres = new DOMResult();
+                transformer = tFactory.newTransformer();
+                transformer.transform(src, domres);
+                sourceDocument = domres.getNode();
+            } else {
+                //Simply use generated as source document
+                sourceDocument = generated;
+            }
+
+            //Generate translation file (with potentially new translations)
+            src = new DOMSource(sourceDocument);
+            Result res = new StreamResult(getTranslationFile());
+            StreamSource xslt2 = new StreamSource(
+                    getClass().getResourceAsStream(MERGETRANSLATION));
+            if (xslt2.getInputStream() == null) {
+                throw new FileNotFoundException(MERGETRANSLATION + " not found");
+            }
+            transformer = tFactory.newTransformer(xslt2);
+            transformer.setURIResolver(new URIResolver() {
+                public Source resolve(String href, String base) throws TransformerException {
+                    if ("my:dom".equals(href)) {
+                        return new DOMSource(generated);
+                    }
+                    return null;
+                }
+            });
+            if (resultExists) {
+                transformer.setParameter("generated-url", "my:dom");
+            }
+            transformer.transform(src, res);
+        } catch (TransformerException te) {
+            throw new IOException(te.getMessage());
+        }
+    }
+
     protected void processFileSets(EventProducerCollector collector)
             throws IOException, EventConventionException, ClassNotFoundException {
         Iterator iter = filesets.iterator();
@@ -81,6 +159,14 @@
         return this.modelFile;
     }
     
+    public void setTranslationFile(File f) {
+        this.translationFile = f;
+    }
+    
+    public File getTranslationFile() {
+        return this.translationFile;
+    }
+    
     public static void main(String[] args) {
         try {
             Project project = new Project();
@@ -100,6 +186,7 @@
             targetDir.mkdirs();
             
             generator.setModelFile(new File("D:/out.xml"));
+            generator.setTranslationFile(new File("D:/out1.xml"));
             generator.execute();
         } catch (Exception e) {
             e.printStackTrace();

Added: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/merge-translation.xsl
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/merge-translation.xsl?rev=617176&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/merge-translation.xsl (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/merge-translation.xsl Thu Jan 31 10:14:19 2008
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- $Id$ -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+  <xsl:output indent="yes" method="xml" encoding="UTF-8"/>
+
+  <xsl:param name="generated-url" select="''"/>
+  
+  <xsl:template match="catalogue">
+    <catalogue>
+      <xsl:attribute name="xml:lang"><xsl:value-of select="@xml:lang"/></xsl:attribute>
+      <xsl:apply-templates/>
+      <xsl:if test="$generated-url != ''">
+        <xsl:variable name="generated" select="document($generated-url)"/>
+        <xsl:call-template name="add-new-messages">
+          <xsl:with-param name="existing" select="."/>
+          <xsl:with-param name="new" select="$generated/catalogue"/>
+        </xsl:call-template>
+      </xsl:if>
+    </catalogue>
+  </xsl:template>
+  
+  <xsl:template name="add-new-messages">
+    <xsl:param name="existing"/>
+    <xsl:param name="new"/>
+    <xsl:for-each select="$new/message">
+      <xsl:variable name="k" select="@key"/>
+      <xsl:if test="not(boolean($existing/message[@key = $k]))">
+        <xsl:apply-templates select="."></xsl:apply-templates>
+      </xsl:if>
+    </xsl:for-each>
+  </xsl:template>  
+  
+  <xsl:template match="@*|node()">
+    <xsl:copy>
+      <xsl:apply-templates select="@*|node()"/>
+    </xsl:copy>
+  </xsl:template>
+
+</xsl:stylesheet>

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/merge-translation.xsl
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/merge-translation.xsl
------------------------------------------------------------------------------
    svn:keywords = Id

Added: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/model2translation.xsl
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/model2translation.xsl?rev=617176&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/model2translation.xsl (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/model2translation.xsl Thu Jan 31 10:14:19 2008
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- $Id$ -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+  <xsl:output indent="yes" method="xml" encoding="UTF-8"/>
+
+  <xsl:template match="event-model">
+    <catalogue>
+      <xsl:attribute name="xml:lang">en</xsl:attribute>
+      <xsl:apply-templates select="//method"></xsl:apply-templates>
+    </catalogue>
+  </xsl:template>
+  
+  <xsl:template match="method">
+    <message>
+      <xsl:attribute name="key"><xsl:value-of select="../@name"/>.<xsl:value-of select="@name"/></xsl:attribute>
+    </message>
+  </xsl:template>
+  
+</xsl:stylesheet>

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/model2translation.xsl
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/model2translation.xsl
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/DefaultEventBroadcaster.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/DefaultEventBroadcaster.java?rev=617176&r1=617175&r2=617176&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/DefaultEventBroadcaster.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/DefaultEventBroadcaster.java Thu Jan 31 10:14:19 2008
@@ -43,12 +43,12 @@
     private List listeners = new java.util.ArrayList();
     
     /** {@inheritDoc} */
-    public void addFopEventListener(FopEventListener listener) {
+    public void addFopEventListener(EventListener listener) {
         this.listeners.add(listener);
     }
 
     /** {@inheritDoc} */
-    public void removeFopEventListener(FopEventListener listener) {
+    public void removeFopEventListener(EventListener listener) {
         this.listeners.remove(listener);
     }
 
@@ -58,9 +58,9 @@
     }
     
     /** {@inheritDoc} */
-    public void broadcastEvent(FopEvent event) {
+    public void broadcastEvent(Event event) {
         for (int i = 0, c = getListenerCount(); i < c; i++) {
-            FopEventListener listener = (FopEventListener)this.listeners.get(i);
+            EventListener listener = (EventListener)this.listeners.get(i);
             listener.processEvent(event);
         }
     }
@@ -90,7 +90,7 @@
             IOUtils.closeQuietly(in);
         }
     }
-    
+
     public EventProducer getEventProducerFor(Class clazz) {
         if (!EventProducer.class.isAssignableFrom(clazz)) {
             throw new IllegalArgumentException(
@@ -136,7 +136,7 @@
                             params.put(param.getName(), args[i]);
                             i++;
                         }
-                        FopEvent ev = new FopEvent(args[0], eventID, params);
+                        Event ev = new Event(args[0], eventID, methodModel.getSeverity(), params);
                         broadcastEvent(ev);
                         return null;
                     }

Copied: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/Event.java (from r615779, xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/FopEvent.java)
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/Event.java?p2=xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/Event.java&p1=xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/FopEvent.java&r1=615779&r2=617176&rev=617176&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/FopEvent.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/Event.java Thu Jan 31 10:14:19 2008
@@ -23,19 +23,27 @@
 import java.util.EventObject;
 import java.util.Map;
 
-public class FopEvent extends EventObject {
+import org.apache.fop.events.model.EventSeverity;
+
+public class Event extends EventObject {
 
     private String eventID;
+    private EventSeverity severity;
     private Map params;
     
-    public FopEvent(Object source, String eventID, Map params) {
+    public Event(Object source, String eventID, EventSeverity severity, Map params) {
         super(source);
         this.eventID = eventID;
+        this.severity = severity;
         this.params = params;
     }
     
     public String getEventID() {
         return this.eventID;
+    }
+    
+    public EventSeverity getSeverity() {
+        return this.severity;
     }
 
     public Object getParam(String key) {

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventBroadcaster.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventBroadcaster.java?rev=617176&r1=617175&r2=617176&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventBroadcaster.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventBroadcaster.java Thu Jan 31 10:14:19 2008
@@ -22,13 +22,13 @@
 
 public interface EventBroadcaster {
 
-    void addFopEventListener(FopEventListener listener);
+    void addFopEventListener(EventListener listener);
     
-    void removeFopEventListener(FopEventListener listener);
+    void removeFopEventListener(EventListener listener);
  
     int getListenerCount();
     
-    void broadcastEvent(FopEvent event);
+    void broadcastEvent(Event event);
     
     EventProducer getEventProducerFor(Class clazz);
     

Added: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.java?rev=617176&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.java (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.java Thu Jan 31 10:14:19 2008
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.events;
+
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.fop.util.XMLResourceBundle;
+
+/**
+ * Converts events into human-readable, localized messages.
+ */
+public class EventFormatter {
+
+    private static ResourceBundle defaultBundle = XMLResourceBundle.getXMLBundle(
+            EventFormatter.class.getName(), EventFormatter.class.getClassLoader());
+    
+    public static String format(Event event) {
+        return format(event, defaultBundle);
+    }
+    
+    public static String format(Event event, ResourceBundle bundle) {
+        String template = bundle.getString(event.getEventID());
+        return format(event, template);
+    }
+
+    public static String format(Event event, String template) {
+        Map params = event.getParams();
+        Pattern p = Pattern.compile("\\$\\{[^\\}]+\\}");
+        Matcher m = p.matcher(template);
+        StringBuffer sb = new StringBuffer();
+        while (m.find()) {
+            String formatElement = m.group();
+            formatElement = formatElement.substring(2, formatElement.length() - 1);
+            //TODO Handle conditional sub-formats
+            //TODO Add advanced formatting like in MessageFormat here
+            String key = formatElement;
+            if (!params.containsKey(key)) {
+                throw new IllegalArgumentException(
+                        "Message template contains unsupported variable key: " + key);
+            }
+            Object obj = params.get(key);
+            String value;
+            if (obj == null) {
+                value = "";
+            } else {
+                value = obj.toString();
+            }
+            m.appendReplacement(sb, value);
+        }
+        m.appendTail(sb);
+        
+        return sb.toString();
+    }
+
+}

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.xml?rev=617176&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.xml (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.xml Thu Jan 31 10:14:19 2008
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+    
+    http://www.apache.org/licenses/LICENSE-2.0
+    
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<!-- $Id$ -->
+<catalogue xml:lang="en">
+  <message key="org.apache.fop.fo.FOValidationEventProducer.missingProperty">Element "{elementName}" is missing required property "{propertyName}"!</message>
+</catalogue>

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventFormatter.xml
------------------------------------------------------------------------------
    svn:keywords = Id

Copied: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventListener.java (from r615779, xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/FopEventListener.java)
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventListener.java?p2=xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventListener.java&p1=xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/FopEventListener.java&r1=615779&r2=617176&rev=617176&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/FopEventListener.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/EventListener.java Thu Jan 31 10:14:19 2008
@@ -19,10 +19,8 @@
 
 package org.apache.fop.events;
 
-import java.util.EventListener;
+public interface EventListener extends java.util.EventListener {
 
-public interface FopEventListener extends EventListener {
-
-    void processEvent(FopEvent event);
+    void processEvent(Event event);
     
 }

Added: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/LoggingEventListener.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/LoggingEventListener.java?rev=617176&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/LoggingEventListener.java (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/LoggingEventListener.java Thu Jan 31 10:14:19 2008
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.events;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.fop.events.model.EventSeverity;
+
+/**
+ * EventListener implementation that redirects events to Commons Logging. The events are
+ * converted to localized messages.
+ */
+public class LoggingEventListener implements EventListener {
+
+    /** Default logger instance */
+    private static Log defaultLog = LogFactory.getLog(LoggingEventListener.class);
+    
+    private Log log;
+    private boolean skipFatal;
+    
+    public LoggingEventListener() {
+        this(defaultLog);
+    }
+    
+    public LoggingEventListener(Log log) {
+        this(log, true);
+    }
+    
+    public LoggingEventListener(Log log, boolean skipFatal) {
+        this.log = log;
+        this.skipFatal = skipFatal;
+    }
+    
+    public Log getLog() {
+        return this.log;
+    }
+    
+    /** {@inheritDoc} */
+    public void processEvent(Event event) {
+        String msg = EventFormatter.format(event);
+        EventSeverity severity = event.getSeverity();
+        if (severity == EventSeverity.INFO) {
+            log.info(msg);
+        } else if (severity == EventSeverity.WARN) {
+            log.warn(msg);
+        } else if (severity == EventSeverity.ERROR) {
+            log.error(msg);
+        } else if (severity == EventSeverity.FATAL) {
+            if (!skipFatal) {
+                log.fatal(msg);
+            }
+        } else {
+            assert false;
+        }
+    }
+
+}

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/LoggingEventListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/LoggingEventListener.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventSeverity.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventSeverity.java?rev=617176&r1=617175&r2=617176&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventSeverity.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventSeverity.java Thu Jan 31 10:14:19 2008
@@ -57,13 +57,13 @@
      * @return the enumeration object
      */
     public static EventSeverity valueOf(String name) {
-        if (INFO.getName().equals(name)) {
+        if (INFO.getName().equalsIgnoreCase(name)) {
             return INFO;
-        } else if (WARN.getName().equals(name)) {
+        } else if (WARN.getName().equalsIgnoreCase(name)) {
             return WARN;
-        } else if (ERROR.getName().equals(name)) {
+        } else if (ERROR.getName().equalsIgnoreCase(name)) {
             return ERROR;
-        } else if (FATAL.getName().equals(name)) {
+        } else if (FATAL.getName().equalsIgnoreCase(name)) {
             return FATAL;
         } else {
             throw new IllegalArgumentException("Illegal value for enumeration: " + name);

Added: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/FOValidationEventProducer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/FOValidationEventProducer.java?rev=617176&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/FOValidationEventProducer.java (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/FOValidationEventProducer.java Thu Jan 31 10:14:19 2008
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.fo;
+
+import org.apache.fop.events.EventProducer;
+
+public interface FOValidationEventProducer extends EventProducer {
+
+    /**
+     * Express joy about something.
+     * @param source the event source
+     * @param node the context node
+     * @param elementName the name of the context node
+     * @param propertyName the name of the missing property
+     * @event.severity FATAL
+     */
+    void missingProperty(Object source, FONode node, String elementName, String propertyName);
+}

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/FOValidationEventProducer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/fo/FOValidationEventProducer.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/BasicEventTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/BasicEventTestCase.java?rev=617176&r1=617175&r2=617176&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/BasicEventTestCase.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/BasicEventTestCase.java Thu Jan 31 10:14:19 2008
@@ -21,6 +21,8 @@
 
 import junit.framework.TestCase;
 
+import org.apache.fop.events.model.EventSeverity;
+
 public class BasicEventTestCase extends TestCase {
 
     static {
@@ -36,8 +38,8 @@
         broadcaster.addFopEventListener(listener);
         assertEquals(1, broadcaster.getListenerCount());
         
-        FopEvent ev = new FopEvent(this, "123",
-                FopEvent.paramsBuilder()
+        Event ev = new Event(this, "123", EventSeverity.INFO,
+                Event.paramsBuilder()
                     .param("reason", "I'm tired")
                     .param("blah", new Integer(23))
                     .build());
@@ -46,6 +48,7 @@
         ev = listener.event;
         assertNotNull(ev);
         assertEquals("123", listener.event.getEventID());
+        assertEquals(EventSeverity.INFO, listener.event.getSeverity());
         assertEquals("I'm tired", ev.getParam("reason"));
         assertEquals(new Integer(23), ev.getParam("blah"));
         
@@ -67,10 +70,11 @@
         TestEventProducer producer = TestEventProducer.Factory.create(broadcaster);
         producer.complain(this, "I'm tired", 23);
         
-        FopEvent ev = listener.event;
+        Event ev = listener.event;
         assertNotNull(ev);
         assertEquals("org.apache.fop.events.TestEventProducer.complain",
                 listener.event.getEventID());
+        assertEquals(EventSeverity.WARN, listener.event.getSeverity());
         assertEquals("I'm tired", ev.getParam("reason"));
         assertEquals(new Integer(23), ev.getParam("blah"));
         
@@ -81,11 +85,11 @@
         broadcaster.broadcastEvent(ev);
     }
     
-    private class MyEventListener implements FopEventListener {
+    private class MyEventListener implements EventListener {
 
-        private FopEvent event;
+        private Event event;
         
-        public void processEvent(FopEvent event) {
+        public void processEvent(Event event) {
             if (this.event != null) {
                 fail("Multiple events received");
             }

Added: xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/EventFormatterTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/EventFormatterTestCase.java?rev=617176&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/EventFormatterTestCase.java (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/EventFormatterTestCase.java Thu Jan 31 10:14:19 2008
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.events;
+
+import junit.framework.TestCase;
+
+import org.apache.fop.events.model.EventSeverity;
+
+/**
+ * Tests for EventFormatter.
+ */
+public class EventFormatterTestCase extends TestCase {
+
+    public void testFormatting() throws Exception {
+        Event ev;
+        String msg;
+        
+        ev = new Event(this, "org.apache.fop.fo.FOValidationEventProducer.missingProperty",
+                EventSeverity.FATAL, Event.paramsBuilder()
+                .param("node", new Object())
+                .param("elementName", "fo:external-graphic")
+                .param("propertyName", "src")
+                .build());
+        String template
+            = "Element \"${elementName}\" is missing required property \"${propertyName}\"!";
+        msg = EventFormatter.format(ev, template);
+        assertEquals("Element \"fo:external-graphic\" is missing required property \"src\"!", msg);
+    }
+    
+}

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/EventFormatterTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/EventFormatterTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/TestEventProducer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/TestEventProducer.java?rev=617176&r1=617175&r2=617176&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/TestEventProducer.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/TestEventProducer.java Thu Jan 31 10:14:19 2008
@@ -21,8 +21,21 @@
 
 public interface TestEventProducer extends EventProducer {
 
+    /**
+     * Complain about something.
+     * @param source the event source
+     * @param reason the reason for the complaint
+     * @param blah the complaint
+     * @event.severity WARN
+     */
     void complain(Object source, String reason, int blah);
     
+    /**
+     * Express joy about something.
+     * @param source the event source
+     * @param what the cause for the joy
+     * @event.severity INFO
+     */
     void enjoy(Object source, String what);
  
     public class Factory {



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