/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.scanner; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import org.drools.compiler.kie.builder.impl.InternalKieModule; import org.drools.core.util.FileManager; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.kie.api.KieServices; import org.kie.api.builder.KieBuilder; import org.kie.api.builder.KieFileSystem; import org.kie.api.builder.ReleaseId; import org.kie.api.builder.model.KieModuleModel; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import static org.junit.Assert.assertTrue; import static org.kie.scanner.MavenRepository.getMavenRepository; public class KieModuleBuilderTest extends AbstractKieCiTest { private FileManager fileManager; @Before public void setUp() throws Exception { this.fileManager = new FileManager(); this.fileManager.setUp(); } @After public void tearDown() throws Exception { this.fileManager.tearDown(); } @Test public void testKieModuleUsingPOMMissingKBaseDefinition() throws Exception { KieServices ks = KieServices.Factory.get(); //Build a KieModule jar, deploy it into local Maven repository ReleaseId releaseId = ks.newReleaseId( "org.kie", "metadata-test2", "1.0-SNAPSHOT" ); String pomText = getPom( releaseId ); File pomFile = new File( System.getProperty( "java.io.tmpdir" ), MavenRepository.toFileName( releaseId, null ) + ".pom" ); try { FileOutputStream fos = new FileOutputStream( pomFile ); fos.write( pomText.getBytes() ); fos.flush(); fos.close(); } catch ( IOException e ) { throw new RuntimeException( e ); } KieFileSystem kfs = ks.newKieFileSystem(); kfs.writePomXML( getPom( releaseId ) ); kfs.write( "src/main/java/org/kie/test/Bean.java", createJavaSourceInPackage() ); KieBuilder kieBuilder1 = ks.newKieBuilder( kfs ); Assert.assertTrue( kieBuilder1.buildAll().getResults().getMessages().isEmpty() ); InternalKieModule kieModule = (InternalKieModule) kieBuilder1.getKieModule(); MavenRepository.getMavenRepository().installArtifact( releaseId, kieModule, pomFile ); //Build a second KieModule, depends on the first KieModule jar which we have deployed into Maven ReleaseId releaseId2 = ks.newReleaseId( "org.kie", "metadata-test-using-pom", "1.0-SNAPSHOT" ); String pomText2 = getPom( releaseId2, releaseId ); File pomFile2 = new File( System.getProperty( "java.io.tmpdir" ), MavenRepository.toFileName( releaseId2, null ) + ".pom" ); try { FileOutputStream fos = new FileOutputStream( pomFile2 ); fos.write( pomText2.getBytes() ); fos.flush(); fos.close(); } catch ( IOException e ) { throw new RuntimeException( e ); } //Try building the second KieModule KieServices kieServices = KieServices.Factory.get(); KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); InputStream is = new FileInputStream( pomFile2 ); KieModuleModel kproj2 = ks.newKieModuleModel(); kieFileSystem.write( "pom.xml", KieServices.Factory.get().getResources().newInputStreamResource( is ) ); kieFileSystem.writeKModuleXML( kproj2.toXML() ); kieFileSystem.write( "src/main/resources/rule.drl", createDRLWithImport( "rule1" ) ); KieBuilder kieBuilder = kieServices.newKieBuilder( kieFileSystem ); kieBuilder.buildAll(); assertTrue( kieBuilder.getResults().getMessages().isEmpty() ); } private String createJavaSourceInPackage() { return "package org.kie.test;\n" + "public class Bean {\n" + " private int value;\n" + " public int getValue() {\n" + " return value;\n" + " }\n" + "}"; } protected String createDRLWithImport( String ruleName ) { return "import org.kie.test.Bean\n" + "rule " + ruleName + "\n" + "when\n" + "Bean()\n" + "then\n" + "end\n"; } @Test public void testPomTypeDependencies() throws Exception { // RHBPMS-4634 KieServices ks = KieServices.Factory.get(); ReleaseId releaseIdNoDep = ks.newReleaseId( "org.kie", "test-no-dep", "1.0-SNAPSHOT" ); ReleaseId releaseIdWithDep = ks.newReleaseId( "org.kie", "test-with-dep", "1.0-SNAPSHOT" ); ReleaseId ejbReleaseId = ks.newReleaseId( "org.jboss.as", "jboss-as-ejb-client-bom", "7.1.1.Final" ); ReleaseId jmsReleaseId = ks.newReleaseId( "org.jboss.as", "jboss-as-jms-client-bom", "7.1.1.Final" ); String pom = getPomWithPomDependencies(releaseIdNoDep, ejbReleaseId, jmsReleaseId); File pomFile = fileManager.newFile("pom.xml"); fileManager.write(pomFile, pom); InternalKieModule kJar1 = createKieJarWithPomDependencies( ks, releaseIdNoDep, pom ); MavenRepository repository = getMavenRepository(); repository.installArtifact(releaseIdNoDep, kJar1, pomFile); InternalKieModule kJar2 = createKieJarWithDependencies( ks, releaseIdWithDep, true, "rule1", releaseIdNoDep); KieContainer kieContainer2 = ks.newKieContainer( releaseIdWithDep ); KieSession kieSession = kieContainer2.newKieSession(); } private InternalKieModule createKieJarWithPomDependencies(KieServices ks, ReleaseId releaseId, String pom) throws IOException { KieFileSystem kfs = createKieFileSystemWithKProject(ks, false); kfs.writePomXML(pom); kfs.write("src/main/java/org/kie/test/Bean.java", createJavaSource(3)); KieBuilder kieBuilder = ks.newKieBuilder(kfs); assertTrue(kieBuilder.buildAll().getResults().getMessages().isEmpty()); return (InternalKieModule) kieBuilder.getKieModule(); } private String getPomWithPomDependencies(ReleaseId releaseId, ReleaseId... dependencies) { String pom = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" + " xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n" + " <modelVersion>4.0.0</modelVersion>\n" + "\n" + " <groupId>" + releaseId.getGroupId() + "</groupId>\n" + " <artifactId>" + releaseId.getArtifactId() + "</artifactId>\n" + " <version>" + releaseId.getVersion() + "</version>\n" + "\n"; if (dependencies != null && dependencies.length > 0) { pom += "<dependencies>\n"; for (ReleaseId dep : dependencies) { pom += "<dependency>\n"; pom += " <groupId>" + dep.getGroupId() + "</groupId>\n"; pom += " <artifactId>" + dep.getArtifactId() + "</artifactId>\n"; pom += " <version>" + dep.getVersion() + "</version>\n"; pom += " <type>pom</type>\n"; pom += "</dependency>\n"; } pom += "</dependencies>\n"; } pom += "</project>"; return pom; } protected String createDRL(String ruleName) { return "import org.kie.test.Bean\n" + "rule " + ruleName + "\n" + "when\n" + " $b: Bean()\n" + "then\n" + " System.out.println($b);" + "end\n"; } }