This should contain all the code you need. Some of this is NOT from
the "stable API" although it retrieves only information that's bound
to be stable. (Another thing I keep harping about, from time to time.)
Below is a class that does some cross referencing as any serius SW
develoment would need for documentation of its DRL code, and it irks
me considerably that you have to use the "instable API" for simple
things like that.
It's working with 5.2.0, so it should do so with 5.3/4.0, but -
remember, "not stable" -- you never know. It has not been tested
extensively, e.g., for nested combinations of various flavours of
"from". It does not handle "eval" expressions and whatever goes on in
constraint expressions.
Invoke it, e.g., like this:
RulesByClasses rbc = new RulesByClasses();
rbc.print( kBase );
-W
//================================================
package cc.laun.drools;
import java.io.PrintStream;
import java.util.Formatter;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.drools.KnowledgeBase;
import org.drools.base.ClassObjectType;
import org.drools.definition.KnowledgePackage;
import org.drools.definitions.impl.KnowledgePackageImp;
import org.drools.rule.Accumulate;
import org.drools.rule.Collect;
import org.drools.rule.EntryPoint;
import org.drools.rule.EvalCondition;
import org.drools.rule.Forall;
import org.drools.rule.From;
import org.drools.rule.GroupElement;
import org.drools.rule.Pattern;
import org.drools.rule.Rule;
import org.drools.spi.ObjectType;
public class RulesByClasses {
private Formatter fmt;
private String ruleName;
private String packageName;
private Map<String,Set<String>> class2rules;
public RulesByClasses( PrintStream printStream ){
fmt = new Formatter( printStream );
}
public RulesByClasses(){
this( System.out );
}
private void register( String className ){
Set<String> ruleSet = class2rules.get( className );
if( ruleSet == null ){
ruleSet = new HashSet<String>();
class2rules.put( className, ruleSet );
}
ruleSet.add( "\"" + ruleName + "\" in " + packageName
);
}
private void inspectCollect( Collect collect ){
inspectPattern( collect.getSourcePattern() );
inspectNestedElements( collect.getNestedElements() );
}
private void inspectAccumulate( Accumulate accumulate ){
inspectNestedElements( accumulate.getNestedElements() );
}
private void inspectFrom( From from ){
inspectNestedElements( from.getNestedElements() );
}
private void inspectNestedElements( List<?> nested ){
for( Object o: nested ){
if( o instanceof Pattern ){
inspectPattern( (Pattern)o );
} else if( o instanceof GroupElement ){
inspectGroupElement( (GroupElement)o );
} else if( o instanceof Forall ){
inspectForall( (Forall)o );
} else if( o instanceof Collect ){
inspectCollect( (Collect)o );
} else if( o instanceof Accumulate ){
inspectAccumulate( (Accumulate)o );
} else if( o instanceof From ){
inspectFrom( (From)o );
} else if( o instanceof EntryPoint ){
//...
} else {
throw new IllegalStateException( "unexpected CE " + o.getClass() );
}
}
}
private void inspectPattern( Pattern pattern ){
ObjectType objectType = pattern.getObjectType();
if( objectType instanceof ClassObjectType ){
ClassObjectType classObjectType = (ClassObjectType)objectType;
register( classObjectType.getClassName() );
}
inspectNestedElements( pattern.getNestedElements() );
}
private void inspectForall( Forall forall ){
inspectNestedElements( forall.getNestedElements() );
}
private void inspectGroupElement( GroupElement groupElement ){
for( Object o: groupElement.getChildren() ){
if( o instanceof Pattern ){
inspectPattern( (Pattern)o );
} else if( o instanceof GroupElement ){
inspectGroupElement( (GroupElement)o );
} else if( o instanceof Forall ){
inspectForall( (Forall)o );
} else if( o instanceof EvalCondition ){
// ...
} else {
throw new IllegalStateException( "unexpected CE " + o.getClass() );
}
}
}
private void inspect( KnowledgePackage kPackage ){
packageName = kPackage.getName();
for( org.drools.definition.rule.Rule ruleCopy: kPackage.getRules() ){
ruleName = ruleCopy.getName();
Rule rule = (Rule)((KnowledgePackageImp)kPackage).getRule( ruleName );
inspectGroupElement( rule.getLhs() );
}
}
private void emit(){
for( Map.Entry<String,Set<String>> entry: class2rules.entrySet() ){
fmt.format( "Class %s%n", entry.getKey() );
for( String ruleNamePack: entry.getValue() ){
fmt.format( " %s%n", ruleNamePack );
}
}
}
public void print( KnowledgePackage kPackage ){
class2rules = new HashMap<String,Set<String>>();
inspect( kPackage );
emit();
}
public void print( KnowledgeBase kBase ){
class2rules = new HashMap<String,Set<String>>();
for( KnowledgePackage kPackage: kBase.getKnowledgePackages() ){
inspect( kPackage );
}
emit();
}
}
//================================================
On 09/12/2011, srinivasasanda <srinivasasanda(a)gmail.com> wrote:
Thank you Esteban,
I referred API,I'm able to retrieve rule-names present in a package.But
could not able to retrieve Declarative Model names,and Facts present in that
declarative Model in that package.Here,is my code to retrieve rule names in
a package.
//.....Added Kbuilder to
Collection<KnowledgePackage> kpackages = kbuilder2.getKnowledgePackages();
for(KnowledgePackage kpackage : kpackages) {
System.out.println(kpackage.getClass().getDeclaredClasses().toString());
for(org.drools.definition.rule.Rule rule : kpackage.getRules()) {
System.out.println(rule.getName());
}
}
Can I enhance this code to get Model names and Fact names(which are present
in that model).
Please help me..I'm struggling in this since last week
--
View this message in context:
http://drools.46999.n3.nabble.com/Fact-Names-in-a-Model-tp3572234p3572275...
Sent from the Drools: User forum mailing list archive at
Nabble.com.
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users