From d4c428390f02044df6185733b12de5a1b372f527 Mon Sep 17 00:00:00 2001 From: Piotr Rudnicki Date: Mon, 25 Nov 2024 11:07:53 +0100 Subject: [PATCH] [NU-7164] Add basic parser for fragment input definitions V2 (#7228) * Revert "Revert "[NU-7164] Add basic parser for fragment input definitions (#7167)" (#7202)" This reverts commit 383b4d578e586de18c96853093e7325e1fc7e9a9. * [NU-7164] Adjust fields parameter list * Revert "[NU-7164] Adjust fields parameter list" This reverts commit d4a7ccc8f308ef763925cf976be11715ec94ae07. * add dicts bugfix * adjust type * correct validation rules --------- Co-authored-by: Piotr Rudnicki --- .../editors/expression/Table/TableEditor.tsx | 28 +++++++++++- .../FragmentInputDefinition.tsx | 8 ++-- .../variants/fields/FixedValuesSetting.tsx | 12 ++++- .../AlignedComponentsDefinitionProvider.scala | 1 + .../definition/DefinitionsServiceSpec.scala | 1 + .../ui/definition/EdgeTypesPreparerTest.scala | 1 + .../ComponentGroupsPreparerSpec.scala | 1 + .../component/ComponentsUsageHelperTest.scala | 2 +- .../FlinkProcessCompilerDataFactory.scala | 11 +++-- ...ubbedFlinkProcessCompilerDataFactory.scala | 7 ++- .../engine/compile/ProcessCompiler.scala | 2 +- .../engine/compile/ProcessCompilerData.scala | 2 +- .../FragmentParameterValidator.scala | 25 ++++++++--- .../nodecompilation/NodeCompiler.scala | 9 ++-- .../nodecompilation/NodeDataValidator.scala | 5 ++- ...FragmentComponentDefinitionExtractor.scala | 4 +- .../FragmentParameterTypingParser.scala | 45 +++++++++++++++++++ ...ragmentParametersDefinitionExtractor.scala | 21 ++++++--- .../test/ModelDataTestInfoProvider.scala | 5 ++- .../FragmentParameterValidatorTest.scala | 8 ++-- ...ompilerDataFactoryWithTestComponents.scala | 4 +- 21 files changed, 163 insertions(+), 39 deletions(-) create mode 100644 scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/fragment/FragmentParameterTypingParser.scala diff --git a/designer/client/src/components/graph/node-modal/editors/expression/Table/TableEditor.tsx b/designer/client/src/components/graph/node-modal/editors/expression/Table/TableEditor.tsx index 6db395f3fa1..4d38ca5ffe9 100644 --- a/designer/client/src/components/graph/node-modal/editors/expression/Table/TableEditor.tsx +++ b/designer/client/src/components/graph/node-modal/editors/expression/Table/TableEditor.tsx @@ -17,7 +17,6 @@ import { PopoverPosition } from "@mui/material/Popover/Popover"; import i18next from "i18next"; import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; import ValidationLabels from "../../../../../modals/ValidationLabels"; -import { useTypeOptions } from "../../../fragment-input-definition/FragmentInputDefinition"; import { EditorProps, ExtendedEditor } from "../Editor"; import "@glideapps/glide-data-grid/dist/index.css"; import { CellMenu, DeleteColumnMenuItem, DeleteRowMenuItem, ResetColumnWidthMenuItem } from "./CellMenu"; @@ -31,6 +30,10 @@ import { TypesMenu } from "./TypesMenu"; import { customRenderers } from "./customRenderers"; import { isDatePickerCell } from "./customCells"; import type { GetRowThemeCallback } from "@glideapps/glide-data-grid/src/internal/data-grid/render/data-grid-render.cells"; +import { useSelector } from "react-redux"; +import { getProcessDefinitionData } from "../../../../../../reducers/selectors/settings"; +import ProcessUtils from "../../../../../../common/ProcessUtils"; +import { find, head, orderBy } from "lodash"; const SUPPORTED_TYPES = [ "java.lang.String", @@ -87,6 +90,27 @@ const emptySelection = { rows: CompactSelection.empty(), }; +export function useTableEditorTypeOptions() { + const definitionData = useSelector(getProcessDefinitionData); + + const typeOptions = useMemo( + () => + definitionData?.classes?.map((type) => ({ + value: type.refClazzName as SupportedType, + label: ProcessUtils.humanReadableType(type), + })), + [definitionData?.classes], + ); + + const orderedTypeOptions = useMemo(() => orderBy(typeOptions, (item) => [item.label, item.value], ["asc"]), [typeOptions]); + + const defaultTypeOption = useMemo(() => find(typeOptions, { label: "String" }) || head(typeOptions), [typeOptions]); + return { + orderedTypeOptions, + defaultTypeOption, + }; +} + export const Table = ({ expressionObj, onValueChange, className, fieldErrors }: EditorProps) => { const tableDateContext = useTableState(expressionObj); const [{ rows, columns }, dispatch, rawExpression] = tableDateContext; @@ -97,7 +121,7 @@ export const Table = ({ expressionObj, onValueChange, className, fieldErrors }: } }, [expressionObj.expression, onValueChange, rawExpression]); - const { defaultTypeOption, orderedTypeOptions } = useTypeOptions(); + const { defaultTypeOption, orderedTypeOptions } = useTableEditorTypeOptions(); const supportedTypes = useMemo(() => orderedTypeOptions.filter(({ value }) => SUPPORTED_TYPES.includes(value)), [orderedTypeOptions]); useEffect(() => { diff --git a/designer/client/src/components/graph/node-modal/fragment-input-definition/FragmentInputDefinition.tsx b/designer/client/src/components/graph/node-modal/fragment-input-definition/FragmentInputDefinition.tsx index 54f66ba61ee..c0aa32d74b1 100644 --- a/designer/client/src/components/graph/node-modal/fragment-input-definition/FragmentInputDefinition.tsx +++ b/designer/client/src/components/graph/node-modal/fragment-input-definition/FragmentInputDefinition.tsx @@ -14,13 +14,13 @@ interface Props extends Omit, "readOnly isEditMode?: boolean; } -export function useTypeOptions() { +export function useFragmentInputDefinitionTypeOptions() { const definitionData = useSelector(getProcessDefinitionData); + const typeOptions = useMemo( () => definitionData?.classes?.map((type) => ({ - // TODO: Instead of using type assertion type, set refClazzName as a union of available clazzNames - value: type.refClazzName as Value, + value: type.display as string, label: ProcessUtils.humanReadableType(type), })), [definitionData?.classes], @@ -40,7 +40,7 @@ export default function FragmentInputDefinition(props: Props): JSX.Element { const { node, setProperty, isEditMode, showValidation } = passProps; const readOnly = !isEditMode; - const { orderedTypeOptions, defaultTypeOption } = useTypeOptions(); + const { orderedTypeOptions, defaultTypeOption } = useFragmentInputDefinitionTypeOptions(); const addField = useCallback(() => { addElement("parameters", getDefaultFields(defaultTypeOption.value)); diff --git a/designer/client/src/components/graph/node-modal/fragment-input-definition/settings/variants/fields/FixedValuesSetting.tsx b/designer/client/src/components/graph/node-modal/fragment-input-definition/settings/variants/fields/FixedValuesSetting.tsx index 902e0fb5aff..6b0f3781e99 100644 --- a/designer/client/src/components/graph/node-modal/fragment-input-definition/settings/variants/fields/FixedValuesSetting.tsx +++ b/designer/client/src/components/graph/node-modal/fragment-input-definition/settings/variants/fields/FixedValuesSetting.tsx @@ -36,7 +36,15 @@ export function FixedValuesSetting({ return ( <> {fixedValuesType === FixedValuesType.ValueInputWithDictEditor && ( - + )} {fixedValuesType === FixedValuesType.ValueInputWithFixedValuesProvided && ( dictionaries.get(dictId) match { case Some(dictDefinition) => - val fragmentParameterTypingResult = fragmentParameter.typ - .toRuntimeClass(classLoader) - .map(Typed(_)) + val fragmentParameterTypingParser = new FragmentParameterTypingParser(classLoader, classDefinitions) + val fragmentParameterTypingResult = fragmentParameterTypingParser + .parseClassNameToTypingResult( + fragmentParameter.typ.refClazzName + ) .getOrElse(Unknown) val dictValueType = dictDefinition.valueType(dictId) diff --git a/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/compile/nodecompilation/NodeCompiler.scala b/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/compile/nodecompilation/NodeCompiler.scala index f27793e2795..f82f638f67b 100644 --- a/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/compile/nodecompilation/NodeCompiler.scala +++ b/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/compile/nodecompilation/NodeCompiler.scala @@ -14,7 +14,6 @@ import pl.touk.nussknacker.engine.api.parameter.ParameterName import pl.touk.nussknacker.engine.api.process.{ComponentUseCase, Source} import pl.touk.nussknacker.engine.api.typed.ReturningType import pl.touk.nussknacker.engine.api.typed.typing.{TypingResult, Unknown} -import pl.touk.nussknacker.engine.compile.nodecompilation.FragmentParameterValidator.validateParameterNames import pl.touk.nussknacker.engine.compile.nodecompilation.NodeCompiler.NodeCompilationResult import pl.touk.nussknacker.engine.compile.{ ComponentExecutorFactory, @@ -100,6 +99,8 @@ class NodeCompiler( new DynamicNodeValidator(expressionCompiler, globalVariablesPreparer, parametersEvaluator) private val builtInNodeCompiler = new BuiltInNodeCompiler(expressionCompiler) + private val fragmentParameterValidator = FragmentParameterValidator(fragmentDefinitionExtractor.classDefinitions) + def compileSource( nodeData: SourceNodeData )(implicit jobData: JobData, nodeId: NodeId): NodeCompilationResult[Source] = nodeData match { @@ -165,7 +166,7 @@ class NodeCompiler( ) } - val parameterNameValidation = validateParameterNames(parameterDefinitions.value) + val parameterNameValidation = fragmentParameterValidator.validateParameterNames(parameterDefinitions.value) // by relying on name for the field names used on FE, we display the same errors under all fields with the // duplicated name @@ -195,7 +196,7 @@ class NodeCompiler( val fixedValuesErrors = fragmentInputDefinition.parameters .map { param => - FragmentParameterValidator.validateFixedExpressionValues( + fragmentParameterValidator.validateFixedExpressionValues( param, validationContext, expressionCompiler @@ -206,7 +207,7 @@ class NodeCompiler( val dictValueEditorErrors = fragmentInputDefinition.parameters .map { param => - FragmentParameterValidator.validateValueInputWithDictEditor(param, expressionConfig.dictionaries, classLoader) + fragmentParameterValidator.validateValueInputWithDictEditor(param, expressionConfig.dictionaries, classLoader) } .sequence .map(_ => ()) diff --git a/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/compile/nodecompilation/NodeDataValidator.scala b/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/compile/nodecompilation/NodeDataValidator.scala index 70266bba303..cca96566d05 100644 --- a/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/compile/nodecompilation/NodeDataValidator.scala +++ b/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/compile/nodecompilation/NodeDataValidator.scala @@ -45,7 +45,10 @@ class NodeDataValidator(modelData: ModelData) { private val compiler = new NodeCompiler( modelData.modelDefinition, - new FragmentParametersDefinitionExtractor(modelData.modelClassLoader.classLoader), + new FragmentParametersDefinitionExtractor( + modelData.modelClassLoader.classLoader, + modelData.modelDefinitionWithClasses.classDefinitions.all + ), expressionCompiler, modelData.modelClassLoader.classLoader, Seq.empty, diff --git a/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/fragment/FragmentComponentDefinitionExtractor.scala b/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/fragment/FragmentComponentDefinitionExtractor.scala index c3c426f20a3..e0bd07073c7 100644 --- a/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/fragment/FragmentComponentDefinitionExtractor.scala +++ b/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/fragment/FragmentComponentDefinitionExtractor.scala @@ -10,6 +10,7 @@ import pl.touk.nussknacker.engine.api.component.{ } import pl.touk.nussknacker.engine.api.{FragmentSpecificData, NodeId} import pl.touk.nussknacker.engine.canonicalgraph.CanonicalProcess +import pl.touk.nussknacker.engine.definition.clazz.ClassDefinition import pl.touk.nussknacker.engine.definition.component.{ ComponentDefinitionWithImplementation, ComponentImplementationInvoker @@ -18,11 +19,12 @@ import pl.touk.nussknacker.engine.util.MetaDataExtractor class FragmentComponentDefinitionExtractor( classLoader: ClassLoader, + classDefinitions: Set[ClassDefinition], translateGroupName: ComponentGroupName => Option[ComponentGroupName], determineDesignerWideId: ComponentId => DesignerWideComponentId ) { - val parametersExtractor = new FragmentParametersDefinitionExtractor(classLoader) + val parametersExtractor = new FragmentParametersDefinitionExtractor(classLoader, classDefinitions) def extractFragmentComponentDefinition( fragment: CanonicalProcess, diff --git a/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/fragment/FragmentParameterTypingParser.scala b/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/fragment/FragmentParameterTypingParser.scala new file mode 100644 index 00000000000..989e8c5ea13 --- /dev/null +++ b/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/fragment/FragmentParameterTypingParser.scala @@ -0,0 +1,45 @@ +package pl.touk.nussknacker.engine.definition.fragment + +import org.apache.commons.lang3.ClassUtils +import pl.touk.nussknacker.engine.api.typed.typing.{Typed, TypingResult} +import pl.touk.nussknacker.engine.definition.clazz.ClassDefinition + +import scala.util.Try + +class FragmentParameterTypingParser(classLoader: ClassLoader, classDefinitions: Set[ClassDefinition]) { + + def parseClassNameToTypingResult(className: String): Try[TypingResult] = { + /* + TODO: Write this parser in a way that handles arbitrary depth expressions + One should not use regexes for doing so and rather build AST + */ + def resolveInnerClass(simpleClassName: String): TypingResult = + classDefinitions + .find(classDefinition => classDefinition.clazzName.display == simpleClassName) + .fold( + // This is fallback - it may be removed and `ClassNotFound` exception may be thrown here after cleaning up the mess with `FragmentClazzRef` class + Typed(ClassUtils.getClass(classLoader, simpleClassName)) + ) { classDefinition => + classDefinition.clazzName + } + + val mapPattern = "Map\\[(.+),(.+)\\]".r + val listPattern = "List\\[(.+)\\]".r + val setPattern = "Set\\[(.+)\\]".r + + Try(className match { + case mapPattern(x, y) => + val resolvedFirstTypeParam = resolveInnerClass(x) + val resolvedSecondTypeParam = resolveInnerClass(y) + Typed.genericTypeClass[java.util.Map[_, _]](List(resolvedFirstTypeParam, resolvedSecondTypeParam)) + case listPattern(x) => + val resolvedTypeParam = resolveInnerClass(x) + Typed.genericTypeClass[java.util.List[_]](List(resolvedTypeParam)) + case setPattern(x) => + val resolvedTypeParam = resolveInnerClass(x) + Typed.genericTypeClass[java.util.Set[_]](List(resolvedTypeParam)) + case simpleClassName => resolveInnerClass(simpleClassName) + }) + } + +} diff --git a/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/fragment/FragmentParametersDefinitionExtractor.scala b/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/fragment/FragmentParametersDefinitionExtractor.scala index 79352d1f719..b595499009a 100644 --- a/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/fragment/FragmentParametersDefinitionExtractor.scala +++ b/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/fragment/FragmentParametersDefinitionExtractor.scala @@ -5,6 +5,7 @@ import cats.data.Validated.{Invalid, Valid} import cats.data.{Writer, WriterT} import cats.implicits.{catsKernelStdMonoidForList, toTraverseOps} import cats.instances.list._ +import org.apache.commons.lang3.ClassUtils import pl.touk.nussknacker.engine.api.NodeId import pl.touk.nussknacker.engine.api.component.ParameterConfig import pl.touk.nussknacker.engine.api.context.PartSubGraphCompilationError @@ -13,6 +14,7 @@ import pl.touk.nussknacker.engine.api.definition._ import pl.touk.nussknacker.engine.api.parameter.ValueInputWithDictEditor import pl.touk.nussknacker.engine.api.typed.typing.{Typed, TypingResult, Unknown} import pl.touk.nussknacker.engine.compile.nodecompilation.FragmentParameterValidator +import pl.touk.nussknacker.engine.definition.clazz.{ClassDefinition, ClassDefinitionSet} import pl.touk.nussknacker.engine.definition.component.parameter.ParameterData import pl.touk.nussknacker.engine.definition.component.parameter.defaults.{ DefaultValueDeterminerChain, @@ -28,11 +30,18 @@ import pl.touk.nussknacker.engine.graph.expression.Expression.Language import pl.touk.nussknacker.engine.graph.node.FragmentInputDefinition.FragmentParameter import pl.touk.nussknacker.engine.graph.node.{FragmentInput, FragmentInputDefinition} +import scala.util.Try + /* * This class doesn't validate the parameters' initialValue and valueEditor (e.g. values can be of incorrect type), as it would require ExpressionCompiler, ValidationContext and declared dictionaries. * They are validated separately when creating fragment in NodeCompiler.compileSource, but if they are not validated it is not a breaking issue anyway as a process using these incorrect values will fail validation. */ -class FragmentParametersDefinitionExtractor(classLoader: ClassLoader) { +class FragmentParametersDefinitionExtractor( + classLoader: ClassLoader, + val classDefinitions: Set[ClassDefinition] = Set.empty +) { + + private val fragmentParameterTypingParser = new FragmentParameterTypingParser(classLoader, classDefinitions) def extractParametersDefinition( fragmentInput: FragmentInput @@ -73,7 +82,7 @@ class FragmentParametersDefinitionExtractor(classLoader: ClassLoader) { val (extractedEditor, validationErrors) = fragmentParameter.valueEditor .map(editor => - FragmentParameterValidator.validateAgainstClazzRefAndGetEditor( + FragmentParameterValidator(classDefinitions).validateAgainstClazzRefAndGetEditor( valueEditor = editor, initialValue = fragmentParameter.initialValue, refClazz = fragmentParameter.typ, @@ -133,10 +142,9 @@ class FragmentParametersDefinitionExtractor(classLoader: ClassLoader) { private def getParamTypingResult( fragmentParameter: FragmentParameter - )(implicit nodeId: NodeId): Writer[List[PartSubGraphCompilationError], TypingResult] = - fragmentParameter.typ - .toRuntimeClass(classLoader) - .map(Typed(_)) + )(implicit nodeId: NodeId): Writer[List[PartSubGraphCompilationError], TypingResult] = { + fragmentParameterTypingParser + .parseClassNameToTypingResult(fragmentParameter.typ.refClazzName) .map(Writer.value[List[PartSubGraphCompilationError], TypingResult]) .getOrElse( Writer @@ -145,5 +153,6 @@ class FragmentParametersDefinitionExtractor(classLoader: ClassLoader) { List(FragmentParamClassLoadError(fragmentParameter.name, fragmentParameter.typ.refClazzName, nodeId.id)) ) ) + } } diff --git a/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/test/ModelDataTestInfoProvider.scala b/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/test/ModelDataTestInfoProvider.scala index 16c7a45babd..d2c0b815744 100644 --- a/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/test/ModelDataTestInfoProvider.scala +++ b/scenario-compiler/src/main/scala/pl/touk/nussknacker/engine/definition/test/ModelDataTestInfoProvider.scala @@ -24,7 +24,10 @@ class ModelDataTestInfoProvider(modelData: ModelData) extends TestInfoProvider w private lazy val nodeCompiler = new NodeCompiler( modelData.modelDefinition, - new FragmentParametersDefinitionExtractor(modelData.modelClassLoader.classLoader), + new FragmentParametersDefinitionExtractor( + modelData.modelClassLoader.classLoader, + modelData.modelDefinitionWithClasses.classDefinitions.all + ), expressionCompiler, modelData.modelClassLoader.classLoader, Seq.empty, diff --git a/scenario-compiler/src/test/scala/pl/touk/nussknacker/engine/compile/nodecompilation/FragmentParameterValidatorTest.scala b/scenario-compiler/src/test/scala/pl/touk/nussknacker/engine/compile/nodecompilation/FragmentParameterValidatorTest.scala index 359e7c096fd..93d4f501417 100644 --- a/scenario-compiler/src/test/scala/pl/touk/nussknacker/engine/compile/nodecompilation/FragmentParameterValidatorTest.scala +++ b/scenario-compiler/src/test/scala/pl/touk/nussknacker/engine/compile/nodecompilation/FragmentParameterValidatorTest.scala @@ -23,7 +23,7 @@ class FragmentParameterValidatorTest extends AnyFunSuite with Matchers { forAll(permittedTypesForEditors) { fragmentParameterType: FragmentClazzRef => { val dictId = "someDictId" - val result = FragmentParameterValidator.validateAgainstClazzRefAndGetEditor( + val result = FragmentParameterValidator().validateAgainstClazzRefAndGetEditor( valueEditor = ValueInputWithDictEditor(dictId, allowOtherValue = false), initialValue = None, refClazz = fragmentParameterType, @@ -39,7 +39,7 @@ class FragmentParameterValidatorTest extends AnyFunSuite with Matchers { forAll(permittedTypesForEditors) { fragmentParameterType: FragmentClazzRef => { val fixedValuesList = List(FixedExpressionValue("someExpression", "someLabel")) - val result = FragmentParameterValidator.validateAgainstClazzRefAndGetEditor( + val result = FragmentParameterValidator().validateAgainstClazzRefAndGetEditor( valueEditor = ValueInputWithFixedValuesProvided(fixedValuesList, allowOtherValue = false), initialValue = None, refClazz = fragmentParameterType, @@ -55,7 +55,7 @@ class FragmentParameterValidatorTest extends AnyFunSuite with Matchers { val paramName = ParameterName("someParamName") val invalidParameterType = FragmentClazzRef[java.lang.Double] val nodeIds = Set("someNodeId") - val result = FragmentParameterValidator.validateAgainstClazzRefAndGetEditor( + val result = FragmentParameterValidator().validateAgainstClazzRefAndGetEditor( valueEditor = ValueInputWithDictEditor("someDictId", allowOtherValue = false), initialValue = None, refClazz = invalidParameterType, @@ -71,7 +71,7 @@ class FragmentParameterValidatorTest extends AnyFunSuite with Matchers { val paramName = ParameterName("someParamName") val invalidParameterType = FragmentClazzRef[java.lang.Double] val nodeIds = Set("someNodeId") - val result = FragmentParameterValidator.validateAgainstClazzRefAndGetEditor( + val result = FragmentParameterValidator().validateAgainstClazzRefAndGetEditor( valueEditor = ValueInputWithFixedValuesProvided( List(FixedExpressionValue("someExpression", "someLabel")), allowOtherValue = false diff --git a/utils/flink-components-testkit/src/main/scala/pl/touk/nussknacker/engine/flink/util/test/FlinkProcessCompilerDataFactoryWithTestComponents.scala b/utils/flink-components-testkit/src/main/scala/pl/touk/nussknacker/engine/flink/util/test/FlinkProcessCompilerDataFactoryWithTestComponents.scala index 15fcd878c7b..57e7cdd376f 100644 --- a/utils/flink-components-testkit/src/main/scala/pl/touk/nussknacker/engine/flink/util/test/FlinkProcessCompilerDataFactoryWithTestComponents.scala +++ b/utils/flink-components-testkit/src/main/scala/pl/touk/nussknacker/engine/flink/util/test/FlinkProcessCompilerDataFactoryWithTestComponents.scala @@ -8,6 +8,7 @@ import pl.touk.nussknacker.engine.api._ import pl.touk.nussknacker.engine.api.component.{ComponentAdditionalConfig, DesignerWideComponentId} import pl.touk.nussknacker.engine.api.namespaces.NamingStrategy import pl.touk.nussknacker.engine.api.process._ +import pl.touk.nussknacker.engine.definition.clazz.ClassDefinition import pl.touk.nussknacker.engine.definition.component.ComponentDefinitionWithImplementation import pl.touk.nussknacker.engine.definition.globalvariables.GlobalVariableDefinitionWithImplementation import pl.touk.nussknacker.engine.definition.model.ModelDefinition @@ -61,7 +62,8 @@ object FlinkProcessCompilerDataFactoryWithTestComponents { override protected def adjustDefinitions( originalModelDefinition: ModelDefinition, - definitionContext: ComponentDefinitionContext + definitionContext: ComponentDefinitionContext, + classDefinitions: Set[ClassDefinition] ): ModelDefinition = { val testComponents = ComponentDefinitionWithImplementation.forList(