[Major] refactored how transactions are opened

Now the ElementMapHandler is the central object and clients do not use
access DAOs or the PersistenceHandler anymore. This is now transparent.
This commit is contained in:
Robert von Burg 2014-01-10 19:10:29 +01:00
parent cc4a9a4a47
commit ffc18e06d7
24 changed files with 202 additions and 165 deletions

View File

@ -0,0 +1,57 @@
/*
* Copyright 2013 Robert von Burg <eitch@eitchnet.ch>
*
* 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.api;
import li.strolch.persistence.inmemory.InMemoryTransaction;
import li.strolch.runtime.agent.api.OrderMap;
import li.strolch.runtime.agent.api.ResourceMap;
import li.strolch.runtime.agent.impl.StrolchRealm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public abstract class AbstractTransaction implements StrolchTransaction {
protected static final Logger logger = LoggerFactory.getLogger(InMemoryTransaction.class);
private StrolchRealm realm;
/**
* @param realm
*/
public AbstractTransaction(StrolchRealm realm) {
this.realm = realm;
}
/**
* @return the realm
*/
protected StrolchRealm getRealm() {
return this.realm;
}
@Override
public ResourceMap getResourceMap() {
return this.realm.getResourceMap();
}
@Override
public OrderMap getOrderMap() {
return this.realm.getOrderMap();
}
}

View File

@ -15,12 +15,12 @@
*/ */
package li.strolch.persistence.api; package li.strolch.persistence.api;
import li.strolch.runtime.agent.impl.StrolchRealm;
/** /**
* @author Robert von Burg <eitch@eitchnet.ch> * @author Robert von Burg <eitch@eitchnet.ch>
*/ */
public interface PersistenceHandler { public interface PersistenceHandler {
public StrolchTransaction openTx(); public StrolchTransaction openTx(StrolchRealm realm);
public StrolchTransaction openTx(String realm);
} }

View File

