diff --git a/.gitignore b/.gitignore index 8524ee842..4a40bd1ce 100644 --- a/.gitignore +++ b/.gitignore @@ -326,4 +326,5 @@ Temporary Items ################################### # VSCode -.vscode \ No newline at end of file +.vscode +docgen/renv \ No newline at end of file diff --git a/pom.xml b/pom.xml index 4856bbe4b..d28eecec9 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ - 4.4.3 + 4.4.4 UTF-8 diff --git a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java index 6e8da6ffb..568da008f 100644 --- a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java +++ b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ActorContext.java @@ -243,5 +243,31 @@ public List retrievePlans() { public Optional getSimulationHaltTime() { return simulation.getSimulationHaltTime(); } + + /** + * Returns the plugin data object associated with the given class reference + * + * @throws ContractException + *
    + *
  • {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} + * if the class reference is null
  • + *
  • {@linkplain NucleusError#AMBIGUOUS_PLUGIN_DATA_CLASS} + * if more than one plugin data object matches the + * class reference
  • + *
+ */ + public Optional getPluginData(Class pluginDataClass) { + return simulation.getPluginData(pluginDataClass); + } + + /** + * Returns the plugin data objects associated with the given class reference + * + * @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if + * the class reference is null + */ + public List getPluginDatas(Class pluginDataClass) { + return simulation.getPluginDatas(pluginDataClass); + } } diff --git a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/DataManagerContext.java b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/DataManagerContext.java index dfbbaa6b8..0345e0cb9 100644 --- a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/DataManagerContext.java +++ b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/DataManagerContext.java @@ -315,5 +315,31 @@ public DataManagerId getDataManagerId() { public Optional getSimulationHaltTime() { return simulation.getSimulationHaltTime(); } + + /** + * Returns the plugin data object associated with the given class reference + * + * @throws ContractException + *
    + *
  • {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} + * if the class reference is null
  • + *
  • {@linkplain NucleusError#AMBIGUOUS_PLUGIN_DATA_CLASS} + * if more than one plugin data object matches the + * class reference
  • + *
+ */ + public Optional getPluginData(Class pluginDataClass) { + return simulation.getPluginData(pluginDataClass); + } + + /** + * Returns the plugin data objects associated with the given class reference + * + * @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if + * the class reference is null + */ + public List getPluginDatas(Class pluginDataClass) { + return simulation.getPluginDatas(pluginDataClass); + } } diff --git a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ReportContext.java b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ReportContext.java index 938a57fe3..94fe84987 100644 --- a/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ReportContext.java +++ b/simulation/src/main/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/ReportContext.java @@ -202,5 +202,31 @@ public List retrievePlans() { public Optional getSimulationHaltTime() { return simulation.getSimulationHaltTime(); } + + /** + * Returns the plugin data object associated with the given class reference + * + * @throws ContractException + *
    + *
  • {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} + * if the class reference is null
  • + *
  • {@linkplain NucleusError#AMBIGUOUS_PLUGIN_DATA_CLASS} + * if more than one plugin data object matches the + * class reference
  • + *
+ */ + public Optional getPluginData(Class pluginDataClass) { + return simulation.getPluginData(pluginDataClass); + } + + /** + * Returns the plugin data objects associated with the given class reference + * + * @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if + * the class reference is null + */ + public List getPluginDatas(Class pluginDataClass) { + return simulation.getPluginDatas(pluginDataClass); + } } diff --git a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ActorContext.java b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ActorContext.java index 0eda0d89f..98ad336c6 100644 --- a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ActorContext.java +++ b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ActorContext.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -392,12 +393,9 @@ public void testGetActorId() { // show that the number of actor ids matches the number of actor aliases assertEquals(3, observedActorIds.size()); } - - - - + private void executeGetDataManagerTest(Consumer consumer) { - + // create the test plugin data builder TestPluginData.Builder pluginDataBuilder = TestPluginData.builder(); @@ -408,7 +406,7 @@ private void executeGetDataManagerTest(Consumer consumer) { pluginDataBuilder.addTestDataManager("dm3B", () -> new TestDataManager3B()); pluginDataBuilder.addTestDataManager("dm4A", () -> new TestDataManager4A()); - pluginDataBuilder.addTestActorPlan("actor", new TestActorPlan(0, consumer)); + pluginDataBuilder.addTestActorPlan("actor", new TestActorPlan(0, consumer)); // build the action plugin TestPluginData testPluginData = pluginDataBuilder.build(); @@ -421,9 +419,9 @@ private void executeGetDataManagerTest(Consumer consumer) { @UnitTestMethod(target = ActorContext.class, name = "getDataManager", args = { Class.class }) public void testGetDataManager() { - //postcondition test: - executeGetDataManagerTest((c)->{ - assertNotNull(c.getDataManager(TestDataManager1.class)); + // postcondition test: + executeGetDataManagerTest((c) -> { + assertNotNull(c.getDataManager(TestDataManager1.class)); assertNotNull(c.getDataManager(TestDataManager3A.class)); assertNotNull(c.getDataManager(TestDataManager3B.class)); assertNotNull(c.getDataManager(TestDataManager4A.class)); @@ -431,24 +429,24 @@ public void testGetDataManager() { }); // precondition test: if the class reference is null - ContractException contractException = assertThrows(ContractException.class, ()->{ - executeGetDataManagerTest((c)->{ + ContractException contractException = assertThrows(ContractException.class, () -> { + executeGetDataManagerTest((c) -> { c.getDataManager(null); }); }); assertEquals(NucleusError.NULL_DATA_MANAGER_CLASS, contractException.getErrorType()); - + // precondition test: if the class reference is null - contractException = assertThrows(ContractException.class, ()->{ - executeGetDataManagerTest((c)->{ + contractException = assertThrows(ContractException.class, () -> { + executeGetDataManagerTest((c) -> { c.getDataManager(TestDataManager3.class); }); }); assertEquals(NucleusError.AMBIGUOUS_DATA_MANAGER_CLASS, contractException.getErrorType()); - + // precondition test: if the class reference is unknown - contractException = assertThrows(ContractException.class, ()->{ - executeGetDataManagerTest((c)->{ + contractException = assertThrows(ContractException.class, () -> { + executeGetDataManagerTest((c) -> { c.getDataManager(TestDataManager4B.class); }); }); @@ -1070,4 +1068,155 @@ private void planRetrievalSimCloseSubscribe(ActorContext context, List { + Optional optional1 = c.getPluginData(LocalPluginData.class); + assertTrue(optional1.isPresent()); + Optional optional2 = c.getPluginData(LocalPluginData2.class); + assertFalse(optional2.isPresent()); + + })); + + // build the plugin + TestPluginData testPluginData = pluginDataBuilder.build(); + Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData); + + Plugin localPlugin = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .build(); + + // run the simulation + Simulation.builder()// + .addPlugin(testPlugin)// + .addPlugin(localPlugin)// + .build()// + .execute();// + + // precondition test: if more than one plugin data object matches the class + // reference + ContractException contractException = assertThrows(ContractException.class, () -> { + Plugin lp = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .addPluginData(new LocalPluginData())// + .build(); + + Simulation.builder()// + .addPlugin(lp)// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder().addTestActorPlan("actor", new TestActorPlan(0, (c) -> { + c.getPluginData(LocalPluginData.class); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.AMBIGUOUS_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + // precondition test: if the class reference is null + contractException = assertThrows(ContractException.class, () -> { + Simulation.builder()// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder().addTestActorPlan("actor", new TestActorPlan(0, (c) -> { + c.getPluginData(null); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + } + + @Test + @UnitTestMethod(target = ActorContext.class, name = "getPluginDatas", args = { Class.class }) + public void testGetPluginDatas() { + /* + * Returns the plugin data objects associated with the given class reference + * + * @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if + * the class reference is null + */ + TestPluginData.Builder pluginDataBuilder = TestPluginData.builder(); + + pluginDataBuilder.addTestActorPlan("actor", new TestActorPlan(0, (c) -> { + List localPluginDatas = c.getPluginDatas(LocalPluginData.class); + assertNotNull(localPluginDatas); + assertEquals(2,localPluginDatas.size()); + + List localPluginData2s = c.getPluginDatas(LocalPluginData2.class); + assertNotNull(localPluginData2s); + assertEquals(0,localPluginData2s.size()); + + List pluginDatas = c.getPluginDatas(PluginData.class); + assertNotNull(pluginDatas); + assertEquals(3,pluginDatas.size()); + + })); + + // build the plugin + TestPluginData testPluginData = pluginDataBuilder.build(); + Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData); + + Plugin localPlugin = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .addPluginData(new LocalPluginData())// + .build(); + + // run the simulation + Simulation.builder()// + .addPlugin(testPlugin)// + .addPlugin(localPlugin)// + .build()// + .execute();// + + // precondition test: if the class reference is null + ContractException contractException = assertThrows(ContractException.class, () -> { + Simulation.builder()// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder().addTestActorPlan("actor", new TestActorPlan(0, (c) -> { + c.getPluginDatas(null); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + } } \ No newline at end of file diff --git a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DataManagerContext.java b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DataManagerContext.java index de788dfb7..3ce1cd0ba 100644 --- a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DataManagerContext.java +++ b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DataManagerContext.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -1333,4 +1334,163 @@ public void testGetDataManagerId() { .execute();// } + + private static class LocalPluginData implements PluginData { + + public static class Builder implements PluginDataBuilder { + @Override + public LocalPluginData build() { + return new LocalPluginData(); + } + } + + @Override + public PluginDataBuilder toBuilder() { + return new Builder(); + } + } + + private static class LocalPluginData2 implements PluginData { + + public static class Builder implements PluginDataBuilder { + @Override + public LocalPluginData2 build() { + return new LocalPluginData2(); + } + } + + @Override + public PluginDataBuilder toBuilder() { + return new Builder(); + } + } + + @Test + @UnitTestMethod(target = DimensionContext.class, name = "getPluginData", args = { Class.class }) + public void testGetPluginData() { + + TestPluginData.Builder pluginDataBuilder = TestPluginData.builder(); + pluginDataBuilder.addTestDataManager("dm", ()->new TestDataManager()); + + pluginDataBuilder.addTestDataManagerPlan("dm", new TestDataManagerPlan(0, (c) -> { + Optional optional1 = c.getPluginData(LocalPluginData.class); + assertTrue(optional1.isPresent()); + Optional optional2 = c.getPluginData(LocalPluginData2.class); + assertFalse(optional2.isPresent()); + + })); + + // build the plugin + TestPluginData testPluginData = pluginDataBuilder.build(); + Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData); + + Plugin localPlugin = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .build(); + + // run the simulation + Simulation.builder()// + .addPlugin(testPlugin)// + .addPlugin(localPlugin)// + .build()// + .execute();// + + // precondition test: if more than one plugin data object matches the class + // reference + ContractException contractException = assertThrows(ContractException.class, () -> { + Plugin lp = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .addPluginData(new LocalPluginData())// + .build(); + + Simulation.builder()// + .addPlugin(lp)// + .addPlugin(TestPlugin.getTestPlugin( + + TestPluginData.builder()// + .addTestDataManager("dm", ()->new TestDataManager())// + .addTestActorPlan("dm", new TestActorPlan(0, (c) -> { + c.getPluginData(LocalPluginData.class); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.AMBIGUOUS_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + // precondition test: if the class reference is null + contractException = assertThrows(ContractException.class, () -> { + Simulation.builder()// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder()// + .addTestDataManager("dm", ()->new TestDataManager()) + .addTestActorPlan("dm", new TestActorPlan(0, (c) -> { + c.getPluginData(null); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + } + + @Test + @UnitTestMethod(target = DimensionContext.class, name = "getPluginDatas", args = { Class.class }) + public void testGetPluginDatas() { + /* + * Returns the plugin data objects associated with the given class reference + * + * @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if + * the class reference is null + */ + TestPluginData.Builder pluginDataBuilder = TestPluginData.builder(); + pluginDataBuilder.addTestDataManager("dm",()->new TestDataManager()); + pluginDataBuilder.addTestDataManagerPlan("dm", new TestDataManagerPlan(0, (c) -> { + List localPluginDatas = c.getPluginDatas(LocalPluginData.class); + assertNotNull(localPluginDatas); + assertEquals(2,localPluginDatas.size()); + + List localPluginData2s = c.getPluginDatas(LocalPluginData2.class); + assertNotNull(localPluginData2s); + assertEquals(0,localPluginData2s.size()); + + List pluginDatas = c.getPluginDatas(PluginData.class); + assertNotNull(pluginDatas); + assertEquals(3,pluginDatas.size()); + + })); + + // build the plugin + TestPluginData testPluginData = pluginDataBuilder.build(); + Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData); + + Plugin localPlugin = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .addPluginData(new LocalPluginData())// + .build(); + + // run the simulation + Simulation.builder()// + .addPlugin(testPlugin)// + .addPlugin(localPlugin)// + .build()// + .execute();// + + // precondition test: if the class reference is null + ContractException contractException = assertThrows(ContractException.class, () -> { + Simulation.builder()// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder()// + .addTestDataManager("dm", ()->new TestDataManager())// + .addTestActorPlan("dm", new TestActorPlan(0, (c) -> { + c.getPluginDatas(null); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + } } diff --git a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DimesionContext.java b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DimesionContext.java index acf302803..050b28186 100644 --- a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DimesionContext.java +++ b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_DimesionContext.java @@ -262,4 +262,6 @@ public void testBuild() { assertEquals(expectedContents, actualContents); } + + } diff --git a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ReportContext.java b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ReportContext.java index ff511fd34..4bc174c53 100644 --- a/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ReportContext.java +++ b/simulation/src/test/java/gov/hhs/aspr/ms/gcm/simulation/nucleus/AT_ReportContext.java @@ -13,6 +13,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -820,4 +821,164 @@ private void planRetrievalSimCloseSubscribe(ReportContext context, List {})); + + pluginDataBuilder.addTestReportPlan("report", new TestReportPlan(0, (c) -> { + Optional optional1 = c.getPluginData(LocalPluginData.class); + assertTrue(optional1.isPresent()); + Optional optional2 = c.getPluginData(LocalPluginData2.class); + assertFalse(optional2.isPresent()); + + })); + + // build the plugin + TestPluginData testPluginData = pluginDataBuilder.build(); + Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData); + + Plugin localPlugin = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .build(); + + // run the simulation + Simulation.builder()// + .addPlugin(testPlugin)// + .addPlugin(localPlugin)// + .build()// + .execute();// + + // precondition test: if more than one plugin data object matches the class + // reference + ContractException contractException = assertThrows(ContractException.class, () -> { + Plugin lp = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .addPluginData(new LocalPluginData())// + .build(); + + Simulation.builder()// + .addPlugin(lp)// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder()// + .addTestActorPlan("actor", new TestActorPlan(10, (c) -> {}))// + .addTestReportPlan("report", new TestReportPlan(0, (c) -> { + c.getPluginData(LocalPluginData.class); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.AMBIGUOUS_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + // precondition test: if the class reference is null + contractException = assertThrows(ContractException.class, () -> { + Simulation.builder()// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder()// + .addTestActorPlan("actor", new TestActorPlan(10, (c) -> {}))// + .addTestReportPlan("dm", new TestReportPlan(0, (c) -> { + c.getPluginData(null); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + } + + @Test + @UnitTestMethod(target = ReportContext.class, name = "getPluginDatas", args = { Class.class }) + public void testGetPluginDatas() { + /* + * Returns the plugin data objects associated with the given class reference + * + * @throws ContractException {@linkplain NucleusError#NULL_PLUGIN_DATA_CLASS} if + * the class reference is null + */ + TestPluginData.Builder pluginDataBuilder = TestPluginData.builder(); + pluginDataBuilder.addTestActorPlan("actor", new TestActorPlan(10, (c) -> {})); + pluginDataBuilder.addTestReportPlan("report", new TestReportPlan(4, (c) -> { + List localPluginDatas = c.getPluginDatas(LocalPluginData.class); + assertNotNull(localPluginDatas); + assertEquals(2,localPluginDatas.size()); + + List localPluginData2s = c.getPluginDatas(LocalPluginData2.class); + assertNotNull(localPluginData2s); + assertEquals(0,localPluginData2s.size()); + + List pluginDatas = c.getPluginDatas(PluginData.class); + assertNotNull(pluginDatas); + assertEquals(3,pluginDatas.size()); + + })); + + // build the plugin + TestPluginData testPluginData = pluginDataBuilder.build(); + Plugin testPlugin = TestPlugin.getTestPlugin(testPluginData); + + Plugin localPlugin = Plugin.builder()// + .setPluginId(new SimplePluginId("localPlugin"))// + .addPluginData(new LocalPluginData())// + .addPluginData(new LocalPluginData())// + .build(); + + // run the simulation + Simulation.builder()// + .addPlugin(testPlugin)// + .addPlugin(localPlugin)// + .build()// + .execute();// + + // precondition test: if the class reference is null + ContractException contractException = assertThrows(ContractException.class, () -> { + Simulation.builder()// + .addPlugin(TestPlugin.getTestPlugin( + TestPluginData.builder()// + .addTestActorPlan("actor", new TestActorPlan(10, (c) -> {}))// + .addTestReportPlan("report", new TestReportPlan(0, (c) -> { + c.getPluginDatas(null); + })).build()))// + .build()// + .execute();// + }); + assertEquals(NucleusError.NULL_PLUGIN_DATA_CLASS, contractException.getErrorType()); + + } + }