All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.rackspace.cloud.api.docs.WebHelpMojo Maven / Gradle / Ivy

package com.rackspace.cloud.api.docs;

import java.net.*;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.sax.SAXSource;

import org.apache.maven.model.Dependency;
import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
import org.apache.maven.plugin.MojoExecutionException;
import org.w3c.dom.Document;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.agilejava.docbkx.maven.AbstractWebhelpMojo;
import com.agilejava.docbkx.maven.PreprocessingFilter;
import com.agilejava.docbkx.maven.TransformerBuilder;
import com.rackspace.cloud.api.docs.builders.PDFBuilder;
import com.rackspace.cloud.api.docs.CalabashHelper;
import com.rackspace.cloud.api.docs.DocBookResolver;
import com.agilejava.docbkx.maven.Parameter;
import com.agilejava.docbkx.maven.FileUtils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipOutputStream;

public abstract class WebHelpMojo extends AbstractWebhelpMojo {
    /**
     * Sets the URI for the glossary.
     *
     * @parameter expression="${glossary.uri}" default-value=""
     */
    private String glossaryUri;

    private File sourceDirectory;
    private File sourceDocBook;
    private File atomFeed;
    private File atomFeedClean;
    private static final String COPY_XSL = "cloud/webhelp/copy.xsl";

      /**
       * A reference to the project.
       *
       * @parameter expression="${project}"
       * @required
       * 
       * This value is injected by the nexus injection engine at runtime, and allows for retrieving pom.xml element values
       */
      private MavenProject docProject;

    /**
     * @parameter expression="${project.build.directory}"
     */
    private File projectBuildDirectory;
    
    /**
     * Controls whether to build webhelp war output or not.
     *
     * @parameter expression="${generate-webhelp.webhelp.war}" 
     */
    private String webhelpWar;

    /**
     * List of emails (comma delimited) to send a notification to when
     * a war is deployed in autopublish.
     *
     * @parameter expression="${generate-webhelp.publicationNotificationEmails}" 
     */
    private String publicationNotificationEmails;

    /**
     * Controls whether the pubdate is included in the pdf file name.
     * 
     * @parameter expression="${generate-webhelp.includeDateInPdfFilename}" 
     */
    private String includeDateInPdfFilename;

    /**
     * Base for the pdf file name. By default this is the 
     * base of the input xml file.
     * 
     * @parameter expression="${generate-webhelp.pdfFilenameBase}" 
     */
    private String pdfFilenameBase;

    /**
     * Base for the webhelp dir name. By default this is the 
     * base of the input xml file.
     * 
     * @parameter expression="${generate-webhelp.webhelpDirname}" 
     */
    private String webhelpDirname;

    /**
     * Controls whether output is colorized based on revisionflag attributes.
     *
     * @parameter expression="${generate-webhelp.show.changebars}"
     */
    private String showChangebars;
    
     /**
     * Display built for OpenStack logo?
     *
     * @parameter expression="${generate-webhelp.builtForOpenStack}" 
     */
    private String builtForOpenStack;


    /**
     * Path to an alternative cover logo.
     *
     * @parameter expression="${generate-pdf.coverLogoPath}" default-value=""
     */
    private String coverLogoPath;

    /**
     * Path to an alternative cover logo.
     *
     * @parameter expression="${generate-webhelp.secondaryCoverLogoPath}" 
     */
    private String secondaryCoverLogoPath;


    /**
     * Distance from the left edge of the page at which the 
     * cover logo is displayed. 
     *
     * @parameter expression="${generate-webhelp.coverLogoLeft}" default-value=""
     */
    private String coverLogoLeft;

    /**
     * Distance from the top of the page at which teh 
     * cover logo is displayed.
     *
     * @parameter expression="${generate-webhelp.coverLogoTop}" default-value=""
     */
    private String coverLogoTop;

    /**
     * url to display under the cover logo. 
     *
     * @parameter expression="${generate-webhelp.coverUrl}" default-value=""
     */
    private String coverUrl;

    /**
     * The color to use for the polygon on the cover
     *
     * @parameter expression="${generate-webhelp.coverColor}" default-value=""
     */
    private String coverColor;

    /**
     * 
     *
     * @parameter expression="${generate-pdf.pageWidth}" default-value=""
     */
    private String pageWidth;

    /**
     * 
     *
     * @parameter expression="${generate-pdf.pageHeight}" default-value=""
     */
    private String pageHeight;
    /**
     * Should cover be omitted?
     *
     * @parameter expression="${generate-pdf.omitCover}" default-value=""
     */
    private String omitCover;

