Browse Source

Merged Temp_API_Finalization branch back into FOP Trunk:

Finalized API according to the plan in the Wiki: http://wiki.apache.org/xmlgraphics-fop/ApiDesign

In addition to that:
Deprecated the rest of the Fop constructors.
Refactored the FopServlet a bit to make it more versatile and still easy to understand. The FopPrintServlet is now a subclass of FopServlet.
Some further cleanup on the way.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@389086 13f79535-47bb-0310-9956-ffa450edef68
pull/35/head
Jeremias Maerki 18 years ago
parent
commit
f84616e34d
48 changed files with 1409 additions and 766 deletions
  1. 1
    1
      build.xml
  2. 17
    3
      examples/embedding/java/embedding/ExampleAWTViewer.java
  3. 54
    40
      examples/embedding/java/embedding/ExampleDOM2PDF.java
  4. 8
    7
      examples/embedding/java/embedding/ExampleFO2OldStylePrint.java
  5. 11
    4
      examples/embedding/java/embedding/ExampleFO2PDF.java
  6. 16
    11
      examples/embedding/java/embedding/ExampleFO2PDFUsingSAXParser.java
  7. 13
    6
      examples/embedding/java/embedding/ExampleFO2RTF.java
  8. 10
    4
      examples/embedding/java/embedding/ExampleObj2PDF.java
  9. 11
    5
      examples/embedding/java/embedding/ExampleXML2PDF.java
  10. 173
    0
      examples/embedding/java/embedding/MultipleFO2PDF.java
  11. 8
    6
      examples/embedding/java/embedding/intermediate/ExampleConcat.java
  12. 5
    1
      examples/embedding/java/embedding/intermediate/ExampleStamp.java
  13. 111
    314
      src/java/org/apache/fop/apps/FOUserAgent.java
  14. 51
    9
      src/java/org/apache/fop/apps/Fop.java
  15. 608
    0
      src/java/org/apache/fop/apps/FopFactory.java
  16. 1
    1
      src/java/org/apache/fop/area/AreaTreeHandler.java
  17. 6
    5
      src/java/org/apache/fop/area/AreaTreeParser.java
  18. 0
    4
      src/java/org/apache/fop/cli/AreaTreeInputHandler.java
  19. 12
    35
      src/java/org/apache/fop/cli/CommandLineOptions.java
  20. 7
    3
      src/java/org/apache/fop/cli/InputHandler.java
  21. 4
    4
      src/java/org/apache/fop/fo/ElementMappingRegistry.java
  22. 4
    7
      src/java/org/apache/fop/fo/FOTreeBuilder.java
  23. 4
    2
      src/java/org/apache/fop/fo/flow/ExternalGraphic.java
  24. 4
    2
      src/java/org/apache/fop/fo/properties/CommonBorderPaddingBackground.java
  25. 4
    12
      src/java/org/apache/fop/image/ImageFactory.java
  26. 2
    1
      src/java/org/apache/fop/image/ImageLoader.java
  27. 2
    3
      src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java
  28. 5
    5
      src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
  29. 2
    1
      src/java/org/apache/fop/render/PrintRenderer.java
  30. 1
    1
      src/java/org/apache/fop/render/RendererFactory.java
  31. 1
    1
      src/java/org/apache/fop/render/java2d/Java2DRenderer.java
  32. 79
    3
      src/java/org/apache/fop/render/pdf/PDFRenderer.java
  33. 1
    1
      src/java/org/apache/fop/render/ps/PSRenderer.java
  34. 3
    2
      src/java/org/apache/fop/render/rtf/RTFHandler.java
  35. 32
    154
      src/java/org/apache/fop/servlet/FopPrintServlet.java
  36. 50
    32
      src/java/org/apache/fop/servlet/FopServlet.java
  37. 6
    3
      src/java/org/apache/fop/tools/TestConverter.java
  38. 5
    4
      src/java/org/apache/fop/tools/anttasks/Fop.java
  39. 0
    12
      src/java/org/apache/fop/util/ContentHandlerFactoryRegistry.java
  40. 13
    8
      test/java/org/apache/fop/BasicDriverTestCase.java
  41. 7
    4
      test/java/org/apache/fop/GenericFOPTestCase.java
  42. 12
    9
      test/java/org/apache/fop/URIResolutionTestCase.java
  43. 8
    15
      test/java/org/apache/fop/fotreetest/FOTreeTester.java
  44. 6
    2
      test/java/org/apache/fop/intermediate/AreaTreeParserTestCase.java
  45. 10
    7
      test/java/org/apache/fop/layoutengine/LayoutEngineTester.java
  46. 7
    4
      test/java/org/apache/fop/threading/FOProcessorImpl.java
  47. 7
    4
      test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java
  48. 7
    4
      test/java/org/apache/fop/visual/BitmapProducerJava2D.java

+ 1
- 1
build.xml View File

@@ -142,7 +142,7 @@ list of possible build targets.
<property name="Name" value="Apache FOP"/>
<property name="name" value="fop"/>
<property name="NAME" value="FOP"/>
<property name="version" value="0.91svn"/>
<property name="version" value="svn-trunk"/>
<property name="year" value="1999-2006"/>

<property name="javac.debug" value="on"/>

