[rules-users] IllegalAccessError in shadow classes
Edson Tirelli
tirelli at post.com
Wed Feb 20 11:25:06 EST 2008
Ok, let me show one example. Imagine the class Person, with 2 attributes
(name and age) and the corresponding getter/setters.
What are the data for that fact that must be shadowed? easy answer: just
shadow all getXXX() methods (getName and getAge).
Now, take a Map. What is the data that must be shadowed?
So, we do our best to work with facts that don't follow the javabean
spec, but collections and maps are a complicated beast. Again, if you have
suggestions on how to improve the current support we provide for them,
please share with us.
[]s
Edson
2008/2/20, Godmar Back <godmar at gmail.com>:
>
> On Feb 20, 2008 9:23 AM, Edson Tirelli <tirelli at post.com> wrote:
> >
> > Godmar,
> >
> > Short answer: collection/maps objects are not javabeans.
> >
>
> Explain why this is a problem.
>
> What is it about JavaBeans that your algorithm relies upon? Is it the
> fact that the set of properties remains fixed and can be determined at
> (fact) insertion time via reflection?
>
> Otherwise, I do not see any conceptual difference between a map and a
> bean.
> If that is the difference, then please allow maps with an immutable key
> set.
>
> - Godmar
>
>
> > Long answer: collection/maps must be shadowed to ensure consistency
> > during execution, but how can we shadow the data if it is not exposed in
> a
> > default, spec manner, as in javabeans? The algorithm we have in place
> right
> > now is bellow. As you can see, it is a weak algo, but was the best I
> could
> > come up at that time. If you have any suggestions on how to improve
> that, I
> > appreciate.
> >
> > public Object getShadow(final Object fact) throws
> RuntimeDroolsException
> > {
> > ShadowProxy proxy = null;
> > if ( isShadowEnabled() ) {
> > try {
> > if ( Collection.class.isAssignableFrom( this.shadowClass)
> > || Map.class.isAssignableFrom( this.shadowClass ) ) {
> > // if it is a collection, try to instantiate using
> > constructor
> > try {
> > proxy = (ShadowProxy)
> > this.shadowClass.getConstructor( new Class[]{cls} ).newInstance( new
> > Object[]{fact} );
> > } catch ( Exception e ) {
> > // not possible to instantiate using constructor
> > }
> > }
> > if ( proxy == null ) {
> > if ( this.instantiator == null ) {
> > this.setInstantiator();
> > }
> > proxy = (ShadowProxy) this.instantiator.newInstance
> ();
> > }
> >
> > proxy.setShadowedObject( fact );
> > } catch ( final Exception e ) {
> > System.out.println( "shadow: " +proxy.getClass() + ":" +
> > fact.getClass() );
> > throw new RuntimeDroolsException( "Error creating shadow
> > fact for object: " + fact,
> > e );
> > }
> > }
> > return proxy;
> >
> >
> > }
> >
> > []s
> > Edson
> >
> > 2008/2/19, Godmar Back <godmar at gmail.com>:
> > > As a general comment, the examples for which I find Drools failing are
> > > not the actual examples for which my application is failing. It's just
> > > the smallest test case I was able to eliminate.
> > >
> > > I'm now a bit concerned about your comment that Maps and Collections
> > > aren't well-defined as Facts. I am planning to make extensive use of
> > > them (that's also why I'd prefer to use the MVEL dialect, because in
> > > Java I cannot do this without creating Bean wrappers.)
> > >
> > > Could you elaborate what makes the semantics not "well-defined".
> > >
> > > I'm specifically concerned with immutable maps (such as the one that
> > > would have been returned by Collections.singletonMap), and with
> > > collections of maps (such as those obtained via a "from"..." clause).
> > > I need to insert immutable maps as facts; I understand that the items
> > > returned by "from" aren't inserted as facts.
> > >
> > > - Godmar
> > >
> > > On Feb 19, 2008 3:11 PM, Edson Tirelli <tirelli at post.com> wrote:
> > > >
> > > > Drools tries to create the ShadowProxy. The reason is that it
> does
> > not
> > > > know about the implementation... it just knows it is a Map and as
> so, it
> > > > must be shadowed. Problem is that SingletonMap is either final or
> does
> > not
> > > > have a default constructor.
> > > > My recommendation, besides opening a JIRA for this, is avoid
> > inserting
> > > > collections/maps directly as facts. The semantic for such facts is
> not
> > > > clearly defined and it may cause undesired behavior.
> > > >
> > > > []s
> > > > Edson
> > > >
> > > > 2008/2/19, Godmar Back <godmar at gmail.com>:
> > > > >
> > > > >
> > > > >
> > > > > Hi,
> > > > >
> > > > > usings Drools 4.0.4 and MVEL 1.4, this simple rule:
> > > > > ---
> > > > > package test;
> > > > >
> > > > > import java.util.Collections;
> > > > >
> > > > > dialect "mvel"
> > > > >
> > > > > rule "Rule #1"
> > > > > when
> > > > > then
> > > > > insert(Collections.singletonMap("content", "hello"));
> > > > > end
> > > > > --
> > > > >
> > > > > produces:
> > > > > java.lang.IllegalAccessError: class
> > > > > org.drools.shadow.java.util.Collections$SingletonMapShadowProxycannot
> > > > > access its superclass java.util.Collections$SingletonMap
> > > > > at java.lang.ClassLoader.defineClass1(Native Method)
> > > > > at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
> > > > > at
> > > >
> > org.drools.rule.MapBackedClassLoader.fastFindClass(
> MapBackedClassLoader.java:60)
> > > > > at
> > > >
> > org.drools.rule.MapBackedClassLoader.loadClass(MapBackedClassLoader.java
> :79)
> > > > > at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
> > > > > at
> > > >
> > org.drools.reteoo.Rete$ClassObjectTypeConf.loadOrGenerateProxy(Rete.java
> :547)
> > > > > at
> > > >
> > org.drools.reteoo.Rete$ClassObjectTypeConf.defineShadowProxyData(
> Rete.java:494)
> > > > > at
> > > > org.drools.reteoo.Rete$ClassObjectTypeConf.<init>(Rete.java:461)
> > > > > at org.drools.reteoo.Rete.assertObject(Rete.java:152)
> > > > > at
> > > > org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java
> :192)
> > > > > at
> > > >
> > org.drools.reteoo.ReteooWorkingMemory.doInsert(ReteooWorkingMemory.java
> :71)
> > > > > at
> > > >
> > org.drools.common.AbstractWorkingMemory.insert(
> AbstractWorkingMemory.java:909)
> > > > > at
> > > >
> > org.drools.common.AbstractWorkingMemory.insert(
> AbstractWorkingMemory.java:881)
> > > > > at
> > > >
> > org.drools.base.DefaultKnowledgeHelper.insert(
> DefaultKnowledgeHelper.java:67)
> > > > > at
> > > >
> > org.drools.base.DefaultKnowledgeHelper.insert(
> DefaultKnowledgeHelper.java:61)
> > > > >
> > > > >
> > > > > It's not clear to me why Drools creates Proxies for such classes
> as
> > > > > java.util.Collections, or does MVEL do it?
> > > > >
> > > > > - Godmar
> > > > > _______________________________________________
> > > > > rules-users mailing list
> > > > > rules-users at lists.jboss.org
> > > > > https://lists.jboss.org/mailman/listinfo/rules-users
> > > > >
> > > >
> > > >
> > > >
> > > > --
> > > > Edson Tirelli
> > > > JBoss Drools Core Development
> > > > Office: +55 11 3529-6000
> > > > Mobile: +55 11 9287-5646
> > > > JBoss, a division of Red Hat @ www.jboss.com
> > > > _______________________________________________
> > > > rules-users mailing list
> > > > rules-users at lists.jboss.org
> > > > https://lists.jboss.org/mailman/listinfo/rules-users
> > > >
> > > >
> > > _______________________________________________
> > > rules-users mailing list
> > > rules-users at lists.jboss.org
> > > https://lists.jboss.org/mailman/listinfo/rules-users
> > >
> >
> >
> >
> > --
> > Edson Tirelli
> > JBoss Drools Core Development
> > Office: +55 11 3529-6000
> > Mobile: +55 11 9287-5646
> > JBoss, a division of Red Hat @ www.jboss.com
> > _______________________________________________
> > rules-users mailing list
> > rules-users at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/rules-users
> >
> >
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
--
Edson Tirelli
JBoss Drools Core Development
Office: +55 11 3529-6000
Mobile: +55 11 9287-5646
JBoss, a division of Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20080220/aac82980/attachment.html
More information about the rules-users
mailing list