    /**
     * Double sided pdfs?
     *
     * @parameter expression="${generate-pdf.doubleSided}" default-value=""
     */
    private String doubleSided;


    /**
     * Controls whether output is colorized based on revisionflag attributes.
     *
     * @parameter expression="${generate-webhelp.meta.robots}" 
     */
    private String metaRobots;

    /**
     * Controls whether the version string is used as part of the Disqus identifier.
     *
     * @parameter expression="${generate-webhelp.use.version.for.disqus}" default-value="0"
     */
    private String useVersionForDisqus;

    /**
     * Controls whether the disqus identifier is used.
     *
     * @parameter expression="${generate-webhelp.use.disqus.id}" default-value="1"
     */
    private String useDisqusId;

    /**
     * Controls whether the disqus identifier is used.
     *
     * @parameter expression="${generate-webhelp.disqus_identifier}" 
     */
    private String disqusIdentifier;

    /**
     * Controls the branding of the output.
     *
     * @parameter expression="${generate-webhelp.branding}" default-value="rackspace"
     */
    private String branding;

    /**
     * Controls whether Disqus comments appear at the bottom of each page.
     *
     * @parameter expression="${generate-webhelp.enable.disqus}" default-value="0"
     */
    private String enableDisqus;

    /**
     * A parameter used by the Disqus comments.
     *
     * @parameter expression="${generate-webhelp.disqus.shortname}" default-value=""
     */
    private String disqusShortname;

    /**
     * A parameter used to control whether to include Google Analytics goo.
     *
     * @parameter expression="${generate-webhelp.enable.google.analytics}" default-value=""
     */
    private String enableGoogleAnalytics;

    /**
     * A parameter used to control whether to include Google Analytics goo.
     *
     * @parameter expression="${generate-webhelp.google.analytics.id}" default-value=""
     */
    private String googleAnalyticsId;
    
    /**
     * A parameter used to control whether to include Google Analytics goo.
     *
     * @parameter expression="${generate-webhelp.google.analytics.domain}" default-value=""
     */    
    private String googleAnalyticsDomain;

    /**
     * A parameter used to specify the path to the pdf for download in webhelp.
     *
     * @parameter expression="${generate-webhelp.pdf.url}" default-value=""
     */
    private String pdfUrl;

    /**
     * If makePdf is set to true then just before creating the Webhelp output this variable will be set
     * with the location of the automatically created pdf file. 
     */
    private String autoPdfUrl;

    /**
     * A parameter used to control whether the autoPdfUrl is changed
     * to end with -latest.pdf instead of being the actual file name. 
     *
     * @parameter expression="${generate-webhelp.useLatestSuffixInPdfUrl}" 
     */
    private String useLatestSuffixInPdfUrl;

    /**
     * @parameter 
     *     expression="${generate-webhelp.canonicalUrlBase}"
     *     default-value=""
     */
    private String canonicalUrlBase;

    /**
     * @parameter 
     *     expression="${generate-webhelp.replacementsFile}"
     *     default-value="replacements.config"
     */
    private String replacementsFile;
    
    /**
     * @parameter 
     *     expression="${generate-webhelp.makePdf}"
     *     default-value=true
     */
    private boolean makePdf;

    /**
     * @parameter
     *     expression="${generate-webhelp.strictImageValidation}"
     *     default-value=true
     */
    private boolean strictImageValidation;
    
    /**
     * 
     * @parameter 
     *     expression="${generate-webhelp.failOnValidationError}"
     *     default-value="yes"
     */
    private String failOnValidationError;

    /**
     * 
     * @parameter 
     *     expression="${generate-webhelp.commentsPhp}"
     */
    private String commentsPhp;

    
    /**
     * A parameter used to specify the security level (external, internal, reviewer, writeronly) of the document.
     *
     * @parameter 
     *     expression="${generate-webhelp.security}" 
     *     default-value="external"
     */
    private String security;
 
    /**
     * 
     *
     * @parameter expression="${basedir}"
     */
    private File baseDir;

    /**
     * A parameter used to specify the presence of extensions metadata.
     *
     * @parameter 
     *     expression="${generate-webhelp.includes}" 
     *     default-value=""
     */
    private String transformDir;   
    
    /**
     * A parameter used to configure how many elements to trim from the URI in the documentation for a wadl method.
     *
     * @parameter expression="${generate-webhelp.trim.wadl.uri.count}" default-value=""
     */
    private String trimWadlUriCount;

