package org.drools.semantics.builder.reasoner; import org.drools.lang.api.CEDescrBuilder; import org.drools.lang.api.PatternDescrBuilder; import org.drools.lang.descr.AnnotatedBaseDescr; import java.util.HashMap; import java.util.Map; import java.util.Stack; public class DLRecognitionBuildContext { private int counter = 0; private Stack<BuildStep> vars = new Stack<BuildStep>(); private String source; public DLRecognitionBuildContext() { push(); } public void push() { vars.push( new BuildStep( "$x_" + counter++ ) ); } public void pop() { vars.pop(); } public String getScopedIdentifier() { return vars.peek().getVar(); } public BuildStep getScopedContext() { return vars.peek(); } public boolean isPropertyBound( String propKey ) { return vars.peek().isPropertyBound( propKey ); } public String bindProperty( String prop ) { return vars.peek().bindProperty( prop ); } public String getPropertyKey( String prop ) { return vars.peek().getPropertyKey( prop ); } public void clearBindings() { vars.peek().clearBindings(); } public String peekParent() { BuildStep temp = vars.pop(); BuildStep parent = vars.size() > 0 ? vars.peek() : null; vars.push( temp ); return parent != null ? parent.getVar() : null; } public void setSource( String source ) { this.source = source; } public String getSource() { return source; } public void resetSource() { source = null; } public static class BuildStep { private String var; private Map<String,PatternDescrBuilder<? extends CEDescrBuilder<? extends CEDescrBuilder, ? extends AnnotatedBaseDescr>>> patterns; private Map<String,String> propertyVars = new HashMap<String,String>(); private BuildStep( String var ) { this.var = var; } public String getVar() { return var; } public void addPattern( String type, PatternDescrBuilder<? extends CEDescrBuilder<? extends CEDescrBuilder, ? extends AnnotatedBaseDescr>> builder ) { patterns.put( type, builder ); } public PatternDescrBuilder<? extends CEDescrBuilder<? extends CEDescrBuilder, ? extends AnnotatedBaseDescr>> getBuilder( String type ) { return patterns.get( type ); } public boolean hasBuilder( String key ) { return patterns.containsKey( key ); } public String bindProperty( String property ) { String propKey = getPropertyKey( property ); if ( ! propertyVars.containsKey( propKey) ) { propertyVars.put( propKey, property ); } return propKey; } public boolean isPropertyBound( String propKey ) { return propertyVars.containsKey( propKey ); } public String getPropertyKey( String prop ) { return var + "_" + prop; } public void clearBindings() { propertyVars.clear(); } } }