[
https://issues.jboss.org/browse/DROOLS-243?page=com.atlassian.jira.plugin...
]
Demian Calcaprina commented on DROOLS-243:
------------------------------------------
The cause of this problem is at reading the object from the pkg.
The operator from BeforeOperator class,
https://github.com/droolsjbpm/drools/blob/5.5.x/drools-core/src/main/java...
is being returned as null when unmarshalling and thus is breaks.
The BeforeEvaluator has the operator, but, when unmarshalling it, it goes to this method
https://github.com/droolsjbpm/drools/blob/5.5.x/drools-core/src/main/java...
that will get it from the operators CACHE:
public static Operator determineOperator(final String operatorId,
final boolean isNegated) {
Operator op = CACHE.get( getKey( operatorId,
isNegated ) );
return op;
}
As it is not in the cache, it returns null.
Now, why it is not in the cache?
The BEFORE operator should be added to the CACHE in this static invocation:
https://github.com/droolsjbpm/drools/blob/5.5.x/drools-core/src/main/java...
As in my app, and also in the test I posted, first creates the KnowledgeAgent,
BeforeEvaluatorDefinition was never needed, nor from my app and more important, not from
the PKG unmarshall mechanism. As is it not being references, the static block is not being
executed.
If this is in some other place, for example (and this is what I did in the pull request I
am sending), directly in BeforeEvaluator, as it is needed while unmarshalling, the static
block will be called and things will work fine.
CEP Operators in Rules failing to compile when getting PKG
----------------------------------------------------------
Key: DROOLS-243
URL:
https://issues.jboss.org/browse/DROOLS-243
Project: Drools
Issue Type: Feature Request
Security Level: Public(Everyone can see)
Affects Versions: 5.5.0.Final
Reporter: Demian Calcaprina
Assignee: Mark Proctor
Priority: Critical
The issue is described in the following community post:
http://drools.46999.n3.nabble.com/Problem-with-PKG-from-guvnor-tc4025687....
This code can reproduce it:
KnowledgeBaseConfiguration config =
KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
config.setOption( EventProcessingOption.STREAM );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(config);
KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory
.newKnowledgeAgentConfiguration();
aconf.setProperty("drools.agent.scanDirectories", "true");
aconf.setProperty("drools.agent.scanResources", "true");
aconf.setProperty("drools.agent.newInstance", "false");
KnowledgeAgent kagent =
KnowledgeAgentFactory.newKnowledgeAgent("MortgageAgent", kbase, aconf);
Resource changeset = ResourceFactory.newClassPathResource(
"cs.xml");
kagent.applyChangeSet(changeset);
KnowledgeBase kbase2 = kagent.getKnowledgeBase();
Creating a changeset that points to a binary package in guvnor, with a rules which uses
the temporal operator. For example, somthing like this:
when
myfact: EventA( main > 21 ) over window:length (1)
myfact2 : EventA( main <= 21 , this before myfact ) over window:length (2)
What is happening in that when it tries to compare the temporal distance, it will throw a
NPE:
when
myfact: EventA( main > 21 ) over window:length (1)
myfact2 : EventA( main <= 21 , this before myfact ) over window:length (2)
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see:
http://www.atlassian.com/software/jira