[jboss-svn-commits] JBL Code SVN: r26993 - in labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin: src/main/java/org/jboss/jdocbook and 11 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jun 17 11:10:29 EDT 2009


Author: steve.ebersole at jboss.com
Date: 2009-06-17 11:10:29 -0400 (Wed, 17 Jun 2009)
New Revision: 26993

Added:
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/Environment.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/I18nEnvironment.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/I18nSource.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/MasterTranslationDescriptor.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/PublishingSource.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/RendererFactory.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/RenderingEnvironment.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/XslFoGenerator.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/FopConfigHelper.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/ResultImpl.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/XslFoGeneratorImpl.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/ConsoleRedirectionHandler.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/XIncludeFallbackResolver.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/GenerateXslFoMojo.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/Profiling.java
Removed:
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/actions/
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/RendererFactory.java
Modified:
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/pom.xml
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/Options.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/Factory.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/PoSynchronizer.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/PotSynchronizer.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/TranslationBuilder.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/gettext/PoSynchronizerImpl.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/gettext/PotSynchronizerImpl.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/gettext/TranslationBuilderImpl.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/profile/Profiler.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/profile/ProfilerFactory.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/profile/ProfilerImpl.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/Renderer.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/BasicRenderer.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/PDFRenderer.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/FileUtils.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/ResourceHelper.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/TransformerType.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/XIncludeHelper.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/TransformerBuilder.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/BasicUrnResolver.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/ClasspathResolver.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/CurrentVersionResolver.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/ExplicitUrnResolver.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/VersionResolver.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/AbstractDocBookMojo.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/CleanPoMojo.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/CleanPotMojo.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/GenerationMojo.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/PackageMojo.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/ResourceMojo.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/TranslationMojo.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/UpdatePoMojo.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/UpdatePotMojo.java
   labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/resources/META-INF/plexus/components.xml
Log:
MPJDOCBOOK-19, MPJDOCBOOK-26 : style transitivity & fonts

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/pom.xml
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/pom.xml	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/pom.xml	2009-06-17 15:10:29 UTC (rev 26993)
@@ -1,3 +1,26 @@
+<!--
+  ~ jDocBook, processing of DocBook sources as a Maven plugin
+  ~
+  ~ Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+  ~ indicated by the @author tags or express copyright attribution
+  ~ statements applied by the authors.  All third-party contributions are
+  ~ distributed under license by Red Hat Middleware LLC.
+  ~
+  ~ This copyrighted material is made available to anyone wishing to use, modify,
+  ~ copy, or redistribute it subject to the terms and conditions of the GNU
+  ~ Lesser General Public License, as published by the Free Software Foundation.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  ~ or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+  ~ for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public License
+  ~ along with this distribution; if not, write to:
+  ~ Free Software Foundation, Inc.
+  ~ 51 Franklin Street, Fifth Floor
+  ~ Boston, MA  02110-1301  USA
+  -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
     <modelVersion>4.0.0</modelVersion>
@@ -11,7 +34,7 @@
     <groupId>org.jboss.maven.plugins</groupId>
     <artifactId>maven-jdocbook-plugin</artifactId>
     <packaging>maven-plugin</packaging>
-    <version>2.1.3-SNAPSHOT</version>
+    <version>2.2.0-SNAPSHOT</version>
 
     <name>jDocBook Maven Plugin</name>
     <description>This plugin adds support for DocBook handling to Maven.</description>
@@ -99,18 +122,36 @@
         </plugins>
     </reporting>
 
+<!--
+    TEMPORARY!!!!  = see FOP dependencies...
+-->
+<repositories>
+    <repository>
+        <id>docx4j</id>
+        <name>docx4j Maven 2 repository</name>
+        <url>http://dev.plutext.org/svn/docx4j/trunk/docx4j/m2</url>
+    </repository>
+</repositories>
+
+
     <dependencies>
         <dependency>
             <!-- DocBook (this is the version used, unless user project imports one...) -->
             <groupId>net.sf.docbook</groupId>
             <artifactId>docbook</artifactId>
-            <version>1.72.0</version>
+            <version>1.74.0</version>
         </dependency>
 
         <dependency>
+            <groupId>org.jboss.maven.util</groupId>
+            <artifactId>jboss-maven-utils</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-exec</artifactId>
-            <version>1.0.0-SNAPSHOT</version>
+            <version>1.0</version>
         </dependency>
 
         <!-- XML APIs -->
@@ -129,6 +170,11 @@
             <artifactId>xmlParserAPIs</artifactId>
             <version>2.6.2</version>
         </dependency>
+        <dependency>
+            <groupId>jdom</groupId>
+            <artifactId>jdom</artifactId>
+            <version>1.0</version>
+        </dependency>
 
         <!-- depending upon which transformer factory you want to use -->
         <dependency>
