Skip to content

Commit

Permalink
Minor, move and rename CompilerClassLoaderHolder -> KotlinAntTaskUtil
Browse files Browse the repository at this point in the history
  • Loading branch information
udalov committed Jun 5, 2015
1 parent 8f58267 commit 49c7860
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 33 deletions.
51 changes: 51 additions & 0 deletions ant/src/org/jetbrains/kotlin/ant/KotlinAntTaskUtil.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.jetbrains.kotlin.ant

import org.apache.tools.ant.AntClassLoader
import org.jetbrains.kotlin.preloading.ClassPreloadingUtils
import java.io.File
import java.lang.ref.SoftReference
import java.net.JarURLConnection

object KotlinAntTaskUtil {
private var classLoaderRef = SoftReference<ClassLoader?>(null)

synchronized fun getOrCreateClassLoader(): ClassLoader {
val cached = classLoaderRef.get()
if (cached != null) return cached

val myLoader = javaClass.getClassLoader()
if (myLoader !is AntClassLoader) return myLoader

// Find path of kotlin-ant.jar in the filesystem and find kotlin-compiler.jar in the same directory
val resourcePath = "/" + javaClass.getName().replace('.', '/') + ".class"
val jarConnection = javaClass.getResource(resourcePath).openConnection() as? JarURLConnection
?: throw UnsupportedOperationException("Kotlin compiler Ant task should be loaded from the JAR file")
val antTaskJarPath = File(jarConnection.getJarFileURL().toURI())

val compilerJarPath = File(antTaskJarPath.getParent(), "kotlin-compiler.jar")
if (!compilerJarPath.exists()) {
throw IllegalStateException("kotlin-compiler.jar is not found in the directory of Kotlin Ant task")
}

val classLoader = ClassPreloadingUtils.preloadClasses(listOf(compilerJarPath), 4096, myLoader, null)
classLoaderRef = SoftReference(classLoader)

return classLoader
}
}
34 changes: 1 addition & 33 deletions ant/src/org/jetbrains/kotlin/ant/KotlinCompilerBaseTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,45 +16,13 @@

package org.jetbrains.kotlin.ant

import org.apache.tools.ant.AntClassLoader
import org.apache.tools.ant.BuildException
import org.apache.tools.ant.Task
import org.apache.tools.ant.types.Commandline
import org.apache.tools.ant.types.Path
import org.apache.tools.ant.types.Reference
import org.jetbrains.kotlin.preloading.ClassPreloadingUtils
import java.io.File
import java.io.PrintStream
import java.lang.ref.SoftReference
import java.net.JarURLConnection

object CompilerClassLoaderHolder {
private var classLoaderRef = SoftReference<ClassLoader?>(null)

synchronized fun getOrCreateClassLoader(): ClassLoader {
val cached = classLoaderRef.get()
if (cached != null) return cached

val myLoader = javaClass.getClassLoader()
if (myLoader !is AntClassLoader) return myLoader

// Find path of kotlin-ant.jar in the filesystem and find kotlin-compiler.jar in the same directory
val resourcePath = "/" + javaClass.getName().replace('.', '/') + ".class"
val jarConnection = javaClass.getResource(resourcePath).openConnection() as? JarURLConnection
?: throw UnsupportedOperationException("Kotlin compiler Ant task should be loaded from the JAR file")
val antTaskJarPath = File(jarConnection.getJarFileURL().toURI())

val compilerJarPath = File(antTaskJarPath.getParent(), "kotlin-compiler.jar")
if (!compilerJarPath.exists()) {
throw IllegalStateException("kotlin-compiler.jar is not found in the directory of Kotlin Ant task")
}

val classLoader = ClassPreloadingUtils.preloadClasses(listOf(compilerJarPath), 4096, myLoader, null)
classLoaderRef = SoftReference(classLoader)

return classLoader
}
}

public abstract class KotlinCompilerBaseTask : Task() {
protected abstract val compilerFqName: String
Expand Down Expand Up @@ -115,7 +83,7 @@ public abstract class KotlinCompilerBaseTask : Task() {
final override fun execute() {
fillArguments()

val compilerClass = CompilerClassLoaderHolder.getOrCreateClassLoader().loadClass(compilerFqName)
val compilerClass = KotlinAntTaskUtil.getOrCreateClassLoader().loadClass(compilerFqName)
val compiler = compilerClass.newInstance()
val exec = compilerClass.getMethod("execFullPathsInMessages", javaClass<PrintStream>(), javaClass<Array<String>>())

Expand Down

0 comments on commit 49c7860

Please sign in to comment.