[jboss-jira] [JBoss JIRA] Updated: (JBRULES-2402) Null Pointer exception while loading and executing two serialized rules which are in same package
Mark Proctor (JIRA)
jira-events at lists.jboss.org
Wed May 18 00:19:01 EDT 2011
[ https://issues.jboss.org/browse/JBRULES-2402?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Mark Proctor updated JBRULES-2402:
----------------------------------
Fix Version/s: 5.2.0.CR1
> Null Pointer exception while loading and executing two serialized rules which are in same package
> -------------------------------------------------------------------------------------------------
>
> Key: JBRULES-2402
> URL: https://issues.jboss.org/browse/JBRULES-2402
> Project: Drools
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Components: drools-core (expert)
> Affects Versions: 5.0.1.FINAL
> Environment: OS : Ubuntu ( 2.6.28-13-server )
> Sun Jdk 1.3
> Reporter: Nagarajan Santhanam
> Assignee: Tihomir Surdilovic
> Priority: Critical
> Fix For: 5.2.0.CR1
>
>
> Hi,
> I'm trying to load drts in a serialized fashion and executing it. During execution, I get the error as mentioned below.
> But if I keep the package name different for both the drts, the same code works fine.
> Find below the errors and code snippets :
> Files Used :
> 1. Main.java
> 2. SchemeEngine.java
> 3. PurchaseOrder.java
> 4. PurchaseOrderImpl.java
> 5. SchemeHelper.java
> 6. ON_PO_PROD_PACK_PER_DISC.drt
> 7. ON_PO_PROD_DIS.drt
> Main.java
> *
> * To change this template, choose Tools | Templates
> * and open the template in the editor.
> */
> package test;
> import app.PurchaseOrder;
> import app.PurchaseOrderImpl;
> import java.util.ArrayList;
> import java.util.List;
> import scheme.SchemeEngine;
> /**
> *
> * @author msuser1
> */
> public class Main {
> /**
> * @param args the command line arguments
> */
> public static void testCrazyBug() throws Exception {
> // String[] drts = new String[]{"/ON_PO_PROD_DIS.drt", "/ON_PO_PROD_PACK_PER_DISC.drt", "/ON_PO_PROD_PACK_PER_DISC_using_function.drt"};
> // String[] xls = new String[]{"/ON_PO_PROD_DISC_1.xls", "/ON_PO_PROD_PACK_PER_DISC.xls", "/ON_PO_PROD_PACK_PER_DISC_using_function.xls"};
> String[] drts = new String[]{"/ON_PO_PROD_DIS.drt", "/ON_PO_PROD_PACK_PER_DISC.drt"};
> String[] xls = new String[]{"/ON_PO_PROD_DISC_1.xls", "/ON_PO_PROD_PACK_PER_DISC.xls"};
> PurchaseOrder po = new PurchaseOrderImpl();
> System.out.println("length of drt " + drts.length);
> SchemeEngine engineDirect = new SchemeEngine(PurchaseOrderImpl.class.getClassLoader());
> for (int i = 0; i < drts.length; i++) {
> engineDirect.loadSchemeFromDRT(drts[i], xls[i]);
> }
> System.out.println("Applying Schemes in normal mode");
> engineDirect.applyOnPurchaseOrder(po);
> List serializedList = new ArrayList();
> for (int i = 0; i < drts.length; i++) {
> SchemeEngine engineLocal = new SchemeEngine(PurchaseOrderImpl.class.getClassLoader());
> engineLocal.loadSchemeFromDRT(drts[i], xls[i]);
> byte[] blobBytes = engineLocal.serializeDefinition();
> serializedList.add(blobBytes);
> }
> SchemeEngine engineOptimized = new SchemeEngine(PurchaseOrderImpl.class.getClassLoader());
> for (int i = 0; i < drts.length; i++) {
> engineOptimized.loadSerializedDefinition((byte[]) serializedList.get(i));
> }
> try {
> System.out.println("Applying Schemes in optmized mode");
> engineOptimized.applyOnPurchaseOrder(po);
> } catch (Exception e) {
> e.printStackTrace();
> }
> }
> public static void main(String args[]) throws Exception {
> testCrazyBug();
> }
> }
> SchemeEngine.java
> /*
> * To change this template, choose Tools | Templates
> * and open the template in the editor.
> */
> package scheme;
> import app.*;
> import java.io.ByteArrayInputStream;
> import java.io.ByteArrayOutputStream;
> import java.io.IOException;
> import java.io.InputStream;
> import java.io.OutputStream;
> import java.util.ArrayList;
> import java.util.Arrays;
> import java.util.Collection;
> import java.util.Iterator;
> import java.util.List;
> import java.util.Properties;
> import java.util.logging.Level;
> import java.util.logging.Logger;
> import org.drools.KnowledgeBase;
> import org.drools.KnowledgeBaseConfiguration;
> import org.drools.KnowledgeBaseFactory;
> import org.drools.builder.DecisionTableConfiguration;
> import org.drools.builder.DecisionTableInputType;
> import org.drools.builder.KnowledgeBuilder;
> import org.drools.builder.KnowledgeBuilderFactory;
> import org.drools.builder.ResourceType;
> import org.drools.common.DroolsObjectInputStream;
> import org.drools.common.DroolsObjectOutputStream;
> import org.drools.decisiontable.ExternalSpreadsheetCompiler;
> import org.drools.decisiontable.InputType;
> import org.drools.definition.KnowledgePackage;
> import org.drools.io.ResourceFactory;
> import org.drools.runtime.StatelessKnowledgeSession;
> import org.drools.template.parser.DataListener;
> import org.drools.template.parser.TemplateDataListener;
> /**
> *
> * @author msuser1
> */
> public class SchemeEngine {
> private KnowledgeBase kbase = null;
> private ClassLoader classLoader = null;
> public SchemeEngine(ClassLoader cl) {
> this.classLoader = cl;
> KnowledgeBaseConfiguration kbc = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(new Properties(), this.classLoader);
> kbase = KnowledgeBaseFactory.newKnowledgeBase(kbc);
> }
> public void loadSchemeFromDRL(String drlFileName) {
> DecisionTableConfiguration dtableconfiguration = KnowledgeBuilderFactory.newDecisionTableConfiguration();
> dtableconfiguration.setInputType(DecisionTableInputType.XLS);
> KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
> kbuilder.add(ResourceFactory.newClassPathResource(drlFileName, SchemeEngine.class),
> ResourceType.DRL);
> if (kbuilder.hasErrors()) {
> System.err.println(kbuilder.getErrors().toString());
> }
> kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
> }
> public void loadSchemeFromXLS(String xlsFileName) {
> DecisionTableConfiguration dtableconfiguration = KnowledgeBuilderFactory.newDecisionTableConfiguration();
> dtableconfiguration.setInputType(DecisionTableInputType.XLS);
> KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
> kbuilder.add(ResourceFactory.newClassPathResource(xlsFileName, SchemeEngine.class),
> ResourceType.DTABLE, dtableconfiguration);
> if (kbuilder.hasErrors()) {
> System.err.println(kbuilder.getErrors().toString());
> }
> kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
> }
> public void loadSchemeFromDRT(String drtFileName, String xlsFileName) throws Exception {
> loadSchemeFromDRT(drtFileName, xlsFileName, 1, 1);
> }
> public void loadSchemeFromDRT(String drtFileName, String xlsFileName, int startingRow, int startingColumn) throws Exception {
> InputStream drtInput = SchemeEngine.class.getResourceAsStream(drtFileName);
> ByteArrayOutputStream drtOut = new ByteArrayOutputStream();
> writeToStream(drtInput, drtOut);
> InputStream xlsInput = SchemeEngine.class.getResourceAsStream(xlsFileName);
> ByteArrayOutputStream xlsOut = new ByteArrayOutputStream();
> writeToStream(xlsInput, xlsOut);
> loadSchemeFromDRT(drtOut.toByteArray(), xlsOut.toByteArray(), startingRow, startingColumn);
> }
> private void writeToStream(InputStream in, OutputStream out) throws IOException {
> byte[] buf = new byte[4 * 1024];
> int numRead = 0;
> while ((numRead = in.read(buf)) >= 0) {
> out.write(buf, 0, numRead);
> }
> }
> public void loadSchemeFromDRT(byte[] drtContent, byte[] xlsContent) {
> loadSchemeFromDRT(drtContent, xlsContent, 1, 1);
> }
> public void loadSchemeFromDRT(byte[] drtContent, byte[] xlsContent, int startingRow, int startingColumn) {
> final ExternalSpreadsheetCompiler converter = new ExternalSpreadsheetCompiler();
> final List<DataListener> listeners = new ArrayList<DataListener>();
> InputStream in = new ByteArrayInputStream(drtContent);
> TemplateDataListener listener = new TemplateDataListener(3, 1, in);
> listeners.add(listener);
> converter.compile(new ByteArrayInputStream(xlsContent), InputType.XLS, listeners);
> KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
> kbuilder.add(ResourceFactory.newByteArrayResource(listener.renderDRL().getBytes()),
> ResourceType.DRL);
> if (kbuilder.hasErrors()) {
> System.err.println(kbuilder.getErrors().toString());
> }
> kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
> }
> public byte[] serializeDefinition() {
> DroolsObjectOutputStream dos = null;
> ByteArrayOutputStream bos = null;
> try {
> bos = new ByteArrayOutputStream();
> dos = new DroolsObjectOutputStream(bos);
> dos.writeObject(kbase.getKnowledgePackages());
> return bos.toByteArray();
> } catch (IOException ex) {
> Logger.getLogger(SchemeEngine.class.getName()).log(Level.SEVERE, null, ex);
> return null;
> } finally {
> try {
> dos.close();
> bos.close();
> } catch (IOException ex) {
> Logger.getLogger(SchemeEngine.class.getName()).log(Level.SEVERE, null, ex);
> }
> }
> }
> public void loadSerializedDefinition(byte[] serializedContent) {
> try {
> DroolsObjectInputStream dis = null;
> ByteArrayInputStream bis = null;
> bis = new ByteArrayInputStream(serializedContent);
> dis = new DroolsObjectInputStream(bis);
> Collection<KnowledgePackage> defn = (Collection<KnowledgePackage>)dis.readObject();
> kbase.addKnowledgePackages(defn);
> } catch (ClassNotFoundException ex) {
> Logger.getLogger(SchemeEngine.class.getName()).log(Level.SEVERE, null, ex);
> } catch (IOException ex) {
> Logger.getLogger(SchemeEngine.class.getName()).log(Level.SEVERE, null, ex);
> }
> }
> public void applyOnPurchaseOrder(PurchaseOrder purchaseOrder) {
> if (kbase.getKnowledgePackages().size() == 0) {
> throw new RuntimeException("No Schemes are loaded.");
> }
> List objects = new ArrayList();
> objects.add(purchaseOrder);
> if (purchaseOrder.orderDetails() != null && purchaseOrder.orderDetails().size() > 0) {
> Iterator iter = purchaseOrder.orderDetails().iterator();
> while (iter.hasNext()) {
> PurchaseOrderDetail detail = (PurchaseOrderDetail) iter.next();
> objects.add(detail);
> }
> }
> StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession();
> session.execute(Arrays.asList(objects.toArray()));
> }
> public void applyRule(Object[] objects) {
> if (kbase.getKnowledgePackages().size() == 0) {
> throw new RuntimeException("No Schemes are loaded.");
> }
> StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession();
> session.execute(Arrays.asList(objects));
> }
> public static void main(String[] args) {
> }
> }
> PurchaseOrder.java
> package app;
> /*
> * To change this template, choose Tools | Templates
> * and open the template in the editor.
> */
> import java.util.Date;
> import java.util.List;
> /**
> *
> * @author msuser1
> */
> public interface PurchaseOrder {
> public Float orderAmount();
> public Date orderDate();
> public Integer orderDay();
> public List orderDetails();
> public boolean belongsToGeoHierarchy(String nodeName);
> public void addFreeItem(String schemeId, String skuId, int qty);
> public void addFlatDiscount(String SchemeId, Float discountAmt);
> public void addPercentageDiscount(String SchemeId, Float discountPercent);
> public void addFlatDiscountForItem(String SchemeId, String skuId, Float discountAmt);
> public void addPercentageDiscountForItem(String SchemeId, String skuId, Float discountPercent);
> public void addPercentageDiscountPerUomForItem(String SchemeId, String skuId, Float discountPercent);
> public void addInternalGiftVoucher(String SchemeId, Float voucherAmt);
> public void addExternalGiftVoucher(String SchemeId, Float voucherAmt, String externalVendorId);
> public void addInternalGiftVoucherForItem(String SchemeId, String skuId, Float voucherAmt);
> public void addExternalGiftVoucherForItem(String SchemeId, String skuId, Float voucherAmt, String externalVendorId);
> public void addRewardPoint(String SchemeId, int rewardPoint);
> public void addRewardPointForItem(String SchemeId, String skuId, int rewardPoint);
> public void addWeightBasedFlatDiscountPerUomForItem(String SchemeId, String skuId, Float discount_amt, String uomId);
> public Boolean immediatePayment();
> public Boolean regularPurchase();
> public Boolean consignmentPurchase();
> public Boolean cat2ConsignmentPurchase();
> public Boolean cat3ConsignmentPurchase();
> public Boolean intransitPurchase();
> public Boolean skuPresent(String skuId);
> public Integer materialQuantityForItem(String skuId);
> public Boolean schemeApplied(String schemeDefinitionId);
> public void addDetail(PurchaseOrderDetail prd);
> }
> =========================================================================================================================
> PurchaseOrderImpl.java
> package app;
> /*
> * To change this template, choose Tools | Templates
> * and open the template in the editor.
> */
> import java.text.DateFormat;
> import java.text.ParseException;
> import java.text.SimpleDateFormat;
> import java.util.ArrayList;
> import java.util.Date;
> import java.util.List;
> import java.util.logging.Level;
> import java.util.logging.Logger;
> /**
> *
> * @author msuser1
> */
> public class PurchaseOrderImpl implements PurchaseOrder {
> private List details = new ArrayList();
> public Date orderDate() {
> try {
> DateFormat fmt = new SimpleDateFormat("yyyy-dd-MM");
> Date dt = fmt.parse("2009-06-23");
> return dt;
> } catch (ParseException ex) {
> Logger.getLogger(PurchaseOrderImpl.class.getName()).log(Level.SEVERE, null, ex);
> return null;
> }
> }
> public Integer orderDay(){
> return 10;
> }
> public List orderDetails() {
> return details;
> }
> public boolean belongsToGeoHierarchy(String nodeName) {
> return true;
> }
> public void addFreeItem(String schemeId, String skuId, int qty) {
> System.out.println("Add Free Item");
> }
> public void addFlatDiscount(String SchemeId, Long discountAmt) {
> System.out.println("Add Flat Discount");
> }
> public void addPercentageDiscount(String SchemeId, int discountPercent) {
> System.out.println("Add Percentage Discount");
> }
> public void addFlatDiscountForItem(String SchemeId, String skuId, Long discountAmt) {
> System.out.println("Add Flat Discount For Item");
> }
> public void addPercentageDiscountForItem(String SchemeId, String skuId, int discountPercent) {
> System.out.println("Add Percentage Discount For Item");
> }
> public void addPercentageDiscountPerUomForItem(String SchemeId, String skuId, int discountPercent) {
> System.out.println("Add Percentage Discount For Uom For Item");
> }
> public void addInternalGiftVoucher(String SchemeId, Long voucherAmt) {
> System.out.println("Add Internal Gift Voucher");
> }
> public void addExternalGiftVoucher(String SchemeId, Long voucherAmt, String externalVendorId) {
> System.out.println("Add External Gift Voucher");
> }
> public void addInternalGiftVoucherForItem(String SchemeId, String skuId, Long voucherAmt) {
> System.out.println("Add Internal Gift Voucher For Item");
> }
> public void addExternalGiftVoucherForItem(String SchemeId, String skuId, Long voucherAmt, String externalVendorId) {
> System.out.println("Add External Gift Voucher For Item");
> }
> public void addRewardPoint(String SchemeId, int rewardPoint) {
> System.out.println("Add Reward Point");
> }
> public void addRewardPointForItem(String SchemeId, String skuId, int rewardPoint) {
> System.out.println("Add Reward Point For Item");
> }
> public Boolean immediatePayment(){
> return true;
> }
> public Boolean regularPurchase() {
> return true;
> }
> public Boolean consignmentPurchase() {
> return false;
> }
> public Boolean cat2ConsignmentPurchase() {
> return false;
> }
> public Boolean cat3ConsignmentPurchase() {
> return false;
> }
> public Boolean commissionPurchase() {
> return false;
> }
> public Boolean intransitPurchase() {
> return false;
> }
> public Boolean skuPresent(String skuId) {
> return false;
> }
> public Integer materialQuantityForItem(String skuId) {
> return 10;
> }
> public Boolean schemeApplied(String schemeDefinitionId) {
> return false;
> }
> public void addWeightBasedFlatDiscountPerUomForItem(String SchemeId, String skuId, Long discount_amt, String uomId) {
> throw new UnsupportedOperationException("Not supported yet.");
> }
> public void addDetail(PurchaseOrderDetail pod)
> {
> details.add(pod);
> }
> public void addFlatDiscount(String SchemeId, Float discountAmt) {
> throw new UnsupportedOperationException("Not supported yet.");
> }
> public void addFlatDiscountForItem(String SchemeId, String skuId, Float discountAmt) {
> throw new UnsupportedOperationException("Not supported yet.");
> }
> public Float orderAmount() {
> throw new UnsupportedOperationException("Not supported yet.");
> }
> public void addPercentageDiscount(String SchemeId, Float discountPercent) {
> throw new UnsupportedOperationException("Not supported yet.");
> }
> public void addPercentageDiscountForItem(String SchemeId, String skuId, Float discountPercent) {
> throw new UnsupportedOperationException("Not supported yet.");
> }
> public void addPercentageDiscountPerUomForItem(String SchemeId, String skuId, Float discountPercent) {
> throw new UnsupportedOperationException("Not supported yet.");
> }
> public void addInternalGiftVoucher(String SchemeId, Float voucherAmt) {
> throw new UnsupportedOperationException("Not supported yet.");
> }
> public void addExternalGiftVoucher(String SchemeId, Float voucherAmt, String externalVendorId) {
> throw new UnsupportedOperationException("Not supported yet.");
> }
> public void addInternalGiftVoucherForItem(String SchemeId, String skuId, Float voucherAmt) {
> throw new UnsupportedOperationException("Not supported yet.");
> }
> public void addExternalGiftVoucherForItem(String SchemeId, String skuId, Float voucherAmt, String externalVendorId) {
> throw new UnsupportedOperationException("Not supported yet.");
> }
> public void addWeightBasedFlatDiscountPerUomForItem(String SchemeId, String skuId, Float discount_amt, String uomId) {
> throw new UnsupportedOperationException("Not supported yet.");
> }
> }
> SchemeHelper.java
> /*
> * To change this template, choose Tools | Templates
> * and open the template in the editor.
> */
> package helper;
> import app.PurchaseOrder;
> import app.PurchaseOrderDetail;
> import java.lang.Float;
> /**
> *
> * @author msuser1
> */
> public class SchemeHelper {
> public static boolean belongsToProductHierarchy(String skuId, String nodeName) {
> return false; //Sku.belongsToProductHierarchy(nodeName);
> }
> public static Integer materialQuantityForItem(PurchaseOrder po, String skuId) {
> return po.materialQuantityForItem(skuId);
> }
> public static boolean productIdOrProductAncestorMatching(PurchaseOrderDetail poDetail, String productId) {
> System.out.println("Inside the method......................################################");
> boolean result = false;
> try {
> result = poDetail.productId().compareTo(productId) == 0 || poDetail.belongsToAncestorProduct(productId).booleanValue();
> } catch (Exception e) {
> e.printStackTrace();
> }
> return result;
> }
> public static boolean complexMethod(PurchaseOrderDetail poDetail, String productId, String packId) {
> boolean result = false;
> try {
> result = (poDetail.packId().compareTo(packId) == 0 || poDetail.belongsToAncestorPack(packId).booleanValue()) && (poDetail.productId().compareTo(productId) == 0 || poDetail.belongsToAncestorProduct(productId).booleanValue());
> } catch (Exception ex) {
> ex.printStackTrace();
> }
> return result;
> }
> }
> ON_PO_PROD_DIS.drt
> template header
> SchemeID
> ProductID
> Discount
> package app;
> import function helper.SchemeHelper.*
> template "Scheme"
> rule "po_@{SchemeID}_@{row.rowNumber}"
> when
> $order : PurchaseOrder()
> $orderDetail : PurchaseOrderDetail($det : this,eval($det.productId().compareTo("@{ProductID}") == 0 || $det.belongsToAncestorProduct("@{ProductID}") == true), purchaseOrder == $order)
> then
> float disAmt=0;
> disAmt = $orderDetail.saleableQty() * @{Discount}F;
> System.out.println("Discount amount = @{Discount}..XXXX..........." + disAmt);
> $order.addFlatDiscountForItem("@{SchemeID}",$orderDetail.skuId(), disAmt);
> end
> end template
> ON_PO_PROD_PACK_PER_DISC.drt
> template header
> SchemeID
> ProductID
> PackID
> Discount
> package app;
> import app.*;
> import function helper.SchemeHelper.*
> template "Scheme"
> rule "ON_PO_PROD_PACK_PER_DISC_@{row.rowNumber}"
> when
> $order: PurchaseOrder()
> $orderDetail : PurchaseOrderDetail($det : this, eval(
> ($det.belongsToAncestorPack("@{PackID}") == true || $det.packId().compareTo("@{PackID}") == 0)
> &&
> ($det.productId().compareTo("@{ProductID}") == 0 || $det.belongsToAncestorProduct("@{ProductID}") == true)
> ) , purchaseOrder == $order)
> then
> float disAmt=0;
> disAmt = ($orderDetail.materialPrice() * $orderDetail.saleableQty()) * @{Discount}F/100;
> System.out.println("Discount amount = XXXX..........." + disAmt);
> $order.addFlatDiscountForItem("@{SchemeID}",$orderDetail.skuId(), disAmt);
> end
> end template
> Error :
> java.lang.NullPointerException
> at org.drools.base.ClassFieldReader.getIndex(ClassFieldReader.java:78)
> at org.drools.util.LeftTupleIndexHashTable.<init>(LeftTupleIndexHashTable.java:48)
> at org.drools.util.LeftTupleIndexHashTable.<init>(LeftTupleIndexHashTable.java:35)
> at org.drools.common.SingleBetaConstraints.createBetaMemory(SingleBetaConstraints.java:172)
> at org.drools.reteoo.BetaNode.createMemory(BetaNode.java:340)
> at org.drools.common.ConcurrentNodeMemories.createNodeMemory(ConcurrentNodeMemories.java:96)
> at org.drools.common.ConcurrentNodeMemories.getNodeMemory(ConcurrentNodeMemories.java:75)
> at org.drools.common.AbstractWorkingMemory.getNodeMemory(AbstractWorkingMemory.java:1534)
> at org.drools.reteoo.JoinNode.assertLeftTuple(JoinNode.java:103)
> at org.drools.reteoo.CompositeLeftTupleSinkAdapter.doPropagateAssertLeftTuple(CompositeLeftTupleSinkAdapter.java:145)
> at org.drools.reteoo.CompositeLeftTupleSinkAdapter.createAndPropagateAssertLeftTuple(CompositeLeftTupleSinkAdapter.java:57)
> at org.drools.reteoo.LeftInputAdapterNode.assertObject(LeftInputAdapterNode.java:142)
> at org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:42)
> at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:185)
> at org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:146)
> at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:1046)
> at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:1001)
> at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:788)
> at org.drools.impl.StatelessKnowledgeSessionImpl.execute(StatelessKnowledgeSessionImpl.java:259)
> at scheme.SchemeEngine.applyOnPurchaseOrder(SchemeEngine.java:178)
> at test.Main.testCrazyBug(Main.java:55)
> at test.Main.main(Main.java:64)
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list