Skip to content

Commit

Permalink
BZ-1076196 - Enhance KieCDIExtension to allow optional injections
Browse files Browse the repository at this point in the history
(cherry picked from commit bbebcb47759c2104972d356474a721a0829b90ca)
  • Loading branch information
mswiderski authored and etirelli committed Mar 14, 2014
1 parent 3eb7e95 commit d07d53e
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 35 deletions.
@@ -1,6 +1,7 @@
package org.drools.compiler.cdi;

import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Collections;
Expand All @@ -15,6 +16,7 @@
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
Expand Down Expand Up @@ -89,43 +91,46 @@ public <Object> void processInjectionTarget(@Observes ProcessInjectionTarget<Obj
boolean kBaseExists = false;
boolean kSessionExists = false;
boolean kContainerExists = false;

KBase kBase = null;
KSession kSession = null;
if ( ip.getType() instanceof Class && ( KieSession.class.isAssignableFrom( (Class ) ip.getType() ) || StatelessKieSession.class.isAssignableFrom( (Class ) ip.getType() ) ) ) {
kSession = ip.getAnnotated().getAnnotation( KSession.class );
kSessionExists = true;
} else if ( ip.getType() instanceof Class && KieBase.class.isAssignableFrom( (Class ) ip.getType() ) ) {
kBaseExists = true;
kBase = ip.getAnnotated().getAnnotation( KBase.class );
} else if ( ip.getType() instanceof Class && KieContainer.class.isAssignableFrom( (Class ) ip.getType() ) ) {
kContainerExists = true;
}

if ( !kSessionExists && !kBaseExists && !kContainerExists) {
continue;
}
Class clazz = getClassType(ip);

if (clazz != null) {
KBase kBase = null;
KSession kSession = null;
if ( ( KieSession.class.isAssignableFrom( clazz ) || StatelessKieSession.class.isAssignableFrom( clazz ) ) ) {
kSession = ip.getAnnotated().getAnnotation( KSession.class );
kSessionExists = true;
} else if ( KieBase.class.isAssignableFrom( clazz ) ) {
kBaseExists = true;
kBase = ip.getAnnotated().getAnnotation( KBase.class );
} else if ( KieContainer.class.isAssignableFrom( clazz ) ) {
kContainerExists = true;
}

if ( !kSessionExists && !kBaseExists && !kContainerExists) {
continue;
}



KReleaseId kReleaseId = ip.getAnnotated().getAnnotation( KReleaseId.class );
ReleaseId releaseId = null;
if ( kReleaseId != null ) {
releaseId = ks.newReleaseId(kReleaseId.groupId(),
kReleaseId.artifactId(),
kReleaseId.version());
gavs.put(releaseId,
null );
}

Class< ? extends Annotation> scope = ApplicationScoped.class;
KReleaseId kReleaseId = ip.getAnnotated().getAnnotation( KReleaseId.class );
ReleaseId releaseId = null;
if ( kReleaseId != null ) {
releaseId = ks.newReleaseId(kReleaseId.groupId(),
kReleaseId.artifactId(),
kReleaseId.version());
gavs.put(releaseId,
null );
}

Class< ? extends Annotation> scope = ApplicationScoped.class;

if ( kBaseExists ) {
addKBaseInjectionPoint(ip, kBase,scope, releaseId, kReleaseId);
} else if ( kSessionExists ) {
addKSessionInjectionPoint(ip, kSession, scope, releaseId, kReleaseId);
} else if ( kContainerExists ) {
addKContainerInjectionPoint(ip, null, scope, releaseId, kReleaseId);
if ( kBaseExists ) {
addKBaseInjectionPoint(ip, kBase,scope, releaseId, kReleaseId);
} else if ( kSessionExists ) {
addKSessionInjectionPoint(ip, kSession, scope, releaseId, kReleaseId);
} else if ( kContainerExists ) {
addKContainerInjectionPoint(ip, null, scope, releaseId, kReleaseId);
}
}
}
}
Expand Down Expand Up @@ -181,7 +186,7 @@ public void addKSessionInjectionPoint(InjectionPoint ip, KSession kSession, Clas
String namedStr = ( kSession == null ) ? null : kSession.name();

KieCDIEntry newEntry = new KieCDIEntry( (kSession == null) ? null : kSession.value(),
(Class ) ip.getType(),
getClassType(ip),
scope,
releaseId,
kReleaseId,
Expand Down Expand Up @@ -404,7 +409,7 @@ public void addKSessionBean(AfterBeanDiscovery abd,
if ( StringUtils.isEmpty( kSessionName )) {
kSessionModel = ( entry.getType() == KieSession.class ) ? kProject.getDefaultKieSession() : kProject.getDefaultStatelessKieSession();
} else {
kSessionModel = kProject.getKieSessionModel( kSessionName );
kSessionModel = kProject.getKieSessionModel(kSessionName);
}
if ( kSessionModel == null ) {
log.error( "Annotation @KSession({}) found, but no KieSessioneModel exist.\nEither the required kproject.xml does not exist, was corrupted, or mising the KieBase entry",
Expand Down Expand Up @@ -1007,4 +1012,24 @@ public boolean equals(java.lang.Object obj) {


}

private Class getClassType(InjectionPoint ip) {
if (ip.getType() instanceof Class) {

return (Class )ip.getType();
} else if (ip.getType() instanceof ParameterizedType) {
Type rawType = ((ParameterizedType) ip.getType()).getRawType();
Type[] types = ((ParameterizedType) ip.getType()).getActualTypeArguments();
if (rawType instanceof Class) {
if (rawType instanceof Class && ((Class) rawType).isAssignableFrom(Instance.class) && types.length == 1) {

if (types[0] instanceof Class) {
return (Class )types[0];
}
}
}
}

return null;
}
}
@@ -0,0 +1,37 @@
package org.drools.example.cdi.cdiexample;

import java.io.PrintStream;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.kie.api.cdi.KSession;
import org.kie.api.runtime.KieSession;

public class CDIInstanceExample {

@Inject
@KSession("ksession-optional")
private Instance<KieSession> kSession;

public void go(PrintStream out) {

KieSession ksession = kSession.get();

ksession.setGlobal("out", out);
ksession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));
ksession.fireAllRules();
}

public static void main(String[] args) {
Weld w = new Weld();

WeldContainer wc = w.initialize();
CDIInstanceExample bean = wc.instance().select(CDIInstanceExample.class).get();
bean.go(System.out);

w.shutdown();
}

}
Expand Up @@ -4,6 +4,7 @@

<kbase name="cdiexample">
<ksession name="ksession1"/>
<ksession name="ksession-optional"/>
</kbase>

</kmodule>
@@ -0,0 +1,35 @@
package org.drools.example.cdi.cdiexample;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.junit.Test;

import static org.junit.Assert.*;

public class CDIInstanceExampleTest {

@Test
public void testGo() {
Weld w = new Weld();
WeldContainer wc = w.initialize();

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);

CDIInstanceExample bean = wc.instance().select(CDIInstanceExample.class).get();
bean.go(ps);

ps.close();

String actual = new String(baos.toByteArray());
String expected = "" +
"Dave: Hello, HAL. Do you read me, HAL?\n" +
"HAL: Dave. I read you.\n";
assertEquals(expected, actual);

w.shutdown();
}
}

0 comments on commit d07d53e

Please sign in to comment.