package org.drools.compiler.compiler;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import org.drools.compiler.lang.descr.AccessorDescr;
import org.drools.compiler.lang.descr.AccumulateDescr;
import org.drools.compiler.lang.descr.AccumulateImportDescr;
import org.drools.compiler.lang.descr.ActionDescr;
import org.drools.compiler.lang.descr.AndDescr;
import org.drools.compiler.lang.descr.AnnotatedBaseDescr;
import org.drools.compiler.lang.descr.AnnotationDescr;
import org.drools.compiler.lang.descr.AtomicExprDescr;
import org.drools.compiler.lang.descr.AttributeDescr;
import org.drools.compiler.lang.descr.BaseDescr;
import org.drools.compiler.lang.descr.BehaviorDescr;
import org.drools.compiler.lang.descr.BindingDescr;
import org.drools.compiler.lang.descr.CollectDescr;
import org.drools.compiler.lang.descr.ConstraintConnectiveDescr;
import org.drools.compiler.lang.descr.DeclarativeInvokerDescr;
import org.drools.compiler.lang.descr.EntryPointDeclarationDescr;
import org.drools.compiler.lang.descr.EnumDeclarationDescr;
import org.drools.compiler.lang.descr.EvalDescr;
import org.drools.compiler.lang.descr.ExistsDescr;
import org.drools.compiler.lang.descr.ExprConstraintDescr;
import org.drools.compiler.lang.descr.FactTemplateDescr;
import org.drools.compiler.lang.descr.FieldConstraintDescr;
import org.drools.compiler.lang.descr.FieldTemplateDescr;
import org.drools.compiler.lang.descr.ForallDescr;
import org.drools.compiler.lang.descr.FromDescr;
import org.drools.compiler.lang.descr.FunctionDescr;
import org.drools.compiler.lang.descr.FunctionImportDescr;
import org.drools.compiler.lang.descr.GlobalDescr;
import org.drools.compiler.lang.descr.ImportDescr;
import org.drools.compiler.lang.descr.LiteralRestrictionDescr;
import org.drools.compiler.lang.descr.MVELExprDescr;
import org.drools.compiler.lang.descr.NamedConsequenceDescr;
import org.drools.compiler.lang.descr.NotDescr;
import org.drools.compiler.lang.descr.OrDescr;
import org.drools.compiler.lang.descr.PackageDescr;
import org.drools.compiler.lang.descr.PatternDescr;
import org.drools.compiler.lang.descr.PredicateDescr;
import org.drools.compiler.lang.descr.QueryDescr;
import org.drools.compiler.lang.descr.RelationalExprDescr;
import org.drools.compiler.lang.descr.RuleDescr;
import org.drools.compiler.lang.descr.TypeDeclarationDescr;
import org.drools.compiler.lang.descr.TypeFieldDescr;
import org.drools.compiler.lang.descr.WindowDeclarationDescr;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PackageDescrResourceVisitor {
private static final Logger logger = LoggerFactory.getLogger(PackageDescrResourceVisitor.class);
private static void checkResource( BaseDescr descr ) {
if( descr != null ) {
assertNotNull(descr.getClass().getSimpleName() + ".resource is null!", descr.getResource());
}
}
private void visit( final Object descr ) {
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
String lastMethodName = null;
for( int i = 0; i < 5; ++i ) {
String thisMethodName = stack[i].getMethodName() + ":" + stack[i].getLineNumber();
if( thisMethodName.equals(lastMethodName) ) {
fail("Infinite loop detected!");
}
lastMethodName = thisMethodName;
}
if( descr instanceof AccessorDescr ) {
visit((AccessorDescr) descr);
} else if( descr instanceof AccumulateDescr ) {
visit((AccumulateDescr) descr);
} else if( descr instanceof ActionDescr ) {
visit((ActionDescr) descr);
} else if( descr instanceof AndDescr ) {
visit((AndDescr) descr);
} else if( descr instanceof AnnotationDescr ) {
visit((AnnotationDescr) descr);
} else if( descr instanceof AtomicExprDescr ) {
visit((AtomicExprDescr) descr);
} else if( descr instanceof AttributeDescr ) {
visit((AttributeDescr) descr);
} else if( descr instanceof BindingDescr ) {
visit((BindingDescr) descr);
} else if( descr instanceof CollectDescr ) {
visit((CollectDescr) descr);
} else if( descr instanceof ConstraintConnectiveDescr ) {
visit((ConstraintConnectiveDescr) descr);
} else if( descr instanceof ExistsDescr ) {
visit((ExistsDescr) descr);
} else if( descr instanceof ExprConstraintDescr ) {
visit((ExprConstraintDescr) descr);
} else if( descr instanceof FactTemplateDescr ) {
visit((FactTemplateDescr) descr);
} else if( descr instanceof FieldConstraintDescr ) {
visit((FieldConstraintDescr) descr);
} else if( descr instanceof FieldTemplateDescr ) {
visit((FieldTemplateDescr) descr);
} else if( descr instanceof ForallDescr ) {
visit((ForallDescr) descr);
} else if( descr instanceof FromDescr ) {
visit((FromDescr) descr);
} else if( descr instanceof FunctionDescr ) {
visit((FunctionDescr) descr);
} else if( descr instanceof FunctionImportDescr ) {
visit((FunctionImportDescr) descr);
} else if( descr instanceof GlobalDescr ) {
visit((GlobalDescr) descr);
} else if( descr instanceof ImportDescr ) {
visit((ImportDescr) descr);
} else if( descr instanceof LiteralRestrictionDescr ) {
visit((LiteralRestrictionDescr) descr);
} else if( descr instanceof MVELExprDescr ) {
visit((MVELExprDescr) descr);
} else if( descr instanceof NotDescr ) {
visit((NotDescr) descr);
} else if( descr instanceof OrDescr ) {
visit((OrDescr) descr);
} else if( descr instanceof PackageDescr ) {
visit((PackageDescr) descr);
} else if( descr instanceof PatternDescr ) {
visit((PatternDescr) descr);
} else if( descr instanceof PredicateDescr ) {
visit((PredicateDescr) descr);
} else if( descr instanceof QueryDescr ) {
visit((QueryDescr) descr);
} else if( descr instanceof RelationalExprDescr ) {
visit((RelationalExprDescr) descr);
} else if( descr instanceof RuleDescr ) {
visit((RuleDescr) descr);
} else if( descr instanceof TypeDeclarationDescr ) {
visit((TypeDeclarationDescr) descr);
} else if( descr instanceof TypeFieldDescr ) {
visit((TypeFieldDescr) descr);
} else if( descr instanceof WindowDeclarationDescr ) {
visit((WindowDeclarationDescr) descr);
} else if( descr instanceof NamedConsequenceDescr ) {
visit((NamedConsequenceDescr) descr);
} else if( descr instanceof EvalDescr ) {
visit((EvalDescr) descr);
} else if( descr instanceof BehaviorDescr ) {
visit((BehaviorDescr) descr);
} else {
throw new RuntimeException("xx DID NOT VISIT: " + descr.getClass().getName());
}
}
protected void visit( final AccessorDescr descr ) {
checkResource(descr);
for( DeclarativeInvokerDescr d : descr.getInvokersAsArray() ) {
visit(d);
}
}
protected void visit( final AccumulateDescr descr ) {
checkResource(descr);
visit(descr.getInputPattern());
for( BaseDescr d : descr.getDescrs() ) {
visit(d);
}
}
protected void visit( final ActionDescr descr ) {
checkResource(descr);
}
protected void visit( final AndDescr descr ) {
checkResource(descr);
for( BaseDescr baseDescr : descr.getDescrs() ) {
visit(baseDescr);
}
}
protected void visit( final AnnotatedBaseDescr descr ) {
checkResource(descr);
for( BaseDescr annoDescr : descr.getAnnotations() ) {
visit(annoDescr);
}
}
protected void visit( final AtomicExprDescr descr ) {
checkResource(descr);
}
protected void visit( final AttributeDescr descr ) {
}
protected void visit( final BindingDescr descr ) {
checkResource(descr);
}
protected void visit( final CollectDescr descr ) {
checkResource(descr);
visit(descr.getInputPattern());
for( BaseDescr d : descr.getDescrs() ) {
visit(d);
}
}
protected void visit( final ConstraintConnectiveDescr descr ) {
checkResource(descr);
for( BaseDescr d : descr.getDescrs() ) {
visit(d);
}
}
protected void visit( final ExistsDescr descr ) {
checkResource(descr);
for( Object o : descr.getDescrs() ) {
visit(o);
}
}
protected void visit( final ExprConstraintDescr descr ) {
checkResource(descr);
}
protected void visit( final FactTemplateDescr descr ) {
checkResource(descr);
for( FieldTemplateDescr d : descr.getFields() ) {
visit(d);
}
}
protected void visit( final FieldConstraintDescr descr ) {
checkResource(descr);
for( Object o : descr.getRestrictions() ) {
visit(o);
}
}
protected void visit( final FieldTemplateDescr descr ) {
checkResource(descr);
}
protected void visit( final ForallDescr descr ) {
checkResource(descr);
visit(descr.getBasePattern());
for( BaseDescr o : descr.getDescrs() ) {
visit(o);
}
}
protected void visit( final FromDescr descr ) {
checkResource(descr);
for( BaseDescr d : descr.getDescrs() ) {
visit(d);
}
}
protected void visit( final FunctionDescr descr ) {
checkResource(descr);
}
protected void visit( final FunctionImportDescr descr ) {
checkResource(descr);
}
protected void visit( final GlobalDescr descr ) {
checkResource(descr);
}
protected void visit( final ImportDescr descr ) {
checkResource(descr);
}
protected void visit( final LiteralRestrictionDescr descr ) {
checkResource(descr);
}
protected void visit( final MVELExprDescr descr ) {
checkResource(descr);
}
protected void visit( final NotDescr descr ) {
checkResource(descr);
// NotDescr isn't type-safe
for( Object o : descr.getDescrs() ) {
visit(o);
}
}
protected void visit( final OrDescr descr ) {
checkResource(descr);
for( BaseDescr d : descr.getDescrs() ) {
visit(d);
}
}
protected void visit( final PackageDescr descr ) {
if( descr == null ) { return; }
checkResource(descr);
for( ImportDescr importDescr : descr.getImports() ) {
visit(importDescr);
}
for( FunctionImportDescr funcImportDescr : descr.getFunctionImports() ) {
visit(funcImportDescr);
}
for( AccumulateImportDescr accImportDescr : descr.getAccumulateImports() ) {
visit(accImportDescr);
}
for( AttributeDescr attrDescr : descr.getAttributes() ) {
visit(attrDescr);
}
for( GlobalDescr globDesc : descr.getGlobals() ) {
visit(globDesc);
}
for( FunctionDescr funcDescr : descr.getFunctions() ) {
visit(funcDescr);
}
for( RuleDescr ruleDescr : descr.getRules() ) {
visit(ruleDescr);
}
for( TypeDeclarationDescr typeDescr : descr.getTypeDeclarations() ) {
visit(typeDescr);
}
for( EntryPointDeclarationDescr entryDescr : descr.getEntryPointDeclarations() ) {
visit(entryDescr);
}
for( WindowDeclarationDescr windowDescr : descr.getWindowDeclarations() ) {
visit(windowDescr);
}
for( EnumDeclarationDescr enumDescr : descr.getEnumDeclarations() ) {
visit(enumDescr);
}
}
protected void visit( final PatternDescr descr ) {
checkResource(descr);
visit(descr.getConstraint());
for( BaseDescr behaDescr : descr.getBehaviors() ) {
visit(behaDescr);
}
}
protected void visit( final PredicateDescr descr ) {
checkResource(descr);
}
protected void visit( final QueryDescr descr ) {
checkResource(descr);
visit(descr.getLhs());
for( AttributeDescr attrDescr : descr.getAttributes().values() ) {
visit(attrDescr);
}
}
protected void visit( final RelationalExprDescr descr ) {
checkResource(descr);
visit(descr.getLeft());
visit(descr.getRight());
}
protected void visit( final RuleDescr descr ) {
checkResource(descr);
for( AttributeDescr d : descr.getAttributes().values() ) {
visit(d);
}
visit(descr.getLhs());
visitConsequence(descr.getConsequence());
for( Object o : descr.getNamedConsequences().values() ) {
visitConsequence(o);
}
}
protected void visitConsequence( final Object consequence ) {
if( consequence instanceof BaseDescr ) {
visit(consequence);
}
}
protected void visit( final TypeDeclarationDescr descr ) {
checkResource(descr);
for( TypeFieldDescr fieldDescr : descr.getFields().values() ) {
visit(fieldDescr);
}
}
protected void visit( final TypeFieldDescr descr ) {
if( descr == null ) {
return;
}
checkResource(descr);
visit(descr.getOverriding());
}
protected void visit( final WindowDeclarationDescr descr ) {
checkResource(descr);
visit(descr.getPattern());
}
protected void visit( final NamedConsequenceDescr descr ) {
checkResource(descr);
}
protected void visit( final EvalDescr descr ) {
checkResource(descr);
}
protected void visit( final BehaviorDescr descr ) {
checkResource(descr);
}
}