From 5ac8d4f8753e4c535e9ffa7f72952d12b75155fc Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Sat, 11 Jan 2014 17:56:07 +0100 Subject: [PATCH] [Major] Implemented CACHED mode This lead to refactoring of other code: - removed get*Dao() from StrolchTransaction - added StrolchTransaction.getPersistenceHandler() - removed unused variables in TransactionalElementMap - this lead to removal of constructors in subclasses - added ComponentContainer.getDataStoreMode() - added ElementMap.addAll(), removeAll() and updateAll() methods - implemented in all ElementMap implementations --- .../xml/XmlPersistenceHandler.java | 14 +++- .../xml/XmlStrolchTransaction.java | 17 ++--- .../impl/dao/test/ExistingDbTest.java | 65 +++++++++++++++++++ .../impl/dao/test/ObserverUpdateTest.java | 4 +- .../config/StrolchConfiguration.xml | 23 +++++++ .../dbStore/defaultRealm/Order/MyType/@1.xml | 12 ++++ .../defaultRealm/Resource/MyType/@1.xml | 12 ++++ 7 files changed, 134 insertions(+), 13 deletions(-) create mode 100644 src/test/java/li/strolch/persistence/impl/dao/test/ExistingDbTest.java create mode 100644 src/test/resources/existingDbRuntime/config/StrolchConfiguration.xml create mode 100644 src/test/resources/existingDbRuntime/dbStore/defaultRealm/Order/MyType/@1.xml create mode 100644 src/test/resources/existingDbRuntime/dbStore/defaultRealm/Resource/MyType/@1.xml diff --git a/src/main/java/li/strolch/persistence/xml/XmlPersistenceHandler.java b/src/main/java/li/strolch/persistence/xml/XmlPersistenceHandler.java index 267531b60..72df67c53 100644 --- a/src/main/java/li/strolch/persistence/xml/XmlPersistenceHandler.java +++ b/src/main/java/li/strolch/persistence/xml/XmlPersistenceHandler.java @@ -24,7 +24,9 @@ import li.strolch.agent.impl.StrolchRealm; import li.strolch.model.Order; import li.strolch.model.Resource; import li.strolch.model.Tags; +import li.strolch.persistence.api.OrderDao; import li.strolch.persistence.api.PersistenceHandler; +import li.strolch.persistence.api.ResourceDao; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.persistence.xml.model.OrderContextFactory; import li.strolch.persistence.xml.model.ResourceContextFactory; @@ -72,10 +74,20 @@ public class XmlPersistenceHandler extends StrolchComponent implements Persisten @Override public StrolchTransaction openTx(StrolchRealm realm) { PersistenceTransaction tx = this.persistenceManager.openTx(realm.getRealm()); - XmlStrolchTransaction strolchTx = new XmlStrolchTransaction(realm, tx); + XmlStrolchTransaction strolchTx = new XmlStrolchTransaction(realm, tx, this); if (getContainer().hasComponent(ObserverHandler.class)) { strolchTx.setObserverHandler(getContainer().getComponent(ObserverHandler.class)); } return strolchTx; } + + @Override + public OrderDao getOrderDao(StrolchTransaction tx) { + return new XmlOrderDao(tx); + } + + @Override + public ResourceDao getResourceDao(StrolchTransaction tx) { + return new XmlResourceDao(tx); + } } diff --git a/src/main/java/li/strolch/persistence/xml/XmlStrolchTransaction.java b/src/main/java/li/strolch/persistence/xml/XmlStrolchTransaction.java index 748bdb74d..5c54fca03 100644 --- a/src/main/java/li/strolch/persistence/xml/XmlStrolchTransaction.java +++ b/src/main/java/li/strolch/persistence/xml/XmlStrolchTransaction.java @@ -20,8 +20,7 @@ import java.util.Set; import li.strolch.agent.impl.StrolchRealm; import li.strolch.model.StrolchElement; import li.strolch.persistence.api.AbstractTransaction; -import li.strolch.persistence.api.OrderDao; -import li.strolch.persistence.api.ResourceDao; +import li.strolch.persistence.api.PersistenceHandler; import li.strolch.persistence.api.StrolchPersistenceException; import li.strolch.persistence.api.TransactionCloseStrategy; import li.strolch.runtime.observer.ObserverHandler; @@ -31,13 +30,15 @@ import ch.eitchnet.xmlpers.api.TransactionResult; public class XmlStrolchTransaction extends AbstractTransaction { + private XmlPersistenceHandler persistenceHandler; private ObserverHandler observerHandler; private boolean suppressUpdates; private PersistenceTransaction tx; private TransactionCloseStrategy closeStrategy; - public XmlStrolchTransaction(StrolchRealm realm, PersistenceTransaction tx) { + public XmlStrolchTransaction(StrolchRealm realm, PersistenceTransaction tx, XmlPersistenceHandler persistenceHandler) { super(realm); + this.persistenceHandler = persistenceHandler; this.suppressUpdates = false; this.tx = tx; this.closeStrategy = TransactionCloseStrategy.COMMIT; @@ -84,6 +85,7 @@ public class XmlStrolchTransaction extends AbstractTransaction { } this.tx.autoCloseableCommit(); + logger.info(txResult.getLogMessage()); if (!this.suppressUpdates && this.observerHandler != null) { @@ -114,12 +116,7 @@ public class XmlStrolchTransaction extends AbstractTransaction { } @Override - public OrderDao getOrderDao() { - return new XmlOrderDao(this); - } - - @Override - public ResourceDao getResourceDao() { - return new XmlResourceDao(this); + public PersistenceHandler getPersistenceHandler() { + return this.persistenceHandler; } } diff --git a/src/test/java/li/strolch/persistence/impl/dao/test/ExistingDbTest.java b/src/test/java/li/strolch/persistence/impl/dao/test/ExistingDbTest.java new file mode 100644 index 000000000..dd1c9a5f7 --- /dev/null +++ b/src/test/java/li/strolch/persistence/impl/dao/test/ExistingDbTest.java @@ -0,0 +1,65 @@ +/* + * Copyright 2013 Robert von Burg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package li.strolch.persistence.impl.dao.test; + +import static org.junit.Assert.assertNotNull; + +import java.io.File; + +import li.strolch.model.Order; +import li.strolch.model.Resource; +import li.strolch.persistence.api.StrolchTransaction; +import li.strolch.testbase.runtime.RuntimeMock; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +public class ExistingDbTest { + + public static final String RUNTIME_PATH = "target/existingDbRuntime/"; //$NON-NLS-1$ + public static final String DB_STORE_PATH_DIR = "dbStore"; //$NON-NLS-1$ + public static final String CONFIG_SRC = "src/test/resources/existingDbRuntime"; //$NON-NLS-1$ + + protected static RuntimeMock runtimeMock; + + @BeforeClass + public static void beforeClass() { + + File rootPath = new File(RUNTIME_PATH); + File configSrc = new File(CONFIG_SRC); + runtimeMock = new RuntimeMock(); + runtimeMock.mockRuntime(rootPath, configSrc); + runtimeMock.startContainer(rootPath); + } + + @AfterClass + public static void afterClass() { + runtimeMock.destroyRuntime(); + } + + @Test + public void shouldQueryExistingData() { + + try (StrolchTransaction tx = runtimeMock.getDefaultRealm().openTx()) { + Resource resource = tx.getResourceMap().getBy(tx, "MyType", "@1"); + assertNotNull("Should be able to read existing element from db", resource); + + Order order = tx.getOrderMap().getBy(tx, "MyType", "@1"); + assertNotNull("Should be able to read existing element from db", order); + } + } +} diff --git a/src/test/java/li/strolch/persistence/impl/dao/test/ObserverUpdateTest.java b/src/test/java/li/strolch/persistence/impl/dao/test/ObserverUpdateTest.java index 1eb75f687..a3a84d598 100644 --- a/src/test/java/li/strolch/persistence/impl/dao/test/ObserverUpdateTest.java +++ b/src/test/java/li/strolch/persistence/impl/dao/test/ObserverUpdateTest.java @@ -111,13 +111,13 @@ public class ObserverUpdateTest { // create order Order newOrder = createOrder("MyTestOrder", "Test Name", "TestType", new Date(), State.CREATED); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ try (StrolchTransaction tx = runtimeMock.getDefaultRealm().openTx()) { - tx.getOrderDao().save(newOrder); + tx.getOrderMap().add(tx, newOrder); } // create resource Resource newResource = createResource("MyTestResource", "Test Name", "TestType"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ try (StrolchTransaction tx = runtimeMock.getDefaultRealm().openTx()) { - tx.getResourceDao().save(newResource); + tx.getResourceMap().add(tx, newResource); } assertEquals(2, observer.results.size()); diff --git a/src/test/resources/existingDbRuntime/config/StrolchConfiguration.xml b/src/test/resources/existingDbRuntime/config/StrolchConfiguration.xml new file mode 100644 index 000000000..bec79a297 --- /dev/null +++ b/src/test/resources/existingDbRuntime/config/StrolchConfiguration.xml @@ -0,0 +1,23 @@ + + + + StrolchPersistenceTest + + CACHED + true + + + + PersistenceHandler + li.strolch.persistence.api.PersistenceHandler + li.strolch.persistence.xml.XmlPersistenceHandler + + true + + + + ObserverHandler + li.strolch.runtime.observer.ObserverHandler + li.strolch.runtime.observer.DefaultObserverHandler + + \ No newline at end of file diff --git a/src/test/resources/existingDbRuntime/dbStore/defaultRealm/Order/MyType/@1.xml b/src/test/resources/existingDbRuntime/dbStore/defaultRealm/Order/MyType/@1.xml new file mode 100644 index 000000000..7c0a4269b --- /dev/null +++ b/src/test/resources/existingDbRuntime/dbStore/defaultRealm/Order/MyType/@1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/test/resources/existingDbRuntime/dbStore/defaultRealm/Resource/MyType/@1.xml b/src/test/resources/existingDbRuntime/dbStore/defaultRealm/Resource/MyType/@1.xml new file mode 100644 index 000000000..bc3a21ee7 --- /dev/null +++ b/src/test/resources/existingDbRuntime/dbStore/defaultRealm/Resource/MyType/@1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + +