Skip to content

Commit 4809a02

Browse files
Subscription moved to MP
Signed-off-by: Phillip Kruger <phillip.kruger@gmail.com>
1 parent 54761ce commit 4809a02

25 files changed

Lines changed: 115 additions & 50 deletions

File tree

client/implementation/src/main/java/io/smallrye/graphql/client/impl/typesafe/reflection/MethodInvocation.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.eclipse.microprofile.graphql.Query;
2626

2727
import io.smallrye.graphql.api.Namespace;
28-
import io.smallrye.graphql.api.Subscription;
2928
import io.smallrye.graphql.client.core.OperationType;
3029
import io.smallrye.graphql.client.model.MethodKey;
3130
import io.smallrye.graphql.client.typesafe.api.Multiple;
@@ -67,7 +66,8 @@ public OperationType getOperationType() {
6766
if (method.isAnnotationPresent(Mutation.class)) {
6867
return OperationType.MUTATION;
6968
}
70-
if (method.isAnnotationPresent(Subscription.class)) {
69+
if (method.isAnnotationPresent(org.eclipse.microprofile.graphql.Subscription.class)
70+
|| method.isAnnotationPresent(io.smallrye.graphql.api.Subscription.class)) {
7171
return OperationType.SUBSCRIPTION;
7272
}
7373
return OperationType.QUERY;
@@ -99,9 +99,18 @@ private Optional<String> mutationName() {
9999
}
100100

101101
private Optional<String> subscriptionName() {
102-
Subscription annotation = method.getAnnotation(Subscription.class);
103-
if (annotation != null && !annotation.value().isEmpty())
104-
return Optional.of(annotation.value());
102+
// Check MicroProfile annotation first (preferred)
103+
org.eclipse.microprofile.graphql.Subscription mpAnnotation = method
104+
.getAnnotation(org.eclipse.microprofile.graphql.Subscription.class);
105+
if (mpAnnotation != null && !mpAnnotation.value().isEmpty())
106+
return Optional.of(mpAnnotation.value());
107+
108+
// Fall back to deprecated SmallRye annotation
109+
io.smallrye.graphql.api.Subscription srAnnotation = method
110+
.getAnnotation(io.smallrye.graphql.api.Subscription.class);
111+
if (srAnnotation != null && !srAnnotation.value().isEmpty())
112+
return Optional.of(srAnnotation.value());
113+
105114
return Optional.empty();
106115
}
107116

client/model-builder/src/main/java/io/smallrye/graphql/client/modelbuilder/Annotations.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,7 @@ private static Map<DotName, AnnotationInstance> getAnnotationsWithFilter(Type ty
542542
.createSimple("io.smallrye.graphql.client.typesafe.api.GraphQLClientApi");
543543
public static final DotName QUERY = DotName.createSimple("org.eclipse.microprofile.graphql.Query");
544544
public static final DotName MUTATION = DotName.createSimple("org.eclipse.microprofile.graphql.Mutation");
545+
public static final DotName SUBSCRIPTION = DotName.createSimple("org.eclipse.microprofile.graphql.Subscription");
545546
public static final DotName INPUT = DotName.createSimple("org.eclipse.microprofile.graphql.Input");
546547
public static final DotName TYPE = DotName.createSimple("org.eclipse.microprofile.graphql.Type");
547548
public static final DotName INTERFACE = DotName.createSimple("org.eclipse.microprofile.graphql.Interface");

client/model-builder/src/main/java/io/smallrye/graphql/client/modelbuilder/helper/OperationModel.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import static io.smallrye.graphql.client.modelbuilder.Annotations.NAMESPACE;
77
import static io.smallrye.graphql.client.modelbuilder.Annotations.QUERY;
88
import static io.smallrye.graphql.client.modelbuilder.Annotations.SUBCRIPTION;
9+
import static io.smallrye.graphql.client.modelbuilder.Annotations.SUBSCRIPTION;
910
import static io.smallrye.graphql.client.modelbuilder.ScanningContext.getIndex;
1011
import static java.util.stream.Collectors.joining;
1112
import static java.util.stream.Collectors.toList;
@@ -201,7 +202,7 @@ public OperationType getOperationType() {
201202
if (method.hasAnnotation(MUTATION)) {
202203
return OperationType.MUTATION;
203204
}
204-
if (method.hasAnnotation(SUBCRIPTION)) {
205+
if (method.hasAnnotation(SUBSCRIPTION) || method.hasAnnotation(SUBCRIPTION)) {
205206
return OperationType.SUBSCRIPTION;
206207
}
207208
return OperationType.QUERY;
@@ -236,14 +237,22 @@ public Optional<String> mutationName() {
236237
}
237238

238239
/**
239-
* Gets the name of the GraphQL subscription, considering any io.smallrye.graphql.api.Subscription annotation.
240+
* Gets the name of the GraphQL subscription, considering any @Subscription annotation
241+
* (either org.eclipse.microprofile.graphql.Subscription or io.smallrye.graphql.api.Subscription).
240242
*
241243
* @return An optional containing the subscription name if specified, otherwise empty.
242244
*/
243245
public Optional<String> subscriptionName() {
244-
Optional<AnnotationInstance> subscriptionAnnotation = getMethodAnnotation(SUBCRIPTION);
246+
// Check MicroProfile annotation first (preferred)
247+
Optional<AnnotationInstance> subscriptionAnnotation = getMethodAnnotation(SUBSCRIPTION);
245248
if (subscriptionAnnotation.isPresent() && subscriptionAnnotation.orElseThrow().value() != null)
246249
return Optional.of(subscriptionAnnotation.orElseThrow().value().asString());
250+
251+
// Fall back to deprecated SmallRye annotation
252+
subscriptionAnnotation = getMethodAnnotation(SUBCRIPTION);
253+
if (subscriptionAnnotation.isPresent() && subscriptionAnnotation.orElseThrow().value() != null)
254+
return Optional.of(subscriptionAnnotation.orElseThrow().value().asString());
255+
247256
return Optional.empty();
248257
}
249258

common/schema-builder/src/main/java/io/smallrye/graphql/schema/Annotations.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,7 @@ private static Map<DotName, AnnotationInstance> getAnnotationsWithFilter(org.jbo
604604
public static final DotName GRAPHQL_API = DotName.createSimple("org.eclipse.microprofile.graphql.GraphQLApi");
605605
public static final DotName QUERY = DotName.createSimple("org.eclipse.microprofile.graphql.Query");
606606
public static final DotName MUTATION = DotName.createSimple("org.eclipse.microprofile.graphql.Mutation");
607+
public static final DotName SUBSCRIPTION = DotName.createSimple("org.eclipse.microprofile.graphql.Subscription");
607608
public static final DotName INPUT = DotName.createSimple("org.eclipse.microprofile.graphql.Input");
608609
public static final DotName TYPE = DotName.createSimple("org.eclipse.microprofile.graphql.Type");
609610
public static final DotName INTERFACE = DotName.createSimple("org.eclipse.microprofile.graphql.Interface");

common/schema-builder/src/main/java/io/smallrye/graphql/schema/Classes.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ private static boolean isAsyncType(Type type) {
156156
|| type.name().equals(COMPLETION_STAGE)
157157
|| type.name().equals(UNI)
158158
|| type.name().equals(MULTI)
159-
|| type.name().equals(PUBLISHER);
159+
|| type.name().equals(PUBLISHER)
160+
|| type.name().equals(FLOW_PUBLISHER);
160161
}
161162

162163
/**
@@ -267,6 +268,8 @@ public static boolean isUnwrappedType(Type type) {
267268
private static final DotName MULTI = DotName.createSimple("io.smallrye.mutiny.Multi");
268269
@Deprecated
269270
private static final DotName PUBLISHER = DotName.createSimple("org.reactivestreams.Publisher");
271+
@Deprecated
272+
private static final DotName FLOW_PUBLISHER = DotName.createSimple("java.util.concurrent.Flow$Publisher");
270273

271274
public static final DotName SERIALIZABLE = DotName.createSimple(Serializable.class.getName());
272275
public static final DotName OBJECT = DotName.createSimple(Object.class.getName());

common/schema-builder/src/main/java/io/smallrye/graphql/schema/SchemaBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ private void validateSubscriptions(Collection<AnnotationInstance> graphQLApiAnno
207207
List<MethodInfo> methods = getAllMethodsIncludingFromSuperClasses(apiClass);
208208
for (MethodInfo methodInfo : methods) {
209209
Annotations annotationsForMethod = Annotations.getAnnotationsForMethod(methodInfo);
210-
if (annotationsForMethod.containsOneOfTheseAnnotations(Annotations.SUBCRIPTION)) {
210+
if (annotationsForMethod.containsOneOfTheseAnnotations(Annotations.SUBSCRIPTION, Annotations.SUBCRIPTION)) {
211211
errors.add("class: " + apiClass.name().toString() + ", method: " + methodInfo.name());
212212
}
213213
}
@@ -450,7 +450,7 @@ private void addOperations(Schema schema, List<MethodInfo> methodInfoList) {
450450
} else if (annotationsForMethod.containsOneOfTheseAnnotations(Annotations.MUTATION)) {
451451
Operation mutation = operationCreator.createOperation(methodInfo, OperationType.MUTATION, null);
452452
schema.addMutation(mutation);
453-
} else if (annotationsForMethod.containsOneOfTheseAnnotations(Annotations.SUBCRIPTION)) {
453+
} else if (annotationsForMethod.containsOneOfTheseAnnotations(Annotations.SUBSCRIPTION, Annotations.SUBCRIPTION)) {
454454
Operation subscription = operationCreator.createOperation(methodInfo, OperationType.SUBSCRIPTION, null);
455455
schema.addSubscription(subscription);
456456
}

common/schema-builder/src/main/java/io/smallrye/graphql/schema/creator/OperationCreator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ private static DotName getOperationAnnotation(OperationType operationType) {
339339
case MUTATION:
340340
return Annotations.MUTATION;
341341
case SUBSCRIPTION:
342-
return Annotations.SUBCRIPTION;
342+
return Annotations.SUBSCRIPTION; // Also supports deprecated Annotations.SUBCRIPTION
343343
case RESOLVER:
344344
return Annotations.RESOLVER;
345345
default:

pom.xml

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
<properties>
1919
<version.eclipse.microprofile.config>3.1</version.eclipse.microprofile.config>
2020
<version.eclipse.microprofile.graphql>2.1-SNAPSHOT</version.eclipse.microprofile.graphql>
21-
<!-- <version.eclipse.microprofile.graphql-client>2.1-SNAPSHOT</version.eclipse.microprofile.graphql-client>-->
2221
<version.eclipse.microprofile.context-propagation>1.3</version.eclipse.microprofile.context-propagation>
2322
<version.jandex>3.5.3</version.jandex>
2423
<version.smallrye-config>3.16.0</version.smallrye-config>
@@ -35,7 +34,7 @@
3534
<version.jakarta.servlet>6.0.0</version.jakarta.servlet>
3635
<version.jakarta.websocket>2.0.0</version.jakarta.websocket>
3736
<version.graphql-java-federation>5.5.0</version.graphql-java-federation>
38-
<version.graphql-java>25.0</version.graphql-java>
37+
<version.graphql-java>25.0</version.graphql-java>
3938
<version.extended-scalars>24.0</version.extended-scalars>
4039
<version.io.micrometer>1.16.2</version.io.micrometer>
4140
<version.vertx>4.5.24</version.vertx>
@@ -108,19 +107,6 @@
108107
</exclusions>
109108
</dependency>
110109

111-
<!-- Client API is copied into SmallRye for now -->
112-
<!-- <dependency>
113-
<groupId>org.eclipse.microprofile.graphql</groupId>
114-
<artifactId>microprofile-graphql-client-api</artifactId>
115-
<version>${version.eclipse.microprofile.graphql-client}</version>
116-
</dependency>
117-
118-
<dependency>
119-
<groupId>org.eclipse.microprofile.graphql</groupId>
120-
<artifactId>microprofile-graphql-client-tck</artifactId>
121-
<version>${version.eclipse.microprofile.graphql-client}</version>
122-
</dependency>
123-
-->
124110
<dependency>
125111
<groupId>org.eclipse.microprofile.graphql</groupId>
126112
<artifactId>microprofile-graphql-tck</artifactId>

server/api/src/main/java/io/smallrye/graphql/api/Subscription.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,12 @@
4646
* stockQuote(stockCode: string): [Stock]
4747
* }
4848
* </pre>
49+
*
50+
* @deprecated Use {@link org.eclipse.microprofile.graphql.Subscription} instead.
51+
* This annotation has been added to the MicroProfile GraphQL specification
52+
* and this SmallRye-specific version will be removed in a future release.
4953
*/
54+
@java.lang.Deprecated(since = "2.2", forRemoval = true)
5055
@Target(ElementType.METHOD)
5156
@Retention(RetentionPolicy.RUNTIME)
5257
@Documented

server/implementation/src/main/java/io/smallrye/graphql/bootstrap/DataFetcherFactory.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ private <V> V get(Operation operation, Type type) {
9292
return (V) getMultiDataFetcher(operation, type);
9393
} else if (isPublisher(operation)) {
9494
return (V) getPublisherDataFetcher(operation, type);
95+
} else if (isFlowPublisher(operation)) {
96+
return (V) getPublisherDataFetcher(operation, type);
9597
} else if (isWrapped(operation)) {
9698
return (V) getOtherWrappedDataFetcher(operation, type);
9799
}
@@ -214,6 +216,14 @@ private boolean isPublisher(Field field) {
214216
return false;
215217
}
216218

219+
private boolean isFlowPublisher(Field field) {
220+
if (field.hasWrapper()) {
221+
String wrapperClassName = field.getWrapper().getWrapperClassName();
222+
return wrapperClassName.equals("java.util.concurrent.Flow$Publisher");
223+
}
224+
return false;
225+
}
226+
217227
private boolean isMutinyMulti(Field field) {
218228
if (field.hasWrapper()) {
219229
String wrapperClassName = field.getWrapper().getWrapperClassName();

0 commit comments

Comments
 (0)