Author: ltheussl
Date: Tue Oct  9 12:57:16 2007
New Revision: 583279

URL: http://svn.apache.org/viewvc?rev=583279&view=rev
Log:
DOXIASITETOOLS-5: Add new DocumentRenderer interface. Clean up package 
structure. Add FO document renderer.

Added:
    
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java
   (with props)
    
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java
   (with props)
    
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/
    
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/AbstractPdfRenderer.java
   (with props)
    
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/PdfRenderer.java
   (with props)
    
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/
    
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java
   (with props)
    
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/
    
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java
   (with props)
Modified:
    maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/pom.xml

Modified: maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/pom.xml
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/pom.xml?rev=583279&r1=583278&r2=583279&view=diff
==============================================================================
--- maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/pom.xml (original)
+++ maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/pom.xml Tue Oct  9 
12:57:16 2007
@@ -88,6 +88,11 @@
       <version>${doxiaVersion}</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.maven.doxia</groupId>
+      <artifactId>doxia-module-fo</artifactId>
+      <version>${doxiaVersion}</version>
+    </dependency>
+    <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-utils</artifactId>
     </dependency>

Added: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java?rev=583279&view=auto
==============================================================================
--- 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java
 (added)
+++ 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java
 Tue Oct  9 12:57:16 2007
