/*
* Copyright (c) 2010-2013 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* 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 com.evolveum.midpoint.model.common.expression.script;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import com.evolveum.midpoint.model.common.expression.ExpressionSyntaxException;
import com.evolveum.midpoint.model.common.expression.functions.FunctionLibrary;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.crypto.Protector;
import com.evolveum.midpoint.schema.util.ObjectResolver;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ScriptExpressionEvaluatorType;
/**
*
* @author Radovan Semancik
*
*/
public class ScriptExpressionFactory {
public static String DEFAULT_LANGUAGE = "http://midpoint.evolveum.com/xml/ns/public/expression/language#Groovy";
private Map<String,ScriptEvaluator> evaluatorMap = new HashMap<String, ScriptEvaluator>();
private ObjectResolver objectResolver;
private PrismContext prismContext;
private Collection<FunctionLibrary> functions;
private Protector protector;
public ScriptExpressionFactory(ObjectResolver objectResolver, PrismContext prismContext,
Protector protector) {
this.prismContext = prismContext;
this.objectResolver = objectResolver;
this.protector = protector;
}
public ObjectResolver getObjectResolver() {
return objectResolver;
}
public void setObjectResolver(ObjectResolver objectResolver) {
this.objectResolver = objectResolver;
}
public void setEvaluators(Collection<ScriptEvaluator> evaluators) {
for (ScriptEvaluator evaluator: evaluators) {
registerEvaluator(evaluator.getLanguageUrl(), evaluator);
}
}
public Collection<FunctionLibrary> getFunctions() {
return functions;
}
public void setFunctions(Collection<FunctionLibrary> functions) {
this.functions = functions;
}
public Map<String, ScriptEvaluator> getEvaluators() {
return evaluatorMap;
}
public ScriptExpression createScriptExpression(ScriptExpressionEvaluatorType expressionType, ItemDefinition outputDefinition, String shortDesc) throws ExpressionSyntaxException {
ScriptExpression expression = new ScriptExpression(getEvaluator(getLanguage(expressionType), shortDesc), expressionType);
expression.setOutputDefinition(outputDefinition);
expression.setObjectResolver(objectResolver);
expression.setFunctions(functions);
return expression;
}
public void registerEvaluator(String language, ScriptEvaluator evaluator) {
if (evaluatorMap.containsKey(language)) {
throw new IllegalArgumentException("Evaluator for language "+language+" already registered");
}
evaluatorMap.put(language,evaluator);
}
private ScriptEvaluator getEvaluator(String language, String shortDesc) throws ExpressionSyntaxException {
ScriptEvaluator evaluator = evaluatorMap.get(language);
if (evaluator == null) {
throw new ExpressionSyntaxException("Unsupported language "+language+" used in script in "+shortDesc);
}
return evaluator;
}
private String getLanguage(ScriptExpressionEvaluatorType expressionType) {
if (expressionType.getLanguage() != null) {
return expressionType.getLanguage();
}
return DEFAULT_LANGUAGE;
}
}