/** * This method and the subsequent caching was added for performance reasons, since the dependencies calculation and * module class loader calculation tends to be time consuming when we manage module with transitives dependencies. * Since the module ClassLoader may change with ever incremental build it's better to store in the cache the * ClassLoader part that has the module dependencies. And the module ClassLoader can be easily calculated using * this ClassLoader as parent. Since current module classes are quickly calculated on each incremental build, etc. */ public static ClassLoader buildClassLoader(final KieModule module, final KieModuleMetaData kieModuleMetaData) { //By construction the parent class loader for the KieModuleMetadata.getClassLoader() is an URLClass loader //that has the module dependencies. So this implementation relies on this. BUT can easily be changed to //calculate this URL class loader given that we have the pom.xml and we can use maven libraries classes //to calculate module maven dependencies. This is basically what the KieModuleMetaData already does. The //optimization was added to avoid the maven transitive calculation on complex modules. final ClassLoader classLoader = kieModuleMetaData.getClassLoader().getParent(); if (classLoader instanceof URLClassLoader) { return classLoader; } else { //this case should never happen. But if ProjectClassLoader calculation for KieModuleMetadata changes at //the error will be notified for implementation review. throw new RuntimeException("It was not possible to calculate project dependencies class loader for project: " + module.getKModuleXMLPath()); } }
@Override public String[] loadDropDownExpression(final Path resource, final String[] valuePairs, final String expression) { //Lookup class-loader for Module (as the helper class can be a module dependency) final KieModule module = moduleService.resolveModule(resource); if (module == null) { logger.error("A Module could not be resolved for path '" + resource.toURI() + "'. No enums will be returned."); return null; } final org.kie.api.builder.KieModule kieModule = buildInfoService.getBuildInfo(module).getKieModuleIgnoringErrors(); if (kieModule == null) { logger.error("A KieModule could not be resolved for path '" + resource.toURI() + "'. No enums will be returned."); return null; } final ClassLoader classLoader = KieModuleMetaData.Factory.newKieModuleMetaData(kieModule).getClassLoader(); return loadDropDownExpression(classLoader, mvelEvaluator, valuePairs, expression); }
private List<ValidationMessage> doValidation(final Path path, final String content) { try { final KieModule module = moduleService.resolveModule(path); final org.kie.api.builder.KieModule kieModule = buildInfoService.getBuildInfo(module).getKieModuleIgnoringErrors(); final ClassLoader classLoader = KieModuleMetaData.Factory.newKieModuleMetaData(kieModule).getClassLoader(); final DataEnumLoader loader = new DataEnumLoader(content, classLoader, evaluator); if (!loader.hasErrors()) { return Collections.emptyList(); } else { final List<ValidationMessage> validationMessages = new ArrayList<>(); final List<String> loaderErrors = loader.getErrors(); for (final String message : loaderErrors) { validationMessages.add(makeValidationMessages(path, message)); } return validationMessages; } } catch (Exception e) { throw ExceptionUtilities.handleException(e); } }
private List<ValidationMessage> doValidation(final Path path, final String content) { try { final KieModule module = moduleService.resolveModule(path); final org.kie.api.builder.KieModule kieModule = buildInfoService.getBuildInfo(module).getKieModuleIgnoringErrors(); final ClassLoader classLoader = KieModuleMetaData.Factory.newKieModuleMetaData(kieModule).getClassLoader(); final DataEnumLoader loader = new DataEnumLoader(content, classLoader, evaluator); if (!loader.hasErrors()) { return Collections.emptyList(); } else { final List<ValidationMessage> validationMessages = new ArrayList<>(); final List<String> loaderErrors = loader.getErrors(); for (final String message : loaderErrors) { validationMessages.add(makeValidationMessages(path, message)); } return validationMessages; } } catch (Exception e) { throw ExceptionUtilities.handleException(e); } }
public ClassLoader getModuleClassLoader(final KieModule kieModule) { final org.kie.api.builder.KieModule module = buildInfoService.getBuildInfo(kieModule).getKieModuleIgnoringErrors(); ClassLoader dependenciesClassLoader = dependenciesClassLoaderCache.assertDependenciesClassLoader(kieModule); ClassLoader moduleClassLoader; if (module instanceof InternalKieModule) { //will always be an internal kie module InternalKieModule internalModule = (InternalKieModule) module; moduleClassLoader = new MapClassLoader(internalModule.getClassesMap(), dependenciesClassLoader); } else { moduleClassLoader = KieModuleMetaData.Factory.newKieModuleMetaData(module).getClassLoader(); } return moduleClassLoader; } }
private void loadEnumsForPackage(final PackageDataModelOracleBuilder dmoBuilder, final KieModule module, final Package pkg) { final org.kie.api.builder.KieModule kieModule = buildInfoService.getBuildInfo(module).getKieModuleIgnoringErrors(); final ClassLoader classLoader = KieModuleMetaData.Factory.newKieModuleMetaData(kieModule).getClassLoader(); final org.uberfire.java.nio.file.Path nioPackagePath = Paths.convert(pkg.getPackageMainResourcesPath()); final Collection<org.uberfire.java.nio.file.Path> enumFiles = fileDiscoveryService.discoverFiles(nioPackagePath, FILTER_ENUMERATIONS); for (final org.uberfire.java.nio.file.Path path : enumFiles) { final String enumDefinition = ioService.readAllString(path); dmoBuilder.addEnum(enumDefinition, classLoader); } }