/* * Copyright 2017 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.cdi.kproject; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.security.AccessController; import java.security.PrivilegedAction; import java.security.ProtectionDomain; import java.util.Enumeration; import java.util.Set; import javax.enterprise.inject.spi.Bean; import javax.enterprise.util.AnnotationLiteral; import org.drools.cdi.CDITestRunner; import org.drools.compiler.kie.builder.impl.KieServicesImpl; import org.drools.compiler.kproject.models.KieModuleModelImpl; import org.drools.core.rule.JavaDialectRuntimeData; import org.jboss.weld.environment.se.Weld; import org.jboss.weld.environment.se.WeldContainer; import org.junit.Test; import org.kie.api.KieServices; import static org.junit.Assert.assertNotNull; public class KieProjectCDITest extends AbstractKnowledgeTest { private static final ProtectionDomain PROTECTION_DOMAIN; static { PROTECTION_DOMAIN = (ProtectionDomain) AccessController.doPrivileged( new PrivilegedAction() { public Object run() { return JavaDialectRuntimeData.class.getProtectionDomain(); } } ); } public static class KPTestLiteral extends AnnotationLiteral<KPTest> implements KPTest { private String value; public KPTestLiteral(String value) { this.value = value; } public String value() { return this.value; } } @Test public void createMultpleJarAndFileResources() throws IOException, ClassNotFoundException, InterruptedException { createKieModule( "jar1", true ); createKieModule( "jar2", true ); createKieModule( "jar3", true ); createKieModule( "fol4", false ); ClassLoader origCl = Thread.currentThread().getContextClassLoader(); try { java.io.File file1 = fileManager.newFile( "jar1-1.0-SNAPSHOT.jar" ); java.io.File file2 = fileManager.newFile( "jar2-1.0-SNAPSHOT.jar" ); java.io.File file3 = fileManager.newFile( "jar3-1.0-SNAPSHOT.jar" ); java.io.File fol4 = fileManager.newFile( "fol4-1.0-SNAPSHOT" ); URLClassLoader urlClassLoader = new URLClassLoader( new URL[]{file1.toURI().toURL(), file2.toURI().toURL(), file3.toURI().toURL(), fol4.toURI().toURL() } ); Thread.currentThread().setContextClassLoader( urlClassLoader ); Enumeration<URL> e = urlClassLoader.getResources( KieModuleModelImpl.KMODULE_JAR_PATH ); while ( e.hasMoreElements() ) { URL url = e.nextElement(); System.out.println( url ); } Class cls = Thread.currentThread().getContextClassLoader().loadClass( "org.drools.compiler.cdi.test.KProjectTestClassjar1" ); assertNotNull( cls ); cls = Thread.currentThread().getContextClassLoader().loadClass( "org.drools.compiler.cdi.test.KProjectTestClassjar2" ); assertNotNull( cls ); cls = Thread.currentThread().getContextClassLoader().loadClass( "org.drools.compiler.cdi.test.KProjectTestClassjar3" ); assertNotNull( cls ); Weld weld = CDITestRunner.createWeld( KProjectTestClass.class.getName(), KPTestLiteral.class.getName(), "org.drools.compiler.cdi.test.KProjectTestClassjar1", "org.drools.compiler.cdi.test.KProjectTestClassjar2", "org.drools.compiler.cdi.test.KProjectTestClassjar3", "org.drools.compiler.cdi.test.KProjectTestClassfol4" ); ((KieServicesImpl) KieServices.Factory.get()).nullKieClasspathContainer(); WeldContainer container = weld.initialize(); Set<Bean< ? >> beans = container.getBeanManager().getBeans( KProjectTestClass.class, new KPTestLiteral( "jar1" ) ); Bean bean = (Bean) beans.toArray()[0]; KProjectTestClass o1 = (KProjectTestClass) bean.create( container.getBeanManager().createCreationalContext( null ) ); assertNotNull( o1 ); testEntry(o1, "jar1"); beans = container.getBeanManager().getBeans( KProjectTestClass.class, new KPTestLiteral( "jar2" ) ); bean = (Bean) beans.toArray()[0]; KProjectTestClass o2 = (KProjectTestClass) bean.create( container.getBeanManager().createCreationalContext( null ) ); assertNotNull( o2 ); testEntry(o2, "jar2"); beans = container.getBeanManager().getBeans( KProjectTestClass.class, new KPTestLiteral( "jar3" ) ); bean = (Bean) beans.toArray()[0]; KProjectTestClass o3 = (KProjectTestClass) bean.create( container.getBeanManager().createCreationalContext( null ) ); assertNotNull( o3 ); testEntry(o3, "jar3"); beans = container.getBeanManager().getBeans( KProjectTestClass.class, new KPTestLiteral( "fol4" ) ); bean = (Bean) beans.toArray()[0]; KProjectTestClass o4 = (KProjectTestClass) bean.create( container.getBeanManager().createCreationalContext( null ) ); assertNotNull( o4 ); testEntry(o4, "fol4"); weld.shutdown(); } finally { // FIXME Java 7+ // on Windows, the URLClassLoader will not release all resources, // so the attempt to delete the temporary files will fail. // an explicit dispose call is needed, but it has not been introduced until Java7+ // http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4950148 /* ((URLClassLoader) Thread.currentThread().getContextClassLoader()).close(); */ Thread.currentThread().setContextClassLoader( origCl ); } } }