
com.rackspace.cloud.api.docs.builders.PDFBuilder Maven / Gradle / Ivy
package com.rackspace.cloud.api.docs.builders;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.servlet.jsp.el.ELException;
import javax.servlet.jsp.el.VariableResolver;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.URIResolver;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.antlr.stringtemplate.StringTemplate;
import org.antlr.stringtemplate.StringTemplateGroup;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
import org.apache.commons.io.IOUtils;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.plugin.logging.SystemStreamLog;
import org.apache.maven.project.MavenProject;
import org.apache.xerces.jaxp.SAXParserFactoryImpl;
import org.apache.xml.resolver.CatalogManager;
import org.apache.xml.resolver.tools.CatalogResolver;
import org.codehaus.plexus.util.DirectoryScanner;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import com.agilejava.docbkx.maven.CachingTransformerBuilder;
import com.agilejava.docbkx.maven.Entity;
import com.agilejava.docbkx.maven.ExpressionHandler;
import com.agilejava.docbkx.maven.InjectingEntityResolver;
import com.agilejava.docbkx.maven.NullWriter;
import com.agilejava.docbkx.maven.Parameter;
import com.agilejava.docbkx.maven.PreprocessingFilter;
import com.agilejava.docbkx.maven.ProcessingInstructionHandler;
import com.agilejava.docbkx.maven.StylesheetResolver;
import com.agilejava.docbkx.maven.TransformerBuilder;
import com.icl.saxon.Controller;
import com.icl.saxon.TransformerFactoryImpl;
import com.rackspace.cloud.api.docs.CalabashHelper;
import com.rackspace.cloud.api.docs.DocBookResolver;
import com.rackspace.cloud.api.docs.FileUtils;
import com.rackspace.cloud.api.docs.GlossaryResolver;
public class PDFBuilder {
private MavenProject project;
protected String[] catalogs = { "catalog.xml", "docbook/catalog.xml" };
private File coverImageTemplate;
private File coverImage;
private static final String COVER_IMAGE_TEMPLATE_NAME = "cover.st";
private static final String COVER_IMAGE_NAME = "cover.svg";
private static final String COVER_XSL = "cloud/cover.xsl";
// configure fopFactory as desired
private String inputFilename = null;
private File autopdfTargetDirectory = null;
private File webhelpTargetDirectory = null;
private File sourceDirectory = null;
private File imageDirectory = null;
private File sourceFilePath;
private File projectBuildDirectory;
//transformer settings
//TODO: need to somehow pass coverLogoPath, secondaryCoverLogoPath, coverLogoLeft, coverLogoTop, coverUrl from the WebHelp flow
private String coverColor;
private String pageWidth;
private String pageHeight;
private String omitCover;
private String doubleSided;
private String coverLogoPath;
private String secondaryCoverLogoPath;
private String coverLogoLeft;
private String coverLogoTop;
private String coverUrl;
private String branding;
private String builtForOpenStack;
private String security;
private String chapterAutolabel;
private String appendixAutolabel;
private String sectionAutolabel;
private String sectionLabelIncludesComponentLabel;
private String formalProcedures;
private String generateToc;
private String tocMaxDepth;
private String tocSectionDepth;
private String glossaryCollection;
private String draftStatus;
private String statusBarText;
private String bodyFont;
private String monospaceFont;
private String localFontPath;
private String trimWadlUriCount;
private String computeWadlPathFromDocbookPath;
private String pdfFilenameBase;
/**
* The location of the stylesheet customization.
*
* @parameter
*/
private String foCustomization;
private List customizationParameters = new ArrayList();
private List entities;
private Log log = null;
public Log getLog() {
if ( log == null ) {
log = new SystemStreamLog();
}
return log;
}
public void preProcess() throws MojoExecutionException {
final File targetDirectory = getAutopdfTargetDirectory();
File imageParentDirectory = targetDirectory.getParentFile();
if (!targetDirectory.exists()) {
FileUtils.mkdir(targetDirectory);
}
//
// Extract all images into the image directory.
//
FileUtils.extractJaredDirectory("images",PDFBuilder.class,imageParentDirectory);
setImageDirectory (new File (imageParentDirectory, "images"));
//
// Extract all fonts into fonts directory
//
FileUtils.extractJaredDirectory("fonts",PDFBuilder.class,imageParentDirectory);
}
public File processSources(Map map) throws MojoExecutionException {
final String[] included = scanIncludedFiles();
// configure a resolver for catalog files
final CatalogManager catalogManager = createCatalogManager();
final CatalogResolver catalogResolver = new CatalogResolver(catalogManager);
// configure a resolver for urn:dockbx:stylesheet
final URIResolver uriResolver = createStyleSheetResolver(catalogResolver);
// configure a resolver for xml entities
final InjectingEntityResolver injectingResolver = createEntityResolver(catalogResolver);
EntityResolver resolver = catalogResolver;
if (injectingResolver != null) {
resolver = injectingResolver;
}
// configure the builder for XSL Transforms
final TransformerBuilder builder = createTransformerBuilder(uriResolver);
// configure the XML parser
SAXParserFactory factory = createParserFactory();
for (int i = included.length - 1; i >= 0; i--) {
try {
if (injectingResolver != null) {
injectingResolver.forceInjection();
}
final String inputFilename = included[i];
//final String inputFilename = sourceFilePath;
// targetFilename is inputFilename - ".xml" + targetFile extension
String baseTargetFile;
if(null != pdfFilenameBase && !pdfFilenameBase.isEmpty()){
baseTargetFile = pdfFilenameBase;
} else {
baseTargetFile = inputFilename.substring(0, inputFilename.length() - 4);
}
final String targetFilename = baseTargetFile + ".fo";
final File sourceFile = new File(sourceDirectory, inputFilename);
File targetFile = new File(autopdfTargetDirectory, targetFilename);
final XMLReader reader = factory.newSAXParser().getXMLReader();
// configure XML reader
reader.setEntityResolver(resolver);
// eval PI
final PreprocessingFilter filter = createPIHandler(resolver, reader);
// configure SAXSource for XInclude
final Source xmlSource = createSource(inputFilename, sourceFile, filter, map);
// XSL Transformation
final Transformer transformer = builder.build();
adjustTransformer(transformer, sourceFile.getAbsolutePath(), targetFile);
final Result result = new StreamResult(targetFile.getAbsolutePath());
transformer.transform(xmlSource, result);
if (getLog().isDebugEnabled()) {
getLog().debug(targetFile + " has been generated.");
}
return targetFile;
} catch (SAXException saxe) {
throw new MojoExecutionException("Failed to parse " + sourceFilePath + ".", saxe);
} catch (TransformerException te) {
throw new MojoExecutionException("Failed to transform " + sourceFilePath + ".", te);
} catch (ParserConfigurationException pce) {
throw new MojoExecutionException("Failed to construct parser.", pce);
}
}
return null;
}
public File postProcessResult(File result) throws MojoExecutionException {
final FopFactory fopFactory = FopFactory.newInstance();
final FOUserAgent userAgent = fopFactory.newFOUserAgent();
// First transform the cover page
transformCover();
// Get properties file from webhelp war
String warBasename = result.getName().substring(0, result.getName().lastIndexOf('.'));
Properties properties = new Properties();
InputStream is;
try {
File f = new File(projectBuildDirectory, "autopdf/pdf.properties");
is = new FileInputStream( f );
properties.load(is);
}
catch ( Exception e ) {
System.out.println("Got an Exception: " + e.getMessage());
}
// FOUserAgent can be used to set PDF metadata
Configuration configuration = loadFOPConfig();
InputStream in = null;
OutputStream out = null;
File targetPdfFile = null;
try
{
String baseURL = sourceDirectory.toURI().toURL().toExternalForm();
baseURL = baseURL.replace("file:/", "file:///");
userAgent.setBaseURL(baseURL);
if (getLog().isDebugEnabled()) {
getLog().debug("Absolute path is "+baseURL);
}
in = new FileInputStream(result);
targetPdfFile = new File (result.getAbsolutePath().replaceAll(".fo$", properties.getProperty("pdfsuffix","") + ".pdf"));
out = new FileOutputStream(targetPdfFile);
fopFactory.setUserConfig(configuration);
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, userAgent, out);
// Setup JAXP using identity transformer
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(); // identity transformer
// Setup input stream
Source src = new StreamSource(in);
// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
// Start XSLT transformation and FOP processing
transformer.transform(src, res);
}
catch (FOPException e)
{
throw new MojoExecutionException("Failed to convert to PDF", e);
}
catch (TransformerConfigurationException e)
{
throw new MojoExecutionException("Failed to load JAXP configuration", e);
}
catch (TransformerException e)
{
throw new MojoExecutionException("Failed to transform to PDF", e);
}
catch (MalformedURLException e)
{
throw new MojoExecutionException("Failed to get FO basedir", e);
} catch (FileNotFoundException e) {
throw new MojoExecutionException("File not found!", e);
}
finally
{
IOUtils.closeQuietly(out);
IOUtils.closeQuietly(in);
}
return targetPdfFile;
}
public boolean movePdfToWebhelpDir(File pdfFile, File webhelpTargetDir) {
if(pdfFile.renameTo(new File(webhelpTargetDir,pdfFile.getName()))){
return true;
}
return false;
}
public void adjustTransformer(Transformer transformer, String sourceFilename, File targetFile) {
String baseUrl;
try {
final String str = (new File(sourceFilename)).getParentFile().toURI().toURL().toExternalForm();
baseUrl = str.replace("file:/", "file:///");
} catch (MalformedURLException e) {
getLog().warn("Failed to get FO basedir", e);
}
// Only set this here! Don't ever set in PdfMojo
transformer.setParameter("autoPdfGlossaryInfix","/..");
transformer.setParameter("branding", branding);
if(null != builtForOpenStack){
transformer.setParameter("builtForOpenStack", builtForOpenStack);
}
transformer.setParameter("coverLogoPath", coverLogoPath);
if(null != secondaryCoverLogoPath){
transformer.setParameter("secondaryCoverLogoPath", secondaryCoverLogoPath);
}
transformer.setParameter("coverLogoLeft", coverLogoLeft);
transformer.setParameter("coverLogoTop", coverLogoTop);
transformer.setParameter("coverUrl", coverUrl);
transformer.setParameter("coverColor", coverColor);
if(null != pageWidth){
transformer.setParameter("page.width", pageWidth);
}
if(null != pageHeight){
transformer.setParameter("page.height", pageHeight);
}
if(null != omitCover){
transformer.setParameter("omitCover", omitCover);
}
if(null != doubleSided){
transformer.setParameter("double.sided", doubleSided);
}
if(null != glossaryCollection){
transformer.setParameter("glossary.collection", glossaryCollection);
}
if(null != sectionAutolabel){
transformer.setParameter("section.autolabel", sectionAutolabel);
}
if(null != sectionLabelIncludesComponentLabel){
transformer.setParameter("section.label.includes.component.label", sectionLabelIncludesComponentLabel);
}
if(null != chapterAutolabel){
transformer.setParameter("chapter.autolabel", chapterAutolabel);
}
if(null != appendixAutolabel){
transformer.setParameter("appendix.autolabel", appendixAutolabel);
}
if(null != generateToc){
transformer.setParameter("generate.toc", generateToc);
}
if(null != tocMaxDepth){
transformer.setParameter("toc.max.depth", tocMaxDepth);
}
if(null != tocSectionDepth){
transformer.setParameter("toc.section.depth", tocSectionDepth);
}
if(null != formalProcedures){
transformer.setParameter("formal.procedures", formalProcedures);
}
transformer.setParameter("project.build.directory", projectBuildDirectory.toURI().toString());
String sysSecurity=System.getProperty("security");
if(null!=sysSecurity && !sysSecurity.isEmpty()){
security=sysSecurity;
}
if(security != null){
transformer.setParameter("security",security);
}
String sysDraftStatus=System.getProperty("draft.status");
if(null!=sysDraftStatus && !sysDraftStatus.isEmpty()){
draftStatus=sysDraftStatus;
}
transformer.setParameter("draft.status", draftStatus);
String sysStatusBarText=System.getProperty("statusBarText");
if(null!=sysStatusBarText && !sysStatusBarText.isEmpty()){
statusBarText=sysStatusBarText;
}
if(null != statusBarText){
transformer.setParameter("status.bar.text", statusBarText);
}
if(null != bodyFont){
transformer.setParameter("bodyFont", bodyFont);
}
if(null != monospaceFont){
transformer.setParameter("monospaceFont", monospaceFont);
}
if(trimWadlUriCount != null){
transformer.setParameter("trim.wadl.uri.count",trimWadlUriCount);
}
//
// Setup graphics paths
//
File sourceDocBook = new File(sourceFilename);
sourceDirectory = sourceDocBook.getParentFile();
File imageDirectory = getImageDirectory();
File calloutDirectory = new File (imageDirectory, "callouts");
transformer.setParameter("docbook.infile",sourceDocBook.toURI().toString());
transformer.setParameter("source.directory",sourceDirectory.toURI().toString());
transformer.setParameter("compute.wadl.path.from.docbook.path",computeWadlPathFromDocbookPath);
transformer.setParameter("pdfFilenameBase",pdfFilenameBase)
;
transformer.setParameter ("admon.graphics.path", imageDirectory.toURI().toString());
transformer.setParameter ("callout.graphics.path", calloutDirectory.toURI().toString());
//
// Setup the background image file
//
File cloudSub = new File (imageDirectory, "cloud");
File ccSub = new File (imageDirectory, "cc");
coverImage = new File (cloudSub, COVER_IMAGE_NAME);
coverImageTemplate = new File (cloudSub, COVER_IMAGE_TEMPLATE_NAME);
coverImageTemplate = new File (cloudSub, "rackspace-cover.st");
transformer.setParameter ("cloud.api.background.image", coverImage.toURI().toString());
transformer.setParameter ("cloud.api.cc.image.dir", ccSub.toURI().toString());
}
protected void transformCover() throws MojoExecutionException {
try {
ClassLoader classLoader = Thread.currentThread()
.getContextClassLoader();
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(classLoader.getResourceAsStream(COVER_XSL)));
if(coverColor != null){
transformer.setParameter("coverColor", coverColor);
}
transformer.setParameter("branding", branding);
File cloudSub = new File (imageDirectory, "cloud");
File ccSub = new File (imageDirectory, "cc");
coverImage = new File (cloudSub, COVER_IMAGE_NAME);
coverImageTemplate = new File (cloudSub, COVER_IMAGE_TEMPLATE_NAME);
coverImageTemplate = new File (cloudSub, "rackspace-cover.st");
transformer.setParameter ("cloud.api.background.image", coverImage.toURI().toString());
transformer.setParameter ("cloud.api.cc.image.dir", ccSub.toURI().toString());
if (getLog().isDebugEnabled()) {
getLog().info("SOURCE FOR COVER PAGE: "+sourceFilePath);
}
// transformer.setParameter("docbook.infile", sourceFilePath.toURI().toString());
if (getLog().isDebugEnabled()) {
getLog().debug("SOURCE FOR COVER PAGE: " + new File(projectBuildDirectory, inputFilename).getAbsolutePath());
}
transformer.setParameter("docbook.infile", new File(projectBuildDirectory, inputFilename).toURI().toString());
transformer.transform (new StreamSource(coverImageTemplate), new StreamResult(coverImage));
}
catch (TransformerConfigurationException e)
{
throw new MojoExecutionException("Failed to load JAXP configuration", e);
}
catch (TransformerException e)
{
throw new MojoExecutionException("Failed to transform to cover", e);
}
}
protected Configuration loadFOPConfig() throws MojoExecutionException {
String fontPath = (null != localFontPath && localFontPath != "") ? localFontPath : (new File(getAutopdfTargetDirectory().getParentFile(), "fonts")).getAbsolutePath();
StringTemplateGroup templateGroup = new StringTemplateGroup("fonts", fontPath);
StringTemplate template = templateGroup.getInstanceOf("fontconfig");
DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
template.setAttribute ("fontPath",fontPath);
final String config = template.toString();
if (getLog().isDebugEnabled()) {
getLog().debug(config);
}
try {
return builder.build(IOUtils.toInputStream(config));
} catch (IOException ioe) {
throw new MojoExecutionException("Failed to load FOP config.", ioe);
} catch (SAXException saxe) {
throw new MojoExecutionException("Failed to parse FOP config.",
saxe);
} catch (ConfigurationException e) {
throw new MojoExecutionException(
"Failed to do something Avalon requires....", e);
}
}
public void setInputFilename(String inputFilename) {
this.inputFilename = inputFilename;
}
public MavenProject getProject() {
return project;
}
public void setProject(MavenProject project) {
this.project = project;
}
public File getAutopdfTargetDirectory() {
return autopdfTargetDirectory;
}
public void setAutopdfTargetDirectory(File autopdfTargetDirectory) {
this.autopdfTargetDirectory = autopdfTargetDirectory;
}
public File getWebhelpTargetDirectory() {
return webhelpTargetDirectory;
}
public void setWebhelpTargetDirectory(File webhelpTargetDirectory) {
this.webhelpTargetDirectory = webhelpTargetDirectory;
}
public File getSourceDirectory() {
return sourceDirectory;
}
public void setSourceDirectory(File sourceDirectory) {
this.sourceDirectory = sourceDirectory;
}
public File getImageDirectory() {
return imageDirectory;
}
public void setImageDirectory(File imageDirectory) {
this.imageDirectory = imageDirectory;
}
public File getSourceFilePath() {
return sourceFilePath;
}
public void setSourceFilePath(File sourceDocBook) {
this.sourceFilePath = sourceDocBook;
}
public File getProjectBuildDirectory() {
return projectBuildDirectory;
}
public void setProjectBuildDirectory(File projectBuildDirectory) {
this.projectBuildDirectory = projectBuildDirectory;
}
public String getCoverColor() {
return coverColor;
}
public void setCoverColor(String coverColor) {
this.coverColor = coverColor;
}
public String getCoverLogoPath() {
return coverLogoPath;
}
public void setCoverLogoPath(String coverLogoPath) {
this.coverLogoPath = coverLogoPath;
}
public String getSecondaryCoverLogoPath() {
return secondaryCoverLogoPath;
}
public void setSecondaryCoverLogoPath(String secondaryCoverLogoPath) {
this.secondaryCoverLogoPath = secondaryCoverLogoPath;
}
public String getCoverLogoLeft() {
return coverLogoLeft;
}
public void setCoverLogoLeft(String coverLogoLeft) {
this.coverLogoLeft = coverLogoLeft;
}
public String getCoverLogoTop() {
return coverLogoTop;
}
public void setCoverLogoTop(String coverLogoTop) {
this.coverLogoTop = coverLogoTop;
}
public String getCoverUrl() {
return coverUrl;
}
public void setCoverUrl(String coverUrl) {
this.coverUrl = coverUrl;
}
public String getBranding() {
return branding;
}
public void setBranding(String branding) {
this.branding = branding;
}
public String getBuiltForOpenStack() {
return builtForOpenStack;
}
public void setBuiltForOpenStack(String builtForOpenStack) {
this.builtForOpenStack = builtForOpenStack;
}
public String getPageWidth() {
return pageWidth;
}
public void setPageWidth(String pageWidth) {
this.pageWidth = pageWidth;
}
public String getPageHeight() {
return pageHeight;
}
public void setPageHeight(String pageHeight) {
this.pageHeight = pageHeight;
}
public String getOmitCover() {
return omitCover;
}
public void setOmitCover(String omitCover) {
this.omitCover = omitCover;
}
public String getDoubleSided() {
return doubleSided;
}
public void setDoubleSided(String doubleSided) {
this.doubleSided = doubleSided;
}
public String getSecurity() {
return security;
}
public void setSecurity(String security) {
this.security = security;
}
public String getChapterAutolabel() {
return chapterAutolabel;
}
public void setChapterAutolabel(String chapterAutolabel) {
this.chapterAutolabel = chapterAutolabel;
}
public String getAppendixAutolabel() {
return appendixAutolabel;
}
public void setAppendixAutolabel(String appendixAutolabel) {
this.appendixAutolabel = appendixAutolabel;
}
public String getSectionAutolabel() {
return sectionAutolabel;
}
public void setSectionAutolabel(String sectionAutolabel) {
this.sectionAutolabel = sectionAutolabel;
}
public String getGlossaryCollection() {
return glossaryCollection;
}
public void setGlossaryCollection(String glossaryCollection) {
this.glossaryCollection = glossaryCollection;
}
public String getSectionLabelIncludesComponentLabel() {
return sectionLabelIncludesComponentLabel;
}
public void setSectionLabelIncludesComponentLabel(String sectionLabelIncludesComponentLabel) {
this.sectionLabelIncludesComponentLabel = sectionLabelIncludesComponentLabel;
}
public String getFormalProcedures() {
return formalProcedures;
}
public void setFormalProcedures(String formalProcedures) {
this.formalProcedures = formalProcedures;
}
public String getGenerateToc() {
return generateToc;
}
public void setGenerateToc(String generateToc) {
this.generateToc = generateToc;
}
public String getTocMaxDepth() {
return tocMaxDepth;
}
public void setTocSectionDepth(String tocSectionDepth) {
this.tocSectionDepth = tocSectionDepth;
}
public String getTocSectionDepth() {
return tocSectionDepth;
}
public void setTocMaxDepth(String tocMaxDepth) {
this.tocMaxDepth = tocMaxDepth;
}
public String getDraftStatus() {
return draftStatus;
}
public void setDraftStatus(String draftStatus) {
this.draftStatus = draftStatus;
}
public String getStatusBarText() {
return statusBarText;
}
public void setStatusBarText(String statusBarText) {
this.statusBarText = statusBarText;
}
public void setBodyFont(String bodyFont) {
this.bodyFont = bodyFont;
}
public String getBodyFont() {
return bodyFont;
}
public void setMonospaceFont(String monospaceFont) {
this.monospaceFont = monospaceFont;
}
public String getMonospaceFont() {
return monospaceFont;
}
public void setLocalFontPath(String localFontPath) {
this.localFontPath = localFontPath;
}
public String getLocalFontPath() {
return localFontPath;
}
public String getTrimWadlUriCount() {
return trimWadlUriCount;
}
public void setTrimWadlUriCount(String trimWadlUriCount) {
this.trimWadlUriCount = trimWadlUriCount;
}
public String getComputeWadlPathFromDocbookPath() {
return computeWadlPathFromDocbookPath;
}
public void setComputeWadlPathFromDocbookPath(
String computeWadlPathFromDocbookPath) {
this.computeWadlPathFromDocbookPath = computeWadlPathFromDocbookPath;
}
public String getPdfFilenameBase() {
return pdfFilenameBase;
}
public void setPdfFilenameBase(
String pdfFilenameBase) {
this.pdfFilenameBase = pdfFilenameBase;
}
public List getEntities() {
return entities;
}
public void setEntities(List entities) {
this.entities = entities;
}
/**
* Creates an XML entity resolver.
*
* @param resolver The initial resolver to use.
* @return The new XML entity resolver or null if there is no entities to resolve.
* @see com.agilejava.docbkx.maven.InjectingEntityResolver
*/
private InjectingEntityResolver createEntityResolver(EntityResolver resolver) {
if (getEntities() != null) {
return new InjectingEntityResolver(getEntities(), resolver, getType(), getLog());
} else {
return null;
}
}
protected String getNonDefaultStylesheetLocation() {
return "cloud/fo/docbook.xsl";
}
/**
* Returns the URL of the default stylesheet.
*
* @return The URL of the stylesheet.
*/
protected URL getNonDefaultStylesheetURL() {
if (getNonDefaultStylesheetLocation() != null) {
URL url = this.getClass().getClassLoader().getResource(getNonDefaultStylesheetLocation());
return url;
} else {
return null;
}
}
/**
* Returns the list of docbook files to include.
*/
private String[] scanIncludedFiles() {
final DirectoryScanner scanner = new DirectoryScanner();
scanner.setBasedir(sourceDirectory);
scanner.setIncludes(new String[]{inputFilename});
scanner.scan();
return scanner.getIncludedFiles();
}
/**
* Creates a CatalogManager
, used to resolve DTDs and other entities.
*
* @return A CatalogManager
to be used for resolving DTDs and other entities.
*/
protected CatalogManager createCatalogManager() {
CatalogManager manager = new CatalogManager();
manager.setIgnoreMissingProperties(true);
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
StringBuffer builder = new StringBuffer();
boolean first = true;
for (int i = 0; i < catalogs.length; i++) {
final String catalog = catalogs[i];
try {
Enumeration enumeration = classLoader.getResources(catalog);
while (enumeration.hasMoreElements()) {
if (!first) {
builder.append(';');
} else {
first = false;
}
URL resource = enumeration.nextElement();
builder.append(resource.toExternalForm());
}
} catch (IOException ioe) {
getLog().warn("Failed to search for catalog files: " + catalog);
// Let's be a little tolerant here.
}
}
//builder.append("jar:file:/Users/salmanqureshi/.m2/repository/net/sf/docbook/docbook-xsl/1.76.1/docbook-xsl-1.76.1-ns-resources.zip!/docbook/catalog.xml");
String catalogFiles = builder.toString();
if (catalogFiles.length() == 0) {
getLog().warn("Failed to find catalog files.");
} else {
if (getLog().isDebugEnabled()) {
getLog().debug("Catalogs to load: " + catalogFiles);
}
manager.setCatalogFiles(catalogFiles);
}
return manager;
}
/**
* Creates an URI resolver to handle urn:docbkx:stylesheet(/)
as a special URI. This URI points to the
* default docbook stylesheet location
*
* @param catalogResolver The initial resolver to use
* @return The Stylesheet resolver.
* @throws MojoExecutionException If an error occurs while reading the stylesheet
*/
private URIResolver createStyleSheetResolver(CatalogResolver catalogResolver) throws MojoExecutionException {
URIResolver uriResolver;
try {
URL url = getNonDefaultStylesheetURL() == null ? getDefaultStylesheetURL() : getNonDefaultStylesheetURL();
if (getLog().isDebugEnabled()) {
getLog().debug("Using stylesheet: " + url.toExternalForm());
}
uriResolver = new StylesheetResolver("urn:docbkx:stylesheet", new StreamSource(url.openStream(), url
.toExternalForm()), catalogResolver);
} catch (IOException ioe) {
throw new MojoExecutionException("Failed to read stylesheet.", ioe);
}
return uriResolver;
}
/**
* Returns the URL of the default stylesheet.
*
* @return The URL of the stylesheet.
*/
protected URL getDefaultStylesheetURL() {
URL url = this.getClass().getClassLoader().getResource(getDefaultStylesheetLocation());
return url;
}
public String getDefaultStylesheetLocation() {
return "docbook/fo/docbook.xsl";
}
public String getType() {
return "fo";
}
/**
* Constructs the default {@link TransformerBuilder}.
*/
protected TransformerBuilder createTransformerBuilder(URIResolver resolver) {
//return new CachingTransformerBuilder(new DefaultTransformerBuilder(resolver));
URIResolver resolver1 = new GlossaryResolver(new DocBookResolver (resolver, getType()), getType());
return new CachingTransformerBuilder(new DefaultTransformerBuilder(resolver1));
}
/**
* The default policy for constructing Transformers.
*/
private class DefaultTransformerBuilder implements TransformerBuilder {
/**
* The standard {@link URIResolver}.
*/
private URIResolver resolver;
public DefaultTransformerBuilder(URIResolver resolver) {
this.resolver = resolver;
}
public Transformer build() throws TransformerBuilderException {
Transformer transformer = createTransformer(resolver);
transformer.setURIResolver(resolver);
return transformer;
}
/**
* Returns a Transformer
capable of rendering a particular type of output from DocBook input.
*
* @param uriResolver
* @return A Transformer
capable of rendering a particular type of output from DocBook input.
* @throws MojoExecutionException If the operation fails to create a Transformer
.
*/
protected Transformer createTransformer(URIResolver uriResolver) throws TransformerBuilderException {
URL url = getStylesheetURL();
try {
TransformerFactory transformerFactory = new TransformerFactoryImpl();
transformerFactory.setURIResolver(uriResolver);
Source source = new StreamSource(url.openStream(), url.toExternalForm());
Transformer transformer = transformerFactory.newTransformer(source);
if (!isShowXslMessages()) {
Controller controller = (Controller) transformer;
try {
controller.makeMessageEmitter();
controller.getMessageEmitter().setWriter(new NullWriter());
} catch (TransformerException te) {
getLog().error("Failed to redirect xsl:message output.", te);
}
}
if (getCustomizationParameters() != null) {
final Iterator iterator = getCustomizationParameters().iterator();
while (iterator.hasNext()) {
Parameter param = iterator.next();
if (param.getName() != null) // who knows
{
transformer.setParameter(param.getName(), param.getValue());
}
}
}
//configure(transformer);
return transformer;
} catch (IOException ioe) {
throw new TransformerBuilderException("Failed to read stylesheet from " + url.toExternalForm(), ioe);
} catch (TransformerConfigurationException tce) {
throw new TransformerBuilderException("Failed to build Transformer from " + url.toExternalForm(), tce);
}
}
}
/**
* Returns the URL of the stylesheet. You can override this operation to return a URL pointing to a stylesheet residing
* on a location that can be adressed by a URL. By default, it will return a stylesheet that will be loaded from the
* classpath, using the resource name returned by {@link #getStylesheetLocation()}.
*
* @return The URL of the stylesheet.
*/
protected URL getStylesheetURL() {
URL url = this.getClass().getClassLoader().getResource(getStylesheetLocation());
if (url == null) {
try {
if (getStylesheetLocation().startsWith("http://")) {
return new URL(getStylesheetLocation());
}
return new File(getStylesheetLocation()).toURI().toURL();
} catch (MalformedURLException mue) {
return null;
}
} else {
return url;
}
}
public String getStylesheetLocation() {
if (foCustomization != null) {
return foCustomization;
} else if (getNonDefaultStylesheetLocation() == null) {
return getDefaultStylesheetLocation();
} else {
return getNonDefaultStylesheetLocation();
}
}
protected boolean isShowXslMessages() {
//return showXslMessages;
return false;
}
public List getCustomizationParameters()
{
return customizationParameters;
}
/**
* Returns the SAXParserFactory used for constructing parsers.
*/
private SAXParserFactory createParserFactory() {
SAXParserFactory factory = new SAXParserFactoryImpl();
factory.setXIncludeAware(getXIncludeSupported());
return factory;
}
private boolean getXIncludeSupported() { return true; }
/**
* Creates an XML Processing handler for the built-in docbkx <?eval?>
PI. This PI resolves maven
* properties and basic math formula.
*
* @param resolver The initial resolver to use.
* @param reader The source XML reader.
* @return The XML PI filter.
*/
private PreprocessingFilter createPIHandler(EntityResolver resolver, XMLReader reader) {
PreprocessingFilter filter = new PreprocessingFilter(reader);
ProcessingInstructionHandler resolvingHandler = new ExpressionHandler(new VariableResolver() {
public Object resolveVariable(String name) throws ELException {
if ("date".equals(name)) {
return DateFormat.getDateInstance(DateFormat.LONG).format(new Date());
} else if ("project".equals(name)) {
return getProject();
} else {
return getProject().getProperties().get(name);
}
}
}, getLog());
filter.setHandlers(Arrays.asList(new Object[] { resolvingHandler }));
filter.setEntityResolver(resolver);
return filter;
}
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter, Map map)
throws MojoExecutionException {
String pathToPipelineFile = "classpath:///pdf.xpl"; //use "classpath:///path" for this to work
String sourceFileNameNormalized = sourceFile.toURI().toString();
//from super
final InputSource inputSource = new InputSource(sourceFileNameNormalized);
Source source = new SAXSource(filter, inputSource);
Map localMap = new HashMap(map);
localMap.put("outputType", "pdf");
//removing webhelp specific settings from map
localMap.remove("webhelp");
localMap.remove("webhelp.war");
localMap.remove("groupId");
localMap.remove("artifactId");
localMap.remove("docProjectVersion");
return CalabashHelper.createSource(getLog(), source, pathToPipelineFile, localMap);
}
/**
* Main method.
* @param args command-line arguments
*/
public static void main(String[] args) {
try {
System.out.println("setting up fonts and images directories\n");
System.out.println("FOP ExampleFO2PDF\n");
System.out.println("Preparing...");
//Setup directories
File sourceDir = new File("/Users/salmanqureshi/Projects/Rackspace/Dev/compute-api-final/openstack-compute-api-2/src");
File baseDir = new File("/Users/salmanqureshi/Projects/Rackspace/Dev/compute-api-final/openstack-compute-api-2");
// File outDir = new File(baseDir, "out");
// outDir.mkdirs();
//Setup input and output files
//File fofile = new File(baseDir, "xml/fo/helloworld.fo");
//File fofile = new File(baseDir, "os-compute-devguide.fo");
//File fofile = new File(baseDir, "../fo/pagination/franklin_2pageseqs.fo");
//File pdffile = new File(outDir, "ResultFO2PDF.pdf");
//System.out.println("Input: XSL-FO (" + fofile + ")");
//System.out.println("Output: PDF (" + pdffile + ")");
System.out.println("Transforming...");
PDFBuilder pdfBuilder = new PDFBuilder();
File targetDir = new File(baseDir, "target/docbkx/pdf1");
pdfBuilder.setSourceDirectory(sourceDir);
pdfBuilder.setAutopdfTargetDirectory(targetDir);
pdfBuilder.setImageDirectory(targetDir.getParentFile());
pdfBuilder.setBranding("rackspace");
pdfBuilder.setInputFilename("os-compute-devguide.xml");
pdfBuilder.setSourceFilePath(new File(sourceDir, "os-compute-devguide.xml"));
pdfBuilder.setProjectBuildDirectory(sourceDir.getParentFile());
pdfBuilder.preProcess();
//File fofile = pdfBuilder.processSources();
//pdfBuilder.convertFO2PDF(fofile);
System.out.println("Success!");
} catch (Exception e) {
e.printStackTrace(System.err);
System.exit(-1);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy