public BuildResults build() {
//KieBuilder is not re-usable for successive "full" builds
kieBuilder = kieServices.newKieBuilder( kieFileSystem );
final Results kieResults = kieBuilder.buildAll().getResults();
final BuildResults results = convertMessages( kieResults );
//Validate paths that are not handled by Kie
for ( Map.Entry<Path, BuildValidationHelper> e : nonKieResourceValidationHelpers.entrySet() ) {
final Path resource = e.getKey();
final BuildValidationHelper validator = e.getValue();
final List<ValidationMessage> validationMessages = validator.validate( Paths.convert( resource ) );
if ( !( validationMessages == null || validationMessages.isEmpty() ) ) {
for ( ValidationMessage validationMessage : validationMessages ) {
results.addBuildMessage( convertValidationMessage( validationMessage ) );
}
nonKieResourceValidationHelperMessages.put( resource,
validationMessages );
}
}
//Check external imports are available. These are loaded when a DMO is requested, but it's better to report them early
final org.uberfire.java.nio.file.Path nioExternalImportsPath = moduleDirectory.resolve( "project.imports" );
if ( Files.exists( nioExternalImportsPath ) ) {
final org.uberfire.backend.vfs.Path externalImportsPath = Paths.convert( nioExternalImportsPath );
final ProjectImports projectImports = projectService.load( externalImportsPath );
final Imports imports = projectImports.getImports();
for ( final Import item : imports.getImports() ) {
try {
Class clazz = this.getClass().getClassLoader().loadClass( item.getType() );
} catch ( ClassNotFoundException cnfe ) {
results.addBuildMessage( makeMessage( ERROR_CLASS_NOT_FOUND,
cnfe ) );
}
}
}
//At the end we are interested to ensure that external .jar files referenced as dependencies don't have
// referential inconsistencies. We will at least provide a basic algorithm to ensure that if an external class
// X references another external class Y, Y is also accessible by the class loader.
final KieModuleMetaData kieModuleMetaData = getKieModuleMetaData();
for ( final String packageName : kieModuleMetaData.getPackages() ) {
for ( final String className : kieModuleMetaData.getClasses( packageName ) ) {
final Class clazz = kieModuleMetaData.getClass( packageName, className );
final TypeSource typeSource = getClassSource( kieModuleMetaData, clazz );
if ( TypeSource.JAVA_DEPENDENCY == typeSource ) {
try {
verifyExternalClass( clazz );
} catch ( Throwable e ) {
results.addBuildMessage( makeMessage(
MessageFormat.format( ERROR_EXTERNAL_CLASS_VERIFICATON, clazz.getName() ), e ) );
}
}
}
}
//It's impossible to retrieve a KieContainer if the KieModule contains errors
if ( results.getMessages().isEmpty() ) {
kieContainer = kieServices.newKieContainer( kieBuilder.getKieModule().getReleaseId() );
}
return results;
}