diff --git a/modules/siddhi-core/src/main/java/io/siddhi/core/util/extension/validator/InputParameterValidator.java b/modules/siddhi-core/src/main/java/io/siddhi/core/util/extension/validator/InputParameterValidator.java index 993642ac8e..cc35638f54 100644 --- a/modules/siddhi-core/src/main/java/io/siddhi/core/util/extension/validator/InputParameterValidator.java +++ b/modules/siddhi-core/src/main/java/io/siddhi/core/util/extension/validator/InputParameterValidator.java @@ -24,6 +24,7 @@ import io.siddhi.annotation.util.DataType; import io.siddhi.core.executor.ConstantExpressionExecutor; import io.siddhi.core.executor.ExpressionExecutor; +import io.siddhi.core.util.SiddhiConstants; import io.siddhi.core.util.parser.helper.AnnotationHelper; import io.siddhi.query.api.definition.Attribute; import io.siddhi.query.api.exception.SiddhiAppValidationException; @@ -32,6 +33,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.StringJoiner; +import java.util.stream.Collectors; import static io.siddhi.core.util.SiddhiConstants.REPETITIVE_PARAMETER_NOTATION; @@ -102,33 +105,35 @@ public static void validateExpressionExecutors(Object objectHavingAnnotation, } } else if (overloadParameterNames.length > 0 && overloadParameterNames[overloadParameterNames.length - 1].equals(REPETITIVE_PARAMETER_NOTATION)) { - boolean isExpectedParameterOverload = true; - for (int i = 0; i < attributeExpressionExecutors.length; i++) { - Parameter parameter = null; - String overloadParameterName = null; - if (i < overloadParameterNames.length - 1) { - overloadParameterName = overloadParameterNames[i]; - } else { - overloadParameterName = overloadParameterNames[overloadParameterNames.length - 2]; - } - parameter = parameterMap.get(overloadParameterName); - boolean supportedReturnType = false; - for (DataType type : parameter.type()) { - if (attributeExpressionExecutors[i].getReturnType().toString(). - equalsIgnoreCase(type.toString())) { - supportedReturnType = true; + if (attributeExpressionExecutors.length > 0) { + boolean isExpectedParameterOverload = true; + for (int i = 0; i < attributeExpressionExecutors.length; i++) { + Parameter parameter = null; + String overloadParameterName = null; + if (i < overloadParameterNames.length - 1) { + overloadParameterName = overloadParameterNames[i]; + } else { + overloadParameterName = overloadParameterNames[overloadParameterNames.length - 2]; + } + parameter = parameterMap.get(overloadParameterName); + boolean supportedReturnType = false; + for (DataType type : parameter.type()) { + if (attributeExpressionExecutors[i].getReturnType().toString(). + equalsIgnoreCase(type.toString())) { + supportedReturnType = true; + break; + } + } + if (!supportedReturnType) { + isExpectedParameterOverload = false; break; } } - if (!supportedReturnType) { - isExpectedParameterOverload = false; + if (isExpectedParameterOverload) { + parameterOverload = aParameterOverload; break; } } - if (isExpectedParameterOverload) { - parameterOverload = aParameterOverload; - break; - } } } @@ -138,8 +143,11 @@ public static void validateExpressionExecutors(Object objectHavingAnnotation, for (ExpressionExecutor expressionExecutor : attributeExpressionExecutors) { returnTypes.add(expressionExecutor.getReturnType()); } + String formattedParamOverloadString = getSupportedParamOverloads(parameterMap, parameterOverloads); throw new SiddhiAppValidationException("There is no parameterOverload for '" + key + - "' that matches attribute types '" + returnTypes + "'."); + "' that matches attribute types '" + returnTypes.stream() + .map(String::valueOf).collect(Collectors.joining(", ", "<", ">")) + + "'. Supported parameter overloads are " + formattedParamOverloadString + "."); } else { if (mandatoryCount > attributeExpressionExecutors.length) { throw new SiddhiAppValidationException("The '" + key + "' expects at least " + mandatoryCount + @@ -162,5 +170,39 @@ public static void validateExpressionExecutors(Object objectHavingAnnotation, } } } + + private static String getSupportedParamOverloads(Map parameterMap, + ParameterOverload[] parameterOverloads) { + StringJoiner stringJoiner = new StringJoiner(", "); + for (ParameterOverload parameterOverload : parameterOverloads) { + String[] parameterNames = parameterOverload.parameterNames(); + if (parameterNames.length != 0) { + StringJoiner paramOverloadStringJoiner = new StringJoiner(", ", "(", ")"); + for (int i = 0; i < parameterNames.length; i++) { + StringBuilder stringBuilder = new StringBuilder(); + if (!SiddhiConstants.REPETITIVE_PARAMETER_NOTATION.equals(parameterNames[i])) { + stringBuilder.append(getFormattedStringForDataType(parameterMap. + get(parameterNames[i]).type())); + stringBuilder.append(" ").append(parameterNames[i]); + } else { + stringBuilder.append(getFormattedStringForDataType(parameterMap. + get(parameterNames[i - 1]).type())); + stringBuilder.append(" ").append(SiddhiConstants.REPETITIVE_PARAMETER_NOTATION); + } + paramOverloadStringJoiner.add(stringBuilder); + } + stringJoiner.add(paramOverloadStringJoiner.toString()); + } + } + return stringJoiner.toString(); + } + + private static String getFormattedStringForDataType(DataType[] dataTypes) { + StringJoiner stringJoiner = new StringJoiner("|", "<", ">"); + for (DataType dataType : dataTypes) { + stringJoiner.add(dataType.name()); + } + return stringJoiner.toString(); + } } diff --git a/modules/siddhi-core/src/test/java/io/siddhi/core/window/DelayWindowTestCase.java b/modules/siddhi-core/src/test/java/io/siddhi/core/window/DelayWindowTestCase.java index ca04918289..a93217d3ec 100644 --- a/modules/siddhi-core/src/test/java/io/siddhi/core/window/DelayWindowTestCase.java +++ b/modules/siddhi-core/src/test/java/io/siddhi/core/window/DelayWindowTestCase.java @@ -85,7 +85,8 @@ public void delayWindowTest1() { } catch (SiddhiAppCreationException e) { error = false; AssertJUnit.assertEquals("There is no parameterOverload for 'delay' that matches attribute types " + - "'[INT, INT]'.", e.getCause().getMessage()); + "''. Supported parameter overloads are ( window.delay).", + e.getCause().getMessage()); throw e; } finally { if (siddhiAppRuntime != null) { @@ -106,7 +107,8 @@ public void delayWindowTest2() { } catch (SiddhiAppCreationException e) { error = false; AssertJUnit.assertEquals("There is no parameterOverload for 'delay' that matches attribute types " + - "'[STRING]'.", e.getCause().getMessage()); + "''. Supported parameter overloads are ( window.delay).", + e.getCause().getMessage()); throw e; } finally { if (siddhiAppRuntime != null) { diff --git a/modules/siddhi-core/src/test/java/io/siddhi/core/window/SessionWindowTestCase.java b/modules/siddhi-core/src/test/java/io/siddhi/core/window/SessionWindowTestCase.java index 0d9e350bce..d6c858cd00 100644 --- a/modules/siddhi-core/src/test/java/io/siddhi/core/window/SessionWindowTestCase.java +++ b/modules/siddhi-core/src/test/java/io/siddhi/core/window/SessionWindowTestCase.java @@ -88,7 +88,10 @@ public void testSessionWindow1() { } catch (SiddhiAppCreationException e) { AssertJUnit.assertEquals("There is no parameterOverload for 'session' that matches attribute types " + - "'[LONG, STRING, LONG, INT]'.", e.getCause().getMessage()); + "''. Supported parameter overloads are " + + "( window.session), " + + "( window.session, window.key), ( window.session, " + + " window.key, window.allowed.latency).", e.getCause().getMessage()); throw e; } finally { if (siddhiAppRuntime != null) { @@ -150,7 +153,9 @@ public void testSessionWindow3() { } catch (SiddhiAppCreationException e) { AssertJUnit.assertEquals("There is no parameterOverload for 'session' that matches attribute types " + - "'[STRING, STRING, LONG]'.", e.getCause().getMessage()); + "''. Supported parameter overloads are ( window.session), " + + "( window.session, window.key), ( window.session, " + + " window.key, window.allowed.latency).", e.getCause().getMessage()); throw e; } finally { if (siddhiAppRuntime != null) { @@ -215,7 +220,9 @@ public void testSessionWindow5() { } catch (SiddhiAppCreationException e) { AssertJUnit.assertEquals("There is no parameterOverload for 'session' that matches attribute types " + - "'[LONG, INT, LONG]'.", e.getCause().getMessage()); + "''. Supported parameter overloads are ( window.session), " + + "( window.session, window.key), ( window.session, " + + " window.key, window.allowed.latency).", e.getCause().getMessage()); throw e; } finally { if (siddhiAppRuntime != null) { @@ -279,7 +286,10 @@ public void testSessionWindow7() { } catch (SiddhiAppCreationException e) { AssertJUnit.assertEquals("There is no parameterOverload for 'session' that matches attribute " + - "types '[LONG, STRING, STRING]'.", e.getCause().getMessage()); + "types ''. Supported parameter overloads are " + + "( window.session), ( window.session, window.key), " + + "( window.session, window.key, window.allowed.latency).", + e.getCause().getMessage()); throw e; } finally { if (siddhiAppRuntime != null) { @@ -312,7 +322,9 @@ public void testSessionWindow8() { } catch (SiddhiAppCreationException e) { AssertJUnit.assertEquals("There is no parameterOverload for 'session' that matches attribute types" + - " '[LONG, INT]'.", e.getCause().getMessage()); + " ''. Supported parameter overloads are ( window.session), " + + "( window.session, window.key), ( window.session, " + + " window.key, window.allowed.latency).", e.getCause().getMessage()); throw e; } finally { if (siddhiAppRuntime != null) { @@ -377,7 +389,9 @@ public void testSessionWindow10() { } catch (SiddhiAppCreationException e) { AssertJUnit.assertEquals("There is no parameterOverload for 'session' that matches attribute types " + - "'[LONG, LONG]'.", e.getCause().getMessage()); + "''. Supported parameter overloads are ( window.session), " + + "( window.session, window.key), ( window.session, " + + " window.key, window.allowed.latency).", e.getCause().getMessage()); throw e; } finally { if (siddhiAppRuntime != null) {