    /**
     * Controls how the path to the wadl is calculated. If 0 or not set, then
     * The xslts look for the normalized wadl in /generated-resources/xml/xslt/.
     * Otherwise, in /generated-resources/xml/xslt/path/to/docbook-src, e.g.
     * /generated-resources/xml/xslt/src/docbkx/foo.wadl
     *
     * @parameter expression="${generate-webhelp.compute.wadl.path.from.docbook.path}" default-value="0"
     */
    private String computeWadlPathFromDocbookPath;

     /**
      * Sets the email for TildeHash (internal) comments. Note that this
      * doesn't affect Disqus comments.
      *
      * @parameter expression="${generate-webhelp.feedback.email}" default-value=""
      */
    private String feedbackEmail;

     /**
      * Controls whether or not the social icons are displayed.
      *
      * @parameter expression="${generate-webhelp.social.icons}" default-value="0"
      */
    private String socialIcons;
    /**
     * A parameter used to specify the path to the lega notice in webhelp.
     *
     * @parameter expression="${generate-webhelp.legal.notice.url}" default-value="index.html"
     */
    private String legalNoticeUrl;

    /**
     * 
     *
     * @parameter expression="${generate-webhelp.draft.status}" default-value=""
     */
    private String draftStatus;

    /**
     * 
     *
     * @parameter expression="${generate-webhelp.draft.status}" default-value=""
     */
    private String statusBarText;
    
    /**
     *
     * @parameter expression="${generate-webhelp.bodyFont}"
     */
    private String bodyFont;

    /**
     *
     * @parameter expression="${generate-webhelp.monospaceFont}"
     */
    private String monospaceFont;

    /**
     *
     * @parameter expression="${generate-webhelp.localFontPath}"
     */
    private String localFontPath;

