[Major] Added add, update and remove methods to TX for elements

Moved add, update and remove commands to agent package
This commit is contained in:
Robert von Burg 2017-07-24 13:51:17 +02:00
parent 0b62acc4f3
commit c0cc6f57cb
44 changed files with 704 additions and 84 deletions

View File

@ -22,7 +22,6 @@ import li.strolch.agent.api.AuditTrail;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.OrderMap;
import li.strolch.agent.api.ResourceMap;
import li.strolch.handler.operationslog.OperationsLog;
import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.inmemory.InMemoryPersistence;
@ -86,10 +85,7 @@ public class EmptyRealm extends InternalStrolchRealm {
@Override
public void initialize(ComponentContainer container, ComponentConfiguration configuration) {
super.initialize(container, configuration);
OperationsLog operationsLog = container.hasComponent(OperationsLog.class)
? container.getComponent(OperationsLog.class) : null;
this.persistenceHandler = new InMemoryPersistence(operationsLog, container.getPrivilegeHandler(),
isVersioningEnabled());
this.persistenceHandler = new InMemoryPersistence(container, isVersioningEnabled());
this.resourceMap = new TransactionalResourceMap(this);
this.orderMap = new TransactionalOrderMap(this);
this.activityMap = new TransactionalActivityMap(this);

View File

@ -23,7 +23,6 @@ import li.strolch.agent.api.AuditTrail;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.OrderMap;
import li.strolch.agent.api.ResourceMap;
import li.strolch.handler.operationslog.OperationsLog;
import li.strolch.model.ModelStatistics;
import li.strolch.model.xml.XmlModelSaxFileReader;
import li.strolch.persistence.api.PersistenceHandler;
@ -104,10 +103,7 @@ public class TransientRealm extends InternalStrolchRealm {
this.modelFile = configuration.getDataFile(key, null, configuration.getRuntimeConfiguration(), true);
OperationsLog operationsLog = container.hasComponent(OperationsLog.class)
? container.getComponent(OperationsLog.class) : null;
this.persistenceHandler = new InMemoryPersistence(operationsLog, container.getPrivilegeHandler(),
isVersioningEnabled());
this.persistenceHandler = new InMemoryPersistence(container, isVersioningEnabled());
this.resourceMap = new TransactionalResourceMap(this);
this.orderMap = new TransactionalOrderMap(this);
this.activityMap = new TransactionalActivityMap(this);

View File

@ -32,6 +32,7 @@ import org.slf4j.LoggerFactory;
import li.strolch.agent.api.ActivityMap;
import li.strolch.agent.api.AuditTrail;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.ObserverEvent;
import li.strolch.agent.api.ObserverHandler;
import li.strolch.agent.api.OrderMap;
@ -46,6 +47,7 @@ import li.strolch.agent.impl.AuditingResourceMap;
import li.strolch.agent.impl.InternalStrolchRealm;
import li.strolch.exception.StrolchAccessDeniedException;
import li.strolch.exception.StrolchException;
import li.strolch.exception.StrolchModelException;
import li.strolch.handler.operationslog.LogMessage;
import li.strolch.handler.operationslog.LogSeverity;
import li.strolch.handler.operationslog.OperationsLog;
@ -80,6 +82,7 @@ import li.strolch.service.api.Command;
import li.strolch.utils.dbc.DBC;
import li.strolch.utils.helper.ExceptionHelper;
import li.strolch.utils.helper.StringHelper;
import li.strolch.utils.objectfilter.ObjectFilter;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
@ -87,8 +90,15 @@ import li.strolch.utils.helper.StringHelper;
public abstract class AbstractTransaction implements StrolchTransaction {
protected static final Logger logger = LoggerFactory.getLogger(AbstractTransaction.class);
private ComponentContainer container;
private PrivilegeHandler privilegeHandler;
private OperationsLog operationsLog;
private InternalStrolchRealm realm;
private ObjectFilter objectFilter;
private TransactionCloseStrategy closeStrategy;
private boolean suppressUpdates;
private boolean suppressAudits;
@ -107,18 +117,18 @@ public abstract class AbstractTransaction implements StrolchTransaction {
private String action;
private Certificate certificate;
private PrivilegeHandler privilegeHandler;
private OperationsLog operationsLog;
public AbstractTransaction(OperationsLog operationsLog, PrivilegeHandler privilegeHandler, StrolchRealm realm,
Certificate certificate, String action) {
DBC.PRE.assertNotNull("privilegeHandler must be set!", privilegeHandler); //$NON-NLS-1$
public AbstractTransaction(ComponentContainer container, StrolchRealm realm, Certificate certificate,
String action) {
DBC.PRE.assertNotNull("container must be set!", container); //$NON-NLS-1$
DBC.PRE.assertNotNull("realm must be set!", realm); //$NON-NLS-1$
DBC.PRE.assertNotNull("certificate must be set!", certificate); //$NON-NLS-1$
DBC.PRE.assertNotNull("action must be set!", action); //$NON-NLS-1$
this.privilegeHandler = privilegeHandler;
this.operationsLog = operationsLog;
this.container = container;
this.privilegeHandler = container.getPrivilegeHandler();
if (container.hasComponent(OperationsLog.class))
this.operationsLog = container.getComponent(OperationsLog.class);
this.realm = (InternalStrolchRealm) realm;
this.action = action;
this.certificate = certificate;
@ -336,6 +346,11 @@ public abstract class AbstractTransaction implements StrolchTransaction {
return this.auditTrail;
}
@Override
public ComponentContainer getContainer() {
return this.container;
}
private void assertQueryAllowed(StrolchQuery query) {
try {
PrivilegeContext privilegeContext = this.privilegeHandler.getPrivilegeContext(this.certificate);
@ -634,9 +649,175 @@ public abstract class AbstractTransaction implements StrolchTransaction {
return getActivityMap().getBy(this, refP, assertExists);
}
private ObjectFilter getObjectFilter() {
if (this.objectFilter == null)
this.objectFilter = new ObjectFilter();
return this.objectFilter;
}
@Override
public void addResource(Resource resource) throws StrolchModelException {
DBC.PRE.assertNotNull("resource must not be null", resource);
DBC.PRE.assertFalse("resource already exists with id " + resource.getId(),
getResourceMap().hasElement(this, resource.getType(), resource.getId()));
getObjectFilter().add(Tags.RESOURCE, resource);
}
@Override
public void addOrder(Order order) throws StrolchException {
DBC.PRE.assertNotNull("order must not be null", order);
DBC.PRE.assertFalse("order already exists with id " + order.getId(),
getOrderMap().hasElement(this, order.getType(), order.getId()));
getObjectFilter().add(Tags.ORDER, order);
}
@Override
public void addActivity(Activity activity) throws StrolchException {
DBC.PRE.assertNotNull("activity must not be null", activity);
DBC.PRE.assertFalse("activity already exists with id " + activity.getId(),
getActivityMap().hasElement(this, activity.getType(), activity.getId()));
getObjectFilter().add(Tags.ACTIVITY, activity);
}
@Override
public void updateResource(Resource resource) throws StrolchException {
DBC.PRE.assertNotNull("resource must not be null", resource);
getObjectFilter().update(Tags.RESOURCE, resource);
}
@Override
public void updateOrder(Order order) {
DBC.PRE.assertNotNull("order must not be null", order);
getObjectFilter().update(Tags.ORDER, order);
}
@Override
public void updateActivity(Activity activity) throws StrolchException {
DBC.PRE.assertNotNull("activity must not be null", activity);
getObjectFilter().update(Tags.ACTIVITY, activity);
}
@Override
public void removeResource(Resource resource) throws StrolchException {
DBC.PRE.assertNotNull("resource must not be null", resource);
getObjectFilter().remove(Tags.RESOURCE, resource);
}
@Override
public void removeOrder(Order order) throws StrolchException {
DBC.PRE.assertNotNull("order must not be null", order);
getObjectFilter().remove(Tags.ORDER, order);
}
@Override
public void removeActivity(Activity activity) throws StrolchException {
DBC.PRE.assertNotNull("activity must not be null", activity);
getObjectFilter().remove(Tags.ACTIVITY, activity);
}
private void addModelChangeCommands() {
if (this.objectFilter == null)
return;
List<Object> removed;
List<Object> updated;
List<Object> added;
/*
* Resources
*/
removed = this.objectFilter.getRemoved(Tags.RESOURCE);
if (!removed.isEmpty()) {
for (Object obj : removed) {
RemoveResourceCommand cmd = new RemoveResourceCommand(getContainer(), this);
cmd.setResource((Resource) obj);
addCommand(cmd);
}
}
updated = this.objectFilter.getUpdated(Tags.RESOURCE);
if (!updated.isEmpty()) {
for (Object obj : updated) {
UpdateResourceCommand cmd = new UpdateResourceCommand(getContainer(), this);
cmd.setResource((Resource) obj);
addCommand(cmd);
}
}
added = this.objectFilter.getAdded(Tags.RESOURCE);
if (!added.isEmpty()) {
for (Object obj : added) {
AddResourceCommand cmd = new AddResourceCommand(getContainer(), this);
cmd.setResource((Resource) obj);
addCommand(cmd);
}
}
/*
* Orders
*/
removed = this.objectFilter.getRemoved(Tags.ORDER);
if (!removed.isEmpty()) {
for (Object obj : removed) {
RemoveOrderCommand cmd = new RemoveOrderCommand(getContainer(), this);
cmd.setOrder((Order) obj);
addCommand(cmd);
}
}
updated = this.objectFilter.getUpdated(Tags.ORDER);
if (!updated.isEmpty()) {
for (Object obj : updated) {
UpdateOrderCommand cmd = new UpdateOrderCommand(getContainer(), this);
cmd.setOrder((Order) obj);
addCommand(cmd);
}
}
added = this.objectFilter.getAdded(Tags.ORDER);
if (!added.isEmpty()) {
for (Object obj : added) {
AddOrderCommand cmd = new AddOrderCommand(getContainer(), this);
cmd.setOrder((Order) obj);
addCommand(cmd);
}
}
/*
* Activities
*/
removed = this.objectFilter.getRemoved(Tags.ACTIVITY);
if (!removed.isEmpty()) {
for (Object obj : removed) {
RemoveActivityCommand cmd = new RemoveActivityCommand(getContainer(), this);
cmd.setActivity((Activity) obj);
addCommand(cmd);
}
}
updated = this.objectFilter.getUpdated(Tags.ACTIVITY);
if (!updated.isEmpty()) {
for (Object obj : updated) {
UpdateActivityCommand cmd = new UpdateActivityCommand(getContainer(), this);
cmd.setActivity((Activity) obj);
addCommand(cmd);
}
}
added = this.objectFilter.getAdded(Tags.ACTIVITY);
if (!added.isEmpty()) {
for (Object obj : added) {
AddActivityCommand cmd = new AddActivityCommand(getContainer(), this);
cmd.setActivity((Activity) obj);
addCommand(cmd);
}
}
}
@Override
public void flush() {
try {
addModelChangeCommands();
validateCommands();
doCommands();
writeChanges();
@ -656,6 +837,7 @@ public abstract class AbstractTransaction implements StrolchTransaction {
try {
this.txResult.setState(TransactionState.COMMITTING);
addModelChangeCommands();
validateCommands();
doCommands();
writeChanges();

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.command;
package li.strolch.persistence.api;
import java.text.MessageFormat;
@ -21,7 +21,6 @@ import li.strolch.agent.api.ActivityMap;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.exception.StrolchException;
import li.strolch.model.activity.Activity;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;
import li.strolch.utils.dbc.DBC;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.command;
package li.strolch.persistence.api;
import java.text.MessageFormat;
@ -21,7 +21,6 @@ import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.OrderMap;
import li.strolch.exception.StrolchException;
import li.strolch.model.Order;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;
import li.strolch.utils.dbc.DBC;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.command;
package li.strolch.persistence.api;
import java.text.MessageFormat;
@ -21,7 +21,6 @@ import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.ResourceMap;
import li.strolch.exception.StrolchException;
import li.strolch.model.Resource;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;
import li.strolch.utils.dbc.DBC;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.command;
package li.strolch.persistence.api;
import java.text.MessageFormat;
@ -21,7 +21,6 @@ import li.strolch.agent.api.ActivityMap;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.exception.StrolchException;
import li.strolch.model.activity.Activity;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;
import li.strolch.utils.dbc.DBC;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.command;
package li.strolch.persistence.api;
import java.text.MessageFormat;
@ -21,7 +21,6 @@ import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.OrderMap;
import li.strolch.exception.StrolchException;
import li.strolch.model.Order;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;
import li.strolch.utils.dbc.DBC;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.command;
package li.strolch.persistence.api;
import java.text.MessageFormat;
@ -21,7 +21,6 @@ import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.ResourceMap;
import li.strolch.exception.StrolchException;
import li.strolch.model.Resource;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;
import li.strolch.utils.dbc.DBC;

View File

@ -19,6 +19,7 @@ import java.util.List;
import li.strolch.agent.api.ActivityMap;
import li.strolch.agent.api.AuditTrail;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.OrderMap;
import li.strolch.agent.api.ResourceMap;
import li.strolch.agent.api.StrolchComponent;
@ -26,6 +27,7 @@ import li.strolch.agent.api.StrolchLockException;
import li.strolch.agent.api.StrolchRealm;
import li.strolch.agent.impl.DataStoreMode;
import li.strolch.exception.StrolchException;
import li.strolch.exception.StrolchModelException;
import li.strolch.model.Locator;
import li.strolch.model.Order;
import li.strolch.model.ParameterBag;
@ -143,6 +145,13 @@ public interface StrolchTransaction extends AutoCloseable {
*/
public PersistenceHandler getPersistenceHandler();
/**
* Return the {@link ComponentContainer}
*
* @return the reference to the container
*/
public ComponentContainer getContainer();
/**
* Returns the currently set {@link TransactionCloseStrategy}
*
@ -948,4 +957,103 @@ public interface StrolchTransaction extends AutoCloseable {
* if the {@link StringListParameter} is not a properly configured as a reference parameter
*/
public List<Order> getOrdersBy(StringListParameter refP, boolean assertExists) throws StrolchException;
/**
* Adds and thus persists the given {@link Resource} by calling the relevant {@link Command}
*
* @param resource
* the resource to add
*
* @throws StrolchModelException
* if the resource is null, or a resource with the given ID already exists
*/
public void addResource(Resource resource) throws StrolchModelException;
/**
* Adds and thus persists the given {@link Order} by calling the relevant {@link Command}
*
* @param order
* the order to add
*
* @throws StrolchModelException
* if the order is null, or an order with the given ID already exists
*/
public void addOrder(Order order) throws StrolchException;
/**
* Adds and thus persists the given {@link Activity} by calling the relevant {@link Command}
*
* @param activity
* the activity to add
*
* @throws StrolchModelException
* if the activity is null, or an activity with the given ID already exists
*/
public void addActivity(Activity activity) throws StrolchException;
/**
* Updates the given {@link Resource} by calling the relevant {@link Command}
*
* @param resource
* the resource to update
*
* @throws StrolchModelException
* if the resource is null
*/
public void updateResource(Resource resource) throws StrolchException;
/**
* Updates the given {@link Order} by calling the relevant {@link Command}
*
* @param order
* the order to update
*
* @throws StrolchModelException
* if the order is null
*/
public void updateOrder(Order order);
/**
* Updates the given {@link Activity} by calling the relevant {@link Command}
*
* @param activity
* the activity to update
*
* @throws StrolchModelException
* if the activity is null
*/
public void updateActivity(Activity activity) throws StrolchException;
/**
* Removes the given {@link Resource} by calling the relevant {@link Command}
*
* @param resource
* the resource to remove
*
* @throws StrolchModelException
* if the resource is null
*/
public void removeResource(Resource resource) throws StrolchException;
/**
* Removes the given {@link Order} by calling the relevant {@link Command}
*
* @param order
* the order to remove
*
* @throws StrolchModelException
* if the order is null
*/
public void removeOrder(Order order) throws StrolchException;
/**
* Removes the given {@link Activity} by calling the relevant {@link Command}
*
* @param activity
* the activity to remove
*
* @throws StrolchModelException
* if the activity is null
*/
public void removeActivity(Activity activity) throws StrolchException;
}

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.command;
package li.strolch.persistence.api;
import java.text.MessageFormat;
@ -21,7 +21,6 @@ import li.strolch.agent.api.ActivityMap;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.exception.StrolchException;
import li.strolch.model.activity.Activity;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;
import li.strolch.utils.dbc.DBC;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.command;
package li.strolch.persistence.api;
import java.text.MessageFormat;
@ -21,7 +21,6 @@ import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.OrderMap;
import li.strolch.exception.StrolchException;
import li.strolch.model.Order;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;
import li.strolch.utils.dbc.DBC;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.strolch.command;
package li.strolch.persistence.api;
import java.text.MessageFormat;
@ -21,7 +21,6 @@ import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.ResourceMap;
import li.strolch.exception.StrolchException;
import li.strolch.model.Resource;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;
import li.strolch.utils.dbc.DBC;

View File

@ -18,8 +18,8 @@ package li.strolch.persistence.inmemory;
import java.util.HashMap;
import java.util.Map;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.StrolchRealm;
import li.strolch.handler.operationslog.OperationsLog;
import li.strolch.persistence.api.ActivityDao;
import li.strolch.persistence.api.AuditDao;
import li.strolch.persistence.api.OrderDao;
@ -27,26 +27,22 @@ import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.ResourceDao;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.privilege.model.Certificate;
import li.strolch.runtime.privilege.PrivilegeHandler;
public class InMemoryPersistence implements PersistenceHandler {
private boolean versioningEnabled;
private Map<String, DaoCache> daoCache;
private PrivilegeHandler privilegeHandler;
private OperationsLog operationsLog;
private ComponentContainer container;
public InMemoryPersistence(OperationsLog operationsLog, PrivilegeHandler privilegeHandler,
boolean versioningEnabled) {
this.operationsLog = operationsLog;
this.privilegeHandler = privilegeHandler;
public InMemoryPersistence(ComponentContainer container, boolean versioningEnabled) {
this.container = container;
this.versioningEnabled = versioningEnabled;
this.daoCache = new HashMap<>();
}
@Override
public StrolchTransaction openTx(StrolchRealm realm, Certificate certificate, String action) {
return new InMemoryTransaction(this.operationsLog, this.privilegeHandler, realm, certificate, action, this);
return new InMemoryTransaction(this.container, realm, certificate, action, this);
}
@Override

View File

@ -15,21 +15,20 @@
*/
package li.strolch.persistence.inmemory;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.StrolchRealm;
import li.strolch.handler.operationslog.OperationsLog;
import li.strolch.persistence.api.AbstractTransaction;
import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.TransactionState;
import li.strolch.privilege.model.Certificate;
import li.strolch.runtime.privilege.PrivilegeHandler;
public class InMemoryTransaction extends AbstractTransaction {
private InMemoryPersistence persistenceHandler;
public InMemoryTransaction(OperationsLog operationsLog, PrivilegeHandler privilegeHandler, StrolchRealm realm,
Certificate certificate, String action, InMemoryPersistence persistenceHandler) {
super(operationsLog, privilegeHandler, realm, certificate, action);
public InMemoryTransaction(ComponentContainer container, StrolchRealm realm, Certificate certificate, String action,
InMemoryPersistence persistenceHandler) {
super(container, realm, certificate, action);
this.persistenceHandler = persistenceHandler;
}

View File

@ -45,7 +45,7 @@ public class InMemoryPersistenceHandler extends StrolchComponent implements Pers
@Override
public void initialize(ComponentConfiguration configuration) throws Exception {
this.persistence = new InMemoryPersistence(null, getContainer().getPrivilegeHandler(), false);
this.persistence = new InMemoryPersistence(getContainer(), false);
super.initialize(configuration);
}

View File

@ -18,10 +18,10 @@ package li.strolch.performance;
import java.util.concurrent.TimeUnit;
import li.strolch.agent.api.StrolchAgent;
import li.strolch.command.AddResourceCommand;
import li.strolch.command.RemoveResourceCommand;
import li.strolch.model.ModelGenerator;
import li.strolch.model.Resource;
import li.strolch.persistence.api.AddResourceCommand;
import li.strolch.persistence.api.RemoveResourceCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.AbstractService;
import li.strolch.service.api.ServiceResult;

View File

@ -35,7 +35,6 @@ import li.strolch.agent.api.StrolchComponent;
import li.strolch.agent.api.StrolchRealm;
import li.strolch.db.DbMigrationState;
import li.strolch.db.DbSchemaVersionCheck;
import li.strolch.handler.operationslog.OperationsLog;
import li.strolch.persistence.api.ActivityDao;
import li.strolch.persistence.api.AuditDao;
import li.strolch.persistence.api.OrderDao;
@ -131,10 +130,7 @@ public class PostgreSqlPersistenceHandler extends StrolchComponent implements Pe
@Override
public StrolchTransaction openTx(StrolchRealm realm, Certificate certificate, String action) {
OperationsLog operationsLog = getContainer().hasComponent(OperationsLog.class)
? getContainer().getComponent(OperationsLog.class) : null;
return new PostgreSqlStrolchTransaction(operationsLog, getContainer().getPrivilegeHandler(), realm, certificate,
action, this);
return new PostgreSqlStrolchTransaction(getContainer(), realm, certificate, action, this);
}
Connection getConnection(String realm) {

View File

@ -20,8 +20,8 @@ import java.sql.Connection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.StrolchRealm;
import li.strolch.handler.operationslog.OperationsLog;
import li.strolch.persistence.api.AbstractTransaction;
import li.strolch.persistence.api.ActivityDao;
import li.strolch.persistence.api.AuditDao;
@ -29,7 +29,6 @@ import li.strolch.persistence.api.OrderDao;
import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.ResourceDao;
import li.strolch.privilege.model.Certificate;
import li.strolch.runtime.privilege.PrivilegeHandler;
public class PostgreSqlStrolchTransaction extends AbstractTransaction {
@ -42,10 +41,10 @@ public class PostgreSqlStrolchTransaction extends AbstractTransaction {
private AuditDao auditDao;
private Connection connection;
public PostgreSqlStrolchTransaction(OperationsLog operationsLog, PrivilegeHandler privilegeHandler,
public PostgreSqlStrolchTransaction(ComponentContainer container,
StrolchRealm realm, Certificate certificate, String action,
PostgreSqlPersistenceHandler persistenceHandler) {
super(operationsLog, privilegeHandler, realm, certificate, action);
super(container, realm, certificate, action);
this.persistenceHandler = persistenceHandler;
}

View File

@ -6,8 +6,6 @@ import java.util.Iterator;
import java.util.Map.Entry;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.command.UpdateActivityCommand;
import li.strolch.command.UpdateOrderCommand;
import li.strolch.exception.StrolchException;
import li.strolch.execution.policy.ConfirmationPolicy;
import li.strolch.execution.policy.ExecutionPolicy;
@ -21,6 +19,8 @@ import li.strolch.model.activity.TimeOrderingVisitor;
import li.strolch.model.policy.PolicyDef;
import li.strolch.model.visitor.IActivityElementVisitor;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.UpdateActivityCommand;
import li.strolch.persistence.api.UpdateOrderCommand;
import li.strolch.policy.PolicyHandler;
import li.strolch.service.api.Command;
import li.strolch.utils.helper.StringHelper;

View File

@ -2,7 +2,6 @@ package li.strolch.execution.policy;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.StrolchRealm;
import li.strolch.command.UpdateActivityCommand;
import li.strolch.exception.StrolchException;
import li.strolch.execution.DelayedExecutionTimer;
import li.strolch.execution.ExecutionHandler;
@ -10,6 +9,7 @@ import li.strolch.model.State;
import li.strolch.model.activity.Action;
import li.strolch.model.activity.Activity;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.UpdateActivityCommand;
import li.strolch.policy.StrolchPolicy;
import li.strolch.privilege.base.PrivilegeException;
import li.strolch.privilege.model.Certificate;

View File

@ -1,8 +1,8 @@
package li.strolch.execution.policy;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.command.RemoveActivityCommand;
import li.strolch.model.activity.Activity;
import li.strolch.persistence.api.RemoveActivityCommand;
import li.strolch.persistence.api.StrolchTransaction;
public class RemoveActivityArchival extends ActivityArchivalPolicy {

View File

@ -1,7 +1,6 @@
package li.strolch.execution.policy;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.command.UpdateResourceCommand;
import li.strolch.exception.StrolchModelException;
import li.strolch.model.Locator;
import li.strolch.model.Resource;
@ -9,6 +8,7 @@ import li.strolch.model.State;
import li.strolch.model.activity.Action;
import li.strolch.model.parameter.BooleanParameter;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.UpdateResourceCommand;
/**
* <p>

View File

@ -18,11 +18,11 @@ package li.strolch.migrations;
import java.io.File;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.command.AddResourceCommand;
import li.strolch.command.parameter.SetParameterCommand;
import li.strolch.model.ParameterBag;
import li.strolch.model.Resource;
import li.strolch.model.parameter.StringParameter;
import li.strolch.persistence.api.AddResourceCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.privilege.model.Certificate;
import li.strolch.utils.Version;

View File

@ -15,8 +15,8 @@
*/
package li.strolch.service;
import li.strolch.command.AddActivityCommand;
import li.strolch.model.activity.Activity;
import li.strolch.persistence.api.AddActivityCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.AddActivityService.AddActivityArg;
import li.strolch.service.api.AbstractService;

View File

@ -15,10 +15,10 @@
*/
package li.strolch.service;
import li.strolch.command.AddResourceCommand;
import li.strolch.command.UpdateResourceCommand;
import li.strolch.model.Resource;
import li.strolch.persistence.api.AddResourceCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.UpdateResourceCommand;
import li.strolch.service.AddOrUpdateResourceService.AddOrUpdateResourceArg;
import li.strolch.service.api.AbstractService;
import li.strolch.service.api.ServiceArgument;

View File

@ -15,8 +15,8 @@
*/
package li.strolch.service;
import li.strolch.command.AddOrderCommand;
import li.strolch.model.Order;
import li.strolch.persistence.api.AddOrderCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.AddOrderService.AddOrderArg;
import li.strolch.service.api.AbstractService;

View File

@ -15,8 +15,8 @@
*/
package li.strolch.service;
import li.strolch.command.AddResourceCommand;
import li.strolch.model.Resource;
import li.strolch.persistence.api.AddResourceCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.AddResourceService.AddResourceArg;
import li.strolch.service.api.AbstractService;

View File

@ -15,8 +15,8 @@
*/
package li.strolch.service;
import li.strolch.command.RemoveActivityCommand;
import li.strolch.model.activity.Activity;
import li.strolch.persistence.api.RemoveActivityCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.AbstractService;
import li.strolch.service.api.ServiceResult;

View File

@ -15,8 +15,8 @@
*/
package li.strolch.service;
import li.strolch.command.RemoveOrderCommand;
import li.strolch.model.Order;
import li.strolch.persistence.api.RemoveOrderCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.AbstractService;
import li.strolch.service.api.ServiceResult;

View File

@ -15,8 +15,8 @@
*/
package li.strolch.service;
import li.strolch.command.RemoveResourceCommand;
import li.strolch.model.Resource;
import li.strolch.persistence.api.RemoveResourceCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.AbstractService;
import li.strolch.service.api.ServiceResult;

View File

@ -15,9 +15,9 @@
*/
package li.strolch.service;
import li.strolch.command.UpdateActivityCommand;
import li.strolch.model.activity.Activity;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.UpdateActivityCommand;
import li.strolch.service.UpdateActivityService.UpdateActivityArg;
import li.strolch.service.api.AbstractService;
import li.strolch.service.api.ServiceArgument;

View File

@ -15,9 +15,9 @@
*/
package li.strolch.service;
import li.strolch.command.UpdateOrderCommand;
import li.strolch.model.Order;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.UpdateOrderCommand;
import li.strolch.service.UpdateOrderService.UpdateOrderArg;
import li.strolch.service.api.AbstractService;
import li.strolch.service.api.ServiceArgument;

View File

@ -15,9 +15,9 @@
*/
package li.strolch.service;
import li.strolch.command.UpdateResourceCommand;
import li.strolch.model.Resource;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.UpdateResourceCommand;
import li.strolch.service.UpdateResourceService.UpdateResourceArg;
import li.strolch.service.api.AbstractService;
import li.strolch.service.api.ServiceArgument;

View File

@ -23,6 +23,7 @@ import org.junit.Before;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.model.ModelGenerator;
import li.strolch.model.Order;
import li.strolch.persistence.api.AddOrderCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;

View File

@ -23,6 +23,7 @@ import org.junit.Before;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.model.ModelGenerator;
import li.strolch.model.Resource;
import li.strolch.persistence.api.AddResourceCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;

View File

@ -0,0 +1,351 @@
package li.strolch.command;
import static li.strolch.service.test.AbstractRealmServiceTest.CONFIG_SRC;
import static li.strolch.service.test.AbstractRealmServiceTest.REALM_CACHED;
import static li.strolch.service.test.AbstractRealmServiceTest.REALM_TRANSIENT;
import static li.strolch.service.test.AbstractRealmServiceTest.dropSchema;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.BeforeClass;
import org.junit.Test;
import li.strolch.model.ModelGenerator;
import li.strolch.model.Order;
import li.strolch.model.Resource;
import li.strolch.model.activity.Activity;
import li.strolch.model.activity.TimeOrdering;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.privilege.model.Certificate;
import li.strolch.testbase.runtime.RuntimeMock;
public class InMemoryTransactionTest {
private static final String TARGET_RUNTIME = "target/InMemoryTransactionTest/";
private static RuntimeMock runtimeMock;
private static Certificate certificate;
@BeforeClass
public static void beforeClass() throws Exception {
dropSchema("jdbc:postgresql://localhost/cacheduserdb", "cacheduser", "test");
dropSchema("jdbc:postgresql://localhost/transactionaluserdb", "transactionaluser", "test");
runtimeMock = new RuntimeMock().mockRuntime(TARGET_RUNTIME, CONFIG_SRC);
runtimeMock.startContainer();
certificate = runtimeMock.getPrivilegeHandler().authenticate("test", "test".toCharArray());
}
protected StrolchTransaction openTx(String realmName) {
return runtimeMock.getAgent().getContainer().getRealm(realmName).openTx(certificate, "test");
}
@Test
public void runTransient() {
shouldRunAll(REALM_TRANSIENT);
}
@Test
public void runCached() {
shouldRunAll(REALM_CACHED);
}
private void shouldRunAll(String realmName) {
shouldCrudResource(realmName);
shouldCrudResource1(realmName);
shouldCrudResource2(realmName);
shouldCrudOrder(realmName);
shouldCrudOrder1(realmName);
shouldCrudOrder2(realmName);
shouldCrudActivity(realmName);
shouldCrudActivity1(realmName);
shouldCrudActivity2(realmName);
}
public void shouldCrudResource(String realmName) {
String id = "@200";
String type = "Bike";
// create
Resource newRes = ModelGenerator.createResource(id, "200", type);
try (StrolchTransaction tx = openTx(realmName)) {
tx.addResource(newRes);
tx.commitOnClose();
}
// should exist
try (StrolchTransaction tx = openTx(realmName)) {
assertTrue("Resource should exist!", tx.getResourceMap().hasElement(tx, type, id));
}
// update
try (StrolchTransaction tx = openTx(realmName)) {
Resource res = tx.getResourceBy(type, id);
res.setName("Foo foo");
tx.updateResource(res);
tx.commitOnClose();
}
// verify
try (StrolchTransaction tx = openTx(realmName)) {
Resource res = tx.getResourceBy(type, id);
assertEquals("Foo foo", res.getName());
}
// remove
try (StrolchTransaction tx = openTx(realmName)) {
Resource res = tx.getResourceBy(type, id);
tx.removeResource(res);
tx.commitOnClose();
}
// should not exist
try (StrolchTransaction tx = openTx(realmName)) {
assertFalse("Resource should not exist!", tx.getResourceMap().hasElement(tx, type, id));
}
// create again
newRes = ModelGenerator.createResource(id, "200", type);
try (StrolchTransaction tx = openTx(realmName)) {
tx.addResource(newRes);
tx.commitOnClose();
}
// should exist
try (StrolchTransaction tx = openTx(realmName)) {
assertTrue("Resource should exist!", tx.getResourceMap().hasElement(tx, type, id));
}
}
public void shouldCrudOrder(String realmName) {
String id = "@200";
String type = "Bike";
// create
Order newOrder = ModelGenerator.createOrder(id, "200", type);
try (StrolchTransaction tx = openTx(realmName)) {
tx.addOrder(newOrder);
tx.commitOnClose();
}
// should exist
try (StrolchTransaction tx = openTx(realmName)) {
assertTrue("Order should exist!", tx.getOrderMap().hasElement(tx, type, id));
}
// update
try (StrolchTransaction tx = openTx(realmName)) {
Order order = tx.getOrderBy(type, id);
order.setName("Foo foo");
tx.updateOrder(order);
tx.commitOnClose();
}
// verify
try (StrolchTransaction tx = openTx(realmName)) {
Order order = tx.getOrderBy(type, id);
assertEquals("Foo foo", order.getName());
}
// remove
try (StrolchTransaction tx = openTx(realmName)) {
Order order = tx.getOrderBy(type, id);
tx.removeOrder(order);
tx.commitOnClose();
}
// should not exist
try (StrolchTransaction tx = openTx(realmName)) {
assertFalse("Order should not exist!", tx.getOrderMap().hasElement(tx, type, id));
}
// create again
newOrder = ModelGenerator.createOrder(id, "200", type);
try (StrolchTransaction tx = openTx(realmName)) {
tx.addOrder(newOrder);
tx.commitOnClose();
}
// should exist
try (StrolchTransaction tx = openTx(realmName)) {
assertTrue("Order should exist!", tx.getOrderMap().hasElement(tx, type, id));
}
}
public void shouldCrudActivity(String realmName) {
String id = "@200";
String type = "Bike";
// create
Activity newActivity = ModelGenerator.createActivity(id, "200", type, TimeOrdering.SERIES);
try (StrolchTransaction tx = openTx(realmName)) {
tx.addActivity(newActivity);
tx.commitOnClose();
}
// should exist
try (StrolchTransaction tx = openTx(realmName)) {
assertTrue("Activity should exist!", tx.getActivityMap().hasElement(tx, type, id));
}
// update
try (StrolchTransaction tx = openTx(realmName)) {
Activity activity = tx.getActivityBy(type, id);
activity.setName("Foo foo");
tx.updateActivity(activity);
tx.commitOnClose();
}
// verify
try (StrolchTransaction tx = openTx(realmName)) {
Activity activity = tx.getActivityBy(type, id);
assertEquals("Foo foo", activity.getName());
}
// remove
try (StrolchTransaction tx = openTx(realmName)) {
Activity activity = tx.getActivityBy(type, id);
tx.removeActivity(activity);
tx.commitOnClose();
}
// should not exist
try (StrolchTransaction tx = openTx(realmName)) {
assertFalse("Activity should not exist!", tx.getActivityMap().hasElement(tx, type, id));
}
// create again
newActivity = ModelGenerator.createActivity(id, "200", type, TimeOrdering.SERIES);
try (StrolchTransaction tx = openTx(realmName)) {
tx.addActivity(newActivity);
tx.commitOnClose();
}
// should exist
try (StrolchTransaction tx = openTx(realmName)) {
assertTrue("Activity should exist!", tx.getActivityMap().hasElement(tx, type, id));
}
}
public void shouldCrudResource1(String realmName) {
String id = "@201";
String type = "Bike";
// create and update
Resource newRes = ModelGenerator.createResource(id, "200", type);
try (StrolchTransaction tx = openTx(realmName)) {
tx.addResource(newRes);
newRes.setName("Foo foo!");
tx.updateResource(newRes);
tx.commitOnClose();
}
// should exist
try (StrolchTransaction tx = openTx(realmName)) {
assertTrue("Resource should exist!", tx.getResourceMap().hasElement(tx, type, id));
}
}
public void shouldCrudResource2(String realmName) {
String id = "@202";
String type = "Bike";
// create and update
Resource newRes = ModelGenerator.createResource(id, "200", type);
try (StrolchTransaction tx = openTx(realmName)) {
tx.addResource(newRes);
newRes.setName("Foo foo!");
tx.updateResource(newRes);
tx.removeResource(newRes);
tx.commitOnClose();
}
// should not exist
try (StrolchTransaction tx = openTx(realmName)) {
assertFalse("Resource should not exist!", tx.getResourceMap().hasElement(tx, type, id));
}
}
public void shouldCrudOrder1(String realmName) {
String id = "@201";
String type = "Bike";
// create and update
Order newOrder = ModelGenerator.createOrder(id, "200", type);
try (StrolchTransaction tx = openTx(realmName)) {
tx.addOrder(newOrder);
newOrder.setName("Foo foo!");
tx.updateOrder(newOrder);
tx.commitOnClose();
}
// should exist
try (StrolchTransaction tx = openTx(realmName)) {
assertTrue("Order should exist!", tx.getOrderMap().hasElement(tx, type, id));
}
}
public void shouldCrudOrder2(String realmName) {
String id = "@202";
String type = "Bike";
// create and update
Order newOrder = ModelGenerator.createOrder(id, "200", type);
try (StrolchTransaction tx = openTx(realmName)) {
tx.addOrder(newOrder);
newOrder.setName("Foo foo!");
tx.updateOrder(newOrder);
tx.removeOrder(newOrder);
tx.commitOnClose();
}
// should not exist
try (StrolchTransaction tx = openTx(realmName)) {
assertFalse("Order should not exist!", tx.getOrderMap().hasElement(tx, type, id));
}
}
public void shouldCrudActivity1(String realmName) {
String id = "@201";
String type = "Bike";
// create and update
Activity newActivity = ModelGenerator.createActivity(id, "200", type, TimeOrdering.SERIES);
try (StrolchTransaction tx = openTx(realmName)) {
tx.addActivity(newActivity);
newActivity.setName("Foo foo!");
tx.updateActivity(newActivity);
tx.commitOnClose();
}
// should exist
try (StrolchTransaction tx = openTx(realmName)) {
assertTrue("Activity should exist!", tx.getActivityMap().hasElement(tx, type, id));
}
}
public void shouldCrudActivity2(String realmName) {
String id = "@202";
String type = "Bike";
// create and update
Activity newActivity = ModelGenerator.createActivity(id, "200", type, TimeOrdering.SERIES);
try (StrolchTransaction tx = openTx(realmName)) {
tx.addActivity(newActivity);
newActivity.setName("Foo foo!");
tx.updateActivity(newActivity);
tx.removeActivity(newActivity);
tx.commitOnClose();
}
// should not exist
try (StrolchTransaction tx = openTx(realmName)) {
assertFalse("Activity should not exist!", tx.getActivityMap().hasElement(tx, type, id));
}
}
}

View File

@ -24,6 +24,7 @@ import li.strolch.agent.api.ComponentContainer;
import li.strolch.model.Locator;
import li.strolch.model.Order;
import li.strolch.model.Tags;
import li.strolch.persistence.api.RemoveOrderCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;

View File

@ -24,6 +24,7 @@ import li.strolch.agent.api.ComponentContainer;
import li.strolch.model.Locator;
import li.strolch.model.Resource;
import li.strolch.model.Tags;
import li.strolch.persistence.api.RemoveResourceCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.Command;

View File

@ -19,6 +19,7 @@ import li.strolch.agent.api.ComponentContainer;
import li.strolch.model.ModelGenerator;
import li.strolch.model.Order;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.UpdateOrderCommand;
import li.strolch.service.api.Command;
import static org.junit.Assert.assertEquals;

View File

@ -23,6 +23,7 @@ import li.strolch.agent.api.ComponentContainer;
import li.strolch.model.ModelGenerator;
import li.strolch.model.Resource;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.UpdateResourceCommand;
import li.strolch.service.api.Command;
/**

View File

@ -24,10 +24,10 @@ import java.util.List;
import java.util.Map;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.command.AddOrderCommand;
import li.strolch.command.RemoveOrderCommand;
import li.strolch.model.ModelGenerator;
import li.strolch.model.Order;
import li.strolch.persistence.api.AddOrderCommand;
import li.strolch.persistence.api.RemoveOrderCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.privilege.model.Certificate;
import li.strolch.runtime.StrolchConstants;

View File

@ -17,12 +17,12 @@ package li.strolch.service;
import org.junit.Test;
import li.strolch.command.AddResourceCommand;
import li.strolch.command.RemoveResourceCommand;
import li.strolch.command.UpdateResourceCommand;
import li.strolch.model.ModelGenerator;
import li.strolch.model.Resource;
import li.strolch.persistence.api.AddResourceCommand;
import li.strolch.persistence.api.RemoveResourceCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.UpdateResourceCommand;
import li.strolch.service.api.AbstractService;
import li.strolch.service.api.ServiceArgument;
import li.strolch.service.api.ServiceResult;

View File

@ -21,10 +21,10 @@ import static org.junit.Assert.assertTrue;
import org.junit.Ignore;
import org.junit.Test;
import li.strolch.command.AddResourceCommand;
import li.strolch.model.ModelGenerator;
import li.strolch.model.Order;
import li.strolch.model.Resource;
import li.strolch.persistence.api.AddResourceCommand;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.service.api.AbstractService;
import li.strolch.service.api.ServiceArgument;