[Major] Only cloning on tx.get*By() if TX is not read-only

This commit is contained in:
Robert von Burg 2023-05-04 09:50:46 +02:00
parent e267e22163
commit 19dd8fbb1d
Signed by: eitch
GPG Key ID: 75DB9C85C74331F7
2 changed files with 25 additions and 23 deletions

View File

@ -123,6 +123,9 @@ public abstract class TransientElementMap<T extends StrolchRootElement> implemen
if (t == null)
return null;
if (tx.isReadOnly())
return t;
@SuppressWarnings("unchecked")
T clone = (T) t.getClone(true);
return clone;
@ -165,23 +168,28 @@ public abstract class TransientElementMap<T extends StrolchRootElement> implemen
@Override
public synchronized List<T> getAllElements(StrolchTransaction tx) {
return this.elementMap.values().stream() //
.flatMap(e -> e.values().stream()) //
.map(t -> {
@SuppressWarnings("unchecked")
T clone = (T) t.getClone(true);
return clone;
}) //
.collect(Collectors.toList());
Stream<T> stream = this.elementMap.values().stream() //
.flatMap(e -> e.values().stream());
if (tx.isReadOnly())
return stream.collect(Collectors.toList());
return stream.map(t -> {
@SuppressWarnings("unchecked")
T clone = (T) t.getClone(true);
return clone;
}).collect(Collectors.toList());
}
@Override
public synchronized List<T> getElementsBy(StrolchTransaction tx, String type) {
Map<String, T> byType = this.elementMap.get(type);
if (byType == null)
return new ArrayList<>(0);
if (tx.isReadOnly())
return new ArrayList<>(byType.values());
return byType.values().stream().map(t -> {
@SuppressWarnings("unchecked")
T clone = (T) t.getClone(true);

View File

@ -51,8 +51,7 @@ public class ResourceModelTestRunner {
public void runCreateResourceTest() {
// create
Resource newResource = createResource("MyTestResource", "Test Name",
"TestType");//$NON-NLS-2$ //$NON-NLS-3$
Resource newResource = createResource("MyTestResource", "Test Name", "TestType");//$NON-NLS-2$ //$NON-NLS-3$
try (StrolchTransaction tx = this.runtimeMock.getRealm(this.realmName)
.openTx(this.certificate, "test", false)) {
tx.add(newResource);
@ -70,12 +69,9 @@ public class ResourceModelTestRunner {
}
// create three resources
Resource resource1 = createResource("myTestResource1", "Test Name",
"QTestType1");//$NON-NLS-2$ //$NON-NLS-3$
Resource resource2 = createResource("myTestResource2", "Test Name",
"QTestType2");//$NON-NLS-2$ //$NON-NLS-3$
Resource resource3 = createResource("myTestResource3", "Test Name",
"QTestType3");//$NON-NLS-2$ //$NON-NLS-3$
Resource resource1 = createResource("myTestResource1", "Test Name", "QTestType1");//$NON-NLS-2$ //$NON-NLS-3$
Resource resource2 = createResource("myTestResource2", "Test Name", "QTestType2");//$NON-NLS-2$ //$NON-NLS-3$
Resource resource3 = createResource("myTestResource3", "Test Name", "QTestType3");//$NON-NLS-2$ //$NON-NLS-3$
try (StrolchTransaction tx = this.runtimeMock.getRealm(this.realmName)
.openTx(this.certificate, "test", false)) {
tx.add(resource1);
@ -116,9 +112,8 @@ public class ResourceModelTestRunner {
// read
Resource readResource;
try (StrolchTransaction tx = this.runtimeMock.getRealm(this.realmName).openTx(this.certificate, "test", true)) {
readResource = tx.getResourceBy(TYPE, ID);
readResource = tx.getResourceBy(TYPE, ID, true).getClone(true);
}
assertNotNull("Should read Resource with id " + ID, readResource);
// update
StringParameter sParam = readResource.getParameter(BAG_ID, PARAM_STRING_ID);
@ -133,12 +128,11 @@ public class ResourceModelTestRunner {
// read updated
Resource updatedResource;
try (StrolchTransaction tx = this.runtimeMock.getRealm(this.realmName).openTx(this.certificate, "test", true)) {
updatedResource = tx.getResourceBy(TYPE, ID);
updatedResource = tx.getResourceBy(TYPE, ID, true);
}
assertNotNull("Should read Resource with id " + ID, updatedResource);
if (this.runtimeMock.getRealm(this.realmName).getMode() != DataStoreMode.CACHED)
assertNotSame("Objects can't be the same reference after re-reading!", readResource,
updatedResource);
assertNotSame("Objects can't be the same reference after re-reading!", readResource, updatedResource);
StringParameter updatedParam = readResource.getParameter(BAG_ID, PARAM_STRING_ID);
assertEquals(newStringValue, updatedParam.getValue());
@ -152,7 +146,7 @@ public class ResourceModelTestRunner {
// fail to re-read
try (StrolchTransaction tx = this.runtimeMock.getRealm(this.realmName).openTx(this.certificate, "test", true)) {
Resource resource = tx.getResourceBy(TYPE, ID);
assertNull("Should no read Resource with id " + ID, resource);
assertNull("Should not read Resource with id " + ID, resource);
}
}