Skip to content

Commit 0dd89fc

Browse files
committed
fix: state unpack in context creation
1 parent 7de73b9 commit 0dd89fc

File tree

14 files changed

+317
-275
lines changed

14 files changed

+317
-275
lines changed

README.md

+237-227
Large diffs are not rendered by default.

src/main/java/io/eigr/spawn/internal/ActionBindings.java renamed to src/main/java/io/eigr/spawn/api/actors/ActionBindings.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
package io.eigr.spawn.internal;
1+
package io.eigr.spawn.api.actors;
22

33
import com.google.protobuf.Message;
4-
import io.eigr.spawn.api.actors.ActorContext;
5-
import io.eigr.spawn.api.actors.Value;
4+
import io.eigr.spawn.internal.ActionEmptyFunction;
65

76
import java.lang.reflect.ParameterizedType;
87
import java.lang.reflect.Type;

src/main/java/io/eigr/spawn/api/actors/behaviors/ActorBehavior.java

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.protobuf.GeneratedMessage;
44
import com.google.protobuf.Message;
5+
import io.eigr.spawn.api.actors.ActionBindings;
56
import io.eigr.spawn.api.actors.ActorContext;
67
import io.eigr.spawn.api.actors.Value;
78
import io.eigr.spawn.api.exceptions.ActorInvocationException;

