@@ -22,18 +22,18 @@ import java.lang.UnsatisfiedLinkError
2222import java.lang.reflect.Constructor
2323import java.lang.reflect.Modifier
2424import java.net.URLClassLoader
25- import java.nio.file.FileVisitResult
26- import java.nio.file.Files
27- import java.nio.file.Path
28- import java.nio.file.SimpleFileVisitor
29- import java.nio.file.attribute.BasicFileAttributes
3025import java.util.*
3126import java.util.function.Function
3227import kotlin.reflect.KFunction
3328import kotlin.reflect.full.companionObjectInstance
3429import kotlin.reflect.full.memberFunctions
3530
36- class PlugGenerator internal constructor(toSearches : List <File >, toLinkAgainst : Set <File >) {
31+ class PlugGenerator
32+ internal constructor (
33+ plugToSocket: Map <String , String >,
34+ toSearches: List <File >,
35+ toLinkAgainst: Set <File >
36+ ) {
3737 @JvmField val atplugInf: SortedMap <String , String > = TreeMap ()
3838
3939 /* * A cache from a plugin interface to a function that converts a class into its metadata. */
@@ -56,22 +56,7 @@ class PlugGenerator internal constructor(toSearches: List<File>, toLinkAgainst:
5656 }!!
5757 as KFunction <Function <Any , String >>
5858 try {
59- val parser = PlugParser ()
60- // walk toSearch, passing each classfile to load()
61- for (toSearch in toSearches) {
62- if (toSearch.isDirectory) {
63- Files .walkFileTree(
64- toSearch.toPath(),
65- object : SimpleFileVisitor <Path >() {
66- override fun visitFile (file : Path , attrs : BasicFileAttributes ): FileVisitResult {
67- if (file.toString().endsWith(EXT_CLASS )) {
68- maybeGeneratePlugin(parser, file)
69- }
70- return FileVisitResult .CONTINUE
71- }
72- })
73- }
74- }
59+ plugToSocket.forEach { (plug, socket) -> atplugInf[plug] = generatePlugin(plug, socket) }
7560 } finally {
7661 classLoader.close()
7762 System .setProperty(" atplug.generate" , " " )
@@ -82,18 +67,13 @@ class PlugGenerator internal constructor(toSearches: List<File>, toLinkAgainst:
8267 * Loads a class by its FQN. If it's concrete and implements a plugin, then we'll call
8368 * generatePlugin.
8469 */
85- private fun maybeGeneratePlugin (parser : PlugParser , path : Path ) {
86- parser.parse(path.toFile())
87- if (! parser.hasPlug()) {
88- return
89- }
90- val plugClass = classLoader.loadClass(parser.plugClassName)
91- val socketClass = classLoader.loadClass(parser.socketClassName)
70+ private fun generatePlugin (plugClassName : String , socketClassName : String ): String {
71+ val plugClass = classLoader.loadClass(plugClassName)
72+ val socketClass = classLoader.loadClass(socketClassName)
9273 require(! Modifier .isAbstract(plugClass.modifiers)) {
9374 " Class $plugClass has @Plug($socketClass ) but it is abstract."
9475 }
95- val atplugInfContent = generatePlugin<Any , Any >(plugClass, socketClass)
96- atplugInf[plugClass.name] = atplugInfContent
76+ return generatePlugin<Any , Any >(plugClass, socketClass)
9777 }
9878
9979 private fun <SocketT , PlugT : SocketT > generatePlugin (
@@ -128,14 +108,18 @@ class PlugGenerator internal constructor(toSearches: List<File>, toLinkAgainst:
128108 * Returns a Map from a plugin's name to its ATPLUG-INF content.
129109 *
130110 * @param toSearch a directory containing class files where we will look for plugin
131- * implementations
111+ * implementations
132112 * @param toLinkAgainst the classes that these plugins implementations need
133113 * @return a map from component name to is ATPLUG-INF string content
134114 */
135- fun generate (toSearch : List <File >, toLinkAgainst : Set <File >): SortedMap <String , String > {
115+ fun generate (
116+ plugToSocket : Map <String , String >,
117+ toSearch : List <File >,
118+ toLinkAgainst : Set <File >
119+ ): SortedMap <String , String > {
136120 return try {
137- val ext = PlugGeneratorJavaExecable (toSearch, toLinkAgainst)
138- val metadataGen = PlugGenerator (ext.toSearch, ext.toLinkAgainst)
121+ val ext = PlugGeneratorJavaExecable (plugToSocket, toSearch, toLinkAgainst)
122+ val metadataGen = PlugGenerator (plugToSocket, ext.toSearch, ext.toLinkAgainst)
139123 // save our results, with no reference to the guts of what happened inside PluginMetadataGen
140124 metadataGen.atplugInf
141125 } catch (e: Exception ) {
0 commit comments