/*
* Copyright 2016 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.
* You may obtain a copy of the License at
*
* 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.drools.compiler.integrationtests;
import org.drools.compiler.CommonTestMethodBase;
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.KieBaseModel;
import org.kie.api.builder.model.KieModuleModel;
import org.kie.api.builder.model.KieSessionModel;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import java.io.IOException;
import java.io.StringReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class ClassLoaderTest extends CommonTestMethodBase {
@Test
public void testClassLoaderGetResourcesFromWithin() throws IOException {
// DROOLS-1108
KieServices kieServices = KieServices.Factory.get();
String drl1 = "package org.drools.testdrl;\n" +
"global java.util.List list;\n" +
"rule R when\n" +
"then\n" +
" java.net.URL url = drools.getProjectClassLoader().getResource(\"META-INF/foo.xml\");\n" +
" if (url != null) list.add(url);\n" +
"end\n";
Resource resource1 = kieServices.getResources().newReaderResource( new StringReader( drl1 ), "UTF-8" );
resource1.setTargetPath("org/drools/testdrl/rules1.drl");
String foo = "<xyz/>\n";
Resource resource2 = kieServices.getResources().newReaderResource( new StringReader( foo ), "UTF-8" );
resource2.setTargetPath( "META-INF/foo.xml" );
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.testdrl\">\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-cl", "1.0.0" );
createAndDeployJar( kieServices, kmodule, releaseId, resource1, resource2 );
KieContainer kieContainer = kieServices.newKieContainer( releaseId );
ClassLoader classLoader = kieContainer.getClassLoader();
URL url = classLoader.getResource( "META-INF/foo.xml" );
assertNotNull( url );
KieSession ksession = kieContainer.newKieSession( "testKsession" );
List<URL> list = new ArrayList();
ksession.setGlobal( "list", list );
ksession.fireAllRules();
assertEquals( 1, list.size() );
assertEquals( url.getPath(), list.get(0).getPath() );
ksession.dispose();
}
@Test
public void testClassLoaderFromPojo() throws IOException {
// DROOLS-1108
String source = "package org.drools.testdrl;\n" +
"public class MyPojo {\n" +
" public String getUrlPath() {" +
" return getClass().getClassLoader().getResource(\"META-INF/foo.xml\").getPath();\n" +
" }\n" +
"}\n";
String drl1 = "package org.drools.testdrl;\n" +
"import org.drools.testdrl.MyPojo;\n" +
"global java.util.List list;\n" +
"rule R1 when\n" +
"then\n" +
" insert(new MyPojo());\n" +
"end\n" +
"rule R2 when\n" +
" $m : MyPojo()\n" +
"then\n" +
" list.add($m.getUrlPath());\n" +
"end\n";
String foo = "<xyz/>\n";
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId( "org.kie", "test-cl", "1.0.0" );
KieFileSystem kfs = ks.newKieFileSystem();
KieModuleModel kproj = ks.newKieModuleModel();
KieBaseModel kieBaseModel1 = kproj.newKieBaseModel( "testKbase" )
.setDefault( true )
.addPackage( "org.drools.testdrl" );
KieSessionModel ksession1 = kieBaseModel1.newKieSessionModel( "testKsession" )
.setDefault( true );
kfs.writeKModuleXML(kproj.toXML());
kfs.write("src/main/resources/org/drools/testdrl/rules1.drl", drl1);
kfs.write("src/main/java/org/drools/testdrl/MyPojo.java", source);
kfs.write("src/main/resources/META-INF/foo.xml", foo);
kfs.generateAndWritePomXML(releaseId);
KieBuilder kieBuilder = ks.newKieBuilder( kfs );
assertTrue(kieBuilder.buildAll().getResults().getMessages().isEmpty());
KieContainer kieContainer = ks.newKieContainer( releaseId );
ClassLoader classLoader = kieContainer.getClassLoader();
URL url = classLoader.getResource( "META-INF/foo.xml" );
assertNotNull( url );
KieSession ksession = kieContainer.newKieSession( "testKsession" );
List<URL> list = new ArrayList();
ksession.setGlobal( "list", list );
ksession.fireAllRules();
assertEquals( 1, list.size() );
assertEquals( url.getPath(), list.get(0) );
ksession.dispose();
}
}