    /**
     * DOCUMENT ME!
     *
     * @param transformer    DOCUMENT ME!
     * @param sourceFilename DOCUMENT ME!
     * @param targetFile     DOCUMENT ME!
     */
    public void adjustTransformer(Transformer transformer, String sourceFilename, File targetFile) {
        GitHelper.addCommitProperties(transformer, baseDir, 7, getLog());

	String warBasename;
	String webhelpOutdir = targetFile.getName().substring(0, targetFile.getName().lastIndexOf('.'));
	if(null != webhelpDirname && !webhelpDirname.isEmpty()){
	    warBasename = webhelpDirname;
	} else {
	    warBasename = webhelpOutdir;
	}


	targetFile = new File( getTargetDirectory() + "/" + warBasename + "/dummy.webhelp" );

        super.adjustTransformer(transformer, sourceFilename, targetFile);
                    
        
                    
    transformer.setParameter("groupId", docProject.getGroupId());
    transformer.setParameter("artifactId", docProject.getArtifactId());
    transformer.setParameter("docProjectVersion", docProject.getVersion());
    transformer.setParameter("pomProjectName", docProject.getName());
    if(commentsPhp != null){
	transformer.setParameter("comments.php", commentsPhp);
    }            
    if(glossaryUri != null){
	  transformer.setParameter("glossary.uri", glossaryUri);
    }

    if(feedbackEmail != null){
      transformer.setParameter("feedback.email", feedbackEmail);
    }


    if(useDisqusId != null){
	transformer.setParameter("use.disqus.id", useDisqusId);
    }

        if (useVersionForDisqus != null) {
            transformer.setParameter("use.version.for.disqus", useVersionForDisqus);
        }
        transformer.setParameter("project.build.directory", projectBuildDirectory.toURI().toString());
        transformer.setParameter("branding", branding);
        
        //if the pdf is generated automatically with webhelp then this will be set.
        transformer.setParameter("autoPdfUrl", autoPdfUrl);
        
	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); 
	}


        transformer.setParameter("enable.disqus", enableDisqus);
        if (disqusShortname != null) {
            transformer.setParameter("disqus.shortname", disqusShortname);
        }
        if (disqusIdentifier != null) {
            transformer.setParameter("disqus_identifier", disqusIdentifier);
        }

        if (enableGoogleAnalytics != null) {
            transformer.setParameter("enable.google.analytics", enableGoogleAnalytics);
        }
        if (googleAnalyticsId != null) {
            transformer.setParameter("google.analytics.id", googleAnalyticsId);
        }
        if(googleAnalyticsDomain != null){
        	transformer.setParameter("google.analytics.domain", googleAnalyticsDomain);
        }
        if (pdfUrl != null) {
            transformer.setParameter("pdf.url", pdfUrl);
        }
        if (useLatestSuffixInPdfUrl != null) {
            transformer.setParameter("useLatestSuffixInPdfUrl", useLatestSuffixInPdfUrl);
        }
        if (legalNoticeUrl != null) {
            transformer.setParameter("legal.notice.url", legalNoticeUrl);
        }
        
    String sysWebhelpWar=System.getProperty("webhelp.war");
	if(null!=sysWebhelpWar && !sysWebhelpWar.isEmpty()){
	    webhelpWar=sysWebhelpWar;
	}
	transformer.setParameter("webhelp.war", webhelpWar);

	if(null != includeDateInPdfFilename){
	    transformer.setParameter("includeDateInPdfFilename", includeDateInPdfFilename); 
	}
	transformer.setParameter("pdfFilenameBase", pdfFilenameBase); 
	transformer.setParameter("webhelpDirname", webhelpDirname); 

	transformer.setParameter("publicationNotificationEmails", publicationNotificationEmails);

	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(canonicalUrlBase != null){
	transformer.setParameter("canonical.url.base",canonicalUrlBase);
    }

    String sysSecurity=System.getProperty("security");
    if(null!=sysSecurity && !sysSecurity.isEmpty()){
	security=sysSecurity;
    }
    if(security != null){
	transformer.setParameter("security",security);
    }
   if(showChangebars != null){
	transformer.setParameter("show.changebars",showChangebars);
    }
   if(metaRobots != null){
	transformer.setParameter("meta.robots",metaRobots);
    }
   if(trimWadlUriCount != null){
	transformer.setParameter("trim.wadl.uri.count",trimWadlUriCount);
    }

	transformer.setParameter("social.icons",socialIcons);

   sourceDocBook = new File(sourceFilename);
   sourceDirectory = sourceDocBook.getParentFile();
   transformer.setParameter("docbook.infile",sourceDocBook.toURI().toString());
   transformer.setParameter("source.directory",sourceDirectory.toURI().toString());
   transformer.setParameter("compute.wadl.path.from.docbook.path",computeWadlPathFromDocbookPath);

    }

    protected TransformerBuilder createTransformerBuilder(URIResolver resolver) {
        return super.createTransformerBuilder(new DocBookResolver(resolver, getType()));
    }

    //Note for this to work, you need to have the customization layer in place.
    protected String getNonDefaultStylesheetLocation() {
        return "cloud/webhelp/profile-webhelp.xsl";
    }

    public void postProcessResult(File result) throws MojoExecutionException {
	
	String warBasename;
	String webhelpOutdir = result.getName().substring(0, result.getName().lastIndexOf('.'));
	if(null != webhelpDirname && !webhelpDirname.isEmpty()){
	    warBasename = webhelpDirname;
	} else {
	    warBasename = webhelpOutdir;
	}	
	result = new File( getTargetDirectory() + "/" + warBasename + "/" + "dummy.xml" );

	super.postProcessResult(result);
	
	copyTemplate(result);
    
	transformFeed(result);
	       

	//final File targetDirectory = result.getParentFile();
	//com.rackspace.cloud.api.docs.FileUtils.extractJaredDirectory("apiref",ApiRefMojo.class,targetDirectory);
        
	Properties properties = new Properties();
	InputStream is = null;
	
	try {
	    File f = new File(result.getParentFile(), "webapp/WEB-INF/bookinfo.properties");
	    is = new FileInputStream( f );
	    properties.load(is);
	}
	catch ( Exception e ) { 
	    System.out.println("Got an Exception: " + e.getMessage());          
	}

	warBasename = warBasename == null ? null : new File(warBasename).getName();

	String warSuffix = webhelpDirname != null ? "" : properties.getProperty("warsuffix","");
	String warPrefix = webhelpDirname != null ? "" : properties.getProperty("warprefix","");
	String warSuffixForWar = warSuffix.equals("-external") ? "" : warSuffix;
	if(null != webhelpWar && !"0".equals(webhelpWar)){
	    //Zip up the war from here.
	    File sourceDir = new File(result.getParentFile().getParentFile(), warBasename);
	    File zipFile = new File(result.getParentFile().getParentFile(), warPrefix + warBasename + warSuffixForWar + ".war");
	    //result.deleteOnExit();

	    try{
		//create object of FileOutputStream
		FileOutputStream fout = new FileOutputStream(zipFile);
                                         
		//create object of ZipOutputStream from FileOutputStream
		ZipOutputStream zout = new ZipOutputStream(fout);
                               
		com.rackspace.cloud.api.docs.FileUtils.addDirectory(zout, sourceDir);
                               
		//close the ZipOutputStream
		zout.close();
                                                              
	    }catch(IOException ioe){
		System.out.println("IOException :" + ioe);     
	    }
	}

	//	if(null == webhelpWar || webhelpWar.equals("0")){
	    //TODO: Move dir to add warsuffix/security value
	    //String sourceDir = result.getParentFile().getParentFile()  + "/" + warBasename ;
	    File webhelpDirWithSecurity = new File(result.getParentFile().getParentFile(), warBasename + warSuffix);
	    File webhelpOrigDir = new File(result.getParentFile().getParentFile(), webhelpOutdir );
	    boolean success = webhelpOrigDir.renameTo(webhelpDirWithSecurity);
	    //}
    }

    protected void copyTemplate(File result) throws MojoExecutionException {

        final File targetDirectory = result.getParentFile(); 

        com.rackspace.cloud.api.docs.FileUtils.extractJaredDirectory("content", WebHelpMojo.class, targetDirectory);
        com.rackspace.cloud.api.docs.FileUtils.extractJaredDirectory("common", WebHelpMojo.class, targetDirectory);
        com.agilejava.docbkx.maven.FileUtils.copyFile(new File(targetDirectory, "common/images/favicon-" + branding + ".ico"), new File(targetDirectory, "favicon.ico"));
        com.agilejava.docbkx.maven.FileUtils.copyFile(new File(targetDirectory, "common/css/positioning-" + branding + ".css"), new File(targetDirectory, "common/css/positioning.css"));
        com.agilejava.docbkx.maven.FileUtils.copyFile(new File(targetDirectory, "common/main-" + branding + ".js"), new File(targetDirectory, "common/main.js"));
    }


    protected void transformFeed(File result) throws MojoExecutionException {
        try {
	    atomFeed = new File (result.getParentFile(),"atom-doctype.xml");
	    atomFeedClean = new File (result.getParentFile(),"atom.xml");

	    if(!atomFeed.isFile()){
		return;
	    }

            ClassLoader classLoader = Thread.currentThread()
                                            .getContextClassLoader();

            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer(new StreamSource(classLoader.getResourceAsStream(COPY_XSL)));


            DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
            dbfactory.setValidating(false);
            DocumentBuilder builder = dbfactory.newDocumentBuilder();
            builder.setEntityResolver(new EntityResolver() {
                @Override
                public InputSource resolveEntity(String publicId, String systemId)
                        throws SAXException, IOException {
                    return new InputSource(new StringReader(""));
                }
            });

            Document xmlDocument = builder.parse(atomFeed);
            DOMSource source = new DOMSource(xmlDocument);

            transformer.transform(source, new StreamResult(atomFeedClean));

            atomFeed.deleteOnExit();

        }
        catch (TransformerConfigurationException e)
            {
            throw new MojoExecutionException("Failed to load JAXP configuration", e);
            }
	catch (javax.xml.parsers.ParserConfigurationException e)
	    {
            throw new MojoExecutionException("Failed to configure parser", e);
	    }
	catch (org.xml.sax.SAXException e)
	    {
            throw new MojoExecutionException("Sax exception", e);
	    }
	catch(java.io.IOException e)
	    {
            throw new MojoExecutionException("IO Exception", e);
	    }
        catch (TransformerException e)
            {
            throw new MojoExecutionException("Failed to transform to atom feed", e);
        }

    }
    

    public void preProcess() throws MojoExecutionException {
        super.preProcess();

        final File targetDirectory = getTargetDirectory();
        File xslParentDirectory  = targetDirectory.getParentFile();

        if (!targetDirectory.exists()) {
            com.rackspace.cloud.api.docs.FileUtils.mkdir(targetDirectory);
        }

        //
        // Extract all images into the image directory.
        //
        com.rackspace.cloud.api.docs.FileUtils.extractJaredDirectory("cloud/war",PDFMojo.class,xslParentDirectory);
        com.rackspace.cloud.api.docs.FileUtils.extractJaredDirectory("cloud/webhelp",PDFMojo.class,xslParentDirectory);
    }

    @Override
    protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter)
            throws MojoExecutionException {

        String pathToPipelineFile = "classpath:///webhelp.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);
	//Source source = super.createSource(inputFilename, sourceFile, filter);

        Map map = new HashMap();
        
        
        String sysWebhelpWar=System.getProperty("webhelp.war");
    	if(null!=sysWebhelpWar && !sysWebhelpWar.isEmpty()){
    	    webhelpWar=sysWebhelpWar;
    	}

	String targetDirString = "";
	
	try{
	    targetDirString = this.getTargetDirectory().getParentFile().getCanonicalPath().replace(File.separatorChar, '/');
	}catch(Exception e){
	    getLog().info("Exceptional!" + e);
	}
	//Get all the plugins entries from the pom.xml
	List plugins=docProject.getBuildPlugins();
	String clouddocsMavenPluginDocbook="false";
	
	//The pom.xml of each docbook that uses the rax-autodeploy project to deploy .war's to production, must depend on the 
	//clouddocs-maven-plugin-docbook. To enforce this, we check all the  elements that is a child of the 
	// element. If such  element has a value of "clouddocs-maven-plugin-docbook" then we set the 
	//clouddocsMavenPluginDocbook="true" otherwise we leave the value as "false"
	if(null!=plugins){
		for (Object pluginObject : plugins){
			if (!(pluginObject instanceof Plugin)) {
				continue;
			}

			Plugin aPlugin = (Plugin)pluginObject;
			System.out.println("!@#!@#!@#!@#!@#!@#!@#!@#!@#!@#!@#!@#!@#!@#!@#!@#!@#aPlugin.getArtifactId()="+aPlugin.getArtifactId());
			String artifactId=aPlugin.getArtifactId();
			if(null!=artifactId && artifactId.equals("clouddocs-maven-plugin-docbook")){
				clouddocsMavenPluginDocbook="true";
				break;
			}
		}
	}
	
	//If we do not detect an  child element of the  element with a value of "clouddocs-maven-plugin-docbook"
	//then we should check all the  elements to see if any   child element of the  element
	//has the value of "clouddocs-maven-plugin-docbook"
	if(null!=clouddocsMavenPluginDocbook && clouddocsMavenPluginDocbook.equals("false")){
		Listdependencies=docProject.getDependencies();
		for(Object dependencyObject:dependencies){
			if (!(dependencyObject instanceof Dependency)) {
				continue;
			}

			Dependency aDependency = (Dependency)dependencyObject;
			System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&aDependency.getArtifactId()="+aDependency.getArtifactId());
		    String artifactId=aDependency.getArtifactId();
		    if(null!=artifactId && artifactId.equals("clouddocs-maven-plugin-docbook")){
		    	clouddocsMavenPluginDocbook="true";
		    	break;
		    }
		}
	}
	
	map.put("targetDirectory", getTargetDirectory().getParentFile());
	//Add the clouddocsDocbook parameter to the pipeline so that it is 
	//available to the bookinfo.xsl xslt file
	map.put("clouddocsDocbook", clouddocsMavenPluginDocbook);
    map.put("webhelp.war", webhelpWar);
	map.put("publicationNotificationEmails", publicationNotificationEmails);
        map.put("includeDateInPdfFilename", includeDateInPdfFilename);    
        map.put("pdfFilenameBase", pdfFilenameBase);    
        map.put("webhelpDirname", webhelpDirname);    
        map.put("groupId", docProject.getGroupId());
        map.put("artifactId", docProject.getArtifactId());
        map.put("docProjectVersion", docProject.getVersion());
	map.put("pomProjectName", docProject.getName());
        map.put("security", this.security);
        map.put("branding", this.branding);
        map.put("canonicalUrlBase", this.canonicalUrlBase);
        map.put("replacementsFile", this.replacementsFile);
        map.put("failOnValidationError", this.failOnValidationError);
        map.put("comments.php", this.commentsPhp);
        map.put("project.build.directory", this.projectBuildDirectory);
        map.put("inputSrcFile", inputFilename);
        map.put("strictImageValidation", String.valueOf(this.strictImageValidation));
        map.put("trim.wadl.uri.count", this.trimWadlUriCount);
        map.put("status.bar.text", getProperty("statusBarText"));
        map.put("bodyFont", getProperty("bodyFont"));
        map.put("monospaceFont", getProperty("monospaceFont"));
        map.put("draft.status", getProperty("draftStatus"));
        
        // Profiling attrs:        
        map.put("profile.os", getProperty("profileOs"));
        map.put("profile.arch", getProperty("profileArch"));
        map.put("profile.condition", getProperty("profileCondition"));
        map.put("profile.audience", getProperty("profileAudience"));
        map.put("profile.conformance", getProperty("profileConformance"));
        map.put("profile.revision", getProperty("profileRevision"));
        map.put("profile.userlevel", getProperty("profileUserlevel"));
        map.put("profile.vendor", getProperty("profileVendor"));

        int lastSlash=inputFilename.lastIndexOf("/");
	//This is the case if the path includes a relative path
	if (-1!=lastSlash){
        	String theFileName=inputFilename.substring(lastSlash);
        	String theDirName=inputFilename.substring(0,lastSlash);
            
        	int index = theFileName.indexOf('.');
        	if(-1!=index){
            	String targetFile=  getTargetDirectory() + "/" + theDirName+theFileName.substring(0,index)+"/content/"+"ext_query.xml";

            	map.put("targetExtQueryFile", targetFile);     
		map.put("targetHtmlContentDir", new File(getTargetDirectory(), theDirName+theFileName.substring(0,index) + "/content/"));
            	map.put("base.dir", new File(getTargetDirectory(), theDirName+theFileName.substring(0,index)));
            	map.put("input.filename",theDirName+theFileName.substring(0,index));
        	}
        	else{
        		//getLog().info("~~~~~~~~theFileName file has incompatible format: "+theFileName);
        	}

        }
        //This is the case when it's just a file name with no path information
        else {
        	String theFileName=inputFilename;
        	int index = theFileName.indexOf('.');
        	if(-1!=index){
            	File targetFile= new File(getTargetDirectory(), theFileName.substring(0,index)+"/content/ext_query.xml");
            	map.put("targetExtQueryFile", targetFile);  
		map.put("targetHtmlContentDir", new File(getTargetDirectory(), theFileName.substring(0,index) + "/content/"));
            	
            	File targetDir = new File(getTargetDirectory(), theFileName.substring(0,index) + "/");
            	map.put("base.dir", targetDir);        		
            	map.put("input.filename", theFileName.substring(0,index));  	      		
        	}
        	else{
        		//getLog().info("~~~~~~~~inputFilename file has incompatible format: "+inputFilename);
        	}
        }

        if (null != webhelpDirname && !webhelpDirname.isEmpty() ) {

	    map.put("targetExtQueryFile", new File(getTargetDirectory(), webhelpDirname + "/content/ext_query.xml"));
	    map.put("base.dir", new File(getTargetDirectory(), webhelpDirname));
	    map.put("targetHtmlContentDir", new File(getTargetDirectory(), webhelpDirname + "/content/"));
	}

        
        //targetExtQueryFile can tell us where the html will be built. We pass this absolute path to the
        //pipeline so that the copy-and-transform-image step can use it to calculate where to place the images.

	map.put("targetDir", new File(baseDir, "figures"));

	// getLog().info("~~~~~~~~FOOBAR~~~~~~~~~~~~~~~~:");
	// getLog().info("~~~~~~~~baseDir:" + baseDir);
	// getLog().info("~~~~~~~~projectBuildDirectory:" + projectBuildDirectory);
	// getLog().info("~~~~~~~~targetDirectory:"+ getTargetDirectory());
	// getLog().info("~~~~~~~~targetDirectory (map.put):" + this.getTargetDirectory().getParentFile().getAbsolutePath());
	// getLog().info("~~~~~~~~inputFilename:" + inputFilename);
	// getLog().info("~~~~~~~~targetExtQueryFile:" + map.get("targetExtQueryFile"));
        // getLog().info("~~~~~~~~targetHtmlContentDir:" + map.get("targetHtmlContentDir"));
	// getLog().info("~~~~~~~~targetDir:" + map.get("targetDir"));	
	// getLog().info("~~~~~~~~FOOBAR~~~~~~~~~~~~~~~~:");

        //makePdf is a POM configuration for generate-webhelp goal to control the execution of
        //automatic building of pdf output
        if(this.makePdf) {
	    if (getLog().isDebugEnabled()) {
        	getLog().info("\n************************************* START: Automatically generating PDF for WEBHELP *************************************");
	    }
        	//Target directory for Webhelp points to ${basepath}/target/docbkx/webhelp. So get parent.
        	File baseDir = getTargetDirectory().getParentFile();
        	//The point FO/PDF file output to be generated at ${basepath}/target/docbkx/autopdf.
        	File targetDir = new File(baseDir.getAbsolutePath(), "autopdf");
        	//Create a new instance of PDFBuilder class and set config variables.
        	PDFBuilder pdfBuilder = new PDFBuilder();
        	
        	pdfBuilder.setProject(getMavenProject());
        	pdfBuilder.setSourceDirectory(getSourceDirectory());
        	pdfBuilder.setAutopdfTargetDirectory(targetDir);
        	pdfBuilder.setCoverColor(coverColor);

        	pdfBuilder.setPageWidth(pageWidth);
        	pdfBuilder.setPageHeight(pageHeight);
        	pdfBuilder.setOmitCover(omitCover);
        	pdfBuilder.setDoubleSided(doubleSided);

        	pdfBuilder.setCoverLogoPath(coverLogoPath);
        	pdfBuilder.setSecondaryCoverLogoPath(secondaryCoverLogoPath);
        	pdfBuilder.setCoverLogoLeft(coverLogoLeft);
        	pdfBuilder.setCoverLogoTop(coverLogoTop);
        	pdfBuilder.setCoverUrl(coverUrl);
		pdfBuilder.setPdfFilenameBase(pdfFilenameBase);
        	        	
        	pdfBuilder.setBranding(branding);
        	pdfBuilder.setBuiltForOpenStack(builtForOpenStack);
        	pdfBuilder.setSecurity(security);
        	pdfBuilder.setDraftStatus(draftStatus);
        	pdfBuilder.setStatusBarText(statusBarText);
        	pdfBuilder.setBodyFont(bodyFont);
        	pdfBuilder.setMonospaceFont(monospaceFont);
        	pdfBuilder.setLocalFontPath(localFontPath);
        	pdfBuilder.setTrimWadlUriCount(trimWadlUriCount);
        	pdfBuilder.setComputeWadlPathFromDocbookPath(computeWadlPathFromDocbookPath);
        	
        	pdfBuilder.setInputFilename(inputFilename);
        	pdfBuilder.setEntities(getEntities());

        	pdfBuilder.setChapterAutolabel(getProperty("chapterAutolabel"));
        	pdfBuilder.setAppendixAutolabel(getProperty("appendixAutolabel"));
        	pdfBuilder.setSectionAutolabel(getProperty("sectionAutolabel"));
        	pdfBuilder.setSectionLabelIncludesComponentLabel(getProperty("sectionLabelIncludesComponentLabel"));
		pdfBuilder.setFormalProcedures(getProperty("formalProcedures"));
		pdfBuilder.setGenerateToc(getProperty("generateToc"));
		pdfBuilder.setTocMaxDepth(getProperty("tocMaxDepth"));
		pdfBuilder.setTocSectionDepth(getProperty("tocSectionDepth"));
        	pdfBuilder.setGlossaryCollection(getProperty("glossaryCollection"));

        	File srcFilename = new File(this.projectBuildDirectory, "docbkx/"+sourceFile.getName());
	    	if(srcFilename.exists()) {
		    if (getLog().isDebugEnabled()) {
	    		getLog().debug("***********************"+ srcFilename);
		    }
	    		pdfBuilder.setSourceFilePath(srcFilename);
	    	} else {
		    if (getLog().isDebugEnabled()) {
	    		getLog().debug("***********************"+ getSourceDirectory()+File.separator+inputFilename);
		    }
	    		pdfBuilder.setSourceFilePath(new File(getSourceDirectory(), inputFilename));
	    	}
        	
        	pdfBuilder.setProjectBuildDirectory(baseDir);
        	//setup fonts and images 
        	pdfBuilder.preProcess();
        	//process input docbook to create FO file

        	File foFile = pdfBuilder.processSources(map);
        	//transform FO file to PDF
        	File pdfFile = pdfBuilder.postProcessResult(foFile);
        	//move PDF to where the webhelp stuff is for this docbook.
        	if(pdfFile!=null) {
		    File targetDirForPdf = ((File)map.get("targetHtmlContentDir")).getParentFile();
        		if(!targetDirForPdf.exists()) {
        			com.rackspace.cloud.api.docs.FileUtils.mkdir(targetDirForPdf);
        		}
        		boolean moved = pdfBuilder.movePdfToWebhelpDir(pdfFile, targetDirForPdf);
        		if(moved && getLog().isDebugEnabled()) {
        			getLog().info("Successfully moved auto-generated PDF file to Webhelp target directory!");
        		} else if(getLog().isDebugEnabled()) {
        			getLog().error("Unable to move auto-generated PDF file to Webhelp target directory!");
        		}
        	}
        	autoPdfUrl = "../"+foFile.getName();
		if (getLog().isDebugEnabled()) {
		    getLog().info("************************************* END: Automatically generating PDF for WEBHELP *************************************\n");
		}
        }

        
        map.put("webhelp", "true");
	map.put("autoPdfUrl",autoPdfUrl);
        //this parameter will be used the copy and transform image step to decide whether to just check the existence of an image (for pdf)
        //or to check existence, transform and copy image as well (for html)
        map.put("outputType", "html");

        return CalabashHelper.createSource(getLog(), source, pathToPipelineFile, map);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy