Skip to content

Commit 515532a

Browse files
committed
Added access to plugin datas from the DataManager, Actor and Report contexts.
1 parent 57a2dcd commit 515532a

9 files changed

Lines changed: 570 additions & 19 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,4 +326,5 @@ Temporary Items
326326
###################################
327327

328328
# VSCode
329-
.vscode
329+
.vscode
330+
docgen/renv

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151

5252
<!-- Properties -->
5353
<properties>
54-
<revision>4.4.3</revision>
54+
<revision>4.4.4</revision>
5555

5656
<!-- basic project properties -->
5757
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,5 +243,31 @@ public List<ActorPlan> retrievePlans() {
243243
public Optional<Double> getSimulationHaltTime() {
244244
return simulation.getSimulationHaltTime();
245245
}
246+
247+
/**
248+
* Returns the plugin data object associated with the given class reference
249+
*
250+
* @throws ContractException
251+
* <ul>
252+
* <li>{@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS}
253+
* if the class reference is null</li>
254+
* <li>{@linkplain NucleusError#AMBIGUOUS_PLUGIN_DATA_CLASS}
255+
* if more than one plugin data object matches the
256+
* class reference</li>
257+
* </ul>
258+
*/
259+
public <T extends PluginData> Optional<T> getPluginData(Class<T> pluginDataClass) {
260+
return simulation.getPluginData(pluginDataClass);
261+
}
262+
263+
/**
264+
* Returns the plugin data objects associated with the given class reference
265+
*
266+
* @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if
267+
* the class reference is null
268+
*/
269+
public <T extends PluginData> List<T> getPluginDatas(Class<T> pluginDataClass) {
270+
return simulation.getPluginDatas(pluginDataClass);
271+
}
246272

247273
}

simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/DataManagerContext.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,5 +315,31 @@ public DataManagerId getDataManagerId() {
315315
public Optional<Double> getSimulationHaltTime() {
316316
return simulation.getSimulationHaltTime();
317317
}
318+
319+
/**
320+
* Returns the plugin data object associated with the given class reference
321+
*
322+
* @throws ContractException
323+
* <ul>
324+
* <li>{@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS}
325+
* if the class reference is null</li>
326+
* <li>{@linkplain NucleusError#AMBIGUOUS_PLUGIN_DATA_CLASS}
327+
* if more than one plugin data object matches the
328+
* class reference</li>
329+
* </ul>
330+
*/
331+
public <T extends PluginData> Optional<T> getPluginData(Class<T> pluginDataClass) {
332+
return simulation.getPluginData(pluginDataClass);
333+
}
334+
335+
/**
336+
* Returns the plugin data objects associated with the given class reference
337+
*
338+
* @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if
339+
* the class reference is null
340+
*/
341+
public <T extends PluginData> List<T> getPluginDatas(Class<T> pluginDataClass) {
342+
return simulation.getPluginDatas(pluginDataClass);
343+
}
318344

319345
}

simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ReportContext.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,5 +202,31 @@ public List<ReportPlan> retrievePlans() {
202202
public Optional<Double> getSimulationHaltTime() {
203203
return simulation.getSimulationHaltTime();
204204
}
205+
206+
/**
207+
* Returns the plugin data object associated with the given class reference
208+
*
209+
* @throws ContractException
210+
* <ul>
211+
* <li>{@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS}
212+
* if the class reference is null</li>
213+
* <li>{@linkplain NucleusError#AMBIGUOUS_PLUGIN_DATA_CLASS}
214+
* if more than one plugin data object matches the
215+
* class reference</li>
216+
* </ul>
217+
*/
218+
public <T extends PluginData> Optional<T> getPluginData(Class<T> pluginDataClass) {
219+
return simulation.getPluginData(pluginDataClass);
220+
}
221+
222+
/**
223+
* Returns the plugin data objects associated with the given class reference
224+
*
225+
* @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if
226+
* the class reference is null
227+
*/
228+
public <T extends PluginData> List<T> getPluginDatas(Class<T> pluginDataClass) {
229+
return simulation.getPluginDatas(pluginDataClass);
230+
}
205231

206232
}

simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ActorContext.java

