diff src/main/groovy/org/ssdt_ohio/gradle/tasks/UserDoc.groovy @ 13:a628135958e7

USASR-1307: inititial userdoc plugin/task to produce customizable groovy doc
author Dave Smith <smith@nwoca.org>
date Tue, 10 Dec 2013 22:53:57 +0000
parents
children 9de72de14ab3
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/groovy/org/ssdt_ohio/gradle/tasks/UserDoc.groovy	Tue Dec 10 22:53:57 2013 +0000
@@ -0,0 +1,178 @@
+package org.ssdt_ohio.gradle.tasks
+
+import org.codehaus.groovy.tools.groovydoc.ClasspathResourceManager
+import org.codehaus.groovy.tools.groovydoc.FileOutputTool
+import org.codehaus.groovy.tools.groovydoc.GroovyDocTool
+import org.codehaus.groovy.tools.groovydoc.gstringTemplates.GroovyDocTemplateInfo
+import org.gradle.api.InvalidUserDataException
+import org.gradle.api.file.FileCollection
+import org.gradle.api.file.FileVisitDetails
+import org.gradle.api.internal.ClassPathRegistry
+import org.gradle.api.logging.LogLevel
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.SourceTask
+import org.gradle.api.tasks.TaskAction
+
+class UserDoc extends SourceTask {
+
+    private FileCollection groovyClasspath;
+
+    private FileCollection classpath;
+
+    private File destinationDir;
+
+    ClassPathRegistry classPathRegistry
+
+    public UserDoc() {
+        getLogging().captureStandardOutput(LogLevel.INFO);
+        classPathRegistry = getServices().get(ClassPathRegistry.class);
+    }
+
+    @TaskAction
+    protected void generate() {
+        checkGroovyClasspathNonEmpty(getGroovyClasspath().getFiles());
+
+        def tmpDir = new File(project.buildDir, "tmp/userdoc")
+        logger.debug("userdoc tmpDir: $tmpDir")
+        project.delete tmpDir
+        logger.debug("userdoc source: ${super.source.collect { it.toString() }}")
+        project.copy {
+            from super.getSource()
+            into tmpDir
+        }
+
+        def args = [:]
+        args.sourcepath = tmpDir.toString()
+        args.destdir = destinationDir
+
+        Properties properties = new Properties();
+//        properties.setProperty("windowTitle", windowTitle);
+//        properties.setProperty("docTitle", docTitle);
+//        properties.setProperty("footer", footer);
+//        properties.setProperty("header", header);
+//        checkScopeProperties(properties);
+//        properties.setProperty("publicScope", publicScope.toString());
+//        properties.setProperty("protectedScope", protectedScope.toString());
+//        properties.setProperty("packageScope", packageScope.toString());
+//        properties.setProperty("privateScope", privateScope.toString());
+//        properties.setProperty("author", author.toString());
+//        properties.setProperty("processScripts", processScripts.toString());
+//        properties.setProperty("includeMainForScripts", includeMainForScripts.toString());
+//        properties.setProperty("overviewFile", overviewFile != null ? overviewFile.getAbsolutePath() : "");
+//        properties.setProperty("charset", charset != null ? charset : "");
+//        properties.setProperty("fileEncoding", fileEncoding != null ? fileEncoding : "");
+//
+
+        def tool = new GroovyDocTool(new ClasspathResourceManager(),
+                [tmpDir.getPath()] as String[],
+                getDocTemplates(),
+                getPackageTemplates(),
+                getClassTemplates(), [],
+                properties)
+
+        def addFiles = []
+
+        super.getSource().visit { FileVisitDetails d ->
+            if (d.file.isFile()) {
+                addFiles << d.getRelativePath().toString()
+            }
+        }
+
+        tool.add(addFiles)
+        tool.renderToOutput(new FileOutputTool(), destinationDir.getCanonicalPath())
+    }
+
+    private void checkGroovyClasspathNonEmpty(Collection<File> classpath) {
+        if (classpath.isEmpty()) {
+            throw new InvalidUserDataException("You must assign a Groovy library to the groovy configuration!");
+        }
+    }
+
+    /**
+     * Returns the directory to generate the documentation into.
+     *
+     * @return The directory to generate the documentation into
+     */
+    @OutputDirectory
+    public File getDestinationDir() {
+        return destinationDir;
+    }
+
+    /**
+     * Sets the directory to generate the documentation into.
+     */
+    public void setDestinationDir(File destinationDir) {
+        this.destinationDir = destinationDir;
+    }
+
+    /**
+     * Returns the classpath containing the Groovy library to be used.
+     *
+     * @return The classpath containing the Groovy library to be used
+     */
+    @InputFiles
+    public FileCollection getGroovyClasspath() {
+        return groovyClasspath;
+    }
+
+    /**
+     * Sets the classpath containing the Groovy library to be used.
+     */
+    public void setGroovyClasspath(FileCollection groovyClasspath) {
+        this.groovyClasspath = groovyClasspath;
+    }
+
+    /**
+     * Returns the classpath used to locate classes referenced by the documented sources.
+     *
+     * @return The classpath used to locate classes referenced by the documented sources
+     */
+    @InputFiles
+    public FileCollection getClasspath() {
+        return classpath;
+    }
+
+    /**
+     * Sets the classpath used to locate classes referenced by the documented sources.
+     */
+    public void setClasspath(FileCollection classpath) {
+        this.classpath = classpath;
+    }
+
+    /**
+     * Creates and returns an array of package template classpath entries.
+     * <p>
+     * This method is meant to be overridden by custom GroovyDoc implementations, using custom package templates.
+     *
+     * @return an array of package templates, whereas each entry is resolved as classpath entry, defaults to
+     * {@link GroovyDocTemplateInfo#DEFAULT_PACKAGE_TEMPLATES}.
+     */
+    protected String[] getPackageTemplates() {
+        return GroovyDocTemplateInfo.DEFAULT_PACKAGE_TEMPLATES;
+    }
+
+    /**
+     * Creates and returns an array of doc template classpath entries.
+     * <p>
+     * This method is meant to be overridden by custom GroovyDoc implementations, using custom doc templates.
+     *
+     * @return an array of doc templates, whereas each entry is resolved as classpath entry, defaults to
+     * {@link GroovyDocTemplateInfo#DEFAULT_DOC_TEMPLATES}.
+     */
+    protected String[] getDocTemplates() {
+        return GroovyDocTemplateInfo.DEFAULT_DOC_TEMPLATES;
+    }
+
+    /**
+     * Creates and returns an array of class template classpath entries.
+     * <p>
+     * This method is meant to be overridden by custom GroovyDoc implementations, using custom class templates.
+     *
+     * @return an array of class templates, whereas each entry is resolved as classpath entry, defaults to
+     * {@link GroovyDocTemplateInfo#DEFAULT_CLASS_TEMPLATES}.
+     */
+    protected String[] getClassTemplates() {
+        return GroovyDocTemplateInfo.DEFAULT_CLASS_TEMPLATES;
+    }
+}