Skip to content

Commit 425ac63

Browse files
committed
Expose event-type in stream interface
1 parent d50b76b commit 425ac63

File tree

18 files changed

+570
-109
lines changed

18 files changed

+570
-109
lines changed
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.awssdk.codegen.poet.common;
17+
18+
import static software.amazon.awssdk.codegen.poet.PoetUtils.createEnumBuilder;
19+
import static software.amazon.awssdk.codegen.poet.PoetUtils.toStringBuilder;
20+
21+
import com.squareup.javapoet.ClassName;
22+
import com.squareup.javapoet.MethodSpec;
23+
import com.squareup.javapoet.ParameterizedTypeName;
24+
import com.squareup.javapoet.TypeSpec;
25+
import com.squareup.javapoet.TypeSpec.Builder;
26+
import java.util.Set;
27+
import java.util.stream.Collectors;
28+
import java.util.stream.Stream;
29+
import javax.lang.model.element.Modifier;
30+
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
31+
import software.amazon.awssdk.codegen.poet.ClassSpec;
32+
33+
public abstract class AbstractEnumClass implements ClassSpec {
34+
35+
private static final String VALUE = "value";
36+
private static final String UNKNOWN_TO_SDK_VERSION = "UNKNOWN_TO_SDK_VERSION";
37+
private final ShapeModel shape;
38+
39+
public AbstractEnumClass(ShapeModel shape) {
40+
this.shape = shape;
41+
}
42+
43+
@Override
44+
public final TypeSpec poetSpec() {
45+
Builder enumBuilder = createEnumBuilder(className())
46+
.addField(String.class, VALUE, Modifier.PRIVATE, Modifier.FINAL)
47+
.addMethod(toStringBuilder().addStatement("return $T.valueOf($N)", String.class, VALUE).build())
48+
.addMethod(fromValueSpec())
49+
.addMethod(knownValuesSpec())
50+
.addMethod(createConstructor());
51+
52+
addDeprecated(enumBuilder);
53+
addJavadoc(enumBuilder);
54+
addEnumConstants(enumBuilder);
55+
56+
enumBuilder.addEnumConstant(UNKNOWN_TO_SDK_VERSION, TypeSpec.anonymousClassBuilder("null").build());
57+
58+
return enumBuilder.build();
59+
}
60+
61+
protected final ShapeModel getShape() {
62+
return shape;
63+
}
64+
65+
protected abstract void addDeprecated(Builder enumBuilder);
66+
67+
protected abstract void addJavadoc(Builder enumBuilder);
68+
69+
protected abstract void addEnumConstants(Builder enumBuilder);
70+
71+
private MethodSpec createConstructor() {
72+
return MethodSpec.constructorBuilder()
73+
.addModifiers(Modifier.PRIVATE)
74+
.addParameter(String.class, VALUE)
75+
.addStatement("this.$1N = $1N", VALUE)
76+
.build();
77+
}
78+
79+
private MethodSpec fromValueSpec() {
80+
return MethodSpec.methodBuilder("fromValue")
81+
.returns(className())
82+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
83+
.addJavadoc("Use this in place of valueOf to convert the raw string returned by the service into the " +
84+
"enum value.\n\n" +
85+
"@param $N real value\n" +
86+
"@return $T corresponding to the value\n", VALUE, className())
87+
.addParameter(String.class, VALUE)
88+
.beginControlFlow("if ($N == null)", VALUE)
89+
.addStatement("return null")
90+
.endControlFlow()
91+
.addStatement("return $1T.of($2T.values())\n" +
92+
".filter(e -> e.toString().equals($3N))\n" +
93+
".findFirst()\n" +
94+
".orElse(UNKNOWN_TO_SDK_VERSION)",
95+
Stream.class,
96+
className(),
97+
VALUE)
98+
.build();
99+
}
100+
101+
private MethodSpec knownValuesSpec() {
102+
return MethodSpec.methodBuilder("knownValues")
103+
.returns(ParameterizedTypeName.get(ClassName.get(Set.class), className()))
104+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
105+
.addJavadoc("Use this in place of {@link #values()} to return a {@link Set} of all values known to the "
106+
+ "SDK.\n"
107+
+ "This will return all known enum values except {@link #$N}.\n\n"
108+
+ "@return a {@link $T} of known {@link $T}s", UNKNOWN_TO_SDK_VERSION, Set.class, className())
109+
.addStatement("return $T.of(values()).filter(v -> v != $N).collect($T.toSet())",
110+
Stream.class,
111+
UNKNOWN_TO_SDK_VERSION,
112+
Collectors.class)
113+
.build();
114+
}
115+
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/common/EnumClass.java

Lines changed: 16 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -15,108 +15,39 @@
1515

1616
package software.amazon.awssdk.codegen.poet.common;
1717

18-
import static software.amazon.awssdk.codegen.poet.PoetUtils.addDeprecated;
19-
import static software.amazon.awssdk.codegen.poet.PoetUtils.addJavadoc;
20-
import static software.amazon.awssdk.codegen.poet.PoetUtils.createEnumBuilder;
21-
import static software.amazon.awssdk.codegen.poet.PoetUtils.toStringBuilder;
22-
2318
import com.squareup.javapoet.ClassName;
24-
import com.squareup.javapoet.MethodSpec;
25-
import com.squareup.javapoet.ParameterizedTypeName;
2619
import com.squareup.javapoet.TypeSpec;
2720
import com.squareup.javapoet.TypeSpec.Builder;
28-
import java.util.Collections;
29-
import java.util.Set;
30-
import java.util.stream.Collectors;
31-
import java.util.stream.Stream;
32-
import javax.lang.model.element.Modifier;
3321
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
34-
import software.amazon.awssdk.codegen.poet.ClassSpec;
35-
import software.amazon.awssdk.codegen.poet.StaticImport;
36-
37-
public final class EnumClass implements ClassSpec {
22+
import software.amazon.awssdk.codegen.poet.PoetUtils;
3823

39-
private static final String VALUE = "value";
40-
private static final String UNKNOWN_TO_SDK_VERSION = "UNKNOWN_TO_SDK_VERSION";
41-
private final ShapeModel shape;
42-
private final ClassName className;
24+
public final class EnumClass extends AbstractEnumClass {
25+
private final String enumPackageName;
4326

4427
public EnumClass(String enumPackage, ShapeModel shape) {
45-
this.shape = shape;
46-
this.className = ClassName.get(enumPackage, shape.getShapeName());
28+
super(shape);
29+
this.enumPackageName = enumPackage;
4730
}
4831

4932
@Override
50-
public TypeSpec poetSpec() {
51-
Builder enumBuilder = createEnumBuilder(className)
52-
.addField(String.class, VALUE, Modifier.PRIVATE, Modifier.FINAL)
53-
.addMethod(toStringBuilder().addStatement("return $T.valueOf($N)", String.class, VALUE).build())
54-
.addMethod(fromValueSpec())
55-
.addMethod(knownValuesSpec())
56-
.addMethod(createConstructor());
57-
58-
addDeprecated(enumBuilder::addAnnotation, shape);
59-
addJavadoc(enumBuilder::addJavadoc, shape);
60-
61-
shape.getEnums().forEach(
62-
e -> enumBuilder.addEnumConstant(e.getName(), TypeSpec.anonymousClassBuilder("$S", e.getValue()).build())
63-
);
64-
enumBuilder.addEnumConstant(UNKNOWN_TO_SDK_VERSION, TypeSpec.anonymousClassBuilder("null").build());
65-
66-
return enumBuilder.build();
33+
protected void addDeprecated(Builder enumBuilder) {
34+
PoetUtils.addDeprecated(enumBuilder::addAnnotation, getShape());
6735
}
6836

6937
@Override
70-
public ClassName className() {
71-
return className;
38+
protected void addJavadoc(Builder enumBuilder) {
39+
PoetUtils.addJavadoc(enumBuilder::addJavadoc, getShape());
7240
}
7341

7442
@Override
75-
public Iterable<StaticImport> staticImports() {
76-
return Collections.singleton(StaticImport.staticMethodImport(Collectors.class, "toSet"));
77-
}
78-
79-
private MethodSpec createConstructor() {
80-
return MethodSpec.constructorBuilder()
81-
.addModifiers(Modifier.PRIVATE)
82-
.addParameter(String.class, VALUE)
83-
.addStatement("this.$1N = $1N", VALUE)
84-
.build();
85-
}
86-
87-
private MethodSpec fromValueSpec() {
88-
return MethodSpec.methodBuilder("fromValue")
89-
.returns(className)
90-
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
91-
.addJavadoc("Use this in place of valueOf to convert the raw string returned by the service into the " +
92-
"enum value.\n\n" +
93-
"@param $N real value\n" +
94-
"@return $T corresponding to the value\n", VALUE, className)
95-
.addParameter(String.class, VALUE)
96-
.beginControlFlow("if ($N == null)", VALUE)
97-
.addStatement("return null")
98-
.endControlFlow()
99-
.addStatement("return $1T.of($2T.values())\n" +
100-
".filter(e -> e.toString().equals($3N))\n" +
101-
".findFirst()\n" +
102-
".orElse(UNKNOWN_TO_SDK_VERSION)",
103-
Stream.class,
104-
className,
105-
VALUE)
106-
.build();
43+
protected void addEnumConstants(Builder enumBuilder) {
44+
getShape().getEnums().forEach(
45+
e -> enumBuilder.addEnumConstant(e.getName(), TypeSpec.anonymousClassBuilder("$S", e.getValue()).build())
46+
);
10747
}
10848

109-
private MethodSpec knownValuesSpec() {
110-
return MethodSpec.methodBuilder("knownValues")
111-
.returns(ParameterizedTypeName.get(ClassName.get(Set.class), className))
112-
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
113-
.addJavadoc("Use this in place of {@link #values()} to return a {@link Set} of all values known to the "
114-
+ "SDK.\n"
115-
+ "This will return all known enum values except {@link #$N}.\n\n"
116-
+ "@return a {@link $T} of known {@link $T}s", UNKNOWN_TO_SDK_VERSION, Set.class, className)
117-
.addStatement("return $T.of(values()).filter(v -> v != $N).collect(toSet())",
118-
Stream.class,
119-
UNKNOWN_TO_SDK_VERSION)
120-
.build();
49+
@Override
50+
public ClassName className() {
51+
return ClassName.get(enumPackageName, getShape().getShapeName());
12152
}
12253
}

codegen/src/main/java/software/amazon/awssdk/codegen/poet/eventstream/EventStreamUtils.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package software.amazon.awssdk.codegen.poet.eventstream;
1717

1818
import java.util.Collection;
19+
import java.util.List;
1920
import java.util.Objects;
2021
import java.util.Optional;
2122
import java.util.stream.Collectors;
@@ -95,6 +96,14 @@ public static Optional<ShapeModel> getBaseEventStreamShape(IntermediateModel mod
9596
.findFirst();
9697
}
9798

99+
public static List<ShapeModel> getBaseEventStreamShapes(IntermediateModel model, ShapeModel eventShape) {
100+
return model.getShapes().values()
101+
.stream()
102+
.filter(ShapeModel::isEventStream)
103+
.filter(s -> s.getMembers().stream().anyMatch(m -> m.getShape().equals(eventShape)))
104+
.collect(Collectors.toList());
105+
}
106+
98107
/**
99108
* Returns the stream of event members ('event: true') excluding exceptions
100109
* from the input event stream shape ('eventstream: true').
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.awssdk.codegen.poet.eventstream;
17+
18+
import com.squareup.javapoet.ClassName;
19+
import com.squareup.javapoet.TypeSpec;
20+
import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel;
21+
import software.amazon.awssdk.codegen.model.intermediate.ShapeModel;
22+
import software.amazon.awssdk.codegen.naming.NamingStrategy;
23+
import software.amazon.awssdk.codegen.poet.common.AbstractEnumClass;
24+
25+
public class EventTypeEnumSpec extends AbstractEnumClass {
26+
private final String enumPackageName;
27+
private final IntermediateModel intermediateModel;
28+
29+
public EventTypeEnumSpec(String enumPackageName, IntermediateModel intermediateModel, ShapeModel eventStream) {
30+
super(eventStream);
31+
this.enumPackageName = enumPackageName;
32+
this.intermediateModel = intermediateModel;
33+
}
34+
35+
@Override
36+
protected void addDeprecated(TypeSpec.Builder enumBuilder) {
37+
// no-op
38+
}
39+
40+
@Override
41+
protected void addJavadoc(TypeSpec.Builder enumBuilder) {
42+
enumBuilder.addJavadoc("The known possible types of events for {@code $N}.", getShape().getShapeName());
43+
}
44+
45+
@Override
46+
protected void addEnumConstants(TypeSpec.Builder enumBuilder) {
47+
NamingStrategy namingStrategy = intermediateModel.getNamingStrategy();
48+
getShape().getMembers().stream()
49+
.filter(m -> m.getShape().isEvent())
50+
.forEach(m -> {
51+
String value = m.getName();
52+
String name = namingStrategy.getEnumValueName(value);
53+
enumBuilder.addEnumConstant(name, TypeSpec.anonymousClassBuilder("$S", value).build());
54+
});
55+
}
56+
57+
@Override
58+
public ClassName className() {
59+
return ClassName.get(enumPackageName, "EventType");
60+
}
61+
}

0 commit comments

Comments
 (0)