Skip to content

Commit 0dd9a6c

Browse files
committed
Prefer ID for hasTrait lookups
This commit updates all calls to `hasTrait` from using Class based lookups to use ID based lookups. Traits are stored on a Shape in a ShapeId-keyed map. Using this will be faster than testing values via `isInstance`. The lookup for `hasTrait(ShapeId)` is also updated to do a simple `containsKey` check on the map. This eliminates using `findTrait` which creates an intermediate `Optional` only to throw it away.
1 parent d251381 commit 0dd9a6c

File tree

158 files changed

+558
-441
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

158 files changed

+558
-441
lines changed

buildSrc/src/main/kotlin/smithy.profiling-conventions.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,8 @@ tasks {
1111
duplicatesStrategy = DuplicatesStrategy.WARN
1212
}
1313
}
14+
15+
// We don't need to lint benchmarks.
16+
tasks.findByName("spotbugsJmh")?.apply {
17+
enabled = false
18+
}

smithy-aws-apigateway-openapi/src/main/java/software/amazon/smithy/aws/apigateway/openapi/AddRequestValidators.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ public OpenApi after(Context<? extends Trait> context, OpenApi openapi) {
7777

7878
// Check if the service has a request validator.
7979
String serviceValidator = null;
80-
if (context.getService().getTrait(RequestValidatorTrait.class).isPresent()) {
81-
serviceValidator = context.getService().getTrait(RequestValidatorTrait.class).get().getValue();
80+
if (context.getService().hasTrait(RequestValidatorTrait.ID)) {
81+
serviceValidator = context.getService().expectTrait(RequestValidatorTrait.class).getValue();
8282
validators.add(serviceValidator);
8383
}
8484

smithy-aws-cloudformation-traits/src/main/java/software/amazon/smithy/aws/cloudformation/traits/CfnResourceIndex.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ private Set<Mutability> getDefaultIdentifierMutabilities(ResourceShape resource)
237237
private List<Map<String, ShapeId>> computeResourceAdditionalIdentifiers(StructureShape readInput) {
238238
List<Map<String, ShapeId>> identifiers = new ArrayList<>();
239239
for (MemberShape member : readInput.members()) {
240-
if (!member.hasTrait(CfnAdditionalIdentifierTrait.class)) {
240+
if (!member.hasTrait(CfnAdditionalIdentifierTrait.ID)) {
241241
continue;
242242
}
243243

smithy-aws-cloudformation-traits/src/test/java/software/amazon/smithy/aws/cloudformation/traits/CfnResourceTraitTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,20 @@ public void loadsFromModel() {
2626
.unwrap();
2727

2828
Shape fooResource = result.expectShape(ShapeId.from("smithy.example#FooResource"));
29-
assertTrue(fooResource.hasTrait(CfnResourceTrait.class));
29+
assertTrue(fooResource.hasTrait(CfnResourceTrait.ID));
3030
CfnResourceTrait fooTrait = fooResource.expectTrait(CfnResourceTrait.class);
3131
assertFalse(fooTrait.getName().isPresent());
3232
assertTrue(fooTrait.getAdditionalSchemas().isEmpty());
3333

3434
Shape barResource = result.expectShape(ShapeId.from("smithy.example#BarResource"));
35-
assertTrue(barResource.hasTrait(CfnResourceTrait.class));
35+
assertTrue(barResource.hasTrait(CfnResourceTrait.ID));
3636
CfnResourceTrait barTrait = barResource.expectTrait(CfnResourceTrait.class);
3737
assertThat(barTrait.getName().get(), equalTo("CustomResource"));
3838
assertFalse(barTrait.getAdditionalSchemas().isEmpty());
3939
assertThat(barTrait.getAdditionalSchemas(), contains(ShapeId.from("smithy.example#ExtraBarRequest")));
4040

4141
Shape tadResource = result.expectShape(ShapeId.from("smithy.example#TadResource"));
42-
assertTrue(tadResource.hasTrait(CfnResourceTrait.class));
42+
assertTrue(tadResource.hasTrait(CfnResourceTrait.ID));
4343
CfnResourceTrait tadTrait = tadResource.expectTrait(CfnResourceTrait.class);
4444
assertFalse(tadTrait.getName().isPresent());
4545
assertTrue(tadTrait.getAdditionalSchemas().isEmpty());

smithy-aws-cloudformation/src/main/java/software/amazon/smithy/aws/cloudformation/schema/fromsmithy/CfnConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ private List<ConversionEnvironment> createConversionEnvironments(Model model) {
166166
// Create an environment for each of the resources to be converted with.
167167
List<ConversionEnvironment> environments = new ArrayList<>();
168168
for (ResourceShape resourceShape : resourceShapes) {
169-
if (resourceShape.getTrait(CfnResourceTrait.class).isPresent()) {
169+
if (resourceShape.hasTrait(CfnResourceTrait.ID)) {
170170
ConversionEnvironment environment = createConversionEnvironment(model, serviceShape, resourceShape);
171171
environments.add(environment);
172172
}

smithy-aws-cloudformation/src/main/java/software/amazon/smithy/aws/cloudformation/schema/fromsmithy/mappers/HandlerPermissionMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public void before(Context context, ResourceSchema.Builder resourceSchema) {
5656
.orElse(SetUtils.of());
5757
createPermissions.addAll(putPermissions);
5858
// Put operations without the noReplace trait are used for updates.
59-
if (!resource.hasTrait(NoReplaceTrait.class)) {
59+
if (!resource.hasTrait(NoReplaceTrait.ID)) {
6060
updatePermissions.addAll(putPermissions);
6161
}
6262

smithy-aws-cloudformation/src/main/java/software/amazon/smithy/aws/cloudformation/schema/fromsmithy/mappers/TaggingMapper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public static void injectTagsMember(
4343
StructureShape.Builder builder
4444
) {
4545
String tagMemberName = getTagMemberName(config, resource);
46-
if (resource.hasTrait(TaggableTrait.class)) {
46+
if (resource.hasTrait(TaggableTrait.ID)) {
4747
AwsTagIndex tagIndex = AwsTagIndex.of(model);
4848
TaggableTrait trait = resource.expectTrait(TaggableTrait.class);
4949
CfnResourceIndex resourceIndex = CfnResourceIndex.of(model);
@@ -68,7 +68,7 @@ public static void injectTagsMember(
6868
@Override
6969
public ResourceSchema after(Context context, ResourceSchema resourceSchema) {
7070
ResourceShape resourceShape = context.getResource();
71-
if (!resourceShape.hasTrait(TaggableTrait.class)) {
71+
if (!resourceShape.hasTrait(TaggableTrait.ID)) {
7272
return resourceSchema;
7373
}
7474

smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeysIndex.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,8 @@ private void compute(
174174

175175
// Continue recursing into resources and computing keys.
176176
subject.asResourceShape().ifPresent(resource -> {
177-
boolean disableConditionKeyInference = resource.hasTrait(DisableConditionKeyInferenceTrait.class)
178-
|| service.hasTrait(DisableConditionKeyInferenceTrait.class);
177+
boolean disableConditionKeyInference = resource.hasTrait(DisableConditionKeyInferenceTrait.ID)
178+
|| service.hasTrait(DisableConditionKeyInferenceTrait.ID);
179179

180180
// Add any inferred resource identifiers to the resource and to the service-wide definitions.
181181
Map<String, String> childIdentifiers = !disableConditionKeyInference
@@ -218,7 +218,7 @@ private Map<String, String> inferChildResourceIdentifiers(
218218
// Only infer identifiers introduced by a child. Children should
219219
// use their parent identifiers and not duplicate them.
220220
ConditionKeyDefinition.Builder builder = ConditionKeyDefinition.builder();
221-
if (shape.hasTrait(ArnReferenceTrait.class)) {
221+
if (shape.hasTrait(ArnReferenceTrait.ID)) {
222222
// Use an ARN type if the targeted shape has the arnReference trait.
223223
builder.type(ARN_TYPE);
224224
} else {

smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/ConditionKeysValidator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ public List<ValidationEvent> validate(Model model) {
4040
OperationIndex operationIndex = OperationIndex.of(model);
4141

4242
return model.shapes(ServiceShape.class)
43-
.filter(service -> service.hasTrait(ServiceTrait.class))
43+
.filter(service -> service.hasTrait(ServiceTrait.ID))
4444
.flatMap(service -> {
4545
List<ValidationEvent> results = new ArrayList<>();
4646
Set<String> knownKeys = conditionIndex.getDefinedConditionKeys(service).keySet();
4747
Set<String> serviceResolvedKeys = Collections.emptySet();
4848

49-
if (service.hasTrait(ServiceResolvedConditionKeysTrait.class)) {
49+
if (service.hasTrait(ServiceResolvedConditionKeysTrait.ID)) {
5050
ServiceResolvedConditionKeysTrait trait =
5151
service.expectTrait(ServiceResolvedConditionKeysTrait.class);
5252
//assign so we can compare against condition key values for any intersection
@@ -83,7 +83,7 @@ public List<ValidationEvent> validate(Model model) {
8383
}
8484

8585
for (MemberShape memberShape : operationIndex.getInputMembers(operation).values()) {
86-
if (memberShape.hasTrait(ConditionKeyValueTrait.class)) {
86+
if (memberShape.hasTrait(ConditionKeyValueTrait.ID)) {
8787
ConditionKeyValueTrait trait = memberShape.expectTrait(ConditionKeyValueTrait.class);
8888
String conditionKey = trait.getValue();
8989
if (!knownKeys.contains(conditionKey)) {

smithy-aws-iam-traits/src/main/java/software/amazon/smithy/aws/iam/traits/IamResourceTraitValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public List<ValidationEvent> validate(Model model) {
2828
for (ResourceShape resource : model.getResourceShapesWithTrait(IamResourceTrait.class)) {
2929
// If the resource has both the IamResourceTrait and Arn trait,
3030
// check that the resource name is consistent between the two traits
31-
if (resource.hasTrait(ArnTrait.class)) {
31+
if (resource.hasTrait(ArnTrait.ID)) {
3232
String resourceName = resource.expectTrait(IamResourceTrait.class)
3333
.getName()
3434
.orElseGet(() -> StringUtils.lowerCase(resource.getId().getName()));

0 commit comments

Comments
 (0)