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"><<a href="mailto:mproctor@codehaus.org">mproctor@codehaus.org</a>></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>
> Below is some code that indicates the general direction. Since it uses<br>
> the unstable API, it may not work as well any more, it was good in 5.1.1<br>
> and it still works using 5.3.0 with straightforward patterns.<br>
><br>
> Mark does not agree with me that it is a legitimate wish of Drools<br>
> application development to inspect binary packages, e.g., for<br>
> documentation purposes, and he refuses to have any of this in<br>
> the stable API. Constant dripping wears away the stone. ;-)<br>
I'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's not that I don't think it's a legitimate<br>
request, I think it's perfectly valid. It'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>
><br>
> -W<br>
><br>
><br>
> On 17/02/2012, Mark Proctor<<a href="mailto:mproctor@codehaus.org">mproctor@codehaus.org</a>> wrote:<br>
>> On 17/02/2012 05:37, <a href="mailto:GPatel@tsys.com">GPatel@tsys.com</a> wrote:<br>
>>> I need it at rule definition time, or when the rule is saved. Could<br>
>>> you point me to a starting place in the internal api ?<br>
>> take a look in drools-compiler and org.drools.lang.RuleParserTest.<br>
>><br>
>> Mark<br>
>>> Thanks<br>
>>> G. Patel<br>
>>><br>
><br>
> package whatever;<br>
><br>
> import java.io.PrintStream;<br>
> import java.util.Formatter;<br>
> import java.util.HashMap;<br>
> import java.util.HashSet;<br>
> import java.util.List;<br>
> import java.util.Map;<br>
> import java.util.Set;<br>
><br>
> import org.drools.KnowledgeBase;<br>
> import org.drools.base.ClassObjectType;<br>
> import org.drools.definition.KnowledgePackage;<br>
> import org.drools.definitions.impl.KnowledgePackageImp;<br>
> import org.drools.rule.Accumulate;<br>
> import org.drools.rule.Collect;<br>
> import org.drools.rule.EntryPoint;<br>
> import org.drools.rule.EvalCondition;<br>
> import org.drools.rule.Forall;<br>
> import org.drools.rule.From;<br>
> import org.drools.rule.GroupElement;<br>
> import org.drools.rule.Pattern;<br>
> import org.drools.rule.Rule;<br>
> import org.drools.spi.ObjectType;<br>
><br>
> public class RulesByClasses {<br>
> private Formatter fmt;<br>
> private String ruleName;<br>
> private String packageName;<br>
> private Map<String,Set<String>> class2rules;<br>
><br>
> public RulesByClasses( PrintStream printStream ){<br>
> fmt = new Formatter( printStream );<br>
> }<br>
><br>
> public RulesByClasses(){<br>
> this( System.out );<br>
> }<br>
><br>
> private void register( String className ){<br>
> Set<String> ruleSet = class2rules.get( className );<br>
> if( ruleSet == null ){<br>
> ruleSet = new HashSet<String>();<br>
> class2rules.put( className, ruleSet );<br>
> }<br>
> ruleSet.add( "\"" + ruleName + "\" in " + packageName );<br>
> }<br>
><br>
> private void inspectCollect( Collect collect ){<br>
> inspectPattern( collect.getSourcePattern() );<br>
> inspectNestedElements( collect.getNestedElements() );<br>
> }<br>
><br>
> private void inspectAccumulate( Accumulate accumulate ){<br>
> inspectNestedElements( accumulate.getNestedElements() );<br>
> }<br>
><br>
> private void inspectFrom( From from ){<br>
> inspectNestedElements( from.getNestedElements() );<br>
> }<br>
><br>
> private void inspectNestedElements( List<?> nested ){<br>
> for( Object o: nested ){<br>
> if( o instanceof Pattern ){<br>
> inspectPattern( (Pattern)o );<br>
> } else if( o instanceof GroupElement ){<br>
> inspectGroupElement( (GroupElement)o );<br>
> } else if( o instanceof Forall ){<br>
> inspectForall( (Forall)o );<br>
> } else if( o instanceof Collect ){<br>
> inspectCollect( (Collect)o );<br>
> } else if( o instanceof Accumulate ){<br>
> inspectAccumulate( (Accumulate)o );<br>
> } else if( o instanceof From ){<br>
> inspectFrom( (From)o );<br>
> } else if( o instanceof EntryPoint ){<br>
> //...<br>
> } else {<br>
> throw new IllegalStateException( "unexpected CE " + o.getClass() );<br>
> }<br>
> }<br>
> }<br>
><br>
> private void inspectPattern( Pattern pattern ){<br>
> ObjectType objectType = pattern.getObjectType();<br>
> if( objectType instanceof ClassObjectType ){<br>
> ClassObjectType classObjectType = (ClassObjectType)objectType;<br>
> register( classObjectType.getClassName() );<br>
> }<br>
> inspectNestedElements( pattern.getNestedElements() );<br>
> }<br>
><br>
> private void inspectForall( Forall forall ){<br>
> inspectNestedElements( forall.getNestedElements() );<br>
> }<br>
><br>
> private void inspectGroupElement( GroupElement groupElement ){<br>
> for( Object o: groupElement.getChildren() ){<br>
> if( o instanceof Pattern ){<br>
> inspectPattern( (Pattern)o );<br>
> } else if( o instanceof GroupElement ){<br>
> inspectGroupElement( (GroupElement)o );<br>
> } else if( o instanceof Forall ){<br>
> inspectForall( (Forall)o );<br>
> } else if( o instanceof EvalCondition ){<br>
> // ...<br>
> } else {<br>
> throw new IllegalStateException( "unexpected CE " + o.getClass() );<br>
> }<br>
> }<br>
> }<br>
><br>
> private void inspect( KnowledgePackage kPackage ){<br>
> packageName = kPackage.getName();<br>
> for( org.drools.definition.rule.Rule ruleCopy: kPackage.getRules() ){<br>
> ruleName = ruleCopy.getName();<br>
> Rule rule = (Rule)((KnowledgePackageImp)kPackage).getRule( ruleName );<br>
> inspectGroupElement( rule.getLhs() );<br>
> }<br>
> }<br>
><br>
> private void emit(){<br>
> for( Map.Entry<String,Set<String>> entry: class2rules.entrySet() ){<br>
> fmt.format( "Class %s%n", entry.getKey() );<br>
> for( String ruleNamePack: entry.getValue() ){<br>
> fmt.format( " %s%n", ruleNamePack );<br>
> }<br>
> }<br>
> }<br>
><br>
> public void print( KnowledgePackage kPackage ){<br>
> class2rules = new HashMap<String,Set<String>>();<br>
> inspect( kPackage );<br>
> emit();<br>
> }<br>
><br>
> public void print( KnowledgeBase kBase ){<br>
> class2rules = new HashMap<String,Set<String>>();<br>
> for( KnowledgePackage kPackage: kBase.getKnowledgePackages() ){<br>
> inspect( kPackage );<br>
> }<br>
> emit();<br>
> }<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>
<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>