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 2007/12/04 08:51:07 UTC

svn commit: r600821 - in /xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading: FOPTestbed.java FOProcessor.java FOProcessorImpl.java Main.java sample.cfg.xml

Author: jeremias
Date: Mon Dec  3 23:51:06 2007
New Revision: 600821

URL: http://svn.apache.org/viewvc?rev=600821&view=rev
Log:
Clean up
Javadocs
Generally make more useful.
Reuse FOProcessor instance for the whole run to actually feel the effect of an image cache attached to the FopFactory.
Add option to prompt the user before actually starting (in order to connect a VM monitor).

Modified:
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOPTestbed.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOProcessor.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOProcessorImpl.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/Main.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/sample.cfg.xml

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOPTestbed.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOPTestbed.java?rev=600821&r1=600820&r2=600821&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOPTestbed.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOPTestbed.java Mon Dec  3 23:51:06 2007
@@ -19,12 +19,12 @@
 
 package org.apache.fop.threading;
 
-import java.util.List;
-import java.util.Iterator;
 import java.io.File;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.text.DecimalFormat;
+import java.util.Iterator;
+import java.util.List;
 
 import javax.xml.transform.Source;
 import javax.xml.transform.Templates;
@@ -40,35 +40,45 @@
 import org.apache.avalon.framework.configuration.ConfigurationException;
 import org.apache.avalon.framework.container.ContainerUtil;
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
-import org.apache.avalon.framework.logger.Logger;
 import org.apache.commons.io.IOUtils;
 
