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/25 18:25:02 UTC
svn commit: r615278 - in /xmlgraphics/fop/branches/Temp_ProcessingFeedback:
./ src/codegen/java/ src/codegen/java/org/ src/codegen/java/org/apache/
src/codegen/java/org/apache/fop/ src/codegen/java/org/apache/fop/tools/
src/java/org/apache/fop/events/ ...
Author: jeremias
Date: Fri Jan 25 09:25:00 2008
New Revision: 615278
URL: http://svn.apache.org/viewvc?rev=615278&view=rev
Log:
EventProducer interfaces now operational.
Added:
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventConventionException.java (with props)
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollector.java (with props)
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollectorTask.java (with props)
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/event-model.xml (with props)
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventModelParser.java (with props)
xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/test-event-model.xml (with props)
Modified:
xmlgraphics/fop/branches/Temp_ProcessingFeedback/build.xml
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/EventMethodModel.java
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventModel.java
xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventProducerModel.java
xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/UtilityCodeTestSuite.java
xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/BasicEventTestCase.java
Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/build.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/build.xml?rev=615278&r1=615277&r2=615278&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/build.xml (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/build.xml Fri Jan 25 09:25:00 2008
@@ -118,13 +118,15 @@
</fileset>
</path>
- <path id="libs-run-classpath">
- <fileset dir="${basedir}/lib">
- <include name="*.jar"/>
- </fileset>
- <fileset dir="${optional.lib.dir}">
+ <path id="libs-build-tools-classpath">
+ <path refid="libs-build-classpath"/>
+ <fileset dir="${basedir}/lib/build">
<include name="*.jar"/>
</fileset>
+ </path>
+
+ <path id="libs-run-classpath">
+ <path refid="libs-build-classpath"/>
<fileset dir="${basedir}/build">
<include name="fop.jar"/>
<include name="fop-hyph.jar" />
@@ -393,7 +395,7 @@
<!-- =================================================================== -->
<!-- Compiles the source directory -->
<!-- =================================================================== -->
- <target name="compile-java" depends="init, codegen" description="Compiles the source code">
+ <target name="compile-java" depends="init, codegen">
<!-- create directories -->
<mkdir dir="${build.classes.dir}"/>
<javac destdir="${build.classes.dir}" fork="${javac.fork}" debug="${javac.debug}"
@@ -409,10 +411,61 @@
<patternset refid="exclude-jimi"/>
<classpath refid="libs-build-classpath"/>
</javac>
+
+ <mkdir dir="${build.sandbox-classes.dir}"/>
+ <javac destdir="${build.sandbox-classes.dir}" fork="${javac.fork}" debug="${javac.debug}"
+ deprecation="${javac.deprecation}" optimize="${javac.optimize}"
+ source="${javac.source}" target="${javac.target}">
+ <src path="${src.sandbox.dir}"/>
+ <patternset includes="**/*.java"/>
+ <patternset refid="exclude-jai"/>
+ <classpath>
+ <path refid="libs-build-classpath"/>
+ <pathelement location="${build.classes.dir}"/>
+ </classpath>
+ </javac>
+ </target>
+
+ <target name="resourcegen" depends="compile-java">
+ <mkdir dir="${build.codegen-classes.dir}"/>
+ <javac destdir="${build.codegen-classes.dir}" fork="${javac.fork}" debug="${javac.debug}"
+ deprecation="${javac.deprecation}" optimize="${javac.optimize}"
+ source="${javac.source}" target="${javac.target}">
+ <src path="${src.codegen.dir}/java"/>
+ <patternset includes="**/*.java"/>
+ <classpath>
+ <path refid="libs-build-tools-classpath"/>
+ <pathelement location="${build.classes.dir}"/>
+ </classpath>
+ </javac>
+
+ <taskdef name="eventResourceGenerator"
+ classname="org.apache.fop.tools.EventProducerCollectorTask">
+ <classpath>
+ <path refid="libs-build-tools-classpath"/>
+ <pathelement location="${build.classes.dir}"/>
+ <pathelement location="${build.codegen-classes.dir}"/>
+ </classpath>
+ </taskdef>
+
+ <eventResourceGenerator modelfile="${src.java.dir}/org/apache/fop/events/event-model.xml">
+ <fileset dir="${src.java.dir}">
+ <include name="**/*.java"/>
+ </fileset>
+ </eventResourceGenerator>
+ <eventResourceGenerator modelfile="${basedir}/test/java/org/apache/fop/events/test-event-model.xml">
+ <fileset dir="${basedir}/test/java">
+ <include name="**/*.java"/>
+ </fileset>
+ </eventResourceGenerator>
+ </target>
+
+ <target name="compile-copy-resources" depends="resourcegen">
<copy todir="${build.classes.dir}">
<fileset dir="${src.java.dir}">
<include name="META-INF/**"/>
<include name="**/*.icm"/>
+ <include name="**/*.xml"/>
<include name="**/*.LICENSE.txt"/>
</fileset>
</copy>
@@ -424,31 +477,22 @@
<copy todir="${build.viewer.images.dir}">
<fileset dir="${src.viewer.images.dir}"/>
</copy>
-
- <mkdir dir="${build.sandbox-classes.dir}"/>
- <javac destdir="${build.sandbox-classes.dir}" fork="${javac.fork}" debug="${javac.debug}"
- deprecation="${javac.deprecation}" optimize="${javac.optimize}"
- source="${javac.source}" target="${javac.target}">
- <src path="${src.sandbox.dir}"/>
- <patternset includes="**/*.java"/>
- <patternset refid="exclude-jai"/>
- <classpath>
- <path refid="libs-build-classpath"/>
- <pathelement location="${build.classes.dir}"/>
- </classpath>
- </javac>
+
+ <!-- sandbox -->
<copy todir="${build.sandbox-classes.dir}">
<fileset dir="${src.sandbox.dir}">
<include name="META-INF/**"/>
</fileset>
</copy>
+
</target>
-
+
+ <target name="compile" depends="compile-java, compile-copy-resources" description="Compiles the source code"/>
<!-- =================================================================== -->
<!-- compiles hyphenation patterns -->
<!-- =================================================================== -->
- <target name="compile-hyphenation" depends="compile-java">
+ <target name="compile-hyphenation" depends="compile">
<path id="hyph-classpath">
<path refid="libs-build-classpath"/>
<pathelement location="${build.classes.dir}"/>
@@ -486,13 +530,13 @@
<!-- main FOP JARs -->
<!-- =================================================================== -->
- <target name="uptodate-jar-main" depends="compile-java">
+ <target name="uptodate-jar-main" depends="compile">
<uptodate property="jar.main.uptodate" targetfile="${build.dir}/fop.jar">
<srcfiles dir= "${build.classes.dir}"/>
</uptodate>
</target>
- <target name="jar-main" depends="compile-java,uptodate-jar-main" description="Generates the main jar file" unless="jar.main.uptodate">
+ <target name="jar-main" depends="compile,uptodate-jar-main" description="Generates the main jar file" unless="jar.main.uptodate">
<tstamp>
<format property="ts" pattern="yyyyMMdd-HHmmss-z"/>
</tstamp>
@@ -521,13 +565,13 @@
</jar>
</target>
- <target name="uptodate-jar-sandbox" depends="compile-java">
+ <target name="uptodate-jar-sandbox" depends="compile">
<uptodate property="jar.sandbox.uptodate" targetfile="${build.dir}/fop-sandbox.jar">
<srcfiles dir= "${build.sandbox-classes.dir}"/>
</uptodate>
</target>
- <target name="jar-sandbox" depends="compile-java,uptodate-jar-sandbox" description="Generates the sandbox jar file" unless="jar.sandbox.uptodate">
+ <target name="jar-sandbox" depends="compile,uptodate-jar-sandbox" description="Generates the sandbox jar file" unless="jar.sandbox.uptodate">
<tstamp>
<format property="ts" pattern="yyyyMMdd-HHmmss-z"/>
</tstamp>
@@ -643,14 +687,14 @@
<include name="xmlgraphics-commons*.jar"/>
</fileset>
- <target name="uptodate-transcoder-pkg" depends="compile-java">
+ <target name="uptodate-transcoder-pkg" depends="compile">
<uptodate property="transcoder.pkg.uptodate" targetfile="${build.dir}/fop-transcoder.jar">
<srcfiles refid="transcoder-classes-files"/>
<srcfiles refid="transcoder-lib-files"/>
</uptodate>
</target>
- <target name="transcoder-pkg" depends="uptodate-transcoder-pkg, compile-java" description="Generates the jar for the transcoder package for Batik" unless="transcoder.pkg.uptodate">
+ <target name="transcoder-pkg" depends="uptodate-transcoder-pkg, compile" description="Generates the jar for the transcoder package for Batik" unless="transcoder.pkg.uptodate">
<echo message="Creating the jar file ${build.dir}/fop-transcoder.jar"/>
<property name="fop-transcoder.name" value="FOP Transcoder Package"/>
@@ -742,6 +786,11 @@
</fileset>
</classpath>
</javac>
+ <copy todir="${build.dir}/test-classes">
+ <fileset dir="${basedir}/test/java">
+ <include name="**/*.xml"/>
+ </fileset>
+ </copy>
</target>
<target name="junit-transcoder" depends="junit-compile" description="Runs FOP's JUnit transcoder tests" if="junit.present">
Added: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventConventionException.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventConventionException.java?rev=615278&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventConventionException.java (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventConventionException.java Fri Jan 25 09:25:00 2008
@@ -0,0 +1,28 @@
+/*
+ * 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.tools;
+
+public class EventConventionException extends Exception {
+
+ public EventConventionException(String message) {
+ super(message);
+ }
+
+}
Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventConventionException.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventConventionException.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: 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=615278&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollector.java (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollector.java Fri Jan 25 09:25:00 2008
@@ -0,0 +1,151 @@
+/*
+ * 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.tools;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.fop.events.model.EventMethodModel;
+import org.apache.fop.events.model.EventModel;
+import org.apache.fop.events.model.EventProducerModel;
+import org.apache.fop.events.model.EventSeverity;
+
+import com.thoughtworks.qdox.JavaDocBuilder;
+import com.thoughtworks.qdox.model.DefaultDocletTagFactory;
+import com.thoughtworks.qdox.model.DocletTagFactory;
+import com.thoughtworks.qdox.model.JavaClass;
+import com.thoughtworks.qdox.model.JavaMethod;
+import com.thoughtworks.qdox.model.JavaParameter;
+import com.thoughtworks.qdox.model.Type;
+
+public class EventProducerCollector {
+
+ private static final String CLASSNAME_EVENT_PRODUCER = "org.apache.fop.events.EventProducer";
+ private static final Map PRIMITIVE_MAP;
+
+ static {
+ Map m = new java.util.HashMap();
+ m.put("boolean", Boolean.class);
+ m.put("byte", Byte.class);
+ m.put("char", Character.class);
+ m.put("short", Short.class);
+ m.put("int", Integer.class);
+ m.put("long", Long.class);
+ m.put("float", Float.class);
+ m.put("double", Double.class);
+ PRIMITIVE_MAP = Collections.unmodifiableMap(m);
+ }
+
+ private DocletTagFactory tagFactory;
+ private EventModel model = new EventModel();
+
+ public EventProducerCollector() {
+ this.tagFactory = createDocletTagFactory();
+ }
+
+ protected DocletTagFactory createDocletTagFactory() {
+ return new DefaultDocletTagFactory();
+ }
+
+ public void scanFile(File src, String filename)
+ throws IOException, EventConventionException, ClassNotFoundException {
+ JavaDocBuilder builder = new JavaDocBuilder(this.tagFactory);
+ builder.addSource(src);
+ JavaClass[] classes = builder.getClasses();
+ for (int i = 0, c = classes.length; i < c; i++) {
+ JavaClass clazz = classes[i];
+ if (clazz.isInterface() && implementsInterface(clazz, CLASSNAME_EVENT_PRODUCER)) {
+ processJavaClass(clazz, filename);
+ }
+ }
+ }
+
+ private boolean implementsInterface(JavaClass clazz, String intf) {
+ JavaClass[] classes = clazz.getImplementedInterfaces();
+ for (int i = 0, c = classes.length; i < c; i++) {
+ JavaClass cl = classes[i];
+ if (cl.getFullyQualifiedName().equals(intf)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected void processJavaClass(JavaClass clazz, String javaFilename)
+ throws EventConventionException, ClassNotFoundException {
+ EventProducerModel prodMeta = new EventProducerModel(clazz.getFullyQualifiedName());
+ JavaMethod[] methods = clazz.getMethods();
+ for (int i = 0, c = methods.length; i < c; i++) {
+ JavaMethod method = methods[i];
+
+ //Check EventProducer conventions
+ if (!method.getReturns().isVoid()) {
+ throw new EventConventionException("All methods of interface "
+ + clazz.getFullyQualifiedName() + " must have return type 'void'!");
+ }
+ String methodSig = clazz.getFullyQualifiedName() + "." + method.getCallSignature();
+ JavaParameter[] params = method.getParameters();
+ if (params.length < 1) {
+ throw new EventConventionException("The method " + methodSig
+ + " must have at least one parameter: 'Object source'!");
+ }
+ Type firstType = params[0].getType();
+ if (firstType.isPrimitive() || !"source".equals(params[0].getName())) {
+ throw new EventConventionException("The first parameter of the method " + methodSig
+ + " must be: 'Object source'!");
+ }
+
+ //build method model
+ EventMethodModel methodMeta = new EventMethodModel(
+ method.getName(), EventSeverity.INFO);
+ if (params.length > 1) {
+ for (int j = 1, cj = params.length; j < cj; j++) {
+ JavaParameter p = params[j];
+ Class type;
+ JavaClass pClass = p.getType().getJavaClass();
+ if (p.getType().isPrimitive()) {
+ type = (Class)PRIMITIVE_MAP.get(pClass.getName());
+ if (type == null) {
+ throw new UnsupportedOperationException(
+ "Primitive datatype not supported: " + pClass.getName());
+ }
+ } else {
+ String className = pClass.getFullyQualifiedName();
+ type = Class.forName(className);
+ }
+ methodMeta.addParameter(type, p.getName());
+ }
+ }
+ prodMeta.addMethod(methodMeta);
+ }
+ this.model.addProducer(prodMeta);
+ }
+
+ public EventModel getModel() {
+ return this.model;
+ }
+
+ public void saveModelToXML(File modelFile) throws IOException {
+ getModel().saveToXML(modelFile);
+ }
+
+}
Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollector.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollector.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: 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=615278&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollectorTask.java (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollectorTask.java Fri Jan 25 09:25:00 2008
@@ -0,0 +1,107 @@
+/*
+ * 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.tools;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.selectors.FilenameSelector;
+
+public class EventProducerCollectorTask extends Task {
+
+ private List filesets = new java.util.ArrayList();
+ private File modelFile;
+
+ /** {@inheritDoc} */
+ public void execute() throws BuildException {
+ try {
+ EventProducerCollector collector = new EventProducerCollector();
+ processFileSets(collector);
+ collector.saveModelToXML(getModelFile());
+ log("Event model written to " + getModelFile());
+ } catch (ClassNotFoundException e) {
+ throw new BuildException(e);
+ } catch (EventConventionException ece) {
+ throw new BuildException(ece);
+ } catch (IOException ioe) {
+ throw new BuildException(ioe);
+ }
+ }
+
+ protected void processFileSets(EventProducerCollector collector)
+ throws IOException, EventConventionException, ClassNotFoundException {
+ Iterator iter = filesets.iterator();
+ while (iter.hasNext()) {
+ FileSet fs = (FileSet)iter.next();
+ DirectoryScanner ds = fs.getDirectoryScanner(getProject());
+ String[] srcFiles = ds.getIncludedFiles();
+ File directory = fs.getDir(getProject());
+ for (int i = 0, c = srcFiles.length; i < c; i++) {
+ String filename = srcFiles[i];
+ File src = new File(directory, filename);
+ collector.scanFile(src, filename);
+ }
+ }
+ }
+
+ public void addFileset(FileSet set) {
+ filesets.add(set);
+ }
+
+ public void setModelFile(File f) {
+ this.modelFile = f;
+ }
+
+ public File getModelFile() {
+ return this.modelFile;
+ }
+
+ public static void main(String[] args) {
+ try {
+ Project project = new Project();
+
+ EventProducerCollectorTask generator = new EventProducerCollectorTask();
+ generator.setProject(project);
+ project.setName("Test");
+ FileSet fileset = new FileSet();
+ fileset.setDir(new File("test/java"));
+
+ FilenameSelector selector = new FilenameSelector();
+ selector.setName("**/*.java");
+ fileset.add(selector);
+ generator.addFileset(fileset);
+
+ File targetDir = new File("build/codegen1");
+ targetDir.mkdirs();
+
+ generator.setModelFile(new File("D:/out.xml"));
+ generator.execute();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollectorTask.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/codegen/java/org/apache/fop/tools/EventProducerCollectorTask.java
------------------------------------------------------------------------------
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=615278&r1=615277&r2=615278&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 Fri Jan 25 09:25:00 2008
@@ -19,7 +19,24 @@
package org.apache.fop.events;
+import java.io.InputStream;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.MissingResourceException;
+
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.commons.io.IOUtils;
+
+import org.apache.fop.events.model.EventMethodModel;
+import org.apache.fop.events.model.EventModel;
+import org.apache.fop.events.model.EventModelParser;
+import org.apache.fop.events.model.EventProducerModel;
public class DefaultEventBroadcaster implements EventBroadcaster {
@@ -48,4 +65,82 @@
}
}
+ private static final String EVENT_MODEL_FILENAME = "event-model.xml";
+ private static EventModel eventModel;
+ private Map proxies = new java.util.HashMap();
+
+ static {
+ loadModel(DefaultEventBroadcaster.class, EVENT_MODEL_FILENAME);
+ }
+
+ public static void loadModel(Class resourceBaseClass, String resourceName) {
+ InputStream in = resourceBaseClass.getResourceAsStream(resourceName);
+ if (in == null) {
+ throw new MissingResourceException(
+ "File " + resourceName + " not found",
+ DefaultEventBroadcaster.class.getName(), "");
+ }
+ try {
+ eventModel = EventModelParser.parse(new StreamSource(in));
+ } catch (TransformerException e) {
+ throw new MissingResourceException(
+ "Error reading " + resourceName + ": " + e.getMessage(),
+ DefaultEventBroadcaster.class.getName(), "");
+ } finally {
+ IOUtils.closeQuietly(in);
+ }
+ }
+
+ public EventProducer getEventProducerFor(Class clazz) {
+ if (!EventProducer.class.isAssignableFrom(clazz)) {
+ throw new IllegalArgumentException(
+ "Class must be an implementation of the EventProducer interface: "
+ + clazz.getName());
+ }
+ EventProducer producer;
+ producer = (EventProducer)this.proxies.get(clazz);
+ if (producer == null) {
+ producer = createProxyFor(clazz);
+ this.proxies.put(clazz, producer);
+ }
+ return producer;
+ }
+
+ private EventProducer createProxyFor(Class clazz) {
+ final EventProducerModel producerModel = eventModel.getProducer(clazz);
+ if (producerModel == null) {
+ throw new IllegalStateException("Event model doesn't contain the definition for "
+ + clazz.getName());
+ }
+ return (EventProducer)Proxy.newProxyInstance(clazz.getClassLoader(),
+ new Class[] {clazz},
+ new InvocationHandler() {
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable {
+ String methodName = method.getName();
+ EventMethodModel methodModel = producerModel.getMethod(methodName);
+ String eventID = producerModel.getInterfaceName() + "." + methodName;
+ if (methodModel == null) {
+ throw new IllegalStateException(
+ "Event model isn't consistent"
+ + " with the EventProducer interface. Please rebuild FOP!"
+ + " Affected method: "
+ + eventID);
+ }
+ Map params = new java.util.HashMap();
+ int i = 1;
+ Iterator iter = methodModel.getParameters().iterator();
+ while (iter.hasNext()) {
+ EventMethodModel.Parameter param
+ = (EventMethodModel.Parameter)iter.next();
+ params.put(param.getName(), args[i]);
+ i++;
+ }
+ FopEvent ev = new FopEvent(args[0], eventID, params);
+ broadcastEvent(ev);
+ return null;
+ }
+ });
+ }
+
}
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=615278&r1=615277&r2=615278&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 Fri Jan 25 09:25:00 2008
@@ -30,4 +30,6 @@
void broadcastEvent(FopEvent event);
+ EventProducer getEventProducerFor(Class clazz);
+
}
Added: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/event-model.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/event-model.xml?rev=615278&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/event-model.xml (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/event-model.xml Fri Jan 25 09:25:00 2008
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><event-model/>
Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/event-model.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/event-model.xml
------------------------------------------------------------------------------
svn:keywords = Id
Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventMethodModel.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventMethodModel.java?rev=615278&r1=615277&r2=615278&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventMethodModel.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventMethodModel.java Fri Jan 25 09:25:00 2008
@@ -45,8 +45,10 @@
this.params.add(param);
}
- public void addParameter(Class type, String name) {
- this.params.add(new Parameter(type, name));
+ public Parameter addParameter(Class type, String name) {
+ Parameter param = new Parameter(type, name);
+ this.params.add(param);
+ return param;
}
public void setMethodName(String name) {
Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventModel.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventModel.java?rev=615278&r1=615277&r2=615278&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventModel.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventModel.java Fri Jan 25 09:25:00 2008
@@ -19,10 +19,20 @@
package org.apache.fop.events.model;
+import java.io.File;
+import java.io.IOException;
import java.io.Serializable;
-import java.util.Collections;
import java.util.Iterator;
-import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Result;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamResult;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
@@ -32,29 +42,63 @@
public class EventModel implements Serializable, XMLizable {
- private List producers = new java.util.ArrayList();
+ private Map producers = new java.util.LinkedHashMap();
public EventModel() {
}
- public void addProducer(EventProducerModel method) {
- this.producers.add(method);
+ public void addProducer(EventProducerModel producer) {
+ this.producers.put(producer.getInterfaceName(), producer);
}
- public List getProducers() {
- return Collections.unmodifiableList(this.producers);
+ public Iterator getProducers() {
+ return this.producers.values().iterator();
}
+ public EventProducerModel getProducer(String interfaceName) {
+ return (EventProducerModel)this.producers.get(interfaceName);
+ }
+
+ public EventProducerModel getProducer(Class clazz) {
+ return getProducer(clazz.getName());
+ }
+
/** {@inheritDoc} */
public void toSAX(ContentHandler handler) throws SAXException {
AttributesImpl atts = new AttributesImpl();
String elName = "event-model";
handler.startElement(null, elName, elName, atts);
- Iterator iter = this.producers.iterator();
+ Iterator iter = getProducers();
while (iter.hasNext()) {
((XMLizable)iter.next()).toSAX(handler);
}
handler.endElement(null, elName, elName);
}
-
+
+ private void writeXMLizable(XMLizable object, File outputFile) throws IOException {
+ Result res = new StreamResult(outputFile);
+
+ try {
+ SAXTransformerFactory tFactory
+ = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
+ TransformerHandler handler = tFactory.newTransformerHandler();
+ Transformer transformer = handler.getTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ handler.setResult(res);
+ handler.startDocument();
+ object.toSAX(handler);
+ handler.endDocument();
+ } catch (TransformerConfigurationException e) {
+ throw new IOException(e.getMessage());
+ } catch (TransformerFactoryConfigurationError e) {
+ throw new IOException(e.getMessage());
+ } catch (SAXException e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+
+ public void saveToXML(File modelFile) throws IOException {
+ writeXMLizable(this, modelFile);
+ }
+
}
Added: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventModelParser.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventModelParser.java?rev=615278&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventModelParser.java (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventModelParser.java Fri Jan 25 09:25:00 2008
@@ -0,0 +1,136 @@
+/*
+ * 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.model;
+
+import java.util.Stack;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.sax.SAXResult;
+import javax.xml.transform.sax.SAXTransformerFactory;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.fop.util.DefaultErrorListener;
+
+/**
+ * This is a parser for the event model XML.
+ */
+public class EventModelParser {
+
+ /** Logger instance */
+ protected static Log log = LogFactory.getLog(EventModelParser.class);
+
+ private static SAXTransformerFactory tFactory
+ = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
+
+ /**
+ * Parses an event model file into an EventModel instance.
+ * @param src the Source instance pointing to the XML file
+ * @return the created event model structure
+ * @throws TransformerException if an error occurs while parsing the XML file
+ */
+ public static EventModel parse(Source src)
+ throws TransformerException {
+ Transformer transformer = tFactory.newTransformer();
+ transformer.setErrorListener(new DefaultErrorListener(log));
+
+ EventModel model = new EventModel();
+ SAXResult res = new SAXResult(getContentHandler(model));
+
+ transformer.transform(src, res);
+ return model;
+ }
+
+ /**
+ * Creates a new ContentHandler instance that you can send the event model XML to. The parsed
+ * content is accumulated in the model structure.
+ * @param model the EventModel
+ * @return the ContentHandler instance to receive the SAX stream from the XML file
+ */
+ public static ContentHandler getContentHandler(EventModel model) {
+ return new Handler(model);
+ }
+
+ private static class Handler extends DefaultHandler {
+
+ private EventModel model;
+ private Stack objectStack = new Stack();
+
+ public Handler(EventModel model) {
+ this.model = model;
+ }
+
+ /** {@inheritDoc} */
+ public void startElement(String uri, String localName, String qName, Attributes attributes)
+ throws SAXException {
+ try {
+ if ("event-model".equals(localName)) {
+ if (objectStack.size() > 0) {
+ throw new SAXException("event-model must be the root element");
+ }
+ objectStack.push(model);
+ } else if ("producer".equals(localName)) {
+ EventProducerModel producer = new EventProducerModel(
+ attributes.getValue("name"));
+ EventModel parent = (EventModel)objectStack.peek();
+ parent.addProducer(producer);
+ objectStack.push(producer);
+ } else if ("method".equals(localName)) {
+ EventSeverity severity = EventSeverity.valueOf(attributes.getValue("severity"));
+ EventMethodModel method = new EventMethodModel(
+ attributes.getValue("name"), severity);
+ EventProducerModel parent = (EventProducerModel)objectStack.peek();
+ parent.addMethod(method);
+ objectStack.push(method);
+ } else if ("parameter".equals(localName)) {
+ String className = attributes.getValue("type");
+ Class type;
+ try {
+ type = Class.forName(className);
+ } catch (ClassNotFoundException e) {
+ throw new SAXException("Could not find Class for: " + className, e);
+ }
+ String name = attributes.getValue("name");
+ EventMethodModel parent = (EventMethodModel)objectStack.peek();
+ objectStack.push(parent.addParameter(type, name));
+ } else {
+ throw new SAXException("Invalid element: " + qName);
+ }
+ } catch (ClassCastException cce) {
+ throw new SAXException("XML format error: " + qName, cce);
+ }
+ }
+
+ /** {@inheritDoc} */
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ objectStack.pop();
+ }
+
+ }
+
+}
Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventModelParser.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventModelParser.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventProducerModel.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventProducerModel.java?rev=615278&r1=615277&r2=615278&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventProducerModel.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/src/java/org/apache/fop/events/model/EventProducerModel.java Fri Jan 25 09:25:00 2008
@@ -20,9 +20,8 @@
package org.apache.fop.events.model;
import java.io.Serializable;
-import java.util.Collections;
import java.util.Iterator;
-import java.util.List;
+import java.util.Map;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
@@ -33,7 +32,7 @@
public class EventProducerModel implements Serializable, XMLizable {
private String interfaceName;
- private List methods = new java.util.ArrayList();
+ private Map methods = new java.util.LinkedHashMap();
public EventProducerModel(String interfaceName) {
this.interfaceName = interfaceName;
@@ -48,11 +47,15 @@
}
public void addMethod(EventMethodModel method) {
- this.methods.add(method);
+ this.methods.put(method.getMethodName(), method);
}
- public List getMethods() {
- return Collections.unmodifiableList(this.methods);
+ public EventMethodModel getMethod(String methodName) {
+ return (EventMethodModel)this.methods.get(methodName);
+ }
+
+ public Iterator getMethods() {
+ return this.methods.values().iterator();
}
/** {@inheritDoc} */
@@ -61,11 +64,12 @@
atts.addAttribute(null, "name", "name", "CDATA", getInterfaceName());
String elName = "producer";
handler.startElement(null, elName, elName, atts);
- Iterator iter = this.methods.iterator();
+ Iterator iter = getMethods();
while (iter.hasNext()) {
((XMLizable)iter.next()).toSAX(handler);
}
handler.endElement(null, elName, elName);
}
+
}
Modified: xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/UtilityCodeTestSuite.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/UtilityCodeTestSuite.java?rev=615278&r1=615277&r2=615278&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/UtilityCodeTestSuite.java (original)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/UtilityCodeTestSuite.java Fri Jan 25 09:25:00 2008
@@ -19,6 +19,10 @@
package org.apache.fop;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.fop.events.BasicEventTestCase;
import org.apache.fop.traits.BorderPropsTestCase;
import org.apache.fop.traits.TraitColorTestCase;
import org.apache.fop.util.DataURIResolverTestCase;
@@ -26,9 +30,6 @@
import org.apache.fop.util.PDFNumberTestCase;
import org.apache.fop.util.UnitConvTestCase;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
/**
* Test suite for FOP's utility classes.
*/
@@ -48,6 +49,7 @@
suite.addTest(new TestSuite(BorderPropsTestCase.class));
suite.addTest(new TestSuite(ElementListUtilsTestCase.class));
suite.addTest(new TestSuite(DataURIResolverTestCase.class));
+ suite.addTest(new TestSuite(BasicEventTestCase.class));
//$JUnit-END$
return suite;
}
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=615278&r1=615277&r2=615278&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 Fri Jan 25 09:25:00 2008
@@ -23,6 +23,11 @@
public class BasicEventTestCase extends TestCase {
+ static {
+ //Use local event model
+ DefaultEventBroadcaster.loadModel(BasicEventTestCase.class, "test-event-model.xml");
+ }
+
public void testBasics() throws Exception {
MyEventListener listener = new MyEventListener();
@@ -38,7 +43,8 @@
.build());
broadcaster.broadcastEvent(ev);
- assertNotNull(listener.event);
+ ev = listener.event;
+ assertNotNull(ev);
assertEquals("123", listener.event.getEventID());
assertEquals("I'm tired", ev.getParam("reason"));
assertEquals(new Integer(23), ev.getParam("blah"));
@@ -50,6 +56,31 @@
broadcaster.broadcastEvent(ev);
}
+ public void testEventProducer() throws Exception {
+ MyEventListener listener = new MyEventListener();
+
+ EventBroadcaster broadcaster = new DefaultEventBroadcaster();
+ broadcaster.addFopEventListener(listener);
+ assertEquals(1, broadcaster.getListenerCount());
+
+ TestEventProducer producer = (TestEventProducer)broadcaster.getEventProducerFor(
+ TestEventProducer.class);
+ producer.complain(this, "I'm tired", 23);
+
+ FopEvent ev = listener.event;
+ assertNotNull(ev);
+ assertEquals("org.apache.fop.events.TestEventProducer.complain",
+ listener.event.getEventID());
+ assertEquals("I'm tired", ev.getParam("reason"));
+ assertEquals(new Integer(23), ev.getParam("blah"));
+
+ broadcaster.removeFopEventListener(listener);
+ assertEquals(0, broadcaster.getListenerCount());
+
+ //Just check that there are no NPEs
+ broadcaster.broadcastEvent(ev);
+ }
+
private class MyEventListener implements FopEventListener {
private FopEvent event;
Added: xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/test-event-model.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/test-event-model.xml?rev=615278&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/test-event-model.xml (added)
+++ xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/test-event-model.xml Fri Jan 25 09:25:00 2008
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?><event-model>
+<producer name="org.apache.fop.events.TestEventProducer">
+<method name="complain" severity="INFO">
+<parameter type="java.lang.String" name="reason"/>
+<parameter type="java.lang.Integer" name="blah"/>
+</method>
+<method name="enjoy" severity="INFO">
+<parameter type="java.lang.String" name="what"/>
+</method>
+</producer>
+</event-model>
Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/test-event-model.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/branches/Temp_ProcessingFeedback/test/java/org/apache/fop/events/test-event-model.xml
------------------------------------------------------------------------------
svn:keywords = Id
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org