private <T extends Script> T loadViaCache(ClassLoader classLoader, Class<T> scriptBaseClass) {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("source.filename", source.getFileName());
properties.put("source.hash", HashUtil.createHash(source.getResource().getText()));
PersistentCache cache = cacheRepository.cache(String.format("scripts/%s", source.getClassName())).withProperties(properties).open();
File classesDir;
if (transformer != null) {
String subdirName = String.format("%s_%s", transformer.getId(), scriptBaseClass.getSimpleName());
classesDir = new File(cache.getBaseDir(), subdirName);
} else {
classesDir = new File(cache.getBaseDir(), scriptBaseClass.getSimpleName());
}
if (!cache.isValid() || !classesDir.exists()) {
scriptCompilationHandler.compileToDir(source, classLoader, classesDir, transformer, scriptBaseClass);
cache.markValid();
}
Class<? extends T> scriptClass = scriptCompilationHandler.loadFromDir(source, classLoader, classesDir,
scriptBaseClass);
return scriptBaseClass.cast(ReflectionUtil.newInstance(scriptClass, new Object[0]));
}