/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieBuilderImpl.java

https://github.com/reinaldohr88/drools · Java · 599 lines · 496 code · 89 blank · 14 comment · 102 complexity · 7127a6d0dce0af523ed733261d7840a1 MD5 · raw file

  1. package org.drools.compiler.kie.builder.impl;
  2. import org.drools.compiler.commons.jci.compilers.CompilationResult;
  3. import org.drools.compiler.commons.jci.compilers.EclipseJavaCompiler;
  4. import org.drools.compiler.commons.jci.compilers.EclipseJavaCompilerSettings;
  5. import org.drools.compiler.commons.jci.problems.CompilationProblem;
  6. import org.drools.compiler.commons.jci.readers.DiskResourceReader;
  7. import org.drools.compiler.commons.jci.readers.ResourceReader;
  8. import org.drools.compiler.compiler.io.memory.MemoryFileSystem;
  9. import org.drools.compiler.kproject.ReleaseIdImpl;
  10. import org.drools.compiler.kproject.models.KieModuleModelImpl;
  11. import org.drools.compiler.kproject.xml.PomModel;
  12. import org.drools.core.builder.conf.impl.ResourceConfigurationImpl;
  13. import org.drools.core.util.StringUtils;
  14. import org.kie.api.KieBaseConfiguration;
  15. import org.kie.api.KieServices;
  16. import org.kie.api.builder.KieBuilder;
  17. import org.kie.api.builder.KieFileSystem;
  18. import org.kie.api.builder.KieModule;
  19. import org.kie.api.builder.KieRepository;
  20. import org.kie.api.builder.Message.Level;
  21. import org.kie.api.builder.ReleaseId;
  22. import org.kie.api.builder.Results;
  23. import org.kie.api.builder.model.KieBaseModel;
  24. import org.kie.api.builder.model.KieModuleModel;
  25. import org.kie.api.builder.model.KieSessionModel;
  26. import org.kie.api.io.Resource;
  27. import org.kie.api.io.ResourceConfiguration;
  28. import org.kie.api.io.ResourceType;
  29. import org.kie.internal.KnowledgeBaseFactory;
  30. import org.kie.internal.builder.IncrementalResults;
  31. import org.kie.internal.builder.InternalKieBuilder;
  32. import org.kie.internal.builder.KieBuilderSet;
  33. import org.kie.internal.io.ResourceTypeImpl;
  34. import java.io.ByteArrayInputStream;
  35. import java.io.File;
  36. import java.io.IOException;
  37. import java.util.ArrayList;
  38. import java.util.Arrays;
  39. import java.util.Collection;
  40. import java.util.Enumeration;
  41. import java.util.List;
  42. import java.util.Properties;
  43. import java.util.zip.ZipEntry;
  44. import java.util.zip.ZipFile;
  45. public class KieBuilderImpl
  46. implements
  47. InternalKieBuilder {
  48. static final String RESOURCES_ROOT = "src/main/resources/";
  49. static final String JAVA_ROOT = "src/main/java/";
  50. static final String JAVA_TEST_ROOT = "src/test/java/";
  51. private ResultsImpl results;
  52. private final ResourceReader srcMfs;
  53. private MemoryFileSystem trgMfs;
  54. private MemoryKieModule kModule;
  55. private PomModel pomModel;
  56. private byte[] pomXml;
  57. private ReleaseId releaseId;
  58. private byte[] kModuleModelXml;
  59. private KieModuleModel kModuleModel;
  60. private Collection<KieModule> kieDependencies;
  61. private Collection<ReleaseId> jarDependencies;
  62. private KieBuilderSetImpl kieBuilderSet;
  63. public KieBuilderImpl(File file) {
  64. this.srcMfs = new DiskResourceReader( file );
  65. }
  66. public KieBuilderImpl(KieFileSystem kieFileSystem) {
  67. srcMfs = ((KieFileSystemImpl) kieFileSystem).asMemoryFileSystem();
  68. }
  69. public KieBuilder setDependencies(KieModule... dependencies) {
  70. this.kieDependencies = Arrays.asList(dependencies);
  71. return this;
  72. }
  73. public KieBuilder setDependencies(Resource... resources) {
  74. KieRepositoryImpl kr = (KieRepositoryImpl) KieServices.Factory.get().getRepository();
  75. List<KieModule> list = new ArrayList<KieModule>();
  76. for ( Resource res : resources ) {
  77. InternalKieModule depKieMod = (InternalKieModule) kr.getKieModule( res );
  78. list.add( depKieMod );
  79. }
  80. this.kieDependencies = list;
  81. return this;
  82. }
  83. private void init() {
  84. KieServices ks = KieServices.Factory.get();
  85. results = new ResultsImpl();
  86. // if pomXML is null it will generate a default, using default ReleaseId
  87. // if pomXml is invalid, it assign pomModel to null
  88. buildPomModel();
  89. // if kModuleModelXML is null it will generate a default kModule, with a default kbase name
  90. // if kModuleModelXML is invalid, it will kModule to null
  91. buildKieModuleModel();
  92. if ( pomModel != null ) {
  93. // creates ReleaseId from build pom
  94. // If the pom was generated, it will be the same as teh default ReleaseId
  95. releaseId = pomModel.getReleaseId();
  96. // add all the pom dependencies to this builder ... not sure this is a good idea (?)
  97. KieRepositoryImpl repository = (KieRepositoryImpl) ks.getRepository();
  98. for ( ReleaseId dep : pomModel.getDependencies() ) {
  99. KieModule depModule = repository.getKieModule( dep, pomXml );
  100. if ( depModule != null ) {
  101. addKieDependency( depModule );
  102. } else {
  103. addJarDependency( dep );
  104. }
  105. }
  106. } else {
  107. // if the pomModel is null it means that the provided pom.xml is invalid so use the default releaseId
  108. releaseId = KieServices.Factory.get().getRepository().getDefaultReleaseId();
  109. }
  110. }
  111. private void addKieDependency(KieModule depModule) {
  112. if ( kieDependencies == null ) {
  113. kieDependencies = new ArrayList<KieModule>();
  114. }
  115. kieDependencies.add( depModule );
  116. }
  117. private void addJarDependency(ReleaseId releaseId) {
  118. if ( jarDependencies == null ) {
  119. jarDependencies = new ArrayList<ReleaseId>();
  120. }
  121. jarDependencies.add( releaseId );
  122. }
  123. public KieBuilder buildAll() {
  124. init();
  125. // kModuleModel will be null if a provided pom.xml or kmodule.xml is invalid
  126. if ( !isBuilt() && kModuleModel != null ) {
  127. trgMfs = new MemoryFileSystem();
  128. writePomAndKModule();
  129. addKBasesFilesToTrg();
  130. markSource();
  131. kModule = new MemoryKieModule( releaseId,
  132. kModuleModel,
  133. trgMfs );
  134. if ( kieDependencies != null && !kieDependencies.isEmpty() ) {
  135. for ( KieModule kieModule : kieDependencies ) {
  136. kModule.addKieDependency( (InternalKieModule) kieModule );
  137. }
  138. }
  139. if (pomModel != null) {
  140. kModule.setPomModel(pomModel);
  141. }
  142. KieModuleKieProject kProject = new KieModuleKieProject( kModule );
  143. for (ReleaseId unresolvedDep : kModule.getUnresolvedDependencies()) {
  144. results.addMessage(Level.ERROR, "pom.xml", "Unresolved dependency " + unresolvedDep);
  145. }
  146. compileJavaClasses(kProject.getClassLoader());
  147. if ( buildKieProject( kModule, results, kProject ) ) {
  148. new KieMetaInfoBuilder(trgMfs, kModule).writeKieModuleMetaInfo();
  149. }
  150. }
  151. return this;
  152. }
  153. void markSource() {
  154. srcMfs.mark();
  155. }
  156. Collection<String> getModifiedResourcesSinceLastMark() {
  157. return srcMfs.getModifiedResourcesSinceLastMark();
  158. }
  159. void updateKieModuleMetaInfo() {
  160. new KieMetaInfoBuilder(trgMfs, kModule).writeKieModuleMetaInfo();
  161. }
  162. public static String getCompilationCachePath(ReleaseId releaseId,
  163. String kbaseName) {
  164. return ((ReleaseIdImpl) releaseId).getCompilationCachePathPrefix() + kbaseName.replace( '.', '/' ) + "/kbase.cache";
  165. }
  166. public static boolean buildKieModule(InternalKieModule kModule,
  167. ResultsImpl messages ) {
  168. return buildKieProject(kModule, messages, new KieModuleKieProject( kModule ));
  169. }
  170. private static boolean buildKieProject(InternalKieModule kModule, ResultsImpl messages, KieModuleKieProject kProject) {
  171. kProject.init();
  172. kProject.verify(messages);
  173. if ( messages.filterMessages( Level.ERROR ).isEmpty() ) {
  174. KieRepository kieRepository = KieServices.Factory.get().getRepository();
  175. kieRepository.addKieModule(kModule);
  176. for (InternalKieModule kDep : kModule.getKieDependencies().values()) {
  177. kieRepository.addKieModule(kDep);
  178. }
  179. return true;
  180. }
  181. return false;
  182. }
  183. private void addKBasesFilesToTrg() {
  184. for ( KieBaseModel kieBaseModel : kModuleModel.getKieBaseModels().values() ) {
  185. addKBaseFilesToTrg( kieBaseModel );
  186. }
  187. }
  188. private KieBaseConfiguration getKnowledgeBaseConfiguration(KieBaseModel kieBase,
  189. Properties properties,
  190. ClassLoader... classLoaders) {
  191. KieBaseConfiguration kbConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( properties, classLoaders );
  192. kbConf.setOption( kieBase.getEqualsBehavior() );
  193. kbConf.setOption( kieBase.getEventProcessingMode() );
  194. kbConf.setOption( kieBase.getDeclarativeAgenda() );
  195. return kbConf;
  196. }
  197. private void addKBaseFilesToTrg(KieBaseModel kieBase) {
  198. for ( String fileName : srcMfs.getFileNames() ) {
  199. fileName = fileName.replace(File.separatorChar, '/');
  200. if ( fileName.startsWith( RESOURCES_ROOT ) && isFileInKieBase( kieBase, fileName ) ) {
  201. copySourceToTarget( fileName );
  202. }
  203. }
  204. }
  205. String copySourceToTarget(String fileName) {
  206. if ( !fileName.startsWith(RESOURCES_ROOT) ) {
  207. return null;
  208. }
  209. byte[] bytes = srcMfs.getBytes( fileName );
  210. String trgFileName = fileName.substring( RESOURCES_ROOT.length() );
  211. if ( bytes != null ) {
  212. FormatConverter formatConverter = FormatsManager.get().getConverterFor( trgFileName );
  213. if ( formatConverter != null ) {
  214. FormatConversionResult result = formatConverter.convert( trgFileName, bytes );
  215. trgFileName = result.getConvertedName();
  216. trgMfs.write( trgFileName, result.getContent(), true );
  217. } else if ( getResourceType( fileName ) != null ) {
  218. trgMfs.write( trgFileName, bytes, true );
  219. }
  220. } else {
  221. trgMfs.remove( trgFileName );
  222. }
  223. return trgFileName;
  224. }
  225. private ResourceType getResourceType(String fileName) {
  226. if (srcMfs.isAvailable(fileName + ".properties")) {
  227. // configuration file available
  228. Properties prop = new Properties();
  229. try {
  230. prop.load(new ByteArrayInputStream(srcMfs.getBytes(fileName + ".properties")));
  231. return getResourceType( ResourceTypeImpl.fromProperties(prop) );
  232. } catch (IOException e) { }
  233. }
  234. return null;
  235. }
  236. void cloneKieModuleForIncrementalCompilation() {
  237. trgMfs = trgMfs.clone();
  238. init();
  239. kModule = kModule.cloneForIncrementalCompilation( releaseId, kModuleModel, trgMfs );
  240. }
  241. private void addMetaInfBuilder() {
  242. for ( String fileName : srcMfs.getFileNames() ) {
  243. if ( fileName.startsWith( RESOURCES_ROOT ) && !FormatsManager.isKieExtension( fileName ) ) {
  244. byte[] bytes = srcMfs.getBytes( fileName );
  245. trgMfs.write( fileName.substring( RESOURCES_ROOT.length() - 1 ),
  246. bytes,
  247. true );
  248. }
  249. }
  250. }
  251. private static ResourceType getResourceType(InternalKieModule kieModule, String fileName) {
  252. return getResourceType(kieModule.getResourceConfiguration(fileName));
  253. }
  254. private static ResourceType getResourceType(ResourceConfiguration conf) {
  255. return conf instanceof ResourceConfigurationImpl ? ((ResourceConfigurationImpl)conf).getResourceType() : null;
  256. }
  257. public static boolean filterFileInKBase(InternalKieModule kieModule, KieBaseModel kieBase, String fileName) {
  258. return isFileInKieBase( kieBase, fileName ) &&
  259. (FormatsManager.isKieExtension( fileName ) || getResourceType(kieModule, fileName) != null);
  260. }
  261. private static boolean isFileInKieBase(KieBaseModel kieBase, String fileName) {
  262. if ( kieBase.getPackages().isEmpty() ) {
  263. return true;
  264. } else {
  265. int lastSep = fileName.lastIndexOf( "/" );
  266. String pkgNameForFile = lastSep > 0 ? fileName.substring( 0, lastSep ) : fileName;
  267. pkgNameForFile = pkgNameForFile.replace( '/', '.' );
  268. for ( String pkgName : kieBase.getPackages() ) {
  269. boolean isNegative = pkgName.startsWith( "!" );
  270. if ( isNegative ) {
  271. pkgName = pkgName.substring( 1 );
  272. }
  273. if ( pkgName.equals( "*" ) || pkgNameForFile.endsWith( pkgName ) ||
  274. (pkgName.endsWith( ".*" ) && pkgNameForFile.contains( pkgName.substring( 0, pkgName.length() - 2 ) )) ) {
  275. return !isNegative;
  276. }
  277. }
  278. return false;
  279. }
  280. }
  281. public Results getResults() {
  282. if ( !isBuilt() ) {
  283. buildAll();
  284. }
  285. return results;
  286. }
  287. public KieModule getKieModule() {
  288. return getKieModule( false );
  289. }
  290. public KieModule getKieModuleIgnoringErrors() {
  291. return getKieModule( true );
  292. }
  293. private KieModule getKieModule(boolean ignoreErrors) {
  294. if ( !isBuilt() ) {
  295. buildAll();
  296. }
  297. if ( !ignoreErrors && (getResults().hasMessages( Level.ERROR ) || kModule == null) ) {
  298. throw new RuntimeException( "Unable to get KieModule, Errors Existed" );
  299. }
  300. return kModule;
  301. }
  302. private boolean isBuilt() {
  303. return kModule != null;
  304. }
  305. private void buildKieModuleModel() {
  306. if ( srcMfs.isAvailable( KieModuleModelImpl.KMODULE_SRC_PATH ) ) {
  307. kModuleModelXml = srcMfs.getBytes( KieModuleModelImpl.KMODULE_SRC_PATH );
  308. try {
  309. kModuleModel = KieModuleModelImpl.fromXML( new ByteArrayInputStream( kModuleModelXml ) );
  310. } catch ( Exception e ) {
  311. results.addMessage( Level.ERROR,
  312. "kmodule.xml",
  313. "kmodule.xml found, but unable to read\n" + e.getMessage() );
  314. }
  315. } else {
  316. // There's no kmodule.xml, create a defualt one
  317. kModuleModel = KieServices.Factory.get().newKieModuleModel();
  318. }
  319. if ( setDefaultsforEmptyKieModule( kModuleModel ) ) {
  320. kModuleModelXml = kModuleModel.toXML().getBytes();
  321. }
  322. }
  323. public static boolean setDefaultsforEmptyKieModule(KieModuleModel kModuleModel) {
  324. if ( kModuleModel != null && kModuleModel.getKieBaseModels().isEmpty() ) {
  325. // would be null if they pass a corrupted kModuleModel
  326. KieBaseModel kieBaseModel = kModuleModel.newKieBaseModel( "defaultKieBase" ).addPackage( "*" ).setDefault( true );
  327. kieBaseModel.newKieSessionModel( "defaultKieSession" ).setDefault( true );
  328. kieBaseModel.newKieSessionModel( "defaultStatelessKieSession" ).setType( KieSessionModel.KieSessionType.STATELESS ).setDefault( true );
  329. return true;
  330. }
  331. return false;
  332. }
  333. private void buildPomModel() {
  334. pomXml = getOrGeneratePomXml( srcMfs );
  335. if ( pomXml == null ) {
  336. // will be null if the provided pom is invalid
  337. return;
  338. }
  339. try {
  340. PomModel tempPomModel = PomModel.Parser.parse( "pom.xml",
  341. new ByteArrayInputStream( pomXml ) );
  342. validatePomModel( tempPomModel ); // throws an exception if invalid
  343. pomModel = tempPomModel;
  344. } catch ( Exception e ) {
  345. results.addMessage( Level.ERROR,
  346. "pom.xml",
  347. "maven pom.xml found, but unable to read\n" + e.getMessage() );
  348. }
  349. }
  350. public static void validatePomModel(PomModel pomModel) {
  351. ReleaseId pomReleaseId = pomModel.getReleaseId();
  352. if ( StringUtils.isEmpty( pomReleaseId.getGroupId() ) || StringUtils.isEmpty( pomReleaseId.getArtifactId() ) || StringUtils.isEmpty( pomReleaseId.getVersion() ) ) {
  353. throw new RuntimeException( "Maven pom.properties exists but ReleaseId content is malformed" );
  354. }
  355. }
  356. public static byte[] getOrGeneratePomXml(ResourceReader mfs) {
  357. if ( mfs.isAvailable( "pom.xml" ) ) {
  358. return mfs.getBytes( "pom.xml" );
  359. } else {
  360. // There is no pom.xml, and thus no ReleaseId, so generate a pom.xml from the global detault.
  361. return generatePomXml( KieServices.Factory.get().getRepository().getDefaultReleaseId() ).getBytes();
  362. }
  363. }
  364. public void writePomAndKModule() {
  365. addMetaInfBuilder();
  366. if ( pomXml != null ) {
  367. ReleaseIdImpl g = (ReleaseIdImpl) releaseId;
  368. trgMfs.write( g.getPomXmlPath(),
  369. pomXml,
  370. true );
  371. trgMfs.write( g.getPomPropertiesPath(),
  372. generatePomProperties( releaseId ).getBytes(),
  373. true );
  374. }
  375. if ( kModuleModelXml != null ) {
  376. trgMfs.write( KieModuleModelImpl.KMODULE_JAR_PATH,
  377. kModuleModel.toXML().getBytes(),
  378. true );
  379. }
  380. }
  381. public static String generatePomXml(ReleaseId releaseId) {
  382. StringBuilder sBuilder = new StringBuilder();
  383. sBuilder.append( "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n" );
  384. sBuilder.append( " xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"> \n" );
  385. sBuilder.append( " <modelVersion>4.0.0</modelVersion> \n" );
  386. sBuilder.append( " <groupId>" );
  387. sBuilder.append( releaseId.getGroupId() );
  388. sBuilder.append( "</groupId> \n" );
  389. sBuilder.append( " <artifactId>" );
  390. sBuilder.append( releaseId.getArtifactId() );
  391. sBuilder.append( "</artifactId> \n" );
  392. sBuilder.append( " <version>" );
  393. sBuilder.append( releaseId.getVersion() );
  394. sBuilder.append( "</version> \n" );
  395. sBuilder.append( " <packaging>jar</packaging> \n" );
  396. sBuilder.append( " <name>Default</name> \n" );
  397. sBuilder.append( "</project> \n" );
  398. return sBuilder.toString();
  399. }
  400. public static String generatePomProperties(ReleaseId releaseId) {
  401. StringBuilder sBuilder = new StringBuilder();
  402. sBuilder.append( "groupId=" );
  403. sBuilder.append( releaseId.getGroupId() );
  404. sBuilder.append( "\n" );
  405. sBuilder.append( "artifactId=" );
  406. sBuilder.append( releaseId.getArtifactId() );
  407. sBuilder.append( "\n" );
  408. sBuilder.append( "version=" );
  409. sBuilder.append( releaseId.getVersion() );
  410. sBuilder.append( "\n" );
  411. return sBuilder.toString();
  412. }
  413. private void compileJavaClasses(ClassLoader classLoader) {
  414. List<String> classFiles = new ArrayList<String>();
  415. for ( String fileName : srcMfs.getFileNames() ) {
  416. if ( fileName.endsWith( ".class" ) ) {
  417. trgMfs.write( fileName,
  418. srcMfs.getBytes( fileName ),
  419. true );
  420. classFiles.add( fileName.substring( 0,
  421. fileName.length() - ".class".length() ) );
  422. }
  423. }
  424. List<String> javaFiles = new ArrayList<String>();
  425. List<String> javaTestFiles = new ArrayList<String>();
  426. for ( String fileName : srcMfs.getFileNames() ) {
  427. if ( fileName.endsWith( ".java" ) && !classFiles.contains( fileName.substring( 0,
  428. fileName.length() - ".java".length() ) ) ) {
  429. fileName = fileName.replace(File.separatorChar, '/');
  430. if ( !fileName.startsWith(JAVA_ROOT) && !fileName.startsWith(JAVA_TEST_ROOT) ) {
  431. results.addMessage(Level.WARNING, fileName, "Found Java file out of the Java source folder: \"" + fileName + "\"");
  432. } else if ( fileName.substring(JAVA_ROOT.length()).indexOf('/') < 0 ) {
  433. results.addMessage(Level.ERROR, fileName, "A Java class must have a package: " + fileName.substring(JAVA_ROOT.length()) + " is not allowed");
  434. } else {
  435. if (fileName.startsWith(JAVA_ROOT)) {
  436. javaFiles.add( fileName );
  437. } else {
  438. javaTestFiles.add( fileName );
  439. }
  440. }
  441. }
  442. }
  443. compileJavaClasses(classLoader, javaFiles, JAVA_ROOT);
  444. compileJavaClasses(classLoader, javaTestFiles, JAVA_TEST_ROOT);
  445. }
  446. private void compileJavaClasses(ClassLoader classLoader, List<String> javaFiles, String rootFolder) {
  447. if ( !javaFiles.isEmpty() ) {
  448. String[] sourceFiles = javaFiles.toArray( new String[javaFiles.size()] );
  449. EclipseJavaCompiler compiler = createCompiler( rootFolder );
  450. CompilationResult res = compiler.compile( sourceFiles,
  451. srcMfs,
  452. trgMfs,
  453. classLoader );
  454. for ( CompilationProblem problem : res.getErrors() ) {
  455. results.addMessage( problem );
  456. }
  457. for ( CompilationProblem problem : res.getWarnings() ) {
  458. results.addMessage( problem );
  459. }
  460. }
  461. }
  462. public static String findPomProperties(ZipFile zipFile) {
  463. Enumeration< ? extends ZipEntry> zipEntries = zipFile.entries();
  464. while ( zipEntries.hasMoreElements() ) {
  465. ZipEntry zipEntry = zipEntries.nextElement();
  466. String fileName = zipEntry.getName();
  467. if ( fileName.endsWith( "pom.properties" ) && fileName.startsWith( "META-INF/maven/" ) ) {
  468. return fileName;
  469. }
  470. }
  471. return null;
  472. }
  473. public static File findPomProperties(java.io.File root) {
  474. File mavenRoot = new File( root,
  475. "META-INF/maven" );
  476. return recurseToPomProperties( mavenRoot );
  477. }
  478. public static File recurseToPomProperties(File file) {
  479. if( file.isDirectory() ) {
  480. for ( java.io.File child : file.listFiles() ) {
  481. if ( child.isDirectory() ) {
  482. File returnedFile = recurseToPomProperties( child );
  483. if ( returnedFile != null ) {
  484. return returnedFile;
  485. }
  486. } else if ( child.getName().endsWith( "pom.properties" ) ) {
  487. return child;
  488. }
  489. }
  490. }
  491. return null;
  492. }
  493. private EclipseJavaCompiler createCompiler(String prefix) {
  494. EclipseJavaCompilerSettings settings = new EclipseJavaCompilerSettings();
  495. settings.setSourceVersion( "1.5" );
  496. settings.setTargetVersion( "1.5" );
  497. return new EclipseJavaCompiler( settings,
  498. prefix );
  499. }
  500. @Override
  501. public KieBuilderSet createFileSet(String... files) {
  502. if ( kieBuilderSet == null ) {
  503. kieBuilderSet = new KieBuilderSetImpl( this );
  504. }
  505. return kieBuilderSet.setFiles( files );
  506. }
  507. public IncrementalResults incrementalBuild() {
  508. return new KieBuilderSetImpl( this ).build();
  509. }
  510. }