@ -15,6 +15,9 @@
*/ */
package li.strolch.persistence.api; package li.strolch.persistence.api;
import li.strolch.runtime.agent.api.OrderMap;
import li.strolch.runtime.agent.api.ResourceMap;
public interface StrolchTransaction extends AutoCloseable { public interface StrolchTransaction extends AutoCloseable {
public void setCloseStrategy(TransactionCloseStrategy closeStrategy); public void setCloseStrategy(TransactionCloseStrategy closeStrategy);
@ -28,6 +31,10 @@ public interface StrolchTransaction extends AutoCloseable {
public boolean isOpen(); public boolean isOpen();
public ResourceMap getResourceMap();
public OrderMap getOrderMap();
public OrderDao getOrderDao(); public OrderDao getOrderDao();
public ResourceDao getResourceDao(); public ResourceDao getResourceDao();

View File

@ -4,9 +4,9 @@ import li.strolch.persistence.api.OrderDao;
import li.strolch.persistence.api.PersistenceHandler; import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.ResourceDao; import li.strolch.persistence.api.ResourceDao;
import li.strolch.persistence.api.StrolchTransaction; import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.StrolchConstants;
import li.strolch.runtime.agent.api.StrolchComponent; import li.strolch.runtime.agent.api.StrolchComponent;
import li.strolch.runtime.agent.impl.ComponentContainerImpl; import li.strolch.runtime.agent.impl.ComponentContainerImpl;
import li.strolch.runtime.agent.impl.StrolchRealm;
public class InMemoryPersistenceHandler extends StrolchComponent implements PersistenceHandler { public class InMemoryPersistenceHandler extends StrolchComponent implements PersistenceHandler {
@ -18,12 +18,7 @@ public class InMemoryPersistenceHandler extends StrolchComponent implements Pers
} }
@Override @Override
public StrolchTransaction openTx() { public StrolchTransaction openTx(StrolchRealm realm) {
return openTx(StrolchConstants.DEFAULT_REALM);
}
@Override
public StrolchTransaction openTx(String realm) {
return new InMemoryTransaction(realm, this); return new InMemoryTransaction(realm, this);
} }

View File

@ -4,25 +4,20 @@ import java.util.Date;
import java.util.Set; import java.util.Set;
import li.strolch.model.StrolchElement; import li.strolch.model.StrolchElement;
import li.strolch.persistence.api.AbstractTransaction;
import li.strolch.persistence.api.ModificationResult; import li.strolch.persistence.api.ModificationResult;
import li.strolch.persistence.api.OrderDao; import li.strolch.persistence.api.OrderDao;
import li.strolch.persistence.api.ResourceDao; import li.strolch.persistence.api.ResourceDao;
import li.strolch.persistence.api.StrolchPersistenceException; import li.strolch.persistence.api.StrolchPersistenceException;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.TransactionCloseStrategy; import li.strolch.persistence.api.TransactionCloseStrategy;
import li.strolch.persistence.api.TransactionResult; import li.strolch.persistence.api.TransactionResult;
import li.strolch.persistence.api.TransactionState; import li.strolch.persistence.api.TransactionState;
import li.strolch.runtime.agent.impl.StrolchRealm;
import li.strolch.runtime.observer.ObserverHandler; import li.strolch.runtime.observer.ObserverHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.eitchnet.utils.helper.StringHelper; import ch.eitchnet.utils.helper.StringHelper;
public class InMemoryTransaction implements StrolchTransaction { public class InMemoryTransaction extends AbstractTransaction {
private static final Logger logger = LoggerFactory.getLogger(InMemoryTransaction.class);
private String realm;
private InMemoryPersistenceHandler persistenceHandler; private InMemoryPersistenceHandler persistenceHandler;
private TransactionCloseStrategy closeStrategy; private TransactionCloseStrategy closeStrategy;
@ -34,11 +29,11 @@ public class InMemoryTransaction implements StrolchTransaction {
private TransactionResult txResult; private TransactionResult txResult;
private boolean open; private boolean open;
public InMemoryTransaction(String realm, InMemoryPersistenceHandler persistenceHandler) { public InMemoryTransaction(StrolchRealm realm, InMemoryPersistenceHandler persistenceHandler) {
super(realm);
this.persistenceHandler = persistenceHandler; this.persistenceHandler = persistenceHandler;
this.startTime = System.nanoTime(); this.startTime = System.nanoTime();
this.startTimeDate = new Date(); this.startTimeDate = new Date();
this.realm = realm;
this.suppressUpdates = false; this.suppressUpdates = false;
this.closeStrategy = TransactionCloseStrategy.COMMIT; this.closeStrategy = TransactionCloseStrategy.COMMIT;
} }
@ -109,7 +104,7 @@ public class InMemoryTransaction implements StrolchTransaction {
this.txResult.setStartTime(this.startTimeDate); this.txResult.setStartTime(this.startTimeDate);
this.txResult.setTxDuration(txDuration); this.txResult.setTxDuration(txDuration);
this.txResult.setCloseDuration(closeDuration); this.txResult.setCloseDuration(closeDuration);
this.txResult.setRealm(this.realm); this.txResult.setRealm(getRealm().getRealm());
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("TX was completed after "); //$NON-NLS-1$ sb.append("TX was completed after "); //$NON-NLS-1$
@ -144,7 +139,7 @@ public class InMemoryTransaction implements StrolchTransaction {
this.txResult.setStartTime(this.startTimeDate); this.txResult.setStartTime(this.startTimeDate);
this.txResult.setTxDuration(txDuration); this.txResult.setTxDuration(txDuration);
this.txResult.setCloseDuration(closeDuration); this.txResult.setCloseDuration(closeDuration);
this.txResult.setRealm(this.realm); this.txResult.setRealm(getRealm().getRealm());
} }
@Override @Override

View File

@ -15,23 +15,22 @@
*/ */
package li.strolch.runtime.agent.api; package li.strolch.runtime.agent.api;
import li.strolch.runtime.agent.impl.StrolchRealm;
/** /**
* @author Robert von Burg <eitch@eitchnet.ch> * @author Robert von Burg <eitch@eitchnet.ch>
*/ */
public interface ComponentContainer { public interface ComponentContainer {
public abstract StrolchAgent getAgent();
public abstract ComponentState getState(); public abstract ComponentState getState();
public abstract boolean hasComponent(Class<?> clazz); public abstract boolean hasComponent(Class<?> clazz);
public abstract <T> T getComponent(Class<T> clazz); public abstract <T> T getComponent(Class<T> clazz);
public abstract OrderMap getOrderMap(); public abstract StrolchRealm getDefaultRealm();
public abstract OrderMap getOrderMap(String realm); public abstract StrolchRealm getRealm(String realm);
public abstract ResourceMap getResourceMap();
public abstract ResourceMap getResourceMap(String realm);
} }

View File

@ -47,8 +47,4 @@ public interface ElementMap<T extends StrolchElement> {
public void update(StrolchTransaction tx, T element); public void update(StrolchTransaction tx, T element);
public void remove(StrolchTransaction tx, T element); public void remove(StrolchTransaction tx, T element);
public StrolchTransaction openTx();
public StrolchTransaction openTx(String realm);
} }

View File

@ -15,17 +15,15 @@
*/ */
package li.strolch.runtime.agent.api; package li.strolch.runtime.agent.api;
import li.strolch.runtime.agent.impl.StrolchRealm;
/** /**
* @author Robert von Burg <eitch@eitchnet.ch> * @author Robert von Burg <eitch@eitchnet.ch>
*/ */
public interface ElementMapHandler { public interface ElementMapHandler {
public ResourceMap getResourceMap(); public StrolchRealm getDefaultRealm();
public ResourceMap getResourceMap(String realm); public StrolchRealm getRealm(String realm);
public OrderMap getOrderMap();
public OrderMap getOrderMap(String realm);
} }

View File

@ -100,7 +100,7 @@ public class StrolchAgent {
this.strolchConfiguration.addConfiguration(configuration.getName(), configuration); this.strolchConfiguration.addConfiguration(configuration.getName(), configuration);
} }
ComponentContainerImpl container = new ComponentContainerImpl(); ComponentContainerImpl container = new ComponentContainerImpl(this);
this.container = container; this.container = container;
logger.info(MessageFormat.format("Setup Agent {0}", runtimeConfiguration.getApplicationName())); //$NON-NLS-1$ logger.info(MessageFormat.format("Setup Agent {0}", runtimeConfiguration.getApplicationName())); //$NON-NLS-1$

View File

@ -21,8 +21,6 @@ import java.util.Map;
import li.strolch.exception.StrolchException; import li.strolch.exception.StrolchException;
import li.strolch.runtime.StrolchConstants; import li.strolch.runtime.StrolchConstants;
import li.strolch.runtime.agent.api.ElementMapHandler; import li.strolch.runtime.agent.api.ElementMapHandler;
import li.strolch.runtime.agent.api.OrderMap;
import li.strolch.runtime.agent.api.ResourceMap;
import li.strolch.runtime.agent.api.StrolchComponent; import li.strolch.runtime.agent.api.StrolchComponent;
/** /**
@ -41,28 +39,12 @@ public abstract class AbstractElementMapHandler extends StrolchComponent impleme
} }
@Override @Override
public ResourceMap getResourceMap() { public StrolchRealm getDefaultRealm() {
return getResourceMap(StrolchConstants.DEFAULT_REALM); return getRealm(StrolchConstants.DEFAULT_REALM);
} }
@Override @Override
public ResourceMap getResourceMap(String realm) { public StrolchRealm getRealm(String realm) {
StrolchRealm strolchRealm = getRealm(realm);
return strolchRealm.getResourceMap();
}
@Override
public OrderMap getOrderMap() {
return getOrderMap(StrolchConstants.DEFAULT_REALM);
}
@Override
public OrderMap getOrderMap(String realm) {
StrolchRealm strolchRealm = getRealm(realm);
return strolchRealm.getOrderMap();
}
private StrolchRealm getRealm(String realm) {
StrolchRealm strolchRealm = this.realms.get(realm); StrolchRealm strolchRealm = this.realms.get(realm);
if (strolchRealm == null) { if (strolchRealm == null) {
String msg = "No realm is configured with the name {0}"; //$NON-NLS-1$ String msg = "No realm is configured with the name {0}"; //$NON-NLS-1$

View File

@ -50,10 +50,11 @@ public class CachedElementMapHandler extends InMemoryElementMapHandler {
int nrOfOrders = 0; int nrOfOrders = 0;
int nrOfResources = 0; int nrOfResources = 0;
OrderMap orderMap = getContainer().getOrderMap(realm); StrolchRealm strolchRealm = this.realms.get(realm);
ResourceMap resourceMap = getContainer().getResourceMap(realm); OrderMap orderMap = strolchRealm.getOrderMap();
ResourceMap resourceMap = strolchRealm.getResourceMap();
try (StrolchTransaction tx = resourceMap.openTx(realm)) { try (StrolchTransaction tx = strolchRealm.openTx()) {
ResourceDao resourceDao = tx.getResourceDao(); ResourceDao resourceDao = tx.getResourceDao();
Set<String> resourceTypes = resourceDao.queryTypes(); Set<String> resourceTypes = resourceDao.queryTypes();
for (String type : resourceTypes) { for (String type : resourceTypes) {
@ -65,7 +66,7 @@ public class CachedElementMapHandler extends InMemoryElementMapHandler {
} }
} }
try (StrolchTransaction tx = orderMap.openTx(realm)) { try (StrolchTransaction tx = strolchRealm.openTx()) {
OrderDao orderDao = tx.getOrderDao(); OrderDao orderDao = tx.getOrderDao();
Set<String> orderTypes = orderDao.queryTypes(); Set<String> orderTypes = orderDao.queryTypes();
for (String type : orderTypes) { for (String type : orderTypes) {

View File

@ -22,11 +22,11 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import li.strolch.runtime.StrolchConstants;
import li.strolch.runtime.agent.api.ComponentContainer; import li.strolch.runtime.agent.api.ComponentContainer;
import li.strolch.runtime.agent.api.ComponentState; import li.strolch.runtime.agent.api.ComponentState;
import li.strolch.runtime.agent.api.ElementMapHandler; import li.strolch.runtime.agent.api.ElementMapHandler;
import li.strolch.runtime.agent.api.OrderMap; import li.strolch.runtime.agent.api.StrolchAgent;
import li.strolch.runtime.agent.api.ResourceMap;
import li.strolch.runtime.agent.api.StrolchComponent; import li.strolch.runtime.agent.api.StrolchComponent;
import li.strolch.runtime.configuration.ComponentConfiguration; import li.strolch.runtime.configuration.ComponentConfiguration;
import li.strolch.runtime.configuration.StrolchConfiguration; import li.strolch.runtime.configuration.StrolchConfiguration;
@ -45,10 +45,18 @@ public class ComponentContainerImpl implements ComponentContainer {
private StrolchConfiguration strolchConfiguration; private StrolchConfiguration strolchConfiguration;
private ComponentState state; private ComponentState state;
public ComponentContainerImpl() { private StrolchAgent agent;
public ComponentContainerImpl(StrolchAgent agent) {
this.agent = agent;
this.state = ComponentState.UNDEFINED; this.state = ComponentState.UNDEFINED;
} }
@Override
public StrolchAgent getAgent() {
return this.agent;
}
public ComponentState getState() { public ComponentState getState() {
return this.state; return this.state;
} }
@ -71,23 +79,13 @@ public class ComponentContainerImpl implements ComponentContainer {
} }
@Override @Override
public OrderMap getOrderMap() { public StrolchRealm getDefaultRealm() {
return getComponent(ElementMapHandler.class).getOrderMap(); return getRealm(StrolchConstants.DEFAULT_REALM);
} }
@Override @Override
public OrderMap getOrderMap(String realm) { public StrolchRealm getRealm(String realm) {
return getComponent(ElementMapHandler.class).getOrderMap(realm); return getComponent(ElementMapHandler.class).getRealm(realm);
}
@Override
public ResourceMap getResourceMap() {
return getComponent(ElementMapHandler.class).getResourceMap();
}
@Override
public ResourceMap getResourceMap(String realm) {
return getComponent(ElementMapHandler.class).getResourceMap(realm);
} }
private void initializeComponent(Map<Class<?>, StrolchComponent> componentMap, private void initializeComponent(Map<Class<?>, StrolchComponent> componentMap,

View File

@ -36,10 +36,10 @@ public class InMemoryElementListener implements StrolchElementListener {
private ResourceMap resourceMap; private ResourceMap resourceMap;
private OrderMap orderMap; private OrderMap orderMap;
public InMemoryElementListener(StrolchTransaction tx, ResourceMap resourceMap, OrderMap orderMap) { public InMemoryElementListener(StrolchTransaction tx) {
this.tx = tx; this.tx = tx;
this.resourceMap = resourceMap; this.resourceMap = tx.getResourceMap();
this.orderMap = orderMap; this.orderMap = tx.getOrderMap();
this.addResources = true; this.addResources = true;
this.addOrders = true; this.addOrders = true;

View File

@ -47,7 +47,7 @@ public class InMemoryElementMapHandler extends AbstractElementMapHandler {
PersistenceHandler persistenceHandler = getContainer().getComponent(PersistenceHandler.class); PersistenceHandler persistenceHandler = getContainer().getComponent(PersistenceHandler.class);
TransactionalResourceMap resourceMap = new TransactionalResourceMap(realm, persistenceHandler); TransactionalResourceMap resourceMap = new TransactionalResourceMap(realm, persistenceHandler);
TransactionalOrderMap orderMap = new TransactionalOrderMap(realm, persistenceHandler); TransactionalOrderMap orderMap = new TransactionalOrderMap(realm, persistenceHandler);
StrolchRealm strolchRealm = new StrolchRealm(realm, resourceMap, orderMap); StrolchRealm strolchRealm = new StrolchRealm(realm, persistenceHandler, resourceMap, orderMap);
this.realms.put(realm, strolchRealm); this.realms.put(realm, strolchRealm);
} }

View File

@ -15,6 +15,8 @@
*/ */
package li.strolch.runtime.agent.impl; package li.strolch.runtime.agent.impl;
import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.agent.api.OrderMap; import li.strolch.runtime.agent.api.OrderMap;
import li.strolch.runtime.agent.api.ResourceMap; import li.strolch.runtime.agent.api.ResourceMap;
@ -26,9 +28,11 @@ public class StrolchRealm {
private String realm; private String realm;
private ResourceMap resourceMap; private ResourceMap resourceMap;
private OrderMap orderMap; private OrderMap orderMap;
private PersistenceHandler persistenceHandler;
public StrolchRealm(String realm, ResourceMap resourceMap, OrderMap orderMap) { public StrolchRealm(String realm, PersistenceHandler persistenceHandler, ResourceMap resourceMap, OrderMap orderMap) {
this.realm = realm; this.realm = realm;
this.persistenceHandler = persistenceHandler;
this.resourceMap = resourceMap; this.resourceMap = resourceMap;
this.orderMap = orderMap; this.orderMap = orderMap;
} }
@ -40,6 +44,10 @@ public class StrolchRealm {
return this.realm; return this.realm;
} }
public StrolchTransaction openTx() {
return this.persistenceHandler.openTx(this);
}
/** /**
* @return the resourceMap * @return the resourceMap
*/ */

View File

@ -90,14 +90,4 @@ public abstract class TransactionalElementMap<T extends StrolchElement, U extend
public void remove(StrolchTransaction tx, T element) { public void remove(StrolchTransaction tx, T element) {
getDao(tx).remove(element); getDao(tx).remove(element);
} }
@Override
public StrolchTransaction openTx() {
return this.persistenceHandler.openTx();
}
@Override
public StrolchTransaction openTx(String realm) {
return this.persistenceHandler.openTx(realm);
}
} }

View File

@ -44,13 +44,15 @@ public class TransactionalElementMapHandler extends InMemoryElementMapHandler {
int nrOfOrders = 0; int nrOfOrders = 0;
int nrOfResources = 0; int nrOfResources = 0;
OrderMap orderMap = getContainer().getOrderMap(realm); StrolchRealm strolchRealm = this.realms.get(realm);
try (StrolchTransaction tx = orderMap.openTx(realm)) { OrderMap orderMap = strolchRealm.getOrderMap();
ResourceMap resourceMap = strolchRealm.getResourceMap();
try (StrolchTransaction tx = strolchRealm.openTx()) {
nrOfOrders = orderMap.getAllKeys(tx).size(); nrOfOrders = orderMap.getAllKeys(tx).size();
} }
ResourceMap resourceMap = getContainer().getResourceMap(realm); try (StrolchTransaction tx = strolchRealm.openTx()) {
try (StrolchTransaction tx = resourceMap.openTx(realm)) {
nrOfResources = resourceMap.getAllKeys(tx).size(); nrOfResources = resourceMap.getAllKeys(tx).size();
} }

View File

@ -24,8 +24,6 @@ import li.strolch.model.xml.XmlModelDefaultHandler.XmlModelStatistics;
import li.strolch.model.xml.XmlModelFileHandler; import li.strolch.model.xml.XmlModelFileHandler;
import li.strolch.persistence.api.StrolchTransaction; import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.StrolchConstants; import li.strolch.runtime.StrolchConstants;
import li.strolch.runtime.agent.api.OrderMap;
import li.strolch.runtime.agent.api.ResourceMap;
import li.strolch.runtime.agent.api.StrolchAgent; import li.strolch.runtime.agent.api.StrolchAgent;
import li.strolch.runtime.configuration.ComponentConfiguration; import li.strolch.runtime.configuration.ComponentConfiguration;
import li.strolch.runtime.configuration.RuntimeConfiguration; import li.strolch.runtime.configuration.RuntimeConfiguration;
@ -79,13 +77,11 @@ public class TransientElementMapHandler extends InMemoryElementMapHandler {
for (String realm : this.realms.keySet()) { for (String realm : this.realms.keySet()) {
StrolchRealm strolchRealm = this.realms.get(realm); StrolchRealm strolchRealm = this.realms.get(realm);
ResourceMap resourceMap = strolchRealm.getResourceMap();
OrderMap orderMap = strolchRealm.getOrderMap();
File modelFile = this.realmModelFiles.get(realm); File modelFile = this.realmModelFiles.get(realm);
XmlModelStatistics statistics; XmlModelStatistics statistics;
try (StrolchTransaction tx = resourceMap.openTx(realm)) { try (StrolchTransaction tx = strolchRealm.openTx()) {
InMemoryElementListener elementListener = new InMemoryElementListener(tx, resourceMap, orderMap); InMemoryElementListener elementListener = new InMemoryElementListener(tx);
XmlModelFileHandler handler = new XmlModelFileHandler(elementListener, modelFile); XmlModelFileHandler handler = new XmlModelFileHandler(elementListener, modelFile);
handler.parseFile(); handler.parseFile();
statistics = handler.getStatistics(); statistics = handler.getStatistics();

View File

@ -18,13 +18,17 @@ package li.strolch.service.api;
import java.text.MessageFormat; import java.text.MessageFormat;
import li.strolch.exception.StrolchException; import li.strolch.exception.StrolchException;
import li.strolch.runtime.agent.api.OrderMap; import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.agent.api.ResourceMap; import li.strolch.runtime.agent.api.ComponentContainer;
import li.strolch.runtime.agent.api.ElementMapHandler;
import li.strolch.runtime.agent.impl.StrolchRealm;
import li.strolch.runtime.configuration.RuntimeConfiguration; import li.strolch.runtime.configuration.RuntimeConfiguration;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ch.eitchnet.privilege.model.Certificate;
/** /**
* @author Robert von Burg <eitch@eitchnet.ch> * @author Robert von Burg <eitch@eitchnet.ch>
*/ */
@ -33,30 +37,53 @@ public abstract class AbstractService<T extends ServiceArgument, U extends Servi
protected static final Logger logger = LoggerFactory.getLogger(AbstractService.class); protected static final Logger logger = LoggerFactory.getLogger(AbstractService.class);
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private DefaultServiceHandler serviceHandler; private ComponentContainer container;
private Certificate certificate;
/** /**
* @param serviceHandler * @param container
* the serviceHandler to set * the container to set
*/ */
public void setServiceHandler(DefaultServiceHandler serviceHandler) { public void setContainer(ComponentContainer container) {
this.serviceHandler = serviceHandler; this.container = container;
} }
public <V> V getComponent(Class<V> clazz) { /**
return this.serviceHandler.getComponent(clazz); * @param certificate
* the certificate to set
*/
public void setCertificate(Certificate certificate) {
this.certificate = certificate;
} }
public RuntimeConfiguration getRuntimeConfiguration() { /**
return this.serviceHandler.getRuntimeConfiguration(); * @return the certificate
*/
protected Certificate getCertificate() {
return this.certificate;
} }
public ResourceMap getResourceMap(String realm) { /**
return this.serviceHandler.getResourceMap(realm); * @return the container
*/
protected ComponentContainer getContainer() {
return this.container;
} }
public OrderMap getOrderMap(String realm) { protected <V> V getComponent(Class<V> clazz) {
return this.serviceHandler.getOrderMap(realm); return this.container.getComponent(clazz);
}
protected RuntimeConfiguration getRuntimeConfiguration() {
return this.container.getAgent().getStrolchConfiguration().getRuntimeConfiguration();
}
protected StrolchRealm getRealm(String realm) {
return getComponent(ElementMapHandler.class).getRealm(realm);
}
protected StrolchTransaction openTx(String realm) {
return getComponent(ElementMapHandler.class).getRealm(realm).openTx();
} }
@Override @Override

View File

@ -16,9 +16,7 @@
package li.strolch.service.api; package li.strolch.service.api;
import li.strolch.persistence.api.StrolchTransaction; import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.agent.api.OrderMap; import li.strolch.runtime.agent.api.ComponentContainer;
import li.strolch.runtime.agent.api.ResourceMap;
import li.strolch.runtime.configuration.RuntimeConfiguration;
import ch.eitchnet.privilege.model.Restrictable; import ch.eitchnet.privilege.model.Restrictable;
/** /**
@ -26,28 +24,23 @@ import ch.eitchnet.privilege.model.Restrictable;
*/ */
public abstract class Command implements Restrictable { public abstract class Command implements Restrictable {
private final DefaultServiceHandler serviceHandler; private final ComponentContainer container;
private final StrolchTransaction tx; private final StrolchTransaction tx;
public Command(DefaultServiceHandler serviceHandler, StrolchTransaction tx) { public Command(ComponentContainer container, StrolchTransaction tx) {
this.serviceHandler = serviceHandler; this.container = container;
this.tx = tx; this.tx = tx;
} }
public <V> V getComponent(Class<V> clazz) { public <V> V getComponent(Class<V> clazz) {
return this.serviceHandler.getComponent(clazz); return this.container.getComponent(clazz);
} }
public RuntimeConfiguration getRuntimeConfiguration() { /**
return this.serviceHandler.getRuntimeConfiguration(); * @return the container
} */
protected ComponentContainer getContainer() {
public ResourceMap getResourceMap(String realm) { return this.container;
return this.serviceHandler.getResourceMap(realm);
}
public OrderMap getOrderMap(String realm) {
return this.serviceHandler.getOrderMap(realm);
} }
/** /**

View File

@ -18,8 +18,6 @@ package li.strolch.service.api;
import java.text.MessageFormat; import java.text.MessageFormat;
import li.strolch.exception.StrolchException; import li.strolch.exception.StrolchException;
import li.strolch.runtime.agent.api.OrderMap;
import li.strolch.runtime.agent.api.ResourceMap;
import li.strolch.runtime.agent.api.StrolchComponent; import li.strolch.runtime.agent.api.StrolchComponent;
import li.strolch.runtime.agent.impl.ComponentContainerImpl; import li.strolch.runtime.agent.impl.ComponentContainerImpl;
import li.strolch.runtime.configuration.ComponentConfiguration; import li.strolch.runtime.configuration.ComponentConfiguration;
@ -61,14 +59,6 @@ public class DefaultServiceHandler extends StrolchComponent implements ServiceHa
return this.runtimeConfiguration; return this.runtimeConfiguration;
} }
public ResourceMap getResourceMap(String realm) {
return this.getContainer().getResourceMap(realm);
}
public OrderMap getOrderMap(String realm) {
return this.getContainer().getOrderMap(realm);
}
@Override @Override
public <U extends ServiceResult> U doService(Certificate certificate, Service<ServiceArgument, U> service) { public <U extends ServiceResult> U doService(Certificate certificate, Service<ServiceArgument, U> service) {
return doService(certificate, service, null); return doService(certificate, service, null);
@ -94,8 +84,12 @@ public class DefaultServiceHandler extends StrolchComponent implements ServiceHa
try { try {
// then perform the service // then perform the service
if (service instanceof AbstractService) if (service instanceof AbstractService) {
((AbstractService<?, ?>) service).setServiceHandler(this); AbstractService<?, ?> abstractService = (AbstractService<?, ?>) service;
abstractService.setContainer(getContainer());
abstractService.setCertificate(certificate);
}
U serviceResult = service.doService(argument); U serviceResult = service.doService(argument);
if (serviceResult == null) { if (serviceResult == null) {
String msg = "Service {0} is not properly implemented as it returned a null result!"; //$NON-NLS-1$ String msg = "Service {0} is not properly implemented as it returned a null result!"; //$NON-NLS-1$

View File

@ -23,7 +23,6 @@ import java.text.MessageFormat;
import li.strolch.model.ModelGenerator; import li.strolch.model.ModelGenerator;
import li.strolch.model.Resource; import li.strolch.model.Resource;
import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.ResourceDao; import li.strolch.persistence.api.ResourceDao;
import li.strolch.persistence.api.StrolchTransaction; import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.agent.api.ComponentContainer; import li.strolch.runtime.agent.api.ComponentContainer;
@ -144,8 +143,7 @@ public class ComponentContainerTest {
ServiceResultTest result = serviceHandler.doService(); ServiceResultTest result = serviceHandler.doService();
assertEquals(1, result.getResult()); assertEquals(1, result.getResult());
PersistenceHandler persistenceHandler = container.getComponent(PersistenceHandler.class); try (StrolchTransaction tx = container.getDefaultRealm().openTx()) {
try (StrolchTransaction tx = persistenceHandler.openTx()) {
ResourceDao resourceDao = tx.getResourceDao(); ResourceDao resourceDao = tx.getResourceDao();
resourceDao.save(ModelGenerator.createResource("@testRes", "Test Res", "Test")); resourceDao.save(ModelGenerator.createResource("@testRes", "Test Res", "Test"));
Resource queriesRes = resourceDao.queryBy("Test", "@testRes"); Resource queriesRes = resourceDao.queryBy("Test", "@testRes");

View File

@ -110,7 +110,7 @@ public class ControllerDependencyTest {
@Before @Before
public void setupModel() { public void setupModel() {
this.container = new ComponentContainerImpl(); this.container = new ComponentContainerImpl(null);
this.con2 = new ComponentController(new StrolchComponent(this.container, "2")); this.con2 = new ComponentController(new StrolchComponent(this.container, "2"));
this.con5 = new ComponentController(new StrolchComponent(this.container, "5")); this.con5 = new ComponentController(new StrolchComponent(this.container, "5"));
@ -539,7 +539,7 @@ public class ControllerDependencyTest {
@Test @Test
public void shouldAddDepedencies() { public void shouldAddDepedencies() {
ComponentContainerImpl container = new ComponentContainerImpl(); ComponentContainerImpl container = new ComponentContainerImpl(null);
StrolchComponent component = new StrolchComponent(container, "1"); //$NON-NLS-1$ StrolchComponent component = new StrolchComponent(container, "1"); //$NON-NLS-1$
ComponentController controller = new ComponentController(component); ComponentController controller = new ComponentController(component);

View File

@ -34,8 +34,7 @@ import li.strolch.model.query.ResourceQuery;
import li.strolch.model.query.Selection; import li.strolch.model.query.Selection;
import li.strolch.model.query.StrolchTypeNavigation; import li.strolch.model.query.StrolchTypeNavigation;
import li.strolch.persistence.api.StrolchTransaction; import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.agent.api.OrderMap; import li.strolch.runtime.agent.api.ComponentContainer;
import li.strolch.runtime.agent.api.ResourceMap;
import li.strolch.runtime.agent.api.StrolchAgent; import li.strolch.runtime.agent.api.StrolchAgent;
import li.strolch.runtime.query.inmemory.InMemoryOrderQueryVisitor; import li.strolch.runtime.query.inmemory.InMemoryOrderQueryVisitor;
import li.strolch.runtime.query.inmemory.InMemoryQuery; import li.strolch.runtime.query.inmemory.InMemoryQuery;
@ -58,12 +57,13 @@ public class QueryTest {
StrolchAgent agent = ComponentContainerTest.startContainer(PATH_EMPTY_RUNTIME, StrolchAgent agent = ComponentContainerTest.startContainer(PATH_EMPTY_RUNTIME,
ComponentContainerTest.PATH_EMPTY_CONTAINER); ComponentContainerTest.PATH_EMPTY_CONTAINER);
ComponentContainer container = agent.getContainer();
Resource res1 = createResource("@1", "Test Resource", "MyType"); Resource res1 = createResource("@1", "Test Resource", "MyType");
IntegerParameter iP = new IntegerParameter("nbOfBooks", "Number of Books", 33); IntegerParameter iP = new IntegerParameter("nbOfBooks", "Number of Books", 33);
res1.addParameter(BAG_ID, iP); res1.addParameter(BAG_ID, iP);
ResourceMap resourceMap = agent.getContainer().getResourceMap(); try (StrolchTransaction tx = container.getDefaultRealm().openTx()) {
try (StrolchTransaction tx = resourceMap.openTx()) { tx.getResourceMap().add(tx, res1);
resourceMap.add(tx, res1);
} }
List<Selection> elementAndSelections = new ArrayList<>(); List<Selection> elementAndSelections = new ArrayList<>();
@ -76,7 +76,7 @@ public class QueryTest {
InMemoryResourceQueryVisitor resourceQuery = new InMemoryResourceQueryVisitor(); InMemoryResourceQueryVisitor resourceQuery = new InMemoryResourceQueryVisitor();
InMemoryQuery<Resource> inMemoryQuery = resourceQuery.visit(query); InMemoryQuery<Resource> inMemoryQuery = resourceQuery.visit(query);
List<Resource> result; List<Resource> result;
try (StrolchTransaction tx = resourceMap.openTx()) { try (StrolchTransaction tx = container.getDefaultRealm().openTx()) {
result = inMemoryQuery.doQuery(tx.getResourceDao()); result = inMemoryQuery.doQuery(tx.getResourceDao());
} }
assertEquals(1, result.size()); assertEquals(1, result.size());
@ -88,12 +88,13 @@ public class QueryTest {
StrolchAgent agent = ComponentContainerTest.startContainer(PATH_EMPTY_RUNTIME, StrolchAgent agent = ComponentContainerTest.startContainer(PATH_EMPTY_RUNTIME,
ComponentContainerTest.PATH_EMPTY_CONTAINER); ComponentContainerTest.PATH_EMPTY_CONTAINER);
ComponentContainer container = agent.getContainer();
Order o1 = createOrder("@1", "Test Order", "MyType"); Order o1 = createOrder("@1", "Test Order", "MyType");
IntegerParameter iP = new IntegerParameter("nbOfBooks", "Number of Books", 33); IntegerParameter iP = new IntegerParameter("nbOfBooks", "Number of Books", 33);
o1.addParameter(BAG_ID, iP); o1.addParameter(BAG_ID, iP);
OrderMap orderMap = agent.getContainer().getOrderMap(); try (StrolchTransaction tx = container.getDefaultRealm().openTx()) {
try (StrolchTransaction tx = orderMap.openTx()) { tx.getOrderMap().add(tx, o1);
orderMap.add(tx, o1);
} }
List<Selection> elementAndSelections = new ArrayList<>(); List<Selection> elementAndSelections = new ArrayList<>();
@ -106,7 +107,7 @@ public class QueryTest {
InMemoryOrderQueryVisitor orderQuery = new InMemoryOrderQueryVisitor(); InMemoryOrderQueryVisitor orderQuery = new InMemoryOrderQueryVisitor();
InMemoryQuery<Order> inMemoryQuery = orderQuery.visit(query); InMemoryQuery<Order> inMemoryQuery = orderQuery.visit(query);
List<Order> result; List<Order> result;
try (StrolchTransaction tx = orderMap.openTx()) { try (StrolchTransaction tx = container.getDefaultRealm().openTx()) {
result = inMemoryQuery.doQuery(tx.getOrderDao()); result = inMemoryQuery.doQuery(tx.getOrderDao());
} }
assertEquals(1, result.size()); assertEquals(1, result.size());