diff --git a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt index 9c8aa302..0b4d2e4b 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt @@ -88,11 +88,6 @@ fun Project.javaCompiler(init: JavaConfig.() -> Unit) = (Kobalt.findPlugin(JavaPlugin.PLUGIN_NAME) as JavaPlugin).addConfiguration(this, config) } -class JavadocConfig(val project: Project) { - val args = arrayListOf() - fun args(vararg options: String) = args.addAll(options) -} - @Directive fun Project.javadoc(init: JavadocConfig.() -> Unit) = JavadocConfig(this).also { config -> diff --git a/src/main/kotlin/com/beust/kobalt/plugin/java/JavadocConfig.kt b/src/main/kotlin/com/beust/kobalt/plugin/java/JavadocConfig.kt new file mode 100644 index 00000000..f1f94b61 --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/plugin/java/JavadocConfig.kt @@ -0,0 +1,602 @@ +package com.beust.kobalt.plugin.java + +import com.beust.kobalt.api.Project +import com.google.inject.Singleton +import java.io.BufferedReader +import java.io.File +import java.io.InputStream +import java.io.InputStreamReader +import java.util.concurrent.TimeUnit + +@Singleton +class JavadocConfig(val project: Project) { + val args = arrayListOf("-Xdoclint:none", "-Xmaxerrs", "1", "-quiet") + + private fun removeArg(match: String, startsWith: Boolean = false, pair: Boolean = false) { + val it = args.iterator() + while (it.hasNext()) { + val next = it.next() + var removed = false + if (startsWith) { + if (next.startsWith(match)) { + it.remove() + removed = true + } + } else if (next == match) { + it.remove() + removed = true + } + // If it's a pair, delete the next arg too. + if (pair && removed && it.hasNext()) { + it.next() + it.remove() + } + } + } + + private fun addInt(option: String, value: Int): Int { + args.add("-$option") + args.add(value.toString()) + return value + } + + private fun addBoolean(option: String, value: Boolean): Boolean { + args.remove("-$option") + if (value) { + args.add("-$option") + } + return value + } + + private fun addString(option: String, value: String): String { + if (value.isNotEmpty()) { + args.add("-$option") + args.add("\"$value\"") + } + return value + } + + private fun addStrings(option: String, vararg value: String) { + value.forEach { + addString(option, it) + } + } + + private fun addOptions(option: String, first: String, second: String) { + if (first.isNotEmpty() && second.isNotEmpty()) { + args.add("-$option") + args.add("\"$first\"") + args.add("\"$second\"") + } + } + + private fun addFile(option: String, value: String): String { + val f = File(value) + if (f.exists()) { + args.add("-$option") + args.add("\"${f.absolutePath}\"") + } + return value + } + + /** + * Set arguments manually. + */ + fun args(vararg options: String) = args.addAll(options) + + // + // Jvm Options + // + + /** + * @see -Xdoclint + */ + var docLint: String = "none" + set(value) { + removeArg("-Xdoclint:", startsWith = true) + addString("Xdoclint:", value) + } + + /** + * @see -Xmaxerrs + */ + var maxErrs: Int = 1 + set(value) { + removeArg("-Xmaxerrs", startsWith = true, pair = true) + addInt("Xmaxerrs", value) + } + + /** + * @see -Xmaxwarns + */ + var maxWarns: Int = 1 + set(value) { + removeArg("-Xmaxwarns", startsWith = true, pair = true) + addInt("Xmaxwarns", value) + } + + // + // Javadoc Options + // + + /** + * @see -overview + */ + var overview: String = "" + set(value) { + addFile("overview", value) + } + + /** + * @see -public + */ + var public: Boolean = false + set(value) { + addBoolean("public", value) + } + + /** + * @see -protected + */ + var protected: Boolean = false + set(value) { + addBoolean("protected", value) + } + + /** + * @see -pakage + */ + var pkg: Boolean = false + set(value) { + addBoolean("package", pkg) + } + + /** + * @see -private + */ + var private: Boolean = false + set(value) { + addBoolean("private", private) + } + + /** + * @see -doclet + */ + var doclet: String = "" + set(value) { + addString("doclet", value) + } + + /** + * @see -docletpath + */ + var docletPath: String = "" + set(value) { + addString("docletpath", value) + } + + /** + * @see -source + */ + var source: String = "" + set(value) { + addString("source", source) + } + + /** + * @see -sourcepath + */ + var sourcePath: String = "" + set(value) { + addString("sourcepath", value) + } + + /** + * @see -classpath + */ + var classPath: String = "" + set(value) { + addString("classpath", value) + } + + /** + * @see -subpackages + */ + var subPackages: String = "" + set(value) { + addString("subpackages", value) + } + + /** + * @see -exclude + */ + var exclude: String = "" + set(value) { + addString("exclude", value) + } + + /** + * @see -bootClassPath + */ + var bootClassPath: String = "" + set(value) { + addString("bootclasspath", value) + } + + /** + * @see -extdirs + */ + var extDirs: String = "" + set(value) { + addString("extdirs", value) + } + + /** + * @see -verbose + */ + var verbose: Boolean = false + set(value) { + addBoolean("verbose", value) + } + + /** + * @see -quiet + */ + var quiet: Boolean = true + set(value) { + addBoolean("quiet", value) + } + + /** + * @see -breakiterator + */ + var breakIterator: Boolean = false + set(value) { + addBoolean("breakiterator", value) + } + + /** + * @see -locale + */ + var locale: String = "" + set(value) { + addString("locale", value) + } + + /** + * @see -encoding + */ + var encoding: String = "" + set(value) { + addString("encoding", value) + } + + /** + * @see -Jflag + */ + var jFlag: String = "" + set(value) { + addString("J-", value) + } + + // + // Standard Doclet + // + + /** + * @see -use + */ + var use: Boolean = false + set(value) { + addBoolean("use", value) + } + + /** + * @see -version + */ + var version: Boolean = false + set(value) { + addBoolean("version", value) + } + + /** + * @see -author + */ + var author: Boolean = false + set(value) { + addBoolean("author", value) + } + + /** + * @see -splitindex + */ + var splitIndex: Boolean = false + set(value) { + addBoolean("splitindex", value) + } + + /** + * Set both the [windowTitle] and [docTitle] + */ + var title: String = "" + set(value) { + addString("windowtitle", value) + addString("doctitle", value) + } + + /** + * @see -windowtitle + */ + var windowTitle: String = "" + set(value) { + addString("windowtitle", value) + } + + /** + * @see -doctitle + */ + var docTitle: String = "" + set(value) { + addString("doctitle", value) + } + + /** + * @see -header + */ + var header: String = "" + set(value) { + addString("header", value) + } + + /** + * @see -footer + */ + var footer: String = "" + set(value) { + addString("footer", value) + } + + /** + * @see -top + */ + var top: String = "" + set(value) { + addString("top", value) + } + + /** + * @see -bottom + */ + var bottom: String = "" + set(value) { + addString("bottom", value) + } + + /** + * @see -linksource + */ + var linkSource: Boolean = false + set(value) { + addBoolean("linksource", value) + } + + /** + * @see -nodeprecated + */ + var noDeprecated: Boolean = false + set(value) { + addBoolean("nodeprecated", value) + } + + /** + * @see -nodeprecatedlist + */ + var noDeprecatedList: Boolean = false + set(value) { + addBoolean("nodeprecatedlist", value) + } + + /** + * @see -nosince + */ + var noSince: Boolean = false + set(value) { + addBoolean("nosince", value) + } + + /** + * @see -notree + */ + var noTree: Boolean = false + set(value) { + addBoolean("notree", value) + } + + /** + * @see -noindex + */ + var noIndex: Boolean = false + set(value) { + addBoolean("noindex", value) + } + + /** + * @see -nohelp + */ + var noHelp: Boolean = false + set(value) { + addBoolean("nohelp", value) + } + + /** + * @see -nonavbar + */ + var noNavBar: Boolean = false + set(value) { + addBoolean("nonavbar", value) + } + + /** + * @see -helpfile + */ + var helpFile: String = "" + set(value) { + addFile("helpfile", value) + } + + /** + * @see -stylesheet + */ + var stylesheet: String = "" + set(value) { + addFile("stylesheet", value) + } + + /** + * @see -serialwarn + */ + var serialWarn: Boolean = false + set(value) { + addBoolean("serialwarn", value) + } + + /** + * @see -charset + */ + var charSet: String = "" + set(value) { + addString("charset", value) + } + + /** + * @see -docencoding + */ + var docEncoding: String = "" + set(value) { + addString("docencoding", value) + } + + /** + * @see -keywords + */ + var keywords: Boolean = false + set(value) { + addBoolean("keywords", value) + } + + /** + * @see -tagletpath + */ + var tagletPath: String = "" + set(value) { + addString("tagletpath", value) + } + + /** + * @see -docfilessubdirs + */ + var docFilesSubDirs: Boolean = false + set(value) { + addBoolean("docfilessubdirs", value) + } + + /** + * @see -excludedocfilessubdir + */ + var excludeDocFilesSubDir: String = "" + set(value) { + addString("excludedocfilessubdir", value) + } + + /** + * @see -noqualifiers + */ + var noQualifiers: String = "" + set(value) { + addString("noqualifier", value) + } + + /** + * @see -notimestamp + */ + var noTimestamp: Boolean = false + set(value) { + addBoolean("notimestamp", value) + } + + /** + * @see -nocomment + */ + var noComment: Boolean = false + set(value) { + addBoolean("nocomment", value) + } + + /** + * @see -sourcetab + */ + var sourceTab: String = "" + set(value) { + addString("sourcetab", value) + } + + /** + * @see -group + */ + fun group(groupHeading: String, packagePattern: String) = addOptions("group", groupHeading, packagePattern) + + /** + * @see -linkoffline + */ + fun linkOffline(extdocURL: String, packagelistLoc: String) = addOptions("linkoffline", extdocURL, packagelistLoc) + + /** + * @see -link + */ + fun links(vararg links: String) = addStrings("link", *links) + + /** + * @see -tag + */ + fun tags(vararg tags: String) = addStrings("tag", *tags) + + /** + * @see -taglets + */ + fun taglets(vararg taglets: String) = addStrings("taglet", *taglets) +} + +fun main(args: Array) { + fun fromStream(ins: InputStream): List { + val result = arrayListOf() + val br = BufferedReader(InputStreamReader(ins)) + var line = br.readLine() + + while (line != null) { + result.add(line) + println(line) + line = br.readLine() + } + + return result + } + + val config = JavadocConfig(Project()) + config.verbose = true + config.quiet = false + config.links("http://docs.oracle.com/javase/8/docs/api/") + config.args.add(0, ".\\kobaltBuild\\docs\\javadoc") + config.args.add(0, "-d") + config.args.add(0, "javadoc") + config.args.add(".\\modules\\wrapper\\src\\main\\java\\com\\beust\\kobalt\\wrapper\\Config.java") + config.args.add(".\\modules\\wrapper\\src\\main\\java\\com\\beust\\kobalt\\wrapper\\Main.java") + + println(config.args.joinToString(" ")) + + val pb = ProcessBuilder().command(config.args.toList()) + pb.directory(File(".")) + val proc = pb.start() + val err = proc.waitFor(30, TimeUnit.SECONDS) + val stdout = if (proc.inputStream.available() > 0) fromStream(proc.inputStream) else emptyList() + val stderr = if (proc.errorStream.available() > 0) fromStream(proc.errorStream) else emptyList() +} \ No newline at end of file