/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.compiler.compiler;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.drools.compiler.rule.builder.PackageBuildContext;
import org.drools.compiler.rule.builder.RuleBuildContext;
import org.drools.core.base.EvaluatorWrapper;
import org.drools.core.rule.Declaration;
import org.drools.core.rule.Pattern;
import org.drools.core.rule.XpathBackReference;
public class BoundIdentifiers {
private Map<String, Class< ? >> declrClasses;
private Map<String, Class< ? >> globals;
private Map<String, EvaluatorWrapper> operators;
private Class< ? > thisClass;
private PackageBuildContext context;
public BoundIdentifiers(Class< ? > thisClass) {
this( Collections.EMPTY_MAP, null, Collections.EMPTY_MAP, thisClass );
}
public BoundIdentifiers(Map<String, Class< ? >> declarations,
PackageBuildContext context) {
this( declarations, context, Collections.EMPTY_MAP, null );
}
public BoundIdentifiers(Map<String, Class< ? >> declarations,
PackageBuildContext context,
Map<String, EvaluatorWrapper> operators) {
this( declarations, context, operators, null );
}
public BoundIdentifiers(Pattern pattern,
PackageBuildContext context,
Map<String, EvaluatorWrapper> operators,
Class< ? > thisClass) {
this(getDeclarationsMap( pattern, context ), context, operators, thisClass);
}
public BoundIdentifiers(Map<String, Class< ? >> declarations,
PackageBuildContext context,
Map<String, EvaluatorWrapper> operators,
Class< ? > thisClass) {
this.declrClasses = declarations;
this.context = context;
this.globals = context != null ? context.getKnowledgeBuilder().getGlobals() : Collections.EMPTY_MAP;
this.operators = operators;
this.thisClass = thisClass;
}
public PackageBuildContext getContext() {
return context;
}
public Map<String, Class< ? >> getDeclrClasses() {
return declrClasses;
}
public Map<String, Class< ? >> getGlobals() {
return globals;
}
public void setGlobals( Map<String, Class<?>> globals ) {
this.globals = globals;
}
public Map<String, EvaluatorWrapper> getOperators() {
return operators != null ? operators : Collections.EMPTY_MAP;
}
public Class< ? > getThisClass() {
return thisClass;
}
public Class< ? > resolveType(String identifier) {
Class< ? > cls = declrClasses.get( identifier );
if ( cls == null ) {
cls = resolveVarType(identifier);
}
if ( cls == null && operators.containsKey( identifier )) {
cls = context.getConfiguration().getComponentFactory().getExpressionProcessor().getEvaluatorWrapperClass();
}
return cls;
}
public Class< ? > resolveVarType(String identifier) {
return context == null ? null : context.resolveVarType(identifier);
}
public String toString() {
return ( "thisClass: " + thisClass + "\n" ) + "declarations:" + declrClasses + "\n" + "globals:" + globals + "\n" + "operators:" + operators + "\n";
}
private static Map<String, Class< ? >> getDeclarationsMap( Pattern pattern, PackageBuildContext context ) {
Map<String, Class< ? >> declarations = new HashMap<>();
if (context instanceof RuleBuildContext) {
RuleBuildContext ruleContext = ( (RuleBuildContext) context );
for ( Map.Entry<String, Declaration> entry : ruleContext.getDeclarationResolver().getDeclarations( ruleContext.getRule() ).entrySet() ) {
if ( entry.getValue().getExtractor() != null ) {
declarations.put( entry.getKey(),
entry.getValue().getDeclarationClass() );
}
}
if ( pattern != null ) {
List<Class<?>> xpathBackReferenceClasses = pattern.getXpathBackReferenceClasses();
for ( int i = 0; i < xpathBackReferenceClasses.size(); i++ ) {
declarations.put( XpathBackReference.BACK_REFERENCE_HEAD + i, xpathBackReferenceClasses.get( i ) );
}
}
}
return declarations;
}
}