[JBoss JIRA] (JBRULES-2402) Null Pointer exception while loading and executing two serialized rules which are in same package
by Tihomir Surdilovic (Jira)
[ https://issues.redhat.com/browse/JBRULES-2402?page=com.atlassian.jira.plu... ]
Tihomir Surdilovic closed JBRULES-2402.
---------------------------------------
Resolution: Out of Date
> Null Pointer exception while loading and executing two serialized rules which are in same package
> -------------------------------------------------------------------------------------------------
>
> Key: JBRULES-2402
> URL: https://issues.redhat.com/browse/JBRULES-2402
> Project: JBRULES
> Issue Type: Bug
> 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: 6.0.0.Alpha1
>
>
> 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}_(a){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_(a){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 was sent by Atlassian Jira
(v7.13.8#713008)
5 years, 9 months
[JBoss JIRA] (JBRULES-2355) Flow StatelessKnowledgeBase node
by Tihomir Surdilovic (Jira)
[ https://issues.redhat.com/browse/JBRULES-2355?page=com.atlassian.jira.plu... ]
Tihomir Surdilovic closed JBRULES-2355.
---------------------------------------
Resolution: Out of Date
> Flow StatelessKnowledgeBase node
> --------------------------------
>
> Key: JBRULES-2355
> URL: https://issues.redhat.com/browse/JBRULES-2355
> Project: JBRULES
> Issue Type: Feature Request
> Components: drools-process
> Reporter: Mark Proctor
> Assignee: Tihomir Surdilovic
> Priority: Major
> Fix For: 6.0.0.Alpha1
>
>
> We should be able to have a node that takes a changeset that produces a kbase that is local to the node on which we can execute stateless executions. So the node takes a configuration of a changeset. Then it also takes configuration of how of what execute - maybe reuse the command script builder from the flow services integration JBRULES-2354.
--
This message was sent by Atlassian Jira
(v7.13.8#713008)
5 years, 9 months
[JBoss JIRA] (JBRULES-2358) ClassNotFoundException when using "mvel" as a dialect
by Tihomir Surdilovic (Jira)
[ https://issues.redhat.com/browse/JBRULES-2358?page=com.atlassian.jira.plu... ]
Tihomir Surdilovic closed JBRULES-2358.
---------------------------------------
Resolution: Out of Date
> ClassNotFoundException when using "mvel" as a dialect
> -----------------------------------------------------
>
> Key: JBRULES-2358
> URL: https://issues.redhat.com/browse/JBRULES-2358
> Project: JBRULES
> Issue Type: Bug
> Affects Versions: 5.0.1.FINAL
> Environment: OS: Macos X and Linux
> JVM 1.6.0_15 from sun
> Reporter: stephane Brossier
> Assignee: Tihomir Surdilovic
> Priority: Major
> Fix For: 6.0.0.Alpha1
>
> Attachments: Test.java
>
>
> I get a ClassNotFoundexception when using a very simple rule and test. The test dowloads a binary package from guvnor, containing one trivial rule. Then it creates a StatefulKnowledgeSession and insert 500 facts. The drl file uploaded on guvnor is:
> --------------------------
> package mytest.debug.rules
> declare PerUserCount
> num : long
> profile : String
> end
> rule "Event"
> dialect "java"
> when
> e: PerUserCount()
> then
> System.out.println("Possible spammer [p=" + e.getProfile() + "] : count = " + e.getNum());
> end
> ----------------------------
> When calling fireAll, i get an exception. Note that:
> 1) The exception does not show up right away-- it only comes after some of those facts got processed
> 2) If i change the dialect from default 'mvel" to "java" it works fine:
> Exception in thread "main" java.lang.NoClassDefFoundError: mytest/debug/rules/PerUserCount
> at ASMAccessorImpl_7377369041259611028980.getValue(Unknown Source)
> at org.mvel2.optimizers.dynamic.DynamicGetAccessor.getValue(DynamicGetAccessor.java:66)
> at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:99)
> at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:102)
> at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:102)
> at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:102)
> at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:41)
> at ASMAccessorImpl_7157329411259611028970.getValue(Unknown Source)
> at org.mvel2.optimizers.dynamic.DynamicGetAccessor.getValue(DynamicGetAccessor.java:66)
> at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:99)
> at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
> at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:107)
> at org.mvel2.MVEL.executeExpression(MVEL.java:978)
> at org.drools.base.mvel.MVELConsequence.evaluate(MVELConsequence.java:87)
> at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:934)
> at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:885)
> at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1086)
> at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:660)
> at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:627)
> at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:183)
> at com.drools.debug.Test.runIteration(Test.java:132)
> at com.drools.debug.Test.startTest(Test.java:73)
> at com.drools.debug.Test.main(Test.java:196)
> Caused by: java.lang.ClassNotFoundException: mytest.debug.rules.PerUserCount
> at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
> at java.security.AccessController.doPrivileged(Native Method)
> at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:319)
> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:254)
> at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:402)
> ... 23 more
--
This message was sent by Atlassian Jira
(v7.13.8#713008)
5 years, 9 months
[JBoss JIRA] (JBRULES-2386) Matches constraint fails to match regex
by Tihomir Surdilovic (Jira)
[ https://issues.redhat.com/browse/JBRULES-2386?page=com.atlassian.jira.plu... ]
Tihomir Surdilovic closed JBRULES-2386.
---------------------------------------
Resolution: Out of Date
> Matches constraint fails to match regex
> ---------------------------------------
>
> Key: JBRULES-2386
> URL: https://issues.redhat.com/browse/JBRULES-2386
> Project: JBRULES
> Issue Type: Bug
> Affects Versions: 5.0.1.FINAL
> Reporter: Nick Heudecker
> Assignee: Tihomir Surdilovic
> Priority: Major
> Fix For: 6.0.0.Alpha1
>
> Attachments: drools-example.zip
>
>
> This rule fails to evaluate correctly:
> rule "Test Regex"
> when
> $q : Query()
> $g : QueryGroup() from $q.groups
> $f : QueryFilter(name == "address", regex == true) from $g.filters
> $p : Person(address.value matches $f.value)
> then
> System.out.println("Found regex match");
> end
> I've attached an example project that reproduces the problem.
--
This message was sent by Atlassian Jira
(v7.13.8#713008)
5 years, 9 months
[JBoss JIRA] (JBRULES-2253) ClassNotFound when ASM optimizer kicks in in MVEL consequence
by Tihomir Surdilovic (Jira)
[ https://issues.redhat.com/browse/JBRULES-2253?page=com.atlassian.jira.plu... ]
Tihomir Surdilovic closed JBRULES-2253.
---------------------------------------
Resolution: Out of Date
> ClassNotFound when ASM optimizer kicks in in MVEL consequence
> -------------------------------------------------------------
>
> Key: JBRULES-2253
> URL: https://issues.redhat.com/browse/JBRULES-2253
> Project: JBRULES
> Issue Type: Bug
> Components: drools-core
> Affects Versions: 5.0.1.FINAL
> Reporter: Michael Neale
> Assignee: Tihomir Surdilovic
> Priority: Critical
> Fix For: 6.0.0.Alpha1
>
> Attachments: EvaluationTests.java, fibonacci.drl, repository_export_mic.zip
>
>
> (ok if the subject is really confusing, perhaps this bug isn't for you).
> In chasing down JBRULES-2234 I found this. Instructions (apologies for relying on Guvnor to reproduce):
> To reproduce is not
> easy, but here are some instructions:
> * Run latest Guvnor (if you are able to, if not, then the rest is moot !).
> * Import the attached repo (unzip it first).
> * browse to KnowledgeBases/org/acme/insurance/pricing/
> - press "build package"
> * shut it down, restart (flushes caches etc...)
> Then:
> * browse to KnowledgeBases/org/acme/insurance/pricing/Test Scenarios
> * open PolicyQuotePackageTest
> * run it:
> Now you should see an exception like this:
> Caused by: java.lang.NoClassDefFoundError: org/acme/insurance/Policy
> at ASMAccessorImpl_62408281250565694450.setValue(Unknown Source)
> at org.mvel2.optimizers.dynamic.DynamicSetAccessor.setValue(DynamicSetAccessor.java:74)
> at org.mvel2.compiler.CompiledAccExpression.setValue(CompiledAccExpression.java:47)
> at org.mvel2.MVEL.executeSetExpression(MVEL.java:962)
> at org.mvel2.ast.WithNode$ParmValuePair.eval(WithNode.java:242)
> at org.mvel2.ast.WithNode.getReducedValueAccelerated(WithNode.java:67)
> at org.mvel2.ast.InterceptorWrapper.getReducedValueAccelerated(InterceptorWrapper.java:38)
> at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
> at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:104)
> at org.mvel2.MVEL.executeExpression(MVEL.java:995)
> at org.drools.base.mvel.MVELConsequence.evaluate(MVELConsequence.java:91)
> at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:966)
> This is due to it loading a previously serialized version of the KB.
> If it was to run off a freshly compiled one, its all fine. Also, if I
> tell MVEL to NOT use ASM optimizer, it works fine (using reflection).
> So clearly the stuff is available to the classpath in the right
> places... its only to do with ASM in mvel post deserialization. (and
> for that to happen, MVEL has to execute the compiled expression enough
> to kick in the JIT).
> MVELCompilationUnit in drools is worth examining too... still not sure where the problem lies.
--
This message was sent by Atlassian Jira
(v7.13.8#713008)
5 years, 9 months
[JBoss JIRA] (WFLY-13314) Metrics smallrye contains duplicated help lines
by Matthias Depuydt (Jira)
Matthias Depuydt created WFLY-13314:
---------------------------------------
Summary: Metrics smallrye contains duplicated help lines
Key: WFLY-13314
URL: https://issues.redhat.com/browse/WFLY-13314
Project: WildFly
Issue Type: Bug
Affects Versions: 18.0.1.Final
Reporter: Matthias Depuydt
Assignee: Brian Stansberry
The metrics endpoint on which the wildfly microprofile-metrics-smallrye:2.0 subsystem exposes all metrics can't be scraped with prometheus.
Both the base_gc_time_total & base_gc_total metrics have their help line duplicated which causes prometheus to throw the following error:
Could not build time series for component wildfly: text format parsing error in line 34: second HELP line for metric name "base_gc_total"
I have confirmed this is the case for wildfly 18.0.1
--
This message was sent by Atlassian Jira
(v7.13.8#713008)
5 years, 9 months