7
7
import java .lang .reflect .Modifier ;
8
8
import java .lang .reflect .ParameterizedType ;
9
9
import java .lang .reflect .Type ;
10
- import java .net .MalformedURLException ;
11
- import java .net .URL ;
12
10
import java .util .ArrayList ;
13
11
import java .util .Collections ;
12
+ import java .util .HashMap ;
14
13
import java .util .HashSet ;
15
14
import java .util .List ;
16
15
import java .util .Map ;
@@ -30,6 +29,8 @@ public abstract class ToolLoader {
30
29
protected static final String SCRIPT_PREFIX = "SCRIPT:" ;
31
30
32
31
protected final ClassLoader loader ;
32
+
33
+ private Map <String , ToolModel <? extends Tool >> toolModels = new HashMap <String , ToolModel <? extends Tool >>();
33
34
34
35
public ToolLoader () {
35
36
this (ToolLoader .class .getClassLoader ());
@@ -75,7 +76,17 @@ protected String getToolClassName(final String toolName) {
75
76
* Returns a ToolModel given the name of the tool, or null if no such tool is
76
77
* know to this tool loader.
77
78
*/
78
- public <T extends Tool > ToolModel <T > loadToolModel (String toolName ) {
79
+ public synchronized <T extends Tool > ToolModel <T > loadToolModel (String toolName ) {
80
+ @ SuppressWarnings ("unchecked" )
81
+ ToolModel <T > loadedModel = (ToolModel <T >) toolModels .get (toolName );
82
+ if (loadedModel == null ){
83
+ loadedModel = loadToolModelMemoised (toolName );
84
+ toolModels .put (toolName , loadedModel );
85
+ }
86
+ return loadedModel ;
87
+ }
88
+
89
+ private <T extends Tool > ToolModel <T > loadToolModelMemoised (String toolName ) {
79
90
String className = getToolClassName (toolName );
80
91
if (className != null && className .startsWith (SCRIPT_PREFIX )){
81
92
return loadScriptTool (className , toolName );
0 commit comments