Lines changed: 166 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.ArrayList;
1313
import java.util.LinkedHashSet;
1414
import java.util.List;
15+
import java.util.Optional;
1516
import java.util.Set;
1617
import java.util.function.BiConsumer;
1718
import java.util.function.Consumer;
@@ -392,12 +393,9 @@ public void testGetActorId() {
392393
// show that the number of actor ids matches the number of actor aliases
393394
assertEquals(3, observedActorIds.size());
394395
}
395-
396-
397-
398-
396+
399397
private void executeGetDataManagerTest(Consumer<ActorContext> consumer) {
400-
398+
401399
// create the test plugin data builder
402400
TestPluginData.Builder pluginDataBuilder = TestPluginData.builder();
403401

@@ -408,7 +406,7 @@ private void executeGetDataManagerTest(Consumer<ActorContext> consumer) {
408406
pluginDataBuilder.addTestDataManager("dm3B", () -> new TestDataManager3B());
409407
pluginDataBuilder.addTestDataManager("dm4A", () -> new TestDataManager4A());
410408

411-
pluginDataBuilder.addTestActorPlan("actor", new TestActorPlan(0, consumer));
409+
pluginDataBuilder.addTestActorPlan("actor", new TestActorPlan(0, consumer));
412410

413411
// build the action plugin
414412
TestPluginData testPluginData = pluginDataBuilder.build();
@@ -421,34 +419,34 @@ private void executeGetDataManagerTest(Consumer<ActorContext> consumer) {
421419
@UnitTestMethod(target = ActorContext.class, name = "getDataManager", args = { Class.class })
422420
public void testGetDataManager() {
423421

424-
//postcondition test:
425-
executeGetDataManagerTest((c)->{
426-
assertNotNull(c.getDataManager(TestDataManager1.class));
422+
// postcondition test:
423+
executeGetDataManagerTest((c) -> {
424+
assertNotNull(c.getDataManager(TestDataManager1.class));
427425
assertNotNull(c.getDataManager(TestDataManager3A.class));
428426
assertNotNull(c.getDataManager(TestDataManager3B.class));
429427
assertNotNull(c.getDataManager(TestDataManager4A.class));
430428
assertNotNull(c.getDataManager(TestDataManager4.class));
431429
});
432430

433431
// precondition test: if the class reference is null
434-
ContractException contractException = assertThrows(ContractException.class, ()->{
435-
executeGetDataManagerTest((c)->{
432+
ContractException contractException = assertThrows(ContractException.class, () -> {
433+
executeGetDataManagerTest((c) -> {
436434
c.getDataManager(null);
437435
});
438436
});
439437
assertEquals(NucleusError.NULL_DATA_MANAGER_CLASS, contractException.getErrorType());
440-
438+
441439
// precondition test: if the class reference is null
442-
contractException = assertThrows(ContractException.class, ()->{
443-
executeGetDataManagerTest((c)->{
440+
contractException = assertThrows(ContractException.class, () -> {
441+
executeGetDataManagerTest((c) -> {
444442
c.getDataManager(TestDataManager3.class);
445443
});
446444
});
447445
assertEquals(NucleusError.AMBIGUOUS_DATA_MANAGER_CLASS, contractException.getErrorType());
448-
446+
449447
// precondition test: if the class reference is unknown
450-
contractException = assertThrows(ContractException.class, ()->{
451-
executeGetDataManagerTest((c)->{
448+
contractException = assertThrows(ContractException.class, () -> {
449+
executeGetDataManagerTest((c) -> {
452450
c.getDataManager(TestDataManager4B.class);
453451
});
454452
});
@@ -1070,4 +1068,155 @@ private void planRetrievalSimCloseSubscribe(ActorContext context, List<ActorPlan
10701068
assertEquals(expectedPlans.size(), plans.size());
10711069
assertEquals(expectedPlans, plans);
10721070
}
1071+
1072+
private static class LocalPluginData implements PluginData {
1073+
1074+
public static class Builder implements PluginDataBuilder {
1075+
@Override
1076+
public LocalPluginData build() {
1077+
return new LocalPluginData();
1078+
}
1079+
}
1080+
1081+
@Override
1082+
public PluginDataBuilder toBuilder() {
1083+
return new Builder();
1084+
}
1085+
}
1086+
1087+
private static class LocalPluginData2 implements PluginData {
1088+
1089+
public static class Builder implements PluginDataBuilder {
1090+
@Override
1091+
public LocalPluginData2 build() {
1092+
return new LocalPluginData2();
1093+
}
1094+
}
1095+
1096+
@Override
1097+
public PluginDataBuilder toBuilder() {
1098+
return new Builder();
1099+
}
1100+
}
1101+
1102+
@Test
1103+
@UnitTestMethod(target = ActorContext.class, name = "getPluginData", args = { Class.class })
1104+
public void testGetPluginData() {
1105+
1106+
TestPluginData.Builder pluginDataBuilder = TestPluginData.builder();
1107+
1108+
pluginDataBuilder.addTestActorPlan("actor", new TestActorPlan(0, (c) -> {
1109+
Optional<LocalPluginData> optional1 = c.getPluginData(LocalPluginData.class);
1110+
assertTrue(optional1.isPresent());
1111+
Optional<LocalPluginData2> optional2 = c.getPluginData(LocalPluginData2.class);
1112+
assertFalse(optional2.isPresent());
1113+
1114+
}));
1115+
1116+
// build the plugin
1117+
TestPluginData testPluginData = pluginDataBuilder.build();
1118+
Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData);
1119+
1120+
Plugin localPlugin = Plugin.builder()//
1121+
.setPluginId(new SimplePluginId("localPlugin"))//
1122+
.addPluginData(new LocalPluginData())//
1123+
.build();
1124+
1125+
// run the simulation
1126+
Simulation.builder()//
1127+
.addPlugin(testPlugin)//
1128+
.addPlugin(localPlugin)//
1129+
.build()//
1130+
.execute();//
1131+
1132+
// precondition test: if more than one plugin data object matches the class
1133+
// reference
1134+
ContractException contractException = assertThrows(ContractException.class, () -> {
1135+
Plugin lp = Plugin.builder()//
1136+
.setPluginId(new SimplePluginId("localPlugin"))//
1137+
.addPluginData(new LocalPluginData())//
1138+
.addPluginData(new LocalPluginData())//
1139+
.build();
1140+
1141+
Simulation.builder()//
1142+
.addPlugin(lp)//
1143+
.addPlugin(TestPlugin.getTestPlugin(
1144+
TestPluginData.builder().addTestActorPlan("actor", new TestActorPlan(0, (c) -> {
1145+
c.getPluginData(LocalPluginData.class);
1146+
})).build()))//
1147+
.build()//
1148+
.execute();//
1149+
});
1150+
assertEquals(NucleusError.AMBIGUOUS_PLUGIN_DATA_CLASS, contractException.getErrorType());
1151+
1152+
// precondition test: if the class reference is null
1153+
contractException = assertThrows(ContractException.class, () -> {
1154+
Simulation.builder()//
1155+
.addPlugin(TestPlugin.getTestPlugin(
1156+
TestPluginData.builder().addTestActorPlan("actor", new TestActorPlan(0, (c) -> {
1157+
c.getPluginData(null);
1158+
})).build()))//
1159+
.build()//
1160+
.execute();//
1161+
});
1162+
assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType());
1163+
1164+
}
1165+
1166+
@Test
1167+
@UnitTestMethod(target = ActorContext.class, name = "getPluginDatas", args = { Class.class })
1168+
public void testGetPluginDatas() {
1169+
/*
1170+
* Returns the plugin data objects associated with the given class reference
1171+
*
1172+
* @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if
1173+
* the class reference is null
1174+
*/
1175+
TestPluginData.Builder pluginDataBuilder = TestPluginData.builder();
1176+
1177+
pluginDataBuilder.addTestActorPlan("actor", new TestActorPlan(0, (c) -> {
1178+
List<LocalPluginData> localPluginDatas = c.getPluginDatas(LocalPluginData.class);
1179+
assertNotNull(localPluginDatas);
1180+
assertEquals(2,localPluginDatas.size());
1181+
1182+
List<LocalPluginData2> localPluginData2s = c.getPluginDatas(LocalPluginData2.class);
1183+
assertNotNull(localPluginData2s);
1184+
assertEquals(0,localPluginData2s.size());
1185+
1186+
List<PluginData> pluginDatas = c.getPluginDatas(PluginData.class);
1187+
assertNotNull(pluginDatas);
1188+
assertEquals(3,pluginDatas.size());
1189+
1190+
}));
1191+
1192+
// build the plugin
1193+
TestPluginData testPluginData = pluginDataBuilder.build();
1194+
Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData);
1195+
1196+
Plugin localPlugin = Plugin.builder()//
1197+
.setPluginId(new SimplePluginId("localPlugin"))//
1198+
.addPluginData(new LocalPluginData())//
1199+
.addPluginData(new LocalPluginData())//
1200+
.build();
1201+
1202+
// run the simulation
1203+
Simulation.builder()//
1204+
.addPlugin(testPlugin)//
1205+
.addPlugin(localPlugin)//
1206+
.build()//
1207+
.execute();//
1208+
1209+
// precondition test: if the class reference is null
1210+
ContractException contractException = assertThrows(ContractException.class, () -> {
1211+
Simulation.builder()//
1212+
.addPlugin(TestPlugin.getTestPlugin(
1213+
TestPluginData.builder().addTestActorPlan("actor", new TestActorPlan(0, (c) -> {
1214+
c.getPluginDatas(null);
1215+
})).build()))//
1216+
.build()//
1217+
.execute();//
1218+
});
1219+
assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType());
1220+
1221+
}
10731222
}

0 commit comments

Comments
 (0)