Browse Source

Refactored the multi-threading harness a bit to support IF conversion.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@964334 13f79535-47bb-0310-9956-ffa450edef68
pull/21/head
Jeremias Maerki 14 years ago
parent
commit
32d8c7a4de

+ 58
- 0
test/java/org/apache/fop/threading/AvalonAdapter.java View File

@@ -0,0 +1,58 @@
/*
* 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.threading;

import org.apache.avalon.framework.logger.Logger;

import org.apache.fop.events.Event;
import org.apache.fop.events.EventFormatter;
import org.apache.fop.events.EventListener;
import org.apache.fop.events.model.EventSeverity;

/**
* Redirects events to an Avalon logger.
*/
class AvalonAdapter implements EventListener {

private final Logger logger;
private String filename;

public AvalonAdapter(Logger logger, String filename) {
this.logger = logger;
this.filename = filename;
}

public void processEvent(Event event) {
String msg = EventFormatter.format(event);
EventSeverity severity = event.getSeverity();
if (severity == EventSeverity.INFO) {
//logger.info(filename + ": " + msg);
} else if (severity == EventSeverity.WARN) {
//logger.warn(filename + ": " + msg);
} else if (severity == EventSeverity.ERROR) {
logger.error(filename + ": " + msg);
} else if (severity == EventSeverity.FATAL) {
logger.fatalError(filename + ": " + msg);
} else {
assert false;
}
}

}

+ 15
- 13
test/java/org/apache/fop/threading/FOPTestbed.java View File

@@ -56,7 +56,7 @@ public class FOPTestbed extends AbstractLogEnabled
private int threads;
private File outputDir;
private Configuration fopCfg;
private FOProcessor foprocessor;
private Processor foprocessor;
private boolean writeToDevNull;

private int counter = 0;
@@ -74,7 +74,7 @@ public class FOPTestbed extends AbstractLogEnabled
for (int i = 0; i < entries.length; i++) {
this.taskList.add(new TaskDef(entries[i]));
}
this.fopCfg = configuration.getChild("foprocessor");
this.fopCfg = configuration.getChild("processor");
}