src/main/java/io/eigr/spawn/internal/Entity.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public Entity(
5555
String actorName,
5656
Class<?> actorType,
5757
ActorOuterClass.Kind kind,
58-
Class stateType,
58+
Class<?> stateType,
5959
String actorBeanName,
6060
boolean stateful,
6161
long deactivateTimeout,
@@ -352,7 +352,7 @@ public ActorOuterClass.Kind getKind() {
352352
return kind;
353353
}
354354

355-
public Class getStateType() {
355+
public Class<?> getStateType() {
356356
return stateType;
357357
}
358358

src/main/java/io/eigr/spawn/internal/transport/server/ActorServiceHandler.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33
import com.github.benmanes.caffeine.cache.Cache;
44
import com.github.benmanes.caffeine.cache.Caffeine;
5-
import com.google.protobuf.Any;
6-
import com.google.protobuf.GeneratedMessage;
7-
import com.google.protobuf.InvalidProtocolBufferException;
5+
import com.google.protobuf.*;
86
import com.sun.net.httpserver.HttpExchange;
97
import com.sun.net.httpserver.HttpHandler;
108
import io.eigr.functions.protocol.Protocol;
@@ -209,13 +207,16 @@ private Entity.EntityMethod getEntityMethod(String commandName, Entity entity) t
209207
* @return the {@link ActorContext} instance
210208
* @throws InvalidProtocolBufferException if the state cannot be unpacked
211209
*/
212-
private ActorContext createActorContext(Protocol.Context context, Entity entity) throws InvalidProtocolBufferException {
213-
if (context.hasState()) {
210+
private ActorContext createActorContext(Protocol.Context context, Entity entity) throws InvalidProtocolBufferException, ClassNotFoundException {
211+
if (context.hasState() && entity.isStateful()) {
214212
Any anyCtxState = context.getState();
215213
log.debug("[{}] trying to get the state of the Actor {}. Parse Any type {} from State type {}",
216214
system, entity.getActorName(), anyCtxState, entity.getStateType().getSimpleName());
217215

218-
Object state = anyCtxState.unpack(entity.getStateType());
216+
String typeUrl = anyCtxState.getTypeUrl();
217+
String typeName = typeUrl.substring(typeUrl.lastIndexOf('/') + 1);
218+
Class protoClass = Class.forName(typeName);
219+
Object state = anyCtxState.unpack(protoClass);
219220
return new ActorContext(spawn, state);
220221
} else {
221222
return new ActorContext(spawn);

src/test/java/io/eigr/spawn/AbstractContainerBaseTest.java renamed to src/test/java/io/eigr/spawn/test/AbstractContainerBaseTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.eigr.spawn;
1+
package io.eigr.spawn.test;
22

33
import io.eigr.spawn.api.Spawn;
44
import io.eigr.spawn.api.TransportOpts;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.eigr.spawn.test;
2+
3+
import com.google.protobuf.Any;
4+
import com.google.protobuf.InvalidProtocolBufferException;
5+
import domain.actors.State;
6+
import org.junit.jupiter.api.Test;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
10+
import static org.junit.jupiter.api.Assertions.assertNotNull;
11+
12+
public class ProtobufSerializationTest {
13+
private static final Logger log = LoggerFactory.getLogger(ProtobufSerializationTest.class);
14+
15+
@Test
16+
public void testAnyUnpack() throws InvalidProtocolBufferException, ClassNotFoundException {
17+
State stateActor = State.newBuilder().buildPartial();
18+
19+
Any anyCtxState = Any.pack(stateActor);
20+
21+
String typeUrl = anyCtxState.getTypeUrl();
22+
String typeName = typeUrl.substring(typeUrl.lastIndexOf('/') + 1);
23+
24+
Class protoClass = Class.forName(typeName);
25+
stateActor = (State) anyCtxState.unpack(protoClass);
26+
assertNotNull(stateActor);
27+
}
28+
}

src/test/java/io/eigr/spawn/SpawnTest.java renamed to src/test/java/io/eigr/spawn/test/SpawnTest.java

+15-14
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
package io.eigr.spawn;
1+
package io.eigr.spawn.test;
22

3+
import domain.actors.Reply;
4+
import domain.actors.Request;
35
import io.eigr.spawn.api.ActorIdentity;
46
import io.eigr.spawn.api.ActorRef;
57
import io.eigr.spawn.api.exceptions.ActorCreationException;
68
import io.eigr.spawn.api.exceptions.ActorInvocationException;
7-
import io.eigr.spawn.java.test.domain.Actor;
89
import io.eigr.spawn.test.actors.JoeActor;
910
import io.eigr.spawn.test.actors.StatelessNamedActor;
1011
import io.eigr.spawn.test.actors.UnNamedActor;
@@ -25,15 +26,15 @@ void testNamedInvocation() throws ActorCreationException, ActorInvocationExcepti
2526
Assertions.assertEquals(type, JoeActor.class);
2627
Assertions.assertNotNull(joeActor);
2728

28-
Actor.Request msg = Actor.Request.newBuilder()
29+
Request msg = Request.newBuilder()
2930
.setLanguage("Erlang")
3031
.build();
3132

32-
Optional<Actor.Reply> maybeReply =
33-
joeActor.invoke("SetLanguage", msg, Actor.Reply.class);
33+
Optional<Reply> maybeReply =
34+
joeActor.invoke("SetLanguage", msg, Reply.class);
3435

3536
if (maybeReply.isPresent()) {
36-
Actor.Reply reply = maybeReply.get();
37+
Reply reply = maybeReply.get();
3738
Assertions.assertNotNull(reply);
3839
Assertions.assertEquals("Hi Erlang. Hello From Java", reply.getResponse());
3940
}
@@ -49,15 +50,15 @@ void testUnNamedInvocation() throws ActorCreationException, ActorInvocationExcep
4950
Assertions.assertEquals(type, UnNamedActor.class);
5051
Assertions.assertNotNull(unNamedJoeActor);
5152

52-
Actor.Request msg = Actor.Request.newBuilder()
53+
Request msg = Request.newBuilder()
5354
.setLanguage("Erlang")
5455
.build();
5556

56-
Optional<Actor.Reply> maybeReply =
57-
unNamedJoeActor.invoke("SetLanguage", msg, Actor.Reply.class);
57+
Optional<Reply> maybeReply =
58+
unNamedJoeActor.invoke("SetLanguage", msg, Reply.class);
5859

5960
if (maybeReply.isPresent()) {
60-
Actor.Reply reply = maybeReply.get();
61+
Reply reply = maybeReply.get();
6162
Assertions.assertNotNull(reply);
6263
Assertions.assertEquals("Hi Erlang. Hello From Java", reply.getResponse());
6364
}
@@ -73,15 +74,15 @@ void testStatelessInvocation() throws ActorCreationException, ActorInvocationExc
7374
Assertions.assertEquals(type, StatelessNamedActor.class);
7475
Assertions.assertNotNull(statelessNamedActor);
7576

76-
Actor.Request msg = Actor.Request.newBuilder()
77+
Request msg = Request.newBuilder()
7778
.setLanguage("Elixir")
7879
.build();
7980

80-
Optional<Actor.Reply> maybeReply =
81-
statelessNamedActor.invoke("SetLanguage", msg, Actor.Reply.class);
81+
Optional<Reply> maybeReply =
82+
statelessNamedActor.invoke("SetLanguage", msg, Reply.class);
8283

8384
if (maybeReply.isPresent()) {
84-
Actor.Reply reply = maybeReply.get();
85+
Reply reply = maybeReply.get();
8586
Assertions.assertNotNull(reply);
8687
Assertions.assertEquals("Hi Elixir. Hello From Java", reply.getResponse());
8788
}

src/test/java/io/eigr/spawn/WorkflowTest.java renamed to src/test/java/io/eigr/spawn/test/WorkflowTest.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
package io.eigr.spawn;
1+
package io.eigr.spawn.test;
22

3+
import domain.actors.Request;
34
import io.eigr.functions.protocol.Protocol;
45
import io.eigr.spawn.api.ActorIdentity;
56
import io.eigr.spawn.api.ActorRef;
@@ -8,7 +9,6 @@
89
import io.eigr.spawn.api.actors.workflows.Pipe;
910
import io.eigr.spawn.api.actors.workflows.SideEffect;
1011
import io.eigr.spawn.api.exceptions.SpawnException;
11-
import io.eigr.spawn.java.test.domain.Actor;
1212
import org.junit.jupiter.api.Assertions;
1313
import org.junit.jupiter.api.BeforeEach;
1414
import org.junit.jupiter.api.Test;
@@ -25,7 +25,7 @@ public void before() throws SpawnException {
2525

2626
@Test
2727
void testBroadcastBuilder() {
28-
Broadcast broadcast = Broadcast.to("test.channel", "hi", Actor.Request.getDefaultInstance());
28+
Broadcast broadcast = Broadcast.to("test.channel", "hi", Request.getDefaultInstance());
2929
final Protocol.Broadcast protocolBroadcast = broadcast.build();
3030
Assertions.assertEquals("test.channel", protocolBroadcast.getChannelGroup());
3131
Assertions.assertNotNull(protocolBroadcast.getValue());
@@ -49,7 +49,7 @@ void testPipeBuilder() throws Exception {
4949

5050
@Test
5151
void testSideEffectBuilder() throws Exception {
52-
SideEffect effect = SideEffect.to(joeActorRef, "hi", Actor.Request.getDefaultInstance());
52+
SideEffect effect = SideEffect.to(joeActorRef, "hi", Request.getDefaultInstance());
5353
final Protocol.SideEffect protocolSideEffect = effect.build();
5454
Protocol.InvocationRequest request = protocolSideEffect.getRequest();
5555
Assertions.assertNotNull(request);

src/test/java/io/eigr/spawn/test/actors/ActorWithConstructor.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package io.eigr.spawn.test.actors;
22

3+
import domain.actors.Reply;
4+
import domain.actors.Request;
5+
import domain.actors.State;
6+
import io.eigr.spawn.api.actors.ActionBindings;
37
import io.eigr.spawn.api.actors.ActorContext;
48
import io.eigr.spawn.api.actors.StatefulActor;
59
import io.eigr.spawn.api.actors.Value;
610
import io.eigr.spawn.api.actors.behaviors.ActorBehavior;
711
import io.eigr.spawn.api.actors.behaviors.BehaviorCtx;
812
import io.eigr.spawn.api.actors.behaviors.NamedActorBehavior;
9-
import io.eigr.spawn.internal.ActionBindings;
10-
import io.eigr.spawn.java.test.domain.Actor.Reply;
11-
import io.eigr.spawn.java.test.domain.Actor.Request;
12-
import io.eigr.spawn.java.test.domain.Actor.State;
1313

1414
import static io.eigr.spawn.api.actors.behaviors.ActorBehavior.action;
1515
import static io.eigr.spawn.api.actors.behaviors.ActorBehavior.name;

src/test/java/io/eigr/spawn/test/actors/JoeActor.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package io.eigr.spawn.test.actors;
22

3+
import domain.actors.Reply;
4+
import domain.actors.Request;
5+
import domain.actors.State;
6+
import io.eigr.spawn.api.actors.ActionBindings;
37
import io.eigr.spawn.api.actors.ActorContext;
48
import io.eigr.spawn.api.actors.StatefulActor;
59
import io.eigr.spawn.api.actors.Value;
610
import io.eigr.spawn.api.actors.behaviors.ActorBehavior;
711
import io.eigr.spawn.api.actors.behaviors.BehaviorCtx;
812
import io.eigr.spawn.api.actors.behaviors.NamedActorBehavior;
9-
import io.eigr.spawn.internal.ActionBindings;
10-
import io.eigr.spawn.java.test.domain.Actor.Reply;
11-
import io.eigr.spawn.java.test.domain.Actor.Request;
12-
import io.eigr.spawn.java.test.domain.Actor.State;
1313

14-
import static io.eigr.spawn.api.actors.behaviors.ActorBehavior.*;
14+
import static io.eigr.spawn.api.actors.behaviors.ActorBehavior.action;
15+
import static io.eigr.spawn.api.actors.behaviors.ActorBehavior.channel;
1516

1617
public final class JoeActor implements StatefulActor<State> {
1718

src/test/java/io/eigr/spawn/test/actors/StatelessNamedActor.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package io.eigr.spawn.test.actors;
22

3+
import domain.actors.Reply;
4+
import domain.actors.Request;
5+
import io.eigr.spawn.api.actors.ActionBindings;
36
import io.eigr.spawn.api.actors.ActorContext;
47
import io.eigr.spawn.api.actors.StatelessActor;
58
import io.eigr.spawn.api.actors.Value;
69
import io.eigr.spawn.api.actors.behaviors.ActorBehavior;
710
import io.eigr.spawn.api.actors.behaviors.BehaviorCtx;
811
import io.eigr.spawn.api.actors.behaviors.NamedActorBehavior;
9-
import io.eigr.spawn.internal.ActionBindings;
10-
import io.eigr.spawn.java.test.domain.Actor.Reply;
11-
import io.eigr.spawn.java.test.domain.Actor.Request;
1212

1313
import static io.eigr.spawn.api.actors.behaviors.ActorBehavior.action;
1414
import static io.eigr.spawn.api.actors.behaviors.ActorBehavior.name;

src/test/java/io/eigr/spawn/test/actors/UnNamedActor.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package io.eigr.spawn.test.actors;
22

3+
import domain.actors.Reply;
4+
import domain.actors.Request;
5+
import domain.actors.State;
6+
import io.eigr.spawn.api.actors.ActionBindings;
37
import io.eigr.spawn.api.actors.ActorContext;
48
import io.eigr.spawn.api.actors.StatefulActor;
59
import io.eigr.spawn.api.actors.Value;
610
import io.eigr.spawn.api.actors.behaviors.ActorBehavior;
711
import io.eigr.spawn.api.actors.behaviors.BehaviorCtx;
812
import io.eigr.spawn.api.actors.behaviors.UnNamedActorBehavior;
9-
import io.eigr.spawn.internal.ActionBindings;
10-
import io.eigr.spawn.java.test.domain.Actor.Reply;
11-
import io.eigr.spawn.java.test.domain.Actor.Request;
12-
import io.eigr.spawn.java.test.domain.Actor.State;
1313

1414
import static io.eigr.spawn.api.actors.behaviors.ActorBehavior.action;
1515
import static io.eigr.spawn.api.actors.behaviors.ActorBehavior.name;

src/test/proto/eigr/functions/java/sdk/test/actor.proto

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
syntax = "proto3";
2-
package domain;
3-
option java_package = "io.eigr.spawn.java.test.domain";
2+
package domain.actors;
3+
option java_package = "domain.actors";
4+
option java_multiple_files = true;
45

56
message State {
67
repeated string languages = 1;

0 commit comments

Comments
 (0)