From 341fcd48db5e0a2e3e8c09314b8f8d452e1c86c3 Mon Sep 17 00:00:00 2001 From: Tim203 Date: Sun, 25 Aug 2024 00:47:31 +0200 Subject: [PATCH] Actually validate supported projection categories --- .../processor/action/Action.java | 2 +- .../processor/query/QueryContextCreator.java | 33 ++++++++++--------- .../query/section/by/InputKeyword.java | 20 +++++------ 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/ap/src/main/java/org/geysermc/databaseutils/processor/action/Action.java b/ap/src/main/java/org/geysermc/databaseutils/processor/action/Action.java index 1ddd7c9..eecb16f 100644 --- a/ap/src/main/java/org/geysermc/databaseutils/processor/action/Action.java +++ b/ap/src/main/java/org/geysermc/databaseutils/processor/action/Action.java @@ -61,7 +61,7 @@ public boolean supportsFilter() { return supportsFilter; } - public List unsupportedProjectionCategories() { + public List supportedProjectionCategories() { return supportedProjectionCategories; } diff --git a/ap/src/main/java/org/geysermc/databaseutils/processor/query/QueryContextCreator.java b/ap/src/main/java/org/geysermc/databaseutils/processor/query/QueryContextCreator.java index 5e8bd95..644ede6 100644 --- a/ap/src/main/java/org/geysermc/databaseutils/processor/query/QueryContextCreator.java +++ b/ap/src/main/java/org/geysermc/databaseutils/processor/query/QueryContextCreator.java @@ -12,7 +12,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.VariableElement; import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeMirror; import org.checkerframework.checker.nullness.qual.NonNull; @@ -77,12 +76,6 @@ public QueryContext create() { } private ParametersTypeInfo analyseValidateAndCreate() { - var parameterTypes = - element.getParameters().stream().map(VariableElement::asType).toList(); - var parameterNames = element.getParameters().stream() - .map(VariableElement::getSimpleName) - .toList(); - var hasColumnParameter = readResult.projection() != null && readResult.projection().columnName() != null && action.projectionColumnIsParameter(); @@ -101,6 +94,15 @@ private ParametersTypeInfo analyseValidateAndCreate() { } var category = projection.keyword().category(); + if (!action.supportedProjectionCategories().contains(category)) { + if (action.supportedProjectionCategories().isEmpty()) { + throw new InvalidRepositoryException( + "Action %s doesn't support projection", action.actionType()); + } + throw new InvalidRepositoryException( + "Action %s doesn't support projection category %s", + action.actionType(), category.toString()); + } if (!handledCategories.add(category)) { throw new InvalidRepositoryException( "You can only provide one keyword of category %s, also got %s", @@ -122,7 +124,7 @@ private ParametersTypeInfo analyseValidateAndCreate() { validateColumnNames( readResult.bySection().factors(), SectionType.BY, (VariableByFactor input, ColumnInfo column) -> { var keyword = input.keyword(); - keyword.validateTypes(column, parameterTypes, parameterNames, handledInputs.get(), typeUtils); + keyword.validateTypes(column, element.getParameters(), handledInputs.get(), typeUtils); handledInputs.addAndGet(keyword.inputCount()); }); } @@ -134,8 +136,10 @@ private ParametersTypeInfo analyseValidateAndCreate() { ($, $$) -> handledInputs.incrementAndGet()); } + var parameterCount = element.getParameters().size(); + // if there is no By section and there are parameters, it should be the entity or the provided projection - if (readResult.bySection() == null && parameterTypes.size() == 1) { + if (readResult.bySection() == null && parameterCount == 1) { if (parameterInfo.isAnySelf() && !action.allowSelfParameter()) { throw new InvalidRepositoryException( "Action %s (for %s) doesn't support entity as parameter!", @@ -167,9 +171,8 @@ private ParametersTypeInfo analyseValidateAndCreate() { } // Otherwise the expected parameter count should equal the actual - if (parameterTypes.size() != handledInputs.get()) { - throw new IllegalStateException( - "Expected %s parameters, received %s".formatted(handledInputs, parameterTypes)); + if (parameterCount != handledInputs.get()) { + throw new InvalidRepositoryException("Expected %s parameters, received %s", handledInputs, parameterCount); } return parameterInfo; } @@ -181,8 +184,8 @@ private void validateColumnNames( if (factor instanceof VariableFactor variable) { var column = info.columnFor(variable.columnName()); if (column == null) { - throw new IllegalStateException( - "Could not find column %s for entity %s".formatted(variable.columnName(), info.name())); + throw new InvalidRepositoryException( + "Could not find column %s for entity %s", variable.columnName(), info.name()); } variableLast = true; if (customValidation != null) { @@ -195,7 +198,7 @@ private void validateColumnNames( } if (!variableLast) { - throw new IllegalStateException("Cannot end a section (%s) with a factor!".formatted(type)); + throw new InvalidRepositoryException("Cannot end a section (%s) with a factor!", type); } } } diff --git a/ap/src/main/java/org/geysermc/databaseutils/processor/query/section/by/InputKeyword.java b/ap/src/main/java/org/geysermc/databaseutils/processor/query/section/by/InputKeyword.java index 88adf7f..7059b19 100644 --- a/ap/src/main/java/org/geysermc/databaseutils/processor/query/section/by/InputKeyword.java +++ b/ap/src/main/java/org/geysermc/databaseutils/processor/query/section/by/InputKeyword.java @@ -8,7 +8,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import javax.lang.model.type.TypeMirror; +import javax.lang.model.element.VariableElement; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.databaseutils.processor.info.ColumnInfo; import org.geysermc.databaseutils.processor.util.CollectionUtils; @@ -32,20 +32,16 @@ public int inputCount() { } public void validateTypes( - ColumnInfo column, - List inputTypes, - List inputNames, - int typeOffset, - TypeUtils typeUtils) { - - if (typeOffset + inputCount() > inputTypes.size()) { - throw new IllegalStateException(String.format( - "Expected (at least) %s inputs, got %s", typeOffset + inputCount(), inputTypes.size())); + ColumnInfo column, List inputs, int offset, TypeUtils typeUtils) { + if (offset + inputCount() > inputs.size()) { + throw new IllegalStateException( + String.format("Expected (at least) %s inputs, got %s", offset + inputCount(), inputs.size())); } for (int i = 0; i < inputCount(); i++) { - var type = inputTypes.get(typeOffset + i); - var name = inputNames.get(typeOffset + i); + var input = inputs.get(offset + i); + var type = input.asType(); + var name = input.getSimpleName(); if (!typeUtils.isAssignable(column.typeName(), type)) { throw new IllegalStateException(String.format(