diff --git a/.changes/next-release/feature-AWSSDKforJavav2-838b5da.json b/.changes/next-release/feature-AWSSDKforJavav2-838b5da.json new file mode 100644 index 000000000000..ee92635c8be6 --- /dev/null +++ b/.changes/next-release/feature-AWSSDKforJavav2-838b5da.json @@ -0,0 +1,6 @@ +{ + "type": "feature", + "category": "AWS SDK for Java v2", + "contributor": "", + "description": "Convert codegen exceptions caused by bad customization config or invalid models to ModelInvalidException." +} diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/naming/DefaultNamingStrategy.java b/codegen/src/main/java/software/amazon/awssdk/codegen/naming/DefaultNamingStrategy.java index d56469a58799..8e16f6b3e67e 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/naming/DefaultNamingStrategy.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/naming/DefaultNamingStrategy.java @@ -43,9 +43,12 @@ import software.amazon.awssdk.codegen.model.intermediate.Metadata; import software.amazon.awssdk.codegen.model.service.ServiceModel; import software.amazon.awssdk.codegen.model.service.Shape; +import software.amazon.awssdk.codegen.validation.ModelInvalidException; +import software.amazon.awssdk.codegen.validation.ValidationEntry; +import software.amazon.awssdk.codegen.validation.ValidationErrorId; +import software.amazon.awssdk.codegen.validation.ValidationErrorSeverity; import software.amazon.awssdk.utils.Logger; import software.amazon.awssdk.utils.StringUtils; -import software.amazon.awssdk.utils.Validate; /** * Default implementation of naming strategy respecting. @@ -498,17 +501,35 @@ private void validateCustomerVisibleName(String name, String location) { UnderscoresInNameBehavior behavior = customizationConfig.getUnderscoresInNameBehavior(); String supportedBehaviors = Arrays.toString(UnderscoresInNameBehavior.values()); - Validate.notNull(behavior, - "Encountered a name or identifier that the customer will see (%s in the %s) with an underscore. " - + "This isn't idiomatic in Java. Please either remove the underscores or apply the " - + "'underscoresInNameBehavior' customization for this service (Supported " - + "'underscoresInNameBehavior' values: %s).", name, location, supportedBehaviors); - Validate.isTrue(behavior == UnderscoresInNameBehavior.ALLOW, - "Unsupported underscoresInShapeNameBehavior: %s. Supported values: %s", behavior, supportedBehaviors); + if (behavior == null) { + throw ModelInvalidException.fromEntry(ValidationEntry.create( + ValidationErrorId.INVALID_IDENTIFIER_NAME, + ValidationErrorSeverity.DANGER, + String.format( + "Encountered a name or identifier that the customer will see (%s in the %s) with an underscore. " + + "This isn't idiomatic in Java. Please either remove the underscores", + name, location, supportedBehaviors) + )); + } + if (behavior != UnderscoresInNameBehavior.ALLOW) { + throw ModelInvalidException.fromEntry(ValidationEntry.create( + ValidationErrorId.INVALID_CODEGEN_CUSTOMIZATION, + ValidationErrorSeverity.DANGER, + String.format( + "Unsupported underscoresInShapeNameBehavior: %s. Supported values: %s", + behavior, supportedBehaviors) + )); + } } - Validate.isTrue(VALID_IDENTIFIER_NAME.matcher(name).matches(), - "Encountered a name or identifier that is invalid within Java (%s in %s). Please remove invalid " - + "characters.", name, location); + if (!VALID_IDENTIFIER_NAME.matcher(name).matches()) { + throw ModelInvalidException.fromEntry(ValidationEntry.create( + ValidationErrorId.INVALID_IDENTIFIER_NAME, + ValidationErrorSeverity.DANGER, + String.format( + "Encountered a name or identifier that is invalid within Java (%s in %s). Please remove invalid " + + "characters.", name, location) + )); + } } } \ No newline at end of file diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/paginators/PaginatorsClassSpec.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/paginators/PaginatorsClassSpec.java index 8312100b6de8..1cf8ff50340f 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/paginators/PaginatorsClassSpec.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/paginators/PaginatorsClassSpec.java @@ -34,6 +34,10 @@ import software.amazon.awssdk.codegen.poet.ClassSpec; import software.amazon.awssdk.codegen.poet.PoetExtension; import software.amazon.awssdk.codegen.poet.model.TypeProvider; +import software.amazon.awssdk.codegen.validation.ModelInvalidException; +import software.amazon.awssdk.codegen.validation.ValidationEntry; +import software.amazon.awssdk.codegen.validation.ValidationErrorId; +import software.amazon.awssdk.codegen.validation.ValidationErrorSeverity; import software.amazon.awssdk.core.util.PaginatorUtils; public abstract class PaginatorsClassSpec implements ClassSpec { @@ -64,7 +68,12 @@ public PaginatorsClassSpec(IntermediateModel model, String c2jOperationName, Pag this.typeProvider = new TypeProvider(model); this.operationModel = model.getOperation(c2jOperationName); if (operationModel == null) { - throw new IllegalArgumentException("The service model does not model an operation '" + c2jOperationName + "'"); + throw ModelInvalidException.fromEntry(ValidationEntry.create( + ValidationErrorId.UNKNOWN_OPERATION, + ValidationErrorSeverity.DANGER, + "Invalid paginator definition - The service model does not model the referenced operation '" + + c2jOperationName + "'" + )); } this.paginationDocs = new PaginationDocs(model, operationModel, paginatorDefinition); } diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/validation/ValidationErrorId.java b/codegen/src/main/java/software/amazon/awssdk/codegen/validation/ValidationErrorId.java index 2952cf444902..cfb22c85ac31 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/validation/ValidationErrorId.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/validation/ValidationErrorId.java @@ -24,8 +24,9 @@ public enum ValidationErrorId { REQUEST_URI_NOT_FOUND("The request URI does not exist."), INVALID_CODEGEN_CUSTOMIZATION("A customization is enabled for this service that cannot be applied for the given service " - + "model.") - ; + + "model."), + UNKNOWN_OPERATION("The model references an unknown operation."), + INVALID_IDENTIFIER_NAME("The model contains an invalid or non-idiomatic name or identifier."); private final String description; diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/paginators/PaginatorsClassSpecTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/paginators/PaginatorsClassSpecTest.java index 9aefa55086bd..df529d767c77 100644 --- a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/paginators/PaginatorsClassSpecTest.java +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/paginators/PaginatorsClassSpecTest.java @@ -23,6 +23,7 @@ import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; import software.amazon.awssdk.codegen.model.service.PaginatorDefinition; import software.amazon.awssdk.codegen.poet.ClientTestModels; +import software.amazon.awssdk.codegen.validation.ModelInvalidException; public class PaginatorsClassSpecTest { @Test @@ -30,8 +31,9 @@ public void constructor_unknownOperationName_throws() { assertThatThrownBy(() -> new TestPaginatorSpec(ClientTestModels.awsJsonServiceModels(), "~~DoesNotExist", new PaginatorDefinition())) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("The service model does not model an operation '~~DoesNotExist'"); + .isInstanceOf(ModelInvalidException.class) + .hasMessageContaining("Invalid paginator definition - " + + "The service model does not model the referenced operation '~~DoesNotExist'"); } private static class TestPaginatorSpec extends PaginatorsClassSpec {