@@ -146,22 +192,22 @@
         <dependency>
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-core</artifactId>
-            <version>2.0.9</version>
+            <version>${maven.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-plugin-api</artifactId>
-            <version>2.0</version>
+            <version>${maven.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-project</artifactId>
-            <version>2.0.4</version>
+            <version>${maven.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.maven.reporting</groupId>
             <artifactId>maven-reporting-api</artifactId>
-            <version>2.0.4</version>
+            <version>${maven.version}</version>
         </dependency>
         <dependency>
             <groupId>org.codehaus.plexus</groupId>
@@ -183,10 +229,44 @@
         <dependency>
             <groupId>org.apache.xmlgraphics</groupId>
             <artifactId>fop</artifactId>
-            <version>0.93</version>
+<!--
+            <version>0.95</version>
+-->
+            <version>svn-trunk</version>
         </dependency>
+<!--
+<dependency>
+<groupId>docx4j</groupId>
+<artifactId>fop-patched</artifactId>
+<version>0.95.756434</version>
+</dependency>
 
+<dependency>
+<groupId>org.apache.xmlgraphics</groupId>
+<artifactId>xmlgraphics-commons</artifactId>
+<version>1.3.757686</version>
+</dependency>
+
+<dependency>
+<groupId>commons-logging</groupId>
+<artifactId>commons-logging</artifactId>
+<version>1.1.1</version>
+</dependency>
+
+<dependency>
+<groupId>commons-io</groupId>
+<artifactId>commons-io</artifactId>
+<version>1.3.1</version>
+</dependency>
+-->
+        <dependency>
+            <groupId>org.apache.avalon.framework</groupId>
+            <artifactId>avalon-framework-impl</artifactId>
+            <version>4.3.1</version>
+        </dependency>
+
         <!-- Batik is used by FOP for SVG, PNG, and TIFF processing -->
+
         <dependency>
             <groupId>batik</groupId>
             <artifactId>batik-css</artifactId>
@@ -211,6 +291,16 @@
             <version>${batikVersion}</version>
             <scope>runtime</scope>
         </dependency>
+        <dependency>
+            <groupId>batik</groupId>
+            <artifactId>batik-bridge</artifactId>
+            <version>1.6-1</version>
+        </dependency>
+        <dependency>
+            <groupId>batik</groupId>
+            <artifactId>batik-ext</artifactId>
+            <version>1.6-1</version>
+        </dependency>
 
         <!-- JAI is used by FOP for GIF and TIFF processing -->
         <dependency>
@@ -225,10 +315,15 @@
             <version>1.1.3</version>
             <scope>runtime</scope>
         </dependency>
-
+        <dependency>
+            <groupId>org.apache.maven.shared</groupId>
+            <artifactId>maven-dependency-tree</artifactId>
+            <version>1.1</version>
+        </dependency>
     </dependencies>
 
     <properties>
+        <maven.version>2.0.9</maven.version>
         <batikVersion>1.6</batikVersion>
     </properties>
 

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/Environment.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/Environment.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/Environment.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,78 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook;
+
+import java.net.URL;
+import java.io.File;
+
+import org.jboss.jdocbook.xslt.TransformerBuilder;
+import org.jboss.jdocbook.util.ResourceHelper;
+import org.jboss.jdocbook.render.format.FormatPlan;
+import org.jboss.jdocbook.render.format.StandardDocBookFormatDescriptor;
+import org.apache.xml.resolver.tools.CatalogResolver;
+
+/**
+ * Basic environment in which jDocBook is executing.
+ *
+ * @author Steve Ebersole
+ */
+public interface Environment {
+	/**
+	 * Retrieve the logging bridge to the environment's logging system.
+	 * 
+	 * @return The environment's logging bridge.
+	 */
+	public Log log();
+
+	/**
+	 * Retrieve the user defined configuration options.
+	 *
+	 * @return The user defined configuration options.
+	 */
+	public Options getOptions();
+
+	/**
+	 * Get the transformer builder for this environment..
+	 *
+	 * @return The transformer builder.
+	 */
+	public TransformerBuilder getTransformerBuilder();
+
+	/**
+	 * Retrieve the catalog resolver for this environment.
+	 *
+	 * @return The catalog resolver.
+	 */
+	public CatalogResolver getCatalogResolver();
+
+	public URL[] getClasspathUriResolverBaseUrls();
+
+	public File getStagingDirectory();
+
+	public File getWorkDirectory();
+
+	public ResourceHelper getResourceHelper();
+
+	public FormatPlan getFormatPlan(StandardDocBookFormatDescriptor format);
+}

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/Options.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/Options.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/Options.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -25,12 +25,7 @@
 
 import java.util.Properties;
 
-import org.apache.xml.resolver.CatalogManager;
-import org.apache.xml.resolver.tools.CatalogResolver;
 import org.jboss.jdocbook.util.TransformerType;
-import org.jboss.jdocbook.xslt.TransformerBuilder;
-import org.jboss.jdocbook.xslt.catalog.ExplicitCatalogManager;
-import org.jboss.jdocbook.xslt.catalog.ImplicitCatalogManager;
 
 /**
  * A (detachable) representation of the user configuration.
@@ -45,12 +40,9 @@
 	private boolean useRelativeImageUris = true;
 	private String docbookVersion;
 	private char localeSeparator = '-';
+	private boolean autoDetectFonts;
+	private boolean useFopFontCache = true;
 
-	private CatalogResolver catalogResolver;
-	private TransformerBuilder transformerBuilder;
-
-	private Log log = new NoOpLog();
-
 	protected Options() {
 	}
 
@@ -65,7 +57,8 @@
 			Properties transformerParameters,
 			boolean useRelativeImageUris,
 			String docBookVersion,
-			char localeSeparator) {
+			char localeSeparator,
+			boolean autoDetectFonts) {
 		this.xincludeSupported = xincludeSupported;
 		this.catalogs = catalogs;
 		this.xmlTransformerType = xmlTransformerType;
@@ -73,6 +66,7 @@
 		this.useRelativeImageUris = useRelativeImageUris;
 		this.docbookVersion = docBookVersion;
 		this.localeSeparator = localeSeparator;
+		this.autoDetectFonts = autoDetectFonts;
 	}
 
 	public boolean isXincludeSupported() {
@@ -114,65 +108,19 @@
 		return localeSeparator;
 	}
 
-	public CatalogResolver getCatalogResolver() {
-		if ( catalogResolver == null ) {
-			CatalogManager catalogManager;
-			if ( getCatalogs() == null || getCatalogs().length == 0 ) {
-				catalogManager = new ImplicitCatalogManager();
-			}
-			else {
-				catalogManager = new ExplicitCatalogManager( getCatalogs() );
-			}
-			catalogResolver = new CatalogResolver( catalogManager );
-		}
-		return catalogResolver;
+	public boolean isAutoDetectFontsEnabled() {
+		return autoDetectFonts;
 	}
 
-	public TransformerBuilder getTransformerBuilder() {
-		if ( transformerBuilder == null ) {
-			transformerBuilder = new TransformerBuilder( this );
-		}
-		return transformerBuilder;
+	public void setAutoDetectFonts(boolean autoDetectFonts) {
+		this.autoDetectFonts = autoDetectFonts;
 	}
 
-	public void setLog(Log log) {
-		this.log = log;
+	public boolean isUseFopFontCache() {
+		return useFopFontCache;
 	}
 
-	public Log getLog() {
-		return log;
+	public void setUseFopFontCache(boolean useFopFontCache) {
+		this.useFopFontCache = useFopFontCache;
 	}
-
-	private static class NoOpLog implements Log {
-
-		public void trace(String message) {
-		}
-
-		public void trace(String message, Object... args) {
-		}
-
-		public void info(String message) {
-		}
-
-		public void info(String message, Object... args) {
-		}
-
-		public void info(String message, Throwable exception) {
-		}
-
-		public void info(String message, Throwable exception, Object... args) {
-		}
-
-		public void error(String message) {
-		}
-
-		public void error(String message, Object... args) {
-		}
-
-		public void error(String message, Throwable exception) {
-		}
-
-		public void error(String message, Throwable exception, Object... args) {
-		}
-	}
 }
\ No newline at end of file

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/Factory.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/Factory.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/Factory.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -28,30 +28,30 @@
 import org.jboss.jdocbook.i18n.gettext.TranslationBuilderImpl;
 
 /**
- * Factory for various i18n components.  Statically bound to "gettext" versions.
+ * Factory for various i18n components.  Statically bound to "gettext" and "po/xml" executables.
  *
  * @author Steve Ebersole
  */
 public class Factory {
-	private static final PotSynchronizer potSynchronizer = new PotSynchronizerImpl();
-	private static final PoSynchronizer poSynchronizer = new PoSynchronizerImpl();
-	private static final TranslationBuilder translationBuilder = new TranslationBuilderImpl();
+	private final PotSynchronizer potSynchronizer;
+	private final PoSynchronizer poSynchronizer;
+	private final TranslationBuilder translationBuilder;
 
-	/**
-	 * Disallow instantiation
-	 */
-	private Factory() {
+	public Factory(I18nEnvironment environment) {
+		this.potSynchronizer = new PotSynchronizerImpl( environment );
+		this.poSynchronizer = new PoSynchronizerImpl( environment );
+		this.translationBuilder = new TranslationBuilderImpl( environment );
 	}
 
-	public static PotSynchronizer getPotSynchronizer() {
+	public PotSynchronizer getPotSynchronizer() {
 		return potSynchronizer;
 	}
 
-	public static PoSynchronizer getPoSynchronizer() {
+	public PoSynchronizer getPoSynchronizer() {
 		return poSynchronizer;
 	}
 
-	public static TranslationBuilder getTranslationBuilder() {
+	public TranslationBuilder getTranslationBuilder() {
 		return translationBuilder;
 	}
 }

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/I18nEnvironment.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/I18nEnvironment.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/I18nEnvironment.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,39 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook.i18n;
+
+import java.util.List;
+
+import org.jboss.jdocbook.Environment;
+
+/**
+ * Describes the environment for processing i18n aspects of documentation.
+ *
+ * @author Steve Ebersole
+ */
+public interface I18nEnvironment extends Environment {
+	public MasterTranslationDescriptor getMasterTranslationDescriptor();
+
+	public List<I18nSource> getI18nSources(boolean excludeIngoredTranslations);
+}

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/I18nSource.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/I18nSource.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/I18nSource.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,56 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook.i18n;
+
+import java.util.Locale;
+import java.io.File;
+
+/**
+ * Describes a source of localized content for a language.
+ *
+ * @author Steve Ebersole
+ */
+public interface I18nSource {
+	/**
+	 * Retrieve the locale representation of the tralsnation language.
+	 *
+	 * @return The translation language locale.
+	 */
+	public Locale getLocale();
+
+	/**
+	 * Retrieve the directory containing PO files for this translation.
+	 *
+	 * @return This translation's PO file directory.
+	 */
+	public File resolvePoDirectory();
+
+	/**
+	 * Retrieve the directory to which translated XML files should go (created by applying the PO files on top of the
+	 * master XML).
+	 *
+	 * @return This translation's XML directory.
+	 */
+	public File resolveTranslatedXmlDirectory();
+}

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/MasterTranslationDescriptor.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/MasterTranslationDescriptor.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/MasterTranslationDescriptor.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,41 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook.i18n;
+
+import java.util.Locale;
+import java.io.File;
+
+import org.jboss.jdocbook.render.PublishingSource;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public interface MasterTranslationDescriptor extends PublishingSource {
+	public Locale getLocale();
+//	public File getSourceDirectory();
+	public File resolveMasterDocument();
+	public File resolvePotDirectory();
+}

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/PoSynchronizer.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/PoSynchronizer.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/PoSynchronizer.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -23,10 +23,6 @@
  */
 package org.jboss.jdocbook.i18n;
 
-import java.io.File;
-import java.util.Locale;
-
-import org.jboss.jdocbook.Options;
 import org.jboss.jdocbook.JDocBookProcessException;
 
 /**
@@ -40,12 +36,7 @@
 	/**
 	 * Perform the synchronization on the the PO files.
 	 *
-	 * @param potDirectory The directory containing the POT files.
-	 * @param translationDirectory The directory containing the translation PO files.
-	 * @param translationLocale The locale of the translation
-	 * @param options The user options
 	 * @throws JDocBookProcessException unable to synchronize POT files
 	 */
-	public void synchronizePo(File potDirectory, File translationDirectory, Locale translationLocale, Options options)
-			throws JDocBookProcessException;
+	public void synchronizePoFiles() throws JDocBookProcessException;
 }

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/PotSynchronizer.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/PotSynchronizer.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/PotSynchronizer.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -23,10 +23,7 @@
  */
 package org.jboss.jdocbook.i18n;
 
-import java.io.File;
-
 import org.jboss.jdocbook.JDocBookProcessException;
-import org.jboss.jdocbook.Options;
 
 /**
  * Contract for synchronizing (creating/updating) PortableObjectTemplate (POT)
@@ -42,11 +39,8 @@
 	 * Perform the synchronization on the the POT files pertaining to the given
 	 * master DocBook source.
 	 *
-	 * @param masterFile The DocBook source
-	 * @param templateDirectory The directory where POT files are contained.
-	 * @param options The user options
 	 * @throws JDocBookProcessException unable to synchronize POT files
 	 */
-	public void synchronizePot(File masterFile, File templateDirectory, Options options) throws JDocBookProcessException;
+	public void synchronizePot() throws JDocBookProcessException;
 
 }

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/TranslationBuilder.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/TranslationBuilder.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/TranslationBuilder.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -23,9 +23,6 @@
  */
 package org.jboss.jdocbook.i18n;
 
-import java.io.File;
-
-import org.jboss.jdocbook.Options;
 import org.jboss.jdocbook.JDocBookProcessException;
 
 /**
@@ -36,13 +33,9 @@
  */
 public interface TranslationBuilder {
 	/**
+	 * Process the translation PO files into a set of translated XML files.
 	 *
-	 * @param masterFile The master DocBook source
-	 * @param poDirectory The directory containing PO files
-	 * @param targetDirectory The directory into which to generate the translated XML
-	 * @param options The user options
 	 * @throws JDocBookProcessException unable to apply PO translations
 	 */
-	public void buildTranslation(File masterFile, File poDirectory, File targetDirectory, Options options)
-			throws JDocBookProcessException;
+	public void buildTranslations() throws JDocBookProcessException;
 }

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/gettext/PoSynchronizerImpl.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/gettext/PoSynchronizerImpl.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/gettext/PoSynchronizerImpl.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -28,8 +28,10 @@
 import java.util.Locale;
 
 import org.jboss.jdocbook.JDocBookProcessException;
-import org.jboss.jdocbook.Options;
+import org.jboss.jdocbook.Log;
 import org.jboss.jdocbook.i18n.PoSynchronizer;
+import org.jboss.jdocbook.i18n.I18nEnvironment;
+import org.jboss.jdocbook.i18n.I18nSource;
 import org.jboss.jdocbook.util.FileUtils;
 import org.jboss.jdocbook.util.I18nUtils;
 import org.jboss.jdocbook.util.VCSDirectoryExclusionFilter;
@@ -45,13 +47,30 @@
  * @author Steve Ebersole
  */
 public class PoSynchronizerImpl implements PoSynchronizer {
-	/**
-	 * {@inheritDoc}
-	 */
-	public void synchronizePo(File potDirectory, File translationDirectory, Locale translationLocale, Options options)
+	private final I18nEnvironment environment;
+
+	public PoSynchronizerImpl(I18nEnvironment environment) {
+		this.environment = environment;
+	}
+
+	private Log getLog() {
+		return environment.log();
+	}
+
+	public void synchronizePoFiles() {
+		for ( I18nSource source : environment.getI18nSources( true ) ) {
+			synchronizePo(
+					environment.getMasterTranslationDescriptor().resolvePotDirectory(),
+					source.resolvePoDirectory(),
+					source.getLocale()
+			);
+		}
+	}
+
+	private void synchronizePo(File potDirectory, File poDirectory, Locale translationLocale)
 			throws JDocBookProcessException {
 		if ( !potDirectory.exists() ) {
-			options.getLog().info( "skipping PO updates; POT directory did not exist : {0}", potDirectory );
+			getLog().info( "skipping PO updates; POT directory did not exist : {0}", potDirectory );
 			return;
 		}
 		File[] files = potDirectory.listFiles( new VCSDirectoryExclusionFilter() );
@@ -60,32 +79,31 @@
 				// recurse into the directory by calling back into ourselves with the sub-dir
 				synchronizePo(
 						new File( potDirectory, files[i].getName() ),
-						new File( translationDirectory, files[i].getName() ),
-						translationLocale,
-						options
+						new File( poDirectory, files[i].getName() ),
+						translationLocale
 				);
 			}
 			else {
 				if ( I18nUtils.isPotFile( files[i] ) ) {
-					File translation = new File( translationDirectory, I18nUtils.determinePoFileName( files[i] ) );
-					updateTranslation( files[i], translation, translationLocale, options );
+					File translation = new File( poDirectory, I18nUtils.determinePoFileName( files[i] ) );
+					updateTranslation( files[i], translation, translationLocale );
 				}
 			}
 		}
 	}
 
-	private void updateTranslation(File template, File translation, Locale translationLocale, Options options) {
+	private void updateTranslation(File template, File translation, Locale translationLocale) {
 		if ( !template.exists() ) {
-			options.getLog().trace( "skipping PO updates; POT file did not exist : {0}", template );
+			getLog().trace( "skipping PO updates; POT file did not exist : {0}", template );
 			return;
 		}
 
 		if ( translation.lastModified() >= template.lastModified() ) {
-			options.getLog().trace( "skipping PO updates; up-to-date : {0}", translation );
+			getLog().trace( "skipping PO updates; up-to-date : {0}", translation );
 			return;
 		}
 
-		final String translationLocaleString = LocaleUtils.render( translationLocale, options.getLocaleSeparator() );
+		final String translationLocaleString = LocaleUtils.render( translationLocale, environment.getOptions().getLocaleSeparator() );
 
 		CommandLine commandLine;
 		if ( translation.exists() ) {
@@ -100,19 +118,19 @@
 			if ( ! translation.getParentFile().exists() ) {
 				boolean created = translation.getParentFile().mkdirs();
 				if ( ! created ) {
-					options.getLog().info( "Unable to create translation directory : {}", translationLocaleString );
+					getLog().info( "Unable to create PO directory {}", translation.getParentFile().getAbsolutePath() );
 				}
 			}
 			commandLine = CommandLine.parse( "msginit" );
 			commandLine.addArgument( "--no-translator" );
-			commandLine.addArgument( "--locale=" + LocaleUtils.render( translationLocale, options.getLocaleSeparator() ) );
+			commandLine.addArgument( "--locale=" + translationLocaleString );
 			commandLine.addArgument( "-i" );
 			commandLine.addArgument( FileUtils.resolveFullPathName( template ) );
 			commandLine.addArgument( "-o" );
 			commandLine.addArgument( FileUtils.resolveFullPathName( translation ) );
 		}
 
-		options.getLog().info( "po-synch -> " + commandLine.toString() );
+		getLog().info( "po-synch -> " + commandLine.toString() );
 
 		DefaultExecutor executor = new DefaultExecutor();
 		try {

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/gettext/PotSynchronizerImpl.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/gettext/PotSynchronizerImpl.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/gettext/PotSynchronizerImpl.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -28,8 +28,9 @@
 import java.io.IOException;
 
 import org.jboss.jdocbook.JDocBookProcessException;
-import org.jboss.jdocbook.Options;
+import org.jboss.jdocbook.Log;
 import org.jboss.jdocbook.i18n.PotSynchronizer;
+import org.jboss.jdocbook.i18n.I18nEnvironment;
 import org.jboss.jdocbook.util.FileUtils;
 import org.jboss.jdocbook.util.I18nUtils;
 import org.jboss.jdocbook.util.XIncludeHelper;
@@ -44,51 +45,67 @@
  * @author Steve Ebersole
  */
 public class PotSynchronizerImpl implements PotSynchronizer {
+	private I18nEnvironment environment;
+
+	public PotSynchronizerImpl(I18nEnvironment environment) {
+		this.environment = environment;
+	}
+
+	private Log getLog() {
+		return environment.log();
+	}
+
 	/**
 	 * {@inheritDoc} 
 	 */
-	public void synchronizePot(File masterFile, File templateDirectory, Options options) throws JDocBookProcessException {
+	public void synchronizePot() throws JDocBookProcessException {
+		synchronizePot(
+				environment.getMasterTranslationDescriptor().resolveMasterDocument(),
+				environment.getMasterTranslationDescriptor().resolvePotDirectory()
+		);
+	}
+
+	private void synchronizePot(File masterFile, File potDirectory) throws JDocBookProcessException {
 		if ( !masterFile.exists() ) {
-			options.getLog().info( "skipping POT updates; master file did not exist : {0}", masterFile );
+			getLog().info( "skipping POT updates; master file did not exist : {0}", masterFile );
 			return;
 		}
 		final File sourceBasedir = masterFile.getParentFile();
 		final String potFileName = I18nUtils.determinePotFileName( masterFile );
-		final File potFile = new File( templateDirectory, potFileName );
-		updatePortableObjectTemplate( masterFile, potFile, options );
+		final File potFile = new File( potDirectory, potFileName );
+		updatePortableObjectTemplate( masterFile, potFile );
 
 		// Note : recursion below accounts for inclusions within inclusions
 		for ( File inclusion : XIncludeHelper.locateInclusions( masterFile ) ) {
 			final String relativity = FileUtils.determineRelativity( inclusion, sourceBasedir );
-			final File relativeTemplateDir = ( relativity == null ) ? templateDirectory : new File(
-					templateDirectory,
-					relativity
-			);
-			synchronizePot( inclusion, relativeTemplateDir, options );
+			final File relativeTemplateDir = ( relativity == null )
+					? potDirectory
+					: new File( potDirectory, relativity );
+			synchronizePot( inclusion, relativeTemplateDir );
 		}
 	}
 
-	private void updatePortableObjectTemplate(File masterFile, File potFile, Options options) {
+	private void updatePortableObjectTemplate(File masterFile, File potFile) {
 		if ( !masterFile.exists() ) {
-			options.getLog().trace( "skipping POT update; source file did not exist : {0}", masterFile );
+			getLog().trace( "skipping POT update; source file did not exist : {0}", masterFile );
 			return;
 		}
 
 		if ( potFile.exists() && potFile.lastModified() >= masterFile.lastModified() ) {
-			options.getLog().trace( "skipping POT update; up-to-date : {0}", potFile );
+			getLog().trace( "skipping POT update; up-to-date : {0}", potFile );
 			return;
 		}
 
 		if ( !potFile.getParentFile().exists() ) {
 			boolean created = potFile.getParentFile().mkdirs();
 			if ( !created ) {
-				options.getLog().info( "Unable to generate POT directory {}" + FileUtils.resolveFullPathName( potFile.getParentFile() ) );
+				getLog().info( "Unable to generate POT directory {}" + FileUtils.resolveFullPathName( potFile.getParentFile() ) );
 			}
 		}
-		executeXml2pot( masterFile, potFile, options );
+		executeXml2pot( masterFile, potFile );
 	}
 
-	private void executeXml2pot(File masterFile, File potFile, Options options) {
+	private void executeXml2pot(File masterFile, File potFile) {
 		CommandLine commandLine = CommandLine.parse( "xml2pot" );
 		commandLine.addArgument( FileUtils.resolveFullPathName( masterFile ) );
 
@@ -99,7 +116,7 @@
 			PumpStreamHandler streamDirector = new PumpStreamHandler( xmlStream, System.err );
 			executor.setStreamHandler( streamDirector );
 			try {
-				options.getLog().trace( "updating POT file {0}", potFile );
+				getLog().trace( "updating POT file {0}", potFile );
 				executor.execute( commandLine );
 			}
 			finally {

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/gettext/TranslationBuilderImpl.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/gettext/TranslationBuilderImpl.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/i18n/gettext/TranslationBuilderImpl.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -27,15 +27,18 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.DefaultExecutor;
+import org.apache.commons.exec.PumpStreamHandler;
 import org.jboss.jdocbook.JDocBookProcessException;
-import org.jboss.jdocbook.Options;
+import org.jboss.jdocbook.Log;
+import org.jboss.jdocbook.i18n.I18nEnvironment;
+import org.jboss.jdocbook.i18n.I18nSource;
+import org.jboss.jdocbook.i18n.MasterTranslationDescriptor;
 import org.jboss.jdocbook.i18n.TranslationBuilder;
 import org.jboss.jdocbook.util.FileUtils;
 import org.jboss.jdocbook.util.I18nUtils;
 import org.jboss.jdocbook.util.XIncludeHelper;
-import org.apache.commons.exec.CommandLine;
-import org.apache.commons.exec.DefaultExecutor;
-import org.apache.commons.exec.PumpStreamHandler;
 
 /**
  * Implementation of the {@link org.jboss.jdocbook.i18n.TranslationBuilder} contract based on system calls
@@ -44,14 +47,36 @@
  * @author Steve Ebersole
  */
 public class TranslationBuilderImpl implements TranslationBuilder {
+	private final I18nEnvironment environment;
+
+	public TranslationBuilderImpl(I18nEnvironment environment) {
+		this.environment = environment;
+	}
+
+	private Log getLog() {
+		return environment.log();
+	}
+
+	public void buildTranslations() throws JDocBookProcessException {
+		MasterTranslationDescriptor master = environment.getMasterTranslationDescriptor();
+
+		for ( I18nSource source : environment.getI18nSources( true ) ) {
+			buildTranslation(
+					master.resolveMasterDocument(),
+					source.resolvePoDirectory(),
+					source.resolveTranslatedXmlDirectory()
+			);
+		}
+	}
+
 	/**
 	 * {@inheritDoc}
 	 */
-	public void buildTranslation(File masterFile, File poDirectory, File targetDirectory, Options options)
+	public void buildTranslation(File masterFile, File poDirectory, File targetDirectory)
 			throws JDocBookProcessException {
-		options.getLog().trace( "starting translation [" + masterFile + "]" );
+		getLog().trace( "starting translation [" + masterFile + "]" );
 		if ( !masterFile.exists() ) {
-			options.getLog().info( "skipping translation; master file did not exist : {0}", masterFile );
+			getLog().info( "skipping translation; master file did not exist : {}", masterFile );
 			return;
 		}
 
@@ -61,45 +86,45 @@
 			throw new JDocBookProcessException( "Unable to locate PO file for [" + masterFile.getName() + "] in [" + poDirectory.getName() + "]" );
 		}
 		final File translatedFile = new File( targetDirectory, masterFile.getName() );
-		generateTranslatedXML( masterFile, poFile, translatedFile, options );
+		generateTranslatedXML( masterFile, poFile, translatedFile );
 
 		// Note : recursion below accounts for inclusions within inclusions
 		final File sourceBasedir = masterFile.getParentFile();
 		for ( File inclusion : XIncludeHelper.locateInclusions( masterFile ) ) {
-			options.getLog().trace( "starting translation of inclusion [" + inclusion + "]" );
+			getLog().trace( "starting translation of inclusion [" + inclusion + "]" );
 			final String relativity = FileUtils.determineRelativity( inclusion, sourceBasedir );
-			options.getLog().trace( "determined relativity : " + relativity );
+			getLog().trace( "determined relativity : " + relativity );
 			final File relativeTranslationDir = ( relativity == null )
 					? poDirectory
 					: new File( poDirectory, relativity );
 			final File relativeWorkDir = ( relativity == null )
 					? targetDirectory
 					: new File( targetDirectory, relativity );
-			buildTranslation( inclusion, relativeTranslationDir, relativeWorkDir, options );
+			buildTranslation( inclusion, relativeTranslationDir, relativeWorkDir );
 		}
 	}
 
-	private void generateTranslatedXML(File masterFile, File poFile, File translatedFile, Options options) {
+	private void generateTranslatedXML(File masterFile, File poFile, File translatedFile) {
 		if ( !masterFile.exists() ) {
-			options.getLog().trace( "skipping translation; source file did not exist : {0}", masterFile );
+			getLog().trace( "skipping translation; source file did not exist : {0}", masterFile );
 			return;
 		}
 		if ( !poFile.exists() ) {
-			options.getLog().trace( "skipping translation; PO file did not exist : {0}", poFile );
+			getLog().trace( "skipping translation; PO file did not exist : {0}", poFile );
 			return;
 		}
 
 		if ( translatedFile.exists()
 				&& translatedFile.lastModified() >= masterFile.lastModified()
 				&& translatedFile.lastModified() >= poFile.lastModified() ) {
-			options.getLog().trace( "skipping translation; up-to-date : {0}", translatedFile );
+			getLog().trace( "skipping translation; up-to-date : {0}", translatedFile );
 			return;
 		}
 
 		if ( ! translatedFile.getParentFile().exists() ) {
 			boolean created = translatedFile.getParentFile().mkdirs();
 			if ( ! created ) {
-				options.getLog().info( "Unable to create directories for translation" );
+				getLog().info( "Unable to create directories for translation" );
 			}
 		}
 
@@ -115,6 +140,9 @@
 				executor.setStreamHandler( streamDirector );
 				executor.execute( commandLine );
 			}
+			catch ( IOException ioe ) {
+				throw new JDocBookProcessException( "uanble to execute po2xml : " + ioe.getMessage() );
+			}
 			finally {
 				try {
 					xmlStream.flush();

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/profile/Profiler.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/profile/Profiler.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/profile/Profiler.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -23,8 +23,6 @@
  */
 package org.jboss.jdocbook.profile;
 
-import java.io.File;
-
 /**
  * Contract for applying DocBook profiling based on the approach they term 'two-pass'.
  *
@@ -32,10 +30,7 @@
  */
 public interface Profiler {
 	/**
-	 * Given a source file, create its profiled equivalent.
-	 *
-	 * @param source The source file to be profiled.
-	 * @return The profiling output.
+	 * Apply profiling to jDocBook sources.
 	 */
-	public File applyProfiling(File source);
+	public void applyProfiling();
 }

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/profile/ProfilerFactory.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/profile/ProfilerFactory.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/profile/ProfilerFactory.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -23,28 +23,23 @@
  */
 package org.jboss.jdocbook.profile;
 
-import java.io.File;
+import org.jboss.jdocbook.render.RenderingEnvironment;
 
-import org.jboss.jdocbook.Options;
-
 /**
  * A factory for {@link Profiler} instances.
  *
  * @author Steve Ebersole
  */
 public class ProfilerFactory {
-	private final File outputDirectory;
-	private final Options options;
+	private final RenderingEnvironment environment;
 
 	/**
-	 * Constructs a factory capable of producing {@link Profiler} instances writing to the given directory.
+	 * Constructs a factory capable of producing appropriate {@link Profiler} instances.
 	 *
-	 * @param outputDirectory The directory where profiling output should be written.
-	 * @param options The options.
+	 * @param environment The profiling environment.
 	 */
-	public ProfilerFactory(File outputDirectory, Options options) {
-		this.options = options;
-		this.outputDirectory = outputDirectory;
+	public ProfilerFactory(RenderingEnvironment environment) {
+		this.environment = environment;
 	}
 
 	/**
@@ -53,7 +48,7 @@
 	 * @return The profiler.
 	 */
 	public Profiler buildProfiler() {
-		return new ProfilerImpl( outputDirectory, options );
+		return new ProfilerImpl( environment );
 	}
 
 }

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/profile/ProfilerImpl.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/profile/ProfilerImpl.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/profile/ProfilerImpl.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -30,10 +30,12 @@
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.stream.StreamResult;
 
-import org.jboss.jdocbook.Options;
 import org.jboss.jdocbook.render.RenderingException;
+import org.jboss.jdocbook.render.RenderingEnvironment;
+import org.jboss.jdocbook.render.PublishingSource;
 import org.jboss.jdocbook.util.Constants;
 import org.jboss.jdocbook.util.FileUtils;
+import org.jboss.jdocbook.util.LocaleUtils;
 import org.jboss.jdocbook.xslt.XSLTException;
 
 /**
@@ -42,32 +44,47 @@
  * @author Steve Ebersole
  */
 class ProfilerImpl implements Profiler {
-	private final File outputDirectory;
-	private final Options options;
+	private final RenderingEnvironment environment;
 
-	ProfilerImpl(File outputDirectory, Options options) {
-		this.outputDirectory = outputDirectory;
-		this.options = options;
+	public ProfilerImpl(RenderingEnvironment environment) {
+		this.environment = environment;
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
-	public File applyProfiling(File sourceFile) {
+	public void applyProfiling() {
 		try {
-			if ( !outputDirectory.exists() ) {
-				boolean created = outputDirectory.mkdirs();
-				if ( !created ) {
-					options.getLog().info( "Unable to create directory " + outputDirectory.getAbsolutePath() );
+			for ( PublishingSource source : environment.getPublishingSources( true ) ) {
+				final File targetFile = source.resolveProfiledDocumentFile();
+				if ( ! targetFile.getParentFile().exists() ) {
+					boolean created = targetFile.getParentFile().mkdirs();
+					if ( !created ) {
+						environment.log().info( "Unable to create parent directory " + targetFile.getAbsolutePath() );
+					}
 				}
+				environment.log().info( "applying DocBook profiling [" + targetFile.getAbsolutePath() + "]" );
+
+				Transformer xslt = environment.getTransformerBuilder()
+						.buildStandardTransformer( Constants.MAIN_PROFILE_XSL_RESOURCE );
+
+				final String lang = LocaleUtils.render( source.getLocale(), environment.getOptions().getLocaleSeparator() );
+
+				xslt.setParameter( "l10n.gentext.language", lang );
+
+				// figure out the attribute upon which to profile
+				final String profilingAttributeName = environment.getProfilingConfiguration().getAttributeName();
+				if ( profilingAttributeName == null || "lang".equals( profilingAttributeName ) ) {
+					xslt.setParameter( "profile.attribute", "lang" );
+					xslt.setParameter( "profile.lang", lang );
+				}
+				else {
+					xslt.setParameter( "profile.attribute", profilingAttributeName );
+					xslt.setParameter( "profile.value", environment.getProfilingConfiguration().getAttributeValue() );
+				}
+
+				xslt.transform( buildSource( source.resolveDocumentFile() ), buildResult( targetFile ) );
 			}
-			File targetFile = new File( outputDirectory, sourceFile.getName() );
-			options.getLog().info( "applying DocBook profiling [" + targetFile.getAbsolutePath() + "]" );
-
-			Transformer xslt = options.getTransformerBuilder()
-					.buildStandardTransformer( Constants.MAIN_PROFILE_XSL_RESOURCE );
-			xslt.transform( buildSource( sourceFile ), buildResult( targetFile ) );
-			return targetFile;
 		}
 		catch ( TransformerException e ) {
 			throw new XSLTException( "error performing translation [" + e.getLocationAsString() + "] : " + e.getMessage(), e );
@@ -75,7 +92,11 @@
 	}
 
 	private Source buildSource(File sourceFile) throws RenderingException {
-		return FileUtils.createSAXSource( sourceFile, options.getCatalogResolver(), options.isXincludeSupported() );
+		return FileUtils.createSAXSource(
+				sourceFile,
+				environment.getCatalogResolver(),
+				environment.getOptions().isXincludeSupported()
+		);
 	}
 
 	protected Result buildResult(File targetFile) throws RenderingException, XSLTException {

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/PublishingSource.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/PublishingSource.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/PublishingSource.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,75 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook.render;
+
+import java.util.Locale;
+import java.io.File;
+
+import org.jboss.jdocbook.render.format.FormatPlan;
+
+/**
+ * Describes a source content DocBook publishing.
+ *
+ * @author Steve Ebersole
+ */
+public interface PublishingSource {
+	/**
+	 * Retrieve the language for this source.
+	 *
+	 * @return The language for this source.
+	 */
+	public Locale getLocale();
+
+	public FormatPlan[] getFormatPlans();
+
+	/**
+	 * Retrieve the DocBook XML document file  to be processed.
+	 *
+	 * @return The DocBook XML document file.
+	 */
+	public File resolveDocumentFile();
+
+	/**
+	 * Retrieve the directory to use in order to apply DocBook profilng to this particular publishing source.
+	 *
+	 * @return The DocBook profiling output directory for this source.
+	 */
+	public File resolveProfilingDirectory();
+
+	/**
+	 * Retrieve the DocBook XML document file  to be processed.
+	 *
+	 * @return The DocBook XML document file.
+	 */
+	public File resolveProfiledDocumentFile();
+
+	/**
+	 * Retrieve the base directory into which the formatted DocBook outputs should be written.
+	 *
+	 * @return The base directory into which the formatted DocBook outputs should be written.
+	 */
+	public File resolvePublishingDirectory();
+
+	public File resolveXslFoDirectory();
+}

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/Renderer.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/Renderer.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/Renderer.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -23,9 +23,6 @@
  */
 package org.jboss.jdocbook.render;
 
-import java.io.File;
-
-import org.jboss.jdocbook.render.format.FormatPlan;
 import org.jboss.jdocbook.xslt.XSLTException;
 
 /**
@@ -34,19 +31,11 @@
  * @author Steve Ebersole
  */
 public interface Renderer {
-
 	/**
-	 * Performs the actual rendering or transforming of the DocBook sources into
-	 * the respective output format.
+	 * Performs the actual rendering or transforming of the DocBook sources into the respective output formats.
 	 *
-	 * @param source The source DocBook file.
-	 * @param plan The formatting plan.
-	 * @param renderingDirectory The directory into which to render
-	 * @param stagingDirectory The directory where images resources were staged
 	 * @throws RenderingException Problem writing the output file(s).
 	 * @throws XSLTException Problem performing XSL transformation.
 	 */
-	public void render(File source, FormatPlan plan, File renderingDirectory, File stagingDirectory) throws RenderingException, XSLTException;
-
-	public File getAttachableBundle(File source);
+	public void render() throws RenderingException, XSLTException;
 }

Copied: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/RendererFactory.java (from rev 25602, labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/RendererFactory.java)
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/RendererFactory.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/RendererFactory.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,65 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook.render;
+
+import org.jboss.jdocbook.render.format.StandardDocBookFormatDescriptors;
+import org.jboss.jdocbook.render.format.FormatPlan;
+import org.jboss.jdocbook.render.impl.PDFRenderer;
+import org.jboss.jdocbook.render.impl.BasicRenderer;
+import org.jboss.jdocbook.render.impl.XslFoGenerator;
+import org.xml.sax.EntityResolver;
+
+/**
+ * A factory for building {@link Renderer} instances.
+ *
+ * @author Steve Ebersole
+ */
+public class RendererFactory {
+	private final RenderingEnvironment environment;
+
+	public RendererFactory(RenderingEnvironment environment) {
+		this.environment = environment;
+	}
+
+	/**
+	 * Build an appropriate renderer for the given <tt>formatName</tt>
+	 *
+	 * @param formatPlan The format plan
+	 * @param entityResolver The entity resolver to use within the renderer.
+	 *
+	 * @return The renderer.
+	 */
+	public Renderer buildRenderer(FormatPlan formatPlan, EntityResolver entityResolver) {
+		if ( formatPlan.getName().equals( StandardDocBookFormatDescriptors.PDF.getName() ) ) {
+			return new PDFRenderer( environment, entityResolver, formatPlan );
+		}
+		else {
+			return new BasicRenderer( environment, entityResolver, formatPlan );
+		}
+	}
+	
+	public XslFoGenerator buildXslFoGenerator(FormatPlan formatPlan, EntityResolver entityResolver) {
+		return new PDFRenderer( environment, entityResolver, formatPlan ).buildXslFoGenerator();
+	}
+}

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/RenderingEnvironment.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/RenderingEnvironment.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/RenderingEnvironment.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,45 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook.render;
+
+import java.util.List;
+import java.io.File;
+
+import org.jboss.jdocbook.Environment;
+import org.jboss.maven.plugins.jdocbook.Profiling;
+
+/**
+ * Describes the environment for performing DocBook rendering.
+ *
+ * @author Steve Ebersole
+ */
+public interface RenderingEnvironment extends Environment {
+	public List<PublishingSource> getPublishingSources(boolean excludeIngoredTranslations);
+
+	public File getStagingDirectory();
+
+	public File[] getFontDirectories();
+
+	public Profiling getProfilingConfiguration();
+}

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/BasicRenderer.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/BasicRenderer.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/BasicRenderer.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -27,19 +27,24 @@
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.Locale;
 import javax.xml.transform.Result;
 import javax.xml.transform.Source;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.stream.StreamResult;
 
-import org.jboss.jdocbook.Options;
+import org.jboss.jdocbook.Log;
+import org.jboss.jdocbook.render.PublishingSource;
 import org.jboss.jdocbook.render.Renderer;
+import org.jboss.jdocbook.render.RenderingEnvironment;
 import org.jboss.jdocbook.render.RenderingException;
 import org.jboss.jdocbook.render.format.FormatPlan;
 import org.jboss.jdocbook.util.FileUtils;
-import org.jboss.jdocbook.util.ResourceHelper;
+import org.jboss.jdocbook.util.LocaleUtils;
+import org.jboss.jdocbook.util.ConsoleRedirectionHandler;
 import org.jboss.jdocbook.xslt.XSLTException;
+import org.xml.sax.EntityResolver;
 
 /**
  * The basic implementation of the {@link Renderer} contract.
@@ -47,29 +52,63 @@
  * @author Steve Ebersole
  */
 public class BasicRenderer implements Renderer {
-	protected final Options options;
+	protected final RenderingEnvironment environment;
+	protected final EntityResolver entityResolver;
+	protected final FormatPlan formatPlan;
 
+
 	/**
 	 * Construct a renderer instance using the given <tt>options</tt>.
 	 *
-	 * @param options The options.
+	 * @param environment execution environment
+	 * @param entityResolver The entity resolver to use.
+	 * @param formatPlan The formating plan/options
 	 */
-	public BasicRenderer(Options options) {
-		this.options = options;
+	public BasicRenderer(RenderingEnvironment environment, EntityResolver entityResolver, FormatPlan formatPlan) {
+		this.environment = environment;
+		this.entityResolver = entityResolver;
+		this.formatPlan = formatPlan;
 	}
 
-	/**
-	 * {@inheritDoc}
-	 */
-	public File getAttachableBundle(File source) {
-		// todo : we need to figure out how we are going to handle attachments...
-		return null;
+	protected Log getLog() {
+		return environment.log();
 	}
 
+	public void render() throws RenderingException, XSLTException {
+		for ( PublishingSource source : environment.getPublishingSources( true ) ) {
+			final String lang = stringify( source.getLocale() );
+			getLog().trace( "Starting generation " + lang );
+
+			// determine the source file from which to render
+			File sourceFile = environment.getProfilingConfiguration().isEnabled()
+					? source.resolveProfiledDocumentFile()
+					: source.resolveDocumentFile();
+			if ( !sourceFile.exists() ) {
+				getLog().info( "Source document [" + sourceFile.getAbsolutePath() + "] did not exist; skipping" );
+				continue;
+			}
+
+			final File publishingDirectory = source.resolvePublishingDirectory();
+			if ( ! publishingDirectory.exists() ) {
+				boolean created = publishingDirectory.mkdirs();
+				if ( !created ) {
+					getLog().info( "Unable to create publishing directory {}", publishingDirectory.getAbsolutePath() );
+				}
+			}
+
+			getLog().info( "Processing " + lang + " -> " + formatPlan.getName() );
+			render( sourceFile, formatPlan, publishingDirectory, environment.getStagingDirectory(), source );
+		}
+	}
+
+	private String stringify(Locale locale) {
+		return LocaleUtils.render( locale, environment.getOptions().getLocaleSeparator() );
+	}
+
 	/**
 	 * {@inheritDoc}
 	 */
-	public void render(File sourceFile, FormatPlan formatPlan, File renderingDirectory, File stagingDirectory) throws RenderingException, XSLTException {
+	public void render(File sourceFile, FormatPlan formatPlan, File renderingDirectory, File stagingDirectory, PublishingSource source) throws RenderingException, XSLTException {
 		File targetDirectory = new File( renderingDirectory, formatPlan.getName() );
 		if ( ! targetDirectory.exists() ) {
 			FileUtils.mkdir( targetDirectory.getAbsolutePath() );
@@ -102,14 +141,14 @@
 		if ( targetFile.exists() ) {
 			boolean deleted = targetFile.delete();
 			if ( !deleted ) {
-				options.getLog().info( "Unable to delete existing target file " + targetFile.getAbsolutePath() );
+				getLog().info( "Unable to delete existing target file " + targetFile.getAbsolutePath() );
 			}
 		}
 		if ( !targetFile.exists() ) {
 			try {
 				boolean created = targetFile.createNewFile();
 				if ( !created ) {
-					options.getLog().info( "Unable to create target file [{}]", targetFile.getAbsolutePath() );
+					getLog().info( "Unable to create target file [{}]", targetFile.getAbsolutePath() );
 				}
 			}
 			catch ( IOException e ) {
@@ -117,39 +156,58 @@
 			}
 		}
 
-		performRendering( sourceFile, formatPlan, stagingDirectory, targetFile );
+		performRendering( sourceFile, formatPlan, stagingDirectory, targetFile , source );
 	}
 
-	private void performRendering(File sourceFile, FormatPlan formatPlan, File stagingDirectory, File targetFile) {
+	private void performRendering(File sourceFile, FormatPlan formatPlan, File stagingDirectory, File targetFile, PublishingSource source) {
 		Transformer transformer = buildTransformer( targetFile, formatPlan, stagingDirectory );
-		Source transformationSource = buildSource( sourceFile );
-		Result transformationResult = buildResult( targetFile );
+		String lang = LocaleUtils.render( source.getLocale(), environment.getOptions().getLocaleSeparator() );
+		transformer.setParameter( "l10n.gentext.language", lang );
+
+		ConsoleRedirectionHandler console = new ConsoleRedirectionHandler( determineConsoleRedirectFile( source, formatPlan ) );
+		console.start();
+
 		try {
-			// todo redirect stdout to file?  fop is very very verbose here...
-			transformer.transform( transformationSource, transformationResult );
+			Source transformationSource = buildSource( sourceFile );
+			Result transformationResult = buildResult( targetFile );
+
+			try {
+				transformer.transform( transformationSource, transformationResult );
+			}
+			catch ( TransformerException e ) {
+				throw new XSLTException( "error rendering [" + e.getMessageAndLocation() + "] on " + sourceFile.getName(), e );
+			}
+			finally {
+				releaseResult( transformationResult );
+			}
 		}
-		catch ( TransformerException e ) {
-			throw new XSLTException( "error rendering [" + e.getMessageAndLocation() + "] on " + sourceFile.getName(), e );
-		}
 		finally {
-			releaseResult( transformationResult );
+			console.stop();
 		}
 	}
 
+	private File determineConsoleRedirectFile(PublishingSource source, FormatPlan formatPlan) {
+		String fileName = "console-"
+				+ stringify( source.getLocale() ) + "-"
+				+ formatPlan.getName()
+				+ ".log";
+		return new File( new File( environment.getWorkDirectory(), "log" ), fileName );
+	}
+
 	private String deduceTargetFileName(File source, FormatPlan formatPlan) {
 		return formatPlan.getTargetNamingStrategy().determineTargetFileName( source );
 	}
 
 	protected Transformer buildTransformer(File targetFile, FormatPlan formatPlan, File stagingDirectory) throws RenderingException, XSLTException {
-		final URL transformationStylesheet =  ResourceHelper.requireResource( formatPlan.getStylesheetResource() );
-		Transformer transformer = options.getTransformerBuilder().buildTransformer( formatPlan, transformationStylesheet );
+		final URL transformationStylesheet =  environment.getResourceHelper().requireResource( formatPlan.getStylesheetResource() );
+		Transformer transformer = environment.getTransformerBuilder().buildTransformer( formatPlan, transformationStylesheet );
 		if ( formatPlan.isImagePathSettingRequired() ) {
 			try {
-				String imgSrcPath = new File( stagingDirectory, "images" ).toURL().toString();
+				String imgSrcPath = new File( stagingDirectory, "images" ).toURI().toURL().toString();
 				if ( !imgSrcPath.endsWith( "/" ) ) {
 					imgSrcPath += '/';
 				}
-				options.getLog().trace( "setting 'img.src.path' xslt parameter [" + imgSrcPath + "]" );
+				getLog().trace( "setting 'img.src.path' xslt parameter [" + imgSrcPath + "]" );
 				transformer.setParameter( "img.src.path", imgSrcPath );
 			}
 			catch ( MalformedURLException e ) {
@@ -157,7 +215,7 @@
 			}
 		}
 
-		transformer.setParameter( "keep.relative.image.uris", options.isUseRelativeImageUris() ? "1" : "0" );
+		transformer.setParameter( "keep.relative.image.uris", environment.getOptions().isUseRelativeImageUris() ? "1" : "0" );
 		transformer.setParameter( "base.dir", targetFile.getParent() + File.separator );
 		transformer.setParameter( "manifest.in.base.dir", "1" );
 
@@ -169,8 +227,8 @@
 		return transformer;
 	}
 
-	private Source buildSource(File sourceFile) throws RenderingException {
-		return FileUtils.createSAXSource( sourceFile, options.getCatalogResolver(), options.isXincludeSupported() );
+	protected Source buildSource(File sourceFile) throws RenderingException {
+		return FileUtils.createSAXSource( sourceFile, entityResolver, environment.getOptions().isXincludeSupported() );
     }
 
 	protected Result buildResult(File targetFile) throws RenderingException, XSLTException {

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/PDFRenderer.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/PDFRenderer.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/PDFRenderer.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -20,25 +20,18 @@
  * Free Software Foundation, Inc.
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
- *
  */
 package org.jboss.jdocbook.render.impl;
 
-import java.io.BufferedOutputStream;
 import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
 import javax.xml.transform.Result;
-import javax.xml.transform.sax.SAXResult;
 
-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.jboss.jdocbook.Options;
+import org.jboss.jdocbook.render.RenderingEnvironment;
 import org.jboss.jdocbook.render.RenderingException;
+import org.jboss.jdocbook.render.format.FormatPlan;
+import org.jboss.jdocbook.render.impl.fop.ResultImpl;
+import org.jboss.jdocbook.render.impl.fop.XslFoGeneratorImpl;
+import org.xml.sax.EntityResolver;
 
 /**
  * Implementation of the {@link org.jboss.jdocbook.render.Renderer} contract specifically for dealing with PDF generation.
@@ -46,48 +39,20 @@
  * @author Steve Ebersole
  */
 public class PDFRenderer extends BasicRenderer {
-	public PDFRenderer(Options options) {
-		super( options );
+	public PDFRenderer(RenderingEnvironment environment, EntityResolver entityResolver, FormatPlan formatPlan) {
+		super( environment, entityResolver, formatPlan );
 	}
 
 	protected Result buildResult(File targetFile) throws RenderingException {
-		return new ResultImpl( targetFile );
+		return new ResultImpl( targetFile, environment );
 	}
 
 	protected void releaseResult(Result transformationResult) {
 		( ( ResultImpl ) transformationResult ).release();
 	}
 
-	private class ResultImpl extends SAXResult {
-		private OutputStream outputStream;
-
-		public ResultImpl(File targetFile) throws RenderingException {
-			try {
-				FopFactory fopFactory = FopFactory.newInstance();
-
-				outputStream = new BufferedOutputStream( new FileOutputStream( targetFile ) );
-
-				FOUserAgent fopUserAgent = fopFactory.newFOUserAgent();
-				fopUserAgent.setProducer( "jDocBook Plugin for Maven" );
-
-				Fop fop = fopFactory.newFop( MimeConstants.MIME_PDF, fopUserAgent, outputStream );
-				setHandler( fop.getDefaultHandler() );
-			}
-			catch ( Throwable t ) {
-				throw new RenderingException( "error building transformation result [" + targetFile.getAbsolutePath() + "]", t );
-			}
-		}
-
-		private void release() {
-			if ( outputStream == null ) {
-				return;
-			}
-			try {
-				outputStream.flush();
-				outputStream.close();
-			}
-			catch ( IOException ignore ) {
-			}
-		}
+	public XslFoGenerator buildXslFoGenerator() {
+		return new XslFoGeneratorImpl( environment, formatPlan );
 	}
+
 }

Deleted: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/RendererFactory.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/RendererFactory.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/RendererFactory.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -1,56 +0,0 @@
-/*
- * jDocBook, processing of DocBook sources as a Maven plugin
- *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.jboss.jdocbook.render.impl;
-
-import org.jboss.jdocbook.Options;
-import org.jboss.jdocbook.render.format.StandardDocBookFormatDescriptors;
-import org.jboss.jdocbook.render.Renderer;
-
-/**
- * A factory for building {@link Renderer} instances.
- *
- * @author Steve Ebersole
- */
-public class RendererFactory {
-	private final Options options;
-
-	public RendererFactory(Options options) {
-		this.options = options;
-	}
-
-	/**
-	 * Build an appropriate renderer for the given <tt>formatName</tt>
-	 *
-	 * @param formatName The name of the formatting in which we want to perform rendering.
-	 * @return The renderer.
-	 */
-	public Renderer buildRenderer(String formatName) {
-		if ( formatName.equals( StandardDocBookFormatDescriptors.PDF.getName() ) ) {
-			return new PDFRenderer( options );
-		}
-		else {
-			return new BasicRenderer( options );
-		}
-	}
-}

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/XslFoGenerator.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/XslFoGenerator.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/XslFoGenerator.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,36 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook.render.impl;
+
+import org.jboss.jdocbook.xslt.XSLTException;
+import org.jboss.jdocbook.render.RenderingException;
+
+/**
+ * TODO : javadoc
+*
+* @author Steve Ebersole
+*/
+public interface XslFoGenerator {
+	public void generateXslFo() throws RenderingException, XSLTException;
+}

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/FopConfigHelper.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/FopConfigHelper.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/FopConfigHelper.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,272 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook.render.impl.fop;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.io.File;
+import java.io.IOException;
+import java.io.FileOutputStream;
+import java.io.BufferedOutputStream;
+import java.io.FileNotFoundException;
+import java.net.URL;
+import java.net.MalformedURLException;
+
+import org.apache.fop.fonts.FontCache;
+import org.apache.fop.fonts.EmbedFontInfo;
+import org.apache.fop.fonts.FontTriplet;
+import org.apache.fop.fonts.FontResolver;
+import org.apache.fop.fonts.FontSetup;
+import org.apache.fop.fonts.autodetect.FontInfoFinder;
+import org.apache.avalon.framework.configuration.DefaultConfiguration;
+import org.apache.avalon.framework.configuration.ConfigurationUtil;
+import org.jboss.jdocbook.render.RenderingEnvironment;
+import org.jboss.jdocbook.JDocBookProcessException;
+import org.jdom.output.XMLOutputter;
+import org.jdom.output.Format;
+import org.jdom.input.DOMBuilder;
+
+/**
+ * Delegate to help manage building a FOP user-config
+ *
+ * @author Steve Ebersole
+ */
+public class FopConfigHelper {
+	/**
+	 * {@link FontCache} persistent cache file path, relative to jDocBook work directory.
+	 */
+	public static final String FONT_CACHE_FILE = "fop/fop-fonts.cache";
+
+	private static FopConfigHelper INSTANCE;
+
+	public static DefaultConfiguration getFopConfiguration(RenderingEnvironment environment) {
+		if ( INSTANCE == null ) {
+			environment.log().info( "creating FOP user-config DOM" );
+			INSTANCE =  new FopConfigHelper( environment );
+		}
+		return INSTANCE.fopConfiguration;
+	}
+
+	private RenderingEnvironment environment;
+	private DefaultConfiguration fopConfiguration;
+
+	public FopConfigHelper(RenderingEnvironment environment) {
+		this.environment = environment;
+		this.fopConfiguration = buildFopConfiguration();
+	}
+
+	private DefaultConfiguration buildFopConfiguration() {
+		DefaultConfiguration fopUserConfiguration = new DefaultConfiguration( "fop" );
+		fopUserConfiguration.setAttribute( "version", "1.0" );
+
+		DefaultConfiguration strictConfig = new DefaultConfiguration( "strict-configuration" );
+		strictConfig.setValue( true );
+		fopUserConfiguration.addChild( strictConfig );
+
+		DefaultConfiguration renderersConfig = new DefaultConfiguration( "renderers" );
+		fopUserConfiguration.addChild( renderersConfig );
+
+		DefaultConfiguration pdfRendererConfig = new DefaultConfiguration( "renderer" );
+		pdfRendererConfig.setAttribute( "mime", "application/pdf" );
+		renderersConfig.addChild( pdfRendererConfig );
+
+		pdfRendererConfig.addChild( buildFontsConfig() );
+
+		dumpUserConfigToFile( fopUserConfiguration );
+
+		return fopUserConfiguration;
+	}
+
+	@SuppressWarnings({ "unchecked" })
+	private DefaultConfiguration buildFontsConfig() {
+		DefaultConfiguration fontsConfig = new DefaultConfiguration( "fonts" );
+
+// did not work for me :(
+//			if ( environment.getFontDirectories() != null ) {
+//				for ( File fontDirectory : environment.getFontDirectories() ) {
+//					DefaultConfiguration fontDirectoryElement = new DefaultConfiguration( "directory" );
+//					fontDirectoryElement.setValue( fontDirectory.getAbsolutePath() );
+//					fontsConfig.addChild( fontDirectoryElement );
+//				}
+//			}
+
+		// this code is mostly copied from
+		// http://dev.plutext.org/trac/docx4j/browser/trunk/docx4j/src/main/java/org/docx4j/convert/out/pdf/viaXSLFO/Conversion.java
+		//
+		// Thanks to Jason Harrop from the fop-user list (and who wrote that code) for pointing it out
+		for ( EmbedFontInfo embedFontInfo : locateEmbedFontInfos() ) {
+			DefaultConfiguration fontConfig = new DefaultConfiguration( "font" );
+			fontsConfig.addChild( fontConfig );
+			fontConfig.setAttribute( "embed-url", embedFontInfo.getEmbedFile() );
+			if ( embedFontInfo.getSubFontName() != null ) {
+				fontConfig.setAttribute( "sub-font", embedFontInfo.getSubFontName() );
+			}
+
+			FontTriplet triplet = ( FontTriplet ) embedFontInfo.getFontTriplets().get( 0 );
+
+			fontConfig.addChild(
+					generateFontTripletConfig(
+							triplet.getName(),
+							triplet.getStyle(),
+							triplet.getWeight()
+					)
+			);
+			fontConfig.addChild(
+					generateFontTripletConfig(
+							triplet.getName(),
+							"normal",
+							"bold"
+					)
+			);
+			fontConfig.addChild(
+					generateFontTripletConfig(
+							triplet.getName(),
+							"italic",
+							"bold"
+					)
+			);
+			fontConfig.addChild(
+					generateFontTripletConfig(
+							triplet.getName(),
+							"italic",
+							"normal"
+					)
+			);
+		}
+
+		if ( environment.getOptions().isAutoDetectFontsEnabled() ) {
+			DefaultConfiguration autoDetect = new DefaultConfiguration( "auto-detect" );
+			fontsConfig.addChild( autoDetect );
+		}
+
+		return fontsConfig;
+	}
+
+	private List<EmbedFontInfo> locateEmbedFontInfos() {
+		List<EmbedFontInfo> infoList = new ArrayList<EmbedFontInfo>();
+		if ( environment.getFontDirectories() != null ) {
+			FontCache fontCache = environment.getOptions().isUseFopFontCache()
+					? FontCache.loadFrom( new File( getFopWorkDirectory(), "fop-font.cache" ) )
+					: new FontCache();
+			FontResolver fontResolver = FontSetup.createMinimalFontResolver();
+			FontInfoFinder fontInfoFinder = new FontInfoFinder();
+			for ( File fontDirectory : environment.getFontDirectories() ) {
+				for ( File fontFile : fontDirectory.listFiles() ) {
+					EmbedFontInfo[] infos = fontInfoFinder.find( toURL( fontFile ), fontResolver, fontCache );
+					if ( infos == null || infos.length == 0 ) {
+						continue;
+					}
+					for ( EmbedFontInfo info : infos ) {
+						if ( info.getEmbedFile() != null ) {
+							infoList.add( info );
+						}
+					}
+				}
+			}
+		}
+
+		return infoList;
+	}
+
+	private URL toURL(File file) {
+		try {
+			return file.toURI().toURL();
+		}
+		catch ( MalformedURLException ignore ) {
+		}
+		return null;
+	}
+
+	private DefaultConfiguration generateFontTripletConfig(String name, String style, int weight) {
+		return generateFontTripletConfig(
+				name,
+				style,
+				weight >= 700 ? "bold" : "normal"
+		);
+	}
+
+	private DefaultConfiguration generateFontTripletConfig(String name, String style, String weight) {
+		DefaultConfiguration tripletConfig = new DefaultConfiguration( "font-triplet" );
+		tripletConfig.setAttribute( "name", name );
+		tripletConfig.setAttribute( "style", style );
+		tripletConfig.setAttribute( "weight", weight );
+
+		return tripletConfig;
+	}
+
+	private File fopWorkDirectory;
+
+	private File getFopWorkDirectory() {
+		if ( fopWorkDirectory == null ) {
+			final File dir = new File( environment.getWorkDirectory(), "fop" );
+			if ( dir.exists() ) {
+				fopWorkDirectory = dir;
+			}
+			else {
+				boolean created = dir.mkdirs();
+				if ( created ) {
+					fopWorkDirectory = dir;
+				}
+				else {
+					environment.log().info( "Problem creating fop work directory" );
+				}
+			}
+		}
+		return fopWorkDirectory;
+	}
+
+	private void dumpUserConfigToFile(DefaultConfiguration fopUserConfiguration) {
+		File dumpFile = new File( getFopWorkDirectory(), "generated-user-config.xml" );
+
+		if ( ! dumpFile.exists() ) {
+			try {
+				//noinspection ResultOfMethodCallIgnored
+				dumpFile.createNewFile();
+			}
+			catch ( IOException e ) {
+				environment.log().error( "Unable to dump generated FOP user config", e );
+			}
+		}
+
+		try {
+			BufferedOutputStream outputStream = new BufferedOutputStream(
+					new FileOutputStream( dumpFile )
+			);
+
+			XMLOutputter outputter = new XMLOutputter( Format.getCompactFormat().setIndent( "  " ) );
+			outputter.output(
+					new DOMBuilder().build( ConfigurationUtil.toElement( fopUserConfiguration ) ),
+					outputStream
+			);
+		}
+		catch ( FileNotFoundException e ) {
+			// should never ever happen, see checks above..
+			throw new JDocBookProcessException( "unable to open file for writing generated FOP user-config", e );
+		}
+		catch ( IOException e ) {
+			environment.log().info( "Unable to write generated FOP user-config to file", e );
+		}
+
+	}
+}

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/ResultImpl.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/ResultImpl.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/ResultImpl.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,77 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook.render.impl.fop;
+
+import java.io.OutputStream;
+import java.io.File;
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import javax.xml.transform.sax.SAXResult;
+
+import org.jboss.jdocbook.render.RenderingException;
+import org.jboss.jdocbook.render.RenderingEnvironment;
+import org.apache.fop.apps.FopFactory;
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.Fop;
+import org.apache.fop.apps.MimeConstants;
+
+/**
+ * {@link SAXResult} object used to pipe PDF XSLT events through to FOP for PDF generation.
+*
+* @author Steve Ebersole
+*/
+public class ResultImpl extends SAXResult {
+	private OutputStream outputStream;
+
+	public ResultImpl(File targetFile, RenderingEnvironment environment) throws RenderingException {
+		try {
+			outputStream = new BufferedOutputStream( new FileOutputStream( targetFile ) );
+
+			FopFactory fopFactory = FopFactory.newInstance();
+			fopFactory.setUserConfig( FopConfigHelper.getFopConfiguration( environment ) );
+
+			FOUserAgent fopUserAgent = fopFactory.newFOUserAgent();
+			fopUserAgent.setProducer( "jDocBook Plugin for Maven" );
+
+			Fop fop = fopFactory.newFop( MimeConstants.MIME_PDF, fopUserAgent, outputStream );
+			this.setHandler( fop.getDefaultHandler() );
+		}
+		catch ( Throwable t ) {
+			throw new RenderingException( "error building transformation result [" + targetFile.getAbsolutePath() + "]", t );
+		}
+	}
+
+	public void release() {
+		if ( outputStream == null ) {
+			return;
+		}
+		try {
+			outputStream.flush();
+			outputStream.close();
+		}
+		catch ( IOException ignore ) {
+		}
+	}
+}

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/XslFoGeneratorImpl.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/XslFoGeneratorImpl.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/render/impl/fop/XslFoGeneratorImpl.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,145 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook.render.impl.fop;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.FileOutputStream;
+import java.io.FileNotFoundException;
+import java.net.URL;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.Source;
+import javax.xml.transform.Result;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.jboss.jdocbook.render.impl.XslFoGenerator;
+import org.jboss.jdocbook.render.RenderingException;
+import org.jboss.jdocbook.render.PublishingSource;
+import org.jboss.jdocbook.render.RenderingEnvironment;
+import org.jboss.jdocbook.render.format.StandardDocBookFormatDescriptors;
+import org.jboss.jdocbook.render.format.FormatPlan;
+import org.jboss.jdocbook.xslt.XSLTException;
+import org.jboss.jdocbook.util.FileUtils;
+import org.jboss.jdocbook.util.LocaleUtils;
+
+/**
+ * Delegate for creating an intermediate XSL-FO from the docbook source(s).
+ * This plugin uses the more efficient SAX-based PDF generation approach,
+ * so this output format is completely unecessary; however, it is sometimes
+ * very helpful in debugging xml->pdf issues, especially when engaging the FOP
+ * team (they will almost always want to see your FO file).
+ *
+ * @author Steve Ebersole
+ */
+public class XslFoGeneratorImpl implements XslFoGenerator {
+	private final RenderingEnvironment environment;
+	private final FormatPlan formatPlan;
+
+	public XslFoGeneratorImpl(RenderingEnvironment environment, FormatPlan formatPlan) {
+		this.environment = environment;
+		this.formatPlan = formatPlan;
+	}
+
+	public void generateXslFo() throws RenderingException, XSLTException {
+		final Transformer transformer = buildXslFoTransformer();
+
+		for ( PublishingSource source : environment.getPublishingSources( true ) ) {
+			final String sourceFileBasename = FileUtils.basename( source.resolveDocumentFile().getAbsolutePath() );
+			final File fo = new File( source.resolveXslFoDirectory(), sourceFileBasename+".fo" );
+
+			String lang = LocaleUtils.render( source.getLocale(), environment.getOptions().getLocaleSeparator() );
+			transformer.setParameter( "l10n.gentext.language", lang );
+
+			boolean createFile;
+			if ( ! fo.getParentFile().exists() ) {
+				boolean created = fo.getParentFile().mkdirs();
+				if ( ! created ) {
+					throw new RenderingException( "Unable to create FO file directory" );
+				}
+				createFile = true;
+			}
+			else {
+				createFile = ! fo.exists();
+			}
+			if ( createFile ) {
+				try {
+					boolean created = fo.createNewFile();
+					if ( ! created ) {
+						environment.log().info( "Filesystem indicated problem creating FO file {}", fo );
+					}
+				}
+				catch ( IOException e ) {
+					throw new RenderingException( "Unable to create FO file " + fo.toString() );
+				}
+			}
+
+
+			try {
+				final OutputStream out = new FileOutputStream( fo );
+				try {
+					File sourceFile = source.resolveDocumentFile();
+					Source sourceStream = new StreamSource( sourceFile );
+					Result resultStream = new StreamResult( out );
+
+					try {
+						transformer.transform( sourceStream, resultStream );
+					}
+					catch ( TransformerException e ) {
+						throw new RenderingException( "Unable to apply FO transformation", e );
+					}
+				}
+				finally {
+					try {
+						out.close();
+					}
+					catch ( IOException e ) {
+						environment.log().info( "Unable to close output stream {}", fo );
+					}
+				}
+			}
+			catch ( FileNotFoundException e ) {
+				throw new RenderingException( "Unable to open output stream to FO file", e );
+			}
+
+
+		}
+	}
+
+	private Transformer buildXslFoTransformer() {
+		final URL transformationStylesheet;
+		if ( formatPlan.getStylesheetResource() == null ) {
+			transformationStylesheet = environment.getResourceHelper()
+					.requireResource( StandardDocBookFormatDescriptors.PDF.getStylesheetResource() );
+		}
+		else {
+			transformationStylesheet = environment.getResourceHelper()
+					.requireResource( formatPlan.getStylesheetResource() );
+		}
+
+		return environment.getTransformerBuilder().buildTransformer( formatPlan, transformationStylesheet );
+	}
+}

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/ConsoleRedirectionHandler.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/ConsoleRedirectionHandler.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/ConsoleRedirectionHandler.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,96 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook.util;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.FileNotFoundException;
+import java.io.PrintStream;
+
+import org.jboss.jdocbook.JDocBookProcessException;
+
+/**
+ * Handles redirection of <tt>sysout</tt> and <tt>syserr</tt>.  The initial
+ * impl handles redirection specifically to a file.
+ *
+ * @author Steve Ebersole
+ */
+public class ConsoleRedirectionHandler {
+	private final File redirectionFile;
+
+	private PrintStream redirectionStream;
+	private PrintStream sysout;
+	private PrintStream syserr;
+
+	public ConsoleRedirectionHandler(File redirectionFile) {
+		this.redirectionFile = redirectionFile;
+	}
+
+	public void start() {
+		System.out.println( "redirecting output to file [" + redirectionFile.getAbsolutePath() + "]" );
+		if ( !redirectionFile.exists() ) {
+			//noinspection ResultOfMethodCallIgnored
+			redirectionFile.getParentFile().mkdirs();
+			try {
+				//noinspection ResultOfMethodCallIgnored
+				redirectionFile.createNewFile();
+			}
+			catch ( IOException e ) {
+				throw new JDocBookProcessException(
+						"Unable to create console redirection file [" + redirectionFile.getAbsolutePath() + "]",
+						e
+				);
+			}
+		}
+		try {
+			redirectionStream = new PrintStream( new FileOutputStream( redirectionFile ) );
+		}
+		catch ( FileNotFoundException e ) {
+			// should never ever happen, see above...
+			throw new JDocBookProcessException( "Unable to open console redirect file for output", e );
+		}
+
+		sysout = System.out;
+		syserr = System.err;
+		System.setOut( redirectionStream );
+		System.setErr( redirectionStream );
+	}
+
+	public void stop() {
+		System.setOut( sysout );
+		System.setErr( syserr );
+
+		redirectionStream.flush();
+		redirectionStream.close();
+	}
+
+	public PrintStream sysout() {
+		return sysout;
+	}
+
+	public PrintStream syserr() {
+		return syserr;
+	}
+}

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/FileUtils.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/FileUtils.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/FileUtils.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -66,9 +66,13 @@
 	 * @param file The file from which to generate a SAXSource
 	 * @param resolver An entity resolver to apply to the file reader.
 	 * @param xincludeAware Should we handle XIncludes?
+	 *
 	 * @return An appropriate SAXSource
 	 */
-	public static SAXSource createSAXSource(File file, EntityResolver resolver, boolean xincludeAware) {
+	public static SAXSource createSAXSource(
+			File file,
+			EntityResolver resolver,
+			boolean xincludeAware) {
 		try {
         	SAXParserFactory factory = new SAXParserFactoryImpl();
         	factory.setXIncludeAware( xincludeAware  );
@@ -81,7 +85,7 @@
 
 			try {
 				InputSource source = new InputSource( new BufferedInputStream( new FileInputStream( file ) ) );
-				source.setSystemId( file.toURL().toString() );
+				source.setSystemId( file.toURI().toURL().toString() );
 				return new SAXSource( reader, source );
 			}
 			catch ( FileNotFoundException e ) {

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/ResourceHelper.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/ResourceHelper.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/ResourceHelper.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -25,7 +25,11 @@
 
 import java.net.URL;
 import java.net.MalformedURLException;
+import java.net.URLClassLoader;
 
+import org.jboss.jdocbook.Environment;
+import org.jboss.jdocbook.JDocBookProcessException;
+
 /**
  * Simple helpers for locating and handling classpath and file URL resource
  * lookups.
@@ -33,6 +37,39 @@
  * @author Steve Ebersole
  */
 public class ResourceHelper {
+	private final ClassLoader combinedClassLoader;
+
+	public ResourceHelper(Environment environment) {
+		this.combinedClassLoader = new URLClassLoader(
+				extractClasspathUrls( environment ),
+				Thread.currentThread().getContextClassLoader()
+		);
+	}
+
+	private URL[] extractClasspathUrls(Environment environment) {
+		final URL[] styleUrls = environment.getClasspathUriResolverBaseUrls();
+		final URL[] combined;
+
+		if ( environment.getStagingDirectory() != null ) {
+			combined = new URL[ styleUrls.length + 1 ];
+			try {
+				combined[0] = environment.getStagingDirectory().toURI().toURL();
+			}
+			catch ( MalformedURLException e ) {
+				throw new JDocBookProcessException( "Unable to resolve staging dir to URL", e );
+			}
+			System.arraycopy( styleUrls, 0, combined, 1, styleUrls.length );
+		}
+		else {
+			combined = styleUrls;
+		}
+		return combined;
+	}
+
+	public ClassLoader getCombinedClassLoader() {
+		return combinedClassLoader;
+	}
+
 	/**
 	 * Locate said resource, throwing an exception if it could not be found.
 	 *
@@ -40,7 +77,7 @@
 	 * @return The resource's URL.
 	 * @throws IllegalArgumentException If the resource could not be found.
 	 */
-	public static URL requireResource(String name) {
+	public URL requireResource(String name) {
 		URL resource = locateResource( name );
 		if ( resource == null ) {
 			throw new IllegalArgumentException( "could not locate resource [" + name + "]" );
@@ -54,7 +91,7 @@
 	 * @param name The resource name.
 	 * @return The resource's URL.
 	 */
-	public static URL locateResource(String name) {
+	public URL locateResource(String name) {
 		if ( name.startsWith( "classpath:" ) ) {
 			return locateClassPathResource( name.substring( 10 ) );
 		}
@@ -72,18 +109,17 @@
 		}
 	}
 
-	private static URL locateClassPathResource(String name) {
+	private URL locateClassPathResource(String name) {
 		while ( name.startsWith( "/" ) ) {
 			name = name.substring( 1 );
 		}
-		ClassLoader loader = Thread.currentThread().getContextClassLoader();
-		if ( loader == null ) {
-			loader = ResourceHelper.class.getClassLoader();
-		}
-		URL result = loader.getResource( name );
+
+		URL result = combinedClassLoader.getResource( name );
 		if ( result == null ) {
-			result = loader.getResource( "/" + name );
+			result = combinedClassLoader.getResource( "/" + name );
 		}
+
 		return result;
 	}
+
 }
\ No newline at end of file

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/TransformerType.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/TransformerType.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/TransformerType.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -24,7 +24,10 @@
 package org.jboss.jdocbook.util;
 
 import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.TransformerException;
 
+import org.xml.sax.Attributes;
+
 /**
  * Enumeration of supported XSLT transformers.
  *
@@ -74,10 +77,46 @@
 		}
 
 		public SAXTransformerFactory buildSAXTransformerFactory() {
-			return new com.icl.saxon.TransformerFactoryImpl();
+			com.icl.saxon.TransformerFactoryImpl factoryImpl = new com.icl.saxon.TransformerFactoryImpl();
+			factoryImpl.setAttribute( "http://icl.com/saxon/feature/messageEmitterClass", SaxonXslMessageEmitter.class.getName() );
+			return factoryImpl;
 		}
 	}
 
+	public static class SaxonXslMessageEmitter extends com.icl.saxon.output.Emitter {
+		private StringBuffer buffer;
+		public void startDocument() throws TransformerException {
+			if ( buffer != null ) {
+				System.out.println( "Unexpected call sequence on SaxonXslMessageEmitter; discarding [" + buffer.toString() + "]" );
+			}
+			buffer = new StringBuffer();
+		}
+
+		public void endDocument() throws TransformerException {
+			System.out.println( "[STYLESHEET MESSAGE] " + buffer.toString() );
+			buffer.setLength( 0 );
+			buffer = null;
+		}
+
+		public void startElement(int i, Attributes attributes, int[] ints, int i1) throws TransformerException {
+		}
+
+		public void endElement(int i) throws TransformerException {
+		}
+
+		public void characters(char[] chars, int start, int end) throws TransformerException {
+			for ( int i = start; i < end; i++ ) {
+				buffer.append( chars[i] );
+			}
+		}
+
+		public void processingInstruction(String s, String s1) throws TransformerException {
+		}
+
+		public void comment(char[] chars, int i, int i1) throws TransformerException {
+		}
+	}
+
 	public static class XalanTransformerType extends TransformerType {
 		public XalanTransformerType() {
 			super( "xalan" );

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/XIncludeFallbackResolver.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/XIncludeFallbackResolver.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/XIncludeFallbackResolver.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,103 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.jdocbook.util;
+
+import java.io.IOException;
+import java.net.URL;
+import java.net.MalformedURLException;
+import java.net.URLConnection;
+
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * EntityResolver implementation for providing <a href="https://fedorahosted.org/publican/">publican</a> style
+ * fallback resolution of <a href="http://www.w3.org/TR/xinclude/">XIncludes</a> without the content authors having to
+ * manually add the tedious nested <samp>&lt;xi:fallback/&gt;</samp> entries.
+ *
+ * @author Steve Ebersole
+ */
+public class XIncludeFallbackResolver implements EntityResolver {
+	private final EntityResolver mainResolver;
+	private final String baseSourceDirectoryURI;
+	private final String baseFallbackURLPath;
+
+	private final int baseSourceDirectoryURILength;
+
+	public XIncludeFallbackResolver(EntityResolver mainResolver, String baseSourceDirectoryPath, String baseFallbackURLPath) {
+		this.mainResolver = mainResolver;
+
+		this.baseSourceDirectoryURI = "file:" +  cleanupBaseSourceDirectoryPath( baseSourceDirectoryPath );
+		this.baseSourceDirectoryURILength = baseSourceDirectoryURI.length();
+
+		this.baseFallbackURLPath = baseFallbackURLPath.endsWith( "/" )
+				? baseFallbackURLPath
+				: baseFallbackURLPath + "/";
+	}
+
+	private String cleanupBaseSourceDirectoryPath(String path) {
+		if ( ! path.startsWith( "/" ) ) {
+			path = "/" + path;
+		}
+		if ( ! path.endsWith( "/" ) ) {
+			path += "/";
+		}
+		return path;
+	}
+
+	public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
+		InputSource resolvedSource = mainResolver.resolveEntity( publicId, systemId );
+		if ( resolvedSource == null ) {
+			resolvedSource = resolveFallback( publicId, systemId );
+		}
+		return resolvedSource;
+	}
+
+	protected InputSource resolveFallback(String publicId, String systemId) {
+		// Not sure this is necessarily truth, but in my experience XInclude entities come through an EntityResolver
+		// such as this with publicId==null and systemId as some file: protocol URI
+		if ( publicId != null || ( systemId == null || ! systemId.startsWith( baseSourceDirectoryURI ) ) ) {
+			return null;
+		}
+
+		String ref = systemId.substring( baseSourceDirectoryURILength );
+		String possibleFallback = baseFallbackURLPath + ref;
+		try {
+			URL url = new URL( possibleFallback );
+			URLConnection urlConnection = url.openConnection();
+			urlConnection.setDoInput( true );
+			urlConnection.setDoOutput( false );
+			urlConnection.connect();
+
+			return new InputSource( urlConnection.getInputStream() );
+		}
+		catch ( MalformedURLException ignore ) {
+		}
+		catch ( IOException ignore ) {
+		}
+
+		return null;
+	}
+}

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/XIncludeHelper.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/XIncludeHelper.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/util/XIncludeHelper.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -56,26 +56,27 @@
 	 */
 	public static Set<File> locateInclusions(File root) {
 		final Set<File> includes = new TreeSet<File>();
+
+		EntityResolver entityResolver = new EntityResolver() {
+			public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
+				if ( publicId == null && systemId != null && systemId.startsWith( "file:/" ) ) {
+					try {
+						includes.add( new File( new URL( systemId ).getFile() ) );
+					}
+					catch ( MalformedURLException e ) {
+						// should never happen...
+						throw new JDocBookProcessException( "Unable to convert reported XInclude href into URL instance [" + systemId + "]" );
+					}
+				}
+				return null;
+			}
+		};
+
 		try {
 			SAXParserFactory parserFactory = new SAXParserFactoryImpl();
     	    parserFactory.setXIncludeAware( true  );
 
-			EntityResolver resolver = new EntityResolver() {
-				public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
-					if ( publicId == null && systemId != null && systemId.startsWith( "file:/" ) ) {
-						try {
-							includes.add( new File( new URL( systemId ).getFile() ) );
-						}
-						catch ( MalformedURLException e ) {
-							// should never happen...
-							throw new JDocBookProcessException( "Unable to convert reported XInclude href into URL instance [" + systemId + "]" );
-						}
-					}
-					return null;
-				}
-			};
-
-			Source transformationSource = FileUtils.createSAXSource( root, resolver, true );
+			Source transformationSource = FileUtils.createSAXSource( root, entityResolver, true );
 			Result transformationResult = new StreamResult( new NoOpWriter() );
 
 			javax.xml.transform.TransformerFactory transformerFactory = new com.icl.saxon.TransformerFactoryImpl();

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/TransformerBuilder.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/TransformerBuilder.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/TransformerBuilder.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -27,11 +27,13 @@
 import java.net.URL;
 import java.util.Map;
 import java.util.Properties;
+import java.util.HashMap;
 import javax.xml.transform.Source;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerConfigurationException;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.URIResolver;
+import javax.xml.transform.Templates;
 import javax.xml.transform.stream.StreamSource;
 
 import com.icl.saxon.Controller;
@@ -44,6 +46,7 @@
 import org.jboss.jdocbook.xslt.resolve.RelativeJarUriResolver;
 import org.jboss.jdocbook.xslt.resolve.ResolverChain;
 import org.jboss.jdocbook.xslt.resolve.VersionResolver;
+import org.jboss.jdocbook.Environment;
 import org.jboss.jdocbook.Options;
 
 /**
@@ -53,12 +56,20 @@
  * @author Steve Ebersole
  */
 public class TransformerBuilder {
-	private final Options options;
+	private final Environment environment;
 
-	public TransformerBuilder(Options options) {
-		this.options = options;
+	public TransformerBuilder(Environment environment) {
+		this.environment = environment;
 	}
 
+	private Options options() {
+		return environment.getOptions();
+	}
+
+	private ResourceHelper resourceHelper() {
+		return environment.getResourceHelper();
+	}
+
 	public Transformer buildStandardTransformer(URL xslt) {
 		URIResolver uriResolver = buildStandardUriResolver();
 		return buildTransformer( xslt, uriResolver );
@@ -66,41 +77,52 @@
 
 	public Transformer buildStandardTransformer(String xsltResource) {
 		URIResolver uriResolver = buildStandardUriResolver();
-		return buildTransformer( ResourceHelper.requireResource( xsltResource ), uriResolver );
+		return buildTransformer( resourceHelper().requireResource( xsltResource ), uriResolver );
 	}
 
 	public Transformer buildTransformer(FormatPlan formatPlan, URL customStylesheet) throws XSLTException {
 		URIResolver uriResolver = buildUriResolver( formatPlan );
 		URL xsltStylesheet = customStylesheet == null
-				? ResourceHelper.requireResource( formatPlan.getStylesheetResource() )
+				? resourceHelper().requireResource( formatPlan.getStylesheetResource() )
 				: customStylesheet;
 		return buildTransformer( xsltStylesheet, uriResolver );
 	}
 
+	private HashMap<String, Templates> transformerTemplatesCache = new HashMap<String, Templates>();
+
 	protected Transformer buildTransformer(URL xslt, URIResolver uriResolver) throws XSLTException {
-		javax.xml.transform.TransformerFactory transformerFactory = options.resolveXmlTransformerType().getSAXTransformerFactory();
+		javax.xml.transform.TransformerFactory transformerFactory = options().resolveXmlTransformerType().getSAXTransformerFactory();
 		transformerFactory.setURIResolver( uriResolver );
 
+		final String xsltUrlStr = xslt.toExternalForm();
+
 		Transformer transformer;
 		try {
-			Source source = new StreamSource( xslt.openStream(), xslt.toExternalForm() );
-			transformer = transformerFactory.newTransformer( source );
+			Templates transformerTemplates = transformerTemplatesCache.get( xsltUrlStr );
+			if ( transformerTemplates == null ) {
+				Source source = new StreamSource( xslt.openStream(), xsltUrlStr );
+				transformerTemplates = transformerFactory.newTemplates( source );
+				transformerTemplatesCache.put( xsltUrlStr, transformerTemplates );
+			}
+			transformer = transformerTemplates.newTransformer();
+//			Source source = new StreamSource( xslt.openStream(), xsltUrlStr );
+//			transformer = transformerFactory.newTransformer( source );
 		}
 		catch ( IOException e ) {
-			throw new XSLTException( "problem opening stylesheet", e );
+			throw new XSLTException( "problem opening stylesheet [" + xsltUrlStr + "]", e );
 		}
 		catch ( TransformerConfigurationException e ) {
 			throw new XSLTException( "unable to build transformer [" + e.getLocationAsString() + "] : " + e.getMessage(), e );
 		}
 
-		configureTransformer( transformer, uriResolver, options.getTransformerParameters() );
+		configureTransformer( transformer, uriResolver, options().getTransformerParameters() );
 
 		return transformer;
 
 	}
 
 	public void configureTransformer(Transformer transformer, FormatPlan formatPlan) {
-		configureTransformer( transformer, buildUriResolver( formatPlan ), options.getTransformerParameters() );
+		configureTransformer( transformer, buildUriResolver( formatPlan ), options().getTransformerParameters() );
 	}
 
 	public static void configureTransformer(Transformer transformer, URIResolver uriResolver, Properties transformerParameters) {
@@ -138,18 +160,18 @@
 	}
 
 	public ResolverChain buildUriResolver(String formatName, String docBookstyleSheet) throws XSLTException {
-		ResolverChain resolverChain = new ResolverChain( new ExplicitUrnResolver( formatName, docBookstyleSheet ) );
+		ResolverChain resolverChain = new ResolverChain( new ExplicitUrnResolver( environment, formatName, docBookstyleSheet ) );
 		applyStandardResolvers( resolverChain );
 		return resolverChain;
 	}
 
 	private void applyStandardResolvers(ResolverChain resolverChain) {
-		resolverChain.addResolver( new CurrentVersionResolver() );
-		if ( options.getDocbookVersion() != null ) {
-			resolverChain.addResolver( new VersionResolver( options.getDocbookVersion() ) );
+		resolverChain.addResolver( new CurrentVersionResolver( environment ) );
+		if ( options().getDocbookVersion() != null ) {
+			resolverChain.addResolver( new VersionResolver( environment, options().getDocbookVersion() ) );
 		}
 		resolverChain.addResolver( new RelativeJarUriResolver() );
-		resolverChain.addResolver( new ClasspathResolver() );
-		resolverChain.addResolver( options.getCatalogResolver() );
+		resolverChain.addResolver( new ClasspathResolver( resourceHelper().getCombinedClassLoader() ) );
+		resolverChain.addResolver( environment.getCatalogResolver() );
 	}
 }
\ No newline at end of file

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/BasicUrnResolver.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/BasicUrnResolver.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/BasicUrnResolver.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -27,6 +27,8 @@
 import javax.xml.transform.Source;
 import javax.xml.transform.TransformerException;
 
+import org.jboss.jdocbook.Environment;
+
 /**
  * Basic support for URIResolvers which map a URN unto a single replacement
  * {@link javax.xml.transform.Source}.
@@ -34,6 +36,7 @@
  * @author Steve Ebersole
  */
 public class BasicUrnResolver implements URIResolver {
+	private final Environment environment;
 	private final String urn;
 	private final Source source;
 
@@ -41,10 +44,12 @@
 	 * Constructs a {@link URIResolver} which maps occurences of the given <tt>urn</tt> onto the given
 	 * <tt>source</tt>
 	 *
+	 * @param environment The execution environment
 	 * @param urn The urn to be replaced.
 	 * @param source The value to return instead of the urn.
 	 */
-	public BasicUrnResolver(String urn, Source source) {
+	public BasicUrnResolver(Environment environment, String urn, Source source) {
+		this.environment = environment;
 		this.urn = urn;
 		this.source = source;
 	}
@@ -62,4 +67,8 @@
 	public String toString() {
 		return super.toString() + " [URN:" + urn + "]";
 	}
+
+	protected Environment getEnvironment() {
+		return environment;
+	}
 }
\ No newline at end of file

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/ClasspathResolver.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/ClasspathResolver.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/ClasspathResolver.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -34,34 +34,42 @@
 /**
  * 
  * Resolves classpath references from the given classloader using classpath:/
- * as the protocol handler
+ * as the protocol scheme
  * 
  * @author Pete Muir
+ * @author Steve Ebersole
  */
 public class ClasspathResolver implements URIResolver {
+	public static final String SCHEME = "classpath:";
+
 	private final ClassLoader classLoader;
 	
 	public ClasspathResolver(ClassLoader classLoader) {
 		this.classLoader = classLoader;
 	}
 
-	public ClasspathResolver() {
-		this( Thread.currentThread().getContextClassLoader() );
-	}
-
 	public Source resolve(String href, String base) throws TransformerException {
 		// href would need to start with classpath:
-		if ( !href.startsWith( "classpath:" ) ) {
+		if ( !href.startsWith( SCHEME ) ) {
 			return null;
 		}
 		
 		try {
-			URL url = classLoader.getResource( href.substring(10) );
-			return new StreamSource( url.openStream(), url.toExternalForm() );
+			String urlStr = href.substring( SCHEME.length() );
+			URL url = classLoader.getResource( urlStr );
+
+			if ( url == null && urlStr.startsWith( "/" ) ) {
+				url = classLoader.getResource( urlStr.substring( 1 ) );
+			}
+
+			if ( url != null ) {
+				return new StreamSource( url.openStream(), url.toExternalForm() );
+			}
 		}
-		catch ( Throwable t ) {
-			return null;
+		catch ( Throwable ignore ) {
 		}
+
+		throw new TransformerException( "Unable to resolve requested classpath URL [" + href + "]" );
 	}
 
 }

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/CurrentVersionResolver.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/CurrentVersionResolver.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/CurrentVersionResolver.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -23,6 +23,8 @@
  */
 package org.jboss.jdocbook.xslt.resolve;
 
+import org.jboss.jdocbook.Environment;
+
 /**
  * Map hrefs starting with <tt>http://docbook.sourceforge.net/release/xsl/current/</tt>
  * to classpath resource lookups.
@@ -32,8 +34,10 @@
 public class CurrentVersionResolver extends VersionResolver {
 	/**
 	 * Constructs a new CurrentVersionResolver instance.
+	 *
+	 * @param environment The execution environment
 	 */
-	public CurrentVersionResolver() {
-		super( "current" );
+	public CurrentVersionResolver(Environment environment) {
+		super( environment, "current" );
 	}
 }
\ No newline at end of file

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/ExplicitUrnResolver.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/ExplicitUrnResolver.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/ExplicitUrnResolver.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -29,7 +29,7 @@
 import javax.xml.transform.stream.StreamSource;
 
 import org.jboss.jdocbook.xslt.XSLTException;
-import org.jboss.jdocbook.util.ResourceHelper;
+import org.jboss.jdocbook.Environment;
 
 
 /**
@@ -41,13 +41,13 @@
 public class ExplicitUrnResolver extends BasicUrnResolver {
 	private final String name;
 
-	public ExplicitUrnResolver(String name, String stylesheetResource) throws XSLTException {
-		super( "urn:docbook:stylesheet", createSource( name, stylesheetResource ) );
+	public ExplicitUrnResolver(Environment environment, String name, String stylesheetResource) throws XSLTException {
+		super( environment, "urn:docbook:stylesheet", createSource( environment, name, stylesheetResource ) );
 		this.name = name;
 	}
 
-	private static Source createSource(String name, String stylesheetResource) throws XSLTException {
-		URL stylesheet = ResourceHelper.requireResource( stylesheetResource );
+	private static Source createSource(Environment environment, String name, String stylesheetResource) throws XSLTException {
+		URL stylesheet = environment.getResourceHelper().requireResource( stylesheetResource );
 		try {
 			return new StreamSource( stylesheet.openStream(), stylesheet.toExternalForm() );
 		}

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/VersionResolver.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/VersionResolver.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/jdocbook/xslt/resolve/VersionResolver.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -30,7 +30,7 @@
 import javax.xml.transform.URIResolver;
 import javax.xml.transform.stream.StreamSource;
 
-import org.jboss.jdocbook.util.ResourceHelper;
+import org.jboss.jdocbook.Environment;
 
 /**
  * Maps docbook-version based URIs to local classpath lookups.  These URIs are in the form
@@ -41,15 +41,18 @@
 public class VersionResolver implements URIResolver {
 	public static final String BASE_HREF = "http://docbook.sourceforge.net/release/xsl/";
 
+	private Environment environment;
 	private final String version;
 	private final String versionHref;
 
 	/**
 	 * Constructs a VersionResolver instance using the given <tt>version</tt>.
 	 *
+	 * @param environment The execution environment
 	 * @param version The version.
 	 */
-	public VersionResolver(String version) {
+	public VersionResolver(Environment environment, String version) {
+		this.environment = environment;
 		this.version = version;
 		this.versionHref = BASE_HREF + version;
 	}
@@ -70,7 +73,7 @@
 	private Source resolve(String href) {
 		String resource = href.substring( versionHref.length() );
 		try {
-			URL resourceURL = ResourceHelper.requireResource( resource );
+			URL resourceURL = environment.getResourceHelper().requireResource( resource );
 			return new StreamSource( resourceURL.openStream(), resourceURL.toExternalForm() );
 		}
 		catch ( IllegalArgumentException e ) {

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/AbstractDocBookMojo.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/AbstractDocBookMojo.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/AbstractDocBookMojo.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -21,35 +21,58 @@
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
  */
-
 package org.jboss.maven.plugins.jdocbook;
 
 import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.text.MessageFormat;
 import java.util.ArrayList;
-import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.AbstractArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
+import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Resource;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectHelper;
-import org.apache.maven.execution.MavenSession;
+import org.apache.maven.settings.Proxy;
 import org.apache.maven.settings.Settings;
-import org.apache.maven.settings.Proxy;
+import org.apache.maven.shared.dependency.tree.DependencyNode;
+import org.apache.maven.shared.dependency.tree.DependencyTreeResolutionListener;
+import org.apache.xml.resolver.CatalogManager;
+import org.apache.xml.resolver.tools.CatalogResolver;
 import org.codehaus.plexus.archiver.manager.ArchiverManager;
 import org.jboss.jdocbook.JDocBookProcessException;
 import org.jboss.jdocbook.Log;
+import org.jboss.jdocbook.i18n.Factory;
+import org.jboss.jdocbook.i18n.I18nEnvironment;
+import org.jboss.jdocbook.i18n.I18nSource;
+import org.jboss.jdocbook.i18n.MasterTranslationDescriptor;
+import org.jboss.jdocbook.render.PublishingSource;
+import org.jboss.jdocbook.render.RenderingEnvironment;
 import org.jboss.jdocbook.render.RenderingException;
 import org.jboss.jdocbook.render.format.FormatPlan;
+import org.jboss.jdocbook.render.format.StandardDocBookFormatDescriptor;
 import org.jboss.jdocbook.render.format.StandardDocBookFormatDescriptors;
 import org.jboss.jdocbook.util.LocaleUtils;
+import org.jboss.jdocbook.util.ResourceHelper;
+import org.jboss.jdocbook.xslt.TransformerBuilder;
 import org.jboss.jdocbook.xslt.XSLTException;
+import org.jboss.jdocbook.xslt.catalog.ExplicitCatalogManager;
+import org.jboss.jdocbook.xslt.catalog.ImplicitCatalogManager;
+import org.jboss.maven.util.logging.PlexusToMavenPluginLoggingBridge;
 
 /**
  * Basic support for the various DocBook mojos in this packaging plugin.
@@ -57,7 +80,7 @@
  * 
  * @author Steve Ebersole
  */
-public abstract class AbstractDocBookMojo extends AbstractMojo {
+public abstract class AbstractDocBookMojo extends AbstractMojo implements RenderingEnvironment, I18nEnvironment {
 	public static final String PLUGIN_NAME = "jdocbook";
 
 	/**
@@ -70,6 +93,16 @@
     protected MavenProject project;
 
 	/**
+	 * INTERNAL : The artifacts associated to the dependencies defined as part
+	 * of our configuration within the project to which we are being attached.
+	 *
+	 * @parameter expression="${plugin.artifacts}"
+     * @required
+     * @readonly
+	 */
+	protected List pluginArtifacts;
+
+	/**
 	 * INTERNAL : The representation of the maven execution.
 	 *
      * @parameter expression="${session}"
@@ -87,27 +120,34 @@
      */
     protected Settings settings;
 
-	/**
-	 * INTERNAL : The artifacts associated with the dependencies defined as part
-	 * of the project to which we are being attached.
-	 *
-	 * @parameter expression="${project.artifacts}"
+    /**
+     * INTERNAL : The artifact repository to use.
+     *
+     * @parameter expression="${localRepository}"
      * @required
      * @readonly
-	 */
-	protected Set projectArtifacts;
+     */
+    protected ArtifactRepository localRepository;
 
-	/**
-	 * INTERNAL : The artifacts associated to the dependencies defined as part
-	 * of our configuration within the project to which we are being attached.
-	 *
-	 * @parameter expression="${plugin.artifacts}"
+    /**
+     * INTERNAL : The artifact metadata source to use.
+     *
+     * @component
      * @required
      * @readonly
-	 */
-	protected List pluginArtifacts;
+     */
+    protected ArtifactMetadataSource artifactMetadataSource;
 
     /**
+     * INTERNAL : The artifact collector to use.
+     *
+     * @component
+     * @required
+     * @readonly
+     */
+    protected ArtifactCollector artifactCollector;
+
+    /**
      * INTERNAL : used to get reference to environemtn Archiver/UnArchiver.
      *
      * @parameter expression="${component.org.codehaus.plexus.archiver.manager.ArchiverManager}"
@@ -117,13 +157,13 @@
     protected ArchiverManager archiverManager;
 
 	/**
-	 * INTERNAL : used during packaging to attach produced artifacts
+	 * INTERNAL : Artifact resolver, needed to download dependencies
 	 *
-	 * @parameter expression="${component.org.apache.maven.project.MavenProjectHelper}"
-     * @required
-     * @readonly
-     */
-    protected MavenProjectHelper projectHelper;
+	 * @component role="org.apache.maven.artifact.resolver.ArtifactResolver"
+	 * @required
+	 * @readonly
+	 */
+	protected ArtifactResolver artifactResolver;
 
 	/**
 	 * The name of the document (relative to sourceDirectory) which is the
@@ -205,6 +245,13 @@
 	protected boolean attach = true;
 
 	/**
+	 * Profiling configuration
+	 *
+	 * @parameter
+	 */
+	protected Profiling profiling = new Profiling();
+
+	/**
 	 * Configurable options
 	 *
      * @parameter
@@ -231,22 +278,6 @@
 	protected String masterTranslation;
 
 	/**
-	 * The path (relative to the sourceDirectory) to the directory containing the master sources.  By default the
-	 * master-translation's locale (en-US) will be used if such a directory exists <b>if translations are specified</b>.
-	 * Users can explicitly specify such a relative path here.
-	 *
-	 * @parameter default-value=""
-	 */
-	protected String relativeMasterTranslationPath;
-
-	/**
-	 * The directory for POT translations files.
-	 *
-	 * @parameter expression="${basedir}/src/main/docbook/pot"
-	 */
-	protected File potDirectory;
-
-	/**
 	 * The locales of all non-master translations.
 	 *
 	 * @parameter
@@ -264,23 +295,28 @@
 
 	private File resolvedMasterSourceDirectory;
 
-	protected boolean excludeIngoredTranslationsFromPublishSources() {
-		return false;
+	protected final Factory i18nProcesserFactory = new Factory( this );
+
+	public Factory getI18nProcesserFactory() {
+		return i18nProcesserFactory;
 	}
 
-	protected boolean excludeIngoredTranslationsFromI18nSources() {
-		return false;
+	protected final MavenLogBridge loggingBridge = new MavenLogBridge();
+
+	private FormatPlan[] formatPlans;
+
+	public FormatPlan[] getFormatPlans() {
+		return formatPlans;
 	}
 
 	/**
 	 * The override method to perform the actual processing of the
 	 * mojo.
-	 * 
-	 * @param formatPlans The format plans
+	 *
 	 * @throws RenderingException Indicates problem performing rendering
 	 * @throws XSLTException Indicates problem building or executing XSLT transformer
 	 */
-	protected void process(FormatPlan[] formatPlans) throws JDocBookProcessException {
+	protected void process() throws JDocBookProcessException {
 	}
 
 	private void doExecuteWithProxy(Proxy proxy) throws JDocBookProcessException {
@@ -332,15 +368,16 @@
 	}
 
 	protected void doExecute() throws JDocBookProcessException {
-		process( determineFormatPlans() );
+		process();
 	}
 
 	public final void execute() throws MojoExecutionException, MojoFailureException {
 		if ( options == null ) {
 			options = new Options();
 		}
-		options.setLog( new MavenLogBridge() );
 
+		formatPlans = determineFormatPlans();
+
 		if ( translationBaseDirectory == null ) {
 			translationBaseDirectory = sourceDirectory;
 		}
@@ -349,18 +386,9 @@
 			translations = new String[0];
 		}
 
-
-		if ( relativeMasterTranslationPath == null || "".equals( relativeMasterTranslationPath ) ) {
-			// see if we have a directory named according to the master translation within the sourceDorectory...
-			File test = new File( sourceDirectory, masterTranslation );
-			if ( test.exists() ) {
-				relativeMasterTranslationPath = masterTranslation;
-			}
-		}
-
 		resolvedMasterSourceDirectory = sourceDirectory;
-		if ( relativeMasterTranslationPath != null && !"".equals( relativeMasterTranslationPath ) ) {
-			resolvedMasterSourceDirectory = new File( resolvedMasterSourceDirectory, relativeMasterTranslationPath );
+		if ( masterTranslation != null && !"".equals( masterTranslation ) ) {
+			resolvedMasterSourceDirectory = new File( resolvedMasterSourceDirectory, masterTranslation );
 		}
 
 		try {
@@ -377,12 +405,40 @@
 		catch ( RenderingException e ) {
 			throw new MojoExecutionException( "Rendering problem", e );
 		}
+		catch ( JDocBookProcessException e ) {
+			throw new MojoExecutionException( "Unexpected problem", e );
+		}
 	}
 
 	private FormatPlan[] determineFormatPlans() {
+		final String requestedFormat = getRequestedFormat();
+		return requestedFormat != null ? resolveRestrictedFormatPlans( requestedFormat ) : resolveUnrestrictedFormatPlans();
+	}
+
+	private FormatPlan[] resolveRestrictedFormatPlans(String requestedFormat) {
+		FormatPlan[] plans = new FormatPlan[1];
+		for ( Format format : formats ) {
+			if ( requestedFormat.equals( format.getFormatName() ) ) {
+				plans[0] = buildFormatPlan( format );
+			}
+		}
+		if ( plans[0] == null ) {
+			plans = new FormatPlan[0];
+		}
+		return plans;
+	}
+
+	private FormatPlan buildFormatPlan(Format format) {
+		return new FormatPlan(
+				format,
+				StandardDocBookFormatDescriptors.getDescriptor( format.getFormatName() )
+		);
+	}
+
+	private FormatPlan[] resolveUnrestrictedFormatPlans() {
 		FormatPlan[] plans = new FormatPlan[ formats.length ];
 		for ( int i = 0; i < formats.length; i++ ) {
-			plans[i] = new FormatPlan( formats[i], StandardDocBookFormatDescriptors.getDescriptor( formats[i].getFormatName() ) );
+			plans[i] = buildFormatPlan( formats[i] );
 		}
 		return plans;
 	}
@@ -390,7 +446,7 @@
 	protected String getRequestedFormat() {
 		String requestedFormat = session.getExecutionProperties().getProperty( "jdocbook.format" );
 		if ( requestedFormat != null ) {
-			getLog().info( "requested processing limited to [" + requestedFormat + "] format" );
+			getLog().debug( "requested processing limited to [" + requestedFormat + "] format" );
 		}
 		return requestedFormat;
 	}
@@ -399,22 +455,151 @@
 		String requestedLocaleStr = session.getExecutionProperties().getProperty( "jdocbook.lang" );
 		Locale requestedLocale = requestedLocaleStr == null ? null : parseLocale( requestedLocaleStr );
 		if ( requestedLocale != null ) {
-			getLog().info( "requested processing limited to [" + stringify( requestedLocale ) + "] lang" ) ;
+			getLog().debug( "requested processing limited to [" + stringify( requestedLocale ) + "] lang" ) ;
 		}
 		return requestedLocale;
 	}
 
-	protected MasterTranslationDescriptor getMasterTranslationDescriptor() {
-		return new MasterTranslationDescriptor( parseLocale( masterTranslation ) );
+	public Log log() {
+		return loggingBridge;
 	}
 
-	protected List<PublishingSource> getPublishingSources() {
-		ArrayList<PublishingSource> descriptors = new ArrayList<PublishingSource>();
-		descriptors.add( getMasterTranslationDescriptor() );
+	public Options getOptions() {
+		return options;
+	}
 
+	private TransformerBuilder transformerBuilder;
+
+	public TransformerBuilder getTransformerBuilder() {
+		if ( transformerBuilder == null ) {
+			transformerBuilder = new TransformerBuilder( this );
+		}
+		return transformerBuilder;
+	}
+
+	private CatalogResolver catalogResolver;
+
+	public CatalogResolver getCatalogResolver() {
+		if ( catalogResolver == null ) {
+			CatalogManager catalogManager;
+			if ( options.getCatalogs() == null || options.getCatalogs().length == 0 ) {
+				catalogManager = new ImplicitCatalogManager();
+			}
+			else {
+				catalogManager = new ExplicitCatalogManager( options.getCatalogs() );
+			}
+			catalogResolver = new CatalogResolver( catalogManager );
+		}
+		return catalogResolver;
+	}
+
+	private URL[] styleArtifactUrls;
+
+	@SuppressWarnings({ "unchecked" })
+	public URL[] getClasspathUriResolverBaseUrls() {
+		if ( styleArtifactUrls == null ) {
+			// Three sources for resolver base urls:
+			List<URL> urlList = new ArrayList<URL>();
+			// 		1) staging dir
+			if ( getStagingDirectory() != null ) {
+				try {
+					urlList.add( getStagingDirectory().toURI().toURL() );
+				}
+				catch ( MalformedURLException e ) {
+					getLog().warn( "Uanble to convert staging directory to url" );
+				}
+			}
+			//		2) project dependencies
+			for ( Artifact artifact : (Set<Artifact>) project.getArtifacts() ) {
+				if ( artifact.getFile() != null ) {
+					try {
+						urlList.add( artifact.getFile().toURI().toURL() );
+					}
+					catch ( MalformedURLException e ) {
+						getLog().warn( "Uanble to retrieve artifact url [" + artifact.getId() + "]" );
+					}
+				}
+			}
+			//		3) plugin dependencies (this should be plugin *injected* dependencies)
+			if ( pluginArtifacts != null ) {
+				for ( Artifact artifact : (List<Artifact>) pluginArtifacts ) {
+					if ( artifact.getFile() != null ) {
+						try {
+							urlList.add( artifact.getFile().toURI().toURL() );
+						}
+						catch ( MalformedURLException e ) {
+							getLog().warn( "Uanble to retrieve artifact url [" + artifact.getId() + "]" );
+						}
+					}
+				}
+			}
+			styleArtifactUrls = urlList.toArray( new URL[ urlList.size() ] );
+		}
+		return styleArtifactUrls;
+	}
+
+	private ResourceHelper resourceHelper;
+
+	public ResourceHelper getResourceHelper() {
+		if ( resourceHelper == null ) {
+			resourceHelper = new ResourceHelper( this );
+		}
+		return resourceHelper;
+	}
+
+	public FormatPlan getFormatPlan(StandardDocBookFormatDescriptor format) {
+		for ( FormatPlan plan : formatPlans ) {
+			if ( plan.getName().equals( format.getName() ) ) {
+				return plan;
+			}
+		}
+		return null;
+	}
+
+	public File getStagingDirectory() {
+		return stagingDirectory;
+	}
+
+	public File getWorkDirectory() {
+		return workDirectory;
+	}
+
+	public File[] getFontDirectories() {
+		List<File> directories = new ArrayList<File>();
+
+		if ( fontsDirectory != null && fontsDirectory.exists() ) {
+			directories.add( fontsDirectory );
+		}
+
+		File stagedFontsDirectory = new File( getStagingDirectory(), "fonts" );
+		if ( stagedFontsDirectory.exists() ) {
+			directories.add( stagedFontsDirectory );
+		}
+
+		return directories.toArray( new File[ directories.size() ] );
+	}
+
+	public Profiling getProfilingConfiguration() {
+		return profiling;
+	}
+
+	public File getFontStagingDirectory() {
+		return new File( getStagingDirectory(), "fonts" );
+	}
+
+	public List<PublishingSource> getPublishingSources(boolean excludeIngoredTranslations) {
 		Locale requestedLocale = getRequestedLocale();
-		boolean skipAllTranslations = ignoreTranslations && excludeIngoredTranslationsFromPublishSources();
+		boolean requestedLocaleIsTranslation = requestedLocale != null
+				&& ! stringify( requestedLocale ).equals( masterTranslation );
+		boolean skipAllTranslations = ignoreTranslations && excludeIngoredTranslations
+				&& !requestedLocaleIsTranslation;
 
+		ArrayList<PublishingSource> descriptors = new ArrayList<PublishingSource>();
+		MasterTranslationDescriptorImpl masterTranslationImpl = new MasterTranslationDescriptorImpl();
+		if ( requestedLocale == null || requestedLocale.equals( masterTranslationImpl.getLocale() ) ) {
+			descriptors.add( new MasterTranslationDescriptorImpl() );
+		}
+
 		if ( skipAllTranslations ) {
 			getLog().info( "Skipping all translations" );
 		}
@@ -423,24 +608,33 @@
 				final Locale locale = parseLocale( localeStr );
 				final boolean skipThisLocale = requestedLocale != null
 						&& !requestedLocale.equals( locale )
-						&& excludeIngoredTranslationsFromPublishSources();
+						&& excludeIngoredTranslations;
 				if ( skipThisLocale ) {
-					getLog().info( "skipping non-requested lang [" + localeStr + "]" );
+					getLog().debug( "skipping non-requested lang [" + localeStr + "]" );
 					continue;
 				}
-				descriptors.add( new TranslationDescriptor( locale ) );
+				descriptors.add( new OtherTranslationDescriptorImpl( locale ) );
 			}
 		}
 
 		return descriptors;
 	}
 
-	protected List<I18nSource> getI18nSources() {
+	public MasterTranslationDescriptor getMasterTranslationDescriptor() {
+		return new MasterTranslationDescriptorImpl();
+	}
+
+	public List<I18nSource> getI18nSources(boolean excludeIngoredTranslations) {
 		ArrayList<I18nSource> descriptors = new ArrayList<I18nSource>();
 
 		Locale requestedLocale = getRequestedLocale();
-		boolean skipAllTranslations = ignoreTranslations && excludeIngoredTranslationsFromI18nSources();
+		boolean requestedLocaleIsTranslation = requestedLocale != null
+				&& ! stringify( requestedLocale ).equals( masterTranslation );
 
+		boolean skipAllTranslations = ignoreTranslations
+				&& excludeIngoredTranslations
+				&& !requestedLocaleIsTranslation;
+
 		if ( skipAllTranslations ) {
 			getLog().info( "Skipping all translations" );
 		}
@@ -449,65 +643,60 @@
 				final Locale locale = parseLocale( localeStr );
 				final boolean skipThisLocale = requestedLocale != null
 						&& !requestedLocale.equals( locale )
-						&& excludeIngoredTranslationsFromPublishSources();
+						&& excludeIngoredTranslations;
 				if ( skipThisLocale ) {
-					getLog().info( "skipping non-requested lang [" + localeStr + "]" );
+					getLog().debug( "skipping non-requested lang [" + localeStr + "]" );
 					continue;
 				}
-				descriptors.add( new TranslationDescriptor( locale ) );
+				descriptors.add( new OtherTranslationDescriptorImpl( locale ) );
 			}
 		}
 
 		return descriptors;
 	}
 
-	protected static interface ArtifactProcessor {
-		public void process(Artifact artifact);
-	}
+	private class MasterTranslationDescriptorImpl implements PublishingSource, MasterTranslationDescriptor {
+		public Locale getLocale() {
+			return LocaleUtils.parse( masterTranslation, options.getLocaleSeparator() );
+		}
 
-	protected void processArtifacts(ArtifactProcessor processor) {
-		processProjectArtifacts( processor );
-		processPluginArtifacts( processor );
-	}
+		public File resolveMasterDocument() {
+			return new File( resolvedMasterSourceDirectory, sourceDocumentName );
+		}
 
-	protected void processProjectArtifacts(ArtifactProcessor processor) {
-		processArtifacts( processor, projectArtifacts );
-	}
+		public File resolvePotDirectory() {
+			return new File( translationBaseDirectory, "pot" );
+		}
 
-	protected void processPluginArtifacts(ArtifactProcessor processor) {
-		processArtifacts( processor, pluginArtifacts );
-	}
+		public FormatPlan[] getFormatPlans() {
+			return formatPlans;
+		}
 
-	private void processArtifacts(ArtifactProcessor processor, Collection artifacts) {
-		for ( Object artifact : artifacts ) {
-			processor.process( ( Artifact ) artifact );
+		public File resolveDocumentFile() {
+			return resolveMasterDocument();
 		}
-	}
 
-	protected Locale parseLocale(String locale) {
-		return LocaleUtils.parse( locale, options.getLocaleSeparator() );
-	}
+		public File resolvePublishingDirectory() {
+			return determinePublishingDirectory( masterTranslation );
+		}
 
-	protected String stringify(Locale locale) {
-		return LocaleUtils.render( locale, options.getLocaleSeparator() );
-	}
+		public File resolveXslFoDirectory() {
+			return determineXslFoDirectory( masterTranslation );
+		}
 
-	protected static interface PublishingSource {
-		public Locale getLocale();
-		public File resolveDocumentFile();
-		public File resolvePublishingDirectory();
-	}
+		public File resolveProfilingDirectory() {
+			return determineProfilingDirectory( masterTranslation );
+		}
 
-	protected static interface I18nSource {
-		public Locale getLocale();
-		public File resolvePoDirectory();
-		public File resolveTranslatedXmlDirectory();
+		public File resolveProfiledDocumentFile() {
+			return new File( resolveProfilingDirectory(), sourceDocumentName );
+		}
 	}
 
-	protected class MasterTranslationDescriptor implements PublishingSource {
+	private class OtherTranslationDescriptorImpl implements PublishingSource, I18nSource {
 		private final Locale locale;
 
-		public MasterTranslationDescriptor(Locale locale) {
+		private OtherTranslationDescriptorImpl(Locale locale) {
 			this.locale = locale;
 		}
 
@@ -515,44 +704,142 @@
 			return locale;
 		}
 
+		public FormatPlan[] getFormatPlans() {
+			return formatPlans;
+		}
+
 		public File resolveDocumentFile() {
-			return new File( resolvedMasterSourceDirectory, sourceDocumentName );
+			return new File( determineTranslatedXmlDirectory( stringify( locale ) ), sourceDocumentName );
 		}
 
 		public File resolvePublishingDirectory() {
-			return new File( publishDirectory, stringify( locale ) );
+			return determinePublishingDirectory( stringify( locale ) );
 		}
-	}
 
-	protected class TranslationDescriptor implements PublishingSource, I18nSource {
-		private final Locale locale;
-
-		public TranslationDescriptor(Locale locale) {
-			this.locale = locale;
+		public File resolveXslFoDirectory() {
+			return determineXslFoDirectory( stringify( locale ) );
 		}
 
-		public Locale getLocale() {
-			return locale;
+		public File resolveProfilingDirectory() {
+			return determineProfilingDirectory( stringify( locale ) );
 		}
 
 		public File resolvePoDirectory() {
-			return new File( translationBaseDirectory, stringify( locale ) );
+			return determineTranslationDirectory( stringify( locale ) );
 		}
 
 		public File resolveTranslatedXmlDirectory() {
-			return new File( new File( workDirectory, "xml" ), stringify( locale ) );
+			return determineTranslatedXmlDirectory( stringify( locale ) );
 		}
 
-		public File resolveDocumentFile() {
-			return new File( resolveTranslatedXmlDirectory(), sourceDocumentName );
+		public File resolveProfiledDocumentFile() {
+			return new File( resolveProfilingDirectory(), sourceDocumentName );
 		}
+	}
 
-		public File resolvePublishingDirectory() {
-			return new File( publishDirectory, stringify( locale ) );
+	protected File determinePublishingDirectory(String lang) {
+		return new File( publishDirectory, lang );
+	}
+
+	protected File determineXslFoDirectory(String lang) {
+		return new File( new File( workDirectory, "xsl-fo" ), lang );
+	}
+
+	protected File determineProfilingDirectory(String lang) {
+		return new File( new File( workDirectory, "profile" ), lang );
+	}
+
+	protected File determineTranslationDirectory(String lang) {
+		return new File( translationBaseDirectory, lang );
+	}
+
+	protected File determineTranslatedXmlDirectory(String lang) {
+		return new File( new File( workDirectory, "xml" ), lang );
+	}
+
+
+	@SuppressWarnings({ "unchecked" })
+	protected List<Artifact> collectArtifactsByType(String type, boolean transitivesFirst) {
+		Set dependencyArtifacts = project.getArtifacts();
+		dependencyArtifacts.addAll( pluginArtifacts );
+
+		DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener(
+				new PlexusToMavenPluginLoggingBridge( getLog() )
+		);
+
+		try {
+			artifactCollector.collect(
+					dependencyArtifacts,
+					project.getArtifact(),
+					project.getManagedVersionMap(),
+					localRepository,
+					project.getRemoteArtifactRepositories(),
+					artifactMetadataSource,
+					null,
+					Collections.singletonList( listener )
+			);
 		}
+		catch ( AbstractArtifactResolutionException e ) {
+			throw new JDocBookProcessException( "Cannot build project dependency tree", e );
+		}
+
+		List<Artifact> artifacts = new ArrayList<Artifact>();
+		processNode( listener.getRootNode(), artifacts, type, transitivesFirst );
+		return artifacts;
 	}
 
-	private class MavenLogBridge implements Log {
+	@SuppressWarnings({ "unchecked" })
+	private void processNode(DependencyNode node, List<Artifact> artifacts, String type, boolean transitivesFirst) {
+		final Artifact artifact = node.getArtifact();
+		final boolean isProjectArtifact = project.getArtifact().getId().equals( artifact.getId() );
+
+		if ( ! isProjectArtifact ) {
+			resolveArtifact( artifact );
+
+		}
+
+		if ( ! isProjectArtifact && ! transitivesFirst ) {
+			if ( include( node.getArtifact(), type ) ) {
+				artifacts.add( node.getArtifact() );
+			}
+		}
+
+		for ( DependencyNode child : ( List<DependencyNode> ) node.getChildren() ) {
+			processNode( child, artifacts, type, transitivesFirst );
+		}
+
+		if ( !isProjectArtifact && transitivesFirst ) {
+			if ( include( node.getArtifact(), type ) ) {
+				artifacts.add( node.getArtifact() );
+			}
+		}
+	}
+
+	private void resolveArtifact(Artifact artifact) {
+		try {
+			artifactResolver.resolve( artifact, project.getRemoteArtifactRepositories(), localRepository );
+		}
+		catch ( ArtifactResolutionException e ) {
+			throw new JDocBookProcessException( "Unable to resolve artifact [" + artifact.getId() + "]", e );
+		}
+		catch ( ArtifactNotFoundException e ) {
+			throw new JDocBookProcessException( "Unable to locate artifact [" + artifact.getId() + "]", e );
+		}
+	}
+
+	private boolean include(Artifact artifact, String matchingType) {
+		return matchingType.equals( artifact.getType() );
+	}
+
+	protected Locale parseLocale(String locale) {
+		return LocaleUtils.parse( locale, options.getLocaleSeparator() );
+	}
+
+	protected String stringify(Locale locale) {
+		return LocaleUtils.render( locale, options.getLocaleSeparator() );
+	}
+
+	protected class MavenLogBridge implements Log {
 		public void trace(String message) {
 			getLog().debug( message );
 		}

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/CleanPoMojo.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/CleanPoMojo.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/CleanPoMojo.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -29,6 +29,7 @@
 import java.util.Locale;
 
 import org.jboss.jdocbook.JDocBookProcessException;
+import org.jboss.jdocbook.i18n.I18nSource;
 import org.codehaus.plexus.util.FileUtils;
 
 /**
@@ -42,7 +43,7 @@
 public class CleanPoMojo extends AbstractDocBookMojo {
 	protected void doExecute() throws JDocBookProcessException {
 		Locale requestedLocale = getRequestedLocale();
-		for ( I18nSource source : getI18nSources() ) {
+		for ( I18nSource source : getI18nSources( true ) ) {
 			if ( requestedLocale != null && !requestedLocale.equals( source.getLocale() ) ) {
 				continue;
 			}

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/CleanPotMojo.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/CleanPotMojo.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/CleanPotMojo.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -25,6 +25,7 @@
 package org.jboss.maven.plugins.jdocbook;
 
 import java.io.IOException;
+import java.io.File;
 
 import org.codehaus.plexus.util.FileUtils;
 import org.jboss.jdocbook.JDocBookProcessException;
@@ -39,6 +40,7 @@
  */
 public class CleanPotMojo extends AbstractDocBookMojo {
 	protected void doExecute() throws JDocBookProcessException {
+		final File potDirectory = getMasterTranslationDescriptor().resolvePotDirectory();
 		if ( potDirectory.exists() ) {
 			try {
 				FileUtils.cleanDirectory( potDirectory );

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/GenerateXslFoMojo.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/GenerateXslFoMojo.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/GenerateXslFoMojo.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,51 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.maven.plugins.jdocbook;
+
+import org.jboss.jdocbook.JDocBookProcessException;
+import org.jboss.jdocbook.render.format.FormatPlan;
+import org.jboss.jdocbook.render.format.StandardDocBookFormatDescriptors;
+import org.jboss.jdocbook.render.RendererFactory;
+import org.xml.sax.EntityResolver;
+
+/**
+ * Mojo to create an intermediate XSL-FO from the docbook source(s).
+ *
+ * @see org.jboss.jdocbook.render.impl.fop.XslFoGeneratorImpl for details.
+ *
+ * @goal xslfo
+ * @requiresDependencyResolution
+ *
+ * @author Steve Ebersole
+ */
+public class GenerateXslFoMojo extends AbstractDocBookMojo {
+	private final RendererFactory rendererFactory = new RendererFactory( this );
+
+	@Override
+	protected void process() throws JDocBookProcessException {
+		final EntityResolver entityResolver = getCatalogResolver();
+		final FormatPlan pdfFormatPlan = getFormatPlan( StandardDocBookFormatDescriptors.PDF );
+		rendererFactory.buildXslFoGenerator( pdfFormatPlan, entityResolver ).generateXslFo();
+	}
+}

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/GenerationMojo.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/GenerationMojo.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/GenerationMojo.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -23,16 +23,17 @@
  */
 package org.jboss.maven.plugins.jdocbook;
 
-import java.io.File;
 import java.util.List;
+import java.util.Set;
+import java.util.ArrayList;
 
 import org.apache.maven.artifact.Artifact;
 import org.jboss.jdocbook.profile.ProfilerFactory;
 import org.jboss.jdocbook.render.RenderingException;
 import org.jboss.jdocbook.render.format.FormatPlan;
-import org.jboss.jdocbook.render.impl.RendererFactory;
-import org.jboss.jdocbook.util.DocBookProfilingStrategy;
+import org.jboss.jdocbook.render.RendererFactory;
 import org.jboss.jdocbook.xslt.XSLTException;
+import org.xml.sax.EntityResolver;
 
 /**
  * This mojo's responsibility within the plugin/packaging is actually performing 
@@ -46,86 +47,69 @@
  * @author Steve Ebersole
  */
 public class GenerationMojo extends AbstractDocBookMojo {
-	@Override
-	protected boolean excludeIngoredTranslationsFromPublishSources() {
-		return true;
-	}
+	/**
+	 * INTERNAL : The artifacts associated with the dependencies defined as part
+	 * of the project to which we are being attached.
+	 *
+	 * @parameter expression="${project.artifacts}"
+     * @required
+     * @readonly
+	 */
+	protected Set projectArtifacts;
 
-	@Override
-	protected boolean excludeIngoredTranslationsFromI18nSources() {
-		return true;
-	}
+	/**
+	 * INTERNAL : The artifacts associated to the dependencies defined as part
+	 * of our configuration within the project to which we are being attached.
+	 *
+	 * @parameter expression="${plugin.artifacts}"
+     * @required
+     * @readonly
+	 */
+	protected List pluginArtifacts;
 
+	private final ProfilerFactory profilerFactory = new ProfilerFactory( this );
+	private final RendererFactory rendererFactory = new RendererFactory( this );
+
+	@SuppressWarnings({ "unchecked" })
 	@Override
-	protected void process(FormatPlan[] plans) throws XSLTException, RenderingException {
+	protected void process() throws XSLTException, RenderingException {
 		if ( !sourceDirectory.exists() ) {
 			getLog().info( "sourceDirectory [" + sourceDirectory.getAbsolutePath() + "] did not exist" );
 			return;
 		}
 
+		if ( options.getDocbookVersion() == null ) {
+			List<Artifact> artifacts = new ArrayList<Artifact>();
+			artifacts.addAll( projectArtifacts );
+			artifacts.addAll( pluginArtifacts );
+
+			for ( Artifact artifact : artifacts ) {
+				if ( "net.sf.docbook".equals( artifact.getGroupId() ) &&
+						"docbook".equals( artifact.getArtifactId() ) ) {
+					getLog().debug( "Found docbook version : " + artifact.getVersion() );
+					if ( options.getDocbookVersion() != null ) {
+						getLog().warn( "found multiple docbook versions" );
+					}
+					options.setDocbookVersion( artifact.getVersion() );
+				}
+			}
+		}
+
 		if ( !workDirectory.exists() ) {
 			boolean created = workDirectory.mkdirs();
 			if ( !created ) {
-				options.getLog().info( "Unable to create work directory {}", workDirectory.getAbsolutePath() );
+				loggingBridge.info( "Unable to create work directory {}", workDirectory.getAbsolutePath() );
 			}
 		}
 
-		if ( options.getDocbookVersion() == null ) {
-			processArtifacts(
-					new ArtifactProcessor() {
-						public void process(Artifact artifact) {
-							if ( "net.sf.docbook".equals( artifact.getGroupId() ) &&
-									"docbook".equals( artifact.getArtifactId() ) ) {
-								getLog().debug( "Found docbook version : " + artifact.getVersion() );
-								if ( options.getDocbookVersion() != null ) {
-									getLog().warn( "found multiple docbook versions" );
-								}
-								options.setDocbookVersion( artifact.getVersion() );
-							}
-						}
-					}
-			);
+		if ( profiling.isEnabled() ) {
+			profilerFactory.buildProfiler().applyProfiling();
 		}
 
-		RendererFactory rendererFactory = new RendererFactory( options );
-		String requestedFormat = getRequestedFormat();
+		final EntityResolver entityResolver = getCatalogResolver();
 
-		List<PublishingSource> sources = getPublishingSources();
-		for ( PublishingSource source : sources ) {
-			options.getLog().info( "Starting generation " + stringify( source.getLocale() ) );
-			File sourceFile = source.resolveDocumentFile();
-			if ( !sourceFile.exists() ) {
-				getLog().info( "Source document [" + sourceFile.getAbsolutePath() + "] did not exist; skipping" );
-				continue;
-			}
-
-			File publishingDirectory = source.resolvePublishingDirectory();
-			if ( ! publishingDirectory.exists() ) {
-				boolean created = publishingDirectory.mkdirs();
-				if ( !created ) {
-					options.getLog().info( "Unable to create publishing directory {}", publishingDirectory.getAbsolutePath() );
-				}
-			}
-
-			final String lang = stringify( source.getLocale() );
-			options.getTransformerParameters().setProperty( "l10n.gentext.language", lang );
-			options.getTransformerParameters().setProperty( "profile.lang", lang );
-
-			boolean hasBeenProfiled = false;
-			for ( FormatPlan plan : plans ) {
-				options.getLog().info( "Processing " + lang + " -> " + plan.getName() );
-				if ( requestedFormat != null && !requestedFormat.equals( plan.getName() ) ) {
-					getLog().info( "skipping non-requested format [" + plan.getName() + "]" );
-					continue;
-				}
-				if ( plan.getProfiling() == DocBookProfilingStrategy.TWO_PASS && !hasBeenProfiled ) {
-					hasBeenProfiled = true;
-					File profileOutputDir = new File( new File( workDirectory, "profile" ), lang );
-					sourceFile = new ProfilerFactory( profileOutputDir, options ).buildProfiler().applyProfiling( sourceFile );
-				}
-				rendererFactory.buildRenderer( plan.getName() ).render( sourceFile, plan, publishingDirectory, stagingDirectory );
-			}
+		for ( FormatPlan formatPlan : getFormatPlans() ) {
+			rendererFactory.buildRenderer( formatPlan, entityResolver ).render();
 		}
 	}
-
 }

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/PackageMojo.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/PackageMojo.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/PackageMojo.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -30,6 +30,7 @@
 import org.codehaus.plexus.archiver.ArchiverException;
 import org.codehaus.plexus.archiver.jar.JarArchiver;
 import org.jboss.jdocbook.render.RenderingException;
+import org.jboss.jdocbook.render.PublishingSource;
 import org.jboss.jdocbook.render.format.FormatPlan;
 import org.jboss.jdocbook.xslt.XSLTException;
 
@@ -51,22 +52,18 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	protected void process(FormatPlan[] formatPlans) throws RenderingException, XSLTException {
+	protected void process() throws RenderingException, XSLTException {
 		File projectArtifactFile = new File( project.getBuild().getOutputDirectory(), project.getBuild().getFinalName() + ".war" );
 		JarArchiver archiver = new JarArchiver();
 		archiver.setDestFile( projectArtifactFile );
 
-//		RendererFactory rendererFactory = new RendererFactory( options );
 		try {
-			for ( PublishingSource source : getPublishingSources() ) {
-				for ( FormatPlan formatPlan : formatPlans ) {
+			for ( PublishingSource source : getPublishingSources( true ) ) {
+				for ( FormatPlan formatPlan : getFormatPlans() ) {
 					archiver.addDirectory(
 							new File( source.resolvePublishingDirectory(), formatPlan.getName() ),
 							formatPlan.getName() + "/"
 					);
-//					if ( attach ) {
-//						File bundle = rendererFactory.buildRenderer( formatPlan.getName() ).getAttachableBundle( )
-//					}
 				}
 			}
 			archiver.createArchive();

Added: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/Profiling.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/Profiling.java	                        (rev 0)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/Profiling.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -0,0 +1,68 @@
+/*
+ * jDocBook, processing of DocBook sources as a Maven plugin
+ *
+ * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.jboss.maven.plugins.jdocbook;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class Profiling {
+	private boolean enabled;
+	private String attributeName;
+	private String attributeValue;
+
+	public Profiling() {
+	}
+
+	public Profiling(String attributeName, String attributeValue) {
+		this.enabled = true;
+		this.attributeName = attributeName;
+		this.attributeValue = attributeValue;
+	}
+
+	public boolean isEnabled() {
+		return enabled;
+	}
+
+	public void setEnabled(boolean enabled) {
+		this.enabled = enabled;
+	}
+
+	public String getAttributeName() {
+		return attributeName;
+	}
+
+	public void setAttributeName(String attributeName) {
+		this.attributeName = attributeName;
+	}
+
+	public String getAttributeValue() {
+		return attributeValue;
+	}
+
+	public void setAttributeValue(String attributeValue) {
+		this.attributeValue = attributeValue;
+	}
+}

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/ResourceMojo.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/ResourceMojo.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/ResourceMojo.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -21,20 +21,21 @@
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
  */
-
 package org.jboss.maven.plugins.jdocbook;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
+import java.io.InputStream;
+import java.util.Arrays;
 
 import org.apache.maven.artifact.Artifact;
+import org.codehaus.plexus.archiver.ArchiveFileFilter;
+import org.codehaus.plexus.archiver.ArchiveFilterException;
 import org.codehaus.plexus.archiver.ArchiverException;
+import org.codehaus.plexus.archiver.FilterEnabled;
 import org.codehaus.plexus.archiver.UnArchiver;
 import org.codehaus.plexus.archiver.manager.NoSuchArchiverException;
 import org.jboss.jdocbook.render.RenderingException;
-import org.jboss.jdocbook.render.format.FormatPlan;
 import org.jboss.jdocbook.xslt.XSLTException;
 import org.jboss.maven.shared.resource.ResourceDelegate;
 
@@ -47,57 +48,50 @@
  *
  * @goal resources
  * @phase process-resources
- * @requiresDependencyResolution
+ * @requiresDependencyResolution compile
  *
  * @author Steve Ebersole
  */
 public class ResourceMojo extends AbstractDocBookMojo {
 
-	protected void process(FormatPlan[] formattings) throws RenderingException, XSLTException {
-		// allow project local style artifacts to override imported ones...
-		processDependencySupportArtifacts( collectDocBookStyleDependentArtifacts() );
-		processProjectResources();
-	}
 
-	// project local resources ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-	private void processProjectResources() throws RenderingException {
-		if ( imageResource != null ) {
-			new ResourceDelegate( project, new File( stagingDirectory, "images" ), getLog() ).process( imageResource );
-		}
-		if ( cssResource != null ) {
-			new ResourceDelegate( project, new File( stagingDirectory, "css" ), getLog() ).process( cssResource );
-		}
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	protected void process() throws RenderingException, XSLTException {
+		stageStyleSupportArtifacts();
+		stageProjectResources();
 	}
 
 
-	// dependency support resources ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+	// style resources ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-	private List<Artifact> collectDocBookStyleDependentArtifacts() {
-		final ArrayList<Artifact> rtn = new ArrayList<Artifact>();
-		processArtifacts(
-				new ArtifactProcessor() {
-					public void process(Artifact artifact) {
-						if ( "jdocbook-style".equals( artifact.getType() ) ) {
-							rtn.add( artifact );
-						}
-					}
-				}
-		);
-		return rtn;
-	}
+	private final ArchiveFileFilter[] styleEntryFilters = new ArchiveFileFilter[] {
+			new MetaInfExclusionFilter(),
+	};
 
-	private void processDependencySupportArtifacts(List<Artifact> artifacts) throws RenderingException {
-		for ( Artifact artifact : artifacts ) {
-			processDependencySupportArtifact( artifact.getFile(), stagingDirectory );
+	private void stageStyleSupportArtifacts() {
+		for ( Artifact artifact : collectArtifactsByType( "jdocbook-style", true ) ) {
+			getLog().debug( "processing support artifact : " + artifact.getId() );
+			unpackSupportArtifact( artifact.getFile(), stagingDirectory, styleEntryFilters );
 		}
 	}
 
-	protected void processDependencySupportArtifact(File file, File target) throws RenderingException {
-		getLog().info( "unpacking dependency resource [" + file.getAbsolutePath() + "] to staging-dir [" + target.getAbsolutePath() + "]" );
+	protected void unpackSupportArtifact(File file, File target, ArchiveFileFilter[] entryFilters) throws RenderingException {
+		getLog().debug( "unpacking support artifact [" + file.getAbsolutePath() + "] to directory [" + target.getAbsolutePath() + "]" );
 		try {
-            target.mkdirs();
+            if ( ! target.exists() ) {
+				boolean created = target.mkdirs();
+				if ( ! created ) {
+					getLog().warn( "File-system reported problem creating directory " + target.getAbsolutePath() );
+				}
+			}
 			UnArchiver unArchiver = archiverManager.getUnArchiver( "jar" );
+			if ( FilterEnabled.class.isInstance( unArchiver ) ) {
+				// try to save some disk space...
+				( ( FilterEnabled ) unArchiver ).setArchiveFilters( Arrays.asList( entryFilters ) );
+			}
             unArchiver.setSourceFile( file );
             unArchiver.setDestDirectory( target );
 			unArchiver.extract();
@@ -112,4 +106,27 @@
             throw new RenderingException( "Error unpacking file [" + file + "] to [" + target + "]", e );
         }
     }
+
+
+	// project local resources ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	private void stageProjectResources() throws RenderingException {
+		if ( imageResource != null ) {
+			new ResourceDelegate( project, new File( stagingDirectory, "images" ), getLog() ).process( imageResource );
+		}
+		if ( cssResource != null ) {
+			new ResourceDelegate( project, new File( stagingDirectory, "css" ), getLog() ).process( cssResource );
+		}
+	}
+
+
+	// ArchiveFileFilter impls ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+	private static class MetaInfExclusionFilter implements ArchiveFileFilter {
+		public boolean include(InputStream dataStream, String entryName) throws ArchiveFilterException {
+			// exclude all META-INF entries.
+			return ! entryName.toUpperCase().startsWith( "META-INF/" );
+		}
+	}
+
 }

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/TranslationMojo.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/TranslationMojo.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/TranslationMojo.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -24,7 +24,6 @@
 package org.jboss.maven.plugins.jdocbook;
 
 import org.jboss.jdocbook.JDocBookProcessException;
-import org.jboss.jdocbook.i18n.Factory;
 
 /**
  * Responsible for translating the DocBook source based on the translator's PO files.
@@ -36,26 +35,7 @@
  */
 public class TranslationMojo extends AbstractDocBookMojo {
 	@Override
-	protected boolean excludeIngoredTranslationsFromPublishSources() {
-		return true;
-	}
-
-	@Override
-	protected boolean excludeIngoredTranslationsFromI18nSources() {
-		return true;
-	}
-
-	@Override
 	protected void doExecute() throws JDocBookProcessException {
-		MasterTranslationDescriptor masterTranslationDescriptor = getMasterTranslationDescriptor();
-		for ( I18nSource source : getI18nSources() ) {
-			getLog().info( "Processing translation [" + stringify( source.getLocale() ) + "]" );
-			Factory.getTranslationBuilder().buildTranslation(
-					masterTranslationDescriptor.resolveDocumentFile(),
-					source.resolvePoDirectory(),
-					source.resolveTranslatedXmlDirectory(),
-					options
-			);
-		}
+		getI18nProcesserFactory().getTranslationBuilder().buildTranslations();
 	}
 }

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/UpdatePoMojo.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/UpdatePoMojo.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/UpdatePoMojo.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -21,14 +21,9 @@
  * 51 Franklin Street, Fifth Floor
  * Boston, MA  02110-1301  USA
  */
-
 package org.jboss.maven.plugins.jdocbook;
 
-import java.util.List;
-import java.util.Locale;
-
 import org.jboss.jdocbook.JDocBookProcessException;
-import org.jboss.jdocbook.i18n.Factory;
 
 /**
  * UpdatePoMojo implementationslatable strings from the master translation source into the POT files.
@@ -40,14 +35,6 @@
  */
 public class UpdatePoMojo extends AbstractDocBookMojo {
 	protected void doExecute() throws JDocBookProcessException {
-		Locale translationLocale = getRequestedLocale();
-		List<I18nSource> sources = getI18nSources();
-		for ( I18nSource source : sources ) {
-			if ( translationLocale == null || translationLocale.equals( source.getLocale() ) ) {
-				getLog().info( "Updating PO file [" + stringify( source.getLocale() ) + "]" );
-				Factory.getPoSynchronizer()
-						.synchronizePo( potDirectory, source.resolvePoDirectory(), source.getLocale(), options );
-			}
-		}
+		getI18nProcesserFactory().getPoSynchronizer().synchronizePoFiles();
 	}
 }

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/UpdatePotMojo.java
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/UpdatePotMojo.java	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/java/org/jboss/maven/plugins/jdocbook/UpdatePotMojo.java	2009-06-17 15:10:29 UTC (rev 26993)
@@ -24,9 +24,8 @@
 package org.jboss.maven.plugins.jdocbook;
 
 import org.jboss.jdocbook.JDocBookProcessException;
-import org.jboss.jdocbook.i18n.Factory;
+import org.jboss.jdocbook.i18n.I18nEnvironment;
 
-
 /**
  * Manages pushing translatable strings from the master translation source into the POT files.
  * 
@@ -35,9 +34,8 @@
  *
  * @author Steve Ebersole
  */
-public class UpdatePotMojo extends AbstractDocBookMojo {
+public class UpdatePotMojo extends AbstractDocBookMojo implements I18nEnvironment {
 	protected void doExecute() throws JDocBookProcessException {
-		MasterTranslationDescriptor master = getMasterTranslationDescriptor();
-		Factory.getPotSynchronizer().synchronizePot( master.resolveDocumentFile(), potDirectory, options );
+		getI18nProcesserFactory().getPotSynchronizer().synchronizePot();
 	}
 }

Modified: labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/resources/META-INF/plexus/components.xml
===================================================================
--- labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/resources/META-INF/plexus/components.xml	2009-06-17 13:10:56 UTC (rev 26992)
+++ labs/jbossbuild/maven-plugins/trunk/maven-jdocbook-plugin/src/main/resources/META-INF/plexus/components.xml	2009-06-17 15:10:29 UTC (rev 26993)
@@ -28,7 +28,6 @@
     <components>
 
         <!-- Defines the lifecycle associated with the 'jdocbook' packaging -->
-
         <component>
             <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
             <role-hint>jdocbook</role-hint>




More information about the jboss-svn-commits mailing list