From b61f86f7352a0ca0b130127ea559747749242ec7 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Alves Date: Wed, 27 Sep 2023 00:40:14 -0300 Subject: [PATCH 1/4] Thinking that this SDK will be used in projects with Native Image technology, was removed lombok dependency to avoid potential inconsistency that it may causes. --- pom.xml | 7 -- .../io/eigr/spawn/api/InvocationOpts.java | 77 ++++++++++++---- .../java/io/eigr/spawn/api/TransportOpts.java | 92 +++++++++++++++---- 3 files changed, 135 insertions(+), 41 deletions(-) diff --git a/pom.xml b/pom.xml index 90a92f4..53018fa 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,6 @@ UTF-8 3.1.8 4.13.2 - 1.18.26 8.0.33 4.10.0 3.22.2 @@ -22,12 +21,6 @@ - - org.projectlombok - lombok - ${lombok.version} - - org.slf4j slf4j-api diff --git a/src/main/java/io/eigr/spawn/api/InvocationOpts.java b/src/main/java/io/eigr/spawn/api/InvocationOpts.java index 575d29f..0876814 100644 --- a/src/main/java/io/eigr/spawn/api/InvocationOpts.java +++ b/src/main/java/io/eigr/spawn/api/InvocationOpts.java @@ -1,32 +1,43 @@ package io.eigr.spawn.api; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - import java.time.Duration; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.Optional; -@Builder -@Getter -@AllArgsConstructor -@NoArgsConstructor public class InvocationOpts { - @Builder.Default - private boolean async = false; + private final boolean async; + private final Duration timeoutSeconds; + private final Optional delaySeconds; + private final Optional scheduledTo; + + private InvocationOpts(InvocationOptsBuilder invocationOptsBuilder) { + this.async = invocationOptsBuilder.async; + this.timeoutSeconds = invocationOptsBuilder.timeoutSeconds; + this.delaySeconds = invocationOptsBuilder.delaySeconds; + this.scheduledTo = invocationOptsBuilder.scheduledTo; + } + + public static InvocationOptsBuilder builder() { + return new InvocationOptsBuilder(); + } + + public boolean isAsync() { + return async; + } - @Builder.Default - private Duration timeoutSeconds = Duration.ofSeconds(10); + public Duration getTimeoutSeconds() { + return timeoutSeconds; + } - @Builder.Default - private Optional delaySeconds = Optional.empty(); + public Optional getDelaySeconds() { + return delaySeconds; + } - @Builder.Default - private Optional scheduledTo = Optional.empty(); + public Optional getScheduledTo() { + return scheduledTo; + } public long getScheduleTimeInLong() { if (scheduledTo.isPresent()) { @@ -40,4 +51,36 @@ public long getScheduleTimeInLong() { public long getTimeout() { return this.timeoutSeconds.toMillis(); } + + public static final class InvocationOptsBuilder { + + private boolean async = false; + private Duration timeoutSeconds = Duration.ofSeconds(10); + private Optional delaySeconds = Optional.empty(); + private Optional scheduledTo = Optional.empty(); + + public InvocationOpts build() { + return new InvocationOpts(this); + } + + public InvocationOptsBuilder async(boolean async) { + this.async = async; + return this; + } + + public InvocationOptsBuilder timeoutSeconds(Duration timeoutSeconds) { + this.timeoutSeconds = timeoutSeconds; + return this; + } + + public InvocationOptsBuilder delaySeconds(Optional delaySeconds) { + this.delaySeconds = delaySeconds; + return this; + } + + public InvocationOptsBuilder scheduledTo(Optional scheduledTo) { + this.scheduledTo = scheduledTo; + return this; + } + } } diff --git a/src/main/java/io/eigr/spawn/api/TransportOpts.java b/src/main/java/io/eigr/spawn/api/TransportOpts.java index 9f70921..2026b8d 100644 --- a/src/main/java/io/eigr/spawn/api/TransportOpts.java +++ b/src/main/java/io/eigr/spawn/api/TransportOpts.java @@ -1,25 +1,83 @@ package io.eigr.spawn.api; -import lombok.*; - import java.util.concurrent.Executor; import java.util.concurrent.Executors; -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -@ToString public class TransportOpts { - @Builder.Default - private String host = "127.0.0.1"; - @Builder.Default - private int port = 8091; - @Builder.Default - private String proxyHost = "127.0.0.1"; - @Builder.Default - private int proxyPort = 9001; - @Builder.Default - private Executor executor = Executors.newCachedThreadPool(); + private String host; + private int port; + private String proxyHost; + private int proxyPort; + private Executor executor; + + private TransportOpts(TransportOptsBuilder builder) { + this.host = builder.host; + this.port = builder.port; + this.proxyHost = builder.proxyHost; + this.proxyPort = builder.proxyPort; + this.executor = builder.executor; + } + + public static TransportOptsBuilder builder() { + return new TransportOptsBuilder(); + } + + public String getHost() { + return host; + } + + public int getPort() { + return port; + } + + public String getProxyHost() { + return proxyHost; + } + + public int getProxyPort() { + return proxyPort; + } + + public Executor getExecutor() { + return executor; + } + + public static final class TransportOptsBuilder { + + private String host = "127.0.0.1"; + private int port = 8091; + private String proxyHost = "127.0.0.1"; + private int proxyPort = 9001; + private Executor executor = Executors.newCachedThreadPool(); + + public TransportOpts build() { + return new TransportOpts(this); + } + + public TransportOptsBuilder host(String host) { + this.host = host; + return this; + } + + public TransportOptsBuilder port(int port) { + this.port = port; + return this; + } + + public TransportOptsBuilder proxyHost(String proxyHost) { + this.proxyHost = proxyHost; + return this; + } + + public TransportOptsBuilder proxyPort(int proxyPort) { + this.proxyPort = proxyPort; + return this; + } + + public TransportOptsBuilder executor(Executor executor) { + this.executor = executor; + return this; + } + } } From 47ead873655dfdd4f47f707162c5e3b5bd0601a6 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Alves Date: Wed, 27 Sep 2023 00:40:36 -0300 Subject: [PATCH 2/4] Refactoring class to avoid casts and raw use. --- .../java/io/eigr/spawn/api/actors/Value.java | 46 +++++++++---------- .../transport/server/ActorServiceHandler.java | 13 ++---- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/src/main/java/io/eigr/spawn/api/actors/Value.java b/src/main/java/io/eigr/spawn/api/actors/Value.java index b77e0e3..b021cba 100644 --- a/src/main/java/io/eigr/spawn/api/actors/Value.java +++ b/src/main/java/io/eigr/spawn/api/actors/Value.java @@ -11,18 +11,16 @@ import java.util.Objects; import java.util.Optional; -public final class Value { - - private S state; - private R response; +public final class Value { + private Object state; + private Object response; private boolean checkpoint; private Optional> broadcast; private Optional forward; private Optional pipe; - private Optional> effects; - - private ResponseType type; + private Optional>> effects; + private final ResponseType type; private Value() { this.state = null; @@ -36,13 +34,13 @@ private Value() { } private Value( - R response, - S state, + Object response, + Object state, boolean checkpoint, Optional> broadcast, Optional forward, Optional pipe, - Optional> effects, + Optional>> effects, ResponseType type) { this.response = response; this.state = state; @@ -54,16 +52,16 @@ private Value( this.type = type; } - public static Value at() { + public static Value at() { return new Value(); } - public R getResponse() { - return response; + public R getResponse() { + return (R) response; } - public S getState() { - return state; + public S getState() { + return (S) state; } public boolean getCheckpoint() { @@ -82,7 +80,7 @@ public Optional getPipe() { return pipe; } - public Optional> getEffects() { + public Optional>> getEffects() { return effects; } @@ -90,23 +88,23 @@ public ResponseType getType() { return type; } - public Value response(R value) { + public Value response(Object value) { this.response = value; return this; } - public Value state(S state) { + public Value state(S state) { this.state = state; return this; } - public Value state(S state, boolean checkpoint) { + public Value state(S state, boolean checkpoint) { this.state = state; this.checkpoint = checkpoint; return this; } - public Value flow(Broadcast broadcast) { + public Value flow(Broadcast broadcast) { this.broadcast = Optional.of(broadcast); return this; } @@ -121,8 +119,8 @@ public Value flow(Pipe pipe) { return this; } - public Value flow(SideEffect effect) { - List ef; + public Value flow(SideEffect effect) { + List> ef; if (this.effects.isPresent()) { ef = this.effects.get(); ef.add(effect); @@ -135,7 +133,7 @@ public Value flow(SideEffect effect) { return this; } - public Value flow(List effects) { + public Value flow(List> effects) { this.effects = Optional.of(effects); return this; } @@ -171,7 +169,7 @@ public String toString() { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - Value value = (Value) o; + Value value = (Value) o; return Objects.equals(state, value.state) && Objects.equals(response, value.response) && Objects.equals(checkpoint, value.checkpoint) && diff --git a/src/main/java/io/eigr/spawn/internal/transport/server/ActorServiceHandler.java b/src/main/java/io/eigr/spawn/internal/transport/server/ActorServiceHandler.java index 7f2d37b..756cd01 100644 --- a/src/main/java/io/eigr/spawn/internal/transport/server/ActorServiceHandler.java +++ b/src/main/java/io/eigr/spawn/internal/transport/server/ActorServiceHandler.java @@ -12,9 +12,6 @@ import io.eigr.spawn.api.actors.Value; import io.eigr.spawn.api.actors.ActorContext; import io.eigr.spawn.api.actors.ActorFactory; -import io.eigr.spawn.api.actors.workflows.Broadcast; -import io.eigr.spawn.api.actors.workflows.Forward; -import io.eigr.spawn.api.actors.workflows.Pipe; import io.eigr.spawn.api.actors.workflows.SideEffect; import io.eigr.spawn.api.exceptions.ActorInvocationException; import io.eigr.spawn.internal.Entity; @@ -210,29 +207,29 @@ private Protocol.Workflow buildWorkflow(Value valueResponse) { Protocol.Workflow.Builder workflowBuilder = Protocol.Workflow.newBuilder(); if (valueResponse.getBroadcast().isPresent()) { - Protocol.Broadcast b = ((Broadcast) valueResponse.getBroadcast().get()).build(); + Protocol.Broadcast b = valueResponse.getBroadcast().get().build(); workflowBuilder.setBroadcast(b); } if (valueResponse.getForward().isPresent()) { - Protocol.Forward f = ((Forward) valueResponse.getForward().get()).build(); + Protocol.Forward f = valueResponse.getForward().get().build(); workflowBuilder.setForward(f); } if (valueResponse.getPipe().isPresent()) { - Protocol.Pipe p = ((Pipe) valueResponse.getPipe().get()).build(); + Protocol.Pipe p = valueResponse.getPipe().get().build(); workflowBuilder.setPipe(p); } if (valueResponse.getEffects().isPresent()) { - List efs = ((List) valueResponse.getEffects().get()); + List> efs = valueResponse.getEffects().get(); workflowBuilder.addAllEffects(getProtocolEffects(efs)); } return workflowBuilder.build(); } - private List getProtocolEffects(List effects) { + private List getProtocolEffects(List> effects) { return effects.stream() .map(SideEffect::build) .collect(Collectors.toList()); From 10cb1d632c44339fbd3a31acd70c6c290484ee05 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Alves Date: Wed, 27 Sep 2023 09:51:33 -0300 Subject: [PATCH 3/4] Refactoring. --- .../transport/server/ActorServiceHandler.java | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/src/main/java/io/eigr/spawn/internal/transport/server/ActorServiceHandler.java b/src/main/java/io/eigr/spawn/internal/transport/server/ActorServiceHandler.java index 2bbabc0..977e811 100644 --- a/src/main/java/io/eigr/spawn/internal/transport/server/ActorServiceHandler.java +++ b/src/main/java/io/eigr/spawn/internal/transport/server/ActorServiceHandler.java @@ -206,25 +206,10 @@ private Optional getEntityByActor(String actor, String parent) { private Protocol.Workflow buildWorkflow(Value valueResponse) { Protocol.Workflow.Builder workflowBuilder = Protocol.Workflow.newBuilder(); - if (valueResponse.getBroadcast().isPresent()) { - Protocol.Broadcast b = valueResponse.getBroadcast().get().build(); - workflowBuilder.setBroadcast(b); - } - - if (valueResponse.getForward().isPresent()) { - Protocol.Forward f = valueResponse.getForward().get().build(); - workflowBuilder.setForward(f); - } - - if (valueResponse.getPipe().isPresent()) { - Protocol.Pipe p = valueResponse.getPipe().get().build(); - workflowBuilder.setPipe(p); - } - - if (valueResponse.getEffects().isPresent()) { - List> efs = valueResponse.getEffects().get(); - workflowBuilder.addAllEffects(getProtocolEffects(efs)); - } + valueResponse.getBroadcast().ifPresent(b -> workflowBuilder.setBroadcast(b.build())); + valueResponse.getForward().ifPresent(f -> workflowBuilder.setForward(f.build())); + valueResponse.getPipe().ifPresent(p -> workflowBuilder.setPipe(p.build())); + valueResponse.getEffects().ifPresent(e -> workflowBuilder.addAllEffects(getProtocolEffects(e))); return workflowBuilder.build(); } From 41b2180c10b3574f4f8109a7f5ca436d62d28320 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Alves Date: Wed, 27 Sep 2023 10:11:16 -0300 Subject: [PATCH 4/4] Refactoring. Co-authored-by: Adriano Santos --- src/main/java/io/eigr/spawn/api/actors/Value.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/eigr/spawn/api/actors/Value.java b/src/main/java/io/eigr/spawn/api/actors/Value.java index b021cba..6857078 100644 --- a/src/main/java/io/eigr/spawn/api/actors/Value.java +++ b/src/main/java/io/eigr/spawn/api/actors/Value.java @@ -88,7 +88,7 @@ public ResponseType getType() { return type; } - public Value response(Object value) { + public Value response(R value) { this.response = value; return this; }