From 5d80ba3f9edc583a282bb441b940ab5f0a45eea0 Mon Sep 17 00:00:00 2001 From: extio-de Date: Thu, 25 Dec 2025 12:49:53 +0100 Subject: [PATCH] feat(renderer): Add getOrAcquire method and enhance get method in RendererWorkingSet implementation --- README.md | 1 - .../renderer/work/RendererWorkingSet.java | 4 ++ .../renderer/work/RendererWorkingSetImpl.java | 24 ++++++++-- .../work/RendererWorkingSetImplTest.java | 46 ++++++++++++++++++- 4 files changed, 70 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b3aaf51..bb20d0b 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,6 @@ rendererWorkingSet.commit(myModule.getId(), true); var existingRect = rendererWorkingSet.get(myModule.getId(), "myRect"); existingRect.setColor(Color.RED); existingRect.setPosition(150, 250); -rendererWorkingSet.put(myModule.getId(), existingRect); // Commit again to apply the changes rendererWorkingSet.commit(myModule.getId(), true); diff --git a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java index f9ea3ae..ebc89f2 100644 --- a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java +++ b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java @@ -13,6 +13,10 @@ public interface RendererWorkingSet { void put(String producerId, List work); RenderingBo get(String producerId, String id); + + T get(String producerId, String id, Class type); + + T getOrAcquire(String producerId, String id, Class type); Map getUncommittedWork(String producerId); diff --git a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java index ffd5bfa..713553e 100644 --- a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java +++ b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java @@ -54,6 +54,24 @@ public class RendererWorkingSetImpl implements RendererWorkingSet { return this.getWorkingSetByProducer(producerId).next().get(id); } + @Override + public T get(final String producerId, final String id, final Class type) { + final RenderingBo bo = this.getWorkingSetByProducer(producerId).next().get(id); + if (bo == null) { + return null; + } + return type.cast(bo); + } + + @Override + public T getOrAcquire(final String producerId, final String id, final Class type) { + final var bo = this.get(producerId, id, type); + if (bo != null) { + return bo; + } + return this.rendererBoPool.acquire(id, type); + } + @Override public Map commit(final String producerId, final boolean clone) { final AtomicReference> previousWork = new AtomicReference<>(); @@ -88,7 +106,7 @@ public class RendererWorkingSetImpl implements RendererWorkingSet { this.releaseBoClasses(rendererWork.next()); } } - + @Override public void getLiveSet(final List combinedLiveSet, final Predicate filter) { this.workingSet.forEach((producer, rendererWork) -> { @@ -106,7 +124,7 @@ public class RendererWorkingSetImpl implements RendererWorkingSet { if (work == null || work.isEmpty()) { return; } - + final var releasedBoClasses = this.obtainSetFromPool(); for (final RenderingBo renderingBO : work.values()) { if (releasedBoClasses.add(renderingBO.getClass())) { @@ -118,7 +136,7 @@ public class RendererWorkingSetImpl implements RendererWorkingSet { this.returnMapToPool(work); this.returnSetToPool(releasedBoClasses); } - + private Map obtainMapFromPool() { var map = this.mapsPool.poll(); if (map == null) { diff --git a/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java b/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java index d2269ce..dd0c745 100644 --- a/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java +++ b/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java @@ -5,6 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.ArrayList; import java.util.List; @@ -315,7 +316,50 @@ public class RendererWorkingSetImplTest { assertTrue(filteredLive.containsAll(List.of(boA1, boA2))); assertFalse(filteredLive.contains(boB1)); } - + + @Test + void getWithTypeReturnsTypedInstanceAndNullForUnknown() { + final var boA = new TestBoA(); + boA.setId("bo1"); + this.workingSet.put(this.moduleA.getId(), boA); + + final var retrieved = this.workingSet.get(this.moduleA.getId(), "bo1", TestBoA.class); + assertSame(boA, retrieved); + + final var notFound = this.workingSet.get(this.moduleA.getId(), "nonexistent", TestBoA.class); + assertTrue(notFound == null); + } + + @Test + void getWithTypeThrowsClassCastForWrongType() { + final var boA = new TestBoA(); + boA.setId("bo1"); + this.workingSet.put(this.moduleA.getId(), boA); + + assertThrows(ClassCastException.class, () -> this.workingSet.get(this.moduleA.getId(), "bo1", TestBoB.class)); + } + + @Test + void getOrAcquireReturnsUncommittedWhenPresent() { + final var boA = new TestBoA(); + boA.setId("bo1"); + this.workingSet.put(this.moduleA.getId(), boA); + + final var retrieved = this.workingSet.getOrAcquire(this.moduleA.getId(), "bo1", TestBoA.class); + assertSame(boA, retrieved); + } + + @Test + void getOrAcquireAcquiresFromPoolWhenMissing() { + final var pooledBo = new TestBoA(); + pooledBo.setId("pooled"); + when(this.renderingBoPool.acquire("pooled", TestBoA.class)).thenReturn(pooledBo); + + final var retrieved = this.workingSet.getOrAcquire(this.moduleA.getId(), "pooled", TestBoA.class); + assertSame(pooledBo, retrieved); + verify(this.renderingBoPool, times(1)).acquire("pooled", TestBoA.class); + } + private static abstract class TestBoBase implements RenderingBo { private final AtomicInteger closeStaticCalls = new AtomicInteger();