Skip to content

Commit c6ee459

Browse files
Reintroduce clients generation (#482)
* Reintroduce clients generation * Add option to disable client generation
1 parent 31f14f5 commit c6ee459

File tree

19 files changed

+548
-140
lines changed

19 files changed

+548
-140
lines changed

examples/src/main/java/my/restate/sdk/examples/LoanWorkflow.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// https://github.com/restatedev/sdk-java/blob/main/LICENSE
99
package my.restate.sdk.examples;
1010

11-
import dev.restate.client.Client;
1211
import dev.restate.sdk.Context;
1312
import dev.restate.sdk.SharedWorkflowContext;
1413
import dev.restate.sdk.WorkflowContext;
@@ -80,12 +79,13 @@ public String run(WorkflowContext ctx, LoanRequest loanRequest) {
8079
ctx.set(STATUS, Status.APPROVED);
8180

8281
// 4. Request money transaction to the bank
82+
var bankClient = LoanWorkflowMockBankClient.fromContext(ctx);
8383
Instant executionTime;
8484
try {
8585
executionTime =
86-
ctx.call(
87-
LoanWorkflowMockBankHandlers.transfer(
88-
new TransferRequest(loanRequest.customerBankAccount(), loanRequest.amount())))
86+
bankClient
87+
.transfer(
88+
new TransferRequest(loanRequest.customerBankAccount(), loanRequest.amount()))
8989
.await(Duration.ofDays(7));
9090
} catch (TerminalException e) {
9191
LOG.warn("Transaction failed", e);
@@ -135,14 +135,13 @@ public static void main(String[] args) {
135135
}
136136

137137
// To invoke the workflow:
138-
Client client = Client.connect("http://127.0.0.1:8080");
138+
LoanWorkflowClient.IngressClient client =
139+
LoanWorkflowClient.connect("http://127.0.0.1:8080", "my-loan");
139140

140141
var state =
141142
client.submit(
142-
LoanWorkflowHandlers.run(
143-
"my-loan",
144-
new LoanRequest(
145-
"Francesco", "slinkydeveloper", "DE1234", new BigDecimal("1000000000"))));
143+
new LoanRequest(
144+
"Francesco", "slinkydeveloper", "DE1234", new BigDecimal("1000000000")));
146145

147146
LOG.info("Started loan workflow");
148147

@@ -156,14 +155,12 @@ public static void main(String[] args) {
156155
LOG.info("We took the decision to approve your loan! You can now achieve your dreams!");
157156

158157
// Now approve it
159-
client.call(LoanWorkflowHandlers.approveLoan("my-loan"));
158+
client.approveLoan();
160159

161160
// Wait for output
162-
state.response().invocationHandle().attach();
161+
client.workflowHandle().attach();
163162

164-
LOG.info(
165-
"Loan workflow completed, now in status {}",
166-
client.call(LoanWorkflowHandlers.getStatus("my-loan")));
163+
LOG.info("Loan workflow completed, now in status {}", client.getStatus());
167164
}
168165

169166
// -- Some mocks
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright (c) 2023 - Restate Software, Inc., Restate GmbH
2+
//
3+
// This file is part of the Restate Java SDK,
4+
// which is released under the MIT license.
5+
//
6+
// You can find a copy of the license in file LICENSE in the root
7+
// directory of this repository or package, or at
8+
// https://github.com/restatedev/sdk-java/blob/main/LICENSE
9+
package dev.restate.sdk.gen.model;
10+
11+
import java.util.*;
12+
13+
public class AnnotationProcessingOptions {
14+
15+
private static final String DISABLED_CLIENT_GENERATION =
16+
"dev.restate.codegen.disabledClientGeneration";
17+
18+
private final Set<String> disabledClientGenFQCN;
19+
20+
public AnnotationProcessingOptions(Map<String, String> options) {
21+
this.disabledClientGenFQCN =
22+
new HashSet<>(List.of(options.getOrDefault(DISABLED_CLIENT_GENERATION, "").split("[,|]")));
23+
}
24+
25+
public boolean isClientGenDisabled(String fqcn) {
26+
return this.disabledClientGenFQCN.contains(fqcn);
27+
}
28+
29+
@Override
30+
public boolean equals(Object o) {
31+
if (!(o instanceof AnnotationProcessingOptions that)) return false;
32+
return Objects.equals(disabledClientGenFQCN, that.disabledClientGenFQCN);
33+
}
34+
35+
@Override
36+
public int hashCode() {
37+
return Objects.hashCode(disabledClientGenFQCN);
38+
}
39+
40+
@Override
41+
public String toString() {
42+
return "AnnotationProcessingOptions{" + "disabledClientGenFQCN=" + disabledClientGenFQCN + '}';
43+
}
44+
}

sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/template/HandlebarsTemplateEngine.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ static class ServiceTemplateModel {
109109
public final String documentation;
110110

111111
public final String metadataClass;
112+
public final String handlersClass;
112113

113114
public final String serdeFactoryDecl;
114115
public final String serdeFactoryRef;
@@ -128,7 +129,8 @@ private ServiceTemplateModel(
128129
this.generatedClassSimpleName = this.generatedClassSimpleNamePrefix + baseTemplateName;
129130
this.restateServiceName = inner.getRestateServiceName();
130131

131-
this.metadataClass = this.generatedClassSimpleNamePrefix + "Handlers.Metadata";
132+
this.handlersClass = this.generatedClassSimpleNamePrefix + "Handlers";
133+
this.metadataClass = this.handlersClass + ".Metadata";
132134

133135
this.serdeFactoryDecl = inner.getSerdeFactoryDecl();
134136
this.serdeFactoryRef = metadataClass + ".SERDE_FACTORY";

sdk-api-gen/src/main/java/dev/restate/sdk/gen/ServiceProcessor.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import dev.restate.common.function.ThrowingFunction;
1212
import dev.restate.sdk.endpoint.definition.ServiceDefinitionFactory;
1313
import dev.restate.sdk.endpoint.definition.ServiceType;
14+
import dev.restate.sdk.gen.model.AnnotationProcessingOptions;
1415
import dev.restate.sdk.gen.model.Service;
1516
import dev.restate.sdk.gen.template.HandlebarsTemplateEngine;
1617
import java.io.*;
@@ -32,7 +33,9 @@
3233
public class ServiceProcessor extends AbstractProcessor {
3334

3435
private HandlebarsTemplateEngine serviceDefinitionFactoryCodegen;
36+
private HandlebarsTemplateEngine clientCodegen;
3537
private HandlebarsTemplateEngine handlersCodegen;
38+
private AnnotationProcessingOptions options;
3639

3740
private static final Set<String> RESERVED_METHOD_NAMES =
3841
Set.of("send", "submit", "workflowHandle");
@@ -55,6 +58,18 @@ public synchronized void init(ProcessingEnvironment processingEnv) {
5558
ServiceType.VIRTUAL_OBJECT,
5659
"templates/ServiceDefinitionFactory.hbs"),
5760
RESERVED_METHOD_NAMES);
61+
this.clientCodegen =
62+
new HandlebarsTemplateEngine(
63+
"Client",
64+
filerTemplateLoader,
65+
Map.of(
66+
ServiceType.WORKFLOW,
67+
"templates/Client.hbs",
68+
ServiceType.SERVICE,
69+
"templates/Client.hbs",
70+
ServiceType.VIRTUAL_OBJECT,
71+
"templates/Client.hbs"),
72+
RESERVED_METHOD_NAMES);
5873
this.handlersCodegen =
5974
new HandlebarsTemplateEngine(
6075
"Handlers",
@@ -67,6 +82,7 @@ public synchronized void init(ProcessingEnvironment processingEnv) {
6782
ServiceType.VIRTUAL_OBJECT,
6883
"templates/Handlers.hbs"),
6984
RESERVED_METHOD_NAMES);
85+
this.options = new AnnotationProcessingOptions(processingEnv.getOptions());
7086
}
7187

7288
@Override
@@ -104,6 +120,9 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
104120
name -> filer.createSourceFile(name, e.getKey()).openWriter();
105121
this.serviceDefinitionFactoryCodegen.generate(fileCreator, e.getValue());
106122
this.handlersCodegen.generate(fileCreator, e.getValue());
123+
if (!this.options.isClientGenDisabled(e.getValue().getTargetFqcn().toString())) {
124+
this.clientCodegen.generate(fileCreator, e.getValue());
125+
}
107126
} catch (Throwable ex) {
108127
throw new RuntimeException(ex);
109128
}

0 commit comments

Comments
 (0)