Skip to content

Commit 232a21a

Browse files
committed
Made the registry using a key pattern so they can be looked up by name in reverse
1 parent 6b6eb73 commit 232a21a

File tree

5 files changed

+94
-26
lines changed

5 files changed

+94
-26
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ Here is how you might put this in place:
265265
// in this case there is 1 but you can have many
266266
//
267267
DataLoaderRegistry registry = new DataLoaderRegistry();
268-
registry.register(characterDataLoader);
268+
registry.register("character", characterDataLoader);
269269

270270
//
271271
// this instrumentation implementation will dispatched all the dataloaders
Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,92 @@
11
package org.dataloader;
22

33
import java.util.ArrayList;
4+
import java.util.HashSet;
45
import java.util.List;
5-
import java.util.concurrent.CopyOnWriteArrayList;
6+
import java.util.Map;
7+
import java.util.Set;
8+
import java.util.concurrent.ConcurrentHashMap;
69

710
/**
811
* This allows data loaders to be registered together into a single place so
9-
* they can be dispatched as one.
12+
* they can be dispatched as one. It also allows you to retrieve data loaders by
13+
* name from a central place
1014
*/
1115
public class DataLoaderRegistry {
12-
private final List<DataLoader<?, ?>> dataLoaders = new CopyOnWriteArrayList<>();
16+
private final Map<String, DataLoader<?, ?>> dataLoaders = new ConcurrentHashMap<>();
17+
18+
/**
19+
* This will register a new dataloader
20+
*
21+
* @param key the key to put the data loader under
22+
* @param dataLoader the data loader to register
23+
*
24+
* @return this registry
25+
*/
26+
public DataLoaderRegistry register(String key, DataLoader<?, ?> dataLoader) {
27+
dataLoaders.put(key, dataLoader);
28+
return this;
29+
}
30+
31+
/**
32+
* This will combine all the current data loaders in this registry and all the data loaders from the specified registry
33+
* and return a new combined registry
34+
*
35+
* @param registry the registry to combine into this registry
36+
*
37+
* @return a new combined registry
38+
*/
39+
public DataLoaderRegistry combine(DataLoaderRegistry registry) {
40+
DataLoaderRegistry combined = new DataLoaderRegistry();
41+
42+
this.dataLoaders.forEach(combined::register);
43+
registry.dataLoaders.forEach(combined::register);
44+
return combined;
45+
}
1346

1447
/**
1548
* @return the currently registered data loaders
1649
*/
1750
public List<DataLoader<?, ?>> getDataLoaders() {
18-
return new ArrayList<>(dataLoaders);
51+
return new ArrayList<>(dataLoaders.values());
1952
}
2053

2154
/**
22-
* This will register a new dataloader
55+
* This will unregister a new dataloader
2356
*
24-
* @param dataLoader the data loader to register
57+
* @param key the key of the data loader to unregister
2558
*
2659
* @return this registry
2760
*/
28-
public DataLoaderRegistry register(DataLoader<?, ?> dataLoader) {
29-
if (!dataLoaders.contains(dataLoader)) {
30-
dataLoaders.add(dataLoader);
31-
}
61+
public DataLoaderRegistry unregister(String key) {
62+
dataLoaders.remove(key);
3263
return this;
3364
}
3465

3566
/**
36-
* This will unregister a new dataloader
67+
* Returns the dataloader that was registered under the specified key
3768
*
38-
* @param dataLoader the data loader to unregister
69+
* @param key the key of the data loader
3970
*
40-
* @return this registry
71+
* @return a data loader or null if its not present
4172
*/
42-
public DataLoaderRegistry unregister(DataLoader<?, ?> dataLoader) {
43-
dataLoaders.remove(dataLoader);
44-
return this;
73+
public <K, V> DataLoader<K, V> getDataLoader(String key) {
74+
//noinspection unchecked
75+
return (DataLoader<K, V>) dataLoaders.get(key);
76+
}
77+
78+
/**
79+
* @return the keys of the data loaders in this registry
80+
*/
81+
public Set<String> getKeys() {
82+
return new HashSet<>(dataLoaders.keySet());
4583
}
4684

4785
/**
4886
* This will called {@link org.dataloader.DataLoader#dispatch()} on each of the registered
4987
* {@link org.dataloader.DataLoader}s
5088
*/
5189
public void dispatchAll() {
52-
dataLoaders.forEach(DataLoader::dispatch);
90+
getDataLoaders().forEach(DataLoader::dispatch);
5391
}
5492
}

src/test/java/ReadmeExamples.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public Object get(DataFetchingEnvironment environment) {
124124
// in this case there is 1 but you can have many
125125
//
126126
DataLoaderRegistry registry = new DataLoaderRegistry();
127-
registry.register(characterDataLoader);
127+
registry.register("character", characterDataLoader);
128128

129129
//
130130
// this instrumentation implementation will dispatched all the dataloaders

src/test/java/org/dataloader/DataLoaderRegistryTest.java

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import static java.util.Arrays.asList;
88
import static org.hamcrest.Matchers.equalTo;
9+
import static org.hamcrest.Matchers.hasItems;
10+
import static org.hamcrest.Matchers.sameInstance;
911
import static org.junit.Assert.assertThat;
1012

1113
public class DataLoaderRegistryTest {
@@ -19,7 +21,7 @@ public void registration_works() throws Exception {
1921

2022
DataLoaderRegistry registry = new DataLoaderRegistry();
2123

22-
registry.register(dlA).register(dlB).register(dlC);
24+
registry.register("a", dlA).register("b", dlB).register("c", dlC);
2325

2426
assertThat(registry.getDataLoaders(), equalTo(asList(dlA, dlB, dlC)));
2527

@@ -28,14 +30,42 @@ public void registration_works() throws Exception {
2830

2931
registry = new DataLoaderRegistry();
3032

31-
registry.register(dlA).register(dlB).register(dlC).register(dlA).register(dlB);
33+
registry.register("a", dlA).register("b", dlB).register("c", dlC).register("b", dlB);
3234

3335
assertThat(registry.getDataLoaders(), equalTo(asList(dlA, dlB, dlC)));
3436

3537

3638
// and unregister
37-
registry.unregister(dlC);
39+
registry.unregister("c");
3840

3941
assertThat(registry.getDataLoaders(), equalTo(asList(dlA, dlB)));
42+
43+
// look up by name works
44+
DataLoader<String, String> readDL = registry.getDataLoader("a");
45+
assertThat(readDL, sameInstance(dlA));
46+
47+
assertThat(registry.getKeys(), hasItems("a", "b"));
48+
}
49+
50+
@Test
51+
public void registries_can_be_combined() throws Exception {
52+
53+
DataLoader<Object, Object> dlA = new DataLoader<>(identityBatchLoader);
54+
DataLoader<Object, Object> dlB = new DataLoader<>(identityBatchLoader);
55+
DataLoader<Object, Object> dlC = new DataLoader<>(identityBatchLoader);
56+
DataLoader<Object, Object> dlD = new DataLoader<>(identityBatchLoader);
57+
58+
DataLoaderRegistry registry1 = new DataLoaderRegistry();
59+
60+
registry1.register("a", dlA).register("b", dlB);
61+
62+
DataLoaderRegistry registry2 = new DataLoaderRegistry();
63+
64+
registry2.register("c", dlC).register("d", dlD);
65+
66+
DataLoaderRegistry combinedRegistry = registry1.combine(registry2);
67+
68+
assertThat(combinedRegistry.getKeys(), hasItems("a", "b", "c", "d"));
69+
assertThat(combinedRegistry.getDataLoaders(), hasItems(dlA, dlB, dlC, dlD));
4070
}
4171
}

src/test/java/org/dataloader/graphql/DataLoaderDispatcherInstrumentationTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ public void basic_invocation() throws Exception {
4040
DataLoader<Object, Object> dlB = new DataLoader<>(batchLoader);
4141
DataLoader<Object, Object> dlC = new DataLoader<>(batchLoader);
4242
DataLoaderRegistry registry = new DataLoaderRegistry()
43-
.register(dlA)
44-
.register(dlB)
45-
.register(dlC);
43+
.register("a", dlA)
44+
.register("b", dlB)
45+
.register("b", dlC);
4646

4747
DataLoaderDispatcherInstrumentation dispatcher = new DataLoaderDispatcherInstrumentation(registry);
4848
InstrumentationContext<CompletableFuture<ExecutionResult>> context = dispatcher.beginExecutionStrategy(null);
@@ -66,7 +66,7 @@ public void exceptions_wont_cause_dispatches() throws Exception {
6666

6767
DataLoader<Object, Object> dlA = new DataLoader<>(batchLoader);
6868
DataLoaderRegistry registry = new DataLoaderRegistry()
69-
.register(dlA);
69+
.register("a", dlA);
7070

7171
DataLoaderDispatcherInstrumentation dispatcher = new DataLoaderDispatcherInstrumentation(registry);
7272
InstrumentationContext<CompletableFuture<ExecutionResult>> context = dispatcher.beginExecutionStrategy(null);

0 commit comments

Comments
 (0)