The model is always defined by the DRL syntax. There is no point in <div>exposing the implementation of some object hierarchy as it is produced</div><div>by the DRL compiler, tree walker, etc. There may be a limit to what</div>
<div>is possible to reconstruct from that internal implementation, but</div><div>surely not for the top level objects. </div><div><br></div><div>-W</div><div><br></div><div><br><div class="gmail_quote">On 17 February 2012 19:36, Mark Proctor <span dir="ltr">&lt;<a href="mailto:mproctor@codehaus.org">mproctor@codehaus.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 17/02/2012 13:54, Wolfgang Laun wrote:<br>
&gt; Below is some code that indicates the general direction. Since it uses<br>
&gt; the unstable API, it may not work as well any more, it was good in 5.1.1<br>
&gt; and it still works using 5.3.0 with straightforward patterns.<br>
&gt;<br>
&gt; Mark does not agree with me that it is a legitimate wish of Drools<br>
&gt; application development to inspect binary packages, e.g., for<br>
&gt; documentation purposes, and he refuses to have any of this in<br>
&gt; the stable API.  Constant dripping wears away the stone. ;-)<br>
I&#39;ve discussed with edson we will add top level attributes back in, and<br>
just deal with deprecating the methods when the time comes. So that that<br>
you can list the packages, get the rules, functions and type<br>
declarations for those packages.<br>
<br>
We will not be exposing internal rule constructs like patterns,<br>
constraints etc as public supported apis. Although others are welcome to<br>
document and use then, on the caveat that they understand they may<br>
change on any release. It&#39;s not that I don&#39;t think it&#39;s a legitimate<br>
request, I think it&#39;s perfectly valid. It&#39;s simply that we cannot be<br>
tied down to an internal model, we need to be free to change that.<br>
However users who code against those internal models will cry havoc if<br>
we change them, if the think they are public apis.<br>
<br>
Mark<br>
&gt;<br>
&gt; -W<br>
&gt;<br>
&gt;<br>
&gt; On 17/02/2012, Mark Proctor&lt;<a href="mailto:mproctor@codehaus.org">mproctor@codehaus.org</a>&gt;  wrote:<br>
&gt;&gt; On 17/02/2012 05:37, <a href="mailto:GPatel@tsys.com">GPatel@tsys.com</a> wrote:<br>
&gt;&gt;&gt; I need it at rule definition time, or when the rule is saved. Could<br>
&gt;&gt;&gt; you point me to a starting place in the internal api ?<br>
&gt;&gt; take a look in drools-compiler and org.drools.lang.RuleParserTest.<br>
&gt;&gt;<br>
&gt;&gt; Mark<br>
&gt;&gt;&gt; Thanks<br>
&gt;&gt;&gt; G. Patel<br>
&gt;&gt;&gt;<br>
&gt;<br>
&gt; package whatever;<br>
&gt;<br>
&gt; import java.io.PrintStream;<br>
&gt; import java.util.Formatter;<br>
&gt; import java.util.HashMap;<br>
&gt; import java.util.HashSet;<br>
&gt; import java.util.List;<br>
&gt; import java.util.Map;<br>
&gt; import java.util.Set;<br>
&gt;<br>
&gt; import org.drools.KnowledgeBase;<br>
&gt; import org.drools.base.ClassObjectType;<br>
&gt; import org.drools.definition.KnowledgePackage;<br>
&gt; import org.drools.definitions.impl.KnowledgePackageImp;<br>
&gt; import org.drools.rule.Accumulate;<br>
&gt; import org.drools.rule.Collect;<br>
&gt; import org.drools.rule.EntryPoint;<br>
&gt; import org.drools.rule.EvalCondition;<br>
&gt; import org.drools.rule.Forall;<br>
&gt; import org.drools.rule.From;<br>
&gt; import org.drools.rule.GroupElement;<br>
&gt; import org.drools.rule.Pattern;<br>
&gt; import org.drools.rule.Rule;<br>
&gt; import org.drools.spi.ObjectType;<br>
&gt;<br>
&gt; public class RulesByClasses {<br>
&gt;    private Formatter fmt;<br>
&gt;    private String ruleName;<br>
&gt;    private String packageName;<br>
&gt;    private Map&lt;String,Set&lt;String&gt;&gt;  class2rules;<br>
&gt;<br>
&gt;    public RulesByClasses( PrintStream printStream ){<br>
&gt;      fmt = new Formatter( printStream );<br>
&gt;    }<br>
&gt;<br>
&gt;    public RulesByClasses(){<br>
&gt;      this( System.out );<br>
&gt;    }<br>
&gt;<br>
&gt;    private void register( String className ){<br>
&gt;      Set&lt;String&gt;  ruleSet = class2rules.get( className );<br>
&gt;      if( ruleSet == null ){<br>
&gt;        ruleSet = new HashSet&lt;String&gt;();<br>
&gt;        class2rules.put( className, ruleSet );<br>
&gt;      }<br>
&gt;      ruleSet.add( &quot;\&quot;&quot; + ruleName + &quot;\&quot; in &quot; + packageName );<br>
&gt;    }<br>
&gt;<br>
&gt;    private void inspectCollect( Collect collect ){<br>
&gt;      inspectPattern( collect.getSourcePattern() );<br>
&gt;      inspectNestedElements( collect.getNestedElements() );<br>
&gt;    }<br>
&gt;<br>
&gt;    private void inspectAccumulate( Accumulate accumulate ){<br>
&gt;      inspectNestedElements( accumulate.getNestedElements() );<br>
&gt;    }<br>
&gt;<br>
&gt;    private void inspectFrom( From from ){<br>
&gt;      inspectNestedElements( from.getNestedElements() );<br>
&gt;    }<br>
&gt;<br>
&gt;    private void inspectNestedElements( List&lt;?&gt;  nested ){<br>
&gt;      for( Object o: nested ){<br>
&gt;        if( o instanceof Pattern ){<br>
&gt;          inspectPattern( (Pattern)o );<br>
&gt;        } else if( o instanceof GroupElement ){<br>
&gt;          inspectGroupElement( (GroupElement)o );<br>
&gt;        } else if( o instanceof Forall ){<br>
&gt;          inspectForall( (Forall)o );<br>
&gt;        } else if( o instanceof Collect ){<br>
&gt;          inspectCollect( (Collect)o );<br>
&gt;        } else if( o instanceof Accumulate ){<br>
&gt;          inspectAccumulate( (Accumulate)o );<br>
&gt;        } else if( o instanceof From ){<br>
&gt;          inspectFrom( (From)o );<br>
&gt;        } else if( o instanceof EntryPoint ){<br>
&gt;          //...<br>
&gt;        } else {<br>
&gt;          throw new IllegalStateException( &quot;unexpected CE &quot; + o.getClass() );<br>
&gt;        }<br>
&gt;      }<br>
&gt;    }<br>
&gt;<br>
&gt;    private void inspectPattern( Pattern pattern ){<br>
&gt;      ObjectType objectType = pattern.getObjectType();<br>
&gt;      if( objectType instanceof ClassObjectType ){<br>
&gt;        ClassObjectType classObjectType = (ClassObjectType)objectType;<br>
&gt;        register( classObjectType.getClassName() );<br>
&gt;      }<br>
&gt;      inspectNestedElements( pattern.getNestedElements() );<br>
&gt;    }<br>
&gt;<br>
&gt;    private void inspectForall( Forall forall ){<br>
&gt;      inspectNestedElements( forall.getNestedElements() );<br>
&gt;    }<br>
&gt;<br>
&gt;    private void inspectGroupElement( GroupElement groupElement ){<br>
&gt;      for( Object o: groupElement.getChildren() ){<br>
&gt;        if( o instanceof Pattern ){<br>
&gt;          inspectPattern( (Pattern)o );<br>
&gt;        } else if( o instanceof GroupElement ){<br>
&gt;          inspectGroupElement( (GroupElement)o );<br>
&gt;        } else if( o instanceof Forall ){<br>
&gt;          inspectForall( (Forall)o );<br>
&gt;        } else if( o instanceof EvalCondition ){<br>
&gt;          // ...<br>
&gt;        } else {<br>
&gt;          throw new IllegalStateException( &quot;unexpected CE &quot; + o.getClass() );<br>
&gt;        }<br>
&gt;      }<br>
&gt;    }<br>
&gt;<br>
&gt;    private void inspect( KnowledgePackage kPackage ){<br>
&gt;      packageName = kPackage.getName();<br>
&gt;      for( org.drools.definition.rule.Rule ruleCopy: kPackage.getRules() ){<br>
&gt;        ruleName = ruleCopy.getName();<br>
&gt;        Rule rule = (Rule)((KnowledgePackageImp)kPackage).getRule( ruleName );<br>
&gt;        inspectGroupElement( rule.getLhs() );<br>
&gt;      }<br>
&gt;    }<br>
&gt;<br>
&gt;    private void emit(){<br>
&gt;      for( Map.Entry&lt;String,Set&lt;String&gt;&gt;  entry: class2rules.entrySet() ){<br>
&gt;        fmt.format( &quot;Class %s%n&quot;, entry.getKey() );<br>
&gt;        for( String ruleNamePack: entry.getValue() ){<br>
&gt;          fmt.format( &quot;  %s%n&quot;, ruleNamePack );<br>
&gt;        }<br>
&gt;      }<br>
&gt;    }<br>
&gt;<br>
&gt;    public void print( KnowledgePackage kPackage ){<br>
&gt;      class2rules = new HashMap&lt;String,Set&lt;String&gt;&gt;();<br>
&gt;      inspect( kPackage );<br>
&gt;      emit();<br>
&gt;    }<br>
&gt;<br>
&gt;    public void print( KnowledgeBase kBase ){<br>
&gt;      class2rules = new HashMap&lt;String,Set&lt;String&gt;&gt;();<br>
&gt;      for( KnowledgePackage kPackage: kBase.getKnowledgePackages() ){<br>
&gt;        inspect( kPackage );<br>
&gt;      }<br>
&gt;      emit();<br>
&gt;    }<br>
&gt; }<br>
&gt; _______________________________________________<br>
&gt; rules-users mailing list<br>
&gt; <a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
<br>
_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
</blockquote></div><br></div>