@@ -10,7 +10,6 @@ import java.lang.Exception
1010import java.lang.IllegalArgumentException
1111import java.lang.RuntimeException
1212import java.lang.reflect.Modifier
13- import java.util.*
1413import java.util.function.Function
1514import java.util.function.Predicate
1615
@@ -49,19 +48,17 @@ abstract class SocketOwner<T>(val socketClass: Class<T>) {
4948 override fun instantiatePlug (plugDescriptor : PlugDescriptor ): T =
5049 PlugRegistry .instantiatePlug(socketClass, plugDescriptor)
5150
52- abstract protected fun parse (plugDescriptor : PlugDescriptor ): ParsedDescriptor
51+ protected abstract fun parse (plugDescriptor : PlugDescriptor ): ParsedDescriptor
5352
54- protected fun all () = descriptors.keys
53+ protected fun availableDescriptors () = descriptors.keys
5554
56- protected fun descriptorFiltered (
57- predicate : Predicate <ParsedDescriptor >
58- ): List <ParsedDescriptor > {
55+ protected fun descriptorsFor (predicate : Predicate <ParsedDescriptor >): List <ParsedDescriptor > {
5956 synchronized(this ) {
6057 return descriptors.keys.filter { predicate.test(it) }
6158 }
6259 }
6360
64- protected fun instantiateFiltered (predicate : Predicate <ParsedDescriptor >): List <T > {
61+ protected fun instancesFor (predicate : Predicate <ParsedDescriptor >): List <T > {
6562 val result = mutableListOf<T >()
6663 synchronized(this ) {
6764 descriptors.forEach { (parsed, descriptor) ->
@@ -93,12 +90,13 @@ abstract class SocketOwner<T>(val socketClass: Class<T>) {
9390 }
9491 }
9592
93+ /* * If you override this, make sure you also override [removeHook] */
9694 open fun registerHook (plugDescriptor : PlugDescriptor ) {}
9795
9896 open fun removeHook (plugDescriptor : PlugDescriptor ) {}
9997 }
10098
101- abstract open class SingletonById <T >(socketClass : Class <T >) : SocketOwner<T>(socketClass) {
99+ abstract class SingletonById <T >(socketClass : Class <T >) : SocketOwner<T>(socketClass) {
102100 private val descriptorById = mutableMapOf<String , PlugDescriptor >()
103101 private val instanceById = mutableMapOf<String , T >()
104102 init {
@@ -108,15 +106,15 @@ abstract class SocketOwner<T>(val socketClass: Class<T>) {
108106 override fun instantiatePlug (plugDescriptor : PlugDescriptor ): T =
109107 PlugRegistry .instantiatePlug(socketClass, plugDescriptor)
110108
111- override final fun register (plugDescriptor : PlugDescriptor ) {
109+ final override fun register (plugDescriptor : PlugDescriptor ) {
112110 synchronized(this ) {
113111 val id = plugDescriptor.properties[KEY_ID ]!!
114112 descriptorById[id] = plugDescriptor
115113 registerHook(plugDescriptor)
116114 }
117115 }
118116
119- override final fun remove (plugDescriptor : PlugDescriptor ) {
117+ final override fun remove (plugDescriptor : PlugDescriptor ) {
120118 synchronized(this ) {
121119 val id = plugDescriptor.properties[KEY_ID ]!!
122120 val removed = descriptorById.remove(id)
@@ -126,19 +124,14 @@ abstract class SocketOwner<T>(val socketClass: Class<T>) {
126124 }
127125 }
128126
129- open protected fun registerHook (plugDescriptor : PlugDescriptor ) {}
127+ /* * If you override this, make sure you also override [removeHook] */
128+ protected open fun registerHook (plugDescriptor : PlugDescriptor ) {}
130129
131- open protected fun removeHook (plugDescriptor : PlugDescriptor ) {}
130+ protected open fun removeHook (plugDescriptor : PlugDescriptor ) {}
132131
133- fun allIds () = Collections .unmodifiableSet(descriptorById.keys)
134-
135- fun forId (id : String ): T ? {
132+ fun availableIds (): List <String > {
136133 synchronized(this ) {
137- try {
138- return instanceById.computeIfAbsent(id) { instantiatePlug(descriptorById[it]!! ) }
139- } catch (e: NullPointerException ) {
140- return null
141- }
134+ return descriptorById.keys.toList()
142135 }
143136 }
144137
@@ -147,6 +140,16 @@ abstract class SocketOwner<T>(val socketClass: Class<T>) {
147140 return descriptorById[id]
148141 }
149142 }
143+
144+ fun instanceForId (id : String ): T ? {
145+ synchronized(this ) {
146+ return try {
147+ instanceById.computeIfAbsent(id) { instantiatePlug(descriptorById[it]!! ) }
148+ } catch (e: NullPointerException ) {
149+ null
150+ }
151+ }
152+ }
150153 }
151154
152155 companion object {
@@ -155,7 +158,7 @@ abstract class SocketOwner<T>(val socketClass: Class<T>) {
155158 fun <T > metadataGeneratorFor (socketClass : Class <T >): Function <T , String > {
156159 var firstAttempt: Throwable ? = null
157160 try {
158- val socketField = socketClass.getDeclaredField(" socket" )!!
161+ val socketField = socketClass.getDeclaredField(" socket" )
159162 if (Modifier .isStatic(socketField.modifiers) && Modifier .isFinal(socketField.modifiers)) {
160163 val socket = socketField[null ] as SocketOwner <T >
161164 return generatorForSocket(socket)
0 commit comments