[Major] Moved the auditing trail to the ElementMaps themselves

This means that we can't access the ElementMaps from the Realms, but
must use the TX (this was better anyhow)
This commit is contained in:
Robert von Burg 2014-08-24 12:45:08 +02:00
parent 3c05496ceb
commit 926eab8eed
19 changed files with 1065 additions and 191 deletions

View File

@ -15,84 +15,29 @@
*/
package li.strolch.agent.api;
import static ch.eitchnet.utils.helper.StringHelper.DOT;
import java.text.MessageFormat;
import java.util.concurrent.TimeUnit;
import li.strolch.agent.impl.DataStoreMode;
import li.strolch.agent.impl.DefaultLockHandler;
import li.strolch.model.StrolchRootElement;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.StrolchConstants;
import li.strolch.runtime.configuration.ComponentConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.eitchnet.privilege.model.Certificate;
import ch.eitchnet.privilege.model.PrivilegeContext;
import ch.eitchnet.utils.dbc.DBC;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public abstract class StrolchRealm {
public interface StrolchRealm {
public static final String PROP_TRY_LOCK_TIME_UNIT = "tryLockTimeUnit"; //$NON-NLS-1$
public static final String PROP_TRY_LOCK_TIME = "tryLockTime"; //$NON-NLS-1$
protected static final Logger logger = LoggerFactory.getLogger(StrolchRealm.class);
private String realm;
private LockHandler lockHandler;
public String getRealm();
public StrolchRealm(String realm) {
DBC.PRE.assertNotEmpty("RealmName may not be empty!", realm); //$NON-NLS-1$
this.realm = realm;
}
public void lock(StrolchRootElement element);
public String getRealm() {
return this.realm;
}
public void unlock(StrolchRootElement lockedElement);
public void lock(StrolchRootElement element) {
DBC.PRE.assertNotNull("Can not lock a null pointer =)", element); //$NON-NLS-1$
this.lockHandler.lock(element);
}
public DataStoreMode getMode();
public void unlock(StrolchRootElement lockedElement) {
this.lockHandler.unlock(lockedElement);
}
public StrolchTransaction openTx(Certificate certificate, Class<?> clazz);
public void initialize(ComponentContainer container, ComponentConfiguration configuration) {
public StrolchTransaction openTx(Certificate certificate, String action);
String propTryLockTimeUnit = PROP_TRY_LOCK_TIME_UNIT;
String propTryLockTime = PROP_TRY_LOCK_TIME;
if (!StrolchConstants.DEFAULT_REALM.equals(this.realm)) {
propTryLockTimeUnit += DOT + this.realm;
propTryLockTime += DOT + this.realm;
}
public boolean isAuditTrailEnabledForRead();
TimeUnit timeUnit = TimeUnit.valueOf(configuration.getString(propTryLockTimeUnit, TimeUnit.SECONDS.name()));
long time = configuration.getLong(propTryLockTime, 10);
logger.info(MessageFormat.format("Using a locking try timeout of {0}s", timeUnit.toSeconds(time))); //$NON-NLS-1$
this.lockHandler = new DefaultLockHandler(this.realm, timeUnit, time);
}
public abstract DataStoreMode getMode();
public abstract void start(PrivilegeContext privilegeContext);
public abstract void stop();
public abstract void destroy();
public abstract StrolchTransaction openTx(Certificate certificate, Class<?> clazz);
public abstract StrolchTransaction openTx(Certificate certificate, String action);
public abstract ResourceMap getResourceMap();
public abstract OrderMap getOrderMap();
public abstract AuditTrail getAuditTrail();
public boolean isAuditTrailEnabled();
}

View File

@ -0,0 +1,288 @@
/*
* Copyright (c) 2012, Robert von Burg
*
* All rights reserved.
*
* This file is part of the XXX.
*
* XXX is free software: you can redistribute
* it and/or modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* XXX is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XXX. If not, see
* <http://www.gnu.org/licenses/>.
*/
package li.strolch.agent.impl;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import li.strolch.agent.api.AuditTrail;
import li.strolch.model.audit.Audit;
import li.strolch.persistence.api.StrolchTransaction;
import ch.eitchnet.utils.collections.DateRange;
import ch.eitchnet.utils.dbc.DBC;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class AuditingAuditMapFacade implements AuditTrail {
private AuditTrail auditTrail;
private Set<Audit> read;
private Set<Audit> created;
private Set<Audit> updated;
private Set<Audit> deleted;
private long deletedAll;
private Map<String, Long> deletedAllByType;
private boolean observeAccessReads;
public AuditingAuditMapFacade(AuditTrail auditTrail, boolean observeAccessReads) {
DBC.PRE.assertNotNull("auditTrail must be set!", auditTrail); //$NON-NLS-1$
this.auditTrail = auditTrail;
this.observeAccessReads = observeAccessReads;
this.created = new HashSet<>();
this.read = new HashSet<>();
this.updated = new HashSet<>();
this.deleted = new HashSet<>();
this.deletedAllByType = new HashMap<>();
}
/**
* @return the read
*/
public Set<Audit> getRead() {
return this.read;
}
/**
* @return the created
*/
public Set<Audit> getCreated() {
return this.created;
}
/**
* @return the updated
*/
public Set<Audit> getUpdated() {
return this.updated;
}
/**
* @return the deleted
*/
public Set<Audit> getDeleted() {
return this.deleted;
}
/**
* @return the deletedAll
*/
public long getDeletedAll() {
return this.deletedAll;
}
/**
* @return the deletedAllByType
*/
public Map<String, Long> getDeletedAllByType() {
return this.deletedAllByType;
}
/**
* @return
* @see li.strolch.agent.api.AuditTrail#isEnabled()
*/
@Override
public boolean isEnabled() {
return this.auditTrail.isEnabled();
}
/**
* @param tx
* @param type
* @param id
* @return
* @see li.strolch.agent.api.AuditTrail#hasAudit(li.strolch.persistence.api.StrolchTransaction, java.lang.String,
* java.lang.Long)
*/
@Override
public boolean hasAudit(StrolchTransaction tx, String type, Long id) {
return this.auditTrail.hasAudit(tx, type, id);
}
/**
* @param tx
* @param dateRange
* @return
* @see li.strolch.agent.api.AuditTrail#querySize(li.strolch.persistence.api.StrolchTransaction,
* ch.eitchnet.utils.collections.DateRange)
*/
@Override
public long querySize(StrolchTransaction tx, DateRange dateRange) {
return this.auditTrail.querySize(tx, dateRange);
}
/**
* @param tx
* @param type
* @param dateRange
* @return
* @see li.strolch.agent.api.AuditTrail#querySize(li.strolch.persistence.api.StrolchTransaction, java.lang.String,
* ch.eitchnet.utils.collections.DateRange)
*/
@Override
public long querySize(StrolchTransaction tx, String type, DateRange dateRange) {
return this.auditTrail.querySize(tx, type, dateRange);
}
/**
* @param tx
* @return
* @see li.strolch.agent.api.AuditTrail#getTypes(li.strolch.persistence.api.StrolchTransaction)
*/
@Override
public Set<String> getTypes(StrolchTransaction tx) {
return this.auditTrail.getTypes(tx);
}
/**
* @param tx
* @param type
* @param id
* @return
* @see li.strolch.agent.api.AuditTrail#getBy(li.strolch.persistence.api.StrolchTransaction, java.lang.String,
* java.lang.Long)
*/
@Override
public Audit getBy(StrolchTransaction tx, String type, Long id) {
Audit audit = this.auditTrail.getBy(tx, type, id);
if (this.observeAccessReads)
this.read.add(audit);
return audit;
}
/**
* @param tx
* @param type
* @param dateRange
* @return
* @see li.strolch.agent.api.AuditTrail#getAllElements(li.strolch.persistence.api.StrolchTransaction,
* java.lang.String, ch.eitchnet.utils.collections.DateRange)
*/
@Override
public List<Audit> getAllElements(StrolchTransaction tx, String type, DateRange dateRange) {
List<Audit> elements = this.auditTrail.getAllElements(tx, type, dateRange);
if (this.observeAccessReads)
this.read.addAll(elements);
return elements;
}
/**
* @param tx
* @param audit
* @see li.strolch.agent.api.AuditTrail#add(li.strolch.persistence.api.StrolchTransaction,
* li.strolch.model.audit.Audit)
*/
@Override
public void add(StrolchTransaction tx, Audit audit) {
this.auditTrail.add(tx, audit);
this.created.add(audit);
}
/**
* @param tx
* @param audits
* @see li.strolch.agent.api.AuditTrail#addAll(li.strolch.persistence.api.StrolchTransaction, java.util.List)
*/
@Override
public void addAll(StrolchTransaction tx, List<Audit> audits) {
this.auditTrail.addAll(tx, audits);
this.created.addAll(audits);
}
/**
* @param tx
* @param audit
* @return
* @see li.strolch.agent.api.AuditTrail#update(li.strolch.persistence.api.StrolchTransaction,
* li.strolch.model.audit.Audit)
*/
@Override
public Audit update(StrolchTransaction tx, Audit audit) {
Audit replaced = this.auditTrail.update(tx, audit);
this.updated.add(audit);
return replaced;
}
/**
* @param tx
* @param audits
* @return
* @see li.strolch.agent.api.AuditTrail#updateAll(li.strolch.persistence.api.StrolchTransaction, java.util.List)
*/
@Override
public List<Audit> updateAll(StrolchTransaction tx, List<Audit> audits) {
List<Audit> replaced = this.auditTrail.updateAll(tx, audits);
this.updated.addAll(audits);
return replaced;
}
/**
* @param tx
* @param audit
* @see li.strolch.agent.api.AuditTrail#remove(li.strolch.persistence.api.StrolchTransaction,
* li.strolch.model.audit.Audit)
*/
@Override
public void remove(StrolchTransaction tx, Audit audit) {
this.auditTrail.remove(tx, audit);
this.deleted.add(audit);
}
/**
* @param tx
* @param audits
* @see li.strolch.agent.api.AuditTrail#removeAll(li.strolch.persistence.api.StrolchTransaction, java.util.List)
*/
@Override
public void removeAll(StrolchTransaction tx, List<Audit> audits) {
this.auditTrail.removeAll(tx, audits);
this.deleted.addAll(audits);
}
/**
* @param tx
* @param type
* @param dateRange
* @return
* @see li.strolch.agent.api.AuditTrail#removeAll(li.strolch.persistence.api.StrolchTransaction, java.lang.String,
* ch.eitchnet.utils.collections.DateRange)
*/
@Override
public long removeAll(StrolchTransaction tx, String type, DateRange dateRange) {
long removed = this.auditTrail.removeAll(tx, type, dateRange);
Long byType = this.deletedAllByType.get(type);
if (byType == null)
byType = 0L;
byType = byType + removed;
this.deletedAllByType.put(type, byType);
return removed;
}
}

View File

@ -0,0 +1,361 @@
/*
* Copyright (c) 2012, Robert von Burg
*
* All rights reserved.
*
* This file is part of the XXX.
*
* XXX is free software: you can redistribute
* it and/or modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* XXX is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XXX. If not, see
* <http://www.gnu.org/licenses/>.
*/
package li.strolch.agent.impl;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import li.strolch.agent.api.ElementMap;
import li.strolch.exception.StrolchException;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.parameter.StringParameter;
import li.strolch.persistence.api.StrolchTransaction;
import ch.eitchnet.utils.dbc.DBC;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class AuditingElementMapFacade<T extends StrolchRootElement> implements ElementMap<T> {
private ElementMap<T> elementMap;
private Set<T> read;
private Set<T> created;
private Set<T> updated;
private Set<T> deleted;
private long deletedAll;
private Map<String, Long> deletedAllByType;
private boolean observeAccessReads;
public AuditingElementMapFacade(ElementMap<T> elementMap, boolean observeAccessReads) {
DBC.PRE.assertNotNull("ElementMap must be set!", elementMap); //$NON-NLS-1$
this.elementMap = elementMap;
this.observeAccessReads = observeAccessReads;
this.created = new HashSet<>();
this.read = new HashSet<>();
this.updated = new HashSet<>();
this.deleted = new HashSet<>();
this.deletedAllByType = new HashMap<>();
}
/**
* @return the read
*/
public Set<T> getRead() {
return this.read;
}
/**
* @return the created
*/
public Set<T> getCreated() {
return this.created;
}
/**
* @return the updated
*/
public Set<T> getUpdated() {
return this.updated;
}
/**
* @return the deleted
*/
public Set<T> getDeleted() {
return this.deleted;
}
/**
* @return the deletedAll
*/
public long getDeletedAll() {
return this.deletedAll;
}
/**
* @return the deletedAllByType
*/
public Map<String, Long> getDeletedAllByType() {
return this.deletedAllByType;
}
/**
* @param tx
* @param type
* @return
* @see li.strolch.agent.api.ElementMap#hasType(li.strolch.persistence.api.StrolchTransaction, java.lang.String)
*/
@Override
public boolean hasType(StrolchTransaction tx, String type) {
return this.elementMap.hasType(tx, type);
}
/**
* @param tx
* @param type
* @param id
* @return
* @see li.strolch.agent.api.ElementMap#hasElement(li.strolch.persistence.api.StrolchTransaction, java.lang.String,
* java.lang.String)
*/
@Override
public boolean hasElement(StrolchTransaction tx, String type, String id) {
return this.elementMap.hasElement(tx, type, id);
}
/**
* @param tx
* @return
* @see li.strolch.agent.api.ElementMap#querySize(li.strolch.persistence.api.StrolchTransaction)
*/
@Override
public long querySize(StrolchTransaction tx) {
return this.elementMap.querySize(tx);
}
/**
* @param tx
* @param type
* @return
* @see li.strolch.agent.api.ElementMap#querySize(li.strolch.persistence.api.StrolchTransaction, java.lang.String)
*/
@Override
public long querySize(StrolchTransaction tx, String type) {
return this.elementMap.querySize(tx, type);
}
/**
* @param tx
* @param type
* @return
* @see li.strolch.agent.api.ElementMap#getTemplate(li.strolch.persistence.api.StrolchTransaction, java.lang.String)
*/
@Override
public T getTemplate(StrolchTransaction tx, String type) {
T template = this.elementMap.getTemplate(tx, type);
if (this.observeAccessReads)
this.read.add(template);
return template;
}
/**
* @param tx
* @param type
* @param id
* @return
* @see li.strolch.agent.api.ElementMap#getBy(li.strolch.persistence.api.StrolchTransaction, java.lang.String,
* java.lang.String)
*/
@Override
public T getBy(StrolchTransaction tx, String type, String id) {
T element = this.elementMap.getBy(tx, type, id);
if (this.observeAccessReads)
this.read.add(element);
return element;
}
/**
* @param tx
* @param refP
* @return
* @throws StrolchException
* @see li.strolch.agent.api.ElementMap#getBy(li.strolch.persistence.api.StrolchTransaction,
* li.strolch.model.parameter.StringParameter)
*/
@Override
public T getBy(StrolchTransaction tx, StringParameter refP) throws StrolchException {
T element = this.elementMap.getBy(tx, refP);
if (this.observeAccessReads)
this.read.add(element);
return element;
}
/**
* @param tx
* @return
* @see li.strolch.agent.api.ElementMap#getAllElements(li.strolch.persistence.api.StrolchTransaction)
*/
@Override
public List<T> getAllElements(StrolchTransaction tx) {
List<T> elements = this.elementMap.getAllElements(tx);
if (this.observeAccessReads)
this.read.addAll(elements);
return elements;
}
/**
* @param tx
* @param type
* @return
* @see li.strolch.agent.api.ElementMap#getElementsBy(li.strolch.persistence.api.StrolchTransaction,
* java.lang.String)
*/
@Override
public List<T> getElementsBy(StrolchTransaction tx, String type) {
List<T> elements = this.elementMap.getElementsBy(tx, type);
if (this.observeAccessReads)
this.read.addAll(elements);
return elements;
}
/**
* @param tx
* @return
* @see li.strolch.agent.api.ElementMap#getTypes(li.strolch.persistence.api.StrolchTransaction)
*/
@Override
public Set<String> getTypes(StrolchTransaction tx) {
return this.elementMap.getTypes(tx);
}
/**
* @param tx
* @return
* @see li.strolch.agent.api.ElementMap#getAllKeys(li.strolch.persistence.api.StrolchTransaction)
*/
@Override
public Set<String> getAllKeys(StrolchTransaction tx) {
return this.elementMap.getAllKeys(tx);
}
/**
* @param tx
* @param type
* @return
* @see li.strolch.agent.api.ElementMap#getKeysBy(li.strolch.persistence.api.StrolchTransaction, java.lang.String)
*/
@Override
public Set<String> getKeysBy(StrolchTransaction tx, String type) {
return this.elementMap.getKeysBy(tx, type);
}
/**
* @param tx
* @param element
* @see li.strolch.agent.api.ElementMap#add(li.strolch.persistence.api.StrolchTransaction,
* li.strolch.model.StrolchRootElement)
*/
@Override
public void add(StrolchTransaction tx, T element) {
this.elementMap.add(tx, element);
this.created.add(element);
}
/**
* @param tx
* @param elements
* @see li.strolch.agent.api.ElementMap#addAll(li.strolch.persistence.api.StrolchTransaction, java.util.List)
*/
@Override
public void addAll(StrolchTransaction tx, List<T> elements) {
this.elementMap.addAll(tx, elements);
this.created.addAll(elements);
}
/**
* @param tx
* @param element
* @return
* @see li.strolch.agent.api.ElementMap#update(li.strolch.persistence.api.StrolchTransaction,
* li.strolch.model.StrolchRootElement)
*/
@Override
public T update(StrolchTransaction tx, T element) {
T replaced = this.elementMap.update(tx, element);
this.updated.add(element);
return replaced;
}
/**
* @param tx
* @param elements
* @return
* @see li.strolch.agent.api.ElementMap#updateAll(li.strolch.persistence.api.StrolchTransaction, java.util.List)
*/
@Override
public List<T> updateAll(StrolchTransaction tx, List<T> elements) {
List<T> replaced = this.elementMap.updateAll(tx, elements);
this.updated.addAll(elements);
return replaced;
}
/**
* @param tx
* @param element
* @see li.strolch.agent.api.ElementMap#remove(li.strolch.persistence.api.StrolchTransaction,
* li.strolch.model.StrolchRootElement)
*/
@Override
public void remove(StrolchTransaction tx, T element) {
this.elementMap.remove(tx, element);
this.deleted.add(element);
}
/**
* @param tx
* @param elements
* @see li.strolch.agent.api.ElementMap#removeAll(li.strolch.persistence.api.StrolchTransaction, java.util.List)
*/
@Override
public void removeAll(StrolchTransaction tx, List<T> elements) {
this.elementMap.removeAll(tx, elements);
this.deleted.addAll(elements);
}
/**
* @param tx
* @return
* @see li.strolch.agent.api.ElementMap#removeAll(li.strolch.persistence.api.StrolchTransaction)
*/
@Override
public long removeAll(StrolchTransaction tx) {
long removed = this.elementMap.removeAll(tx);
this.deletedAll += removed;
return removed;
}
/**
* @param tx
* @param type
* @return
* @see li.strolch.agent.api.ElementMap#removeAllBy(li.strolch.persistence.api.StrolchTransaction, java.lang.String)
*/
@Override
public long removeAllBy(StrolchTransaction tx, String type) {
long removed = this.elementMap.removeAllBy(tx, type);
Long byType = this.deletedAllByType.get(type);
if (byType == null)
byType = 0L;
byType = byType + removed;
this.deletedAllByType.put(type, byType);
return removed;
}
}

View File

@ -0,0 +1,39 @@
/*
* Copyright (c) 2012, Robert von Burg
*
* All rights reserved.
*
* This file is part of the XXX.
*
* XXX is free software: you can redistribute
* it and/or modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* XXX is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XXX. If not, see
* <http://www.gnu.org/licenses/>.
*/
package li.strolch.agent.impl;
import li.strolch.agent.api.ElementMap;
import li.strolch.agent.api.OrderMap;
import li.strolch.model.Order;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class AuditingOrderMap extends AuditingElementMapFacade<Order> implements OrderMap {
/**
* @param elementMap
*/
public AuditingOrderMap(ElementMap<Order> elementMap, boolean observeAccessReads) {
super(elementMap, observeAccessReads);
}
}

View File

@ -0,0 +1,39 @@
/*
* Copyright (c) 2012, Robert von Burg
*
* All rights reserved.
*
* This file is part of the XXX.
*
* XXX is free software: you can redistribute
* it and/or modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* XXX is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XXX. If not, see
* <http://www.gnu.org/licenses/>.
*/
package li.strolch.agent.impl;
import li.strolch.agent.api.ElementMap;
import li.strolch.agent.api.ResourceMap;
import li.strolch.model.Resource;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class AuditingResourceMap extends AuditingElementMapFacade<Resource> implements ResourceMap {
/**
* @param elementMap
*/
public AuditingResourceMap(ElementMap<Resource> elementMap, boolean observeAccessReads) {
super(elementMap, observeAccessReads);
}
}

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.agent.api.StrolchRealm;
import li.strolch.model.Order;
import li.strolch.model.Resource;
import li.strolch.persistence.api.OrderDao;
@ -39,7 +38,7 @@ import ch.eitchnet.utils.helper.StringHelper;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class CachedRealm extends StrolchRealm {
public class CachedRealm extends InternalStrolchRealm {
private PersistenceHandler persistenceHandler;
private CachedResourceMap resourceMap;
@ -85,13 +84,12 @@ public class CachedRealm extends StrolchRealm {
@Override
public void initialize(ComponentContainer container, ComponentConfiguration configuration) {
super.initialize(container, configuration);
this.persistenceHandler = container.getComponent(PersistenceHandler.class);
this.resourceMap = new CachedResourceMap();
this.orderMap = new CachedOrderMap();
String enableAuditKey = DefaultRealmHandler.makeRealmKey(getRealm(),
DefaultRealmHandler.PROP_ENABLE_AUDIT_TRAIL);
if (configuration.getBoolean(enableAuditKey, Boolean.FALSE)) {
if (isAuditTrailEnabled()) {
this.auditTrail = new CachedAuditTrail();
logger.info("Enabling AuditTrail for realm " + getRealm()); //$NON-NLS-1$
} else {

View File

@ -17,8 +17,6 @@ package li.strolch.agent.impl;
import java.text.MessageFormat;
import li.strolch.agent.api.StrolchRealm;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*
@ -31,7 +29,7 @@ public enum DataStoreMode {
}
@Override
public StrolchRealm createRealm(String realm) {
public InternalStrolchRealm createRealm(String realm) {
return new EmptyRealm(realm);
}
}, //
@ -42,7 +40,7 @@ public enum DataStoreMode {
}
@Override
public StrolchRealm createRealm(String realm) {
public InternalStrolchRealm createRealm(String realm) {
return new TransientRealm(realm);
}
}, //
@ -53,7 +51,7 @@ public enum DataStoreMode {
}
@Override
public StrolchRealm createRealm(String realm) {
public InternalStrolchRealm createRealm(String realm) {
return new CachedRealm(realm);
}
}, //
@ -64,12 +62,12 @@ public enum DataStoreMode {
}
@Override
public StrolchRealm createRealm(String realm) {
public InternalStrolchRealm createRealm(String realm) {
return new TransactionalRealm(realm);
}
}; //
public abstract StrolchRealm createRealm(String realm);
public abstract InternalStrolchRealm createRealm(String realm);
public abstract boolean isTransient();

View File

@ -42,10 +42,11 @@ public class DefaultRealmHandler extends StrolchComponent implements RealmHandle
public static final String AGENT_BOOT = "agent_boot"; //$NON-NLS-1$
public static final String PROP_ENABLE_AUDIT_TRAIL = "enableAuditTrail"; //$NON-NLS-1$
public static final String PROP_ENABLE_AUDIT_TRAIL_FOR_READ = "enableAuditTrailForRead"; //$NON-NLS-1$
public static final String PREFIX_DATA_STORE_MODE = "dataStoreMode"; //$NON-NLS-1$
public static final String PROP_REALMS = "realms"; //$NON-NLS-1$
protected Map<String, StrolchRealm> realms;
protected Map<String, InternalStrolchRealm> realms;
/**
* @param container
@ -81,7 +82,7 @@ public class DefaultRealmHandler extends StrolchComponent implements RealmHandle
String dataStoreModeKey = makeRealmKey(realmName, PREFIX_DATA_STORE_MODE);
String realmMode = configuration.getString(dataStoreModeKey, null);
DataStoreMode dataStoreMode = DataStoreMode.parseDataStoreMode(realmMode);
StrolchRealm realm = dataStoreMode.createRealm(realmName);
InternalStrolchRealm realm = dataStoreMode.createRealm(realmName);
this.realms.put(realmName, realm);
}
super.setup(configuration);
@ -98,14 +99,14 @@ public class DefaultRealmHandler extends StrolchComponent implements RealmHandle
public void initialize(ComponentConfiguration configuration) {
for (String realmName : this.realms.keySet()) {
StrolchRealm realm = this.realms.get(realmName);
InternalStrolchRealm realm = this.realms.get(realmName);
realm.initialize(getContainer(), configuration);
}
super.initialize(configuration);
}
Map<String, StrolchRealm> getRealms() {
Map<String, InternalStrolchRealm> getRealms() {
return this.realms;
}
@ -121,7 +122,7 @@ public class DefaultRealmHandler extends StrolchComponent implements RealmHandle
@Override
public void stop() {
for (String realmName : this.realms.keySet()) {
StrolchRealm realm = this.realms.get(realmName);
InternalStrolchRealm realm = this.realms.get(realmName);
realm.stop();
}
super.stop();

View File

@ -21,7 +21,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.agent.api.StrolchRealm;
import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.inmemory.InMemoryPersistence;
@ -33,7 +32,7 @@ import ch.eitchnet.utils.dbc.DBC;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class EmptyRealm extends StrolchRealm {
public class EmptyRealm extends InternalStrolchRealm {
private ResourceMap resourceMap;
private OrderMap orderMap;

View File

@ -0,0 +1,122 @@
/*
* Copyright (c) 2012, Robert von Burg
*
* All rights reserved.
*
* This file is part of the XXX.
*
* XXX is free software: you can redistribute
* it and/or modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* XXX is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XXX. If not, see
* <http://www.gnu.org/licenses/>.
*/
package li.strolch.agent.impl;
import java.text.MessageFormat;
import java.util.concurrent.TimeUnit;
import li.strolch.agent.api.AuditTrail;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.LockHandler;
import li.strolch.agent.api.OrderMap;
import li.strolch.agent.api.ResourceMap;
import li.strolch.agent.api.StrolchRealm;
import li.strolch.model.StrolchRootElement;
import li.strolch.runtime.configuration.ComponentConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.eitchnet.privilege.model.PrivilegeContext;
import ch.eitchnet.utils.dbc.DBC;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public abstract class InternalStrolchRealm implements StrolchRealm {
public static final String PROP_TRY_LOCK_TIME_UNIT = "tryLockTimeUnit"; //$NON-NLS-1$
public static final String PROP_TRY_LOCK_TIME = "tryLockTime"; //$NON-NLS-1$
protected static final Logger logger = LoggerFactory.getLogger(StrolchRealm.class);
private String realm;
private LockHandler lockHandler;
private boolean auditTrailEnabled;
private boolean auditTrailEnabledForRead;
public InternalStrolchRealm(String realm) {
DBC.PRE.assertNotEmpty("RealmName may not be empty!", realm); //$NON-NLS-1$
this.realm = realm;
}
@Override
public String getRealm() {
return this.realm;
}
@Override
public void lock(StrolchRootElement element) {
DBC.PRE.assertNotNull("Can not lock a null pointer =)", element); //$NON-NLS-1$
this.lockHandler.lock(element);
}
@Override
public void unlock(StrolchRootElement lockedElement) {
this.lockHandler.unlock(lockedElement);
}
public void initialize(ComponentContainer container, ComponentConfiguration configuration) {
String propTryLockTimeUnit = DefaultRealmHandler.makeRealmKey(this.realm, PROP_TRY_LOCK_TIME_UNIT);
String propTryLockTime = DefaultRealmHandler.makeRealmKey(this.realm, PROP_TRY_LOCK_TIME);
String enableAuditKey = DefaultRealmHandler.makeRealmKey(getRealm(),
DefaultRealmHandler.PROP_ENABLE_AUDIT_TRAIL);
this.auditTrailEnabled = configuration.getBoolean(enableAuditKey, Boolean.FALSE);
String enableAuditForReadKey = DefaultRealmHandler.makeRealmKey(getRealm(),
DefaultRealmHandler.PROP_ENABLE_AUDIT_TRAIL_FOR_READ);
this.auditTrailEnabledForRead = configuration.getBoolean(enableAuditForReadKey, Boolean.FALSE);
TimeUnit timeUnit = TimeUnit.valueOf(configuration.getString(propTryLockTimeUnit, TimeUnit.SECONDS.name()));
long time = configuration.getLong(propTryLockTime, 10);
logger.info(MessageFormat.format("Using a locking try timeout of {0}s", timeUnit.toSeconds(time))); //$NON-NLS-1$
this.lockHandler = new DefaultLockHandler(this.realm, timeUnit, time);
}
/**
* @return the auditTrailEnabled
*/
@Override
public boolean isAuditTrailEnabled() {
return this.auditTrailEnabled;
}
/**
* @return the auditTrailEnabledForRead
*/
@Override
public boolean isAuditTrailEnabledForRead() {
return this.auditTrailEnabledForRead;
}
public abstract void start(PrivilegeContext privilegeContext);
public abstract void stop();
public abstract void destroy();
public abstract ResourceMap getResourceMap();
public abstract OrderMap getOrderMap();
public abstract AuditTrail getAuditTrail();
}

View File

@ -15,7 +15,6 @@
*/
package li.strolch.agent.impl;
import li.strolch.agent.api.StrolchRealm;
import ch.eitchnet.privilege.handler.SystemUserAction;
import ch.eitchnet.privilege.model.PrivilegeContext;
@ -36,8 +35,7 @@ public class StartRealms implements SystemUserAction {
@Override
public void execute(PrivilegeContext privilegeContext) {
for (String realmName : this.defaultRealmHandler.getRealms().keySet()) {
StrolchRealm realm = this.defaultRealmHandler.getRealms().get(realmName);
InternalStrolchRealm realm = this.defaultRealmHandler.getRealms().get(realmName);
realm.start(privilegeContext);
}
}

View File

@ -21,7 +21,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.agent.api.StrolchRealm;
import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.configuration.ComponentConfiguration;
@ -33,7 +32,7 @@ import ch.eitchnet.utils.helper.StringHelper;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class TransactionalRealm extends StrolchRealm {
public class TransactionalRealm extends InternalStrolchRealm {
private ResourceMap resourceMap;
private OrderMap orderMap;
@ -82,10 +81,7 @@ public class TransactionalRealm extends StrolchRealm {
this.resourceMap = new TransactionalResourceMap();
this.orderMap = new TransactionalOrderMap();
String enableAuditKey = DefaultRealmHandler.makeRealmKey(getRealm(),
DefaultRealmHandler.PROP_ENABLE_AUDIT_TRAIL);
if (configuration.getBoolean(enableAuditKey, Boolean.FALSE)) {
if (isAuditTrailEnabled()) {
this.auditTrail = new TransactionalAuditTrail();
logger.info("Enabling AuditTrail for realm " + getRealm()); //$NON-NLS-1$
} else {

View File

@ -15,8 +15,6 @@
*/
package li.strolch.agent.impl;
import static ch.eitchnet.utils.helper.StringHelper.DOT;
import java.io.File;
import java.text.MessageFormat;
@ -24,13 +22,11 @@ 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.StrolchRealm;
import li.strolch.model.ModelStatistics;
import li.strolch.model.xml.XmlModelSaxFileReader;
import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.inmemory.InMemoryPersistence;
import li.strolch.runtime.StrolchConstants;
import li.strolch.runtime.configuration.ComponentConfiguration;
import li.strolch.runtime.configuration.StrolchConfigurationException;
import ch.eitchnet.privilege.model.Certificate;
@ -41,7 +37,7 @@ import ch.eitchnet.utils.helper.StringHelper;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class TransientRealm extends StrolchRealm {
public class TransientRealm extends InternalStrolchRealm {
public static final String PREFIX_DATA_STORE_FILE = "dataStoreFile"; //$NON-NLS-1$
@ -92,10 +88,7 @@ public class TransientRealm extends StrolchRealm {
public void initialize(ComponentContainer container, ComponentConfiguration configuration) {
super.initialize(container, configuration);
String key = PREFIX_DATA_STORE_FILE;
if (!getRealm().equals(StrolchConstants.DEFAULT_REALM))
key += DOT + getRealm();
String key = DefaultRealmHandler.makeRealmKey(getRealm(), PREFIX_DATA_STORE_FILE);
if (!configuration.hasProperty(key)) {
String msg = "There is no data store file for realm {0}. Set a property with key {1}"; //$NON-NLS-1$
msg = MessageFormat.format(msg, getRealm(), key);
@ -108,9 +101,7 @@ public class TransientRealm extends StrolchRealm {
this.resourceMap = new TransactionalResourceMap();
this.orderMap = new TransactionalOrderMap();
String enableAuditKey = DefaultRealmHandler.makeRealmKey(getRealm(),
DefaultRealmHandler.PROP_ENABLE_AUDIT_TRAIL);
if (configuration.getBoolean(enableAuditKey, Boolean.FALSE)) {
if (isAuditTrailEnabled()) {
this.auditTrail = new TransactionalAuditTrail();
logger.info("Enabling AuditTrail for realm " + getRealm()); //$NON-NLS-1$
} else {

View File

@ -27,6 +27,10 @@ import li.strolch.agent.api.OrderMap;
import li.strolch.agent.api.ResourceMap;
import li.strolch.agent.api.StrolchAgent;
import li.strolch.agent.api.StrolchRealm;
import li.strolch.agent.impl.AuditingAuditMapFacade;
import li.strolch.agent.impl.AuditingOrderMap;
import li.strolch.agent.impl.AuditingResourceMap;
import li.strolch.agent.impl.InternalStrolchRealm;
import li.strolch.exception.StrolchException;
import li.strolch.model.GroupedParameterizedElement;
import li.strolch.model.Locator;
@ -49,7 +53,6 @@ import li.strolch.model.query.OrderQuery;
import li.strolch.model.query.ResourceQuery;
import li.strolch.model.timedstate.StrolchTimedState;
import li.strolch.model.timevalue.IValue;
import li.strolch.model.visitor.ElementTypeVisitor;
import li.strolch.model.visitor.NoStrategyOrderVisitor;
import li.strolch.model.visitor.NoStrategyResourceVisitor;
import li.strolch.persistence.inmemory.InMemoryTransaction;
@ -69,7 +72,7 @@ import ch.eitchnet.utils.helper.StringHelper;
public abstract class AbstractTransaction implements StrolchTransaction {
protected static final Logger logger = LoggerFactory.getLogger(InMemoryTransaction.class);
private StrolchRealm realm;
private InternalStrolchRealm realm;
private TransactionCloseStrategy closeStrategy;
private ObserverHandler observerHandler;
@ -79,15 +82,19 @@ public abstract class AbstractTransaction implements StrolchTransaction {
private List<Command> commands;
private Set<StrolchRootElement> lockedElements;
private AuditingOrderMap orderMap;
private AuditingResourceMap resourceMap;
private AuditingAuditMapFacade auditTrail;
private String action;
private Certificate certificate;
public AbstractTransaction(StrolchRealm realm, Certificate certificate, String action) {
DBC.PRE.assertNotNull("realm must be set!", realm);
DBC.PRE.assertNotNull("certificate must be set!", certificate);
DBC.PRE.assertNotNull("action must be set!", action);
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.realm = realm;
this.realm = (InternalStrolchRealm) realm;
this.action = action;
this.certificate = certificate;
@ -171,6 +178,12 @@ public abstract class AbstractTransaction implements StrolchTransaction {
this.lockedElements.add(element);
}
@Override
public <T extends StrolchRootElement> void unlock(T element) {
this.realm.unlock(element);
this.lockedElements.remove(element);
}
private void unlockElements() {
for (StrolchRootElement lockedElement : this.lockedElements) {
this.realm.unlock(lockedElement);
@ -184,17 +197,28 @@ public abstract class AbstractTransaction implements StrolchTransaction {
@Override
public ResourceMap getResourceMap() {
return this.realm.getResourceMap();
if (this.resourceMap == null) {
this.resourceMap = new AuditingResourceMap(this.realm.getResourceMap(),
this.realm.isAuditTrailEnabledForRead());
}
return this.resourceMap;
}
@Override
public OrderMap getOrderMap() {
return this.realm.getOrderMap();
if (this.orderMap == null) {
this.orderMap = new AuditingOrderMap(this.realm.getOrderMap(), this.realm.isAuditTrailEnabledForRead());
}
return this.orderMap;
}
@Override
public AuditTrail getAuditTrail() {
return this.realm.getAuditTrail();
if (this.auditTrail == null) {
this.auditTrail = new AuditingAuditMapFacade(this.realm.getAuditTrail(),
this.realm.isAuditTrailEnabledForRead());
}
return this.auditTrail;
}
@Override
@ -362,11 +386,6 @@ public abstract class AbstractTransaction implements StrolchTransaction {
throw new StrolchPersistenceException(msg, e);
} finally {
try {
} catch (Exception e) {
logger.error("Failed to close connection: " + e.getMessage(), e); //$NON-NLS-1$
}
unlockElements();
}
}
@ -463,14 +482,21 @@ public abstract class AbstractTransaction implements StrolchTransaction {
return 0L;
long observerUpdateStart = System.nanoTime();
Set<String> keys = this.txResult.getKeys();
for (String key : keys) {
ModificationResult modificationResult = this.txResult.getModificationResult(key);
this.observerHandler.add(key, modificationResult.<StrolchElement> getCreated());
this.observerHandler.update(key, modificationResult.<StrolchElement> getUpdated());
this.observerHandler.remove(key, modificationResult.<StrolchElement> getDeleted());
if (this.orderMap != null) {
this.observerHandler.add(Tags.ORDER, new ArrayList<StrolchRootElement>(this.orderMap.getCreated()));
this.observerHandler.update(Tags.ORDER, new ArrayList<StrolchRootElement>(this.orderMap.getUpdated()));
this.observerHandler.remove(Tags.ORDER, new ArrayList<StrolchRootElement>(this.orderMap.getDeleted()));
}
if (this.resourceMap != null) {
this.observerHandler.add(Tags.RESOURCE, new ArrayList<StrolchRootElement>(this.resourceMap.getCreated()));
this.observerHandler
.update(Tags.RESOURCE, new ArrayList<StrolchRootElement>(this.resourceMap.getUpdated()));
this.observerHandler
.remove(Tags.RESOURCE, new ArrayList<StrolchRootElement>(this.resourceMap.getDeleted()));
}
long observerUpdateDuration = System.nanoTime() - observerUpdateStart;
return observerUpdateDuration;
}
@ -483,38 +509,54 @@ public abstract class AbstractTransaction implements StrolchTransaction {
if (!isAuditTrailEnabled())
return 0L;
Set<String> keys = this.txResult.getKeys();
if (keys.isEmpty())
return 0L;
long auditTrailStart = System.nanoTime();
List<Audit> audits = new ArrayList<>();
for (String key : keys) {
ModificationResult modificationResult = this.txResult.getModificationResult(key);
List<StrolchElement> created = modificationResult.getCreated();
for (StrolchElement strolchElement : created) {
audits.add(auditFrom(AccessType.CREATE, (StrolchRootElement) strolchElement));
}
List<StrolchElement> updated = modificationResult.getUpdated();
for (StrolchElement strolchElement : updated) {
audits.add(auditFrom(AccessType.UPDATE, (StrolchRootElement) strolchElement));
}
List<StrolchElement> deleted = modificationResult.getDeleted();
for (StrolchElement strolchElement : deleted) {
audits.add(auditFrom(AccessType.DELETE, (StrolchRootElement) strolchElement));
}
if (this.orderMap != null) {
if (this.realm.isAuditTrailEnabledForRead())
auditsFor(audits, AccessType.READ, Tags.ORDER, this.orderMap.getRead());
auditsFor(audits, AccessType.CREATE, Tags.ORDER, this.orderMap.getCreated());
auditsFor(audits, AccessType.UPDATE, Tags.ORDER, this.orderMap.getUpdated());
auditsFor(audits, AccessType.DELETE, Tags.ORDER, this.orderMap.getDeleted());
}
getAuditTrail().addAll(this, audits);
if (this.resourceMap != null) {
if (this.realm.isAuditTrailEnabledForRead())
auditsFor(audits, AccessType.READ, Tags.RESOURCE, this.resourceMap.getRead());
auditsFor(audits, AccessType.CREATE, Tags.RESOURCE, this.resourceMap.getCreated());
auditsFor(audits, AccessType.UPDATE, Tags.RESOURCE, this.resourceMap.getUpdated());
auditsFor(audits, AccessType.DELETE, Tags.RESOURCE, this.resourceMap.getDeleted());
}
if (this.auditTrail != null) {
if (this.realm.isAuditTrailEnabledForRead())
auditsForAudits(audits, AccessType.READ, Tags.AUDIT, this.auditTrail.getRead());
auditsForAudits(audits, AccessType.CREATE, Tags.AUDIT, this.auditTrail.getCreated());
auditsForAudits(audits, AccessType.UPDATE, Tags.AUDIT, this.auditTrail.getUpdated());
auditsForAudits(audits, AccessType.DELETE, Tags.AUDIT, this.auditTrail.getDeleted());
}
this.realm.getAuditTrail().addAll(this, audits);
long auditTrailDuration = System.nanoTime() - auditTrailStart;
return auditTrailDuration;
}
private Audit auditFrom(AccessType accessType, StrolchRootElement element) {
private <T extends StrolchRootElement> void auditsFor(List<Audit> audits, AccessType accessType,
String elementType, Set<T> elements) {
for (StrolchRootElement element : elements) {
audits.add(auditFrom(accessType, elementType, element.getId()));
}
}
private <T extends StrolchRootElement> void auditsForAudits(List<Audit> audits, AccessType accessType,
String elementType, Set<Audit> elements) {
for (Audit element : elements) {
audits.add(auditFrom(accessType, elementType, element.getId().toString()));
}
}
private Audit auditFrom(AccessType accessType, String elementType, String id) {
Audit audit = new Audit();
audit.setId(StrolchAgent.getUniqueIdLong());
@ -523,8 +565,8 @@ public abstract class AbstractTransaction implements StrolchTransaction {
audit.setLastname(this.certificate.getLastname());
audit.setDate(new Date());
audit.setElementType(element.accept(new ElementTypeVisitor()));
audit.setElementAccessed(element.getId());
audit.setElementType(elementType);
audit.setElementAccessed(id);
//audit.setNewVersion();

View File

@ -72,6 +72,8 @@ public interface StrolchTransaction extends AutoCloseable {
public <T extends StrolchRootElement> void lock(T element);
public <T extends StrolchRootElement> void unlock(T element);
public void addCommand(Command command);
public List<Order> doQuery(OrderQuery query);

View File

@ -16,9 +16,6 @@
package li.strolch.persistence.api;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import ch.eitchnet.utils.helper.StringHelper;
@ -33,14 +30,16 @@ public class TransactionResult {
private long txDuration;
private long closeDuration;
private Map<String, ModificationResult> modificationByKey;
private long created;
private long read;
private long updated;
private long deleted;
public TransactionResult(String realm, long startNanos, Date startDate) {
this.realm = realm;
this.startNanos = startNanos;
this.startTime = startDate;
this.state = TransactionState.OPEN;
this.modificationByKey = new HashMap<>();
}
/**
@ -133,42 +132,88 @@ public class TransactionResult {
}
/**
* @param modificationByKey
* the modificationByKey to set
* @return the created
*/
public void setModificationByKey(Map<String, ModificationResult> modificationByKey) {
this.modificationByKey = modificationByKey;
}
public void addModificationResult(ModificationResult modificationResult) {
this.modificationByKey.put(modificationResult.getKey(), modificationResult);
public long getCreated() {
return this.created;
}
/**
* @return
* @param created
* the created to set
*/
public Set<String> getKeys() {
return this.modificationByKey.keySet();
public void setCreated(long created) {
this.created = created;
}
/**
* @param key
* @return
* @return the read
*/
public ModificationResult getModificationResult(String key) {
return this.modificationByKey.get(key);
public long getRead() {
return this.read;
}
/**
* @param read
* the read to set
*/
public void setRead(long read) {
this.read = read;
}
/**
* @return the updated
*/
public long getUpdated() {
return this.updated;
}
/**
* @param updated
* the updated to set
*/
public void setUpdated(long updated) {
this.updated = updated;
}
/**
* @return the deleted
*/
public long getDeleted() {
return this.deleted;
}
/**
* @param deleted
* the deleted to set
*/
public void setDeleted(long deleted) {
this.deleted = deleted;
}
public void incCreated(long created) {
this.created += created;
}
public void incRead(long read) {
this.read += read;
}
public void incUpdated(long updated) {
this.updated += updated;
}
public void incDeleted(long deleted) {
this.deleted += deleted;
}
private long getAccessed() {
return this.created + this.read + this.updated + this.deleted;
}
@SuppressWarnings("nls")
public String getLogMessage() {
int nrOfObjects = 0;
for (ModificationResult result : this.modificationByKey.values()) {
nrOfObjects += result.getCreated().size();
nrOfObjects += result.getUpdated().size();
nrOfObjects += result.getDeleted().size();
}
StringBuilder sb = new StringBuilder();
switch (this.state) {
case OPEN:
@ -193,10 +238,16 @@ public class TransactionResult {
sb.append(" with close operation taking ");
sb.append(StringHelper.formatNanoDuration(this.closeDuration));
sb.append(". ");
sb.append(nrOfObjects);
sb.append(" objects in ");
sb.append(this.modificationByKey.size());
sb.append(" types were modified.");
sb.append(getAccessed());
sb.append(" objects accessed (");
sb.append(this.created);
sb.append(" created, ");
sb.append(this.read);
sb.append(" read, ");
sb.append(this.updated);
sb.append(" updated, ");
sb.append(this.deleted);
sb.append(" deleted, ");
return sb.toString();
}
@ -211,5 +262,9 @@ public class TransactionResult {
this.startTime = null;
this.txDuration = 0L;
this.closeDuration = 0L;
this.created = 0L;
this.read = 0L;
this.updated = 0L;
this.deleted = 0L;
}
}

View File

@ -23,7 +23,7 @@ import java.util.Map;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.agent.api.StrolchComponent;
import li.strolch.model.StrolchElement;
import li.strolch.model.StrolchRootElement;
import li.strolch.runtime.configuration.ComponentConfiguration;
/**
@ -49,7 +49,7 @@ public class DefaultObserverHandler extends StrolchComponent implements Observer
}
@Override
public void add(String key, List<StrolchElement> elements) {
public void add(String key, List<StrolchRootElement> elements) {
List<Observer> observerList = this.observerMap.get(key);
if (observerList != null && !observerList.isEmpty()) {
for (Observer observer : observerList) {
@ -65,7 +65,7 @@ public class DefaultObserverHandler extends StrolchComponent implements Observer
}
@Override
public void update(String key, List<StrolchElement> elements) {
public void update(String key, List<StrolchRootElement> elements) {
List<Observer> observerList = this.observerMap.get(key);
if (observerList != null && !observerList.isEmpty()) {
for (Observer observer : observerList) {
@ -81,7 +81,7 @@ public class DefaultObserverHandler extends StrolchComponent implements Observer
}
@Override
public void remove(String key, List<StrolchElement> elements) {
public void remove(String key, List<StrolchRootElement> elements) {
List<Observer> observerList = this.observerMap.get(key);
if (observerList != null && !observerList.isEmpty()) {
for (Observer observer : observerList) {

View File

@ -17,13 +17,13 @@ package li.strolch.runtime.observer;
import java.util.List;
import li.strolch.model.StrolchElement;
import li.strolch.model.StrolchRootElement;
public interface Observer {
public void add(String key, List<StrolchElement> elements);
public void add(String key, List<StrolchRootElement> elements);
public void update(String key, List<StrolchElement> elements);
public void update(String key, List<StrolchRootElement> elements);
public void remove(String key, List<StrolchElement> elements);
public void remove(String key, List<StrolchRootElement> elements);
}

View File

@ -17,15 +17,15 @@ package li.strolch.runtime.observer;
import java.util.List;
import li.strolch.model.StrolchElement;
import li.strolch.model.StrolchRootElement;
public interface ObserverHandler {
public void add(String key, List<StrolchElement> elements);
public void add(String key, List<StrolchRootElement> elements);
public void update(String key, List<StrolchElement> elements);
public void update(String key, List<StrolchRootElement> elements);
public void remove(String key, List<StrolchElement> elements);
public void remove(String key, List<StrolchRootElement> elements);
public void registerObserver(String key, Observer observer);