Refactor Renderer Module Management

- Renamed `moduleManager` to `moduleService` in RendererData for clarity.
- Updated G2DRenderer to use the new module service methods with string IDs instead of class references.
- Modified RendererWorkingSet interface and implementation to use string IDs for module identification instead of class types.
- Adjusted tests in ModuleManagerTest and RendererWorkingSetImplTest to reflect changes in module management and identification.
- Ensured consistency across the codebase by replacing class references with module IDs in method calls and assertions.
This commit is contained in:
extio-de
2025-12-25 11:56:09 +01:00
parent 72cc5afe8a
commit b0bc14793f
10 changed files with 308 additions and 360 deletions

View File

@@ -12,12 +12,18 @@ public abstract class AbstractModule {
protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractModule.class); protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractModule.class);
protected String id = "Module_" + System.identityHashCode(this);
private ModuleService moduleService; private ModuleService moduleService;
public AbstractModule() { public AbstractModule() {
} }
public String getId() {
return this.id;
}
public void onLoad() { public void onLoad() {
} }
@@ -46,7 +52,7 @@ public abstract class AbstractModule {
return moduleService; return moduleService;
} }
public void setModuleService(ModuleService moduleService) { public void setModuleService(final ModuleService moduleService) {
this.moduleService = moduleService; this.moduleService = moduleService;
} }

View File

