
com.streamsets.pipeline.sdk.ElUtil Maven / Gradle / Ivy
/*
* Copyright (c) 2021 StreamSets Inc.
*/
package com.streamsets.pipeline.sdk;
import com.streamsets.datacollector.definition.ConcreteELDefinitionExtractor;
import com.streamsets.datacollector.el.ELEvaluator;
import com.streamsets.datacollector.el.ELVariables;
import com.streamsets.pipeline.api.ConfigDefBean;
import com.streamsets.pipeline.api.ListBeanModel;
import com.streamsets.pipeline.api.ConfigDef;
import com.streamsets.pipeline.api.el.ELEval;
import com.streamsets.pipeline.api.el.ELVars;
import com.streamsets.pipeline.lib.el.FileEL;
import com.streamsets.pipeline.lib.el.MathEL;
import com.streamsets.pipeline.lib.el.StringEL;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
public class ElUtil {
private ElUtil() {}
public static Map[]> getConfigToElDefMap(Class> stageClass) {
Map[]> configToElDefMap = new HashMap<>();
for (Field field : stageClass.getFields()) {
if (field.isAnnotationPresent(ConfigDef.class)) {
ConfigDef configDef = field.getAnnotation(ConfigDef.class);
configToElDefMap.put(field.getName(), getElDefClasses(configDef.elDefs()));
if(field.getAnnotation(ListBeanModel.class) != null) {
Type genericType = field.getGenericType();
Class> klass;
if (genericType instanceof ParameterizedType) {
Type[] typeArguments = ((ParameterizedType) genericType).getActualTypeArguments();
klass = (Class>) typeArguments[0];
} else {
klass = (Class>) genericType;
}
for (Field f : klass.getFields()) {
if (f.isAnnotationPresent(ConfigDef.class)) {
ConfigDef configDefinition = f.getAnnotation(ConfigDef.class);
configToElDefMap.put(f.getName(), getElDefClasses(configDefinition.elDefs()));
}
}
}
} else if (field.isAnnotationPresent(ConfigDefBean.class)) {
configToElDefMap.putAll(getConfigToElDefMap(field.getType()));
}
}
return configToElDefMap;
}
public static Class>[] getElDefClasses(Class[] elDefs) {
Class>[] elDefClasses = new Class>[elDefs.length + 3];
int i = 0;
for(; i < elDefs.length; i++) {
elDefClasses[i] = elDefs[i];
}
//inject few standard ELs, so that they are available everywhere
//Since injecting RuntimeEL.class requires RuntimeInfo class in the classpath, not adding it for now.
//elDefClasses[i++] = RuntimeEL.class;
elDefClasses[i++] = StringEL.class;
elDefClasses[i++] = MathEL.class;
elDefClasses[i++] = FileEL.class;
return elDefClasses;
}
public static ELEval createElEval(String configName, Class ...elDefs) {
return new ELEvaluator(configName, ConcreteELDefinitionExtractor.get(), getElDefClasses(elDefs));
}
public static ELVars createELVars() {
return new ELVariables();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy