From 5ab148ca77667d77654b5098c34cfc9f8638ecd6 Mon Sep 17 00:00:00 2001 From: yyin-talend Date: Thu, 20 Jun 2024 16:55:27 +0800 Subject: [PATCH 1/6] feat(TCOMP-2739):Create an action validator for the @DynamicDependencies annotation --- .../tools/validator/ActionValidator.java | 69 +++++++++++++++++++ .../tools/validator/ActionValidatorTest.java | 39 +++++++++++ 2 files changed, 108 insertions(+) diff --git a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java index f84e9541a31bf..4dc8565d9f171 100644 --- a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java +++ b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java @@ -22,6 +22,8 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Parameter; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -40,6 +42,7 @@ import org.talend.sdk.component.api.service.ActionType; import org.talend.sdk.component.api.service.Service; import org.talend.sdk.component.api.service.completion.DynamicValues; +import org.talend.sdk.component.api.service.dependency.DynamicDependencies; import org.talend.sdk.component.api.service.discovery.DiscoverDataset; import org.talend.sdk.component.api.service.healthcheck.HealthCheck; import org.talend.sdk.component.api.service.schema.DiscoverSchema; @@ -95,6 +98,9 @@ public Stream validate(final AnnotationFinder finder, final List discoverProcessor = findDiscoverSchemaExtendedErrors(finder); + // parameters for @DynamicDependencies + final Stream dynamicDependencyErrors = findDynamicDependenciesErrors(finder); + // returned type for @Update, for now limit it on objects and not primitives final Stream updatesErrors = this.findUpdatesErrors(finder); @@ -130,6 +136,7 @@ public Stream validate(final AnnotationFinder finder, final List findDiscoverSchemaExtendedErrors(final AnnotationFinder f .orElseGet(Stream::empty); } + /** + * Checks method signature for @DynamicDependencies annotation. + * Valid signatures are: + *
    + *
  • public List getDependencies(@Option("configuration") final TheDataset dataset)
  • + *
+ * + * @param finder + * @return Errors on @DynamicDependencies method + */ + private Stream findDynamicDependenciesErrors(final AnnotationFinder finder) { + + final Stream optionParameter = finder + .findAnnotatedMethods(DynamicDependencies.class) + .stream() + .filter(m -> !hasOption(m)) + .map(m -> m + " should have a parameter being an option (marked with @Option)") + .sorted(); + + final Stream returnType = finder + .findAnnotatedMethods(DynamicDependencies.class) + .stream() + .filter(m -> !hasListReturnType(m)) + .map(m -> m + " should return a List") + .sorted(); + + final Stream returnStringInList = finder + .findAnnotatedMethods(DynamicDependencies.class) + .stream() + .filter(m -> !hasStringInList(m)) + .map(m -> m + " should return String in the List") + .sorted(); + + final Stream dataset = finder + .findAnnotatedMethods(DynamicDependencies.class) + .stream() + .filter(m -> !hasTypeParameter(m, DataSet.class)) + .map(m -> m + " should have its Dataset parameter") + .sorted(); + + return Stream.of(returnType, optionParameter, dataset, returnStringInList) + .reduce(Stream::concat) + .orElseGet(Stream::empty); + } + private Stream findUpdatesErrors(final AnnotationFinder finder) { final Map updates = finder .findAnnotatedMethods(Update.class) @@ -294,4 +346,21 @@ private boolean hasBranchCorrectNaming(final Method method) { private boolean hasCorrectReturnType(final Method method) { return Schema.class.isAssignableFrom(method.getReturnType()); } + + private boolean hasListReturnType(final Method method) { + return List.class.isAssignableFrom(method.getReturnType()); + } + + private boolean hasStringInList(final Method method) { + Type returnType = method.getGenericReturnType(); + + if (returnType instanceof ParameterizedType) { + ParameterizedType type = (ParameterizedType) returnType; + Type[] actualTypeArguments = type.getActualTypeArguments(); + if (actualTypeArguments.length > 0) { + return "java.lang.String".equals(actualTypeArguments[0].getTypeName()); + } + } + return false; + } } diff --git a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java index 993c438a8e59b..4fa487221fb50 100644 --- a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java +++ b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java @@ -36,6 +36,7 @@ import org.talend.sdk.component.api.service.Service; import org.talend.sdk.component.api.service.completion.DynamicValues; import org.talend.sdk.component.api.service.completion.Values; +import org.talend.sdk.component.api.service.dependency.DynamicDependencies; import org.talend.sdk.component.api.service.discovery.DiscoverDataset; import org.talend.sdk.component.api.service.discovery.DiscoverDatasetResult; import org.talend.sdk.component.api.service.discovery.DiscoverDatasetResult.DatasetDescription; @@ -73,6 +74,18 @@ void validateDiscoverProcessorSchema() { assertEquals(13, errors.count()); } + @Test + void validateDynamicDependencies() { + final ActionValidator validator = new ActionValidator(new FakeHelper()); + AnnotationFinder finder = new AnnotationFinder(new ClassesArchive(ActionDynamicDependenciesOK.class)); + final Stream noerrors = + validator.validate(finder, Arrays.asList(ActionDynamicDependenciesOK.class)); + assertEquals(0, noerrors.count()); + finder = new AnnotationFinder(new ClassesArchive(ActionDynamicDependenciesKO.class)); + final Stream errors = validator.validate(finder, Arrays.asList(ActionDynamicDependenciesKO.class)); + assertEquals(6, errors.count()); + } + @Test void validate() { final ActionValidator validator = new ActionValidator(new FakeHelper()); @@ -263,4 +276,30 @@ public Record guessProcessorSchemaKo6(@Option FakeDataSet configuration, RecordB return null; } } + + static class ActionDynamicDependenciesOK { + + @DynamicDependencies("test-all") + public List getDynamicDependencies(@Option("configuration") final DataSet dataset) { + return null; + } + } + + static class ActionDynamicDependenciesKO { + + @DynamicDependencies("error: return List") + public String getDynamicDependencies(@Option("configuration") final DataSet dataset) { + return null; + } + + @DynamicDependencies("error-param:no Option, no Dataset") + public List getDynamicDependencies2() { + return null; + } + + @DynamicDependencies("error: List T not String, param not dataset") + public List getDynamicDependencies3(@Option("configuration") final FakeDataStore dataset) { + return null; + } + } } \ No newline at end of file From 7a9718a167ba82c669c73d12076d1d936d810cbf Mon Sep 17 00:00:00 2001 From: yyin-talend Date: Fri, 21 Jun 2024 15:13:11 +0800 Subject: [PATCH 2/6] feat(TCOMP-2739): combine similar check into one. --- .../tools/validator/ActionValidator.java | 24 +++++++------------ .../component/tools/validator/Validators.java | 3 ++- .../tools/validator/ActionValidatorTest.java | 3 +++ 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java index 4dc8565d9f171..5d73743f21de6 100644 --- a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java +++ b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java @@ -233,17 +233,10 @@ private Stream findDynamicDependenciesErrors(final AnnotationFinder find .sorted(); final Stream returnType = finder - .findAnnotatedMethods(DynamicDependencies.class) - .stream() - .filter(m -> !hasListReturnType(m)) - .map(m -> m + " should return a List") - .sorted(); - - final Stream returnStringInList = finder .findAnnotatedMethods(DynamicDependencies.class) .stream() .filter(m -> !hasStringInList(m)) - .map(m -> m + " should return String in the List") + .map(m -> m + " should return List") .sorted(); final Stream dataset = finder @@ -253,7 +246,7 @@ private Stream findDynamicDependenciesErrors(final AnnotationFinder find .map(m -> m + " should have its Dataset parameter") .sorted(); - return Stream.of(returnType, optionParameter, dataset, returnStringInList) + return Stream.of(returnType, optionParameter, dataset) .reduce(Stream::concat) .orElseGet(Stream::empty); } @@ -352,13 +345,12 @@ private boolean hasListReturnType(final Method method) { } private boolean hasStringInList(final Method method) { - Type returnType = method.getGenericReturnType(); - - if (returnType instanceof ParameterizedType) { - ParameterizedType type = (ParameterizedType) returnType; - Type[] actualTypeArguments = type.getActualTypeArguments(); - if (actualTypeArguments.length > 0) { - return "java.lang.String".equals(actualTypeArguments[0].getTypeName()); + if (List.class.isAssignableFrom(method.getReturnType())) { + if (method.getGenericReturnType() instanceof ParameterizedType) { + Type[] actualTypeArguments = ((ParameterizedType) method.getGenericReturnType()).getActualTypeArguments(); + if (actualTypeArguments.length > 0) { + return "java.lang.String".equals(actualTypeArguments[0].getTypeName()); + } } } return false; diff --git a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/Validators.java b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/Validators.java index 8355938a75d31..a0f0ff7d234fe 100644 --- a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/Validators.java +++ b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/Validators.java @@ -33,6 +33,7 @@ import org.talend.sdk.component.api.service.asyncvalidation.AsyncValidation; import org.talend.sdk.component.api.service.completion.DynamicValues; import org.talend.sdk.component.api.service.completion.Suggestions; +import org.talend.sdk.component.api.service.dependency.DynamicDependencies; import org.talend.sdk.component.api.service.healthcheck.HealthCheck; import org.talend.sdk.component.api.service.schema.DiscoverSchema; import org.talend.sdk.component.api.service.update.Update; @@ -179,7 +180,7 @@ public static Validators build(final Configuration configuration, final Validato public static Stream> getActionsStream() { return of(AsyncValidation.class, DynamicValues.class, HealthCheck.class, DiscoverSchema.class, - Suggestions.class, Update.class); + Suggestions.class, Update.class, DynamicDependencies.class); } public static Stream flatten(final Collection options) { diff --git a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java index 4fa487221fb50..d1acb605d1ef2 100644 --- a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java +++ b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java @@ -81,6 +81,7 @@ void validateDynamicDependencies() { final Stream noerrors = validator.validate(finder, Arrays.asList(ActionDynamicDependenciesOK.class)); assertEquals(0, noerrors.count()); + finder = new AnnotationFinder(new ClassesArchive(ActionDynamicDependenciesKO.class)); final Stream errors = validator.validate(finder, Arrays.asList(ActionDynamicDependenciesKO.class)); assertEquals(6, errors.count()); @@ -277,6 +278,7 @@ public Record guessProcessorSchemaKo6(@Option FakeDataSet configuration, RecordB } } + @Service static class ActionDynamicDependenciesOK { @DynamicDependencies("test-all") @@ -285,6 +287,7 @@ public List getDynamicDependencies(@Option("configuration") final DataSe } } + @Service static class ActionDynamicDependenciesKO { @DynamicDependencies("error: return List") From 1e8ed3f0ac9f3a016da1eb0ca3772cea1d52f9c7 Mon Sep 17 00:00:00 2001 From: yyin-talend Date: Tue, 25 Jun 2024 10:08:22 +0800 Subject: [PATCH 3/6] feat(TCOMP-2739): FIX sonar --- .../tools/validator/ActionValidator.java | 24 +++++-------------- .../tools/validator/ActionValidatorTest.java | 2 +- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java index 5d73743f21de6..0736500c7a904 100644 --- a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java +++ b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java @@ -239,14 +239,7 @@ private Stream findDynamicDependenciesErrors(final AnnotationFinder find .map(m -> m + " should return List") .sorted(); - final Stream dataset = finder - .findAnnotatedMethods(DynamicDependencies.class) - .stream() - .filter(m -> !hasTypeParameter(m, DataSet.class)) - .map(m -> m + " should have its Dataset parameter") - .sorted(); - - return Stream.of(returnType, optionParameter, dataset) + return Stream.of(returnType, optionParameter) .reduce(Stream::concat) .orElseGet(Stream::empty); } @@ -340,17 +333,12 @@ private boolean hasCorrectReturnType(final Method method) { return Schema.class.isAssignableFrom(method.getReturnType()); } - private boolean hasListReturnType(final Method method) { - return List.class.isAssignableFrom(method.getReturnType()); - } - private boolean hasStringInList(final Method method) { - if (List.class.isAssignableFrom(method.getReturnType())) { - if (method.getGenericReturnType() instanceof ParameterizedType) { - Type[] actualTypeArguments = ((ParameterizedType) method.getGenericReturnType()).getActualTypeArguments(); - if (actualTypeArguments.length > 0) { - return "java.lang.String".equals(actualTypeArguments[0].getTypeName()); - } + if (List.class.isAssignableFrom(method.getReturnType()) + && method.getGenericReturnType() instanceof ParameterizedType) { + Type[] actualTypeArguments = ((ParameterizedType) method.getGenericReturnType()).getActualTypeArguments(); + if (actualTypeArguments.length > 0) { + return "java.lang.String".equals(actualTypeArguments[0].getTypeName()); } } return false; diff --git a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java index d1acb605d1ef2..fe94f436aa3de 100644 --- a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java +++ b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java @@ -84,7 +84,7 @@ void validateDynamicDependencies() { finder = new AnnotationFinder(new ClassesArchive(ActionDynamicDependenciesKO.class)); final Stream errors = validator.validate(finder, Arrays.asList(ActionDynamicDependenciesKO.class)); - assertEquals(6, errors.count()); + assertEquals(4, errors.count()); } @Test From 3bebd738884d96e88d3f0b01a5a9ca0528e5ddb0 Mon Sep 17 00:00:00 2001 From: yyin-talend Date: Wed, 26 Jun 2024 10:40:31 +0800 Subject: [PATCH 4/6] item(TCOMP-2739): fix comment and add junit cases --- .../tools/validator/ActionValidator.java | 4 ++-- .../tools/validator/ActionValidatorTest.java | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java index 0736500c7a904..97d63384dc9ae 100644 --- a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java +++ b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java @@ -228,8 +228,8 @@ private Stream findDynamicDependenciesErrors(final AnnotationFinder find final Stream optionParameter = finder .findAnnotatedMethods(DynamicDependencies.class) .stream() - .filter(m -> !hasOption(m)) - .map(m -> m + " should have a parameter being an option (marked with @Option)") + .filter(m -> !hasOption(m) || !hasTypeParameter(m, DataSet.class)) + .map(m -> m + " should have a Dataset parameter marked with @Option") .sorted(); final Stream returnType = finder diff --git a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java index fe94f436aa3de..dec664a7aefbc 100644 --- a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java +++ b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java @@ -84,7 +84,7 @@ void validateDynamicDependencies() { finder = new AnnotationFinder(new ClassesArchive(ActionDynamicDependenciesKO.class)); final Stream errors = validator.validate(finder, Arrays.asList(ActionDynamicDependenciesKO.class)); - assertEquals(4, errors.count()); + assertEquals(9, errors.count()); } @Test @@ -300,8 +300,17 @@ public List getDynamicDependencies2() { return null; } - @DynamicDependencies("error: List T not String, param not dataset") - public List getDynamicDependencies3(@Option("configuration") final FakeDataStore dataset) { + @DynamicDependencies("error: param not dataset") + public String getDynamicDependencies3(@Option("configuration") final FakeDataStore dataset) { + return null; + } + + @DynamicDependencies("error: param not option") + public List getDynamicDependencies4(final FakeDataStore dataset) {return null; + } + + @DynamicDependencies("error: List T not String") + public List getDynamicDependencies5(@Option("configuration") final DataSet dataset) { return null; } } From 99100a030a565a3d786a19f661c3b5d85c3a9948 Mon Sep 17 00:00:00 2001 From: yyin-talend Date: Fri, 28 Jun 2024 14:13:28 +0800 Subject: [PATCH 5/6] item(TCOMP-2739): check Dataset --- .../component/tools/validator/ActionValidator.java | 8 +++++++- .../tools/validator/ActionValidatorTest.java | 12 ++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java index 97d63384dc9ae..8ebc2fcac72cb 100644 --- a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java +++ b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java @@ -228,7 +228,7 @@ private Stream findDynamicDependenciesErrors(final AnnotationFinder find final Stream optionParameter = finder .findAnnotatedMethods(DynamicDependencies.class) .stream() - .filter(m -> !hasOption(m) || !hasTypeParameter(m, DataSet.class)) + .filter(m -> !hasOption(m) || !hasDatasetParameter(m)) .map(m -> m + " should have a Dataset parameter marked with @Option") .sorted(); @@ -322,6 +322,12 @@ private boolean hasSchemaCorrectNaming(final Method method) { .count() == 1; } + private boolean hasDatasetParameter(Method method) { + return Arrays.stream(method.getParameters()) + .filter(p -> p.getType().isAnnotationPresent(DataSet.class)) + .count() == 1; + } + private boolean hasBranchCorrectNaming(final Method method) { return Arrays.stream(method.getParameters()) .filter(p -> String.class.isAssignableFrom(p.getType())) diff --git a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java index dec664a7aefbc..0561d9ba25be6 100644 --- a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java +++ b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java @@ -84,7 +84,7 @@ void validateDynamicDependencies() { finder = new AnnotationFinder(new ClassesArchive(ActionDynamicDependenciesKO.class)); final Stream errors = validator.validate(finder, Arrays.asList(ActionDynamicDependenciesKO.class)); - assertEquals(9, errors.count()); + assertEquals(10, errors.count()); } @Test @@ -282,7 +282,7 @@ public Record guessProcessorSchemaKo6(@Option FakeDataSet configuration, RecordB static class ActionDynamicDependenciesOK { @DynamicDependencies("test-all") - public List getDynamicDependencies(@Option("configuration") final DataSet dataset) { + public List getDynamicDependencies(@Option("configuration") final FakeDataSet dataset) { return null; } } @@ -291,7 +291,7 @@ public List getDynamicDependencies(@Option("configuration") final DataSe static class ActionDynamicDependenciesKO { @DynamicDependencies("error: return List") - public String getDynamicDependencies(@Option("configuration") final DataSet dataset) { + public String getDynamicDependencies(@Option("configuration") final FakeDataSet dataset) { return null; } @@ -310,8 +310,12 @@ public String getDynamicDependencies3(@Option("configuration") final FakeDataSto } @DynamicDependencies("error: List T not String") - public List getDynamicDependencies5(@Option("configuration") final DataSet dataset) { + public List getDynamicDependencies5(@Option("configuration") final FakeDataSet dataset) { return null; } + + @DynamicDependencies("error: 2 params") + public List getDynamicDependencies6(@Option("configuration") final FakeDataSet dataset, @Option("configuration") final FakeDataSet dataset2) {return null; + } } } \ No newline at end of file From 327b47803e80b9b7bd447d0ee5ecc6d25470270f Mon Sep 17 00:00:00 2001 From: yyin-talend Date: Fri, 28 Jun 2024 17:54:59 +0800 Subject: [PATCH 6/6] item(TCOMP-2739): fix check --- .../sdk/component/tools/validator/ActionValidator.java | 2 +- .../sdk/component/tools/validator/ActionValidatorTest.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java index 8ebc2fcac72cb..12b6b8084918d 100644 --- a/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java +++ b/component-tools/src/main/java/org/talend/sdk/component/tools/validator/ActionValidator.java @@ -322,7 +322,7 @@ private boolean hasSchemaCorrectNaming(final Method method) { .count() == 1; } - private boolean hasDatasetParameter(Method method) { + private boolean hasDatasetParameter(final Method method) { return Arrays.stream(method.getParameters()) .filter(p -> p.getType().isAnnotationPresent(DataSet.class)) .count() == 1; diff --git a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java index 0561d9ba25be6..e774991ad9f8d 100644 --- a/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java +++ b/component-tools/src/test/java/org/talend/sdk/component/tools/validator/ActionValidatorTest.java @@ -306,7 +306,8 @@ public String getDynamicDependencies3(@Option("configuration") final FakeDataSto } @DynamicDependencies("error: param not option") - public List getDynamicDependencies4(final FakeDataStore dataset) {return null; + public List getDynamicDependencies4(final FakeDataStore dataset) { + return null; } @DynamicDependencies("error: List T not String") @@ -315,7 +316,9 @@ public List getDynamicDependencies5(@Option("configuration") final FakeD } @DynamicDependencies("error: 2 params") - public List getDynamicDependencies6(@Option("configuration") final FakeDataSet dataset, @Option("configuration") final FakeDataSet dataset2) {return null; + public List getDynamicDependencies6(@Option("configuration") final FakeDataSet dataset, + @Option("configuration") final FakeDataSet dataset2) { + return null; } } } \ No newline at end of file