+/**
+ * Testbed for multi-threading tests. The class can run a configurable set of task a number of
+ * times in a configurable number of threads to easily reproduce multi-threading issues.
+ */
 public class FOPTestbed extends AbstractLogEnabled 
             implements Configurable, Initializable {
 
     private int repeat;
-    private List tasks = new java.util.ArrayList();
+    private List taskList = new java.util.ArrayList();
     private int threads;
     private File outputDir;
     private Configuration fopCfg;
+    private FOProcessor foprocessor;
 
     private int counter = 0;
     
+    /** {@inheritDoc} */
     public void configure(Configuration configuration) throws ConfigurationException {
         this.threads = configuration.getChild("threads").getValueAsInteger(10);
         this.outputDir = new File(configuration.getChild("output-dir").getValue());
         Configuration tasks = configuration.getChild("tasks");
         this.repeat = tasks.getAttributeAsInteger("repeat", 1);
         Configuration[] entries = tasks.getChildren("task");
-        for (int i=0; i<entries.length; i++) {
-            this.tasks.add(new TaskDef(entries[i]));
+        for (int i = 0; i < entries.length; i++) {
+            this.taskList.add(new TaskDef(entries[i]));
         }
         this.fopCfg = configuration.getChild("foprocessor");
     }
 
+    /** {@inheritDoc} */
     public void initialize() throws Exception {
+        this.foprocessor = createFOProcessor();
     }
 
+    /**
+     * Starts the stress test.
+     */
     public void doStressTest() {
         getLogger().info("Starting stress test...");
         long start = System.currentTimeMillis();
@@ -99,6 +109,7 @@
             try {
                 Thread.sleep(100);
             } catch (InterruptedException ie) {
+                //ignore
             }
         }
         getLogger().info("Stress test duration: " + (System.currentTimeMillis() - start) + "ms");
@@ -109,10 +120,10 @@
         public void run() {
             try {
                 for (int r = 0; r < repeat; r++) {
-                    Iterator i = tasks.iterator();
+                    Iterator i = taskList.iterator();
                     while (i.hasNext()) {
                         TaskDef def = (TaskDef)i.next();
-                        final Task task = new Task(def, counter++);
+                        final Task task = new Task(def, counter++, foprocessor);
                         ContainerUtil.enableLogging(task, getLogger());
                         task.execute();
                     }
@@ -124,7 +135,10 @@
 
     }
     
-    
+    /**
+     * Creates a new FOProcessor.
+     * @return the newly created instance
+     */
     public FOProcessor createFOProcessor() {
         try {
             Class clazz = Class.forName(this.fopCfg.getAttribute("class", 
@@ -197,18 +211,19 @@
 
         private TaskDef def;
         private int num;
+        private FOProcessor fop;
 
-        public Task(TaskDef def, int num) {
+        public Task(TaskDef def, int num, FOProcessor fop) {
             this.def = def;
             this.num = num;
+            this.fop = fop;
         }
 
 
         public void execute() throws Exception {
             getLogger().info("Processing: " + def);
-            FOProcessor fop = (FOProcessor)createFOProcessor();
             DecimalFormat df = new DecimalFormat("00000");
-            File outfile = new File(outputDir, df.format(num) + ".pdf");
+            File outfile = new File(outputDir, df.format(num) + fop.getTargetFileExtension());
             OutputStream out = new java.io.FileOutputStream(outfile);
             try {
                 InputStream in;

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOProcessor.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOProcessor.java?rev=600821&r1=600820&r2=600821&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOProcessor.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOProcessor.java Mon Dec  3 23:51:06 2007
@@ -24,11 +24,24 @@
 
 import javax.xml.transform.Templates;
 
+/**
+ * Represents an FO processor.
+ */
 public interface FOProcessor {
 
-    String ROLE = FOProcessor.class.getName();
-
+    /**
+     * Process a file.
+     * @param in the InputStream for the FO or XML file
+     * @param templates a JAXP Templates object for an XSLT transformation or null
+     * @param out the OutputStream for the target file
+     * @throws Exception if an error occurs
+     */
     void process(InputStream in, Templates templates, OutputStream out)
-            throws org.apache.fop.apps.FOPException, java.io.IOException;
+            throws Exception;
 
+    /**
+     * Returns the target file extension for the configured output format.
+     * @return the target file extension (for example ".pdf")
+     */
+    String getTargetFileExtension();
 }

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOProcessorImpl.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOProcessorImpl.java?rev=600821&r1=600820&r2=600821&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOProcessorImpl.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/FOProcessorImpl.java Mon Dec  3 23:51:06 2007
@@ -28,69 +28,57 @@
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamSource;
 import javax.xml.transform.sax.SAXResult;
+import javax.xml.transform.stream.StreamSource;
 
-import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.activity.Initializable;
 import org.apache.avalon.framework.configuration.Configurable;
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
 
+import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.Fop;
-import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.FopFactory;
 import org.apache.fop.apps.MimeConstants;
-import org.apache.avalon.framework.activity.Initializable;
+import org.apache.fop.image2.cache.ImageCacheLoggingStatistics;
+import org.apache.fop.image2.cache.ImageCacheStatistics;
 
+/**
+ * Default implementation of the FOProcessor interface using FOP.
+ */
 public class FOProcessorImpl extends AbstractLogEnabled
             implements FOProcessor, Configurable, Initializable {
 
     private FopFactory fopFactory = FopFactory.newInstance();
     private TransformerFactory factory = TransformerFactory.newInstance();
-    private String baseDir;
-    private String fontBaseDir;
     private String userconfig;
-    private boolean strokeSVGText;
+    private String mime;
+    private String fileExtension;
 
+    /** {@inheritDoc} */
     public void configure(Configuration configuration) throws ConfigurationException {
-        this.baseDir = configuration.getChild("basedir").getValue(null);
-        this.fontBaseDir = configuration.getChild("fontbasedir").getValue(null);
         this.userconfig = configuration.getChild("userconfig").getValue(null);
-        this.strokeSVGText = configuration.getChild("strokesvgtext").getValueAsBoolean(true);
+        this.mime = configuration.getChild("mime").getValue(MimeConstants.MIME_PDF);
+        this.fileExtension = configuration.getChild("extension").getValue(".pdf");
     }
 
-
+    /** {@inheritDoc} */
     public void initialize() throws Exception {
-        /*
-        org.apache.fop.messaging.MessageHandler.setScreenLogger(getLogger());
-        if (userconfig != null) {
-            getLogger().info("Using user config: "+userconfig);
-            InputStream in = org.apache.fop.tools.URLBuilder.buildURL(userconfig).openStream();
-            try {
-                new org.apache.fop.apps.Options(in);
-            } finally {
-                in.close();
-            }
-        }
-        if (this.baseDir != null) {
-            getLogger().info("Setting base dir: "+baseDir);
-            org.apache.fop.configuration.Configuration.put("baseDir", this.baseDir);
-        }
-        if (this.fontBaseDir != null) {
-            getLogger().info("Setting font base dir: "+fontBaseDir);
-            org.apache.fop.configuration.Configuration.put("fontBaseDir", this.fontBaseDir);
+        if (this.userconfig != null) {
+            getLogger().debug("Setting user config: " + userconfig);
+            fopFactory.setUserConfig(this.userconfig);
         }
-        String value = (this.strokeSVGText?"true":"false");
-        org.apache.fop.configuration.Configuration.put("strokeSVGText", value);
-        */
+        ImageCacheStatistics stats = new ImageCacheLoggingStatistics(true);
+        fopFactory.getImageManager().getCache().setCacheListener(stats);
     }
 
-
+    /** {@inheritDoc} */
     public void process(InputStream in, Templates templates, OutputStream out) 
                 throws org.apache.fop.apps.FOPException, java.io.IOException {
         FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
-        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
+        Fop fop = fopFactory.newFop(this.mime, foUserAgent, out);
 
         try {
             Transformer transformer;
@@ -105,6 +93,11 @@
         } catch (TransformerException e) {
             throw new FOPException(e);
         }
+    }
+
+    /** {@inheritDoc} */
+    public String getTargetFileExtension() {
+        return this.fileExtension;
     }
 
 }

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/Main.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/Main.java?rev=600821&r1=600820&r2=600821&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/Main.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/Main.java Mon Dec  3 23:51:06 2007
@@ -19,7 +19,9 @@
 
 package org.apache.fop.threading;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.IOException;
 
 import org.apache.avalon.framework.ExceptionUtil;
 import org.apache.avalon.framework.configuration.Configuration;
@@ -27,14 +29,32 @@
 import org.apache.avalon.framework.container.ContainerUtil;
 import org.apache.avalon.framework.logger.ConsoleLogger;
 
+/**
+ * Starter class for the multi-threading testbed.
+ */
 public class Main {
 
+    private static void prompt() throws IOException {
+        BufferedReader in = new BufferedReader(new java.io.InputStreamReader(System.in));
+        System.out.print("Press return to continue...");
+        in.readLine();
+    }
+    
+    /**
+     * Main method.
+     * @param args the command-line arguments
+     */
     public static void main(String[] args) {
         try {
             //Read configuration
             File cfgFile = new File(args[0]);
             DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
             Configuration cfg = builder.buildFromFile(cfgFile);
+            
+            boolean doPrompt = cfg.getAttributeAsBoolean("prompt", false);
+            if (doPrompt) {
+                prompt();
+            }
             
             //Setup testbed
             FOPTestbed testbed = new FOPTestbed();

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/sample.cfg.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/sample.cfg.xml?rev=600821&r1=600820&r2=600821&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/sample.cfg.xml (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/test/java/org/apache/fop/threading/sample.cfg.xml Mon Dec  3 23:51:06 2007
@@ -1,12 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<config>
+<config prompt="false">
   <threads>2</threads>
   <output-dir>C:/Dev/FOP/temp/out</output-dir>
-  <foprocessor>
-    <!--basedir>C:/Dev/FOP/temp</basedir>
-    <fontbasedir>C:/Dev/FOP/temp/fonts</fontbasedir>
+  <foprocessor class="org.apache.fop.threading.FOProcessorImpl">
+    <!--
     <userconfig>C:/Dev/FOP/temp/userconfig.xml</userconfig>
-    <strokesvgtext>true</strokesvgtext-->
+    -->
+    <mime>application/pdf</mime>
+    <extension>.pdf</extension>
   </foprocessor>
   <tasks repeat="2">
     <task fo="C:/Dev/FOP/temp/helloworld.fo"/>



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