@@ -0,0 +1,325 @@
+package org.apache.maven.doxia.docrenderer;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.doxia.Doxia;
+import org.apache.maven.doxia.docrenderer.document.DocumentModel;
+import org.apache.maven.doxia.docrenderer.document.io.xpp3.DocumentXpp3Reader;
+import org.apache.maven.doxia.sink.Sink;
+import org.apache.maven.doxia.parser.ParseException;
+import org.apache.maven.doxia.parser.manager.ParserNotFoundException;
+import org.apache.maven.doxia.module.site.SiteModule;
+import org.apache.maven.doxia.module.site.manager.SiteModuleManager;
+
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+/**
+ * Abstract <code>document</code> renderer.
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Siveton</a>
+ * @author ltheussl
+ * @version $Id$
+ */
+public abstract class AbstractDocumentRenderer
+    extends AbstractLogEnabled
+    implements DocumentRenderer
+{
+    /**
+     * @plexus.requirement
+     */
+    protected SiteModuleManager siteModuleManager;
+
+    /**
+     * @plexus.requirement
+     */
+    protected Doxia doxia;
+
+    /**
+     * The common base directory of source files.
+     */
+    private String baseDir;
+
+      //--------------------------------------------
+     //
+    //--------------------------------------------
+
+    /**
+     * Render a document from the files found in a Map.
+     *
+     * @param filesToProcess the Map of Files to process. The Map should 
contain as keys the paths of the
+     *      source files (relative to [EMAIL PROTECTED] #getBaseDir() 
baseDir}), and the corresponding SiteModule as values.
+     *
+     * @param outputDirectory the output directory where the document should 
be generated.
+     *
+     * @param documentModel the document model, containing all the metadata, 
etc.
+     *
+     * @throws DocRendererException if any
+     * @throws IOException if any
+     */
+    public abstract void render( Map filesToProcess, File outputDirectory, 
DocumentModel documentModel )
+        throws DocRendererException, IOException;
+
+      //--------------------------------------------
+     //
+    //--------------------------------------------
+
+    /** [EMAIL PROTECTED] */
+    public void render( Collection files, File outputDirectory, DocumentModel 
documentModel )
+        throws DocRendererException, IOException
+    {
+        render( getFilesToProcess( files ), outputDirectory, documentModel );
+    }
+
+    /** [EMAIL PROTECTED] */
+    public void render( File baseDirectory, File outputDirectory, 
DocumentModel documentModel )
+        throws DocRendererException, IOException
+    {
+        render( getFilesToProcess( baseDirectory ), outputDirectory, 
documentModel );
+    }
+
+    /**
+     * Render a document from the files found in baseDirectory. This just 
forwards to
+     *              [EMAIL PROTECTED] #render(File,File,DocumentModel)} with a 
new DocumentModel.
+     *
+     * @param baseDirectory the directory containing the source files.
+     *              This should follow the standard Maven convention, ie 
containing all the site modules.
+     *
+     * @param outputDirectory the output directory where the document should 
be generated.
+     *
+     * @throws DocRendererException if any
+     * @throws IOException if any
+     */
+    public void render( File baseDirectory, File outputDirectory )
+        throws DocRendererException, IOException
+    {
+        render( baseDirectory, outputDirectory, new DocumentModel() );
+    }
+
+    /**
+     * Render a document from the files found in baseDirectory.
+     *
+     * @param baseDirectory the directory containing the source files.
+     *              This should follow the standard Maven convention, ie 
containing all the site modules.
+     *
+     * @param outputDirectory the output directory where the document should 
be generated.
+     *
+     * @param documentDescriptor a file containing the document model.
+     *              If this file does not exist or is null, some default 
settings will be used.
+     *
+     * @throws DocRendererException if any
+     * @throws IOException if any
+     */
+    public void render( File baseDirectory, File outputDirectory, File 
documentDescriptor )
+        throws DocRendererException, IOException
+    {
+        if ( ( documentDescriptor == null ) || ( !documentDescriptor.exists() 
) )
+        {
+            getLogger().warn( "No documentDescriptor found: using default 
settings!" );
+
+            render( baseDirectory, outputDirectory );
+        }
+        else
+        {
+            render( getFilesToProcess( baseDirectory ), outputDirectory, 
readDocumentModel( documentDescriptor ) );
+        }
+    }
+
+    /**
+     * Returns a Map of files to process. The Map contains as keys the paths 
of the source files
+     *      (relative to [EMAIL PROTECTED] #getBaseDir() baseDir}), and the 
corresponding SiteModule as values.
+     *
+     * @param baseDirectory the directory containing the source files.
+     *              This should follow the standard Maven convention, ie 
containing all the site modules.
+     * @return a Map of files to process.
+     * @throws IOException in case of a problem reading the files under 
baseDirectory.
+     */
+    public Map getFilesToProcess( File baseDirectory )
+        throws IOException
+    {
+        if ( !baseDirectory.isDirectory() )
+        {
+            getLogger().warn( "No files found to process!" );
+
+            return new HashMap();
+        }
+
+        setBaseDir( baseDirectory.getAbsolutePath() );
+
+        Map filesToProcess = new HashMap();
+
+        for ( Iterator i = siteModuleManager.getSiteModules().iterator(); 
i.hasNext(); )
+        {
+            SiteModule module = (SiteModule) i.next();
+
+            File moduleBasedir = new File( baseDirectory, 
module.getSourceDirectory() );
+
+            if ( moduleBasedir.exists() )
+            {
+                // TODO: handle in/excludes
+                List docs = FileUtils.getFiles( moduleBasedir, "**/*." + 
module.getExtension(), null, false );
+
+                for ( Iterator j = docs.iterator(); j.hasNext(); )
+                {
+                    String filePath = ( (File) j.next() ).getPath();
+
+                    filesToProcess.put( filePath, module );
+                }
+            }
+        }
+
+        return filesToProcess;
+    }
+
+    /**
+     * Returns a Map of files to process. The Map contains as keys the paths 
of the source files
+     *      (relative to [EMAIL PROTECTED] #getBaseDir() baseDir}), and the 
corresponding SiteModule as values.
+     *
+     * @param files The Collection of source files.
+     * @return a Map of files to process.
+     */
+    public Map getFilesToProcess( Collection files )
+    {
+        // 
----------------------------------------------------------------------
+        // Map all the file names to parser ids
+        // 
----------------------------------------------------------------------
+
+        Map filesToProcess = new HashMap();
+
+        for ( Iterator it = siteModuleManager.getSiteModules().iterator(); 
it.hasNext(); )
+        {
+            SiteModule siteModule = (SiteModule) it.next();
+
+            String extension = "." + siteModule.getExtension();
+
+            String sourceDirectory = File.separator + 
siteModule.getSourceDirectory() + File.separator;
+
+            for ( Iterator j = files.iterator(); j.hasNext(); )
+            {
+                String file = (String) j.next();
+
+                // first check if the file path contains one of the recognized 
source dir identifiers
+                // (there's trouble if a pathname contains 2 identifiers), 
then match file extensions (not unique).
+
+                if ( file.indexOf( sourceDirectory ) != -1 )
+                {
+                    filesToProcess.put( file, siteModule );
+                }
+                else if ( file.endsWith( extension ) )
+                {
+                    // don't overwrite if it's there already
+                    if ( !filesToProcess.containsKey( file ) )
+                    {
+                        filesToProcess.put( file, siteModule );
+                    }
+                }
+            }
+        }
+
+        return filesToProcess;
+    }
+
+    /** [EMAIL PROTECTED] */
+    public DocumentModel readDocumentModel( File documentDescriptor )
+        throws DocRendererException, IOException
+    {
+        DocumentModel documentModel;
+
+        try
+        {
+            documentModel = new DocumentXpp3Reader().read( new FileReader( 
documentDescriptor ) );
+        }
+        catch ( XmlPullParserException e )
+        {
+            throw new DocRendererException( "Error parsing document 
descriptor", e );
+        }
+
+        return documentModel;
+    }
+
+    /**
+     * Sets the current base directory.
+     *
+     * @param newDir the absolute path to the base directory to set.
+     */
+    public void setBaseDir( String newDir )
+    {
+        this.baseDir = newDir;
+    }
+
+    /**
+     * Return the current base directory.
+     *
+     * @return the current base directory.
+     */
+    public String getBaseDir()
+    {
+        return this.baseDir;
+    }
+
+      //--------------------------------------------
+     //
+    //--------------------------------------------
+
+    /**
+     * Parse a source document into a sink.
+     *
+     * @param fullDocPath absolute path to the source document.
+     * @param parserId determines the parser to use.
+     * @param sink the sink to receive the events.
+     * @throws DocRendererException in case of a parsing error.
+     * @throws IOException if the source document cannot be opened.
+     */
+    protected void parse( String fullDocPath, String parserId, Sink sink )
+        throws DocRendererException, IOException
+    {
+        try
+        {
+            FileReader reader = new FileReader( fullDocPath );
+
+            doxia.parse( reader, parserId, sink );
+        }
+        catch ( ParserNotFoundException e )
+        {
+            throw new DocRendererException( "No parser '" + parserId
+                        + "' found for " + fullDocPath + ": " + e.getMessage() 
);
+        }
+        catch ( ParseException e )
+        {
+            throw new DocRendererException( "Error parsing " + fullDocPath + 
": " + e.getMessage(), e );
+        }
+        finally
+        {
+            sink.flush();
+        }
+    }
+
+}

Propchange: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java?rev=583279&view=auto
==============================================================================
--- 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java
 (added)
+++ 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java
 Tue Oct  9 12:57:16 2007
@@ -0,0 +1,95 @@
+package org.apache.maven.doxia.docrenderer;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+
+import org.apache.maven.doxia.docrenderer.document.DocumentModel;
+
+/**
+ * Base interface for rendering documents from a set of input files.
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Siveton</a>
+ * @author ltheussl
+ * @version $Id$
+ */
+public interface DocumentRenderer
+{
+    /** Plexus lookup role. */
+    String ROLE = DocumentRenderer.class.getName();
+
+    /**
+     * Render a document from a set of files, depending on a rendering context.
+     *
+     * @param files the path name Strings (relative to a common base directory)
+     *              of files to include in the document generation.
+     *
+     * @param outputDirectory the output directory where the document should 
be generated.
+     *
+     * @param documentModel the document model, containing all the metadata, 
etc.
+     *              If the model contains a TOC, only the files found in this 
TOC are rendered,
+     *              otherwise all files from the Collection of files will be 
processed.
+     *
+     * @throws DocRendererException if any.
+     * @throws IOException if any.
+     */
+    void render( Collection files, File outputDirectory, DocumentModel 
documentModel )
+        throws DocRendererException, IOException;
+
+    /**
+     * Render a document from the files found in a source directory, depending 
on a rendering context.
+     *
+     * @param baseDirectory the directory containing the source files.
+     *              This should follow the standard Maven convention, ie 
containing all the site modules.
+     *
+     * @param outputDirectory the output directory where the document should 
be generated.
+     *
+     * @param documentModel the document model, containing all the metadata, 
etc.
+     *              If the model contains a TOC, only the files found in this 
TOC are rendered,
+     *              otherwise all files found under baseDirectory will be 
processed.
+     *
+     * @throws DocRendererException if any
+     * @throws IOException if any
+     */
+    void render( File baseDirectory, File outputDirectory, DocumentModel 
documentModel )
+        throws DocRendererException, IOException;
+
+    /**
+     * Read a document model from a file.
+     *
+     * @param documentDescriptor a document descriptor file that contains the 
document model.
+     *
+     * @return the document model, containing all the metadata, etc.
+     *
+     * @throws DocRendererException if any
+     * @throws IOException if any
+     */
+    DocumentModel readDocumentModel( File documentDescriptor )
+        throws DocRendererException, IOException;
+
+    /**
+     * Get the output extension associated with this DocumentRenderer.
+     *
+     * @return the ouput extension.
+     */
+    String getOutputExtension();
+}

Propchange: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/AbstractPdfRenderer.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/AbstractPdfRenderer.java?rev=583279&view=auto
==============================================================================
--- 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/AbstractPdfRenderer.java
 (added)
+++ 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/AbstractPdfRenderer.java
 Tue Oct  9 12:57:16 2007
@@ -0,0 +1,43 @@
+package org.apache.maven.doxia.docrenderer.pdf;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.doxia.docrenderer.AbstractDocumentRenderer;
+
+/**
+ * Abstract pdf renderer, this doesn't depend on the framework.
+ *
+ * @author ltheussl
+ * @version $Id$
+ */
+public abstract class AbstractPdfRenderer
+    extends AbstractDocumentRenderer
+    implements PdfRenderer
+{
+    /**
+     * Get the output extension associated with this renderer.
+     *
+     * @return the ouput extension: "pdf".
+     */
+    public String getOutputExtension()
+    {
+        return "pdf";
+    }
+}

Propchange: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/AbstractPdfRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/AbstractPdfRenderer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/PdfRenderer.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/PdfRenderer.java?rev=583279&view=auto
==============================================================================
--- 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/PdfRenderer.java
 (added)
+++ 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/PdfRenderer.java
 Tue Oct  9 12:57:16 2007
@@ -0,0 +1,47 @@
+package org.apache.maven.doxia.docrenderer.pdf;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+
+import org.apache.maven.doxia.docrenderer.DocumentRenderer;
+import org.apache.maven.doxia.docrenderer.DocRendererException;
+
+/**
+ * PDF renderer interface.
+ *
+ * @author ltheussl
+ * @version $Id$
+ */
+public interface PdfRenderer extends DocumentRenderer
+{
+    /** Plexus lookup role. */
+    String ROLE = PdfRenderer.class.getName();
+
+    /**
+     * Generate a final pdf ouput file from an intermediate format file.
+     *
+     * @param inputFile eg a fo or an itext file.
+     * @param pdfFile the pdf file to generate.
+     * @throws DocRendererException if any.
+     */
+   void generatePdf( File inputFile, File pdfFile )
+        throws DocRendererException;
+}

Propchange: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/PdfRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/PdfRenderer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java?rev=583279&view=auto
==============================================================================
--- 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java
 (added)
+++ 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java
 Tue Oct  9 12:57:16 2007
@@ -0,0 +1,189 @@
+package org.apache.maven.doxia.docrenderer.pdf.fo;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.maven.doxia.docrenderer.DocRendererException;
+import org.apache.maven.doxia.docrenderer.document.DocumentModel;
+import org.apache.maven.doxia.docrenderer.document.DocumentTOCItem;
+import org.apache.maven.doxia.docrenderer.pdf.AbstractPdfRenderer;
+import org.apache.maven.doxia.module.site.SiteModule;
+import org.apache.maven.doxia.module.fo.FoAggregateSink;
+import org.apache.maven.doxia.module.fo.FoUtils;
+
+import org.codehaus.plexus.util.StringUtils;
+
+/**
+ * PDF renderer that uses Doxia's FO module.
+ *
+ * @author ltheussl
+ * @version $Id$
+ */
+public class FoPdfRenderer
+    extends AbstractPdfRenderer
+{
+    /**
+     * Converts a FO file to a PDF file using FOP.
+     *
+     * @param foFile the FO file.
+     * @param pdfFile the target PDF file.
+     * @throws DocRendererException In case of a conversion problem.
+     * @see 
org.apache.maven.doxia.module.fo.FoUtils#convertFO2PDF(File,File,String);
+     */
+    public void generatePdf( File foFile, File pdfFile )
+        throws DocRendererException
+    {
+        getLogger().debug( "Generating: " + pdfFile );
+
+        try
+        {
+            FoUtils.convertFO2PDF( foFile, pdfFile, null );
+        }
+        catch ( TransformerException e )
+        {
+            throw new DocRendererException( "Error creating PDF from " + 
foFile + ": " + e.getMessage() );
+        }
+    }
+
+
+    /** [EMAIL PROTECTED] */
+    public void render( Map files, File outputDirectory, DocumentModel model )
+        throws DocRendererException, IOException
+    {
+        String outputName = model.getOutputName();
+
+        if ( outputName == null )
+        {
+            getLogger().info( "No outputName is defined in the document 
descriptor. Using 'target.pdf'" );
+
+            model.setOutputName( "target" );
+        }
+        else if ( outputName.lastIndexOf( "." ) != -1 )
+        {
+            model.setOutputName( outputName.substring( 0, 
outputName.lastIndexOf( "." ) ) );
+        }
+
+        outputName = model.getOutputName();
+
+        File outputFOFile = new File( outputDirectory, outputName + ".fo" );
+
+        if ( !outputFOFile.getParentFile().exists() )
+        {
+            outputFOFile.getParentFile().mkdirs();
+        }
+
+        File pdfOutputFile = new File( outputDirectory, outputName + ".pdf" );
+
+        if ( !pdfOutputFile.getParentFile().exists() )
+        {
+            pdfOutputFile.getParentFile().mkdirs();
+        }
+
+        FoAggregateSink sink = new FoAggregateSink( new FileWriter( 
outputFOFile ) );
+
+        sink.setDocumentModel( model );
+
+        sink.beginDocument();
+
+        sink.coverPage();
+
+        sink.toc();
+
+        if ( ( model.getToc() == null ) || ( model.getToc().getItems() == null 
) )
+        {
+            getLogger().info( "No TOC is defined in the document descriptor. 
Merging all documents." );
+
+            for ( Iterator j = files.keySet().iterator(); j.hasNext(); )
+            {
+                String key = (String) j.next();
+
+                SiteModule module = (SiteModule) files.get( key );
+
+                sink.setDocumentName( key );
+                // TODO: sink.setDocumentTitle( "Title" ); ???
+
+                String fullDocPath = getBaseDir() + File.separator
+                            + module.getSourceDirectory() + File.separator + 
key;
+
+                parse( fullDocPath, module.getParserId(), sink );
+            }
+
+        }
+        else
+        {
+            for ( Iterator k = model.getToc().getItems().iterator(); 
k.hasNext(); )
+            {
+                DocumentTOCItem tocItem = (DocumentTOCItem) k.next();
+
+                if ( tocItem.getRef() == null )
+                {
+                    getLogger().info( "No ref defined for tocItem " + 
tocItem.getName() );
+
+                    continue;
+                }
+
+                String href = StringUtils.replace( tocItem.getRef(), "\\", "/" 
);
+
+                if ( href.lastIndexOf( "." ) != -1 )
+                {
+                    href = href.substring( 0, href.lastIndexOf( "." ) );
+                }
+
+                for ( Iterator i = 
siteModuleManager.getSiteModules().iterator(); i.hasNext(); )
+                {
+                    SiteModule module = (SiteModule) i.next();
+
+                    File moduleBasedir = new File( getBaseDir(), 
module.getSourceDirectory() );
+
+                    // TODO: handle fml exclude more generally (via modules 
exclude?)
+                    if ( moduleBasedir.exists() && !"fml".equals( 
module.getExtension() ) )
+                    {
+                        String doc = href + "." + module.getExtension();
+
+                        File source = new File( moduleBasedir, doc );
+
+                        if ( source.exists() )
+                        {
+                            sink.setDocumentName( doc );
+
+                            sink.setDocumentTitle( tocItem.getName() );
+
+                            parse( source.getPath(), module.getParserId(), 
sink );
+                        }
+                    }
+                }
+            }
+
+        }
+
+        sink.endDocument();
+
+        generatePdf( outputFOFile, pdfOutputFile );
+    }
+
+}

Propchange: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java?rev=583279&view=auto
==============================================================================
--- 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java
 (added)
+++ 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java
 Tue Oct  9 12:57:16 2007
@@ -0,0 +1,372 @@
+package org.apache.maven.doxia.docrenderer.pdf.itext;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.maven.doxia.docrenderer.DocRendererException;
+import org.apache.maven.doxia.docrenderer.document.DocumentModel;
+import org.apache.maven.doxia.docrenderer.pdf.AbstractPdfRenderer;
+import org.apache.maven.doxia.module.itext.ITextSink;
+import org.apache.maven.doxia.module.itext.ITextUtil;
+import org.apache.maven.doxia.module.site.SiteModule;
+import org.apache.xml.utils.DefaultErrorHandler;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
+
+import com.lowagie.text.ElementTags;
+
+/**
+ * Abstract <code>document</code> render with the <code>iText</code> framework
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Siveton</a>
+ * @author ltheussl
+ * @version $Id$
+ */
+public class ITextPdfRenderer
+    extends AbstractPdfRenderer
+{
+    /** The xslt style sheet used to transform a Document to an iText file. */
+    private static final String XSLT_RESOURCE = 
"org/apache/maven/doxia/docrenderer/itext/xslt/TOC.xslt";
+
+    /** The TransformerFactory. */
+    private static final TransformerFactory TRANSFORMER_FACTORY = 
TransformerFactory.newInstance();
+
+    /** The DocumentBuilderFactory. */
+    private static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY = 
DocumentBuilderFactory.newInstance();
+
+    static
+    {
+        TRANSFORMER_FACTORY.setErrorListener( new DefaultErrorHandler() );
+    }
+
+    /**
+     * Converts an iText file to a PDF file using the iText framework.
+     *
+     * @param iTextFile the iText file.
+     * @param pdfFile the target PDF file.
+     * @throws DocRendererException In case of a conversion problem.
+     */
+    public void generatePdf( File iTextFile, File pdfFile )
+        throws DocRendererException
+    {
+        getLogger().debug( "Generating : " + pdfFile );
+
+        try
+        {
+            ITextUtil.writePdf( new FileInputStream( iTextFile ), new 
FileOutputStream( pdfFile ) );
+        }
+        catch ( IOException e )
+        {
+            throw new DocRendererException( "Cannot create PDF from " + 
iTextFile + ": " + e.getMessage(), e );
+        }
+        catch ( RuntimeException e )
+        {
+            throw new DocRendererException( "Error creating PDF from " + 
iTextFile + ": " + e.getMessage(), e );
+        }
+    }
+
+    /** [EMAIL PROTECTED] */
+    public void render( Map files, File outputDirectory, DocumentModel model )
+        throws DocRendererException, IOException
+    {
+        String outputName = model.getOutputName();
+
+        if ( outputName == null )
+        {
+            getLogger().info( "No outputName is defined in the document 
descriptor. Using 'target.pdf'" );
+
+            model.setOutputName( "target" );
+        }
+        else if ( outputName.lastIndexOf( "." ) != -1 )
+        {
+            model.setOutputName( outputName.substring( 0, 
outputName.lastIndexOf( "." ) ) );
+        }
+
+// TODO: adjust from o.a.m.d.docrenderer.itext.AbstractITextRender
+//        if ( ( model.getToc() == null ) || ( model.getToc().getItems() == 
null ) )
+//        {
+//            getLogger().info( "No TOC is defined in the document descriptor. 
Generating all documents." );
+
+            for ( Iterator j = files.keySet().iterator(); j.hasNext(); )
+            {
+                String key = (String) j.next();
+
+                SiteModule module = (SiteModule) files.get( key );
+
+
+                String fullDocPath = getBaseDir() + File.separator
+                            + module.getSourceDirectory() + File.separator + 
key;
+                System.err.println( "fullDocPath: " + fullDocPath );
+                String iTextFileName = key.substring( 0, key.indexOf( "." ) + 
1 ) + "xml";
+                System.err.println( "iTextFileName: " + iTextFileName );
+
+                File iTextFile = new File( outputDirectory, iTextFileName );
+                if ( !iTextFile.getParentFile().exists() )
+                {
+                    iTextFile.getParentFile().mkdirs();
+                }
+
+                String pdfFileName = key.substring( 0, key.indexOf( "." ) + 1 
) + getOutputExtension();
+                System.err.println( "pdfFileName: " + pdfFileName );
+
+                File pdfFile = new File( outputDirectory, pdfFileName );
+                if ( !pdfFile.getParentFile().exists() )
+                {
+                    pdfFile.getParentFile().mkdirs();
+                }
+
+                parse( fullDocPath, module, iTextFile );
+
+                generatePdf( iTextFile, pdfFile );
+            }
+/*
+        }
+        else
+        {
+            // TODO: adjust from o.a.m.d.docrenderer.itext.AbstractITextRender
+        }
+*/
+
+    }
+
+
+      //--------------------------------------------
+     //
+    //--------------------------------------------
+
+
+    /**
+     * Parse a source document and emit results into a sink.
+     *
+     * @param fullDocPath absolute path to the source document.
+     * @param module the site module associated with the source document 
(determines the parser to use).
+     * @param iTextFile the resulting iText xml file.
+     * @throws DocRendererException in case of a parsing problem.
+     * @throws IOException if the source and/or target document cannot be 
opened.
+     */
+    private void parse( String fullDocPath, SiteModule module, File iTextFile )
+        throws DocRendererException, IOException
+    {
+        ITextSink sink = new ITextSink( new FileWriter( iTextFile ) );
+
+        sink.setClassLoader( new URLClassLoader( new URL[] { 
iTextFile.getParentFile().toURL() } ) );
+
+        parse( fullDocPath, module.getParserId(), sink );
+
+        sink.close();
+    }
+
+    /**
+     * Merge all iTextFiles to a single one.
+     *
+     * @param iTextFiles list of iText xml files.
+     * @return Document.
+     * @throws DocRendererException if any.
+     * @throws IOException if any.
+     */
+    private Document generateDocument( List iTextFiles )
+        throws DocRendererException, IOException
+    {
+        Document document;
+
+        try
+        {
+            document = 
DOCUMENT_BUILDER_FACTORY.newDocumentBuilder().newDocument();
+        }
+        catch ( ParserConfigurationException e )
+        {
+            throw new DocRendererException( "Error building document :" + 
e.getMessage() );
+        }
+
+        document.appendChild( document.createElement( ElementTags.ITEXT ) ); 
// Used only to set a root
+
+        for ( int i = 0; i < iTextFiles.size(); i++ )
+        {
+            File iTextFile = (File) iTextFiles.get( i );
+
+            Document iTextDocument;
+
+            try
+            {
+                iTextDocument = 
DOCUMENT_BUILDER_FACTORY.newDocumentBuilder().parse( iTextFile );
+            }
+            catch ( SAXException e )
+            {
+                throw new DocRendererException( "SAX Error : " + 
e.getMessage() );
+            }
+            catch ( ParserConfigurationException e )
+            {
+                throw new DocRendererException( "Error parsing configuration : 
" + e.getMessage() );
+            }
+
+            // Only one chapter per doc
+            Node chapter = iTextDocument.getElementsByTagName( 
ElementTags.CHAPTER ).item( 0 );
+
+            try
+            {
+                document.getDocumentElement().appendChild( 
document.importNode( chapter, true ) );
+            }
+            catch ( DOMException e )
+            {
+                throw new DocRendererException( "Error appending chapter for " 
+ iTextFile + " : " + e.getMessage() );
+            }
+        }
+
+        return document;
+    }
+
+    /**
+     * Initialize the transformer object.
+     *
+     * @return an instance of a transformer object.
+     * @throws DocRendererException if any.
+     */
+    private Transformer initTransformer()
+        throws DocRendererException
+    {
+        try
+        {
+            Transformer transformer = TRANSFORMER_FACTORY.newTransformer( new 
StreamSource( AbstractPdfRenderer.class
+                .getResourceAsStream( "/" + XSLT_RESOURCE ) ) );
+
+            transformer.setErrorListener( 
TRANSFORMER_FACTORY.getErrorListener() );
+
+            transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, 
"false" );
+
+            transformer.setOutputProperty( OutputKeys.INDENT, "yes" );
+
+            transformer.setOutputProperty( OutputKeys.METHOD, "xml" );
+
+            transformer.setOutputProperty( OutputKeys.ENCODING, "UTF-8" );
+
+            return transformer;
+        }
+        catch ( TransformerConfigurationException e )
+        {
+            throw new DocRendererException( "Error configuring Transformer for 
" + XSLT_RESOURCE + ": "
+                + e.getMessage() );
+        }
+        catch ( IllegalArgumentException e )
+        {
+            throw new DocRendererException( "Error configuring Transformer for 
" + XSLT_RESOURCE + ": "
+                + e.getMessage() );
+        }
+    }
+
+    /**
+     * Add transformer parameters from a DocumentModel.
+     *
+     * @param transformer the Transformer to set the parameters.
+     * @param documentModel the DocumentModel to take the parameters from.
+     */
+    private void addTransformerParameters( Transformer transformer, 
DocumentModel documentModel )
+    {
+        if ( documentModel.getMeta().getTitle() != null )
+        {
+            transformer.setParameter( "title", 
documentModel.getMeta().getTitle() );
+        }
+
+        if ( documentModel.getMeta().getAuthor() != null )
+        {
+            transformer.setParameter( "author", 
documentModel.getMeta().getAuthor() );
+        }
+
+        transformer.setParameter( "creationdate", new Date().toString() );
+
+        if ( documentModel.getMeta().getSubject() != null )
+        {
+            transformer.setParameter( "subject", 
documentModel.getMeta().getSubject() );
+        }
+
+        if ( documentModel.getMeta().getKeywords() != null )
+        {
+            transformer.setParameter( "keywords", 
documentModel.getMeta().getKeywords() );
+        }
+
+        transformer.setParameter( "producer", "Generated with Doxia by " + 
System.getProperty( "user.name" ) );
+
+        if ( ITextUtil.isPageSizeSupported( documentModel.getMeta().getTitle() 
) )
+        {
+            transformer.setParameter( "pagesize", 
documentModel.getMeta().getPageSize() );
+        }
+        else
+        {
+            transformer.setParameter( "pagesize", "A4" );
+        }
+
+        transformer.setParameter( "frontPageHeader", "" );
+
+        if ( documentModel.getMeta().getTitle() != null )
+        {
+            transformer.setParameter( "frontPageTitle", 
documentModel.getMeta().getTitle() );
+        }
+
+        transformer.setParameter( "frontPageFooter", "Generated date " + new 
Date().toString() );
+    }
+
+    /**
+     * Transform a document to an iTextFile.
+     *
+     * @param documentModel the DocumentModel to take the parameters from.
+     * @param document the Document to transform.
+     * @param iTextFile the resulting iText xml file.
+     * @throws DocRendererException in case of a transformation error.
+     */
+    private void transform( DocumentModel documentModel, Document document, 
File iTextFile )
+        throws DocRendererException
+    {
+        Transformer transformer = initTransformer();
+
+        addTransformerParameters( transformer, documentModel );
+
+        try
+        {
+            transformer.transform( new DOMSource( document ), new 
StreamResult( iTextFile ) );
+        }
+        catch ( TransformerException e )
+        {
+            throw new DocRendererException( "Error transforming Document " + 
document + ": " + e.getMessage() );
+        }
+    }
+}

Propchange: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"


Reply via email to