would have to look at the code for that - its the only documentation that makes sense for something so low-level...
I don't think there were major changes in Drools 4 to 5 in that area - so odd that it doesn't work. On Fri, Sep 4, 2009 at 1:01 AM, kpowerinfinity<[email protected]> wrote: > Hi Mike, > > Do you remember what you needed to do for drools3.0? I had earlier > compiled drools 4.0 and it seemed to work without any major problems. > > Where can I find some documentation on the ASM and where drools picks > up the classes from while generating the "in-situ" classes? > > Thanks, Krishna. > > -- > http://kpowerinfinity.wordpress.com > http://www.linkedin.com/in/kpowerinfinity > > > > > On Thu, Sep 3, 2009 at 5:31 AM, Michael Neale<[email protected]> wrote: >> Hi Krishna - I don't think the .Net version on the codehaus is kept >> that up to date, so its probably a good thing you are doing what you >> are doing with the latest. >> >> Yes, those accessor classes are indeed lazily generated and loaded >> "in-situ" - this is for fast access of fields in the alpha network >> which can be hit hard and often... an inlined version of the ASM >> library is used to do this. >> >> I am pretty sure that even in drools 3 we did something like this >> (also using ASM) and that was able to work with IKVM - so there must >> be some small change that has made the IKVM classloader angry... >> >> On a barely related note: is it worth thinking about a Source to >> Source translator to C# - there are a few around (ILog even open >> sourced one, although it didn't cope with Generics last I checked...) >> ? >> >> >> Michael. >> >> On Wed, Sep 2, 2009 at 11:56 PM, kpowerinfinity<[email protected]> >> wrote: >>> Hello, >>> >>> I've been trying to compile the latest version of drools to .NET for a >>> few days now. However, due to the classloaders structure, the classes >>> in the org.drools.base.extractors.* are not found by the classloader, >>> and the execution stops with a NoClassDefFoundError for classes in >>> that package. >>> >>> Here's some details about the setup: >>> Drools version: 5.0.1 >>> IKVM Version: 0.40.0.1 >>> >>> I have successfully compiled all the required libraries into a DLL >>> using IKVM, and a simple rule (containing a null LHS) runs >>> successfully, all the classes are found, and the rule engine produces >>> the correct output. However, when I add a condition into the LHS, it >>> fails because it can't find one of the classes in >>> /org.drools.base.extractors..*Reader/ >>> >>> A sample rule I am using is: >>> """ >>> package package >>> import rules.Customer >>> import rules.VoucherSeries >>> >>> rule "everything free for Krishna" >>> >>> when >>> $c : Customer( firstname == "Krishna" ) >>> then >>> VoucherSeries fact0 = new VoucherSeries(); >>> fact0.setSeriesCode( "FREE" ); >>> insert(fact0 ); >>> end >>> """ >>> >>> I have verified that all the classes are present in the classloader I >>> am passing to the KnowledgeBuilderConfiguration. In fact, I also tried >>> creating a MapBasedClassLoader that contains all the missing classes >>> so that they can be easily found using fastFindClass. In the code >>> listing below, both klass and klass2 resolve to the correct class >>> objects. >>> >>> """ >>> java.util.Properties p = new java.util.Properties(); >>> p.put("drools.dialect.java.compiler", "JANINO"); >>> java.lang.ClassLoader cl = >>> java.lang.Class.forName("org.drools.base.extractors.BaseLongClassFieldReader").getClassLoader(); >>> org.drools.rule.CompositeClassLoader compositeClassLoader >>> = new org.drools.rule.CompositeClassLoader(cl); >>> >>> org.drools.rule.MapBackedClassLoader mbcl = >>> getMapBackedClassLoader(cl); >>> >>> compositeClassLoader.addClassLoader(mbcl); >>> java.lang.Class klass = >>> compositeClassLoader.fastFindClass("rules.Customer"); >>> java.lang.Class klass2 = >>> compositeClassLoader.fastFindClass("org.drools.base.extractors.BaseObjectClassFieldReader"); >>> java.lang.ClassLoader finalClassLoader = compositeClassLoader; >>> >>> org.drools.builder.KnowledgeBuilderConfiguration kbc = >>> org.drools.builder.KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(p, >>> finalClassLoader); >>> """ >>> >>> However, adding the DRL / PKG file, it fails with the exception: >>> >>> java.lang.NoClassDefFoundError was caught >>> Message="org.drools.base.extractors.BaseObjectClassFieldReader" >>> Source="IKVM.Runtime" >>> StackTrace: >>> at IKVM.NativeCode.java.lang.ClassLoader.defineClass1(Object >>> thisClassLoader, String name, Byte[] b, Int32 off, Int32 len, Object >>> pd, String source) >>> at java.lang.ClassLoader.defineClass1(String , Byte[] , Int32 , >>> Int32 , ProtectionDomain , String ) >>> at java.lang.ClassLoader.defineClass(String name, Byte[] b, >>> Int32 off, Int32 len, ProtectionDomain protectionDomain) >>> at >>> org.drools.base.ClassFieldAccessorCache.ByteArrayClassLoader.defineClass(String >>> name, Byte[] bytes, ProtectionDomain domain) >>> at org.drools.base.ClassFieldAccessorFactory.getClassFieldReader(Class >>> clazz, String fieldName, CacheEntry cache) >>> at >>> org.drools.base.ClassFieldAccessorCache.CacheEntry.getReadAccessor(AccessorKey >>> key, Class cls) >>> at >>> org.drools.base.ClassFieldAccessorCache.getReadAcessor(ClassFieldReader >>> reader) >>> at org.drools.base.ClassFieldAccessorStore.wire(ClassFieldReader >>> reader) >>> at org.drools.base.ClassFieldAccessorStore.getReader(String >>> className, String fieldName, AcceptsReadAccessor target, AccessorType >>> accessorType) >>> at org.drools.base.ClassFieldAccessorStore.getReader(String >>> className, String fieldName, AcceptsReadAccessor target) >>> at >>> org.drools.rule.builder.PatternBuilder.getFieldReadAccessor(RuleBuildContext >>> context, BaseDescr descr, ObjectType objectType, String fieldName, >>> AcceptsReadAccessor target, Boolean reportError) >>> at org.drools.rule.builder.PatternBuilder.build(RuleBuildContext >>> , Pattern , FieldConstraintDescr , AbstractCompositeConstraint ) >>> at >>> org.drools.rule.builder.PatternBuilder.buildConstraint(RuleBuildContext >>> , Pattern , Object , AbstractCompositeConstraint ) >>> at org.drools.rule.builder.PatternBuilder.build(RuleBuildContext >>> context, BaseDescr descr, Pattern prefixPattern) >>> at org.drools.rule.builder.PatternBuilder.build(RuleBuildContext >>> context, BaseDescr descr) >>> at org.drools.rule.builder.GroupElementBuilder.build(RuleBuildContext >>> context, BaseDescr descr, Pattern prefixPattern) >>> at org.drools.rule.builder.RuleBuilder.build(RuleBuildContext context) >>> at org.drools.compiler.PackageBuilder.addRule(RuleDescr ) >>> at org.drools.compiler.PackageBuilder.addPackage(PackageDescr >>> packageDescr) >>> at org.drools.compiler.PackageBuilder.addPackageFromDrl(Resource >>> resource) >>> at org.drools.compiler.PackageBuilder.addKnowledgeResource(Resource >>> resource, ResourceType type, ResourceConfiguration configuration) >>> at org.drools.builder.impl.KnowledgeBuilderImpl.add(Resource >>> resource, ResourceType type) >>> at Capillary.Client.RulesEngine.RuleManager.ReadRules(String >>> filename) in >>> D:\coderoot\module\DataEntryClient-DVS\SubProjects\RulesEngine\RuleManager.cs:line >>> 116 >>> InnerException: >>> >>> I saw the code at org/drools/base/ClassFieldAccessorCache.java, and it >>> seems me that the Reader class for the particular type is being >>> defined in situ using a byte[] array, but I am unable to understand >>> why it can't load the class at that point. >>> >>> Can anybody with a better idea of the drools classloading structure >>> guide me here? >>> >>> Also, is the drools.NET project active now? I would post all the steps >>> I took for posterity. >>> >>> Thanks and Regards, >>> Krishna. >>> >>> -- >>> http://kpowerinfinity.wordpress.com >>> http://www.linkedin.com/in/kpowerinfinity >>> _______________________________________________ >>> rules-dev mailing list >>> [email protected] >>> https://lists.jboss.org/mailman/listinfo/rules-dev >>> >> >> >> >> -- >> Michael D Neale >> home: www.michaelneale.net >> blog: michaelneale.blogspot.com >> >> _______________________________________________ >> rules-dev mailing list >> [email protected] >> https://lists.jboss.org/mailman/listinfo/rules-dev >> > > _______________________________________________ > rules-dev mailing list > [email protected] > https://lists.jboss.org/mailman/listinfo/rules-dev > -- Michael D Neale home: www.michaelneale.net blog: michaelneale.blogspot.com _______________________________________________ rules-dev mailing list [email protected] https://lists.jboss.org/mailman/listinfo/rules-dev
