aboutsummaryrefslogtreecommitdiff
path: root/runners/maven-plugin/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'runners/maven-plugin/src/main')
-rw-r--r--runners/maven-plugin/src/main/kotlin/DokkaMojo.kt258
-rw-r--r--runners/maven-plugin/src/main/kotlin/MavenDokkaLogger.kt23
2 files changed, 201 insertions, 80 deletions
diff --git a/runners/maven-plugin/src/main/kotlin/DokkaMojo.kt b/runners/maven-plugin/src/main/kotlin/DokkaMojo.kt
index 1cbe39f3..514df151 100644
--- a/runners/maven-plugin/src/main/kotlin/DokkaMojo.kt
+++ b/runners/maven-plugin/src/main/kotlin/DokkaMojo.kt
@@ -3,15 +3,32 @@ package org.jetbrains.dokka.maven
import org.apache.maven.archiver.MavenArchiveConfiguration
import org.apache.maven.archiver.MavenArchiver
import org.apache.maven.execution.MavenSession
+import org.apache.maven.model.Dependency
import org.apache.maven.plugin.AbstractMojo
import org.apache.maven.plugin.MojoExecutionException
import org.apache.maven.plugins.annotations.*
import org.apache.maven.project.MavenProject
import org.apache.maven.project.MavenProjectHelper
+import org.apache.maven.repository.internal.MavenRepositorySystemUtils
import org.codehaus.plexus.archiver.Archiver
import org.codehaus.plexus.archiver.jar.JarArchiver
+import org.eclipse.aether.DefaultRepositorySystemSession
+import org.eclipse.aether.RepositorySystem
+import org.eclipse.aether.RepositorySystemSession
+import org.eclipse.aether.artifact.DefaultArtifact
+import org.eclipse.aether.collection.CollectRequest
+import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory
+import org.eclipse.aether.graph.DependencyNode
+import org.eclipse.aether.impl.DefaultServiceLocator
+import org.eclipse.aether.repository.LocalRepository
+import org.eclipse.aether.repository.RemoteRepository
+import org.eclipse.aether.resolution.DependencyRequest
+import org.eclipse.aether.spi.connector.RepositoryConnectorFactory
+import org.eclipse.aether.spi.connector.transport.TransporterFactory
+import org.eclipse.aether.transport.file.FileTransporterFactory
+import org.eclipse.aether.transport.http.HttpTransporterFactory
+import org.eclipse.aether.util.graph.visitor.PreorderNodeListGenerator
import org.jetbrains.dokka.*
-import org.jetbrains.dokka.Utilities.defaultLinks
import java.io.File
import java.net.URL
@@ -30,36 +47,47 @@ class ExternalDocumentationLinkBuilder : DokkaConfiguration.ExternalDocumentatio
@Parameter(name = "url", required = true)
override var url: URL? = null
+
@Parameter(name = "packageListUrl", required = true)
override var packageListUrl: URL? = null
}
-abstract class AbstractDokkaMojo : AbstractMojo() {
+abstract class AbstractDokkaMojo(private val defaultDokkaPlugins: List<Dependency>) : AbstractMojo() {
class SourceRoot : DokkaConfiguration.SourceRoot {
@Parameter(required = true)
override var path: String = ""
}
+ @Parameter(defaultValue = "\${project}", readonly = true)
+ private var mavenProject: MavenProject? = null
+
+ @Parameter()
+ private var session: RepositorySystemSession? = null
+
class PackageOptions : DokkaConfiguration.PackageOptions {
@Parameter
override var prefix: String = ""
+
@Parameter
- override var includeNonPublic: Boolean = false
+ override var includeNonPublic: Boolean = DokkaDefaults.includeNonPublic
+
@Parameter
- override var reportUndocumented: Boolean = true
+ override var reportUndocumented: Boolean = DokkaDefaults.reportUndocumented
+
@Parameter
- override var skipDeprecated: Boolean = false
+ override var skipDeprecated: Boolean = DokkaDefaults.skipDeprecated
+
@Parameter
- override var suppress: Boolean = false
+ override var suppress: Boolean = DokkaDefaults.suppress
}
+ @Parameter
+ var sourceSetName: String = "JVM"
+
@Parameter(required = true, defaultValue = "\${project.compileSourceRoots}")
var sourceDirectories: List<String> = emptyList()
@Parameter
- var sourceRoots: List<SourceRoot> = emptyList()
-
- @Parameter
var samples: List<String> = emptyList()
@Parameter
@@ -74,18 +102,23 @@ abstract class AbstractDokkaMojo : AbstractMojo() {
@Parameter(required = true, defaultValue = "\${project.artifactId}")
var moduleName: String = ""
+ @Parameter
+ var moduleDisplayName: String = ""
+
@Parameter(required = false, defaultValue = "false")
var skip: Boolean = false
- @Parameter(required = false, defaultValue = "6")
- var jdkVersion: Int = 6
+ @Parameter(required = false, defaultValue = "${DokkaDefaults.jdkVersion}")
+ var jdkVersion: Int = DokkaDefaults.jdkVersion
@Parameter
- var skipDeprecated: Boolean = false
+ var skipDeprecated: Boolean = DokkaDefaults.skipDeprecated
+
@Parameter
- var skipEmptyPackages: Boolean = true
+ var skipEmptyPackages: Boolean = DokkaDefaults.skipEmptyPackages
+
@Parameter
- var reportUndocumented: Boolean = true
+ var reportUndocumented: Boolean = DokkaDefaults.reportUndocumented
@Parameter
var impliedPlatforms: List<String> = emptyList()
@@ -96,15 +129,21 @@ abstract class AbstractDokkaMojo : AbstractMojo() {
@Parameter
var externalDocumentationLinks: List<ExternalDocumentationLinkBuilder> = emptyList()
- @Parameter(defaultValue = "false")
- var noStdlibLink: Boolean = false
+ @Parameter(defaultValue = "${DokkaDefaults.noStdlibLink}")
+ var noStdlibLink: Boolean = DokkaDefaults.noStdlibLink
- @Parameter(defaultValue = "false")
- var noJdkLink: Boolean = false
+ @Parameter(defaultValue = "${DokkaDefaults.noJdkLink}")
+ var noJdkLink: Boolean = DokkaDefaults.noJdkLink
@Parameter
var cacheRoot: String? = null
+ @Parameter(defaultValue = "JVM")
+ var displayName: String = "JVM"
+
+ @Parameter(defaultValue = "${DokkaDefaults.offlineMode}")
+ var offlineMode: Boolean = DokkaDefaults.offlineMode
+
@Parameter
var languageVersion: String? = null
@@ -112,33 +151,26 @@ abstract class AbstractDokkaMojo : AbstractMojo() {
var apiVersion: String? = null
@Parameter
- var includeRootPackage: Boolean = false
-
- @Parameter
- var suppressedFiles: List<String> = emptyList()
+ var includeRootPackage: Boolean = DokkaDefaults.includeRootPackage
@Parameter
- var collectInheritedExtensionsFromLibraries: Boolean = false
+ var suppressedFiles: List<String> = emptyList()
@Parameter
var platform: String = ""
@Parameter
- var targets: List<String> = emptyList()
+ var includeNonPublic: Boolean = DokkaDefaults.includeNonPublic
@Parameter
- var sinceKotlin: String? = null
+ var failOnWarning: Boolean = DokkaDefaults.failOnWarning
@Parameter
- var includeNonPublic: Boolean = false
-
- @Parameter
- var generateIndexPages: Boolean = false
+ var dokkaPlugins: List<Dependency> = emptyList()
+ get() = field + defaultDokkaPlugins
protected abstract fun getOutDir(): String
- protected abstract fun getOutFormat(): String
-
override fun execute() {
if (skip) {
log.info("Dokka skip parameter is true so no dokka output will be produced")
@@ -150,18 +182,36 @@ abstract class AbstractDokkaMojo : AbstractMojo() {
throw MojoExecutionException("Incorrect path property, only Unix based path allowed.")
}
}
+ fun defaultLinks(config: DokkaSourceSetImpl): List<ExternalDocumentationLinkImpl> {
+ val links = mutableListOf<ExternalDocumentationLinkImpl>()
+ if (!config.noJdkLink)
+ links += DokkaConfiguration.ExternalDocumentationLink
+ .Builder("https://docs.oracle.com/javase/${config.jdkVersion}/docs/api/")
+ .build() as ExternalDocumentationLinkImpl
+
+ if (!config.noStdlibLink)
+ links += DokkaConfiguration.ExternalDocumentationLink
+ .Builder("https://kotlinlang.org/api/latest/jvm/stdlib/")
+ .build() as ExternalDocumentationLinkImpl
+ return links
+ }
- val passConfiguration = PassConfigurationImpl(
+ val sourceSet = DokkaSourceSetImpl(
+ moduleDisplayName = moduleDisplayName.takeIf(String::isNotBlank) ?: moduleName,
+ displayName = displayName,
+ sourceSetID = DokkaSourceSetID(moduleName, sourceSetName),
classpath = classpath,
- sourceRoots = sourceDirectories.map { SourceRootImpl(it) } + sourceRoots.map { SourceRootImpl(path = it.path) },
+ sourceRoots = sourceDirectories.map { SourceRootImpl(it) },
+ dependentSourceSets = emptySet(),
samples = samples,
includes = includes,
- collectInheritedExtensionsFromLibraries = collectInheritedExtensionsFromLibraries, // TODO: Should we implement this?
- sourceLinks = sourceLinks.map { SourceLinkDefinitionImpl(it.path, it.url, it.lineSuffix) },
- jdkVersion = jdkVersion,
- skipDeprecated = skipDeprecated,
- skipEmptyPackages = skipEmptyPackages,
+ includeNonPublic = includeNonPublic,
+ includeRootPackage = includeRootPackage,
reportUndocumented = reportUndocumented,
+ skipEmptyPackages = skipEmptyPackages,
+ skipDeprecated = skipDeprecated,
+ jdkVersion = jdkVersion,
+ sourceLinks = sourceLinks.map { SourceLinkDefinitionImpl(it.path, it.url, it.lineSuffix) },
perPackageOptions = perPackageOptions.map {
PackageOptionsImpl(
prefix = it.prefix,
@@ -169,61 +219,132 @@ abstract class AbstractDokkaMojo : AbstractMojo() {
reportUndocumented = it.reportUndocumented,
skipDeprecated = it.skipDeprecated,
suppress = it.suppress
- )},
+ )
+ },
externalDocumentationLinks = externalDocumentationLinks.map { it.build() as ExternalDocumentationLinkImpl },
- noStdlibLink = noStdlibLink,
- noJdkLink = noJdkLink,
languageVersion = languageVersion,
apiVersion = apiVersion,
- moduleName = moduleName,
+ noStdlibLink = noStdlibLink,
+ noJdkLink = noJdkLink,
suppressedFiles = suppressedFiles,
- sinceKotlin = sinceKotlin,
- analysisPlatform = if (platform.isNotEmpty()) Platform.fromString(platform) else Platform.DEFAULT,
- targets = targets,
- includeNonPublic = includeNonPublic,
- includeRootPackage = includeRootPackage
- )
+ analysisPlatform = if (platform.isNotEmpty()) Platform.fromString(platform) else Platform.DEFAULT
+ ).let {
+ it.copy(
+ externalDocumentationLinks = defaultLinks(it) + it.externalDocumentationLinks
+ )
+ }
- passConfiguration.externalDocumentationLinks += passConfiguration.defaultLinks()
+ val logger = MavenDokkaLogger(log)
val configuration = DokkaConfigurationImpl(
outputDir = getOutDir(),
- format = getOutFormat(),
- impliedPlatforms = impliedPlatforms,
+ offlineMode = offlineMode,
cacheRoot = cacheRoot,
- passesConfigurations = listOf(passConfiguration),
- generateIndexPages = generateIndexPages
+ sourceSets = listOf(sourceSet).also {
+ if (sourceSet.moduleDisplayName.isEmpty()) logger.warn("Not specified module name. It can result in unexpected behaviour while including documentation for module")
+ },
+ pluginsClasspath = getArtifactByAether("org.jetbrains.dokka", "dokka-base", dokkaVersion) +
+ dokkaPlugins.map { getArtifactByAether(it.groupId, it.artifactId, it.version ?: dokkaVersion) }.flatten(),
+ pluginsConfiguration = mutableMapOf(), //TODO implement as it is in Gradle
+ modules = emptyList(),
+ failOnWarning = failOnWarning
)
- val gen = DokkaGenerator(configuration, MavenDokkaLogger(log))
+ val gen = DokkaGenerator(configuration, logger)
gen.generate()
}
-}
-@Mojo(name = "dokka", defaultPhase = LifecyclePhase.PRE_SITE, threadSafe = true, requiresDependencyResolution = ResolutionScope.COMPILE, requiresProject = true)
-class DokkaMojo : AbstractDokkaMojo() {
- @Parameter(required = true, defaultValue = "html")
- var outputFormat: String = "html"
+ private fun newRepositorySystem(): RepositorySystem {
+ val locator: DefaultServiceLocator = MavenRepositorySystemUtils.newServiceLocator()
+ locator.addService(RepositoryConnectorFactory::class.java, BasicRepositoryConnectorFactory::class.java)
+ locator.addService(TransporterFactory::class.java, FileTransporterFactory::class.java)
+ locator.addService(TransporterFactory::class.java, HttpTransporterFactory::class.java)
+ return locator.getService(RepositorySystem::class.java)
+ }
+
+ private fun newSession(system: RepositorySystem): RepositorySystemSession {
+ val session: DefaultRepositorySystemSession =
+ MavenRepositorySystemUtils.newSession()
+ val localRepo = LocalRepository(System.getProperty("user.home") + "/.m2/repository")
+ session.localRepositoryManager = system.newLocalRepositoryManager(session, localRepo)
+ return session
+ }
+
+ private fun getArtifactByAether(
+ groupId: String,
+ artifactId: String,
+ version: String
+ ): List<File> {
+ val repoSystem: RepositorySystem = newRepositorySystem()
+ val session: RepositorySystemSession = newSession(repoSystem)
+ val dependency =
+ org.eclipse.aether.graph.Dependency(DefaultArtifact("$groupId:$artifactId:$version"), "compile")
+ val collectRequest = CollectRequest()
+ collectRequest.root = dependency
+ val repositories: List<RemoteRepository> =
+ (mavenProject?.remoteProjectRepositories?.plus(mavenProject?.remotePluginRepositories ?: emptyList())
+ ?: mavenProject?.remotePluginRepositories ?: emptyList())
+ repositories.forEach {
+ collectRequest.addRepository(
+ RemoteRepository.Builder(
+ "repo",
+ "default",
+ it.url
+ ).build()
+ )
+ }
+ val node: DependencyNode = repoSystem.collectDependencies(session, collectRequest).root
+ val dependencyRequest = DependencyRequest()
+ dependencyRequest.root = node
+ repoSystem.resolveDependencies(session, dependencyRequest)
+ val nlg = PreorderNodeListGenerator()
+ node.accept(nlg)
+ return nlg.files
+ }
+
+ private val dokkaVersion: String by lazy {
+ mavenProject?.pluginArtifacts?.filter { it.groupId == "org.jetbrains.dokka" && it.artifactId == "dokka-maven-plugin" }
+ ?.firstOrNull()?.version ?: throw IllegalStateException("Not found dokka plugin")
+ }
+}
+@Mojo(
+ name = "dokka",
+ defaultPhase = LifecyclePhase.PRE_SITE,
+ threadSafe = true,
+ requiresDependencyResolution = ResolutionScope.COMPILE,
+ requiresProject = true
+)
+class DokkaMojo : AbstractDokkaMojo(emptyList()) {
@Parameter(required = true, defaultValue = "\${project.basedir}/target/dokka")
var outputDir: String = ""
- override fun getOutFormat() = outputFormat
override fun getOutDir() = outputDir
}
-@Mojo(name = "javadoc", defaultPhase = LifecyclePhase.PRE_SITE, threadSafe = true, requiresDependencyResolution = ResolutionScope.COMPILE, requiresProject = true)
-class DokkaJavadocMojo : AbstractDokkaMojo() {
+@Mojo(
+ name = "javadoc",
+ defaultPhase = LifecyclePhase.PRE_SITE,
+ threadSafe = true,
+ requiresDependencyResolution = ResolutionScope.COMPILE,
+ requiresProject = true
+)
+class DokkaJavadocMojo : AbstractDokkaMojo(listOf(javadocDependency)) {
@Parameter(required = true, defaultValue = "\${project.basedir}/target/dokkaJavadoc")
var outputDir: String = ""
- override fun getOutFormat() = "javadoc"
override fun getOutDir() = outputDir
}
-@Mojo(name = "javadocJar", defaultPhase = LifecyclePhase.PRE_SITE, threadSafe = true, requiresDependencyResolution = ResolutionScope.COMPILE, requiresProject = true)
-class DokkaJavadocJarMojo : AbstractDokkaMojo() {
+@Mojo(
+ name = "javadocJar",
+ defaultPhase = LifecyclePhase.PRE_SITE,
+ threadSafe = true,
+ requiresDependencyResolution = ResolutionScope.COMPILE,
+ requiresProject = true
+)
+class DokkaJavadocJarMojo : AbstractDokkaMojo(listOf(javadocDependency)) {
@Parameter(required = true, defaultValue = "\${project.basedir}/target/dokkaJavadocJar")
var outputDir: String = ""
@@ -268,12 +389,11 @@ class DokkaJavadocJarMojo : AbstractDokkaMojo() {
@Component(role = Archiver::class, hint = "jar")
private var jarArchiver: JarArchiver? = null
- override fun getOutFormat() = "javadoc"
override fun getOutDir() = outputDir
override fun execute() {
super.execute()
- if(!File(outputDir).exists()) {
+ if (!File(outputDir).exists()) {
log.warn("No javadoc generated so no javadoc jar will be generated")
return
}
@@ -298,3 +418,7 @@ class DokkaJavadocJarMojo : AbstractDokkaMojo() {
}
}
+private val javadocDependency = Dependency().apply {
+ groupId = "org.jetbrains.dokka"
+ artifactId = "javadoc-plugin"
+}
diff --git a/runners/maven-plugin/src/main/kotlin/MavenDokkaLogger.kt b/runners/maven-plugin/src/main/kotlin/MavenDokkaLogger.kt
index a535c807..4b5f4fa9 100644
--- a/runners/maven-plugin/src/main/kotlin/MavenDokkaLogger.kt
+++ b/runners/maven-plugin/src/main/kotlin/MavenDokkaLogger.kt
@@ -1,18 +1,15 @@
package org.jetbrains.dokka.maven
import org.apache.maven.plugin.logging.Log
-import org.jetbrains.dokka.DokkaLogger
+import org.jetbrains.dokka.utilities.DokkaLogger
class MavenDokkaLogger(val log: Log) : DokkaLogger {
- override fun error(message: String) {
- log.error(message)
- }
-
- override fun info(message: String) {
- log.info(message)
- }
-
- override fun warn(message: String) {
- log.warn(message)
- }
-} \ No newline at end of file
+ override var warningsCount: Int = 0
+ override var errorsCount: Int = 0
+
+ override fun debug(message: String) = log.debug(message)
+ override fun info(message: String) = log.info(message)
+ override fun progress(message: String) = log.info(message)
+ override fun warn(message: String) = log.warn(message).also { warningsCount++ }
+ override fun error(message: String) = log.error(message).also { errorsCount++ }
+}