mirror of
https://github.com/ethauvin/kobalt.git
synced 2025-04-26 16:28:12 -07:00
Aether work.
This commit is contained in:
parent
2ce833c6c5
commit
8d4b26a0bd
12 changed files with 507 additions and 46 deletions
|
@ -26,6 +26,9 @@ object Versions {
|
||||||
val okio = "1.6.0"
|
val okio = "1.6.0"
|
||||||
val retrofit = "2.0.0"
|
val retrofit = "2.0.0"
|
||||||
val gson = "2.6.2"
|
val gson = "2.6.2"
|
||||||
|
val aether = "1.1.0"
|
||||||
|
val sonatypeAether = "1.13.1"
|
||||||
|
val maven = "3.3.9"
|
||||||
}
|
}
|
||||||
|
|
||||||
val wrapper = project {
|
val wrapper = project {
|
||||||
|
@ -73,14 +76,24 @@ val kobaltPluginApi = project {
|
||||||
"com.google.inject.extensions:guice-assistedinject:4.0",
|
"com.google.inject.extensions:guice-assistedinject:4.0",
|
||||||
"javax.inject:javax.inject:1",
|
"javax.inject:javax.inject:1",
|
||||||
"com.google.guava:guava:19.0-rc2",
|
"com.google.guava:guava:19.0-rc2",
|
||||||
"org.apache.maven:maven-model:3.3.3",
|
"org.apache.maven:maven-model:${Versions.maven}",
|
||||||
"io.reactivex:rxjava:1.0.16",
|
"io.reactivex:rxjava:1.0.16",
|
||||||
"com.google.code.gson:gson:${Versions.gson}",
|
"com.google.code.gson:gson:${Versions.gson}",
|
||||||
"com.squareup.okio:okio:${Versions.okio}",
|
"com.squareup.okio:okio:${Versions.okio}",
|
||||||
"com.squareup.retrofit2:retrofit:${Versions.retrofit}",
|
"com.squareup.retrofit2:retrofit:${Versions.retrofit}",
|
||||||
"com.squareup.retrofit2:converter-gson:${Versions.retrofit}",
|
"com.squareup.retrofit2:converter-gson:${Versions.retrofit}",
|
||||||
"com.beust:jcommander:1.48"
|
"com.beust:jcommander:1.48",
|
||||||
)
|
|
||||||
|
"org.eclipse.aether:aether-spi:${Versions.aether}",
|
||||||
|
"org.eclipse.aether:aether-util:${Versions.aether}",
|
||||||
|
"org.eclipse.aether:aether-impl:${Versions.aether}",
|
||||||
|
"org.eclipse.aether:aether-connector-basic:${Versions.aether}",
|
||||||
|
"org.eclipse.aether:aether-transport-file:${Versions.aether}",
|
||||||
|
"org.eclipse.aether:aether-transport-http:${Versions.aether}",
|
||||||
|
"org.sonatype.aether:aether-api:${Versions.sonatypeAether}",
|
||||||
|
"org.sonatype.aether:aether-connector-wagon:1.13.1",
|
||||||
|
"org.apache.maven:maven-aether-provider:${Versions.maven}"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -122,7 +135,7 @@ val kobaltApp = project(kobaltPluginApi, wrapper) {
|
||||||
"com.google.inject:guice:4.0",
|
"com.google.inject:guice:4.0",
|
||||||
"com.google.inject.extensions:guice-assistedinject:4.0",
|
"com.google.inject.extensions:guice-assistedinject:4.0",
|
||||||
"com.beust:jcommander:1.48",
|
"com.beust:jcommander:1.48",
|
||||||
"org.apache.maven:maven-model:3.3.3",
|
"org.apache.maven:maven-model:${Versions.maven}",
|
||||||
"com.google.code.findbugs:jsr305:3.0.1",
|
"com.google.code.findbugs:jsr305:3.0.1",
|
||||||
"com.google.code.gson:gson:${Versions.gson}",
|
"com.google.code.gson:gson:${Versions.gson}",
|
||||||
"com.squareup.okhttp3:okhttp:${Versions.okhttp}",
|
"com.squareup.okhttp3:okhttp:${Versions.okhttp}",
|
||||||
|
|
|
@ -10,12 +10,14 @@ object Constants {
|
||||||
internal val DEFAULT_REPOS = listOf<String>(
|
internal val DEFAULT_REPOS = listOf<String>(
|
||||||
"http://repo1.maven.org/maven2/",
|
"http://repo1.maven.org/maven2/",
|
||||||
"https://maven-central.storage.googleapis.com/",
|
"https://maven-central.storage.googleapis.com/",
|
||||||
"https://jcenter.bintray.com/"
|
"https://jcenter.bintray.com/",
|
||||||
|
|
||||||
|
// snapshots
|
||||||
|
"https://oss.sonatype.org/content/repositories/snapshots/"
|
||||||
|
|
||||||
// The following repos contain snapshots, don't include them by default
|
// The following repos contain snapshots, don't include them by default
|
||||||
// , "https://repository.jboss.org/nexus/content/repositories/root_repository/"
|
// , "https://repository.jboss.org/nexus/content/repositories/root_repository/"
|
||||||
// , "http://repository.jetbrains.com/all/"
|
// , "http://repository.jetbrains.com/all/"
|
||||||
// , "https://oss.sonatype.org/content/repositories/snapshots/"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,20 +15,8 @@ import javax.xml.transform.sax.SAXSource
|
||||||
class PomProject {
|
class PomProject {
|
||||||
var modelVersion: String? = null
|
var modelVersion: String? = null
|
||||||
var groupId: String? = null
|
var groupId: String? = null
|
||||||
get() {
|
|
||||||
if (field != null && field!!.contains("\${")) {
|
|
||||||
println("VARIABLE GROUP")
|
|
||||||
}
|
|
||||||
return field
|
|
||||||
}
|
|
||||||
var artifactId: String? = null
|
var artifactId: String? = null
|
||||||
var version: String? = null
|
var version: String? = null
|
||||||
get() {
|
|
||||||
if (field != null && field!!.contains("\${")) {
|
|
||||||
println("VARIABLE VERSION")
|
|
||||||
}
|
|
||||||
return field
|
|
||||||
}
|
|
||||||
var name: String? = null
|
var name: String? = null
|
||||||
var description: String? = null
|
var description: String? = null
|
||||||
var url: String? = null
|
var url: String? = null
|
||||||
|
@ -58,24 +46,39 @@ class PomProject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun main(argv: Array<String>) {
|
//fun main(argv: Array<String>) {
|
||||||
val p = Pom2(File("/Users/beust/t/pom.xml"))
|
// val p = Pom2(File("/Users/beust/t/pom.xml"))
|
||||||
val pom = p.pom
|
// val pom = p.pom
|
||||||
println("Dependencies: " + pom.dependencies[0])
|
// println("Dependencies: " + pom.dependencies[0])
|
||||||
}
|
//}
|
||||||
|
|
||||||
class Pom2(val documentFile: File) {
|
class Either<E, V>(val exception: E?, val value: V?)
|
||||||
val pom: PomProject by lazy {
|
|
||||||
val ins = documentFile.inputStream()
|
|
||||||
val jaxbContext = JAXBContext.newInstance(PomProject::class.java)
|
|
||||||
val unmarshaller = jaxbContext.createUnmarshaller()
|
|
||||||
|
|
||||||
val sax = SAXParserFactory.newInstance()
|
class Pom2(val pomProject: PomProject) {
|
||||||
sax.isNamespaceAware = false
|
companion object {
|
||||||
val reader = sax.newSAXParser().xmlReader
|
fun parse(documentFile: File, dependencyManager: DependencyManager): Either<Exception, Pom2> {
|
||||||
val er = SAXSource(reader, InputSource(FileReader(documentFile)))
|
val jaxbContext = JAXBContext.newInstance(PomProject::class.java)
|
||||||
|
val unmarshaller = jaxbContext.createUnmarshaller()
|
||||||
|
|
||||||
unmarshaller.unmarshal(er) as PomProject
|
val sax = SAXParserFactory.newInstance()
|
||||||
|
sax.isNamespaceAware = false
|
||||||
|
val reader = sax.newSAXParser().xmlReader
|
||||||
|
val er = SAXSource(reader, InputSource(FileReader(documentFile)))
|
||||||
|
|
||||||
|
try {
|
||||||
|
val result = unmarshaller.unmarshal(er) as PomProject
|
||||||
|
result.parent?.let {
|
||||||
|
val id = with(it) {
|
||||||
|
groupId + ":" + artifactId + ":" + version
|
||||||
|
}
|
||||||
|
val dep = dependencyManager.createMaven(id)
|
||||||
|
println("DEP: " + dep)
|
||||||
|
}
|
||||||
|
return Either(null, Pom2(result))
|
||||||
|
} catch(ex: Exception) {
|
||||||
|
return Either(ex, null)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,31 +125,40 @@ class Dependencies {
|
||||||
}
|
}
|
||||||
|
|
||||||
class Dependency {
|
class Dependency {
|
||||||
|
@JvmField
|
||||||
var groupId: String = ""
|
var groupId: String = ""
|
||||||
fun groupId(pom: Pom2) : String = expandVariable(groupId, pom)
|
fun groupId(pom: Pom2) : String = expandVariable(groupId, pom)
|
||||||
|
|
||||||
|
@JvmField
|
||||||
var artifactId: String = ""
|
var artifactId: String = ""
|
||||||
fun artifactId(pom: Pom2) : String = expandVariable(artifactId, pom)
|
fun artifactId(pom: Pom2) : String = expandVariable(artifactId, pom)
|
||||||
|
|
||||||
|
@JvmField
|
||||||
var version: String = ""
|
var version: String = ""
|
||||||
fun version(pom: Pom2) : String = expandVariable(version, pom)
|
fun version(pom: Pom2) : String = expandVariable(version, pom)
|
||||||
|
|
||||||
|
@JvmField
|
||||||
var optional: String = "false"
|
var optional: String = "false"
|
||||||
|
@JvmField
|
||||||
var scope: String = ""
|
var scope: String = ""
|
||||||
|
@JvmField
|
||||||
var packaging: String = ""
|
var packaging: String = ""
|
||||||
|
|
||||||
val id: String = "$groupId:$artifactId:$version"
|
fun id(pom: Pom2) = groupId(pom) + ":" + artifactId(pom) + ":" + version(pom)
|
||||||
|
|
||||||
val mustDownload: Boolean
|
val mustDownload: Boolean
|
||||||
get() = ! optional.toBoolean() && "provided" != scope && "test" != scope
|
get() = ! optional.toBoolean() && "provided" != scope && "test" != scope
|
||||||
|
|
||||||
val isValid : Boolean get() = ! isVariable(groupId) && ! isVariable(artifactId) && ! isVariable(version)
|
val isValid : Boolean get() = true //! isVariable(groupId) && ! isVariable(artifactId) && ! isVariable(version)
|
||||||
|
|
||||||
private fun isVariable(s: String) = s.startsWith("\${") && s.endsWith("}")
|
private fun extractVariable(s: String) = if (s.startsWith("\${") && s.endsWith("}")) s.substring(2, s.length - 1)
|
||||||
|
else null
|
||||||
|
|
||||||
private fun expandVariable(s: String, pom: Pom2) : String {
|
private fun expandVariable(s: String, pom: Pom2) : String {
|
||||||
if (isVariable(s)) {
|
val variable = extractVariable(s)
|
||||||
println("Expanding variable $s")
|
if (variable != null) {
|
||||||
|
println("Expanding variable $variable")
|
||||||
|
val value = pom.pomProject.propertyValue(variable)
|
||||||
return s
|
return s
|
||||||
} else {
|
} else {
|
||||||
return s
|
return s
|
||||||
|
|
|
@ -37,7 +37,7 @@ class RepoFinder @Inject constructor(val executors: KobaltExecutors, val finderF
|
||||||
localPath.substring(lastDot)
|
localPath.substring(lastDot)
|
||||||
result
|
result
|
||||||
} else {
|
} else {
|
||||||
localPath
|
localPath
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
package com.beust.kobalt.maven.aether
|
||||||
|
|
||||||
|
import com.beust.kobalt.api.Kobalt
|
||||||
|
import com.beust.kobalt.internal.KobaltSettings
|
||||||
|
import com.google.inject.Inject
|
||||||
|
import org.eclipse.aether.artifact.DefaultArtifact
|
||||||
|
import org.eclipse.aether.collection.CollectRequest
|
||||||
|
import org.eclipse.aether.graph.Dependency
|
||||||
|
import org.eclipse.aether.resolution.DependencyRequest
|
||||||
|
import org.eclipse.aether.util.artifact.JavaScopes
|
||||||
|
import org.eclipse.aether.util.filter.DependencyFilterUtils
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
class Aether @Inject constructor(val settings: KobaltSettings){
|
||||||
|
fun call3() {
|
||||||
|
println("------------------------------------------------------------")
|
||||||
|
|
||||||
|
val system = Booter.newRepositorySystem()
|
||||||
|
|
||||||
|
val session = Booter.newRepositorySystemSession(system, File(settings.localRepo))
|
||||||
|
|
||||||
|
val artifact = DefaultArtifact("org.testng:testng:6.9.9")
|
||||||
|
|
||||||
|
val classpathFlter = DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE)
|
||||||
|
|
||||||
|
val collectRequest = CollectRequest()
|
||||||
|
collectRequest.root = Dependency(artifact, JavaScopes.COMPILE)
|
||||||
|
collectRequest.repositories = Booter.newRepositories(Kobalt.repos.map { it.url })
|
||||||
|
|
||||||
|
val dependencyRequest = DependencyRequest(collectRequest, classpathFlter)
|
||||||
|
|
||||||
|
val artifactResults = system.resolveDependencies(session, dependencyRequest).artifactResults
|
||||||
|
|
||||||
|
for (artifactResult in artifactResults) {
|
||||||
|
println(artifactResult.artifact.toString() + " resolved to " + artifactResult.artifact.file)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fun call2() {
|
||||||
|
// val request = ArtifactRequest().apply {
|
||||||
|
// artifact = DefaultArtifact(id)
|
||||||
|
// repositories = listOf(RemoteRepository("Maven", "", repo.url))
|
||||||
|
// }
|
||||||
|
// val repoSystem = DefaultRepositorySystem().apply {
|
||||||
|
// val artifactResolver = DefaultArtifactResolver().apply {
|
||||||
|
// setRemoteRepositoryManager(DefaultRemoteRepositoryManager().apply {
|
||||||
|
// addRepositoryConnectorFactory(WagonRepositoryConnectorFactory())
|
||||||
|
// })
|
||||||
|
// setVersionResolver {
|
||||||
|
// p0, request -> VersionResult(request)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// setArtifactResolver(artifactResolver)
|
||||||
|
// }
|
||||||
|
// val session = DefaultRepositorySystemSession().apply {
|
||||||
|
// localRepositoryManager = SimpleLocalRepositoryManager(File("/Users/beust/.aether"))
|
||||||
|
// }
|
||||||
|
// val artifact = repoSystem.resolveArtifact(session, request)
|
||||||
|
// println("Artifact: " + artifact)
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package com.beust.kobalt.maven.aether
|
||||||
|
|
||||||
|
import org.eclipse.aether.DefaultRepositorySystemSession
|
||||||
|
import org.eclipse.aether.RepositorySystem
|
||||||
|
import org.eclipse.aether.repository.LocalRepository
|
||||||
|
import org.eclipse.aether.repository.RemoteRepository
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
object Booter {
|
||||||
|
|
||||||
|
fun newRepositorySystem(): RepositorySystem {
|
||||||
|
return ManualRepositorySystemFactory.newRepositorySystem()
|
||||||
|
// return org.eclipse.aether.examples.guice.GuiceRepositorySystemFactory.newRepositorySystem();
|
||||||
|
// return org.eclipse.aether.examples.sisu.SisuRepositorySystemFactory.newRepositorySystem();
|
||||||
|
// return org.eclipse.aether.examples.plexus.PlexusRepositorySystemFactory.newRepositorySystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
fun newRepositorySystemSession(system: RepositorySystem, repo: File): DefaultRepositorySystemSession {
|
||||||
|
val session = MavenRepositorySystemUtils.newSession()
|
||||||
|
|
||||||
|
val localRepo = LocalRepository(repo.absolutePath)
|
||||||
|
session.localRepositoryManager = system.newLocalRepositoryManager(session, localRepo)
|
||||||
|
|
||||||
|
session.transferListener = ConsoleTransferListener()
|
||||||
|
session.repositoryListener = ConsoleRepositoryListener()
|
||||||
|
|
||||||
|
// uncomment to generate dirty trees
|
||||||
|
// session.setDependencyGraphTransformer( null );
|
||||||
|
|
||||||
|
return session
|
||||||
|
}
|
||||||
|
|
||||||
|
fun newRepositories(repositories: Collection<String>)
|
||||||
|
= repositories.map { RemoteRepository.Builder("maven", "default", it).build() }
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
package com.beust.kobalt.maven.aether
|
||||||
|
|
||||||
|
import org.eclipse.aether.AbstractRepositoryListener
|
||||||
|
import org.eclipse.aether.RepositoryEvent
|
||||||
|
import java.io.PrintStream
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simplistic repository listener that logs events to the console.
|
||||||
|
*/
|
||||||
|
class ConsoleRepositoryListener @JvmOverloads constructor(out: PrintStream? = null) : AbstractRepositoryListener() {
|
||||||
|
|
||||||
|
private val out: PrintStream
|
||||||
|
|
||||||
|
init {
|
||||||
|
this.out = out ?: System.out
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun artifactDeployed(event: RepositoryEvent?) {
|
||||||
|
out.println("Deployed " + event!!.artifact + " to " + event.repository)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun artifactDeploying(event: RepositoryEvent?) {
|
||||||
|
out.println("Deploying " + event!!.artifact + " to " + event.repository)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun artifactDescriptorInvalid(event: RepositoryEvent?) {
|
||||||
|
out.println("Invalid artifact descriptor for " + event!!.artifact + ": "
|
||||||
|
+ event.exception.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun artifactDescriptorMissing(event: RepositoryEvent?) {
|
||||||
|
out.println("Missing artifact descriptor for " + event!!.artifact)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun artifactInstalled(event: RepositoryEvent?) {
|
||||||
|
out.println("Installed " + event!!.artifact + " to " + event.file)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun artifactInstalling(event: RepositoryEvent?) {
|
||||||
|
out.println("Installing " + event!!.artifact + " to " + event.file)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun artifactResolved(event: RepositoryEvent?) {
|
||||||
|
out.println("Resolved artifact " + event!!.artifact + " from " + event.repository)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun artifactDownloading(event: RepositoryEvent?) {
|
||||||
|
out.println("Downloading artifact " + event!!.artifact + " from " + event.repository)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun artifactDownloaded(event: RepositoryEvent?) {
|
||||||
|
out.println("Downloaded artifact " + event!!.artifact + " from " + event.repository)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun artifactResolving(event: RepositoryEvent?) {
|
||||||
|
out.println("Resolving artifact " + event!!.artifact)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun metadataDeployed(event: RepositoryEvent?) {
|
||||||
|
out.println("Deployed " + event!!.metadata + " to " + event.repository)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun metadataDeploying(event: RepositoryEvent?) {
|
||||||
|
out.println("Deploying " + event!!.metadata + " to " + event.repository)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun metadataInstalled(event: RepositoryEvent?) {
|
||||||
|
out.println("Installed " + event!!.metadata + " to " + event.file)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun metadataInstalling(event: RepositoryEvent?) {
|
||||||
|
out.println("Installing " + event!!.metadata + " to " + event.file)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun metadataInvalid(event: RepositoryEvent?) {
|
||||||
|
out.println("Invalid metadata " + event!!.metadata)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun metadataResolved(event: RepositoryEvent?) {
|
||||||
|
out.println("Resolved metadata " + event!!.metadata + " from " + event.repository)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun metadataResolving(event: RepositoryEvent?) {
|
||||||
|
out.println("Resolving metadata " + event!!.metadata + " from " + event.repository)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
package com.beust.kobalt.maven.aether
|
||||||
|
|
||||||
|
import org.eclipse.aether.transfer.AbstractTransferListener
|
||||||
|
import org.eclipse.aether.transfer.MetadataNotFoundException
|
||||||
|
import org.eclipse.aether.transfer.TransferEvent
|
||||||
|
import org.eclipse.aether.transfer.TransferResource
|
||||||
|
import java.io.PrintStream
|
||||||
|
import java.text.DecimalFormat
|
||||||
|
import java.text.DecimalFormatSymbols
|
||||||
|
import java.util.*
|
||||||
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
|
class ConsoleTransferListener @JvmOverloads constructor(out: PrintStream? = null) : AbstractTransferListener() {
|
||||||
|
|
||||||
|
private val out: PrintStream
|
||||||
|
|
||||||
|
private val downloads = ConcurrentHashMap<TransferResource, Long>()
|
||||||
|
|
||||||
|
private var lastLength: Int = 0
|
||||||
|
|
||||||
|
init {
|
||||||
|
this.out = out ?: System.out
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun transferInitiated(event: TransferEvent?) {
|
||||||
|
val message = if (event!!.requestType == TransferEvent.RequestType.PUT) "Uploading" else "Downloading"
|
||||||
|
|
||||||
|
out.println(message + ": " + event.resource.repositoryUrl + event.resource.resourceName)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun transferProgressed(event: TransferEvent?) {
|
||||||
|
val resource = event!!.resource
|
||||||
|
downloads.put(resource, java.lang.Long.valueOf(event.transferredBytes))
|
||||||
|
|
||||||
|
val buffer = StringBuilder(64)
|
||||||
|
|
||||||
|
for (entry in downloads.entries) {
|
||||||
|
val total = entry.key.contentLength
|
||||||
|
val complete = entry.value.toLong()
|
||||||
|
|
||||||
|
buffer.append(getStatus(complete, total)).append(" ")
|
||||||
|
}
|
||||||
|
|
||||||
|
val pad = lastLength - buffer.length
|
||||||
|
lastLength = buffer.length
|
||||||
|
pad(buffer, pad)
|
||||||
|
buffer.append('\r')
|
||||||
|
|
||||||
|
out.print(buffer)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getStatus(complete: Long, total: Long): String {
|
||||||
|
if (total >= 1024) {
|
||||||
|
return toKB(complete).toString() + "/" + toKB(total) + " KB "
|
||||||
|
} else if (total >= 0) {
|
||||||
|
return complete.toString() + "/" + total + " B "
|
||||||
|
} else if (complete >= 1024) {
|
||||||
|
return toKB(complete).toString() + " KB "
|
||||||
|
} else {
|
||||||
|
return complete.toString() + " B "
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun pad(buffer: StringBuilder, spaces: Int) {
|
||||||
|
var spaces = spaces
|
||||||
|
val block = " "
|
||||||
|
while (spaces > 0) {
|
||||||
|
val n = Math.min(spaces, block.length)
|
||||||
|
buffer.append(block, 0, n)
|
||||||
|
spaces -= n
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun transferSucceeded(event: TransferEvent) {
|
||||||
|
transferCompleted(event)
|
||||||
|
|
||||||
|
val resource = event.resource
|
||||||
|
val contentLength = event.transferredBytes
|
||||||
|
if (contentLength >= 0) {
|
||||||
|
val type = if (event.requestType == TransferEvent.RequestType.PUT) "Uploaded" else "Downloaded"
|
||||||
|
val len = if (contentLength >= 1024) toKB(contentLength).toString() + " KB"
|
||||||
|
else contentLength.toString() + " B"
|
||||||
|
|
||||||
|
var throughput = ""
|
||||||
|
val duration = System.currentTimeMillis() - resource.transferStartTime
|
||||||
|
if (duration > 0) {
|
||||||
|
val bytes = contentLength - resource.resumeOffset
|
||||||
|
val format = DecimalFormat("0.0", DecimalFormatSymbols(Locale.ENGLISH))
|
||||||
|
val kbPerSec = bytes / 1024.0 / (duration / 1000.0)
|
||||||
|
throughput = " at " + format.format(kbPerSec) + " KB/sec"
|
||||||
|
}
|
||||||
|
|
||||||
|
out.println(type + ": " + resource.repositoryUrl + resource.resourceName + " (" + len
|
||||||
|
+ throughput + ")")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun transferFailed(event: TransferEvent) {
|
||||||
|
transferCompleted(event)
|
||||||
|
|
||||||
|
if (event.exception !is MetadataNotFoundException) {
|
||||||
|
event.exception.printStackTrace(out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun transferCompleted(event: TransferEvent) {
|
||||||
|
downloads.remove(event.resource)
|
||||||
|
|
||||||
|
val buffer = StringBuilder(64)
|
||||||
|
pad(buffer, lastLength)
|
||||||
|
buffer.append('\r')
|
||||||
|
out.print(buffer)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun transferCorrupted(event: TransferEvent?) {
|
||||||
|
event!!.exception.printStackTrace(out)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun toKB(bytes: Long): Long {
|
||||||
|
return (bytes + 1023) / 1024
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
package com.beust.kobalt.maven.aether
|
||||||
|
|
||||||
|
import org.eclipse.aether.RepositorySystem
|
||||||
|
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory
|
||||||
|
import org.eclipse.aether.impl.DefaultServiceLocator
|
||||||
|
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
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A factory for repository system instances that employs Aether's built-in service locator infrastructure to wire up
|
||||||
|
* the system's components.
|
||||||
|
*/
|
||||||
|
object ManualRepositorySystemFactory {
|
||||||
|
|
||||||
|
fun newRepositorySystem(): RepositorySystem {
|
||||||
|
/*
|
||||||
|
* Aether's components implement org.eclipse.aether.spi.locator.Service to ease manual wiring and using the
|
||||||
|
* prepopulated DefaultServiceLocator, we only need to register the repository connector and transporter
|
||||||
|
* factories.
|
||||||
|
*/
|
||||||
|
val locator = 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)
|
||||||
|
|
||||||
|
locator.setErrorHandler(object : DefaultServiceLocator.ErrorHandler() {
|
||||||
|
override fun serviceCreationFailed(type: Class<*>, impl: Class<*>, exception: Throwable) {
|
||||||
|
exception.printStackTrace()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return locator.getService(RepositorySystem::class.java)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.beust.kobalt.maven.aether
|
||||||
|
|
||||||
|
import org.apache.maven.repository.internal.*
|
||||||
|
import org.eclipse.aether.DefaultRepositorySystemSession
|
||||||
|
import org.eclipse.aether.artifact.DefaultArtifactType
|
||||||
|
import org.eclipse.aether.impl.*
|
||||||
|
import org.eclipse.aether.util.artifact.DefaultArtifactTypeRegistry
|
||||||
|
import org.eclipse.aether.util.graph.manager.ClassicDependencyManager
|
||||||
|
import org.eclipse.aether.util.graph.selector.AndDependencySelector
|
||||||
|
import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector
|
||||||
|
import org.eclipse.aether.util.graph.selector.OptionalDependencySelector
|
||||||
|
import org.eclipse.aether.util.graph.selector.ScopeDependencySelector
|
||||||
|
import org.eclipse.aether.util.graph.transformer.*
|
||||||
|
import org.eclipse.aether.util.graph.traverser.FatArtifactTraverser
|
||||||
|
import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy
|
||||||
|
|
||||||
|
object MavenRepositorySystemUtils {
|
||||||
|
|
||||||
|
fun newServiceLocator(): DefaultServiceLocator {
|
||||||
|
val locator = DefaultServiceLocator()
|
||||||
|
locator.addService(ArtifactDescriptorReader::class.java, DefaultArtifactDescriptorReader::class.java)
|
||||||
|
locator.addService(VersionResolver::class.java, DefaultVersionResolver::class.java)
|
||||||
|
locator.addService(VersionRangeResolver::class.java, DefaultVersionRangeResolver::class.java)
|
||||||
|
locator.addService(MetadataGeneratorFactory::class.java, SnapshotMetadataGeneratorFactory::class.java)
|
||||||
|
locator.addService(MetadataGeneratorFactory::class.java, VersionsMetadataGeneratorFactory::class.java)
|
||||||
|
return locator
|
||||||
|
}
|
||||||
|
|
||||||
|
fun newSession(): DefaultRepositorySystemSession {
|
||||||
|
val session = DefaultRepositorySystemSession()
|
||||||
|
val depTraverser = FatArtifactTraverser()
|
||||||
|
session.dependencyTraverser = depTraverser
|
||||||
|
val depManager = ClassicDependencyManager()
|
||||||
|
session.dependencyManager = depManager
|
||||||
|
val depFilter = AndDependencySelector(*arrayOf(ScopeDependencySelector(*arrayOf("test", "provided")), OptionalDependencySelector(), ExclusionDependencySelector()))
|
||||||
|
session.dependencySelector = depFilter
|
||||||
|
val transformer = ConflictResolver(NearestVersionSelector(), JavaScopeSelector(), SimpleOptionalitySelector(), JavaScopeDeriver())
|
||||||
|
ChainedDependencyGraphTransformer(*arrayOf(transformer, JavaDependencyContextRefiner()))
|
||||||
|
session.dependencyGraphTransformer = transformer
|
||||||
|
val stereotypes = DefaultArtifactTypeRegistry()
|
||||||
|
stereotypes.add(DefaultArtifactType("pom"))
|
||||||
|
stereotypes.add(DefaultArtifactType("maven-plugin", "jar", "", "java"))
|
||||||
|
stereotypes.add(DefaultArtifactType("jar", "jar", "", "java"))
|
||||||
|
stereotypes.add(DefaultArtifactType("ejb", "jar", "", "java"))
|
||||||
|
stereotypes.add(DefaultArtifactType("ejb-client", "jar", "client", "java"))
|
||||||
|
stereotypes.add(DefaultArtifactType("test-jar", "jar", "tests", "java"))
|
||||||
|
stereotypes.add(DefaultArtifactType("javadoc", "jar", "javadoc", "java"))
|
||||||
|
stereotypes.add(DefaultArtifactType("java-source", "jar", "sources", "java", false, false))
|
||||||
|
stereotypes.add(DefaultArtifactType("war", "war", "", "java", false, true))
|
||||||
|
stereotypes.add(DefaultArtifactType("ear", "ear", "", "java", false, true))
|
||||||
|
stereotypes.add(DefaultArtifactType("rar", "rar", "", "java", false, true))
|
||||||
|
stereotypes.add(DefaultArtifactType("par", "par", "", "java", false, true))
|
||||||
|
session.artifactTypeRegistry = stereotypes
|
||||||
|
session.artifactDescriptorPolicy = SimpleArtifactDescriptorPolicy(true, true)
|
||||||
|
val sysProps = System.getProperties()
|
||||||
|
session.setSystemProperties(sysProps)
|
||||||
|
session.setConfigProperties(sysProps)
|
||||||
|
return session
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ class MavenDependency @Inject constructor(
|
||||||
@Assisted("downloadJavadocs") val downloadJavadocs: Boolean,
|
@Assisted("downloadJavadocs") val downloadJavadocs: Boolean,
|
||||||
override val localRepo: LocalRepo,
|
override val localRepo: LocalRepo,
|
||||||
val repoFinder: RepoFinder,
|
val repoFinder: RepoFinder,
|
||||||
val pomFactory: Pom.IFactory,
|
val dependencyManager: DependencyManager,
|
||||||
val downloadManager: DownloadManager)
|
val downloadManager: DownloadManager)
|
||||||
: LocalDep(mavenId, localRepo), IClasspathDependency, Comparable<MavenDependency> {
|
: LocalDep(mavenId, localRepo), IClasspathDependency, Comparable<MavenDependency> {
|
||||||
override var jarFile: Future<File> by Delegates.notNull()
|
override var jarFile: Future<File> by Delegates.notNull()
|
||||||
|
@ -120,19 +120,21 @@ class MavenDependency @Inject constructor(
|
||||||
|
|
||||||
override fun directDependencies() : List<IClasspathDependency> {
|
override fun directDependencies() : List<IClasspathDependency> {
|
||||||
val result = arrayListOf<IClasspathDependency>()
|
val result = arrayListOf<IClasspathDependency>()
|
||||||
try {
|
val maybePom = Pom2.parse(pomFile.get(), dependencyManager)
|
||||||
val pom = Pom2(pomFile.get())
|
if (maybePom.value != null) {
|
||||||
pom.pom.dependencies.filter {
|
val pom = maybePom.value
|
||||||
|
pom.pomProject.dependencies.filter {
|
||||||
it.mustDownload
|
it.mustDownload
|
||||||
}.forEach {
|
}.forEach {
|
||||||
if (it.isValid) {
|
if (it.isValid) {
|
||||||
result.add(create(MavenId.toId(it.groupId(pom), it.artifactId(pom), it.packaging, it.version(pom))))
|
result.add(create(MavenId.toId(it.groupId(pom), it.artifactId(pom), it.packaging, it.version(pom))))
|
||||||
} else {
|
} else {
|
||||||
log(2, "Skipping invalid id: ${it.id}")
|
log(2, "Skipping invalid id: ${it.id(pom)}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch(ex: Exception) {
|
} else {
|
||||||
warn("Exception when trying to resolve dependencies for $id: " + ex.message)
|
warn("Couldn't parse POM file ${pomFile.get()}: " + maybePom.exception?.message, maybePom.exception!!)
|
||||||
|
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.beust.kobalt.maven
|
||||||
|
|
||||||
import com.beust.kobalt.HostConfig
|
import com.beust.kobalt.HostConfig
|
||||||
import com.beust.kobalt.KobaltTest
|
import com.beust.kobalt.KobaltTest
|
||||||
|
import com.beust.kobalt.internal.KobaltSettings
|
||||||
import com.beust.kobalt.maven.dependency.MavenDependency
|
import com.beust.kobalt.maven.dependency.MavenDependency
|
||||||
import com.beust.kobalt.misc.KobaltExecutors
|
import com.beust.kobalt.misc.KobaltExecutors
|
||||||
import com.beust.kobalt.misc.Version
|
import com.beust.kobalt.misc.Version
|
||||||
|
@ -23,6 +24,7 @@ class DownloadTest @Inject constructor(
|
||||||
val localRepo: LocalRepo,
|
val localRepo: LocalRepo,
|
||||||
val mdFactory: MavenDependency.IFactory,
|
val mdFactory: MavenDependency.IFactory,
|
||||||
val dependencyManager: DependencyManager,
|
val dependencyManager: DependencyManager,
|
||||||
|
val settings: KobaltSettings,
|
||||||
val executors: KobaltExecutors) : KobaltTest() {
|
val executors: KobaltExecutors) : KobaltTest() {
|
||||||
private var executor: ExecutorService by Delegates.notNull()
|
private var executor: ExecutorService by Delegates.notNull()
|
||||||
|
|
||||||
|
@ -173,5 +175,24 @@ class DownloadTest @Inject constructor(
|
||||||
val d = closure.filter { it.id.contains("eclipse-collections-api")}
|
val d = closure.filter { it.id.contains("eclipse-collections-api")}
|
||||||
Assert.assertEquals(d.size, 1)
|
Assert.assertEquals(d.size, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun containerPom() {
|
||||||
|
val repoResult = RepoFinderCallable("org.jetbrains.kotlin:kotlin-project:1.0.0",
|
||||||
|
HostConfig("http://repo1.maven.org/maven2/"),
|
||||||
|
localRepo, dependencyManager, settings).call()
|
||||||
|
val rr = repoResult[0]
|
||||||
|
Assert.assertTrue(rr.found)
|
||||||
|
Assert.assertTrue(rr.localPath != null && rr.localPath!!.startsWith("junit/junit"))
|
||||||
|
Assert.assertEquals(rr.version.toString(), "4.12")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun containerPom3() {
|
||||||
|
val pom = Pom2.parse(
|
||||||
|
File("/Users/beust/kotlin/kobalt/src/test/resources/guice-parent-4.0.pom"), dependencyManager)
|
||||||
|
println("POM: ${pom.value?.pomProject}")
|
||||||
|
println("")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue