@Override public Vfs.Dir createDir(URL url) { KieModule kieModule = ((InternalKieContainer) kieContainer).getMainKieModule(); if (!(kieModule instanceof MemoryKieModule)) { throw new IllegalStateException("The classpath url (" + url + ") has an mfs protocol but the kieModule (" + kieModule + ") is not an instance of " + MemoryKieModule.class.getSimpleName() + "."); } MemoryFileSystem memoryFileSystem = ((MemoryKieModule) kieModule).getMemoryFileSystem(); Folder folder = memoryFileSystem.getFolder(url.toExternalForm().substring("mfs:/".length())); return new ReflectionsKieVfsDir(folder); }
@Test public void testGetResourceTrailingSlashIgnored() throws Exception { MemoryFileSystem mfs = new MemoryFileSystem(); mfs.setFileContents(new MemoryFile(mfs, "my-file1", mfs.getFolder("src/main/resources")), new byte[] {65, 66}); MemoryKieModule mkm = new MemoryKieModule(releaseId, kieModuleModel, mfs); ResourceProvider resourceProvider = mkm.createResourceProvider(); String noTrailingSlashContents = IOUtils.toString(resourceProvider.getResourceAsStream("src/main/resources/my-file1")); Assertions.assertThat(noTrailingSlashContents).hasLineCount(1).contains("AB"); // "AB" == new byte[] {65, 66} String withTrailingSlashContents = IOUtils.toString(resourceProvider.getResourceAsStream("src/main/resources/my-file1/")); Assertions.assertThat(withTrailingSlashContents).hasLineCount(1).contains("AB"); // "AB" == new byte[] {65, 66} }
@Test public void testGetResourceAsStreamForFile() throws Exception { MemoryFileSystem mfs = new MemoryFileSystem(); mfs.setFileContents(new MemoryFile(mfs, "my-file1", mfs.getFolder("src/main/resources")), new byte[] {65, 66}); MemoryKieModule mkm = new MemoryKieModule(releaseId, kieModuleModel, mfs); ResourceProvider resourceProvider = mkm.createResourceProvider(); String folderContents = IOUtils.toString(resourceProvider.getResourceAsStream("src/main/resources/my-file1")); Assertions.assertThat(folderContents).hasLineCount(1).contains("AB"); // "AB" == new byte[] {65, 66} }
@Test public void testGetResourceForFolderWithFilesAndSubFolders() throws Exception { MemoryFileSystem mfs = new MemoryFileSystem(); mfs.createFolder(new MemoryFolder(mfs, "src/main/java")); mfs.createFolder(new MemoryFolder(mfs, "src/main/java/org")); mfs.createFolder(new MemoryFolder(mfs, "src/main/java/com")); mfs.setFileContents(new MemoryFile(mfs, "my-file1", mfs.getFolder("src/main/java")), new byte[10]); mfs.setFileContents(new MemoryFile(mfs, "my-file2", mfs.getFolder("src/main/java")), new byte[10]); MemoryKieModule mkm = new MemoryKieModule(releaseId, kieModuleModel, mfs); ResourceProvider resourceProvider = mkm.createResourceProvider(); String folderContents = IOUtils.toString(resourceProvider.getResource("src/main/java").openStream()); Assertions.assertThat(folderContents).hasLineCount(4).contains("com", "org", "my-file1", "my-file2"); }
@Test public void testCreateAndCopyFolder() { MemoryFileSystem memoryFileSystem = new MemoryFileSystem(); // this also creates a folder if it doesn't exist final Folder emptyFolder = memoryFileSystem.getFolder("emptyfolder"); final MemoryFolder destinationFolder = new MemoryFolder(memoryFileSystem, "destinationfolder"); memoryFileSystem.createFolder(destinationFolder); memoryFileSystem.copyFolder(emptyFolder, memoryFileSystem, destinationFolder); } }
@Test public void testMemoryFileSystemFolderUniqueness() { KieServices kieServices = KieServices.Factory.get(); String drl = "package org.drools.test\n" + "rule R1 when\n" + " $m : Object()\n" + "then\n" + "end\n"; Resource resource = kieServices.getResources().newReaderResource( new StringReader( drl), "UTF-8" ); resource.setTargetPath("org/drools/test/rules.drl"); String kmodule = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<kmodule xmlns=\"http://www.drools.org/xsd/kmodule\">\n" + " <kbase name=\"testKbase\" packages=\"org.drools.test\">\n" + " <ksession name=\"testKsession\"/>\n" + " </kbase>\n" + "</kmodule>"; // Create an in-memory jar for version 1.0.0 ReleaseId releaseId = kieServices.newReleaseId("org.kie", "test-delete", "1.0.0"); createAndDeployJar(kieServices, kmodule, releaseId, resource); KieContainer kieContainer = kieServices.newKieContainer(releaseId); KieModule kieModule = ((InternalKieContainer) kieContainer).getMainKieModule(); MemoryFileSystem memoryFileSystem = ((MemoryKieModule) kieModule).getMemoryFileSystem(); Folder rootFolder = memoryFileSystem.getFolder(""); Object[] members = rootFolder.getMembers().toArray(); assertEquals(2, members.length); Folder firstFolder = (Folder) members[0]; Folder secondFolder = (Folder) members[1]; assertEquals(firstFolder.getParent(), secondFolder.getParent()); }
@Override public void writeProjectOutput(MemoryFileSystem trgMfs, ResultsImpl messages) { MemoryFileSystem srcMfs = new MemoryFileSystem(); List<String> modelFiles = new ArrayList<>(); ModelWriter modelWriter = new ModelWriter(); for (ModelBuilderImpl modelBuilder : modelBuilders) { ModelWriter.Result result = modelWriter.writeModel(srcMfs, modelBuilder.getPackageModels()); modelFiles.addAll(result.getModelFiles()); final Folder sourceFolder = srcMfs.getFolder("src/main/java"); final Folder targetFolder = trgMfs.getFolder("."); srcMfs.copyFolder(sourceFolder, trgMfs, targetFolder); } modelWriter.writeModelFile(modelFiles, trgMfs); } }
@Override public void writeProjectOutput(MemoryFileSystem trgMfs, ResultsImpl messages) { MemoryFileSystem srcMfs = new MemoryFileSystem(); List<String> modelFiles = new ArrayList<>(); ModelWriter modelWriter = new ModelWriter(); for (ModelBuilderImpl modelBuilder : modelBuilders) { ModelWriter.Result result = modelWriter.writeModel(srcMfs, modelBuilder.getPackageModels()); modelFiles.addAll(result.getModelFiles()); final Folder sourceFolder = srcMfs.getFolder("src/main/java"); final Folder targetFolder = trgMfs.getFolder("."); srcMfs.copyFolder(sourceFolder, trgMfs, targetFolder); } modelWriter.writeModelFile(modelFiles, trgMfs); } }
public List<String> compile(KieModuleModel kproj, MemoryFileSystem srcMfs, MemoryFileSystem trgMfs, List<String> classes) { for ( KieBaseModel kbase : kproj.getKieBaseModels().values() ) { Folder srcFolder = srcMfs.getFolder( "src/main/resources/" + kbase.getName() ); Folder trgFolder = trgMfs.getFolder(kbase.getName()); copyFolder( srcMfs, srcFolder, trgMfs, trgFolder, kproj ); } Folder srcFolder = srcMfs.getFolder( "META-INF" ); Folder trgFolder = trgMfs.getFolder( "META-INF" ); trgFolder.create(); copyFolder( srcMfs, srcFolder, trgMfs, trgFolder, kproj ); EclipseJavaCompilerSettings settings = new EclipseJavaCompilerSettings(); settings.setSourceVersion( "1.5" ); settings.setTargetVersion( "1.5" ); EclipseJavaCompiler compiler = new EclipseJavaCompiler( settings, "" ); CompilationResult res = compiler.compile( classes.toArray( new String[classes.size()] ), trgMfs, trgMfs ); if ( res.getErrors().length > 0 ) { fail( res.getErrors()[0].getMessage() ); } List<String> classes2 = new ArrayList<String>( classes.size() ); for ( String str : classes ) { classes2.add( filenameToClassname( str ) ); } return classes2; }
public void copyFolder(MemoryFileSystem srcMfs, Folder srcFolder, MemoryFileSystem trgMfs, Folder trgFolder, KieModuleModel kproj) { if ( !trgFolder.exists() ) { trgMfs.getFolder( trgFolder.getPath() ).create(); } Collection<Resource> col = (Collection<Resource>) srcFolder.getMembers(); if (col == null) { return; } for ( Resource rs : col ) { if ( rs instanceof Folder ) { copyFolder( srcMfs, (Folder) rs, trgMfs, trgFolder.getFolder( ((Folder) rs).getName() ), kproj ); } else { MemoryFile trgFile = (MemoryFile) trgFolder.getFile( ((File) rs).getName() ); try { trgMfs.setFileContents( trgFile, srcMfs.getFileContents( (MemoryFile) rs ) ); } catch ( IOException e ) { throw new RuntimeException( e ); } } } }