@@ -4,9 +4,9 @@ import java.util.List;
public interface ModuleService { public interface ModuleService {
void loadModule(Class<? extends AbstractModule> clazz); void loadModule(AbstractModule module);
void unloadModule(Class<? extends AbstractModule> clazz); void unloadModule(String id);
List<AbstractModule> getModulesAll(); List<AbstractModule> getModulesAll();
@@ -16,23 +16,17 @@ public interface ModuleService {
List<AbstractClientModule> getModulesDisplayedClientModules(); List<AbstractClientModule> getModulesDisplayedClientModules();
void changeActiveState(String className, boolean active); void changeActiveState(String id, boolean active);
void changeActiveState(Class<? extends AbstractModule> clazz, boolean active);
void deactivateAll(); void deactivateAll();
void changeDisplayState(String className, boolean active); void changeDisplayState(String id, boolean display);
void changeDisplayState(Class<? extends AbstractClientModule> clazz, boolean display); boolean isDisplayed(String id);
boolean isDisplayed(String className);
boolean isDisplayed(Class<? extends AbstractClientModule> clazz);
void hideAll(); void hideAll();
void hideExcept(String... classNames); void hideExcept(String... ids);
void restoreVisibility(); void restoreVisibility();

View File

@@ -3,6 +3,7 @@ package de.extio.game_engine.module;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.concurrent.ConcurrentHashMap;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@@ -24,6 +25,8 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService {
private final List<AbstractModule> modulesAll = Collections.synchronizedList(new ArrayList<>()); private final List<AbstractModule> modulesAll = Collections.synchronizedList(new ArrayList<>());
private final Map<String, AbstractModule> modulesByIdMap = new ConcurrentHashMap<>();
private final RendererWorkingSet rendererWorkingSet; private final RendererWorkingSet rendererWorkingSet;
private List<AbstractModule> modulesAllView = List.of(); private List<AbstractModule> modulesAllView = List.of();
@@ -77,26 +80,19 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService {
} }
@Override @Override
public synchronized void loadModule(final Class<? extends AbstractModule> clazz) { public synchronized void loadModule(final AbstractModule module) {
synchronized (this.modulesAll) { if (this.modulesByIdMap.containsKey(module.getId())) {
if (this.modulesAll.stream().anyMatch(module -> clazz.isInstance(module))) { LOGGER.debug("AbstractModule already loaded: " + module.getId());
LOGGER.debug("AbstractModule already loaded: " + clazz.getName());
return; return;
} }
}
try {
final AbstractModule module = AbstractModule.class.cast(clazz.getDeclaredConstructor().newInstance());
this.load(module); this.load(module);
} }
catch (final Exception e) {
LOGGER.error("Error loading module " + clazz.getName(), e);
}
}
private void load(final AbstractModule module) { private void load(final AbstractModule module) {
module.setModuleService(this); module.setModuleService(this);
this.modulesAll.add(module); this.modulesAll.add(module);
this.modulesByIdMap.put(module.getId(), module);
this.sortModules(this.modulesAll); this.sortModules(this.modulesAll);
synchronized (this.modulesAll) { synchronized (this.modulesAll) {
this.modulesAllView = List.copyOf(this.modulesAll); this.modulesAllView = List.copyOf(this.modulesAll);
@@ -106,20 +102,18 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService {
} }
@Override @Override
public synchronized void unloadModule(final Class<? extends AbstractModule> clazz) { public synchronized void unloadModule(final String id) {
try { try {
AbstractModule module; final AbstractModule module = this.modulesByIdMap.get(id);
synchronized (this.modulesAll) {
module = this.modulesAll.stream().filter(mod -> clazz.isInstance(mod)).findAny().orElse(null);
}
if (module == null) { if (module == null) {
LOGGER.debug("AbstractModule not loaded: " + clazz.getName()); LOGGER.debug("AbstractModule not loaded: " + id);
return; return;
} }
this.changeActiveState(clazz, false); this.changeActiveState(id, false);
this.modulesAll.remove(module); this.modulesAll.remove(module);
this.modulesByIdMap.remove(id);
this.sortModules(this.modulesAll); this.sortModules(this.modulesAll);
synchronized (this.modulesAll) { synchronized (this.modulesAll) {
this.modulesAllView = List.copyOf(this.modulesAll); this.modulesAllView = List.copyOf(this.modulesAll);
@@ -127,36 +121,25 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService {
this.invokeSafe(module, m -> m.onUnload()); this.invokeSafe(module, m -> m.onUnload());
if (module instanceof final AbstractClientModule clientModule) { if (module instanceof final AbstractClientModule clientModule) {
this.rendererWorkingSet.clear(clientModule.getClass()); this.rendererWorkingSet.clear(clientModule.getId());
} }
LOGGER.info("Unloaded module " + clazz.getName()); LOGGER.info("Unloaded module " + id);
} }
catch (final Exception e) { catch (final Exception e) {
LOGGER.error("Error unloading module " + clazz.getName(), e); LOGGER.error("Error unloading module " + id, e);
} }
} }
@Override @Override
public void changeActiveState(final String className, final boolean active) { public synchronized void changeActiveState(final String id, final boolean active) {
try {
final var clazz = Class.forName(className);
this.changeActiveState(clazz.asSubclass(AbstractModule.class), active);
}
catch (final ClassNotFoundException e) {
LOGGER.error("Class not found: " + className, e);
}
}
@Override
public synchronized void changeActiveState(final Class<? extends AbstractModule> clazz, final boolean active) {
this.modulesActiveView.stream() this.modulesActiveView.stream()
.filter(module -> clazz.isAssignableFrom(module.getClass())) .filter(module -> module.getId().equals(id))
.findAny() .findAny()
.ifPresentOrElse(module -> { .ifPresentOrElse(module -> {
if (!active) { if (!active) {
if (module instanceof final AbstractClientModule clientModule) { if (module instanceof final AbstractClientModule clientModule) {
this.changeDisplayState(clientModule.getClass(), false); this.changeDisplayState(clientModule.getId(), false);
} }
this.modulesActive.remove(module); this.modulesActive.remove(module);
this.sortModules(this.modulesActive); this.sortModules(this.modulesActive);
@@ -168,7 +151,7 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService {
.toList(); .toList();
} }
if (module instanceof final AbstractClientModule clientModule) { if (module instanceof final AbstractClientModule clientModule) {
this.rendererWorkingSet.clear(clientModule.getClass()); this.rendererWorkingSet.clear(clientModule.getId());
} }
synchronized (this.executorCallbackMap) { synchronized (this.executorCallbackMap) {
final var subscriptions = module.executorCallbackSubscriptions(); final var subscriptions = module.executorCallbackSubscriptions();
@@ -180,17 +163,14 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService {
} }
this.invokeSafe(module, AbstractModule::onDeactivate); this.invokeSafe(module, AbstractModule::onDeactivate);
LOGGER.info("Deactivated " + clazz.getName()); LOGGER.info("Deactivated " + id);
} }
}, () -> { }, () -> {
if (active) { if (active) {
synchronized (this.modulesAll) { final AbstractModule module = this.modulesByIdMap.get(id);
this.modulesAll.stream() if (module != null) {
.filter(module -> clazz.isAssignableFrom(module.getClass()))
.findFirst()
.ifPresent(module -> {
if (module instanceof final AbstractClientModule clientModule && clientModule.isAlwaysDisplay()) { if (module instanceof final AbstractClientModule clientModule && clientModule.isAlwaysDisplay()) {
this.changeDisplayState(clientModule.getClass(), true); this.changeDisplayState(clientModule.getId(), true);
} }
this.modulesActive.add(module); this.modulesActive.add(module);
this.sortModules(this.modulesActive); this.sortModules(this.modulesActive);
@@ -211,8 +191,7 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService {
} }
this.invokeSafe(module, AbstractModule::onActivate); this.invokeSafe(module, AbstractModule::onActivate);
LOGGER.info("Activated " + clazz.getName()); LOGGER.info("Activated " + id);
});
} }
} }
}); });
@@ -221,71 +200,41 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService {
@Override @Override
public void deactivateAll() { public void deactivateAll() {
for (final AbstractModule module : this.modulesActiveView) { for (final AbstractModule module : this.modulesActiveView) {
this.changeActiveState(module.getClass(), false); this.changeActiveState(module.getId(), false);
} }
this.lastVisibleStates.clear(); this.lastVisibleStates.clear();
} }
@Override @Override
public void changeDisplayState(final String className, final boolean active) { public synchronized void changeDisplayState(final String id, final boolean display) {
try { final AbstractModule module = this.modulesByIdMap.get(id);
final var clazz = Class.forName(className); if (module instanceof final AbstractClientModule clientModule) {
this.changeDisplayState(clazz.asSubclass(AbstractClientModule.class), active);
}
catch (final ClassNotFoundException e) {
LOGGER.error("Class not found: " + className, e);
}
}
@Override
public synchronized void changeDisplayState(final Class<? extends AbstractClientModule> clazz, final boolean display) {
synchronized (this.modulesAll) {
synchronized (this.modulesDisplayed) { synchronized (this.modulesDisplayed) {
for (final var module : this.modulesAll) { final boolean curDisplayed = this.modulesDisplayed.stream().anyMatch(mod -> mod.getId().equals(id));
if (module instanceof final AbstractClientModule clientModule && clazz.isAssignableFrom(module.getClass())) {
final boolean curDisplayed = this.modulesDisplayed.stream().anyMatch(mod -> clazz.isAssignableFrom(mod.getClass()));
final boolean doDisplay = display || clientModule.isAlwaysDisplay(); final boolean doDisplay = display || clientModule.isAlwaysDisplay();
if (doDisplay && !curDisplayed) { if (doDisplay && !curDisplayed) {
this.modulesDisplayed.add(clientModule); this.modulesDisplayed.add(clientModule);
clientModule.setDisplayed(true); clientModule.setDisplayed(true);
LOGGER.info("Displayed {}", clazz.getName()); LOGGER.info("Displayed {}", id);
this.invokeSafe(clientModule, m -> ((AbstractClientModule) m).onShow()); this.invokeSafe(clientModule, m -> ((AbstractClientModule) m).onShow());
} }
else if (!doDisplay && curDisplayed) { else if (!doDisplay && curDisplayed) {
clientModule.setDisplayed(false); clientModule.setDisplayed(false);
this.modulesDisplayed.removeIf(mod -> clazz.isAssignableFrom(mod.getClass())); this.modulesDisplayed.removeIf(mod -> mod.getId().equals(id));
LOGGER.info("Hidden {}", clazz.getName()); LOGGER.info("Hidden {}", id);
this.invokeSafe(clientModule, m -> ((AbstractClientModule) m).onHide()); this.invokeSafe(clientModule, m -> ((AbstractClientModule) m).onHide());
} }
this.modulesDisplayedClientModulesView = List.copyOf(this.modulesDisplayed); this.modulesDisplayedClientModulesView = List.copyOf(this.modulesDisplayed);
break;
}
}
} }
} }
} }
@Override @Override
public boolean isDisplayed(final String className) { public boolean isDisplayed(final String id) {
try { final var module = this.modulesByIdMap.get(id);
final var clazz = Class.forName(className); if (module != null && module instanceof final AbstractClientModule clientModule) {
return this.isDisplayed(clazz.asSubclass(AbstractClientModule.class)); return clientModule.isDisplayed();
}
catch (final ClassNotFoundException e) {
LOGGER.error("Class not found: " + className, e);
return false;
}
}
@Override
public boolean isDisplayed(final Class<? extends AbstractClientModule> clazz) {
final var modules = this.modulesDisplayedClientModulesView;
for (int i = 0; i < modules.size(); i++) {
if (clazz.isAssignableFrom(modules.get(i).getClass())) {
return true;
}
} }
return false; return false;
} }
@@ -297,23 +246,23 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService {
final var modules = this.modulesDisplayedClientModulesView; final var modules = this.modulesDisplayedClientModulesView;
for (final var module : modules) { for (final var module : modules) {
if ((module instanceof final AbstractClientModule clientModule) && !clientModule.isAlwaysDisplay()) { if ((module instanceof final AbstractClientModule clientModule) && !clientModule.isAlwaysDisplay()) {
this.changeDisplayState(clientModule.getClass(), false); this.changeDisplayState(clientModule.getId(), false);
} }
} }
} }
@Override @Override
@SafeVarargs @SafeVarargs
public final void hideExcept(final String... classNames) { public final void hideExcept(final String... ids) {
final List<AbstractClientModule> state = new ArrayList<>(); final List<AbstractClientModule> state = new ArrayList<>();
final var keep = new HashSet<>(Arrays.asList(classNames)); final var keep = new HashSet<>(Arrays.asList(ids));
final var modules = this.modulesDisplayedClientModulesView; final var modules = this.modulesDisplayedClientModulesView;
for (final var module : modules) { for (final var module : modules) {
if (module instanceof final AbstractClientModule clientModule && if (module instanceof final AbstractClientModule clientModule &&
!clientModule.isAlwaysDisplay() && !clientModule.isAlwaysDisplay() &&
!keep.contains(clientModule.getClass().getName())) { !keep.contains(clientModule.getId())) {
this.changeDisplayState(clientModule.getClass(), false); this.changeDisplayState(clientModule.getId(), false);
state.add(clientModule); state.add(clientModule);
} }
} }
@@ -331,7 +280,7 @@ public class ModuleServiceImpl implements InitializingBean, ModuleService {
synchronized (this.lastVisibleStates) { synchronized (this.lastVisibleStates) {
for (final AbstractClientModule module : this.lastVisibleStates.pop()) { for (final AbstractClientModule module : this.lastVisibleStates.pop()) {
this.changeDisplayState(module.getClass(), true); this.changeDisplayState(module.getId(), true);
} }
} }
} }

View File

@@ -1,7 +1,6 @@
package de.extio.game_engine.renderer; package de.extio.game_engine.renderer;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Consumer;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
@@ -40,7 +39,7 @@ public class RendererData {
private final RendererWorkingSet rendererWorkingSet; private final RendererWorkingSet rendererWorkingSet;
private final ModuleService moduleManager; private final ModuleService moduleService;
private final ModuleExecutor moduleExecutor; private final ModuleExecutor moduleExecutor;
@@ -48,7 +47,7 @@ public class RendererData {
private RendererLoop rendererLoop; private RendererLoop rendererLoop;
public RendererData(final ApplicationContext applicationContext, final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final KeycodeRegistry keycodeRegistry, final EventService eventService, final StorageService storageService, final RendererWorkingSet rendererWorkingSet, final ModuleService moduleManager, final ModuleExecutor moduleExecutor, final StaticResourceService staticResourceService) { public RendererData(final ApplicationContext applicationContext, final Renderer renderer, final RendererControl rendererControl, final RenderingBoPool renderingBoPool, final KeycodeRegistry keycodeRegistry, final EventService eventService, final StorageService storageService, final RendererWorkingSet rendererWorkingSet, final ModuleService moduleService, final ModuleExecutor moduleExecutor, final StaticResourceService staticResourceService) {
this.applicationContext = applicationContext; this.applicationContext = applicationContext;
this.renderer = renderer; this.renderer = renderer;
this.rendererControl = rendererControl; this.rendererControl = rendererControl;
@@ -57,7 +56,7 @@ public class RendererData {
this.eventService = eventService; this.eventService = eventService;
this.storageService = storageService; this.storageService = storageService;
this.rendererWorkingSet = rendererWorkingSet; this.rendererWorkingSet = rendererWorkingSet;
this.moduleManager = moduleManager; this.moduleService = moduleService;
this.moduleExecutor = moduleExecutor; this.moduleExecutor = moduleExecutor;
this.staticResourceService = staticResourceService; this.staticResourceService = staticResourceService;
} }
@@ -118,8 +117,8 @@ public class RendererData {
return rendererWorkingSet; return rendererWorkingSet;
} }
public ModuleService getModuleManager() { public ModuleService getModuleService() {
return moduleManager; return moduleService;
} }
public ModuleExecutor getModuleExecutor() { public ModuleExecutor getModuleExecutor() {

View File

@@ -56,6 +56,8 @@ public class G2DRenderer implements Renderer {
private volatile G2DMainFrame mainFrame; private volatile G2DMainFrame mainFrame;
private String rendererModuleId;
private RendererData rendererData; private RendererData rendererData;
private long fpsMeasurement; private long fpsMeasurement;
@@ -90,9 +92,11 @@ public class G2DRenderer implements Renderer {
try { try {
LOGGER.info("show()"); LOGGER.info("show()");
this.rendererData.getModuleManager().loadModule(G2DRendererModule.class); final var rendererModule = new G2DRendererModule();
this.rendererData.getModuleManager().changeActiveState(G2DRendererModule.class, true); this.rendererModuleId = rendererModule.getId();
this.rendererData.getModuleManager().changeDisplayState(G2DRendererModule.class, true); this.rendererData.getModuleService().loadModule(rendererModule);
this.rendererData.getModuleService().changeActiveState(rendererModule.getId(), true);
this.rendererData.getModuleService().changeDisplayState(rendererModule.getId(), true);
EventQueue.invokeAndWait(() -> { EventQueue.invokeAndWait(() -> {
this.rendererData.getRendererControl().applyVideoOptions(); this.rendererData.getRendererControl().applyVideoOptions();
@@ -100,8 +104,8 @@ public class G2DRenderer implements Renderer {
EventQueue.invokeAndWait(() -> { EventQueue.invokeAndWait(() -> {
// this invokeAndWait() call is also important to wait until applyVideoOptions() has been completed, which also puts events to AWT event queue // this invokeAndWait() call is also important to wait until applyVideoOptions() has been completed, which also puts events to AWT event queue
LOGGER.debug("Viewport initialized"); LOGGER.debug("Viewport initialized");
this.rendererData.getRendererWorkingSet().add(G2DRendererModule.class, this.rendererData.getRenderingBoPool().acquire("G2DRenderer_background", G2DDrawBackground.class)); this.rendererData.getRendererWorkingSet().add(this.rendererModuleId, this.rendererData.getRenderingBoPool().acquire("G2DRenderer_background", G2DDrawBackground.class));
this.rendererData.getRendererWorkingSet().add(G2DRendererModule.class, this.rendererData.getRenderingBoPool().acquire("G2DRenderer_tooltip", G2DDrawControlTooltip.class)); this.rendererData.getRendererWorkingSet().add(this.rendererModuleId, this.rendererData.getRenderingBoPool().acquire("G2DRenderer_tooltip", G2DDrawControlTooltip.class));
}); });
} }
catch (InvocationTargetException | InterruptedException e) { catch (InvocationTargetException | InterruptedException e) {
@@ -169,8 +173,8 @@ public class G2DRenderer implements Renderer {
} }
this.drawStatistics(); this.drawStatistics();
this.rendererData.getRendererWorkingSet().commit(G2DRendererModule.class, true); this.rendererData.getRendererWorkingSet().commit(this.rendererModuleId, true);
this.rendererData.getRendererWorkingSet().getLiveSet(this.renderingBOs, clientModuleClass -> this.rendererData.getModuleManager().isDisplayed(clientModuleClass)); this.rendererData.getRendererWorkingSet().getLiveSet(this.renderingBOs, this.rendererData.getModuleService()::isDisplayed);
this.renderingBOs.sort((bo0, bo1) -> bo0.getLayer().compareTo(bo1.getLayer())); this.renderingBOs.sort((bo0, bo1) -> bo0.getLayer().compareTo(bo1.getLayer()));
Graphics2D screenGraphics = null; Graphics2D screenGraphics = null;
@@ -195,7 +199,7 @@ public class G2DRenderer implements Renderer {
} }
} }
this.rendererData.getRendererWorkingSet().get(G2DRendererModule.class, "G2DRenderer_tooltip").closeStatic(); this.rendererData.getRendererWorkingSet().get(this.rendererModuleId, "G2DRenderer_tooltip").closeStatic();
// //
// Rendering cycle END // Rendering cycle END
@@ -251,14 +255,14 @@ public class G2DRenderer implements Renderer {
.setColor(RgbaColor.WHITE) .setColor(RgbaColor.WHITE)
.setLayer(RenderingBoLayer.TOP) .setLayer(RenderingBoLayer.TOP)
.withPositionAbsoluteAnchorTopRight(100, 35); .withPositionAbsoluteAnchorTopRight(100, 35);
this.rendererData.getRendererWorkingSet().add(G2DRendererModule.class, drawFont); this.rendererData.getRendererWorkingSet().add(this.rendererModuleId, drawFont);
this.fpsHistory.add(Integer.valueOf((int) this.frameDur)); this.fpsHistory.add(Integer.valueOf((int) this.frameDur));
final var drawFpsHistory = this.rendererData.getRenderingBoPool().acquire("g2DRenderer_fpsHistory", G2DDrawFpsHistory.class) final var drawFpsHistory = this.rendererData.getRenderingBoPool().acquire("g2DRenderer_fpsHistory", G2DDrawFpsHistory.class)
.setHistory(this.fpsHistory) .setHistory(this.fpsHistory)
.setLayer(RenderingBoLayer.TOP) .setLayer(RenderingBoLayer.TOP)
.withPositionAbsoluteAnchorTopRight(100, 50); .withPositionAbsoluteAnchorTopRight(100, 50);
this.rendererData.getRendererWorkingSet().add(G2DRendererModule.class, drawFpsHistory); this.rendererData.getRendererWorkingSet().add(this.rendererModuleId, drawFpsHistory);
} }
private void frameCap() throws InterruptedException { private void frameCap() throws InterruptedException {

View File

@@ -4,23 +4,22 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Predicate; import java.util.function.Predicate;
import de.extio.game_engine.module.AbstractClientModule;
import de.extio.game_engine.renderer.model.RenderingBo; import de.extio.game_engine.renderer.model.RenderingBo;
public interface RendererWorkingSet { public interface RendererWorkingSet {
void add(Class<? extends AbstractClientModule> producer, RenderingBo work); void add(String producerId, RenderingBo work);
void add(Class<? extends AbstractClientModule> producer, List<RenderingBo> work); void add(String producerId, List<RenderingBo> work);
RenderingBo get(Class<? extends AbstractClientModule> producer, String id); RenderingBo get(String producerId, String id);
Map<String, RenderingBo> getUncommittedWork(Class<? extends AbstractClientModule> producer); Map<String, RenderingBo> getUncommittedWork(String producerId);
Map<String, RenderingBo> commit(Class<? extends AbstractClientModule> producer, boolean clone); Map<String, RenderingBo> commit(String producerId, boolean clone);
void clear(Class<? extends AbstractClientModule> producer); void clear(String producerId);
void getLiveSet(List<RenderingBo> combinedLiveSet, Predicate<Class<? extends AbstractClientModule>> filter); void getLiveSet(List<RenderingBo> combinedLiveSet, Predicate<String> filter);
} }

View File

@@ -13,12 +13,11 @@ import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Predicate; import java.util.function.Predicate;
import de.extio.game_engine.module.AbstractClientModule;
import de.extio.game_engine.renderer.model.RenderingBo; import de.extio.game_engine.renderer.model.RenderingBo;
public class RendererWorkingSetImpl implements RendererWorkingSet { public class RendererWorkingSetImpl implements RendererWorkingSet {
private final ConcurrentMap<Class<? extends AbstractClientModule>, RendererWork> workingSet = new ConcurrentHashMap<>(); private final ConcurrentMap<String, RendererWork> workingSet = new ConcurrentHashMap<>();
private final BlockingQueue<Map<String, RenderingBo>> mapsPool = new ArrayBlockingQueue<>(100); private final BlockingQueue<Map<String, RenderingBo>> mapsPool = new ArrayBlockingQueue<>(100);
@@ -31,34 +30,34 @@ public class RendererWorkingSetImpl implements RendererWorkingSet {
} }
@Override @Override
public void add(final Class<? extends AbstractClientModule> producer, final RenderingBo work) { public void add(final String producerId, final RenderingBo work) {
this.getWorkingSetByProducer(producer) this.getWorkingSetByProducer(producerId)
.next() .next()
.put(work.getId(), work); .put(work.getId(), work);
} }
@Override @Override
public void add(final Class<? extends AbstractClientModule> producer, final List<RenderingBo> work) { public void add(final String producerId, final List<RenderingBo> work) {
final var nextMap = this.getWorkingSetByProducer(producer).next(); final var nextMap = this.getWorkingSetByProducer(producerId).next();
for (final RenderingBo bo : work) { for (final RenderingBo bo : work) {
nextMap.put(bo.getId(), bo); nextMap.put(bo.getId(), bo);
} }
} }
@Override @Override
public Map<String, RenderingBo> getUncommittedWork(final Class<? extends AbstractClientModule> producer) { public Map<String, RenderingBo> getUncommittedWork(final String producerId) {
return this.getWorkingSetByProducer(producer).next(); return this.getWorkingSetByProducer(producerId).next();
} }
@Override @Override
public RenderingBo get(final Class<? extends AbstractClientModule> producer, final String id) { public RenderingBo get(final String producerId, final String id) {
return this.getWorkingSetByProducer(producer).next().get(id); return this.getWorkingSetByProducer(producerId).next().get(id);
} }
@Override @Override
public Map<String, RenderingBo> commit(final Class<? extends AbstractClientModule> producer, final boolean clone) { public Map<String, RenderingBo> commit(final String producerId, final boolean clone) {
final AtomicReference<Map<String, RenderingBo>> previousWork = new AtomicReference<>(); final AtomicReference<Map<String, RenderingBo>> previousWork = new AtomicReference<>();
final RendererWork rendererWork = this.workingSet.compute(producer, (k, v) -> { final RendererWork rendererWork = this.workingSet.compute(producerId, (k, v) -> {
if (v == null) { if (v == null) {
return new RendererWork(this.obtainMapFromPool(), this.obtainMapFromPool()); return new RendererWork(this.obtainMapFromPool(), this.obtainMapFromPool());
} }
@@ -82,8 +81,8 @@ public class RendererWorkingSetImpl implements RendererWorkingSet {
} }
@Override @Override
public void clear(final Class<? extends AbstractClientModule> producer) { public void clear(final String producerId) {
final RendererWork rendererWork = this.workingSet.remove(producer); final RendererWork rendererWork = this.workingSet.remove(producerId);
if (rendererWork != null) { if (rendererWork != null) {
this.releaseBoClasses(rendererWork.live()); this.releaseBoClasses(rendererWork.live());
this.releaseBoClasses(rendererWork.next()); this.releaseBoClasses(rendererWork.next());
@@ -91,7 +90,7 @@ public class RendererWorkingSetImpl implements RendererWorkingSet {
} }
@Override @Override
public void getLiveSet(final List<RenderingBo> combinedLiveSet, final Predicate<Class<? extends AbstractClientModule>> filter) { public void getLiveSet(final List<RenderingBo> combinedLiveSet, final Predicate<String> filter) {
this.workingSet.forEach((producer, rendererWork) -> { this.workingSet.forEach((producer, rendererWork) -> {
if (filter == null || filter.test(producer)) { if (filter == null || filter.test(producer)) {
combinedLiveSet.addAll(rendererWork.live().values()); combinedLiveSet.addAll(rendererWork.live().values());
@@ -99,8 +98,8 @@ public class RendererWorkingSetImpl implements RendererWorkingSet {
}); });
} }
private RendererWork getWorkingSetByProducer(final Class<? extends AbstractClientModule> producer) { private RendererWork getWorkingSetByProducer(final String producerId) {
return this.workingSet.computeIfAbsent(producer, k -> new RendererWork(this.obtainMapFromPool(), this.obtainMapFromPool())); return this.workingSet.computeIfAbsent(producerId, k -> new RendererWork(this.obtainMapFromPool(), this.obtainMapFromPool()));
} }
private void releaseBoClasses(final Map<String, RenderingBo> work) { private void releaseBoClasses(final Map<String, RenderingBo> work) {

View File

@@ -15,8 +15,8 @@ public class DemoModule extends AbstractClientModule {
@Override @Override
public void onLoad() { public void onLoad() {
this.getModuleService().changeActiveState(this.getClass(), true); this.getModuleService().changeActiveState(this.getId(), true);
this.getModuleService().changeDisplayState(this.getClass(), true); this.getModuleService().changeDisplayState(this.getId(), true);
} }
@Override @Override

View File

@@ -71,7 +71,8 @@ public class ModuleManagerTest {
@Test @Test
public void testLoadModule() { public void testLoadModule() {
this.moduleManager.loadModule(AlwaysDisplayModule.class); final var newModule = new AlwaysDisplayModule();
this.moduleManager.loadModule(newModule);
assertEquals(3, this.moduleManager.getModulesAll().size()); assertEquals(3, this.moduleManager.getModulesAll().size());
assertTrue(this.moduleManager.getModulesAll().stream().anyMatch(m -> m instanceof AlwaysDisplayModule)); assertTrue(this.moduleManager.getModulesAll().stream().anyMatch(m -> m instanceof AlwaysDisplayModule));
@@ -81,14 +82,14 @@ public class ModuleManagerTest {
public void testLoadModule_AlreadyLoaded() { public void testLoadModule_AlreadyLoaded() {
final int initialSize = this.moduleManager.getModulesAll().size(); final int initialSize = this.moduleManager.getModulesAll().size();
this.moduleManager.loadModule(TestModule.class); this.moduleManager.loadModule(this.testModule);
assertEquals(initialSize, this.moduleManager.getModulesAll().size()); assertEquals(initialSize, this.moduleManager.getModulesAll().size());
} }
@Test @Test
public void testUnloadModule() { public void testUnloadModule() {
this.moduleManager.unloadModule(TestModule.class); this.moduleManager.unloadModule(this.testModule.getId());
assertEquals(1, this.moduleManager.getModulesAll().size()); assertEquals(1, this.moduleManager.getModulesAll().size());
assertFalse(this.moduleManager.getModulesAll().contains(this.testModule)); assertFalse(this.moduleManager.getModulesAll().contains(this.testModule));
@@ -99,17 +100,17 @@ public class ModuleManagerTest {
public void testUnloadModule_NotLoaded() { public void testUnloadModule_NotLoaded() {
final int initialSize = this.moduleManager.getModulesAll().size(); final int initialSize = this.moduleManager.getModulesAll().size();
this.moduleManager.unloadModule(AlwaysDisplayModule.class); this.moduleManager.unloadModule("NonExistentModule");
assertEquals(initialSize, this.moduleManager.getModulesAll().size()); assertEquals(initialSize, this.moduleManager.getModulesAll().size());
} }
@Test @Test
public void testUnloadModule_DeactivatesFirst() { public void testUnloadModule_DeactivatesFirst() {
this.moduleManager.changeActiveState(TestModule.class, true); this.moduleManager.changeActiveState(this.testModule.getId(), true);
assertTrue(this.moduleManager.getModulesActive().contains(this.testModule)); assertTrue(this.moduleManager.getModulesActive().contains(this.testModule));
this.moduleManager.unloadModule(TestModule.class); this.moduleManager.unloadModule(this.testModule.getId());
assertFalse(this.moduleManager.getModulesActive().contains(this.testModule)); assertFalse(this.moduleManager.getModulesActive().contains(this.testModule));
assertTrue(this.testModule.onDeactivateCalled); assertTrue(this.testModule.onDeactivateCalled);
@@ -117,7 +118,7 @@ public class ModuleManagerTest {
@Test @Test
public void testChangeActiveState_Activate() { public void testChangeActiveState_Activate() {
this.moduleManager.changeActiveState(TestModule.class, true); this.moduleManager.changeActiveState(this.testModule.getId(), true);
assertTrue(this.moduleManager.getModulesActive().contains(this.testModule)); assertTrue(this.moduleManager.getModulesActive().contains(this.testModule));
assertTrue(this.testModule.onActivateCalled); assertTrue(this.testModule.onActivateCalled);
@@ -125,10 +126,10 @@ public class ModuleManagerTest {
@Test @Test
public void testChangeActiveState_Deactivate() { public void testChangeActiveState_Deactivate() {
this.moduleManager.changeActiveState(TestModule.class, true); this.moduleManager.changeActiveState(this.testModule.getId(), true);
this.testModule.onActivateCalled = false; this.testModule.onActivateCalled = false;
this.moduleManager.changeActiveState(TestModule.class, false); this.moduleManager.changeActiveState(this.testModule.getId(), false);
assertFalse(this.moduleManager.getModulesActive().contains(this.testModule)); assertFalse(this.moduleManager.getModulesActive().contains(this.testModule));
assertTrue(this.testModule.onDeactivateCalled); assertTrue(this.testModule.onDeactivateCalled);
@@ -136,42 +137,35 @@ public class ModuleManagerTest {
@Test @Test
public void testChangeActiveState_AlreadyActive() { public void testChangeActiveState_AlreadyActive() {
this.moduleManager.changeActiveState(TestModule.class, true); this.moduleManager.changeActiveState(this.testModule.getId(), true);
this.testModule.onActivateCalled = false; this.testModule.onActivateCalled = false;
this.moduleManager.changeActiveState(TestModule.class, true); this.moduleManager.changeActiveState(this.testModule.getId(), true);
assertFalse(this.testModule.onActivateCalled); assertFalse(this.testModule.onActivateCalled);
} }
@Test @Test
public void testChangeActiveState_AlreadyInactive() { public void testChangeActiveState_AlreadyInactive() {
this.moduleManager.changeActiveState(TestModule.class, false); this.moduleManager.changeActiveState(this.testModule.getId(), false);
assertFalse(this.testModule.onDeactivateCalled); assertFalse(this.testModule.onDeactivateCalled);
} }
@Test
public void testChangeActiveState_ByClassName() {
this.moduleManager.changeActiveState(TestModule.class.getName(), true);
assertTrue(this.moduleManager.getModulesActive().contains(this.testModule));
assertTrue(this.testModule.onActivateCalled);
}
@Test @Test
public void testChangeActiveState_AlwaysDisplayModule() { public void testChangeActiveState_AlwaysDisplayModule() {
this.moduleManager.loadModule(AlwaysDisplayModule.class); final var alwaysDisplayModule = new AlwaysDisplayModule();
this.moduleManager.loadModule(alwaysDisplayModule);
this.moduleManager.changeActiveState(AlwaysDisplayModule.class, true); this.moduleManager.changeActiveState(alwaysDisplayModule.getId(), true);
assertTrue(this.moduleManager.isDisplayed(AlwaysDisplayModule.class)); assertTrue(this.moduleManager.isDisplayed(alwaysDisplayModule.getId()));
} }
@Test @Test
public void testDeactivateAll() { public void testDeactivateAll() {
this.moduleManager.changeActiveState(TestModule.class, true); this.moduleManager.changeActiveState(this.testModule.getId(), true);
this.moduleManager.changeActiveState(TestClientModule.class, true); this.moduleManager.changeActiveState(this.testClientModule.getId(), true);
this.moduleManager.deactivateAll(); this.moduleManager.deactivateAll();
@@ -182,34 +176,34 @@ public class ModuleManagerTest {
@Test @Test
public void testChangeDisplayState_Show() { public void testChangeDisplayState_Show() {
this.moduleManager.changeActiveState(TestClientModule.class, true); this.moduleManager.changeActiveState(this.testClientModule.getId(), true);
this.testClientModule.onShowCalled = false; this.testClientModule.onShowCalled = false;
this.moduleManager.changeDisplayState(TestClientModule.class, true); this.moduleManager.changeDisplayState(this.testClientModule.getId(), true);
assertTrue(this.moduleManager.isDisplayed(TestClientModule.class)); assertTrue(this.moduleManager.isDisplayed(this.testClientModule.getId()));
assertTrue(this.testClientModule.onShowCalled); assertTrue(this.testClientModule.onShowCalled);
} }
@Test @Test
public void testChangeDisplayState_Hide() { public void testChangeDisplayState_Hide() {
this.moduleManager.changeActiveState(TestClientModule.class, true); this.moduleManager.changeActiveState(this.testClientModule.getId(), true);
this.moduleManager.changeDisplayState(TestClientModule.class, true); this.moduleManager.changeDisplayState(this.testClientModule.getId(), true);
this.testClientModule.onHideCalled = false; this.testClientModule.onHideCalled = false;
this.moduleManager.changeDisplayState(TestClientModule.class, false); this.moduleManager.changeDisplayState(this.testClientModule.getId(), false);
assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId()));
assertTrue(this.testClientModule.onHideCalled); assertTrue(this.testClientModule.onHideCalled);
} }
@Test @Test
public void testChangeDisplayState_AlreadyShown() { public void testChangeDisplayState_AlreadyShown() {
this.moduleManager.changeActiveState(TestClientModule.class, true); this.moduleManager.changeActiveState(this.testClientModule.getId(), true);
this.moduleManager.changeDisplayState(TestClientModule.class, true); this.moduleManager.changeDisplayState(this.testClientModule.getId(), true);
this.testClientModule.onShowCalled = false; this.testClientModule.onShowCalled = false;
this.moduleManager.changeDisplayState(TestClientModule.class, true); this.moduleManager.changeDisplayState(this.testClientModule.getId(), true);
assertFalse(this.testClientModule.onShowCalled, "onShow should not be called when already shown"); assertFalse(this.testClientModule.onShowCalled, "onShow should not be called when already shown");
} }
@@ -218,111 +212,98 @@ public class ModuleManagerTest {
public void testChangeDisplayState_AlreadyHidden() { public void testChangeDisplayState_AlreadyHidden() {
this.testClientModule.onHideCalled = false; this.testClientModule.onHideCalled = false;
this.moduleManager.changeDisplayState(TestClientModule.class, false); this.moduleManager.changeDisplayState(this.testClientModule.getId(), false);
assertFalse(this.testClientModule.onHideCalled, "onHide should not be called when already hidden"); assertFalse(this.testClientModule.onHideCalled, "onHide should not be called when already hidden");
} }
@Test
public void testChangeDisplayState_ByClassName() {
this.moduleManager.changeActiveState(TestClientModule.class, true);
this.testClientModule.onShowCalled = false;
this.moduleManager.changeDisplayState(TestClientModule.class.getName(), true);
assertTrue(this.moduleManager.isDisplayed(TestClientModule.class));
}
@Test @Test
public void testChangeDisplayState_AlwaysDisplayModule() { public void testChangeDisplayState_AlwaysDisplayModule() {
this.moduleManager.loadModule(AlwaysDisplayModule.class); final var alwaysDisplayModule = new AlwaysDisplayModule();
this.moduleManager.changeActiveState(AlwaysDisplayModule.class, true); this.moduleManager.loadModule(alwaysDisplayModule);
this.moduleManager.changeActiveState(alwaysDisplayModule.getId(), true);
this.moduleManager.changeDisplayState(AlwaysDisplayModule.class, false); this.moduleManager.changeDisplayState(alwaysDisplayModule.getId(), false);
assertTrue(this.moduleManager.isDisplayed(AlwaysDisplayModule.class)); assertTrue(this.moduleManager.isDisplayed(alwaysDisplayModule.getId()));
}
@Test
public void testIsDisplayed_ByClassName() {
this.moduleManager.changeActiveState(TestClientModule.class, true);
this.moduleManager.changeDisplayState(TestClientModule.class, true);
assertTrue(this.moduleManager.isDisplayed(TestClientModule.class.getName()));
} }
@Test @Test
public void testHideAll() { public void testHideAll() {
this.moduleManager.changeActiveState(TestClientModule.class, true); this.moduleManager.changeActiveState(this.testClientModule.getId(), true);
this.moduleManager.changeDisplayState(TestClientModule.class, true); this.moduleManager.changeDisplayState(this.testClientModule.getId(), true);
this.testClientModule.onHideCalled = false; this.testClientModule.onHideCalled = false;
this.moduleManager.hideAll(); this.moduleManager.hideAll();
assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId()));
assertTrue(this.testClientModule.onHideCalled); assertTrue(this.testClientModule.onHideCalled);
} }
@Test @Test
public void testHideAll_DoesNotHideAlwaysDisplay() { public void testHideAll_DoesNotHideAlwaysDisplay() {
this.moduleManager.loadModule(AlwaysDisplayModule.class); final var alwaysDisplayModule = new AlwaysDisplayModule();
this.moduleManager.changeActiveState(AlwaysDisplayModule.class, true); this.moduleManager.loadModule(alwaysDisplayModule);
this.moduleManager.changeActiveState(TestClientModule.class, true); this.moduleManager.changeActiveState(alwaysDisplayModule.getId(), true);
this.moduleManager.changeDisplayState(TestClientModule.class, true); this.moduleManager.changeActiveState(this.testClientModule.getId(), true);
this.moduleManager.changeDisplayState(this.testClientModule.getId(), true);
this.moduleManager.hideAll(); this.moduleManager.hideAll();
assertTrue(this.moduleManager.isDisplayed(AlwaysDisplayModule.class)); assertTrue(this.moduleManager.isDisplayed(alwaysDisplayModule.getId()));
assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId()));
} }
@Test @Test
public void testHideExcept() { public void testHideExcept() {
this.moduleManager.loadModule(AlwaysDisplayModule.class); final var alwaysDisplayModule = new AlwaysDisplayModule();
this.moduleManager.changeActiveState(TestClientModule.class, true); this.moduleManager.loadModule(alwaysDisplayModule);
this.moduleManager.changeDisplayState(TestClientModule.class, true); this.moduleManager.changeActiveState(this.testClientModule.getId(), true);
this.moduleManager.changeActiveState(AlwaysDisplayModule.class, true); this.moduleManager.changeDisplayState(this.testClientModule.getId(), true);
this.moduleManager.changeActiveState(alwaysDisplayModule.getId(), true);
this.testClientModule.onHideCalled = false; this.testClientModule.onHideCalled = false;
this.moduleManager.hideExcept(AlwaysDisplayModule.class.getName()); this.moduleManager.hideExcept(alwaysDisplayModule.getId());
assertTrue(this.moduleManager.isDisplayed(AlwaysDisplayModule.class)); assertTrue(this.moduleManager.isDisplayed(alwaysDisplayModule.getId()));
assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId()));
assertTrue(this.testClientModule.onHideCalled); assertTrue(this.testClientModule.onHideCalled);
} }
@Test @Test
public void testHideExcept_MultipleExceptions() { public void testHideExcept_MultipleExceptions() {
this.moduleManager.loadModule(AlwaysDisplayModule.class); final var alwaysDisplayModule = new AlwaysDisplayModule();
this.moduleManager.loadModule(HighPriorityModule.class); final var highPriorityModule = new HighPriorityModule();
this.moduleManager.changeActiveState(TestClientModule.class, true); this.moduleManager.loadModule(alwaysDisplayModule);
this.moduleManager.changeDisplayState(TestClientModule.class, true); this.moduleManager.loadModule(highPriorityModule);
this.moduleManager.changeActiveState(AlwaysDisplayModule.class, true); this.moduleManager.changeActiveState(this.testClientModule.getId(), true);
this.moduleManager.changeActiveState(HighPriorityModule.class, true); this.moduleManager.changeDisplayState(this.testClientModule.getId(), true);
this.moduleManager.changeDisplayState(HighPriorityModule.class, true); this.moduleManager.changeActiveState(alwaysDisplayModule.getId(), true);
this.moduleManager.changeActiveState(highPriorityModule.getId(), true);
this.moduleManager.changeDisplayState(highPriorityModule.getId(), true);
this.moduleManager.hideExcept( this.moduleManager.hideExcept(
AlwaysDisplayModule.class.getName(), alwaysDisplayModule.getId(),
HighPriorityModule.class.getName() highPriorityModule.getId()
); );
assertTrue(this.moduleManager.isDisplayed(AlwaysDisplayModule.class)); assertTrue(this.moduleManager.isDisplayed(alwaysDisplayModule.getId()));
assertTrue(this.moduleManager.isDisplayed(HighPriorityModule.class)); assertTrue(this.moduleManager.isDisplayed(highPriorityModule.getId()));
assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId()));
} }
@Test @Test
public void testRestoreVisibility() { public void testRestoreVisibility() {
this.moduleManager.changeActiveState(TestClientModule.class, true); this.moduleManager.changeActiveState(this.testClientModule.getId(), true);
this.moduleManager.changeDisplayState(TestClientModule.class, true); this.moduleManager.changeDisplayState(this.testClientModule.getId(), true);
this.moduleManager.hideExcept(); this.moduleManager.hideExcept();
assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId()));
this.testClientModule.onShowCalled = false; this.testClientModule.onShowCalled = false;
this.moduleManager.restoreVisibility(); this.moduleManager.restoreVisibility();
assertTrue(this.moduleManager.isDisplayed(TestClientModule.class)); assertTrue(this.moduleManager.isDisplayed(this.testClientModule.getId()));
assertTrue(this.testClientModule.onShowCalled); assertTrue(this.testClientModule.onShowCalled);
} }
@@ -330,15 +311,15 @@ public class ModuleManagerTest {
public void testRestoreVisibility_NoState() { public void testRestoreVisibility_NoState() {
this.moduleManager.restoreVisibility(); this.moduleManager.restoreVisibility();
assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId()));
} }
@Test @Test
public void testIsModal() { public void testIsModal() {
assertFalse(this.moduleManager.isModal()); assertFalse(this.moduleManager.isModal());
this.moduleManager.changeActiveState(TestClientModule.class, true); this.moduleManager.changeActiveState(this.testClientModule.getId(), true);
this.moduleManager.changeDisplayState(TestClientModule.class, true); this.moduleManager.changeDisplayState(this.testClientModule.getId(), true);
this.moduleManager.hideExcept(); this.moduleManager.hideExcept();
assertTrue(this.moduleManager.isModal()); assertTrue(this.moduleManager.isModal());
@@ -350,7 +331,8 @@ public class ModuleManagerTest {
@Test @Test
public void testModuleSorting_Priority() { public void testModuleSorting_Priority() {
this.moduleManager.loadModule(HighPriorityModule.class); final var highPriorityModule = new HighPriorityModule();
this.moduleManager.loadModule(highPriorityModule);
final List<AbstractModule> modules = this.moduleManager.getModulesAll(); final List<AbstractModule> modules = this.moduleManager.getModulesAll();
@@ -385,20 +367,20 @@ public class ModuleManagerTest {
@Test @Test
public void testDeactivate_HidesDisplayedClientModule() { public void testDeactivate_HidesDisplayedClientModule() {
this.moduleManager.changeActiveState(TestClientModule.class, true); this.moduleManager.changeActiveState(this.testClientModule.getId(), true);
this.moduleManager.changeDisplayState(TestClientModule.class, true); this.moduleManager.changeDisplayState(this.testClientModule.getId(), true);
this.testClientModule.onHideCalled = false; this.testClientModule.onHideCalled = false;
this.moduleManager.changeActiveState(TestClientModule.class, false); this.moduleManager.changeActiveState(this.testClientModule.getId(), false);
assertFalse(this.moduleManager.isDisplayed(TestClientModule.class)); assertFalse(this.moduleManager.isDisplayed(this.testClientModule.getId()));
assertTrue(this.testClientModule.onHideCalled); assertTrue(this.testClientModule.onHideCalled);
} }
@Test @Test
public void testDeactivateAll_ClearsVisibilityStack() { public void testDeactivateAll_ClearsVisibilityStack() {
this.moduleManager.changeActiveState(TestClientModule.class, true); this.moduleManager.changeActiveState(this.testClientModule.getId(), true);
this.moduleManager.changeDisplayState(TestClientModule.class, true); this.moduleManager.changeDisplayState(this.testClientModule.getId(), true);
this.moduleManager.hideExcept(); this.moduleManager.hideExcept();
assertTrue(this.moduleManager.isModal()); assertTrue(this.moduleManager.isModal());
@@ -417,8 +399,9 @@ public class ModuleManagerTest {
@Test @Test
public void testGetSubscribersForCallback_WithSubscriber() { public void testGetSubscribersForCallback_WithSubscriber() {
this.moduleManager.loadModule(CallbackSubscriberModule.class); final var callbackSubscriberModule = new CallbackSubscriberModule();
this.moduleManager.changeActiveState(CallbackSubscriberModule.class, true); this.moduleManager.loadModule(callbackSubscriberModule);
this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), true);
final List<AbstractModule> subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); final List<AbstractModule> subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE);
@@ -428,8 +411,9 @@ public class ModuleManagerTest {
@Test @Test
public void testGetSubscribersForCallback_MultipleCallbacks() { public void testGetSubscribersForCallback_MultipleCallbacks() {
this.moduleManager.loadModule(MultiCallbackSubscriberModule.class); final var multiCallbackSubscriberModule = new MultiCallbackSubscriberModule();
this.moduleManager.changeActiveState(MultiCallbackSubscriberModule.class, true); this.moduleManager.loadModule(multiCallbackSubscriberModule);
this.moduleManager.changeActiveState(multiCallbackSubscriberModule.getId(), true);
final List<AbstractModule> uiPreSubscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); final List<AbstractModule> uiPreSubscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE);
final List<AbstractModule> runSubscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.RUN); final List<AbstractModule> runSubscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.RUN);
@@ -446,8 +430,9 @@ public class ModuleManagerTest {
@Test @Test
public void testGetSubscribersForCallback_UnsubscribedCallbackEmpty() { public void testGetSubscribersForCallback_UnsubscribedCallbackEmpty() {
this.moduleManager.loadModule(CallbackSubscriberModule.class); final var callbackSubscriberModule = new CallbackSubscriberModule();
this.moduleManager.changeActiveState(CallbackSubscriberModule.class, true); this.moduleManager.loadModule(callbackSubscriberModule);
this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), true);
final List<AbstractModule> runSubscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.RUN); final List<AbstractModule> runSubscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.RUN);
@@ -456,13 +441,14 @@ public class ModuleManagerTest {
@Test @Test
public void testGetSubscribersForCallback_RemovedOnDeactivate() { public void testGetSubscribersForCallback_RemovedOnDeactivate() {
this.moduleManager.loadModule(CallbackSubscriberModule.class); final var callbackSubscriberModule = new CallbackSubscriberModule();
this.moduleManager.changeActiveState(CallbackSubscriberModule.class, true); this.moduleManager.loadModule(callbackSubscriberModule);
this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), true);
List<AbstractModule> subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); List<AbstractModule> subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE);
assertEquals(1, subscribers.size()); assertEquals(1, subscribers.size());
this.moduleManager.changeActiveState(CallbackSubscriberModule.class, false); this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), false);
subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE);
assertTrue(subscribers.isEmpty()); assertTrue(subscribers.isEmpty());
@@ -470,10 +456,12 @@ public class ModuleManagerTest {
@Test @Test
public void testGetSubscribersForCallback_MultipleModules() { public void testGetSubscribersForCallback_MultipleModules() {
this.moduleManager.loadModule(CallbackSubscriberModule.class); final var callbackSubscriberModule = new CallbackSubscriberModule();
this.moduleManager.loadModule(MultiCallbackSubscriberModule.class); final var multiCallbackSubscriberModule = new MultiCallbackSubscriberModule();
this.moduleManager.changeActiveState(CallbackSubscriberModule.class, true); this.moduleManager.loadModule(callbackSubscriberModule);
this.moduleManager.changeActiveState(MultiCallbackSubscriberModule.class, true); this.moduleManager.loadModule(multiCallbackSubscriberModule);
this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), true);
this.moduleManager.changeActiveState(multiCallbackSubscriberModule.getId(), true);
final List<AbstractModule> uiPreSubscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); final List<AbstractModule> uiPreSubscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE);
@@ -484,14 +472,15 @@ public class ModuleManagerTest {
@Test @Test
public void testGetSubscribersForCallback_ReactivateModule() { public void testGetSubscribersForCallback_ReactivateModule() {
this.moduleManager.loadModule(CallbackSubscriberModule.class); final var callbackSubscriberModule = new CallbackSubscriberModule();
this.moduleManager.changeActiveState(CallbackSubscriberModule.class, true); this.moduleManager.loadModule(callbackSubscriberModule);
this.moduleManager.changeActiveState(CallbackSubscriberModule.class, false); this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), true);
this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), false);
List<AbstractModule> subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); List<AbstractModule> subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE);
assertTrue(subscribers.isEmpty()); assertTrue(subscribers.isEmpty());
this.moduleManager.changeActiveState(CallbackSubscriberModule.class, true); this.moduleManager.changeActiveState(callbackSubscriberModule.getId(), true);
subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE); subscribers = this.moduleManager.getSubscribersForCallback(ModuleExecutorCallbacks.UI_PRE);
assertEquals(1, subscribers.size()); assertEquals(1, subscribers.size());

View File

@@ -32,19 +32,28 @@ public class RendererWorkingSetImplTest {
private RenderingBoPool renderingBoPool; private RenderingBoPool renderingBoPool;
private TestModuleA moduleA;
private TestModuleB moduleB;
private TestModuleC moduleC;
@BeforeEach @BeforeEach
void setUp() { void setUp() {
this.renderingBoPool = mock(RenderingBoPool.class); this.renderingBoPool = mock(RenderingBoPool.class);
this.workingSet = new RendererWorkingSetImpl(this.renderingBoPool); this.workingSet = new RendererWorkingSetImpl(this.renderingBoPool);
this.moduleA = new TestModuleA();
this.moduleB = new TestModuleB();
this.moduleC = new TestModuleC();
} }
@Test @Test
void addSingleAddsToUncommittedWork() { void addSingleAddsToUncommittedWork() {
final RenderingBo bo1 = mock(RenderingBo.class); final RenderingBo bo1 = mock(RenderingBo.class);
when(bo1.getId()).thenReturn("bo1"); when(bo1.getId()).thenReturn("bo1");
this.workingSet.add(TestModuleA.class, bo1); this.workingSet.add(this.moduleA.getId(), bo1);
final var uncommitted = this.workingSet.getUncommittedWork(TestModuleA.class); final var uncommitted = this.workingSet.getUncommittedWork(this.moduleA.getId());
assertNotNull(uncommitted); assertNotNull(uncommitted);
assertEquals(Map.of("bo1", bo1), uncommitted); assertEquals(Map.of("bo1", bo1), uncommitted);
} }
@@ -56,9 +65,9 @@ public class RendererWorkingSetImplTest {
final RenderingBo bo2 = mock(RenderingBo.class); final RenderingBo bo2 = mock(RenderingBo.class);
when(bo2.getId()).thenReturn("bo2"); when(bo2.getId()).thenReturn("bo2");
this.workingSet.add(TestModuleA.class, List.of(bo1, bo2)); this.workingSet.add(this.moduleA.getId(), List.of(bo1, bo2));
final var uncommitted = this.workingSet.getUncommittedWork(TestModuleA.class); final var uncommitted = this.workingSet.getUncommittedWork(this.moduleA.getId());
assertEquals(Map.of("bo1", bo1, "bo2", bo2), uncommitted); assertEquals(Map.of("bo1", bo1, "bo2", bo2), uncommitted);
} }
@@ -69,11 +78,11 @@ public class RendererWorkingSetImplTest {
final RenderingBo bo2 = mock(RenderingBo.class); final RenderingBo bo2 = mock(RenderingBo.class);
when(bo2.getId()).thenReturn("bo2"); when(bo2.getId()).thenReturn("bo2");
this.workingSet.add(TestModuleA.class, bo1); this.workingSet.add(this.moduleA.getId(), bo1);
this.workingSet.add(TestModuleA.class, bo2); this.workingSet.add(this.moduleA.getId(), bo2);
final var returnedUncommitted = this.workingSet.commit(TestModuleA.class, false); final var returnedUncommitted = this.workingSet.commit(this.moduleA.getId(), false);
final var currentUncommitted = this.workingSet.getUncommittedWork(TestModuleA.class); final var currentUncommitted = this.workingSet.getUncommittedWork(this.moduleA.getId());
assertSame(currentUncommitted, returnedUncommitted); assertSame(currentUncommitted, returnedUncommitted);
assertTrue(currentUncommitted.isEmpty()); assertTrue(currentUncommitted.isEmpty());
@@ -93,11 +102,11 @@ public class RendererWorkingSetImplTest {
final RenderingBo bo3 = mock(RenderingBo.class); final RenderingBo bo3 = mock(RenderingBo.class);
when(bo3.getId()).thenReturn("bo3"); when(bo3.getId()).thenReturn("bo3");
this.workingSet.add(TestModuleA.class, bo1); this.workingSet.add(this.moduleA.getId(), bo1);
this.workingSet.add(TestModuleA.class, bo2); this.workingSet.add(this.moduleA.getId(), bo2);
final var returnedUncommitted = this.workingSet.commit(TestModuleA.class, true); final var returnedUncommitted = this.workingSet.commit(this.moduleA.getId(), true);
final var currentUncommitted = this.workingSet.getUncommittedWork(TestModuleA.class); final var currentUncommitted = this.workingSet.getUncommittedWork(this.moduleA.getId());
assertSame(currentUncommitted, returnedUncommitted); assertSame(currentUncommitted, returnedUncommitted);
assertEquals(Map.of("bo1", bo1, "bo2", bo2), currentUncommitted); assertEquals(Map.of("bo1", bo1, "bo2", bo2), currentUncommitted);
@@ -107,7 +116,7 @@ public class RendererWorkingSetImplTest {
assertEquals(2, live.size()); assertEquals(2, live.size());
assertTrue(live.containsAll(List.of(bo1, bo2))); assertTrue(live.containsAll(List.of(bo1, bo2)));
this.workingSet.add(TestModuleA.class, bo3); this.workingSet.add(this.moduleA.getId(), bo3);
final List<RenderingBo> liveAfterAdd = new ArrayList<>(); final List<RenderingBo> liveAfterAdd = new ArrayList<>();
this.workingSet.getLiveSet(liveAfterAdd, null); this.workingSet.getLiveSet(liveAfterAdd, null);
assertEquals(2, liveAfterAdd.size()); assertEquals(2, liveAfterAdd.size());
@@ -123,12 +132,12 @@ public class RendererWorkingSetImplTest {
final RenderingBo bo3 = mock(RenderingBo.class); final RenderingBo bo3 = mock(RenderingBo.class);
when(bo3.getId()).thenReturn("bo3"); when(bo3.getId()).thenReturn("bo3");
this.workingSet.add(TestModuleA.class, bo1); this.workingSet.add(this.moduleA.getId(), bo1);
this.workingSet.add(TestModuleA.class, bo2); this.workingSet.add(this.moduleA.getId(), bo2);
this.workingSet.add(TestModuleB.class, bo3); this.workingSet.add(this.moduleB.getId(), bo3);
this.workingSet.commit(TestModuleA.class, false); this.workingSet.commit(this.moduleA.getId(), false);
this.workingSet.commit(TestModuleB.class, false); this.workingSet.commit(this.moduleB.getId(), false);
final List<RenderingBo> live = new ArrayList<>(); final List<RenderingBo> live = new ArrayList<>();
this.workingSet.getLiveSet(live, null); this.workingSet.getLiveSet(live, null);
@@ -138,7 +147,7 @@ public class RendererWorkingSetImplTest {
@Test @Test
void commitOnUnknownProducerCreatesEmptyState() { void commitOnUnknownProducerCreatesEmptyState() {
final var returnedUncommitted = this.workingSet.commit(TestModuleC.class, false); final var returnedUncommitted = this.workingSet.commit(this.moduleC.getId(), false);
assertNotNull(returnedUncommitted); assertNotNull(returnedUncommitted);
assertTrue(returnedUncommitted.isEmpty()); assertTrue(returnedUncommitted.isEmpty());
@@ -154,24 +163,24 @@ public class RendererWorkingSetImplTest {
final var bo2 = new TestBoB(); final var bo2 = new TestBoB();
bo2.setId("bo2"); bo2.setId("bo2");
this.workingSet.add(TestModuleA.class, bo1); this.workingSet.add(this.moduleA.getId(), bo1);
this.workingSet.commit(TestModuleA.class, false); this.workingSet.commit(this.moduleA.getId(), false);
this.workingSet.add(TestModuleA.class, bo2); this.workingSet.add(this.moduleA.getId(), bo2);
// Before clear // Before clear
final List<RenderingBo> liveBefore = new ArrayList<>(); final List<RenderingBo> liveBefore = new ArrayList<>();
this.workingSet.getLiveSet(liveBefore, null); this.workingSet.getLiveSet(liveBefore, null);
assertTrue(liveBefore.contains(bo1)); assertTrue(liveBefore.contains(bo1));
assertNotNull(this.workingSet.get(TestModuleA.class, "bo2")); assertNotNull(this.workingSet.get(this.moduleA.getId(), "bo2"));
this.workingSet.clear(TestModuleA.class); this.workingSet.clear(this.moduleA.getId());
// After clear // After clear
final List<RenderingBo> liveAfter = new ArrayList<>(); final List<RenderingBo> liveAfter = new ArrayList<>();
this.workingSet.getLiveSet(liveAfter, null); this.workingSet.getLiveSet(liveAfter, null);
assertTrue(liveAfter.isEmpty()); assertTrue(liveAfter.isEmpty());
final var uncommittedAfter = this.workingSet.getUncommittedWork(TestModuleA.class); final var uncommittedAfter = this.workingSet.getUncommittedWork(this.moduleA.getId());
assertTrue(uncommittedAfter.isEmpty()); assertTrue(uncommittedAfter.isEmpty());
verify(this.renderingBoPool, times(1)).release(bo1); verify(this.renderingBoPool, times(1)).release(bo1);
@@ -184,10 +193,10 @@ public class RendererWorkingSetImplTest {
void clearOnUnknownProducerDoesNothing() { void clearOnUnknownProducerDoesNothing() {
final RenderingBo bo1 = mock(RenderingBo.class); final RenderingBo bo1 = mock(RenderingBo.class);
when(bo1.getId()).thenReturn("bo1"); when(bo1.getId()).thenReturn("bo1");
this.workingSet.add(TestModuleA.class, bo1); this.workingSet.add(this.moduleA.getId(), bo1);
this.workingSet.commit(TestModuleA.class, false); this.workingSet.commit(this.moduleA.getId(), false);
this.workingSet.clear(TestModuleC.class); this.workingSet.clear(this.moduleC.getId());
final List<RenderingBo> live = new ArrayList<>(); final List<RenderingBo> live = new ArrayList<>();
this.workingSet.getLiveSet(live, null); this.workingSet.getLiveSet(live, null);
@@ -202,14 +211,14 @@ public class RendererWorkingSetImplTest {
final var bo2 = new TestBoA(); final var bo2 = new TestBoA();
bo2.setId("bo2"); bo2.setId("bo2");
this.workingSet.add(TestModuleA.class, bo1); this.workingSet.add(this.moduleA.getId(), bo1);
this.workingSet.add(TestModuleA.class, bo2); this.workingSet.add(this.moduleA.getId(), bo2);
this.workingSet.commit(TestModuleA.class, false); this.workingSet.commit(this.moduleA.getId(), false);
final var bo3 = new TestBoB(); final var bo3 = new TestBoB();
bo3.setId("bo3"); bo3.setId("bo3");
this.workingSet.add(TestModuleA.class, bo3); this.workingSet.add(this.moduleA.getId(), bo3);
this.workingSet.commit(TestModuleA.class, false); this.workingSet.commit(this.moduleA.getId(), false);
verify(this.renderingBoPool, times(1)).release(bo1); verify(this.renderingBoPool, times(1)).release(bo1);
verify(this.renderingBoPool, times(1)).release(bo2); verify(this.renderingBoPool, times(1)).release(bo2);
@@ -227,12 +236,12 @@ public class RendererWorkingSetImplTest {
final RenderingBo bo2 = mock(RenderingBo.class); final RenderingBo bo2 = mock(RenderingBo.class);
when(bo2.getId()).thenReturn("bo2"); when(bo2.getId()).thenReturn("bo2");
this.workingSet.add(TestModuleA.class, bo1); this.workingSet.add(this.moduleA.getId(), bo1);
this.workingSet.add(TestModuleA.class, bo2); this.workingSet.add(this.moduleA.getId(), bo2);
final var retrieved1 = this.workingSet.get(TestModuleA.class, "bo1"); final var retrieved1 = this.workingSet.get(this.moduleA.getId(), "bo1");
final var retrieved2 = this.workingSet.get(TestModuleA.class, "bo2"); final var retrieved2 = this.workingSet.get(this.moduleA.getId(), "bo2");
final var notFound = this.workingSet.get(TestModuleA.class, "nonexistent"); final var notFound = this.workingSet.get(this.moduleA.getId(), "nonexistent");
assertSame(bo1, retrieved1); assertSame(bo1, retrieved1);
assertSame(bo2, retrieved2); assertSame(bo2, retrieved2);
@@ -246,16 +255,16 @@ public class RendererWorkingSetImplTest {
final RenderingBo bo2 = mock(RenderingBo.class); final RenderingBo bo2 = mock(RenderingBo.class);
when(bo2.getId()).thenReturn("bo2"); when(bo2.getId()).thenReturn("bo2");
this.workingSet.add(TestModuleA.class, bo1); this.workingSet.add(this.moduleA.getId(), bo1);
this.workingSet.add(TestModuleA.class, bo2); this.workingSet.add(this.moduleA.getId(), bo2);
final var committedWork = this.workingSet.commit(TestModuleA.class, false); final var committedWork = this.workingSet.commit(this.moduleA.getId(), false);
// After commit without clone, the uncommitted work should be empty // After commit without clone, the uncommitted work should be empty
assertTrue(committedWork.isEmpty()); assertTrue(committedWork.isEmpty());
// get() only retrieves from next set, not live set, so it returns null after commit // get() only retrieves from next set, not live set, so it returns null after commit
final var retrieved1 = this.workingSet.get(TestModuleA.class, "bo1"); final var retrieved1 = this.workingSet.get(this.moduleA.getId(), "bo1");
final var retrieved2 = this.workingSet.get(TestModuleA.class, "bo2"); final var retrieved2 = this.workingSet.get(this.moduleA.getId(), "bo2");
assertTrue(retrieved1 == null); assertTrue(retrieved1 == null);
assertTrue(retrieved2 == null); assertTrue(retrieved2 == null);
@@ -268,13 +277,13 @@ public class RendererWorkingSetImplTest {
final RenderingBo bo1_replacement = mock(RenderingBo.class); final RenderingBo bo1_replacement = mock(RenderingBo.class);
when(bo1_replacement.getId()).thenReturn("bo1"); when(bo1_replacement.getId()).thenReturn("bo1");
this.workingSet.add(TestModuleA.class, bo1); this.workingSet.add(this.moduleA.getId(), bo1);
final var uncommittedBefore = this.workingSet.getUncommittedWork(TestModuleA.class); final var uncommittedBefore = this.workingSet.getUncommittedWork(this.moduleA.getId());
assertEquals(1, uncommittedBefore.size()); assertEquals(1, uncommittedBefore.size());
assertSame(bo1, uncommittedBefore.get("bo1")); assertSame(bo1, uncommittedBefore.get("bo1"));
this.workingSet.add(TestModuleA.class, bo1_replacement); this.workingSet.add(this.moduleA.getId(), bo1_replacement);
final var uncommittedAfter = this.workingSet.getUncommittedWork(TestModuleA.class); final var uncommittedAfter = this.workingSet.getUncommittedWork(this.moduleA.getId());
assertEquals(1, uncommittedAfter.size()); assertEquals(1, uncommittedAfter.size());
assertSame(bo1_replacement, uncommittedAfter.get("bo1")); assertSame(bo1_replacement, uncommittedAfter.get("bo1"));
} }
@@ -288,12 +297,12 @@ public class RendererWorkingSetImplTest {
final var boA2 = new TestBoA(); final var boA2 = new TestBoA();
boA2.setId("boA2"); boA2.setId("boA2");
this.workingSet.add(TestModuleA.class, boA1); this.workingSet.add(this.moduleA.getId(), boA1);
this.workingSet.add(TestModuleB.class, boB1); this.workingSet.add(this.moduleB.getId(), boB1);
this.workingSet.add(TestModuleA.class, boA2); this.workingSet.add(this.moduleA.getId(), boA2);
this.workingSet.commit(TestModuleA.class, false); this.workingSet.commit(this.moduleA.getId(), false);
this.workingSet.commit(TestModuleB.class, false); this.workingSet.commit(this.moduleB.getId(), false);
final List<RenderingBo> allLive = new ArrayList<>(); final List<RenderingBo> allLive = new ArrayList<>();
this.workingSet.getLiveSet(allLive, null); this.workingSet.getLiveSet(allLive, null);
@@ -301,7 +310,7 @@ public class RendererWorkingSetImplTest {
assertTrue(allLive.containsAll(List.of(boA1, boB1, boA2))); assertTrue(allLive.containsAll(List.of(boA1, boB1, boA2)));
final List<RenderingBo> filteredLive = new ArrayList<>(); final List<RenderingBo> filteredLive = new ArrayList<>();
this.workingSet.getLiveSet(filteredLive, TestModuleA.class::equals); this.workingSet.getLiveSet(filteredLive, this.moduleA.getId()::equals);
assertEquals(2, filteredLive.size()); assertEquals(2, filteredLive.size());
assertTrue(filteredLive.containsAll(List.of(boA1, boA2))); assertTrue(filteredLive.containsAll(List.of(boA1, boA2)));
assertFalse(filteredLive.contains(boB1)); assertFalse(filteredLive.contains(boB1));