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;
+ /** [EMAIL PROTECTED] */
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");
}
+ /** [EMAIL PROTECTED] */
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;
+ /** [EMAIL PROTECTED] */
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");
}
-
+ /** [EMAIL PROTECTED] */
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);
}
-
+ /** [EMAIL PROTECTED] */
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);
}
+ }
+
+ /** [EMAIL PROTECTED] */
+ 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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]