Skip to content

Commit 3d6426a

Browse files
committed
Implement SingletonInstanceResolver
1 parent 0c233bc commit 3d6426a

File tree

3 files changed

+69
-1
lines changed

3 files changed

+69
-1
lines changed

src/AndroidClient/client/src/main/java/net/servicestack/client/sse/ServerEventsClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,9 @@ public IResolver getResolver() {
121121
return resolver;
122122
}
123123

124-
public void setResolver(IResolver resolver) {
124+
public ServerEventsClient setResolver(IResolver resolver) {
125125
this.resolver = resolver;
126+
return this;
126127
}
127128

128129
public ServerEventsClient setOnConnect(ServerEventConnectCallback onConnect) {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package net.servicestack.client.sse;
2+
3+
import net.servicestack.client.IResolver;
4+
5+
import java.util.concurrent.ConcurrentHashMap;
6+
import java.util.concurrent.ConcurrentMap;
7+
import java.util.function.Function;
8+
9+
/**
10+
* Created by mythz on 2/12/2017.
11+
*/
12+
13+
public class SingletonInstanceResolver implements IResolver {
14+
15+
ConcurrentMap<Class, Object> cache = new ConcurrentHashMap<>();
16+
17+
@Override
18+
public Object TryResolve(Class cls) {
19+
return cache.computeIfAbsent(cls, new Function<Class, Object>() {
20+
@Override
21+
public Object apply(Class aClass) {
22+
try {
23+
return aClass.newInstance();
24+
} catch (Exception e) {
25+
throw new RuntimeException(e);
26+
}
27+
}
28+
});
29+
}
30+
}

src/AndroidClient/client/src/test/java/net/servicestack/client/ServerEventClientTests.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import net.servicestack.client.sse.ServerEventLeave;
88
import net.servicestack.client.sse.ServerEventMessage;
99
import net.servicestack.client.sse.ServerEventsClient;
10+
import net.servicestack.client.sse.SingletonInstanceResolver;
1011
import net.servicestack.func.Func;
1112

1213
import java.util.ArrayList;
@@ -556,4 +557,40 @@ public void test_Does_send_raw_string_messages() throws Exception {
556557
assertEquals("#top", bgImageRequest.getCssSelector());
557558
}
558559
}
560+
561+
public void test_Can_reuse_same_instance() throws Exception {
562+
List<ServerEventMessage> msgs1 = new ArrayList<>();
563+
564+
try(ServerEventsClient client1 = new ServerEventsClient("http://chat.servicestack.net")
565+
.registerReceiver(TestJavaScriptReceiver.class)
566+
.registerNamedReceiver("css", TestJavaScriptReceiver.class)
567+
.setResolver(new SingletonInstanceResolver())
568+
.setOnMessage(msgs1::add)
569+
.start()
570+
.waitTillConnected()) {
571+
572+
postRaw(client1, "cmd.announce", "This is your captain speaking...");
573+
574+
while (msgs1.size() < 1) {
575+
Thread.sleep(100);
576+
}
577+
578+
TestJavaScriptReceiver instance = (TestJavaScriptReceiver)client1.getResolver().TryResolve(TestJavaScriptReceiver.class);
579+
assertEquals("This is your captain speaking...", instance.AnnounceInstance);
580+
581+
postRaw(client1, "cmd.announce", "2nd Announcement");
582+
583+
while (msgs1.size() < 2) {
584+
Thread.sleep(100);
585+
}
586+
587+
assertEquals("2nd Announcement", instance.AnnounceInstance);
588+
}
589+
}
590+
591+
public void test_Can_use_IOC_to_autowire_Receivers(){
592+
//No built-in IOC
593+
}
594+
595+
559596
}

0 commit comments

Comments
 (0)