summaryrefslogtreecommitdiffstats
path: root/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators
diff options
context:
space:
mode:
Diffstat (limited to 'dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators')
-rw-r--r--dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/ConditionGroupTranslator.java47
-rw-r--r--dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/ConditionTranslator.java40
-rw-r--r--dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/CopyActionTranslator.java47
-rw-r--r--dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/DateFormatterTranslator.java49
-rw-r--r--dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/FieldConditionTranslator.java43
-rw-r--r--dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/IRuleElementTranslator.java50
-rw-r--r--dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/MapActionTranslator.java50
-rw-r--r--dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/MappingRulesTranslator.java69
-rw-r--r--dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/RegexActionTranslator.java44
-rw-r--r--dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/RuleTranslator.java51
10 files changed, 490 insertions, 0 deletions
diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/ConditionGroupTranslator.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/ConditionGroupTranslator.java
new file mode 100644
index 0000000..093c239
--- /dev/null
+++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/ConditionGroupTranslator.java
@@ -0,0 +1,47 @@
+package org.onap.sdc.dcae.rule.editor.translators;
+
+import org.onap.sdc.dcae.composition.restmodels.ruleeditor.*;
+import org.onap.sdc.dcae.rule.editor.enums.ConditionTypeEnum;
+import org.onap.sdc.dcae.rule.editor.enums.OperatorTypeEnum;
+import org.onap.sdc.dcae.rule.editor.utils.ValidationUtils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class ConditionGroupTranslator implements IRuleElementTranslator<ConditionGroup> {
+
+ private static ConditionGroupTranslator conditionGroupTranslator = new ConditionGroupTranslator();
+
+ public static ConditionGroupTranslator getInstance() {
+ return conditionGroupTranslator;
+ }
+
+ private ConditionGroupTranslator(){}
+
+ public Translation translateToHpJson(ConditionGroup conditionGroup) {
+ String clazz = ConditionTypeEnum.getTypeByName(conditionGroup.getType()).getFilterClass();
+ FiltersTranslation translation = new FiltersTranslation(clazz, conditionGroup.getChildren().stream()
+ .map(this::getTranslation)
+ .collect(Collectors.toList()));
+ flattenNestedFilters(translation, clazz);
+ return translation;
+ }
+
+
+ private IRuleElementTranslator getConditionTranslator(BaseCondition condition){
+ return condition instanceof ConditionGroup ? ConditionGroupTranslator.getInstance() :
+ ValidationUtils.validateNotEmpty(OperatorTypeEnum.getTypeByName(((Condition)condition).getOperator()).getModifiedType()) ? FieldConditionTranslator.getInstance() : ConditionTranslator.getInstance();
+ }
+
+ private Translation getTranslation(BaseCondition condition) {
+ return getConditionTranslator(condition).translateToHpJson(condition);
+ }
+
+ private void flattenNestedFilters(FiltersTranslation filtersTranslation, String clazz) {
+ Map<Boolean, List<Translation>> partitioned = filtersTranslation.filters.stream().collect(Collectors.partitioningBy(f -> clazz.equals(((ProcessorTranslation) f).clazz)));
+ filtersTranslation.filters.removeAll(partitioned.get(Boolean.TRUE));
+ filtersTranslation.filters.addAll(partitioned.get(Boolean.TRUE).stream().map(f -> ((FiltersTranslation) f).filters).flatMap(List::stream).collect(Collectors.toList()));
+ }
+
+}
diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/ConditionTranslator.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/ConditionTranslator.java
new file mode 100644
index 0000000..f93101b
--- /dev/null
+++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/ConditionTranslator.java
@@ -0,0 +1,40 @@
+package org.onap.sdc.dcae.rule.editor.translators;
+
+import org.onap.sdc.dcae.composition.restmodels.ruleeditor.Condition;
+import org.onap.sdc.dcae.rule.editor.enums.ConditionTypeEnum;
+import org.onap.sdc.dcae.rule.editor.enums.OperatorTypeEnum;
+
+import java.util.stream.Collectors;
+
+public class ConditionTranslator implements IRuleElementTranslator<Condition> {
+
+ private static ConditionTranslator conditionTranslator = new ConditionTranslator();
+
+ public static ConditionTranslator getInstance() {
+ return conditionTranslator;
+ }
+
+ private ConditionTranslator(){}
+
+ private class StringFilterTranslation extends ProcessorTranslation {
+ private String string;
+ private String value;
+
+ private StringFilterTranslation(Condition condition, String value){
+ this.clazz = OperatorTypeEnum.getTypeByName(condition.getOperator()).getType();
+ this.string = condition.getLeft();
+ this.value = value;
+ }
+
+ private StringFilterTranslation(Condition condition){
+ this(condition, condition.getRight().get(0));
+ }
+ }
+
+ public Translation translateToHpJson(Condition condition) {
+ return 1 == condition.getRight().size() ? new StringFilterTranslation(condition) : new FiltersTranslation(ConditionTypeEnum.ANY.getFilterClass(), condition.getRight().stream()
+ .map(r -> new StringFilterTranslation(condition, r)).collect(Collectors.toList()));
+ }
+
+
+}
diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/CopyActionTranslator.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/CopyActionTranslator.java
new file mode 100644
index 0000000..9d02c8e
--- /dev/null
+++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/CopyActionTranslator.java
@@ -0,0 +1,47 @@
+package org.onap.sdc.dcae.rule.editor.translators;
+
+import org.onap.sdc.common.onaplog.Enums.LogLevel;
+import org.onap.sdc.dcae.composition.restmodels.ruleeditor.BaseAction;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.onap.sdc.dcae.composition.restmodels.ruleeditor.BaseAction;
+
+public class CopyActionTranslator<A extends BaseAction> implements IRuleElementTranslator<A>{
+
+ private static CopyActionTranslator copyActionTranslator = new CopyActionTranslator();
+
+ public static CopyActionTranslator getInstance() {
+ return copyActionTranslator;
+ }
+
+ CopyActionTranslator(){}
+
+ public Translation translateToHpJson(A action) {
+ return new CopyActionSetTranslation(action.getTarget(), action.getFromValue());
+ }
+
+ void addToHpJsonProcessors(A action, List<Translation> processors) {
+ processors.add(translateToHpJson(action));
+ }
+
+ public boolean addToHpJsonProcessors(A action, List<Translation> processors, boolean asNewProcessor) {
+ debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Translating {} action. New Processor: {}", action.getActionType(), asNewProcessor);
+ if(asNewProcessor)
+ addToHpJsonProcessors(action, processors);
+ else
+ ((CopyActionSetTranslation) processors.get(processors.size()-1)).updates.put(action.getTarget(), action.getFromValue());
+ return false;
+ }
+
+ class CopyActionSetTranslation extends ProcessorTranslation {
+ Map<String, String> updates = new LinkedHashMap<>();
+ CopyActionSetTranslation(String target, String from) {
+ clazz = "Set";
+ updates.put(target, from);
+ }
+ }
+
+}
diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/DateFormatterTranslator.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/DateFormatterTranslator.java
new file mode 100644
index 0000000..89f0def
--- /dev/null
+++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/DateFormatterTranslator.java
@@ -0,0 +1,49 @@
+package org.onap.sdc.dcae.rule.editor.translators;
+
+import org.onap.sdc.common.onaplog.Enums.LogLevel;
+import java.util.List;
+
+import org.onap.sdc.dcae.composition.restmodels.ruleeditor.DateFormatterAction;
+
+public class DateFormatterTranslator extends CopyActionTranslator<DateFormatterAction> {
+
+ private static DateFormatterTranslator dateFormatterTranslator = new DateFormatterTranslator();
+
+ public static DateFormatterTranslator getInstance() {
+ return dateFormatterTranslator;
+ }
+
+ private DateFormatterTranslator(){}
+
+ private class DateFormatterTranslation extends ProcessorTranslation {
+ private String fromFormat;
+ private String fromTz;
+ private String toField;
+ private String toFormat;
+ private String toTz;
+ private String value;
+
+ private DateFormatterTranslation(DateFormatterAction action){
+ clazz = "DateFormatter";
+ fromFormat = action.getFromFormat();
+ fromTz = action.getFromTz();
+ toField = action.getTarget();
+ toFormat = action.getToFormat();
+ toTz = action.getToTz();
+ value = action.getFromValue();
+ }
+ }
+
+ @Override
+ public boolean addToHpJsonProcessors(DateFormatterAction action, List<Translation> processors, boolean asNewProcessor) {
+ debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Translating date formatter action");
+ addToHpJsonProcessors(action, processors);
+ return true;
+ }
+
+ @Override
+ public Translation translateToHpJson(DateFormatterAction action){
+ return new DateFormatterTranslation(action);
+ }
+
+}
diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/FieldConditionTranslator.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/FieldConditionTranslator.java
new file mode 100644
index 0000000..ef2949e
--- /dev/null
+++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/FieldConditionTranslator.java
@@ -0,0 +1,43 @@
+package org.onap.sdc.dcae.rule.editor.translators;
+
+import org.onap.sdc.dcae.composition.restmodels.ruleeditor.Condition;
+import org.onap.sdc.dcae.rule.editor.enums.OperatorTypeEnum;
+
+import java.util.List;
+
+public class FieldConditionTranslator implements IRuleElementTranslator<Condition> {
+
+ private static FieldConditionTranslator fieldConditionTranslator = new FieldConditionTranslator();
+
+ public static FieldConditionTranslator getInstance() {
+ return fieldConditionTranslator;
+ }
+
+ private FieldConditionTranslator(){}
+
+ private class FieldFilterTranslation extends ProcessorTranslation {
+ private String field;
+ private String value;
+
+ private FieldFilterTranslation(Condition condition) {
+ clazz = OperatorTypeEnum.getTypeByName(condition.getOperator()).getType();
+ field = condition.getLeft();
+ value = condition.getRight().get(0);
+ }
+ }
+
+ private class MultiFieldFilterTranslation extends ProcessorTranslation {
+ private String field;
+ private List<String> values;
+
+ private MultiFieldFilterTranslation(Condition condition) {
+ field = condition.getLeft();
+ values = condition.getRight();
+ clazz = OperatorTypeEnum.getTypeByName(condition.getOperator()).getModifiedType();
+ }
+ }
+
+ public Translation translateToHpJson(Condition condition) {
+ return 1 == condition.getRight().size() ? new FieldFilterTranslation(condition) : new MultiFieldFilterTranslation(condition);
+ }
+}
diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/IRuleElementTranslator.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/IRuleElementTranslator.java
new file mode 100644
index 0000000..dac818d
--- /dev/null
+++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/IRuleElementTranslator.java
@@ -0,0 +1,50 @@
+package org.onap.sdc.dcae.rule.editor.translators;
+
+import com.google.gson.annotations.SerializedName;
+import org.onap.sdc.common.onaplog.OnapLoggerDebug;
+import org.onap.sdc.common.onaplog.OnapLoggerError;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public interface IRuleElementTranslator<T> {
+
+ OnapLoggerError errLogger = OnapLoggerError.getInstance();
+ OnapLoggerDebug debugLogger = OnapLoggerDebug.getInstance();
+
+ Translation translateToHpJson(T element);
+
+ abstract class Translation {
+ }
+
+ class ProcessorTranslation extends Translation {
+ @SerializedName("class")
+ protected String clazz;
+ }
+
+
+ class FiltersTranslation extends ProcessorTranslation {
+ protected List<Translation> filters;
+
+ protected FiltersTranslation(String clazz, List<Translation> filters) {
+ this.clazz = clazz;
+ this.filters = filters;
+ }
+ }
+
+ class RuleTranslation extends Translation {
+ protected String phase;
+ protected Translation filter;
+ protected List<Translation> processors = new ArrayList<>();
+ }
+
+ class RunPhaseProcessorsTranslation extends ProcessorTranslation {
+ protected String phase;
+
+ protected RunPhaseProcessorsTranslation(String runPhase){
+ clazz ="RunPhase";
+ phase = runPhase;
+ }
+ }
+
+}
diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/MapActionTranslator.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/MapActionTranslator.java
new file mode 100644
index 0000000..922312e
--- /dev/null
+++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/MapActionTranslator.java
@@ -0,0 +1,50 @@
+package org.onap.sdc.dcae.rule.editor.translators;
+
+import com.google.gson.annotations.SerializedName;
+
+import org.onap.sdc.common.onaplog.Enums.LogLevel;
+
+import java.util.List;
+import java.util.Map;
+
+import org.onap.sdc.dcae.composition.restmodels.ruleeditor.MapAction;
+
+public class MapActionTranslator extends CopyActionTranslator<MapAction> {
+
+ private static MapActionTranslator mapActionTranslator = new MapActionTranslator();
+
+ public static MapActionTranslator getInstance() {
+ return mapActionTranslator;
+ }
+
+ private MapActionTranslator(){}
+
+ private class MapActionTranslation extends ProcessorTranslation {
+
+ private Map<String, String> map;
+ private String field;
+ private String toField;
+ @SerializedName("default")
+ private String Default;
+
+ private MapActionTranslation(MapAction action) {
+ clazz = "MapAlarmValues";
+ Default = action.getMapDefaultValue();
+ field = action.getFromValue();
+ toField = action.getTarget();
+ map = action.transformToMap();
+ }
+ }
+
+ @Override
+ public Translation translateToHpJson(MapAction action) {
+ return new MapActionTranslation(action);
+ }
+
+ @Override
+ public boolean addToHpJsonProcessors(MapAction action, List<Translation> processors, boolean asNewProcessor) {
+ debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Translating map action");
+ addToHpJsonProcessors(action, processors);
+ return true;
+ }
+}
diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/MappingRulesTranslator.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/MappingRulesTranslator.java
new file mode 100644
index 0000000..0164446
--- /dev/null
+++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/MappingRulesTranslator.java
@@ -0,0 +1,69 @@
+package org.onap.sdc.dcae.rule.editor.translators;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.onap.sdc.dcae.composition.restmodels.ruleeditor.MappingRules;
+
+public class MappingRulesTranslator implements IRuleElementTranslator<MappingRules> {
+
+ private static MappingRulesTranslator mappingRulesTranslator = new MappingRulesTranslator();
+
+ public static MappingRulesTranslator getInstance() {
+ return mappingRulesTranslator;
+ }
+
+ private MappingRulesTranslator() {
+ }
+
+ private RuleTranslator ruleTranslator = RuleTranslator.getInstance();
+
+ public Translation translateToHpJson(MappingRules mappingRules) {
+ return new MappingRulesTranslation(mappingRules);
+ }
+
+ public Translation translateToHpJson(MappingRules mappingRules, String entryPointPhaseName, String lastPhaseName, String runPhase) {
+ // 1806 US349308 assign Vfcmt name as rule phaseName
+ mappingRules.getRules().forEach((k,v) -> v.setPhase(runPhase));
+ return new MappingRulesTranslation(mappingRules, entryPointPhaseName, lastPhaseName, runPhase);
+ }
+
+ private class MappingRulesTranslation extends Translation {
+
+ private List<Translation> processing;
+
+ private MappingRulesTranslation(MappingRules mappingRules) {
+ processing = mappingRules.getRules().values().stream().map(ruleTranslator::translateToHpJson).collect(Collectors.toList());
+ }
+
+ private MappingRulesTranslation(MappingRules mappingRules, String entryPointPhaseName, String lastPhaseName, String runPhase) {
+ this(mappingRules);
+ //hardcoded entry point processor
+ processing.add(0, new RunPhaseRuleTranslation(entryPointPhaseName, runPhase));
+ //hardcoded map_publish processor
+ processing.add(new RunPhaseRuleTranslation(runPhase, lastPhaseName));
+ }
+ }
+
+ private class RunPhaseRuleTranslation extends RuleTranslation {
+
+ private RunPhaseRuleTranslation(String phaseName, String runPhase) {
+ phase = phaseName;
+ if ("snmp_map".equals(phaseName))
+ processors.add(new SnmpConvertor());
+ processors.add(new RunPhaseProcessorsTranslation(runPhase));
+ }
+ }
+
+ // hardcoded SNMP processor
+ private class SnmpConvertor extends ProcessorTranslation {
+ private String array = "varbinds";
+ private String datacolumn = "varbind_value";
+ private String keycolumn = "varbind_oid";
+
+ private SnmpConvertor() {
+ clazz = "SnmpConvertor";
+ }
+ }
+
+}
diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/RegexActionTranslator.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/RegexActionTranslator.java
new file mode 100644
index 0000000..c49a04e
--- /dev/null
+++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/RegexActionTranslator.java
@@ -0,0 +1,44 @@
+package org.onap.sdc.dcae.rule.editor.translators;
+
+import org.onap.sdc.common.onaplog.Enums.LogLevel;
+import java.util.List;
+
+import org.onap.sdc.dcae.composition.restmodels.ruleeditor.BaseAction;
+
+public class RegexActionTranslator extends CopyActionTranslator<BaseAction> {
+
+ private static RegexActionTranslator regexActionTranslator = new RegexActionTranslator();
+
+ public static RegexActionTranslator getInstance() {
+ return regexActionTranslator;
+ }
+
+ private RegexActionTranslator(){}
+
+ private class RegexCopyActionTranslation extends ProcessorTranslation {
+
+ private String regex;
+ private String field;
+ private String value;
+
+ private RegexCopyActionTranslation(BaseAction action) {
+ clazz = "ExtractText";
+ regex = action.getRegexValue();
+ field = action.getTarget();
+ value = action.getFromValue();
+ }
+ }
+
+ @Override
+ public boolean addToHpJsonProcessors(BaseAction action, List<Translation> processors, boolean asNewProcessor) {
+ debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Translating copy action as regex action");
+ addToHpJsonProcessors(action, processors);
+ return true;
+ }
+
+ @Override
+ public Translation translateToHpJson(BaseAction action) {
+ return new RegexCopyActionTranslation(action);
+ }
+
+}
diff --git a/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/RuleTranslator.java b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/RuleTranslator.java
new file mode 100644
index 0000000..f7dea47
--- /dev/null
+++ b/dcaedt_be/src/main/java/org/onap/sdc/dcae/rule/editor/translators/RuleTranslator.java
@@ -0,0 +1,51 @@
+package org.onap.sdc.dcae.rule.editor.translators;
+
+import com.google.gson.Gson;
+import org.onap.sdc.common.onaplog.Enums.LogLevel;
+import org.onap.sdc.dcae.composition.restmodels.ruleeditor.*;
+import org.onap.sdc.dcae.rule.editor.enums.OperatorTypeEnum;
+import org.onap.sdc.dcae.rule.editor.enums.RuleEditorElementType;
+import org.onap.sdc.dcae.rule.editor.utils.ValidationUtils;
+
+public class RuleTranslator implements IRuleElementTranslator<Rule> {
+
+ private static RuleTranslator ruleTranslator = new RuleTranslator();
+
+ public static RuleTranslator getInstance() {
+ return ruleTranslator;
+ }
+
+ private RuleTranslator() {
+ }
+
+ private class ActionRuleTranslation extends RuleTranslation {
+ private ActionRuleTranslation(Rule rule) {
+ phase = rule.getPhase();
+ filter = rule.isConditionalRule() ? getConditionTranslator(rule.getCondition()).translateToHpJson(rule.getCondition()) : null;
+ boolean asNewProcessor = true;
+ for (BaseAction action : rule.getActions()) {
+ // consecutive copy actions are aggregated into a single processor
+ asNewProcessor = getActionTranslator(action).addToHpJsonProcessors(action, processors, asNewProcessor);
+ }
+ }
+ }
+
+ public Translation translateToHpJson(Rule rule) {
+ debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Start translating rule {}", rule.getUid());
+ Translation translation = new ActionRuleTranslation(rule);
+ debugLogger.log(LogLevel.DEBUG, this.getClass().getName(), "Finished translation for rule {}. Result: {}", rule.getUid(), new Gson().toJson(translation));
+ return translation;
+ }
+
+ private IRuleElementTranslator getConditionTranslator(BaseCondition condition){
+ return condition instanceof ConditionGroup ? ConditionGroupTranslator.getInstance() :
+ ValidationUtils.validateNotEmpty(OperatorTypeEnum.getTypeByName(((Condition)condition).getOperator()).getModifiedType()) ? FieldConditionTranslator.getInstance() : ConditionTranslator.getInstance();
+ }
+
+ private CopyActionTranslator getActionTranslator(BaseAction action) {
+ ActionTypeEnum type = ActionTypeEnum.getTypeByName(action.getActionType());
+ if(ActionTypeEnum.COPY == type && ValidationUtils.validateNotEmpty(action.getRegexValue()))
+ return RegexActionTranslator.getInstance();
+ return (CopyActionTranslator)RuleEditorElementType.getElementTypeByName(type.getType()).getTranslator();
+ }
+} \ No newline at end of file