Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

A new command to retrieve a FactHandle from FH external form #48

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.drools.command.runtime.process.SignalEventCommand;
import org.drools.command.runtime.process.StartProcessCommand;
import org.drools.command.runtime.rule.FireAllRulesCommand;
import org.drools.command.runtime.rule.FromExternalFactHandleCommand;
import org.drools.command.runtime.rule.GetObjectCommand;
import org.drools.command.runtime.rule.GetObjectsCommand;
import org.drools.command.runtime.rule.InsertElementsCommand;
Expand Down Expand Up @@ -190,4 +191,13 @@ public Command newKBuilderSetPropertyCommand(String id, String name, String valu
public Command newNewKnowledgeBuilderConfigurationCommand(String localId){
return new NewKnowledgeBuilderConfigurationCommand(localId);
}

public Command<FactHandle> fromExternalFactHandleCommand(String factHandleExternalForm) {
return fromExternalFactHandleCommand(factHandleExternalForm, false);
}

public Command<FactHandle> fromExternalFactHandleCommand(String factHandleExternalForm,
boolean disconnected) {
return new FromExternalFactHandleCommand(factHandleExternalForm, disconnected);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.drools.command.runtime.rule;

import java.util.Collection;

import org.drools.command.Context;
import org.drools.command.impl.GenericCommand;
import org.drools.command.impl.KnowledgeCommandContext;
import org.drools.common.InternalFactHandle;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;

public class FromExternalFactHandleCommand implements GenericCommand<FactHandle> {

private String factHandleExternalForm;
private boolean disconnected;

public FromExternalFactHandleCommand(String factHandleExternalForm) {
this(factHandleExternalForm, false);
}

public FromExternalFactHandleCommand(String factHandleExternalForm, boolean disconnected) {
this.factHandleExternalForm = factHandleExternalForm;
this.disconnected = disconnected;
}

public FactHandle execute(Context context) {
StatefulKnowledgeSession ksession = ((KnowledgeCommandContext) context)
.getStatefulKnowledgesession();
Collection<FactHandle> factHandles = ksession.getFactHandles();
int fhId = Integer.parseInt(factHandleExternalForm.split(":")[1]);
for (FactHandle factHandle : factHandles) {
if (factHandle instanceof InternalFactHandle
&& ((InternalFactHandle) factHandle).getId() == fhId) {
InternalFactHandle fhClone = ((InternalFactHandle) factHandle).clone();
if (disconnected) {
fhClone.disconnect();
}
return fhClone;
}
}
return null;
}

public String toString() {
return "ksession.getFactHandle( " + factHandleExternalForm + " );";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,11 @@ public GetFactHandleCommand(Object object, boolean disconnected) {
public FactHandle execute(Context context) {
StatefulKnowledgeSession ksession = ((KnowledgeCommandContext) context).getStatefulKnowledgesession();
InternalFactHandle factHandle = (InternalFactHandle) ksession.getFactHandle( object );
if ( factHandle != null && disconnected){
if ( factHandle != null ){
InternalFactHandle handle = factHandle.clone();
handle.disconnect();
if ( disconnected ) {
handle.disconnect();
}
return handle;
}
return null;
Expand Down
3 changes: 3 additions & 0 deletions drools-persistence-jpa/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,6 @@

# The META-INF directory is generated by the maven-felix-plugin
/META-INF

#Bitronix transaction logs
btm*.tlog
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

import javax.naming.InitialContext;
import javax.persistence.EntityManagerFactory;
Expand All @@ -16,6 +17,7 @@
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.command.CommandFactory;
import org.drools.command.impl.CommandBasedStatefulKnowledgeSession;
import org.drools.command.impl.FireAllRulesInterceptor;
import org.drools.command.impl.LoggingInterceptor;
Expand All @@ -25,6 +27,7 @@
import org.drools.runtime.Environment;
import org.drools.runtime.EnvironmentName;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;

import bitronix.tm.TransactionManagerServices;
import bitronix.tm.resource.jdbc.PoolingDataSource;
Expand Down Expand Up @@ -55,6 +58,76 @@ protected void tearDown() throws Exception {
ds1.close();
}

public void testFactHandleSerialization() {
String str = "";
str += "package org.drools.test\n";
str += "import java.util.concurrent.atomic.AtomicInteger\n";
str += "global java.util.List list\n";
str += "rule rule1\n";
str += "when\n";
str += " $i: AtomicInteger(intValue > 0)\n";
str += "then\n";
str += " list.add( $i );\n";
str += "end\n";
str += "\n";

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
ResourceType.DRL );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();

if ( kbuilder.hasErrors() ) {
fail( kbuilder.getErrors().toString() );
}

kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
emf );
env.set( EnvironmentName.TRANSACTION_MANAGER,
TransactionManagerServices.getTransactionManager() );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );

StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
List<?> list = new ArrayList<Object>();

ksession.setGlobal( "list",
list );

AtomicInteger value = new AtomicInteger(4);
FactHandle atomicFH = ksession.insert( value );

ksession.fireAllRules();

assertEquals( 1,
list.size() );

value.addAndGet(1);
ksession.update(atomicFH, value);
ksession.fireAllRules();

assertEquals( 2,
list.size() );
String externalForm = atomicFH.toExternalForm();

ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(ksession.getId(), kbase, null, env);

atomicFH = ksession.execute(CommandFactory.fromExternalFactHandleCommand(externalForm));

value.addAndGet(1);
ksession.update(atomicFH, value);

ksession.fireAllRules();

list = (List<?>) ksession.getGlobal("list");

assertEquals( 3,
list.size() );

}

public void testLocalTransactionPerStatement() {
String str = "";
str += "package org.drools.test\n";
Expand Down