+ 17
- 3
examples/embedding/java/embedding/ExampleAWTViewer.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2003,2005 The Apache Software Foundation.
* Copyright 1999-2003,2005-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -37,19 +37,29 @@ import org.apache.avalon.framework.ExceptionUtil;
//FOP
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.fo.Constants;
/**
* This class demonstrates the use of the AWT Viewer.
*/
public class ExampleAWTViewer {
// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();
/**
* Display an FO file in the AWT Preview.
* @param fo the FO file
* @throws IOException In case of an I/O problem
* @throws FOPException In case of a problem during layout
* @throws TransformerException In case of a problem during XML processing
*/
public void viewFO(File fo)
throws IOException, FOPException, TransformerException {
//Setup FOP
Fop fop = new Fop(MimeConstants.MIME_FOP_AWT_PREVIEW);
Fop fop = fopFactory.newFop(MimeConstants.MIME_FOP_AWT_PREVIEW);
try {
@@ -68,6 +78,10 @@ public class ExampleAWTViewer {
}
}
/**
* Main method.
* @param args the command-line arguments
*/
public static void main(String[] args) {
try {
System.out.println("FOP ExampleAWTViewer\n");

+ 54
- 40
examples/embedding/java/embedding/ExampleDOM2PDF.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2004, 2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,10 +20,10 @@ package embedding;

// Java
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;

//JAXP
import javax.xml.transform.Transformer;
@@ -40,7 +40,9 @@ import org.w3c.dom.Node;
import org.w3c.dom.Text;

// FOP
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;


@@ -50,6 +52,9 @@ import org.apache.fop.apps.MimeConstants;
*/
public class ExampleDOM2PDF {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();
/** xsl-fo namespace URI */
protected static String foNS = "http://www.w3.org/1999/XSL/Format";

@@ -57,20 +62,19 @@ public class ExampleDOM2PDF {
* Converts a DOM Document to a PDF file using FOP.
* @param xslfoDoc the DOM Document
* @param pdf the target PDF file
* @throws IOException In case of an I/O problem
* @throws FOPException In case of a FOP problem
*/
public void convertDOM2PDF(Document xslfoDoc, File pdf) {
try {
// Construct fop with desired output format
Fop fop = new Fop(MimeConstants.MIME_PDF);
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// configure foUserAgent as desired
// Setup output
OutputStream out = new java.io.FileOutputStream(pdf);
out = new java.io.BufferedOutputStream(out);
try {
fop.setOutputStream(out);
// Construct fop with desired output format and output stream
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
// Setup Identity Transformer
TransformerFactory factory = TransformerFactory.newInstance();
@@ -113,38 +117,7 @@ public class ExampleDOM2PDF {
System.out.println("PDF Output File: " + pdffile);
System.out.println();
// Create a sample XSL-FO DOM document
Document foDoc = null;
Element root = null, ele1 = null, ele2 = null, ele3 = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
foDoc = db.newDocument();
root = foDoc.createElementNS(foNS, "fo:root");
foDoc.appendChild(root);
ele1 = foDoc.createElementNS(foNS, "fo:layout-master-set");
root.appendChild(ele1);
ele2 = foDoc.createElementNS(foNS, "fo:simple-page-master");
ele1.appendChild(ele2);
ele2.setAttributeNS(null, "master-name", "letter");
ele2.setAttributeNS(null, "page-height", "11in");
ele2.setAttributeNS(null, "page-width", "8.5in");
ele2.setAttributeNS(null, "margin-top", "1in");
ele2.setAttributeNS(null, "margin-bottom", "1in");
ele2.setAttributeNS(null, "margin-left", "1in");
ele2.setAttributeNS(null, "margin-right", "1in");
ele3 = foDoc.createElementNS(foNS, "fo:region-body");
ele2.appendChild(ele3);
ele1 = foDoc.createElementNS(foNS, "fo:page-sequence");
root.appendChild(ele1);
ele1.setAttributeNS(null, "master-reference", "letter");
ele2 = foDoc.createElementNS(foNS, "fo:flow");
ele1.appendChild(ele2);
ele2.setAttributeNS(null, "flow-name", "xsl-region-body");
addElement(ele2, "fo:block", "Hello World!");
Document foDoc = buildDOMDocument();
ExampleDOM2PDF app = new ExampleDOM2PDF();
app.convertDOM2PDF(foDoc, pdffile);
@@ -157,6 +130,47 @@ public class ExampleDOM2PDF {
}
}

/**
* Builds the example FO document as a DOM in memory.
* @return the FO document
* @throws ParserConfigurationException In case there is a problem creating a DOM document
*/
private static Document buildDOMDocument() throws ParserConfigurationException {
// Create a sample XSL-FO DOM document
Document foDoc = null;
Element root = null, ele1 = null, ele2 = null, ele3 = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
foDoc = db.newDocument();
root = foDoc.createElementNS(foNS, "fo:root");
foDoc.appendChild(root);
ele1 = foDoc.createElementNS(foNS, "fo:layout-master-set");
root.appendChild(ele1);
ele2 = foDoc.createElementNS(foNS, "fo:simple-page-master");
ele1.appendChild(ele2);
ele2.setAttributeNS(null, "master-name", "letter");
ele2.setAttributeNS(null, "page-height", "11in");
ele2.setAttributeNS(null, "page-width", "8.5in");
ele2.setAttributeNS(null, "margin-top", "1in");
ele2.setAttributeNS(null, "margin-bottom", "1in");
ele2.setAttributeNS(null, "margin-left", "1in");
ele2.setAttributeNS(null, "margin-right", "1in");
ele3 = foDoc.createElementNS(foNS, "fo:region-body");
ele2.appendChild(ele3);
ele1 = foDoc.createElementNS(foNS, "fo:page-sequence");
root.appendChild(ele1);
ele1.setAttributeNS(null, "master-reference", "letter");
ele2 = foDoc.createElementNS(foNS, "fo:flow");
ele1.appendChild(ele2);
ele2.setAttributeNS(null, "flow-name", "xsl-region-body");
addElement(ele2, "fo:block", "Hello World!");
return foDoc;
}

/**
* Adds an element to the DOM.
* @param parent parent node to attach the new element to

+ 8
- 7
examples/embedding/java/embedding/ExampleFO2OldStylePrint.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2005 The Apache Software Foundation.
* Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,7 +36,7 @@ import javax.xml.transform.sax.SAXResult;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.render.print.PrintRenderer;
/**
@@ -44,6 +44,9 @@ import org.apache.fop.render.print.PrintRenderer;
*/
public class ExampleFO2OldStylePrint {
// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();
/**
* Prints an FO file using an old-style PrinterJob.
* @param fo the FO file
@@ -60,13 +63,11 @@ public class ExampleFO2OldStylePrint {
try {
//Set up a custom user agent so we can supply our own renderer instance
FOUserAgent userAgent = new FOUserAgent();
FOUserAgent userAgent = fopFactory.newFOUserAgent();
userAgent.setRendererOverride(renderer);
// Construct fop with desired output format
Fop fop = new Fop(MimeConstants.MIME_FOP_PRINT, userAgent);
//Note: the first parameter here has no effect if we use
//FOUserAgent.setRendererOverride()
// Construct fop with desired output format (here, it is set through the user agent)
Fop fop = fopFactory.newFop(userAgent);
// Setup JAXP using identity transformer
TransformerFactory factory = TransformerFactory.newInstance();

+ 11
- 4
examples/embedding/java/embedding/ExampleFO2PDF.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2005 The Apache Software Foundation.
* Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,8 +35,10 @@ import javax.xml.transform.sax.SAXResult;


// FOP
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.FormattingResults;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.apps.PageSequenceResults;
@@ -46,6 +48,9 @@ import org.apache.fop.apps.PageSequenceResults;
*/
public class ExampleFO2PDF {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();

/**
* Converts an FO file to a PDF file using FOP
* @param fo the FO file
@@ -58,14 +63,16 @@ public class ExampleFO2PDF {
OutputStream out = null;
try {
// Construct fop with desired output format
Fop fop = new Fop(MimeConstants.MIME_PDF);
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// configure foUserAgent as desired
// Setup output stream. Note: Using BufferedOutputStream
// for performance reasons (helpful with FileOutputStreams).
out = new FileOutputStream(pdf);
out = new BufferedOutputStream(out);
fop.setOutputStream(out);

// Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

// Setup JAXP using identity transformer
TransformerFactory factory = TransformerFactory.newInstance();

+ 16
- 11
examples/embedding/java/embedding/ExampleFO2PDFUsingSAXParser.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2004,2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,8 +36,9 @@ import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;

// FOP
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;

/**
@@ -46,32 +47,36 @@ import org.apache.fop.apps.MimeConstants;
*/
public class ExampleFO2PDFUsingSAXParser {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();

/**
* Converts an FO file to a PDF file using FOP
* @param fo the FO file
* @param pdf the target PDF file
* @throws FactoryConfigurationError
* @throws ParserConfigurationException
* @throws SAXException
* @throws FactoryConfigurationError In case of a problem with the JAXP factory configuration
* @throws ParserConfigurationException In case of a problem with the parser configuration
* @throws SAXException In case of a problem during XML processing
* @throws IOException In case of an I/O problem
* @throws FOPException In case of a FOP problem
*/
public void convertFO2PDF(File fo, File pdf)
throws FactoryConfigurationError,
ParserConfigurationException,
FOPException, SAXException, IOException {
SAXException, IOException {

FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// configure foUserAgent as desired

OutputStream out = null;
try {
// Construct fop and setup output format
Fop fop = new Fop(MimeConstants.MIME_PDF);
// Setup output stream. Note: Using BufferedOutputStream
// for performance reasons (helpful with FileOutputStreams).
out = new FileOutputStream(pdf);
out = new BufferedOutputStream(out);
fop.setOutputStream(out);
// Construct fop and setup output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

// Setup SAX parser
// throws FactoryConfigurationError

+ 13
- 6
examples/embedding/java/embedding/ExampleFO2RTF.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 2005 The Apache Software Foundation.
* Copyright 2005-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,18 +34,23 @@ import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.sax.SAXResult;

// FOP
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;

/**
* This class demonstrates the conversion of an FO file to RTF using FOP.
* <p>
* Please note that this is practically the same as the ExampleFO2PDF example. Only
* one parameter to the Fop contructor is different!
* the MIME parameter to the newFop() method is different!
*/
public class ExampleFO2RTF {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();

/**
* Converts an FO file to a RTF file using FOP
* @param fo the FO file
@@ -55,18 +60,20 @@ public class ExampleFO2RTF {
*/
public void convertFO2RTF(File fo, File rtf) throws IOException, FOPException {
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// configure foUserAgent as desired

OutputStream out = null;
try {
// Construct fop with desired output format
Fop fop = new Fop(MimeConstants.MIME_RTF);
// Setup output stream. Note: Using BufferedOutputStream
// for performance reasons (helpful with FileOutputStreams).
out = new FileOutputStream(rtf);
out = new BufferedOutputStream(out);
fop.setOutputStream(out);

// Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_RTF, foUserAgent, out);
// Setup JAXP using identity transformer
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(); // identity transformer

+ 10
- 4
examples/embedding/java/embedding/ExampleObj2PDF.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
* Copyright 1999-2004,2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,8 +33,10 @@ import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.sax.SAXResult;

// FOP
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 embedding.model.ProjectTeam;
@@ -45,6 +47,9 @@ import embedding.model.ProjectTeam;
*/
public class ExampleObj2PDF {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();

/**
* Converts a ProjectTeam object to a PDF file.
* @param team the ProjectTeam object
@@ -57,14 +62,15 @@ public class ExampleObj2PDF {
public void convertProjectTeam2PDF(ProjectTeam team, File xslt, File pdf)
throws IOException, FOPException, TransformerException {
// Construct fop with desired output format
Fop fop = new Fop(MimeConstants.MIME_PDF);
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// configure foUserAgent as desired

// Setup output
OutputStream out = new java.io.FileOutputStream(pdf);
out = new java.io.BufferedOutputStream(out);
try {
fop.setOutputStream(out);
// Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();

+ 11
- 5
examples/embedding/java/embedding/ExampleXML2PDF.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2005 The Apache Software Foundation.
* Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -31,7 +31,9 @@ import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.sax.SAXResult;

//FOP
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;

/**
@@ -65,15 +67,19 @@ public class ExampleXML2PDF {
System.out.println();
System.out.println("Transforming...");
// Construct fop with desired output format
Fop fop = new Fop(MimeConstants.MIME_PDF);
// configure fopFactory as desired
FopFactory fopFactory = FopFactory.newInstance();

FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// configure foUserAgent as desired

// Setup output
OutputStream out = new java.io.FileOutputStream(pdffile);
out = new java.io.BufferedOutputStream(out);
try {
fop.setOutputStream(out);
// Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();

+ 173
- 0
examples/embedding/java/embedding/MultipleFO2PDF.java View File

@@ -0,0 +1,173 @@
/*
* Copyright 2006 The Apache Software Foundation.
*
* Licensed 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 embedding;

// Java
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

//JAXP
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Source;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.sax.SAXResult;

// FOP
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.FormattingResults;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.apps.PageSequenceResults;

/**
* This class demonstrates the conversion of multiple FO files to PDF using FOP.
* The FopFactory is reused. Its configuration is applied to each rendering run.
* The FOUserAgent and Fop are newly created by the FopFactory for each run.
* The FOUserAgent can be configured differently for each run.
*/
public class MultipleFO2PDF {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();

// JAXP TransformerFactory can be reused, too
private TransformerFactory factory = TransformerFactory.newInstance();
/**
* Converts an FO file to a PDF file using FOP
* @param fo the FO file
* @param pdf the target PDF file
* @throws TransformerException in case of a transformation problem
* @throws IOException in case of an I/O problem
* @throws FOPException in case of a FOP problem
* @return the formatting results of the run
*/
public FormattingResults convertFO2PDF(File fo, File pdf)
throws TransformerException, IOException, FOPException {
OutputStream out = null;
Fop fop;
try {
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// configure foUserAgent as desired
// Setup output stream. Note: Using BufferedOutputStream
// for performance reasons (helpful with FileOutputStreams).
out = new FileOutputStream(pdf);
out = new BufferedOutputStream(out);

// Construct fop with desired output format and output stream
fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

// Setup JAXP using identity transformer
Transformer transformer = factory.newTransformer(); // identity transformer
// Setup input stream
Source src = new StreamSource(fo);

// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
// Start XSLT transformation and FOP processing
transformer.transform(src, res);
} finally {
out.close();
}

return fop.getResults();
}

/**
* Listens on standard in for names of fo files to be transformed to pdf.
* 'quit' or the null string (for piped input) cause the listener to stop listening.
*/
public void listen() {

//Setup directories
File baseDir = new File(".");
File outDir = new File(baseDir, "out");
outDir.mkdirs();
BufferedReader in = new BufferedReader(new java.io.InputStreamReader(System.in));
while (true) {
try {
// Listen for the input file name
System.out.print("Input XSL-FO file ('quit' to stop): ");
String foname = in.readLine();
if (foname == null) {
System.out.println("Null input, quitting");
return;
}
foname.trim();
if (foname.equals("quit")) {
System.out.println("Quitting");
return;
}
File fofile = new File(baseDir, foname);
String pdfname = foname;
pdfname.replaceFirst("\\.fo", ".pdf");
File pdffile = new File(outDir, pdfname);

// transform and render
System.out.print("Transforming " + fofile + " to PDF file " + pdffile + "...");
FormattingResults foResults = convertFO2PDF(fofile, pdffile);
System.out.println("done!");

// Result processing
java.util.List pageSequences = foResults.getPageSequences();
for (java.util.Iterator it = pageSequences.iterator(); it.hasNext();) {
PageSequenceResults pageSequenceResults = (PageSequenceResults)it.next();
System.out.println("PageSequence "
+ (String.valueOf(pageSequenceResults.getID()).length() > 0
? pageSequenceResults.getID() : "<no id>")
+ " generated " + pageSequenceResults.getPageCount() + " pages.");
}
System.out.println("Generated " + foResults.getPageCount() + " pages in total.");

} catch (Exception e) {
System.out.println("failure!");
e.printStackTrace(System.out);
} finally {
System.out.println("");
}
}
}
/**
* Main method. Set up the listener.
* @param args command-line arguments
*/
public static void main(String[] args) {
System.out.println("FOP MultipleFO2PDF\n");
System.out.println("Preparing...");
MultipleFO2PDF m = new MultipleFO2PDF();
m.listen();
}

}

+ 8
- 6
examples/embedding/java/embedding/intermediate/ExampleConcat.java View File

@@ -33,6 +33,7 @@ import javax.xml.transform.stream.StreamSource;
import org.apache.fop.apps.FOPException;
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.area.AreaTreeModel;
import org.apache.fop.area.AreaTreeParser;
@@ -53,6 +54,9 @@ import embedding.model.ProjectTeam;
*/
public class ExampleConcat {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();

/**
* Creates a sample ProjectTeam instance for this demo.
* @return ProjectTeam the newly created ProjectTeam instance
@@ -80,7 +84,7 @@ public class ExampleConcat {
throws IOException, FOPException, TransformerException {
//Create a user agent
FOUserAgent userAgent = new FOUserAgent();
FOUserAgent userAgent = fopFactory.newFOUserAgent();
//Create an instance of the target renderer so the XMLRenderer can use its font setup
Renderer targetRenderer = userAgent.getRendererFactory().createRenderer(
@@ -96,14 +100,12 @@ public class ExampleConcat {
//Make sure the prepared XMLRenderer is used
userAgent.setRendererOverride(xmlRenderer);
// Construct fop (the MIME type here is unimportant due to the override on the user agent)
Fop fop = new Fop(MimeConstants.MIME_FOP_AREA_TREE, userAgent);

// Setup output
OutputStream out = new java.io.FileOutputStream(intermediate);
out = new java.io.BufferedOutputStream(out);
try {
fop.setOutputStream(out);
// Construct fop (the MIME type here is unimportant due to the override on the user agent)
Fop fop = new Fop(MimeConstants.MIME_FOP_AREA_TREE, userAgent, out);

// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();
@@ -140,7 +142,7 @@ public class ExampleConcat {
try {
//Setup fonts and user agent
FontInfo fontInfo = new FontInfo();
FOUserAgent userAgent = new FOUserAgent();
FOUserAgent userAgent = fopFactory.newFOUserAgent();

//Construct the AreaTreeModel that will received the individual pages
AreaTreeModel treeModel = new RenderPagesModel(userAgent,

+ 5
- 1
examples/embedding/java/embedding/intermediate/ExampleStamp.java View File

@@ -30,6 +30,7 @@ import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.area.AreaTreeModel;
import org.apache.fop.area.AreaTreeParser;
@@ -46,6 +47,9 @@ import embedding.model.ProjectTeam;
*/
public class ExampleStamp {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();
/**
* Stamps an intermediate file and renders it to a PDF file.
* @param atfile the intermediate file (area tree XML)
@@ -63,7 +67,7 @@ public class ExampleStamp {
try {
//Setup fonts and user agent
FontInfo fontInfo = new FontInfo();
FOUserAgent userAgent = new FOUserAgent();
FOUserAgent userAgent = fopFactory.newFOUserAgent();

//Construct the AreaTreeModel that will received the individual pages
AreaTreeModel treeModel = new RenderPagesModel(userAgent,

+ 111
- 314
src/java/org/apache/fop/apps/FOUserAgent.java View File

@@ -20,10 +20,7 @@ package org.apache.fop.apps;

// Java
import java.io.File;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
@@ -39,19 +36,17 @@ import org.apache.commons.logging.LogFactory;

// FOP
import org.apache.fop.Version;
import org.apache.fop.fo.ElementMapping;
import org.apache.fop.fo.FOEventHandler;
import org.apache.fop.hyphenation.HyphenationTreeResolver;
import org.apache.fop.layoutmgr.LayoutManagerMaker;
import org.apache.fop.pdf.PDFEncryptionParams;
import org.apache.fop.render.Renderer;
import org.apache.fop.render.RendererFactory;
import org.apache.fop.render.XMLHandlerRegistry;
import org.apache.fop.render.pdf.PDFRenderer;

/**
* The User Agent for fo.
* This user agent is used by the processing to obtain user configurable
* options.
* This is the user agent for FOP.
* It is the entity through which you can interact with the XSL-FO processing and is
* used by the processing to obtain user configurable options.
* <p>
* Renderer specific extensions (that do not produce normal areas on
* the output) will be done like so:
@@ -70,65 +65,25 @@ import org.apache.fop.render.XMLHandlerRegistry;
*/
public class FOUserAgent {

/** Defines the default source resolution (72dpi) for FOP */
public static final float DEFAULT_SOURCE_RESOLUTION = 72.0f; //dpi
/** Defines the default target resolution (72dpi) for FOP */
public static final float DEFAULT_TARGET_RESOLUTION = 72.0f; //dpi
/** Defines the default page-height */
public static final String DEFAULT_PAGE_HEIGHT = "11in";
/** Defines the default page-width */
public static final String DEFAULT_PAGE_WIDTH = "8.26in";
/** Factory for Renderers and FOEventHandlers */
private RendererFactory rendererFactory = new RendererFactory();
/** Registry for XML handlers */
private XMLHandlerRegistry xmlHandlers = new XMLHandlerRegistry();
/** The resolver for user-supplied hyphenation patterns */
private HyphenationTreeResolver hyphResolver;

private static Log log = LogFactory.getLog("FOP");

private FopFactory factory;
/** The base URL for all URL resolutions, especially for external-graphics */
private String baseURL;
/** The base URL for all font URL resolutions */
private String fontBaseURL;
/** A user settable URI Resolver */
private URIResolver uriResolver = null;
/** Our default resolver if none is set */
private URIResolver foURIResolver = new FOURIResolver();
private PDFEncryptionParams pdfEncryptionParams;
private float sourceResolution = DEFAULT_SOURCE_RESOLUTION;
private float targetResolution = DEFAULT_TARGET_RESOLUTION;
private String pageHeight = DEFAULT_PAGE_HEIGHT;
private String pageWidth = DEFAULT_PAGE_WIDTH;
private Map rendererOptions = new java.util.HashMap();
private File outputFile = null;
private Renderer rendererOverride = null;
private FOEventHandler foEventHandlerOverride = null;
private LayoutManagerMaker lmMakerOverride = null;
/* user configuration */
private Configuration userConfig = null;
private Log log = LogFactory.getLog("FOP");
/* FOP has the ability, for some FO's, to continue processing even if the
* input XSL violates that FO's content model. This is the default
* behavior for FOP. However, this flag, if set, provides the user the
* ability for FOP to halt on all content model violations if desired.
*/
private boolean strictValidation = true;
/** @see #setBreakIndentInheritanceOnReferenceAreaBoundary(boolean) */
private boolean breakIndentInheritanceOnReferenceAreaBoundary = false;

/** Allows enabling kerning on the base 14 fonts, default is false */
private boolean enableBase14Kerning = false;
/* Additional fo.ElementMapping subclasses set by user */
private List additionalElementMappings = null;

/** Producer: Metadata element for the system/software that produces
* the document. (Some renderers can store this in the document.)
*/
@@ -152,24 +107,43 @@ public class FOUserAgent {
protected String keywords = null;
/**
* Add the element mapping with the given class name.
* @param elementMapping the class name representing the element mapping.
* Default constructor
* @see org.apache.fop.apps.FopFactory
* @deprecated Provided for compatibility only. Please use the methods from
* FopFactory to construct FOUserAgent instances!
*/
public void addElementMapping(ElementMapping elementMapping) {
if (additionalElementMappings == null) {
additionalElementMappings = new java.util.ArrayList();
}
additionalElementMappings.add(elementMapping);
public FOUserAgent() {
this(FopFactory.newInstance());
}
/**
* Returns the List of user-added ElementMapping class names
* @return List of Strings holding ElementMapping names.
* Main constructor. <b>This constructor should not be called directly. Please use the
* methods from FopFactory to construct FOUserAgent instances!</b>
* @param factory the factory that provides environment-level information
* @see org.apache.fop.apps.FopFactory
*/
public List getAdditionalElementMappings() {
return additionalElementMappings;
public FOUserAgent(FopFactory factory) {
if (factory == null) {
throw new NullPointerException("The factory parameter must not be null");
}
this.factory = factory;
try {
if (factory.getUserConfig() != null) {
configure(factory.getUserConfig());
}
} catch (ConfigurationException cfge) {
log.error("Error while initializing the user asgent: "
+ cfge.getMessage());
}
}

/** @return the associated FopFactory instance */
public FopFactory getFactory() {
return this.factory;
}
// ---------------------------------------------- rendering-run dependent stuff
/**
* Sets an explicit renderer to use which overrides the one defined by the
* render type setting.
@@ -204,78 +178,6 @@ public class FOUserAgent {
return this.foEventHandlerOverride;
}

/**
* Activates strict XSL content model validation for FOP
* Default is false (FOP will continue processing where it can)
* @param validateStrictly true to turn on strict validation
*/
public void setStrictValidation(boolean validateStrictly) {
this.strictValidation = validateStrictly;
}

/**
* Returns whether FOP is strictly validating input XSL
* @return true of strict validation turned on, false otherwise
*/
public boolean validateStrictly() {
return strictValidation;
}

/**
* @return true if the indent inheritance should be broken when crossing reference area
* boundaries (for more info, see the javadoc for the relative member variable)
*/
public boolean isBreakIndentInheritanceOnReferenceAreaBoundary() {
return breakIndentInheritanceOnReferenceAreaBoundary;
}

/**
* Controls whether to enable a feature that breaks indent inheritance when crossing
* reference area boundaries.
* <p>
* This flag controls whether FOP will enable special code that breaks property
* inheritance for start-indent and end-indent when the evaluation of the inherited
* value would cross a reference area. This is described under
* http://wiki.apache.org/xmlgraphics-fop/IndentInheritance as is intended to
* improve interoperability with commercial FO implementations and to produce
* results that are more in line with the expectation of unexperienced FO users.
* Note: Enabling this features violates the XSL specification!
* @param value true to enable the feature
*/
public void setBreakIndentInheritanceOnReferenceAreaBoundary(boolean value) {
this.breakIndentInheritanceOnReferenceAreaBoundary = value;
}
/** @return true if kerning on base 14 fonts is enabled */
public boolean isBase14KerningEnabled() {
return this.enableBase14Kerning;
}
/**
* Controls whether kerning is activated on base 14 fonts.
* @param value true if kerning should be activated
*/
public void setBase14KerningEnabled(boolean value) {
this.enableBase14Kerning = value;
}
/**
* Sets an explicit LayoutManagerMaker instance which overrides the one
* defined by the AreaTreeHandler.
* @param lmMaker the LayoutManagerMaker instance
*/
public void setLayoutManagerMakerOverride(LayoutManagerMaker lmMaker) {
this.lmMakerOverride = lmMaker;
}

/**
* Returns the overriding LayoutManagerMaker instance, if any.
* @return the overriding LayoutManagerMaker or null
*/
public LayoutManagerMaker getLayoutManagerMakerOverride() {
return this.lmMakerOverride;
}

/**
* Sets the producer of the document.
* @param producer source of document
@@ -382,95 +284,18 @@ public class FOUserAgent {
}

/**
* Set the user configuration.
* @param userConfig configuration
*/
public void setUserConfig(Configuration userConfig) {
this.userConfig = userConfig;
try {
initUserConfig();
} catch (ConfigurationException cfge) {
log.error("Error initializing User Agent configuration: "
+ cfge.getMessage());
}
}

/**
* Get the user configuration.
* @return the user configuration
* Configures the FOUserAgent through the factory's configuration.
* @see org.apache.avalon.framework.configuration.Configurable
*/
public Configuration getUserConfig() {
return userConfig;
}
/**
* Initializes user agent settings from the user configuration
* file, if present: baseURL, resolution, default page size,...
*
* @throws ConfigurationException when there is an entry that
* misses the required attribute
*/
public void initUserConfig() throws ConfigurationException {
log.debug("Initializing User Agent Configuration");
setBaseURL(getBaseURLfromConfig("base"));
setFontBaseURL(getBaseURLfromConfig("font-base"));
final String hyphBase = getBaseURLfromConfig("hyphenation-base");
if (hyphBase != null) {
this.hyphResolver = new HyphenationTreeResolver() {
public Source resolve(String href) {
return resolveURI(href, hyphBase);
}
};
}
if (userConfig.getChild("source-resolution", false) != null) {
this.sourceResolution
= userConfig.getChild("source-resolution").getValueAsFloat(
DEFAULT_SOURCE_RESOLUTION);
log.info("Source resolution set to: " + sourceResolution
+ "dpi (px2mm=" + getSourcePixelUnitToMillimeter() + ")");
}
if (userConfig.getChild("target-resolution", false) != null) {
protected void configure(Configuration cfg) throws ConfigurationException {
setBaseURL(FopFactory.getBaseURLfromConfig(cfg, "base"));
if (cfg.getChild("target-resolution", false) != null) {
this.targetResolution
= userConfig.getChild("target-resolution").getValueAsFloat(
= cfg.getChild("target-resolution").getValueAsFloat(
DEFAULT_TARGET_RESOLUTION);
log.info("Target resolution set to: " + targetResolution
+ "dpi (px2mm=" + getTargetPixelUnitToMillimeter() + ")");
}
if (userConfig.getChild("strict-validation", false) != null) {
this.strictValidation = userConfig.getChild("strict-validation").getValueAsBoolean();
}
if (userConfig.getChild("break-indent-inheritance", false) != null) {
this.breakIndentInheritanceOnReferenceAreaBoundary
= userConfig.getChild("break-indent-inheritance").getValueAsBoolean();
}
Configuration pageConfig = userConfig.getChild("default-page-settings");
if (pageConfig.getAttribute("height", null) != null) {
setPageHeight(pageConfig.getAttribute("height"));
log.info("Default page-height set to: " + pageHeight);
}
if (pageConfig.getAttribute("width", null) != null) {
setPageWidth(pageConfig.getAttribute("width"));
log.info("Default page-width set to: " + pageWidth);
}
}

private String getBaseURLfromConfig(String name) {
if (userConfig.getChild(name, false) != null) {
try {
String cfgBaseDir = userConfig.getChild(name).getValue(null);
if (cfgBaseDir != null) {
File dir = new File(cfgBaseDir);
if (dir.isDirectory()) {
cfgBaseDir = dir.toURL().toExternalForm();
}
}
log.info(name + " set to: " + cfgBaseDir);
return cfgBaseDir;
} catch (MalformedURLException mue) {
log.error("Base URL in user config is malformed!");
}
}
return null;
}
/**
@@ -478,21 +303,22 @@ public class FOUserAgent {
* @param mimeType MIME type of the renderer
* @return the requested configuration subtree, null if there's no configuration
*/
public Configuration getUserRendererConfig (String mimeType) {
public Configuration getUserRendererConfig(String mimeType) {

if (userConfig == null || mimeType == null) {
Configuration cfg = getFactory().getUserConfig();
if (cfg == null || mimeType == null) {
return null;
}

Configuration userRendererConfig = null;

Configuration[] cfgs
= userConfig.getChild("renderers").getChildren("renderer");
= cfg.getChild("renderers").getChildren("renderer");
for (int i = 0; i < cfgs.length; ++i) {
Configuration cfg = cfgs[i];
Configuration child = cfgs[i];
try {
if (cfg.getAttribute("mime").equals(mimeType)) {
userRendererConfig = cfg;
if (child.getAttribute("mime").equals(mimeType)) {
userRendererConfig = child;
break;
}
} catch (ConfigurationException e) {
@@ -520,28 +346,12 @@ public class FOUserAgent {
return this.baseURL;
}

/**
* Sets the font base URL.
* @param fontBaseURL font base URL
*/
public void setFontBaseURL(String fontBaseURL) {
this.fontBaseURL = fontBaseURL;
}

/**
* Returns the font base URL.
* @return the font base URL
*/
public String getFontBaseURL() {
return this.fontBaseURL != null ? this.fontBaseURL : this.baseURL;
}

/**
* Sets the URI Resolver.
* @param uriResolver the new URI resolver
* @param resolver the new URI resolver
*/
public void setURIResolver(URIResolver uriResolver) {
this.uriResolver = uriResolver;
public void setURIResolver(URIResolver resolver) {
this.uriResolver = resolver;
}

/**
@@ -555,18 +365,23 @@ public class FOUserAgent {
/**
* Returns the parameters for PDF encryption.
* @return the PDF encryption parameters, null if not applicable
* @deprecated Use (PDFEncryptionParams)getRendererOptions().get("encryption-params")
* instead.
*/
public PDFEncryptionParams getPDFEncryptionParams() {
return pdfEncryptionParams;
return (PDFEncryptionParams)getRendererOptions().get(PDFRenderer.ENCRYPTION_PARAMS);
}

/**
* Sets the parameters for PDF encryption.
* @param pdfEncryptionParams the PDF encryption parameters, null to
* disable PDF encryption
* @deprecated Use getRendererOptions().put("encryption-params",
* new PDFEncryptionParams(..)) instead or set every parameter separately:
* getRendererOptions().put("noprint", Boolean.TRUE).
*/
public void setPDFEncryptionParams(PDFEncryptionParams pdfEncryptionParams) {
this.pdfEncryptionParams = pdfEncryptionParams;
getRendererOptions().put(PDFRenderer.ENCRYPTION_PARAMS, pdfEncryptionParams);
}


@@ -588,27 +403,23 @@ public class FOUserAgent {
* Will use the configured resolver and if not successful fall back
* to the default resolver.
* @param uri URI to access
* @param baseURL the base url to resolve against
* @param base the base URI to resolve against
* @return A {@link javax.xml.transform.Source} object, or null if the URI
* cannot be resolved.
* @see org.apache.fop.apps.FOURIResolver
*/
public Source resolveURI(String uri, String baseURL) {
public Source resolveURI(String uri, String base) {
Source source = null;
if (uriResolver != null) {
try {
source = uriResolver.resolve(uri, baseURL);
source = uriResolver.resolve(uri, base);
} catch (TransformerException te) {
log.error("Attempt to resolve URI '" + uri + "' failed: ", te);
}
}
if (source == null) {
// URI Resolver not configured or returned null, use default resolver
try {
source = foURIResolver.resolve(uri, baseURL);
} catch (TransformerException te) {
log.error("Attempt to resolve URI '" + uri + "' failed: ", te);
}
// URI Resolver not configured or returned null, use default resolver from the factory
source = getFactory().resolveURI(uri, base);
}
return source;
}
@@ -629,45 +440,21 @@ public class FOUserAgent {
return outputFile;
}

/**
* Returns the conversion factor from pixel units to millimeters. This
* depends on the desired source resolution.
* @return float conversion factor
* @see getSourceResolution()
*/
public float getSourcePixelUnitToMillimeter() {
return 25.4f / this.sourceResolution;
}
/**
* Returns the conversion factor from pixel units to millimeters. This
* depends on the desired target resolution.
* @return float conversion factor
* @see getTargetResolution()
* @see #getTargetResolution()
*/
public float getTargetPixelUnitToMillimeter() {
return 25.4f / this.targetResolution;
}
/** @return the resolution for resolution-dependant input */
public float getSourceResolution() {
return this.sourceResolution;
}

/** @return the resolution for resolution-dependant output */
public float getTargetResolution() {
return this.targetResolution;
}

/**
* Sets the source resolution in dpi. This value is used to interpret the pixel size
* of source documents like SVG images and bitmap images without resolution information.
* @param dpi resolution in dpi
*/
public void setSourceResolution(int dpi) {
this.sourceResolution = dpi;
}
/**
* Sets the target resolution in dpi. This value defines the target resolution of
* bitmap images generated by the bitmap renderers (such as the TIFF renderer) and of
@@ -678,24 +465,39 @@ public class FOUserAgent {
this.targetResolution = dpi;
}
// ---------------------------------------------- environment-level stuff
// (convenience access to FopFactory methods)

/** @return the font base URL */
public String getFontBaseURL() {
String fontBaseURL = getFactory().getFontBaseURL();
return fontBaseURL != null ? fontBaseURL : this.baseURL;
}

/**
* Gets the default page-height to use as fallback,
* in case page-height="auto"
*
* @return the page-height, as a String
* Returns the conversion factor from pixel units to millimeters. This
* depends on the desired source resolution.
* @return float conversion factor
* @see #getSourceResolution()
*/
public String getPageHeight() {
return this.pageHeight;
public float getSourcePixelUnitToMillimeter() {
return getFactory().getSourcePixelUnitToMillimeter();
}
/** @return the resolution for resolution-dependant input */
public float getSourceResolution() {
return getFactory().getSourceResolution();
}

/**
* Sets the page-height to use as fallback, in case
* page-height="auto"
* Gets the default page-height to use as fallback,
* in case page-height="auto"
*
* @param pageHeight page-height as a String
* @return the page-height, as a String
* @see FopFactory#getPageHeight()
*/
public void setPageHeight(String pageHeight) {
this.pageHeight = pageHeight;
public String getPageHeight() {
return getFactory().getPageHeight();
}
/**
@@ -703,48 +505,43 @@ public class FOUserAgent {
* in case page-width="auto"
*
* @return the page-width, as a String
* @see FopFactory#getPageWidth()
*/
public String getPageWidth() {
return this.pageWidth;
return getFactory().getPageWidth();
}
/**
* Sets the page-width to use as fallback, in case
* page-width="auto"
*
* @param pageWidth page-width as a String
* Returns whether FOP is strictly validating input XSL
* @return true of strict validation turned on, false otherwise
* @see FopFactory#validateStrictly()
*/
public void setPageWidth(String pageWidth) {
this.pageWidth = pageWidth;
public boolean validateStrictly() {
return getFactory().validateStrictly();
}
/**
* If to create hot links to footnotes and before floats.
* @return True if hot links should be created
* @return true if the indent inheritance should be broken when crossing reference area
* boundaries (for more info, see the javadoc for the relative member variable)
* @see FopFactory#isBreakIndentInheritanceOnReferenceAreaBoundary()
*/
/* TODO This method is never referenced!
public boolean linkToFootnotes() {
return true;
}*/
public boolean isBreakIndentInheritanceOnReferenceAreaBoundary() {
return getFactory().isBreakIndentInheritanceOnReferenceAreaBoundary();
}

/**
* @return the RendererFactory
*/
public RendererFactory getRendererFactory() {
return this.rendererFactory;
return getFactory().getRendererFactory();
}

/**
* @return the XML handler registry
*/
public XMLHandlerRegistry getXMLHandlerRegistry() {
return this.xmlHandlers;
return getFactory().getXMLHandlerRegistry();
}

/** @return the HyphenationTreeResolver for resolving user-supplied hyphenation patterns. */
public HyphenationTreeResolver getHyphenationTreeResolver() {
return this.hyphResolver;
}
}


+ 51
- 9
src/java/org/apache/fop/apps/Fop.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2005 The Apache Software Foundation.
* Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,7 +25,6 @@ import java.io.OutputStream;
import org.xml.sax.helpers.DefaultHandler;

// FOP
import org.apache.fop.fo.Constants;
import org.apache.fop.fo.FOTreeBuilder;

/**
@@ -45,7 +44,7 @@ import org.apache.fop.fo.FOTreeBuilder;
* At the moment, it is recommended not to reuse an instance of this
* class for more than one rendering run.
*/
public class Fop implements Constants {
public class Fop {

// desired output format: MIME type such as "application/pdf", "application/postscript" etc.
private String outputFormat = null;
@@ -64,23 +63,54 @@ public class Fop implements Constants {
* output format (ex. "application/pdf" for PDF).
* @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
* @param ua FOUserAgent object
* @param stream the output stream
* @throws FOPException if setting up the DefaultHandler fails
* @deprecated End-users should use {@link FopFactory#newFop(String, FOUserAgent, OutputStream)}
* instead! This constructor will become invisible with FOP 1.0.
*/
public Fop(String outputFormat, FOUserAgent ua, OutputStream stream) throws FOPException {
this.outputFormat = outputFormat;

foUserAgent = ua;
if (foUserAgent == null) {
foUserAgent = FopFactory.newInstance().newFOUserAgent();
}
this.stream = stream;
createDefaultHandler();
}

/**
* Constructor for use with already-created FOUserAgents. It uses MIME types to select the
* output format (ex. "application/pdf" for PDF).
* @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
* @param ua FOUserAgent object
* @throws FOPException if setting up the DefaultHandler fails
* @deprecated End-users should use {@link FopFactory#newFop(String, FOUserAgent)} instead!
* This constructor will become invisible with FOP 1.0.
*/
public Fop(String outputFormat, FOUserAgent ua) {
public Fop(String outputFormat, FOUserAgent ua) throws FOPException {
this.outputFormat = outputFormat;

foUserAgent = ua;
if (foUserAgent == null) {
foUserAgent = new FOUserAgent();
foUserAgent = FopFactory.newInstance().newFOUserAgent();
}
createDefaultHandler();
}

/**
* Constructor for FOP with a default FOUserAgent. It uses MIME types to select the
* output format (ex. "application/pdf" for PDF).
* @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
* @deprecated End-users should use {@link FopFactory#newFop(String)} instead!
* This constructor will become invisible with FOP 1.0.
*/
public Fop(String outputFormat) {
this(outputFormat, null);
this.outputFormat = outputFormat;
foUserAgent = FopFactory.newInstance().newFOUserAgent();
}

/**
@@ -95,25 +125,36 @@ public class Fop implements Constants {
* Set the OutputStream to use to output the result of the Render
* (if applicable)
* @param stream the stream to output the result of rendering to
* @deprecated Use one of the factory methods on {@link FopFactory} with an OutputStream
* parameter instead. This method will be removed with FOP 1.0.
*/
public void setOutputStream(OutputStream stream) {
this.stream = stream;
}

/**
* Returns a DefaultHandler object used to generate the document.
* Creates a DefaultHandler object used to generate the document.
* Note this object implements the ContentHandler interface.
* For processing with a Transformer object, this DefaultHandler object
* can be used in the SAXResult constructor.
* Alternatively, for processing with a SAXParser, this object can be
* used as the DefaultHandler argument to its parse() methods.
*
* @return a SAX DefaultHandler for handling the SAX events.
* @throws FOPException if setting up the DefaultHandler fails
*/
private void createDefaultHandler() throws FOPException {
this.foTreeBuilder = new FOTreeBuilder(outputFormat, foUserAgent, stream);
}

/**
* Returns the DefaultHandler object used to generate the document.
* Checking for null and the exception is only for the deprecated constructor.
* @return the SAX DefaultHandler for handling the SAX events.
* @throws FOPException if setting up the DefaultHandler fails
*/
public DefaultHandler getDefaultHandler() throws FOPException {
if (foTreeBuilder == null) {
this.foTreeBuilder = new FOTreeBuilder(outputFormat, foUserAgent, stream);
createDefaultHandler();
}
return this.foTreeBuilder;
}
@@ -140,6 +181,7 @@ public class Fop implements Constants {
* Get the version of FOP
* @return the version string
* @deprecated Use {@link org.apache.fop.Version#getVersion()} instead!
* This method will be removed with FOP 1.0.
*/
public static String getVersion() {
return org.apache.fop.Version.getVersion();

+ 608
- 0
src/java/org/apache/fop/apps/FopFactory.java View File

@@ -0,0 +1,608 @@
/*
* Copyright 2006 The Apache Software Foundation.
*
* Licensed 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.apps;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.util.List;

import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;

import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fop.fo.ElementMapping;
import org.apache.fop.fo.ElementMappingRegistry;
import org.apache.fop.hyphenation.HyphenationTreeResolver;
import org.apache.fop.image.ImageFactory;
import org.apache.fop.layoutmgr.LayoutManagerMaker;
import org.apache.fop.render.RendererFactory;
import org.apache.fop.render.XMLHandlerRegistry;
import org.apache.fop.util.ContentHandlerFactoryRegistry;
import org.xml.sax.SAXException;

/**
* Factory class which instantiates new Fop and FOUserAgent instances. This class also holds
* environmental information and configuration used by FOP. Information that may potentially be
* different for each rendering run can be found and managed in the FOUserAgent.
*/
public class FopFactory {

/** Defines the default source resolution (72dpi) for FOP */
private static final float DEFAULT_SOURCE_RESOLUTION = 72.0f; //dpi
/** Defines the default page-height */
private static final String DEFAULT_PAGE_HEIGHT = "11in";
/** Defines the default page-width */
private static final String DEFAULT_PAGE_WIDTH = "8.26in";

/** logger instance */
private static Log log = LogFactory.getLog(FopFactory.class);
/** Factory for Renderers and FOEventHandlers */
private RendererFactory rendererFactory = new RendererFactory();
/** Registry for XML handlers */
private XMLHandlerRegistry xmlHandlers = new XMLHandlerRegistry();
/** The registry for ElementMapping instances */
private ElementMappingRegistry elementMappingRegistry;

/** The registry for ContentHandlerFactory instance */
private ContentHandlerFactoryRegistry contentHandlerFactoryRegistry
= new ContentHandlerFactoryRegistry();
/** Our default resolver if none is set */
private URIResolver foURIResolver = new FOURIResolver();
/** A user settable URI Resolver */
private URIResolver uriResolver = null;

/** The resolver for user-supplied hyphenation patterns */
private HyphenationTreeResolver hyphResolver;
private ImageFactory imageFactory = new ImageFactory();

/** user configuration */
private Configuration userConfig = null;

/** The base URL for all font URL resolutions */
private String fontBaseURL;
/**
* FOP has the ability, for some FO's, to continue processing even if the
* input XSL violates that FO's content model. This is the default
* behavior for FOP. However, this flag, if set, provides the user the
* ability for FOP to halt on all content model violations if desired.
*/
private boolean strictValidation = true;

/** Allows enabling kerning on the base 14 fonts, default is false */
private boolean enableBase14Kerning = false;
/** Source resolution in dpi */
private float sourceResolution = DEFAULT_SOURCE_RESOLUTION;
private String pageHeight = DEFAULT_PAGE_HEIGHT;
private String pageWidth = DEFAULT_PAGE_WIDTH;

/** @see #setBreakIndentInheritanceOnReferenceAreaBoundary(boolean) */
private boolean breakIndentInheritanceOnReferenceAreaBoundary = false;

/** Additional fo.ElementMapping subclasses set by user */
private List additionalElementMappings = null;

/** Optional overriding LayoutManagerMaker */
private LayoutManagerMaker lmMakerOverride = null;
/**
* Main constructor.
*/
protected FopFactory() {
this.elementMappingRegistry = new ElementMappingRegistry(this);
}
/**
* Returns a new FopFactory instance.
* @return the requested FopFactory instance.
*/
public static FopFactory newInstance() {
return new FopFactory();
}
/**
* Returns a new FOUserAgent instance. Use the FOUserAgent to configure special values that
* are particular to a rendering run. Don't reuse instances over multiple rendering runs but
* instead create a new one each time and reuse the FopFactory.
* @return the newly created FOUserAgent instance initialized with default values
*/
public FOUserAgent newFOUserAgent() {
FOUserAgent userAgent = new FOUserAgent(this);
return userAgent;
}

/**
* Returns a new {@link Fop} instance. FOP will be configured with a default user agent
* instance.
* <p>
* MIME types are used to select the output format (ex. "application/pdf" for PDF). You can
* use the constants defined in {@link MimeConstants}.
* @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
* @return the new Fop instance
* @throws FOPException when the constructor fails
*/
public Fop newFop(String outputFormat) throws FOPException {
return new Fop(outputFormat, newFOUserAgent());
}

/**
* Returns a new {@link Fop} instance. Use this factory method if you want to configure this
* very rendering run, i.e. if you want to set some metadata like the title and author of the
* document you want to render. In that case, create a new {@link FOUserAgent}
* instance using {@link #newFOUserAgent()}.
* <p>
* MIME types are used to select the output format (ex. "application/pdf" for PDF). You can
* use the constants defined in {@link MimeConstants}.
* @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
* @param userAgent the user agent that will be used to control the rendering run
* @return the new Fop instance
* @throws FOPException when the constructor fails
*/
public Fop newFop(String outputFormat, FOUserAgent userAgent) throws FOPException {
if (userAgent == null) {
throw new NullPointerException("The userAgent parameter must not be null!");
}
return new Fop(outputFormat, userAgent);
}
/**
* Returns a new {@link Fop} instance. FOP will be configured with a default user agent
* instance. Use this factory method if your output type requires an output stream.
* <p>
* MIME types are used to select the output format (ex. "application/pdf" for PDF). You can
* use the constants defined in {@link MimeConstants}.
* @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
* @param stream the output stream
* @return the new Fop instance
* @throws FOPException when the constructor fails
*/
public Fop newFop(String outputFormat, OutputStream stream) throws FOPException {
return new Fop(outputFormat, newFOUserAgent(), stream);
}

/**
* Returns a new {@link Fop} instance. Use this factory method if your output type
* requires an output stream and you want to configure this very rendering run,
* i.e. if you want to set some metadata like the title and author of the document
* you want to render. In that case, create a new {@link FOUserAgent} instance
* using {@link #newFOUserAgent()}.
* <p>
* MIME types are used to select the output format (ex. "application/pdf" for PDF). You can
* use the constants defined in {@link MimeConstants}.
* @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
* @param userAgent the user agent that will be used to control the rendering run
* @param stream the output stream
* @return the new Fop instance
* @throws FOPException when the constructor fails
*/
public Fop newFop(String outputFormat, FOUserAgent userAgent, OutputStream stream)
throws FOPException {
if (userAgent == null) {
throw new NullPointerException("The userAgent parameter must not be null!");
}
return new Fop(outputFormat, userAgent, stream);
}
/**
* Returns a new {@link Fop} instance. Use this factory method if you want to supply your
* own {@link org.apache.fop.render.Renderer Renderer} or
* {@link org.apache.fop.fo.FOEventHandler FOEventHandler}
* instance instead of the default ones created internally by FOP.
* @param userAgent the user agent that will be used to control the rendering run
* @return the new Fop instance
* @throws FOPException when the constructor fails
*/
public Fop newFop(FOUserAgent userAgent) throws FOPException {
if (userAgent.getRendererOverride() == null
&& userAgent.getFOEventHandlerOverride() == null) {
throw new IllegalStateException("Either the overriding renderer or the overriding"
+ " FOEventHandler must be set when this factory method is used!");
}
return newFop(null, userAgent);
}

/** @return the RendererFactory */
public RendererFactory getRendererFactory() {
return this.rendererFactory;
}

/** @return the XML handler registry */
public XMLHandlerRegistry getXMLHandlerRegistry() {
return this.xmlHandlers;
}
/** @return the element mapping registry */
public ElementMappingRegistry getElementMappingRegistry() {
return this.elementMappingRegistry;
}

/** @return the content handler factory registry */
public ContentHandlerFactoryRegistry getContentHandlerFactoryRegistry() {
return this.contentHandlerFactoryRegistry;
}

/** @return the image factory */
public ImageFactory getImageFactory() {
return this.imageFactory;
}

/**
* Add the element mapping with the given class name.
* @param elementMapping the class name representing the element mapping.
*/
public void addElementMapping(ElementMapping elementMapping) {
if (additionalElementMappings == null) {
additionalElementMappings = new java.util.ArrayList();
}
additionalElementMappings.add(elementMapping);
}

/**
* Returns the List of user-added ElementMapping class names
* @return List of Strings holding ElementMapping names.
*/
public List getAdditionalElementMappings() {
return additionalElementMappings;
}

/**
* Sets an explicit LayoutManagerMaker instance which overrides the one
* defined by the AreaTreeHandler.
* @param lmMaker the LayoutManagerMaker instance
*/
public void setLayoutManagerMakerOverride(LayoutManagerMaker lmMaker) {
this.lmMakerOverride = lmMaker;
}

/**
* Returns the overriding LayoutManagerMaker instance, if any.
* @return the overriding LayoutManagerMaker or null
*/
public LayoutManagerMaker getLayoutManagerMakerOverride() {
return this.lmMakerOverride;
}

/**
* Sets the font base URL.
* @param fontBaseURL font base URL
*/
public void setFontBaseURL(String fontBaseURL) {
this.fontBaseURL = fontBaseURL;
}

/** @return the font base URL */
public String getFontBaseURL() {
return this.fontBaseURL;
}

/**
* Sets the URI Resolver. It is used for resolving factory-level URIs like hyphenation
* patterns and as backup for URI resolution performed during a rendering run.
* @param resolver the new URI resolver
*/
public void setURIResolver(URIResolver resolver) {
this.uriResolver = resolver;
}

/**
* Returns the URI Resolver.
* @return the URI Resolver
*/
public URIResolver getURIResolver() {
return this.uriResolver;
}

/** @return the HyphenationTreeResolver for resolving user-supplied hyphenation patterns. */
public HyphenationTreeResolver getHyphenationTreeResolver() {
return this.hyphResolver;
}
/**
* Activates strict XSL content model validation for FOP
* Default is false (FOP will continue processing where it can)
* @param validateStrictly true to turn on strict validation
*/
public void setStrictValidation(boolean validateStrictly) {
this.strictValidation = validateStrictly;
}

/**
* Returns whether FOP is strictly validating input XSL
* @return true of strict validation turned on, false otherwise
*/
public boolean validateStrictly() {
return strictValidation;
}

/**
* @return true if the indent inheritance should be broken when crossing reference area
* boundaries (for more info, see the javadoc for the relative member variable)
*/
public boolean isBreakIndentInheritanceOnReferenceAreaBoundary() {
return breakIndentInheritanceOnReferenceAreaBoundary;
}

/**
* Controls whether to enable a feature that breaks indent inheritance when crossing
* reference area boundaries.
* <p>
* This flag controls whether FOP will enable special code that breaks property
* inheritance for start-indent and end-indent when the evaluation of the inherited
* value would cross a reference area. This is described under
* http://wiki.apache.org/xmlgraphics-fop/IndentInheritance as is intended to
* improve interoperability with commercial FO implementations and to produce
* results that are more in line with the expectation of unexperienced FO users.
* Note: Enabling this features violates the XSL specification!
* @param value true to enable the feature
*/
public void setBreakIndentInheritanceOnReferenceAreaBoundary(boolean value) {
this.breakIndentInheritanceOnReferenceAreaBoundary = value;
}
/** @return true if kerning on base 14 fonts is enabled */
public boolean isBase14KerningEnabled() {
return this.enableBase14Kerning;
}
/**
* Controls whether kerning is activated on base 14 fonts.
* @param value true if kerning should be activated
*/
public void setBase14KerningEnabled(boolean value) {
this.enableBase14Kerning = value;
}
/** @return the resolution for resolution-dependant input */
public float getSourceResolution() {
return this.sourceResolution;
}

/**
* Returns the conversion factor from pixel units to millimeters. This
* depends on the desired source resolution.
* @return float conversion factor
* @see #getSourceResolution()
*/
public float getSourcePixelUnitToMillimeter() {
return 25.4f / getSourceResolution();
}
/**
* Sets the source resolution in dpi. This value is used to interpret the pixel size
* of source documents like SVG images and bitmap images without resolution information.
* @param dpi resolution in dpi
*/
public void setSourceResolution(int dpi) {
this.sourceResolution = dpi;
}
/**
* Gets the default page-height to use as fallback,
* in case page-height="auto"
*
* @return the page-height, as a String
*/
public String getPageHeight() {
return this.pageHeight;
}
/**
* Sets the page-height to use as fallback, in case
* page-height="auto"
*
* @param pageHeight page-height as a String
*/
public void setPageHeight(String pageHeight) {
this.pageHeight = pageHeight;
}
/**
* Gets the default page-width to use as fallback,
* in case page-width="auto"
*
* @return the page-width, as a String
*/
public String getPageWidth() {
return this.pageWidth;
}
/**
* Sets the page-width to use as fallback, in case
* page-width="auto"
*
* @param pageWidth page-width as a String
*/
public void setPageWidth(String pageWidth) {
this.pageWidth = pageWidth;
}
//------------------------------------------- Configuration stuff
/**
* Set the user configuration.
* @param userConfigFile the configuration file
* @throws IOException if an I/O error occurs
* @throws SAXException if a parsing error occurs
*/
public void setUserConfig(File userConfigFile)
throws SAXException, IOException {
try {
DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();
setUserConfig(cfgBuilder.buildFromFile(userConfigFile));
} catch (ConfigurationException cfge) {
log.error("Error loading configuration: "
+ cfge.getMessage());
}
}
/**
* Set the user configuration from an URI.
* @param uri the URI to the configuration file
* @throws IOException if an I/O error occurs
* @throws SAXException if a parsing error occurs
*/
public void setUserConfig(String uri)
throws SAXException, IOException {
try {
DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();
setUserConfig(cfgBuilder.build(uri));
} catch (ConfigurationException cfge) {
log.error("Error loading configuration: "
+ cfge.getMessage());
}
}
/**
* Set the user configuration.
* @param userConfig configuration
*/
public void setUserConfig(Configuration userConfig) {
this.userConfig = userConfig;
try {
initUserConfig();
} catch (ConfigurationException cfge) {
log.error("Error initializing factory configuration: "
+ cfge.getMessage());
}
}

/**
* Get the user configuration.
* @return the user configuration
*/
public Configuration getUserConfig() {
return userConfig;
}
/**
* Initializes user agent settings from the user configuration
* file, if present: baseURL, resolution, default page size,...
*
* @throws ConfigurationException when there is an entry that
* misses the required attribute
*/
public void initUserConfig() throws ConfigurationException {
log.debug("Initializing User Agent Configuration");
setFontBaseURL(getBaseURLfromConfig(userConfig, "font-base"));
final String hyphBase = getBaseURLfromConfig(userConfig, "hyphenation-base");
if (hyphBase != null) {
this.hyphResolver = new HyphenationTreeResolver() {
public Source resolve(String href) {
return resolveURI(href, hyphBase);
}
};
}
if (userConfig.getChild("source-resolution", false) != null) {
this.sourceResolution
= userConfig.getChild("source-resolution").getValueAsFloat(
DEFAULT_SOURCE_RESOLUTION);
log.info("Source resolution set to: " + sourceResolution
+ "dpi (px2mm=" + getSourcePixelUnitToMillimeter() + ")");
}
if (userConfig.getChild("strict-validation", false) != null) {
this.strictValidation = userConfig.getChild("strict-validation").getValueAsBoolean();
}
if (userConfig.getChild("break-indent-inheritance", false) != null) {
this.breakIndentInheritanceOnReferenceAreaBoundary
= userConfig.getChild("break-indent-inheritance").getValueAsBoolean();
}
Configuration pageConfig = userConfig.getChild("default-page-settings");
if (pageConfig.getAttribute("height", null) != null) {
setPageHeight(pageConfig.getAttribute("height"));
log.info("Default page-height set to: " + pageHeight);
}
if (pageConfig.getAttribute("width", null) != null) {
setPageWidth(pageConfig.getAttribute("width"));
log.info("Default page-width set to: " + pageWidth);
}
}

/**
* Retrieves and verifies a base URL.
* @param cfg The Configuration object to retrieve the base URL from
* @param name the element name for the base URL
* @return the requested base URL or null if not available
*/
public static String getBaseURLfromConfig(Configuration cfg, String name) {
if (cfg.getChild(name, false) != null) {
try {
String cfgBaseDir = cfg.getChild(name).getValue(null);
if (cfgBaseDir != null) {
File dir = new File(cfgBaseDir);
if (dir.isDirectory()) {
cfgBaseDir = dir.toURL().toExternalForm();
}
}
log.info(name + " set to: " + cfgBaseDir);
return cfgBaseDir;
} catch (MalformedURLException mue) {
log.error("Base URL in user config is malformed!");
}
}
return null;
}

//------------------------------------------- URI resolution

/**
* Attempts to resolve the given URI.
* Will use the configured resolver and if not successful fall back
* to the default resolver.
* @param uri URI to access
* @param base the base URI to resolve against
* @return A {@link javax.xml.transform.Source} object, or null if the URI
* cannot be resolved.
* @see org.apache.fop.apps.FOURIResolver
*/
public Source resolveURI(String uri, String base) {
Source source = null;
if (uriResolver != null) {
try {
source = uriResolver.resolve(uri, base);
} catch (TransformerException te) {
log.error("Attempt to resolve URI '" + uri + "' failed: ", te);
}
}
if (source == null) {
// URI Resolver not configured or returned null, use default resolver
try {
source = foURIResolver.resolve(uri, base);
} catch (TransformerException te) {
log.error("Attempt to resolve URI '" + uri + "' failed: ", te);
}
}
return source;
}

}

+ 1
- 1
src/java/org/apache/fop/area/AreaTreeHandler.java View File

@@ -116,7 +116,7 @@ public class AreaTreeHandler extends FOEventHandler {

setupModel(userAgent, outputFormat, stream);
lmMaker = userAgent.getLayoutManagerMakerOverride();
lmMaker = userAgent.getFactory().getLayoutManagerMakerOverride();
if (lmMaker == null) {
lmMaker = new LayoutManagerMapping();
}

+ 6
- 5
src/java/org/apache/fop/area/AreaTreeParser.java View File

@@ -108,8 +108,8 @@ public class AreaTreeParser {
* @return the ContentHandler instance to receive the SAX stream from the area tree XML
*/
public ContentHandler getContentHandler(AreaTreeModel treeModel, FOUserAgent userAgent) {
//TODO Retrieve this instance from the environment class once it has been created.
ElementMappingRegistry elementMappingRegistry = new ElementMappingRegistry(userAgent);
ElementMappingRegistry elementMappingRegistry
= userAgent.getFactory().getElementMappingRegistry();
return new Handler(treeModel, userAgent, elementMappingRegistry);
}
@@ -252,8 +252,9 @@ public class AreaTreeParser {
handled = false;
}
} else {
ContentHandlerFactory factory
= ContentHandlerFactoryRegistry.getInstance().getFactory(uri);
ContentHandlerFactoryRegistry registry
= userAgent.getFactory().getContentHandlerFactoryRegistry();
ContentHandlerFactory factory = registry.getFactory(uri);
if (factory != null) {
delegate = factory.createContentHandler();
delegateStack.push(qName);
@@ -936,7 +937,7 @@ public class AreaTreeParser {
if (url != null) {
bkg.setURL(url);
ImageFactory fact = ImageFactory.getInstance();
ImageFactory fact = userAgent.getFactory().getImageFactory();
FopImage img = fact.getImage(url, userAgent);
if (img == null) {
log.error("Background image not available: " + url);

+ 0
- 4
src/java/org/apache/fop/cli/AreaTreeInputHandler.java View File

@@ -61,10 +61,6 @@ public class AreaTreeInputHandler extends InputHandler {
public void renderTo(FOUserAgent userAgent, String outputFormat, OutputStream out)
throws FOPException {
FontInfo fontInfo = new FontInfo();
FOUserAgent effUserAgent = userAgent;
if (effUserAgent == null) {
effUserAgent = new FOUserAgent();
}
AreaTreeModel treeModel = new RenderPagesModel(userAgent,
outputFormat, fontInfo, out);

+ 12
- 35
src/java/org/apache/fop/cli/CommandLineOptions.java View File

@@ -28,11 +28,13 @@ import java.util.Vector;
import org.apache.fop.Version;
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.pdf.PDFEncryptionManager;
import org.apache.fop.pdf.PDFEncryptionParams;
import org.apache.fop.render.awt.AWTRenderer;
import org.apache.fop.render.Renderer;
import org.apache.fop.render.pdf.PDFRenderer;
import org.apache.fop.render.xml.XMLRenderer;
import org.apache.fop.util.CommandLineLogger;

@@ -41,14 +43,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

// SAX
import org.xml.sax.XMLReader;
import org.xml.sax.SAXException;
import javax.xml.parsers.SAXParserFactory;

// avalon configuration
import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;

/**
* Options parses the commandline arguments
@@ -92,6 +87,7 @@ public class CommandLineOptions {
/* output mode */
private String outputmode = null;

private FopFactory factory = FopFactory.newInstance();
private FOUserAgent foUserAgent;

private InputHandler inputHandler;
@@ -130,7 +126,7 @@ public class CommandLineOptions {
throws FOPException, IOException {
boolean optionsParsed = true;

foUserAgent = new FOUserAgent();
foUserAgent = factory.newFOUserAgent();

try {
optionsParsed = parseOptions(args);
@@ -217,7 +213,7 @@ public class CommandLineOptions {
} else if (args[i].equals("-d")) {
setLogOption("debug", "debug");
} else if (args[i].equals("-r")) {
foUserAgent.setStrictValidation(false);
factory.setStrictValidation(false);
} else if (args[i].equals("-dpi")) {
i = i + parseResolution(args, i);
} else if (args[i].equals("-q") || args[i].equals("--quiet")) {
@@ -571,14 +567,17 @@ public class CommandLineOptions {
}

private PDFEncryptionParams getPDFEncryptionParams() throws FOPException {
if (foUserAgent.getPDFEncryptionParams() == null) {
PDFEncryptionParams params = (PDFEncryptionParams)foUserAgent.getRendererOptions().get(
PDFRenderer.ENCRYPTION_PARAMS);
if (params == null) {
if (!PDFEncryptionManager.checkAvailableAlgorithms()) {
throw new FOPException("PDF encryption requested but it is not available."
+ " Please make sure MD5 and RC4 algorithms are available.");
}
foUserAgent.setPDFEncryptionParams(new PDFEncryptionParams());
params = new PDFEncryptionParams();
foUserAgent.getRendererOptions().put(PDFRenderer.ENCRYPTION_PARAMS, params);
}
return foUserAgent.getPDFEncryptionParams();
return params;
}

private int parsePDFOwnerPassword(String[] args, int i) throws FOPException {
@@ -726,18 +725,11 @@ public class CommandLineOptions {
if (userConfigFile == null) {
return;
}
XMLReader parser = createParser();
DefaultConfigurationBuilder configBuilder
= new DefaultConfigurationBuilder(parser);
Configuration userConfig = null;
try {
userConfig = configBuilder.buildFromFile(userConfigFile);
factory.setUserConfig(userConfigFile);
} catch (SAXException e) {
throw new FOPException(e);
} catch (ConfigurationException e) {
throw new FOPException(e);
}
foUserAgent.setUserConfig(userConfig);
}

/**
@@ -978,20 +970,5 @@ public class CommandLineOptions {
}
}

/**
* Creates <code>XMLReader</code> object using default
* <code>SAXParserFactory</code>
* @return the created <code>XMLReader</code>
* @throws FOPException if the parser couldn't be created or configured for proper operation.
*/
private XMLReader createParser() throws FOPException {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
return factory.newSAXParser().getXMLReader();
} catch (Exception e) {
throw new FOPException("Couldn't create XMLReader", e);
}
}
}


+ 7
- 3
src/java/org/apache/fop/cli/InputHandler.java View File

@@ -39,6 +39,7 @@ import org.apache.commons.logging.LogFactory;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.render.awt.viewer.Renderable;

/**
@@ -85,10 +86,13 @@ public class InputHandler implements ErrorListener, Renderable {
*/
public void renderTo(FOUserAgent userAgent, String outputFormat, OutputStream out)
throws FOPException {
Fop fop = new Fop(outputFormat, userAgent);

FopFactory factory = userAgent.getFactory();
Fop fop;
if (out != null) {
fop.setOutputStream(out);
fop = factory.newFop(outputFormat, userAgent, out);
} else {
fop = factory.newFop(outputFormat, userAgent);
}

// if base URL was not explicitly set in FOUserAgent, obtain here

+ 4
- 4
src/java/org/apache/fop/fo/ElementMappingRegistry.java View File

@@ -25,7 +25,7 @@ import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.fo.ElementMapping.Maker;
import org.apache.fop.util.Service;
import org.w3c.dom.DOMImplementation;
@@ -54,14 +54,14 @@ public class ElementMappingRegistry {
/**
* Main constructor. Adds all default element mapping as well as detects ElementMapping
* through the Service discovery.
* @param userAgent the user agent
* @param factory the Fop Factory
*/
public ElementMappingRegistry(FOUserAgent userAgent) {
public ElementMappingRegistry(FopFactory factory) {
// Add standard element mappings
setupDefaultMappings();

// add additional ElementMappings defined within FOUserAgent
List addlEMs = userAgent.getAdditionalElementMappings();
List addlEMs = factory.getAdditionalElementMappings();

if (addlEMs != null) {
for (int i = 0; i < addlEMs.size(); i++) {

+ 4
- 7
src/java/org/apache/fop/fo/FOTreeBuilder.java View File

@@ -52,9 +52,7 @@ public class FOTreeBuilder extends DefaultHandler {

/** The registry for ElementMapping instances */
protected ElementMappingRegistry elementMappingRegistry;
//TODO Remove the ElementMappingRegistry from here and move it to a new environmental class
//FOTreeBuilder should be a "one-use" component.

/**
* The root of the formatting object tree
*/
@@ -93,7 +91,7 @@ public class FOTreeBuilder extends DefaultHandler {
OutputStream stream) throws FOPException {

this.userAgent = foUserAgent;
this.elementMappingRegistry = userAgent.getFactory().getElementMappingRegistry();
//This creates either an AreaTreeHandler and ultimately a Renderer, or
//one of the RTF-, MIF- etc. Handlers.
foEventHandler = foUserAgent.getRendererFactory().createFOEventHandler(
@@ -103,8 +101,6 @@ public class FOTreeBuilder extends DefaultHandler {
return new StaticPropertyList(fobj, parentPropertyList);
}
});

this.elementMappingRegistry = new ElementMappingRegistry(foUserAgent);
}

/**
@@ -174,7 +170,8 @@ public class FOTreeBuilder extends DefaultHandler {
foEventHandler.endDocument();
//Notify the image factory that this user agent has expired.
ImageFactory.getInstance().removeContext(this.userAgent);
ImageFactory imageFactory = userAgent.getFactory().getImageFactory();
imageFactory.removeContext(this.userAgent);
}

/**

+ 4
- 2
src/java/org/apache/fop/fo/flow/ExternalGraphic.java View File

@@ -19,6 +19,7 @@
package org.apache.fop.fo.flow;

import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.fo.FONode;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.ValidationException;
@@ -60,8 +61,9 @@ public class ExternalGraphic extends AbstractGraphics {
//Additional processing: preload image
url = ImageFactory.getURL(getSrc());
ImageFactory fact = ImageFactory.getInstance();
fopimage = fact.getImage(url, getUserAgent());
FOUserAgent userAgent = getUserAgent();
ImageFactory fact = userAgent.getFactory().getImageFactory();
fopimage = fact.getImage(url, userAgent);
if (fopimage == null) {
getLogger().error("Image not available: " + getSrc());
} else {

+ 4
- 2
src/java/org/apache/fop/fo/properties/CommonBorderPaddingBackground.java View File

@@ -18,6 +18,7 @@

package org.apache.fop.fo.properties;

import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.datatypes.ColorType;
import org.apache.fop.datatypes.Length;
import org.apache.fop.datatypes.PercentBaseContext;
@@ -158,8 +159,9 @@ public class CommonBorderPaddingBackground implements Cloneable {
//Additional processing: preload image
String url = ImageFactory.getURL(backgroundImage);
ImageFactory fact = ImageFactory.getInstance();
fopimage = fact.getImage(url, fobj.getUserAgent());
FOUserAgent userAgent = fobj.getUserAgent();
ImageFactory fact = userAgent.getFactory().getImageFactory();
fopimage = fact.getImage(url, userAgent);
if (fopimage == null) {
fobj.getLogger().error("Background image not available: " + backgroundImage);
} else {

+ 4
- 12
src/java/org/apache/fop/image/ImageFactory.java View File

@@ -50,13 +50,14 @@ public final class ImageFactory {
*/
protected static Log log = LogFactory.getLog(FopImage.class);
private static ImageFactory factory = new ImageFactory();

private HashMap imageMimeTypes = new HashMap();
private ImageCache cache = new ContextImageCache(true);

private ImageFactory() {
/**
* Main constructor for the ImageFactory.
*/
public ImageFactory() {
/* @todo The mappings set up below of image mime types to implementing
* classes should be made externally configurable
*/
@@ -123,15 +124,6 @@ public final class ImageFactory {
imt.addProvider(emfImage);
}

/**
* Get static image factory instance.
*
* @return the image factory instance
*/
public static ImageFactory getInstance() {
return factory;
}

/**
* Get the url string from a wrapped url.
*

+ 2
- 1
src/java/org/apache/fop/image/ImageLoader.java View File

@@ -51,7 +51,8 @@ class ImageLoader {
if (!valid || image != null) {
return image;
}
image = ImageFactory.getInstance().loadImage(url, userAgent);
ImageFactory imageFactory = userAgent.getFactory().getImageFactory();
image = imageFactory.loadImage(url, userAgent);
if (image == null) {
cache.invalidateImage(url, userAgent);
valid = false;

+ 2
- 3
src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2005 The Apache Software Foundation.
* Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -37,7 +37,6 @@ import java.util.List;
import java.util.LinkedList;
import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
import org.apache.fop.layoutmgr.inline.AlignmentContext;
import org.apache.fop.layoutmgr.inline.LeafNodeLayoutManager.AreaInfo;

/**
* LayoutManager for the fo:character formatting object
@@ -146,7 +145,7 @@ public class CharacterLayoutManager extends LeafNodeLayoutManager {
/** @see InlineLevelLayoutManager#getWordChars(StringBuffer, Position) */
public void getWordChars(StringBuffer sbChars, Position bp) {
sbChars.append
(((org.apache.fop.area.inline.Character) curArea).getChar());
(((org.apache.fop.area.inline.TextArea) curArea).getText());
}

/** @see InlineLevelLayoutManager#hyphenate(Position, HyphContext) */

+ 5
- 5
src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java View File

@@ -1520,11 +1520,11 @@ public class LineLayoutManager extends InlineStackingLayoutManager
// on an inline or wrapper below the block level.
Hyphenation hyph
= Hyphenator.hyphenate(hyphenationProperties.language,
hyphenationProperties.country,
getFObj().getUserAgent().getHyphenationTreeResolver(),
sbChars.toString(),
hyphenationProperties.hyphenationRemainCharacterCount,
hyphenationProperties.hyphenationPushCharacterCount);
hyphenationProperties.country,
getFObj().getUserAgent().getFactory().getHyphenationTreeResolver(),
sbChars.toString(),
hyphenationProperties.hyphenationRemainCharacterCount,
hyphenationProperties.hyphenationPushCharacterCount);
// They hyph structure contains the information we need
// Now start from prev: reset to that position, ask that LM to get
// a Position for the first hyphenation offset. If the offset isn't in

+ 2
- 1
src/java/org/apache/fop/render/PrintRenderer.java View File

@@ -48,7 +48,8 @@ public abstract class PrintRenderer extends AbstractRenderer {
public void setupFontInfo(FontInfo inFontInfo) {
this.fontInfo = inFontInfo;
FontResolver resolver = new DefaultFontResolver(userAgent);
FontSetup.setup(fontInfo, fontList, resolver, userAgent.isBase14KerningEnabled());
FontSetup.setup(fontInfo, fontList, resolver,
userAgent.getFactory().isBase14KerningEnabled());
}

/**

+ 1
- 1
src/java/org/apache/fop/render/RendererFactory.java View File

@@ -229,7 +229,7 @@ public class RendererFactory {
if (out == null
&& userAgent.getRendererOverride() == null
&& rendMaker.needsOutputStream()) {
throw new IllegalStateException(
throw new FOPException(
"OutputStream has not been set");
}
//Found a Renderer so we need to construct an AreaTreeHandler.

+ 1
- 1
src/java/org/apache/fop/render/java2d/Java2DRenderer.java View File

@@ -1030,7 +1030,7 @@ public abstract class Java2DRenderer extends AbstractRenderer implements Printab
int y = currentBPPosition;
String url = ImageFactory.getURL(pUrl);

ImageFactory fact = ImageFactory.getInstance();
ImageFactory fact = userAgent.getFactory().getImageFactory();
FopImage fopimage = fact.getImage(url, userAgent);

if (fopimage == null) {

+ 79
- 3
src/java/org/apache/fop/render/pdf/PDFRenderer.java View File

@@ -67,6 +67,7 @@ import org.apache.fop.pdf.PDFAnnotList;
import org.apache.fop.pdf.PDFColor;
import org.apache.fop.pdf.PDFDocument;
import org.apache.fop.pdf.PDFEncryptionManager;
import org.apache.fop.pdf.PDFEncryptionParams;
import org.apache.fop.pdf.PDFFilterList;
import org.apache.fop.pdf.PDFInfo;
import org.apache.fop.pdf.PDFLink;
@@ -111,6 +112,20 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
*/
public static final String MIME_TYPE = MimeConstants.MIME_PDF;

/** PDF encryption parameter: all parameters as object, datatype: PDFEncryptionParams */
public static final String ENCRYPTION_PARAMS = "encryption-params";
/** PDF encryption parameter: user password, datatype: String */
public static final String USER_PASSWORD = "user-password";
/** PDF encryption parameter: owner password, datatype: String */
public static final String OWNER_PASSWORD = "owner-password";
/** PDF encryption parameter: Forbids printing, datatype: Boolean or "true"/"false" */
public static final String NO_PRINT = "noprint";
/** PDF encryption parameter: Forbids copying content, datatype: Boolean or "true"/"false" */
public static final String NO_COPY_CONTENT = "nocopy";
/** PDF encryption parameter: Forbids editing content, datatype: Boolean or "true"/"false" */
public static final String NO_EDIT_CONTENT = "noedit";
/** PDF encryption parameter: Forbids annotations, datatype: Boolean or "true"/"false" */
public static final String NO_ANNOTATIONS = "noannotations";
/** Rendering Options key for the PDF/A mode. */
public static final String PDF_A_MODE = "pdf-a-mode";

@@ -167,6 +182,9 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
*/
protected PDFPage currentPage;
/** the (optional) encryption parameters */
protected PDFEncryptionParams encryptionParams;
/** The current Transform */
protected AffineTransform currentBasicTransform;

@@ -245,11 +263,70 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
}
}

private boolean booleanValueOf(Object obj) {
if (obj instanceof Boolean) {
return ((Boolean)obj).booleanValue();
} else if (obj instanceof String) {
return Boolean.valueOf((String)obj).booleanValue();
} else {
throw new IllegalArgumentException("Boolean or \"true\" or \"false\" expected.");
}
}
/**
* @see org.apache.fop.render.Renderer#setUserAgent(FOUserAgent)
*/
public void setUserAgent(FOUserAgent agent) {
super.setUserAgent(agent);
PDFEncryptionParams params
= (PDFEncryptionParams)agent.getRendererOptions().get(ENCRYPTION_PARAMS);
if (params != null) {
this.encryptionParams = params; //overwrite if available
}
String pwd;
pwd = (String)agent.getRendererOptions().get(USER_PASSWORD);
if (pwd != null) {
if (encryptionParams == null) {
this.encryptionParams = new PDFEncryptionParams();
}
this.encryptionParams.setUserPassword(pwd);
}
pwd = (String)agent.getRendererOptions().get(OWNER_PASSWORD);
if (pwd != null) {
if (encryptionParams == null) {
this.encryptionParams = new PDFEncryptionParams();
}
this.encryptionParams.setOwnerPassword(pwd);
}
Object setting;
setting = agent.getRendererOptions().get(NO_PRINT);
if (setting != null) {
if (encryptionParams == null) {
this.encryptionParams = new PDFEncryptionParams();
}
this.encryptionParams.setAllowPrint(!booleanValueOf(setting));
}
setting = agent.getRendererOptions().get(NO_COPY_CONTENT);
if (setting != null) {
if (encryptionParams == null) {
this.encryptionParams = new PDFEncryptionParams();
}
this.encryptionParams.setAllowCopyContent(!booleanValueOf(setting));
}
setting = agent.getRendererOptions().get(NO_EDIT_CONTENT);
if (setting != null) {
if (encryptionParams == null) {
this.encryptionParams = new PDFEncryptionParams();
}
this.encryptionParams.setAllowEditContent(!booleanValueOf(setting));
}
setting = agent.getRendererOptions().get(NO_ANNOTATIONS);
if (setting != null) {
if (encryptionParams == null) {
this.encryptionParams = new PDFEncryptionParams();
}
this.encryptionParams.setAllowEditAnnotations(!booleanValueOf(setting));
}
String s = (String)agent.getRendererOptions().get(PDF_A_MODE);
if (s != null) {
this.pdfAMode = PDFAMode.valueOf(s);
@@ -276,8 +353,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
this.pdfDoc.outputHeader(stream);

//Setup encryption if necessary
PDFEncryptionManager.setupPDFEncryption(
userAgent.getPDFEncryptionParams(), this.pdfDoc);
PDFEncryptionManager.setupPDFEncryption(encryptionParams, this.pdfDoc);
}

/**
@@ -1213,7 +1289,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
}

url = ImageFactory.getURL(url);
ImageFactory fact = ImageFactory.getInstance();
ImageFactory fact = userAgent.getFactory().getImageFactory();
FopImage fopimage = fact.getImage(url, userAgent);
if (fopimage == null) {
return;

+ 1
- 1
src/java/org/apache/fop/render/ps/PSRenderer.java View File

@@ -279,7 +279,7 @@ public class PSRenderer extends AbstractPathOrientedRenderer implements ImageAda
protected void drawImage(String url, Rectangle2D pos) {
endTextObject();
url = ImageFactory.getURL(url);
ImageFactory fact = ImageFactory.getInstance();
ImageFactory fact = userAgent.getFactory().getImageFactory();
FopImage fopimage = fact.getImage(url, userAgent);
if (fopimage == null) {
return;

+ 3
- 2
src/java/org/apache/fop/render/rtf/RTFHandler.java View File

@@ -1121,8 +1121,9 @@ public class RTFHandler extends FOEventHandler {
String url = eg.getURL();

//set image data
ImageFactory fact = ImageFactory.getInstance();
FopImage fopimage = fact.getImage(url, eg.getUserAgent());
FOUserAgent userAgent = eg.getUserAgent();
ImageFactory fact = userAgent.getFactory().getImageFactory();
FopImage fopimage = fact.getImage(url, userAgent);
if (fopimage == null) {
log.error("Image could not be found: " + url);
return;

+ 32
- 154
src/java/org/apache/fop/servlet/FopPrintServlet.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2005 The Apache Software Foundation.
* Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,25 +18,18 @@

package org.apache.fop.servlet;

import java.io.File;
import java.io.InputStream;
import java.io.IOException;
import java.io.PrintWriter;

// JAXP
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.URIResolver;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;

// XML
import org.apache.commons.logging.impl.SimpleLog;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.MimeConstants;
@@ -58,164 +51,49 @@ import org.apache.fop.apps.MimeConstants;
* Example URL: http://servername/fop/servlet/FopPrintServlet?fo=readme.fo
* <br/>
* Example URL: http://servername/fop/servlet/FopPrintServlet?xml=data.xml&xsl=format.xsl
*
* @author <a href="mailto:fop-dev@xml.apache.org">Apache XML FOP Development Team</a>
* <br/>
* <b>Note:</b> This servlet is derived from FopServlet. Most methods are inherited from the
* superclass. Only the differences to the base class are necessary.
*
* @author <a href="mailto:fop-dev@xmlgraphics.apache.org">Apache FOP Development Team</a>
* @version $Id$
* (todo) Doesn't work since there's no AWTRenderer at the moment. Revisit when
* available.
* (todo) Ev. add caching mechanism for Templates objects
*/
public class FopPrintServlet extends HttpServlet {

/** Name of the parameter used for the XSL-FO file */
protected static final String FO_REQUEST_PARAM = "fo";
/** Name of the parameter used for the XML file */
protected static final String XML_REQUEST_PARAM = "xml";
/** Name of the parameter used for the XSLT file */
protected static final String XSLT_REQUEST_PARAM = "xslt";

/** Logger to give to FOP */
protected SimpleLog log = null;
/** The TransformerFactory to use to create Transformer instances */
protected TransformerFactory transFactory = null;
/** URIResolver for use by this servlet */
protected URIResolver uriResolver;

/**
* @see javax.servlet.GenericServlet#init()
*/
public void init() throws ServletException {
this.log = new SimpleLog("FOP/Print Servlet");
log.setLevel(SimpleLog.LOG_LEVEL_WARN);
this.uriResolver = new ServletContextURIResolver(getServletContext());
this.transFactory = TransformerFactory.newInstance();
this.transFactory.setURIResolver(this.uriResolver);
}

/**
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest, HttpServletResponse)
*/
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException {
if (log == null) {
log = new SimpleLog("FOP/Print Servlet");
log.setLevel(SimpleLog.LOG_LEVEL_WARN);
}

try {
String foParam = request.getParameter(FO_REQUEST_PARAM);
String xmlParam = request.getParameter(XML_REQUEST_PARAM);
String xsltParam = request.getParameter(XSLT_REQUEST_PARAM);

if (foParam != null) {
InputStream file = new java.io.FileInputStream(foParam);
renderFO(file, response);
} else if ((xmlParam != null) && (xsltParam != null)) {
renderXML(new File(xmlParam), new File(xsltParam), response);
} else {
response.setContentType("text/html");

PrintWriter out = response.getWriter();
out.println("<html><title>Error</title>\n"
+ "<body><h1>FopServlet Error</h1>\n"
+ "<h3>No 'fo' or 'xml/xsl' "
+ "request param given.</h3></body>\n</html>");
}
} catch (ServletException ex) {
throw ex;
} catch (Exception ex) {
throw new ServletException(ex);
}
}

/**
* Renders an FO inputsource to the default printer.
* @param foFile The XSL-FO file
* @param response Response to write to
* @throws ServletException In case of a problem
*/
public void renderFO(InputStream foFile,
HttpServletResponse response) throws ServletException {
try {
Fop fop = new Fop(MimeConstants.MIME_FOP_PRINT, getFOUserAgent());

// Setup JAXP
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(); //identity transformer
transformer.setURIResolver(this.uriResolver);
// Setup input for XSLT transformation
Source src = new StreamSource(foFile);
// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
// Start XSLT transformation and FOP processing
transformer.transform(src, res);
reportOK (response);
} catch (Exception ex) {
throw new ServletException(ex);
}
}
public class FopPrintServlet extends FopServlet {

/**
* Renders an FO generated using an XML and a stylesheet to the default printer.
* @param xmlfile XML file object
* @param xsltfile XSLT stylesheet
* @param response HTTP response object
* @throws ServletException In case of a problem
* @see org.apache.fop.servlet.FopServlet#render(javax.xml.transform.Source,
* javax.xml.transform.Transformer, javax.servlet.http.HttpServletResponse)
*/
public void renderXML(File xmlfile, File xsltfile,
HttpServletResponse response) throws ServletException {
try {
Fop fop = new Fop(MimeConstants.MIME_FOP_PRINT, getFOUserAgent());
protected void render(Source src, Transformer transformer, HttpServletResponse response)
throws FOPException, TransformerException, IOException {

// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));
transformer.setURIResolver(this.uriResolver);
// Setup input for XSLT transformation
Source src = new StreamSource(xmlfile);
FOUserAgent foUserAgent = getFOUserAgent();
// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());

// Start XSLT transformation and FOP processing
transformer.transform(src, res);

reportOK (response);
} catch (Exception ex) {
throw new ServletException(ex);
}
//Setup FOP
Fop fop = fopFactory.newFop(MimeConstants.MIME_FOP_PRINT, foUserAgent);
//Make sure the XSL transformation's result is piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
//Start the transformation and rendering process
transformer.transform(src, res);
//Return the result
reportOK(response);
}

// private helper, tell (browser) user that file printed
private void reportOK(HttpServletResponse response)
throws ServletException {
private void reportOK(HttpServletResponse response) throws IOException {
String sMsg = "<html><title>Success</title>\n"
+ "<body><h1>FopPrintServlet: </h1>"
+ "<h3>The requested data was printed</h3></body></html>";
+ "<h3>The requested data was printed to the default printer.</h3></body></html>";

response.setContentType("text/html");
response.setContentLength(sMsg.length());

try {
PrintWriter out = response.getWriter();
out.println(sMsg);
out.flush();
} catch (Exception ex) {
throw new ServletException(ex);
}
}

/** @return a new FOUserAgent for FOP */
protected FOUserAgent getFOUserAgent() {
FOUserAgent userAgent = new FOUserAgent();
userAgent.setURIResolver(this.uriResolver);
return userAgent;
PrintWriter out = response.getWriter();
out.println(sMsg);
out.flush();
}

}

+ 50
- 32
src/java/org/apache/fop/servlet/FopServlet.java View File

@@ -19,6 +19,7 @@
package org.apache.fop.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
@@ -37,10 +38,10 @@ import javax.xml.transform.stream.StreamSource;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.logging.impl.SimpleLog;

//FOP
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;

/**
@@ -63,7 +64,7 @@ import org.apache.fop.apps.MimeConstants;
* For this to work with Internet Explorer, you might need to append "&ext=.pdf"
* to the URL.
*
* @author <a href="mailto:fop-dev@xml.apache.org">Apache XML FOP Development Team</a>
* @author <a href="mailto:fop-dev@xmlgraphics.apache.org">Apache FOP Development Team</a>
* @version $Id$
* (todo) Ev. add caching mechanism for Templates objects
*/
@@ -78,8 +79,10 @@ public class FopServlet extends HttpServlet {

/** Logger to give to FOP */
protected SimpleLog log = null;
/** The TransformerFactory to use to create Transformer instances */
/** The TransformerFactory used to create Transformer instances */
protected TransformerFactory transFactory = null;
/** The FopFactory used to create Fop instances */
protected FopFactory fopFactory = null;
/** URIResolver for use by this servlet */
protected URIResolver uriResolver;

@@ -92,6 +95,18 @@ public class FopServlet extends HttpServlet {
this.uriResolver = new ServletContextURIResolver(getServletContext());
this.transFactory = TransformerFactory.newInstance();
this.transFactory.setURIResolver(this.uriResolver);
//Configure FopFactory as desired
this.fopFactory = FopFactory.newInstance();
this.fopFactory.setURIResolver(this.uriResolver);
configureFopFactory();
}
/**
* This method is called right after the FopFactory is instantiated and can be overridden
* by subclasses to perform additional configuration.
*/
protected void configureFopFactory() {
//Subclass and override this method to perform additional configuration
}

/**
@@ -106,26 +121,17 @@ public class FopServlet extends HttpServlet {
String xsltParam = request.getParameter(XSLT_REQUEST_PARAM);

//Analyze parameters and decide with method to use
byte[] content = null;
if (foParam != null) {
content = renderFO(foParam);
renderFO(foParam, response);
} else if ((xmlParam != null) && (xsltParam != null)) {
content = renderXML(xmlParam, xsltParam);
renderXML(xmlParam, xsltParam, response);
} else {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>Error</title></head>\n"
+ "<body><h1>FopServlet Error</h1><h3>No 'fo' "
+ "request param given.</body></html>");
}

if (content != null) {
//Send the result back to the client
response.setContentType("application/pdf");
response.setContentLength(content.length);
response.getOutputStream().write(content);
response.getOutputStream().flush();
}

} catch (Exception ex) {
throw new ServletException(ex);
}
@@ -140,18 +146,27 @@ public class FopServlet extends HttpServlet {
return new StreamSource(new File(param));
}

private void sendPDF(byte[] content, HttpServletResponse response) throws IOException {
//Send the result back to the client
response.setContentType("application/pdf");
response.setContentLength(content.length);
response.getOutputStream().write(content);
response.getOutputStream().flush();
}
/**
* Renders an XSL-FO file into a PDF file. The PDF is written to a byte
* array that is returned as the method's result.
* @param fo the XSL-FO file
* @return byte[] the rendered PDF file
* @param response HTTP response object
* @throws FOPException If an error occurs during the rendering of the
* XSL-FO
* @throws TransformerException If an error occurs while parsing the input
* file
* @throws IOException In case of an I/O problem
*/
protected byte[] renderFO(String fo)
throws FOPException, TransformerException {
protected void renderFO(String fo, HttpServletResponse response)
throws FOPException, TransformerException, IOException {

//Setup source
Source foSrc = convertString2Source(fo);
@@ -161,7 +176,7 @@ public class FopServlet extends HttpServlet {
transformer.setURIResolver(this.uriResolver);

//Start transformation and rendering process
return render(foSrc, transformer);
render(foSrc, transformer, response);
}

/**
@@ -170,14 +185,15 @@ public class FopServlet extends HttpServlet {
* that is returned as the method's result.
* @param xml the XML file
* @param xslt the XSLT file
* @return byte[] the rendered PDF file
* @param response HTTP response object
* @throws FOPException If an error occurs during the rendering of the
* XSL-FO
* @throws TransformerException If an error occurs during XSL
* transformation
* @throws IOException In case of an I/O problem
*/
protected byte[] renderXML(String xml, String xslt)
throws FOPException, TransformerException {
protected void renderXML(String xml, String xslt, HttpServletResponse response)
throws FOPException, TransformerException, IOException {

//Setup sources
Source xmlSrc = convertString2Source(xml);
@@ -188,7 +204,7 @@ public class FopServlet extends HttpServlet {
transformer.setURIResolver(this.uriResolver);

//Start transformation and rendering process
return render(xmlSrc, transformer);
render(xmlSrc, transformer, response);
}

/**
@@ -199,21 +215,23 @@ public class FopServlet extends HttpServlet {
* returned as the method's result.
* @param src Input XML or XSL-FO
* @param transformer Transformer to use for optional transformation
* @return byte[] the rendered PDF file
* @param response HTTP response object
* @throws FOPException If an error occurs during the rendering of the
* XSL-FO
* @throws TransformerException If an error occurs during XSL
* transformation
* @throws IOException In case of an I/O problem
*/
protected byte[] render(Source src, Transformer transformer)
throws FOPException, TransformerException {
protected void render(Source src, Transformer transformer, HttpServletResponse response)
throws FOPException, TransformerException, IOException {

//Setup FOP
Fop fop = new Fop(MimeConstants.MIME_PDF, getFOUserAgent());
FOUserAgent foUserAgent = getFOUserAgent();

//Setup output
ByteArrayOutputStream out = new ByteArrayOutputStream();
fop.setOutputStream(out);

//Setup FOP
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

//Make sure the XSL transformation's result is piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
@@ -222,13 +240,13 @@ public class FopServlet extends HttpServlet {
transformer.transform(src, res);

//Return the result
return out.toByteArray();
sendPDF(out.toByteArray(), response);
}
/** @return a new FOUserAgent for FOP */
protected FOUserAgent getFOUserAgent() {
FOUserAgent userAgent = new FOUserAgent();
userAgent.setURIResolver(this.uriResolver);
FOUserAgent userAgent = fopFactory.newFOUserAgent();
//Configure foUserAgent as desired
return userAgent;
}


+ 6
- 3
src/java/org/apache/fop/tools/TestConverter.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2005 The Apache Software Foundation.
* Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@ import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.cli.InputHandler;
@@ -48,6 +48,9 @@ import org.apache.commons.logging.impl.SimpleLog;
*/
public class TestConverter {
// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();
private boolean failOnly = false;
private String outputFormat = MimeConstants.MIME_FOP_AREA_TREE;
private File destdir;
@@ -284,7 +287,7 @@ public class TestConverter {
+ xsl), null);
}

FOUserAgent userAgent = new FOUserAgent();
FOUserAgent userAgent = fopFactory.newFOUserAgent();
userAgent.setBaseURL(baseURL);

userAgent.getRendererOptions().put("fineDetail", new Boolean(false));

+ 5
- 4
src/java/org/apache/fop/tools/anttasks/Fop.java View File

@@ -37,6 +37,7 @@ import java.util.List;
// FOP
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.cli.InputHandler;

@@ -306,6 +307,9 @@ public class Fop extends Task {

class FOPTaskStarter {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();
private Fop task;
private String baseURL = null;

@@ -555,11 +559,8 @@ class FOPTaskStarter {

boolean success = false;
try {
FOUserAgent userAgent = new FOUserAgent();
FOUserAgent userAgent = fopFactory.newFOUserAgent();
userAgent.setBaseURL(this.baseURL);
if (userConfig != null) {
userAgent.setUserConfig(userConfig);
}
inputHandler.renderTo(userAgent, outputFormat, out);
success = true;
} catch (Exception ex) {

+ 0
- 12
src/java/org/apache/fop/util/ContentHandlerFactoryRegistry.java View File

@@ -36,21 +36,9 @@ public class ContentHandlerFactoryRegistry {
/** the logger */
private static Log log = LogFactory.getLog(ContentHandlerFactoryRegistry.class);
private static ContentHandlerFactoryRegistry instance;
/** Map from namespace URIs to ContentHandlerFactories */
private Map factories = new java.util.HashMap();
/**
* @return a singleton instance of the ContentHandlerFactoryRegistry.
*/
public static ContentHandlerFactoryRegistry getInstance() {
if (instance == null) {
instance = new ContentHandlerFactoryRegistry();
}
return instance;
}
/**
* Default constructor.
*/

+ 13
- 8
test/java/org/apache/fop/BasicDriverTestCase.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2005 The Apache Software Foundation.
* Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,7 +28,9 @@ import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.commons.io.output.ByteArrayOutputStream;
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.cli.InputHandler;

@@ -38,6 +40,8 @@ import org.apache.fop.cli.InputHandler;
*/
public class BasicDriverTestCase extends AbstractFOPTestCase {

private FopFactory fopFactory = FopFactory.newInstance();

/**
* @see junit.framework.TestCase#TestCase(String)
*/
@@ -50,10 +54,10 @@ public class BasicDriverTestCase extends AbstractFOPTestCase {
* @throws Exception if anything fails
*/
public void testFO2PDFWithJAXP() throws Exception {
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
File foFile = new File(getBaseDir(), "test/xml/bugtests/block.fo");
ByteArrayOutputStream baout = new ByteArrayOutputStream();
Fop fop = new Fop(MimeConstants.MIME_PDF);
fop.setOutputStream(baout);
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, baout);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(); //Identity transf.
@@ -69,10 +73,10 @@ public class BasicDriverTestCase extends AbstractFOPTestCase {
* @throws Exception if anything fails
*/
public void testFO2PSWithJAXP() throws Exception {
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
File foFile = new File(getBaseDir(), "test/xml/bugtests/block.fo");
ByteArrayOutputStream baout = new ByteArrayOutputStream();
Fop fop = new Fop(MimeConstants.MIME_POSTSCRIPT);
fop.setOutputStream(baout);
Fop fop = fopFactory.newFop(MimeConstants.MIME_POSTSCRIPT, foUserAgent, baout);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(); //Identity transf.
@@ -88,10 +92,10 @@ public class BasicDriverTestCase extends AbstractFOPTestCase {
* @throws Exception if anything fails
*/
public void testFO2RTFWithJAXP() throws Exception {
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
File foFile = new File(getBaseDir(), "test/xml/bugtests/block.fo");
ByteArrayOutputStream baout = new ByteArrayOutputStream();
Fop fop = new Fop(MimeConstants.MIME_RTF);
fop.setOutputStream(baout);
Fop fop = fopFactory.newFop(MimeConstants.MIME_RTF, foUserAgent, baout);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(); //Identity transf.
@@ -107,12 +111,13 @@ public class BasicDriverTestCase extends AbstractFOPTestCase {
* @throws Exception if anything fails
*/
public void testFO2PDFWithXSLTInputHandler() throws Exception {
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
File xmlFile = new File(getBaseDir(), "test/xml/1.xml");
File xsltFile = new File(getBaseDir(), "test/xsl/doc.xsl");
ByteArrayOutputStream baout = new ByteArrayOutputStream();
InputHandler handler = new InputHandler(xmlFile, xsltFile, null);
handler.renderTo(null, MimeConstants.MIME_PDF, baout);
handler.renderTo(foUserAgent, MimeConstants.MIME_PDF, baout);
assertTrue("Generated PDF has zero length", baout.size() > 0);
}

+ 7
- 4
test/java/org/apache/fop/GenericFOPTestCase.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 1999-2005 The Apache Software Foundation.
* Copyright 1999-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -32,6 +32,7 @@ import junit.framework.TestSuite;

import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.util.DigestFilter;
import org.xml.sax.InputSource;
@@ -46,6 +47,9 @@ import org.xml.sax.InputSource;
*/
public final class GenericFOPTestCase extends TestCase {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();
protected SAXParserFactory parserFactory;

public static Test suite() {
@@ -110,13 +114,12 @@ public final class GenericFOPTestCase extends TestCase {

private void renderPDF(String fo, String digestIn, String digestOut)
throws Exception {
FOUserAgent foUserAgent = new FOUserAgent();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
foUserAgent.setCreationDate(new Date(10000));
MessageDigest outDigest = MessageDigest.getInstance("MD5");
DigestOutputStream out =
new DigestOutputStream(new ByteArrayOutputStream(), outDigest);
Fop fop = new Fop(MimeConstants.MIME_PDF, foUserAgent);
fop.setOutputStream(out);
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
InputSource source = new InputSource(new StringReader(fo));
DigestFilter filter = new DigestFilter("MD5");
filter.setParent(parserFactory.newSAXParser().getXMLReader());

+ 12
- 9
test/java/org/apache/fop/URIResolutionTestCase.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 2005 The Apache Software Foundation.
* Copyright 2005-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -40,8 +40,8 @@ import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.fop.apps.FOPException;
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.image.ImageFactory;
import org.apache.fop.render.xml.XMLRenderer;
import org.apache.xpath.XPathAPI;
import org.apache.xpath.objects.XObject;
@@ -52,6 +52,9 @@ import org.w3c.dom.Document;
*/
public class URIResolutionTestCase extends AbstractFOPTestCase {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();
private SAXTransformerFactory tfactory
= (SAXTransformerFactory)SAXTransformerFactory.newInstance();

@@ -79,12 +82,13 @@ public class URIResolutionTestCase extends AbstractFOPTestCase {
}
private void innerTestFO1(boolean withStream) throws Exception {
FOUserAgent ua = fopFactory.newFOUserAgent();

//Reset the image caches to force URI resolution!
ImageFactory.getInstance().clearCaches();
ua.getFactory().getImageFactory().clearCaches();
File foFile = new File(getBaseDir(), "test/xml/uri-resolution1.fo");
FOUserAgent ua = new FOUserAgent();
MyURIResolver resolver = new MyURIResolver(withStream);
ua.setURIResolver(resolver);
ua.setBaseURL(foFile.getParentFile().toURL().toString());
@@ -111,15 +115,14 @@ public class URIResolutionTestCase extends AbstractFOPTestCase {
//TODO This will only work when we can do URI resolution inside Batik!
File foFile = new File(getBaseDir(), "test/xml/uri-resolution2.fo");
FOUserAgent ua = new FOUserAgent();
FOUserAgent ua = fopFactory.newFOUserAgent();
MyURIResolver resolver = new MyURIResolver(false);
ua.setURIResolver(resolver);
ua.setBaseURL(foFile.getParentFile().toURL().toString());

Fop fop = new Fop(MimeConstants.MIME_PDF, ua);

ByteArrayOutputStream baout = new ByteArrayOutputStream();
fop.setOutputStream(baout);

Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, ua, baout);

Transformer transformer = tfactory.newTransformer(); //Identity transf.
Source src = new StreamSource(foFile);
@@ -156,7 +159,7 @@ public class URIResolutionTestCase extends AbstractFOPTestCase {
atrenderer.setContentHandler(athandler);
ua.setRendererOverride(atrenderer);
Fop fop = new Fop(MimeConstants.MIME_FOP_AREA_TREE, ua);
Fop fop = fopFactory.newFop(ua);

Transformer transformer = tfactory.newTransformer(); //Identity transf.
Source src = new StreamSource(fo);

+ 8
- 15
test/java/org/apache/fop/fotreetest/FOTreeTester.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 2005 The Apache Software Foundation.
* Copyright 2005-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,18 +23,12 @@ import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamSource;

import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.apps.FopFactory;

import org.apache.fop.fotreetest.ext.TestElementMapping;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLFilterImpl;
@@ -44,9 +38,6 @@ import org.xml.sax.helpers.XMLFilterImpl;
*/
public class FOTreeTester {

private SAXTransformerFactory tfactory
= (SAXTransformerFactory)SAXTransformerFactory.newInstance();

/**
* Runs a test.
* @param testFile the test file.
@@ -63,15 +54,17 @@ public class FOTreeTester {
XMLReader reader = parser.getXMLReader();
//Setup FOP for area tree rendering
FOUserAgent ua = new FOUserAgent();
FopFactory fopFactory = FopFactory.newInstance();
fopFactory.addElementMapping(new TestElementMapping());
FOUserAgent ua = fopFactory.newFOUserAgent();
ua.setBaseURL(testFile.getParentFile().toURL().toString());
ua.setFOEventHandlerOverride(new DummyFOEventHandler(ua));
ua.addElementMapping(new TestElementMapping());

//Used to set values in the user agent through processing instructions
reader = new PIListener(reader, ua);
Fop fop = new Fop(MimeConstants.MIME_FOP_AREA_TREE, ua);
Fop fop = fopFactory.newFop(ua);
reader.setContentHandler(fop.getDefaultHandler());
reader.setDTDHandler(fop.getDefaultHandler());
@@ -100,7 +93,7 @@ public class FOTreeTester {
/** @see org.xml.sax.helpers.XMLFilterImpl */
public void processingInstruction(String target, String data) throws SAXException {
if ("fop-useragent-break-indent-inheritance".equals(target)) {
userAgent.setBreakIndentInheritanceOnReferenceAreaBoundary(
userAgent.getFactory().setBreakIndentInheritanceOnReferenceAreaBoundary(
Boolean.valueOf(data).booleanValue());
}
super.processingInstruction(target, data);

+ 6
- 2
test/java/org/apache/fop/intermediate/AreaTreeParserTestCase.java View File

@@ -41,6 +41,7 @@ import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
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.area.AreaTreeModel;
import org.apache.fop.area.AreaTreeParser;
@@ -58,6 +59,9 @@ import org.w3c.dom.Document;
*/
public class AreaTreeParserTestCase extends XMLTestCase {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();
private static SAXTransformerFactory tFactory
= (SAXTransformerFactory)SAXTransformerFactory.newInstance();
private static Templates stylesheet = null;
@@ -162,7 +166,7 @@ public class AreaTreeParserTestCase extends XMLTestCase {
}
private FOUserAgent createUserAgent() {
FOUserAgent userAgent = new FOUserAgent();
FOUserAgent userAgent = fopFactory.newFOUserAgent();
try {
userAgent.setBaseURL(testDir.toURL().toExternalForm());
} catch (MalformedURLException e) {
@@ -197,7 +201,7 @@ public class AreaTreeParserTestCase extends XMLTestCase {

userAgent.setRendererOverride(renderer);
Fop fop = new Fop(MimeConstants.MIME_FOP_AREA_TREE, userAgent);
Fop fop = fopFactory.newFop(MimeConstants.MIME_FOP_AREA_TREE, userAgent);
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);

+ 10
- 7
test/java/org/apache/fop/layoutengine/LayoutEngineTester.java View File

@@ -21,7 +21,6 @@ package org.apache.fop.layoutengine;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -43,11 +42,10 @@ import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.FormattingResults;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.layoutmgr.ElementListObserver;
import org.apache.fop.render.xml.XMLRenderer;
import org.apache.xpath.XPathAPI;
@@ -56,7 +54,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
@@ -67,6 +64,10 @@ public class LayoutEngineTester {

private static final Map CHECK_CLASSES = new java.util.HashMap();
// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();
private FopFactory fopFactoryWithBase14Kerning = FopFactory.newInstance();
private SAXTransformerFactory tfactory
= (SAXTransformerFactory)SAXTransformerFactory.newInstance();

@@ -89,6 +90,8 @@ public class LayoutEngineTester {
*/
public LayoutEngineTester(File areaTreeBackupDir) {
this.areaTreeBackupDir = areaTreeBackupDir;
fopFactory.setBase14KerningEnabled(false);
fopFactoryWithBase14Kerning.setBase14KerningEnabled(true);
}
private Templates getTestcase2FOStylesheet() throws TransformerConfigurationException {
@@ -137,6 +140,7 @@ public class LayoutEngineTester {
XObject xo = XPathAPI.eval(testDoc, "/testcase/cfg/base14kerning");
String s = xo.str();
boolean base14kerning = ("true".equalsIgnoreCase(s));
FopFactory effFactory = (base14kerning ? fopFactoryWithBase14Kerning : fopFactory);
//Setup Transformer to convert the testcase XML to XSL-FO
Transformer transformer = getTestcase2FOStylesheet().newTransformer();
@@ -147,14 +151,13 @@ public class LayoutEngineTester {
athandler.setResult(domres);
//Setup FOP for area tree rendering
FOUserAgent ua = new FOUserAgent();
FOUserAgent ua = effFactory.newFOUserAgent();
ua.setBaseURL(testFile.getParentFile().toURL().toString());
ua.setBase14KerningEnabled(base14kerning);
XMLRenderer atrenderer = new XMLRenderer();
atrenderer.setUserAgent(ua);
atrenderer.setContentHandler(athandler);
ua.setRendererOverride(atrenderer);
fop = new Fop(MimeConstants.MIME_FOP_AREA_TREE, ua);
fop = effFactory.newFop(ua);
SAXResult fores = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, fores);

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

@@ -1,5 +1,5 @@
/*
* Copyright 2004-2005 The Apache Software Foundation.
* Copyright 2004-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,14 +35,18 @@ import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;

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;

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;
@@ -84,13 +88,12 @@ public class FOProcessorImpl extends AbstractLogEnabled

public void process(InputStream in, Templates templates, OutputStream out)
throws org.apache.fop.apps.FOPException, java.io.IOException {
Fop fop = new Fop(MimeConstants.MIME_PDF);
fop.setOutputStream(out);
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

try {
Transformer transformer;
if (templates == null) {
TransformerFactory factory = TransformerFactory.newInstance();
transformer = factory.newTransformer();
} else {
transformer = templates.newTransformer();

+ 7
- 4
test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 2005 The Apache Software Foundation.
* Copyright 2005-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,6 +36,7 @@ import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.commons.io.IOUtils;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;

/**
* BitmapProducer implementation that uses the PS or PDF renderer and an external converter
@@ -63,6 +64,9 @@ import org.apache.fop.apps.Fop;
public abstract class AbstractPSPDFBitmapProducer extends AbstractBitmapProducer
implements Configurable {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();
private String converter;
private boolean deleteTempFiles;
@@ -106,7 +110,7 @@ public abstract class AbstractPSPDFBitmapProducer extends AbstractBitmapProducer
/** @see org.apache.fop.visual.BitmapProducer */
public BufferedImage produce(File src, ProducerContext context) {
try {
FOUserAgent userAgent = new FOUserAgent();
FOUserAgent userAgent = fopFactory.newFOUserAgent();
userAgent.setTargetResolution(context.getTargetResolution());
userAgent.setBaseURL(src.getParentFile().toURL().toString());

@@ -118,8 +122,7 @@ public abstract class AbstractPSPDFBitmapProducer extends AbstractBitmapProducer
OutputStream out = new FileOutputStream(tempOut);
out = new BufferedOutputStream(out);
try {
Fop fop = new Fop(getTargetFormat(), userAgent);
fop.setOutputStream(out);
Fop fop = fopFactory.newFop(getTargetFormat(), userAgent, out);
SAXResult res = new SAXResult(fop.getDefaultHandler());
Transformer transformer = getTransformer(context);

+ 7
- 4
test/java/org/apache/fop/visual/BitmapProducerJava2D.java View File

@@ -1,5 +1,5 @@
/*
* Copyright 2005 The Apache Software Foundation.
* Copyright 2005-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,6 +34,7 @@ import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.commons.io.IOUtils;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;

/**
@@ -51,6 +52,9 @@ import org.apache.fop.apps.MimeConstants;
*/
public class BitmapProducerJava2D extends AbstractBitmapProducer implements Configurable {

// configure fopFactory as desired
private FopFactory fopFactory = FopFactory.newInstance();
private boolean deleteTempFiles;

/** @see org.apache.avalon.framework.configuration.Configurable */
@@ -61,7 +65,7 @@ public class BitmapProducerJava2D extends AbstractBitmapProducer implements Conf
/** @see org.apache.fop.visual.BitmapProducer */
public BufferedImage produce(File src, ProducerContext context) {
try {
FOUserAgent userAgent = new FOUserAgent();
FOUserAgent userAgent = fopFactory.newFOUserAgent();
userAgent.setTargetResolution(context.getTargetResolution());
userAgent.setBaseURL(src.getParentFile().toURL().toString());
@@ -69,8 +73,7 @@ public class BitmapProducerJava2D extends AbstractBitmapProducer implements Conf
OutputStream out = new FileOutputStream(outputFile);
out = new BufferedOutputStream(out);
try {
Fop fop = new Fop(MimeConstants.MIME_PNG, userAgent);
fop.setOutputStream(out);
Fop fop = fopFactory.newFop(MimeConstants.MIME_PNG, userAgent, out);
SAXResult res = new SAXResult(fop.getDefaultHandler());
Transformer transformer = getTransformer(context);

Loading…
Cancel
Save