/** {@inheritDoc} */
@@ -177,11 +177,11 @@ public class FOPTestbed extends AbstractLogEnabled
* Creates a new FOProcessor.
* @return the newly created instance
*/
public FOProcessor createFOProcessor() {
public Processor createFOProcessor() {
try {
Class clazz = Class.forName(this.fopCfg.getAttribute("class",
"org.apache.fop.threading.FOProcessorImpl"));
FOProcessor fop = (FOProcessor)clazz.newInstance();
Processor fop = (Processor)clazz.newInstance();
ContainerUtil.enableLogging(fop, getLogger());
ContainerUtil.configure(fop, this.fopCfg);
ContainerUtil.initialize(fop);
@@ -206,13 +206,15 @@ public class FOPTestbed extends AbstractLogEnabled
this.fo = cfg.getAttribute("fo", null);
if (this.fo == null) {
this.xml = cfg.getAttribute("xml");
this.xslt = cfg.getAttribute("xslt");
TransformerFactory factory = TransformerFactory.newInstance();
Source xsltSource = new StreamSource(new File(xslt));
try {
this.templates = factory.newTemplates(xsltSource);
} catch (TransformerConfigurationException tce) {
throw new ConfigurationException("Invalid XSLT", tce);
this.xslt = cfg.getAttribute("xslt", null);
if (this.xslt != null) {
TransformerFactory factory = TransformerFactory.newInstance();
Source xsltSource = new StreamSource(new File(xslt));
try {
this.templates = factory.newTemplates(xsltSource);
} catch (TransformerConfigurationException tce) {
throw new ConfigurationException("Invalid XSLT", tce);
}
}
}
}
@@ -249,9 +251,9 @@ public class FOPTestbed extends AbstractLogEnabled

private TaskDef def;
private int num;
private FOProcessor fop;
private Processor fop;

public Task(TaskDef def, int num, FOProcessor fop) {
public Task(TaskDef def, int num, Processor fop) {
this.def = def;
this.num = num;
this.fop = fop;

+ 4
- 33
test/java/org/apache/fop/threading/FOProcessorImpl.java View File

@@ -43,16 +43,12 @@ import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.events.Event;
import org.apache.fop.events.EventFormatter;
import org.apache.fop.events.EventListener;
import org.apache.fop.events.model.EventSeverity;

/**
* Default implementation of the FOProcessor interface using FOP.
* Default implementation of the {@link Processor} interface using FOP.
*/
public class FOProcessorImpl extends AbstractLogEnabled
implements FOProcessor, Configurable, Initializable {
implements Processor, Configurable, Initializable {

private FopFactory fopFactory = FopFactory.newInstance();
private TransformerFactory factory = TransformerFactory.newInstance();
@@ -83,7 +79,8 @@ public class FOProcessorImpl extends AbstractLogEnabled
try {
URL url = new URL(src.getSystemId());
String filename = FilenameUtils.getName(url.getPath());
foUserAgent.getEventBroadcaster().addEventListener(new AvalonAdapter(filename));
foUserAgent.getEventBroadcaster().addEventListener(
new AvalonAdapter(getLogger(), filename));
} catch (MalformedURLException mfue) {
throw new RuntimeException(mfue);
}
@@ -107,30 +104,4 @@ public class FOProcessorImpl extends AbstractLogEnabled
public String getTargetFileExtension() {
return this.fileExtension;
}

private class AvalonAdapter implements EventListener {

private String filename;

public AvalonAdapter(String filename) {
this.filename = filename;
}

public void processEvent(Event event) {
String msg = EventFormatter.format(event);
EventSeverity severity = event.getSeverity();
if (severity == EventSeverity.INFO) {
//getLogger().info(filename + ": " + msg);
} else if (severity == EventSeverity.WARN) {
//getLogger().warn(filename + ": " + msg);
} else if (severity == EventSeverity.ERROR) {
getLogger().error(filename + ": " + msg);
} else if (severity == EventSeverity.FATAL) {
getLogger().fatalError(filename + ": " + msg);
} else {
assert false;
}
}

}
}

+ 124
- 0
test/java/org/apache/fop/threading/IFProcessorImpl.java View File

@@ -0,0 +1,124 @@
/*
* 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.threading;

import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.ContentHandler;

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.commons.io.FilenameUtils;

import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.render.intermediate.IFDocumentHandler;
import org.apache.fop.render.intermediate.IFException;
import org.apache.fop.render.intermediate.IFParser;
import org.apache.fop.render.intermediate.IFUtil;

/**
* Implementation of the {@link Processor} interface that renders IF XML to a final output format.
*/
public class IFProcessorImpl extends AbstractLogEnabled
implements Processor, Configurable, Initializable {

private FopFactory fopFactory = FopFactory.newInstance();
private TransformerFactory factory = TransformerFactory.newInstance();
private String userconfig;
private String mime;
private String fileExtension;

/** {@inheritDoc} */
public void configure(Configuration configuration) throws ConfigurationException {
this.userconfig = configuration.getChild("userconfig").getValue(null);
this.mime = configuration.getChild("mime").getValue(MimeConstants.MIME_PDF);
this.fileExtension = configuration.getChild("extension").getValue(".pdf");
}

/** {@inheritDoc} */
public void initialize() throws Exception {
if (this.userconfig != null) {
getLogger().debug("Setting user config: " + userconfig);
fopFactory.setUserConfig(this.userconfig);
}
}

/** {@inheritDoc}
* @throws IFException */
public void process(Source src, Templates templates, OutputStream out)
throws org.apache.fop.apps.FOPException, java.io.IOException, IFException {
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
foUserAgent.setBaseURL(src.getSystemId());
try {
URL url = new URL(src.getSystemId());
String filename = FilenameUtils.getName(url.getPath());
foUserAgent.getEventBroadcaster().addEventListener(
new AvalonAdapter(getLogger(), filename));
} catch (MalformedURLException mfue) {
throw new RuntimeException(mfue);
}

//Setup target handler
IFDocumentHandler targetHandler = fopFactory.getRendererFactory().createDocumentHandler(
foUserAgent, mime);

//Setup fonts
IFUtil.setupFonts(targetHandler);
targetHandler.setResult(new StreamResult(out));

try {
Transformer transformer;
if (templates == null) {
transformer = factory.newTransformer();
} else {
transformer = templates.newTransformer();
}
IFParser parser = new IFParser();
ContentHandler contentHandler = parser.getContentHandler(targetHandler, foUserAgent);
Result res = new SAXResult(contentHandler);
transformer.transform(src, res);
} catch (TransformerException e) {
throw new FOPException(e);
}
}

/** {@inheritDoc} */
public String getTargetFileExtension() {
return this.fileExtension;
}

}

test/java/org/apache/fop/threading/FOProcessor.java → test/java/org/apache/fop/threading/Processor.java View File

@@ -25,9 +25,9 @@ import javax.xml.transform.Source;
import javax.xml.transform.Templates;

/**
* Represents an FO processor.
* Represents a processor.
*/
public interface FOProcessor {
public interface Processor {

/**
* Process a file.

+ 2
- 2
test/java/org/apache/fop/threading/sample.cfg.xml View File

@@ -2,13 +2,13 @@
<config prompt="false">
<threads>2</threads>
<output-dir>C:/Dev/FOP/temp/out</output-dir>
<foprocessor class="org.apache.fop.threading.FOProcessorImpl">
<processor class="org.apache.fop.threading.FOProcessorImpl">
<!--
<userconfig>C:/Dev/FOP/temp/userconfig.xml</userconfig>
-->
<mime>application/pdf</mime>
<extension>.pdf</extension>
</foprocessor>
</processor>
<tasks repeat="2">
<task fo="C:/Dev/FOP/temp/helloworld.fo"/>
<task xml="C:/Dev/FOP/temp/page-x-of-y.xml" xslt="C:/Dev/FOP/temp/page-x-of-y.xsl"/>

Loading…
Cancel
Save