[New] Implemented opt-in audit trail in Strolch
The audit trail has its own map on the Realm and a trail is written by realm at the end of the transaction. You can write your own audit trail using tx.getAuditTrail(). Enable the audit trail by setting the realm configuration value 'enableAuditTrail'.
This commit is contained in:
parent
0fbd156929
commit
a70218f028
|
@ -23,9 +23,8 @@ import li.strolch.persistence.api.StrolchTransaction;
|
|||
|
||||
/**
|
||||
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||
*
|
||||
*/
|
||||
public class UpdateElementVisitor implements StrolchRootElementVisitor {
|
||||
public class UpdateElementVisitor implements StrolchRootElementVisitor<StrolchRootElement> {
|
||||
|
||||
private StrolchTransaction tx;
|
||||
|
||||
|
@ -37,15 +36,13 @@ public class UpdateElementVisitor implements StrolchRootElementVisitor {
|
|||
return rootElement.accept(this);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <T> T visitOrder(Order order) {
|
||||
return (T) tx.getOrderMap().update(tx, order);
|
||||
public StrolchRootElement visitOrder(Order order) {
|
||||
return tx.getOrderMap().update(tx, order);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <T> T visitResource(Resource resource) {
|
||||
return (T) tx.getResourceMap().update(tx, resource);
|
||||
public StrolchRootElement visitResource(Resource resource) {
|
||||
return tx.getResourceMap().update(tx, resource);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,6 +39,8 @@ import org.junit.Rule;
|
|||
import org.junit.Test;
|
||||
import org.junit.rules.ExpectedException;
|
||||
|
||||
import ch.eitchnet.privilege.model.Certificate;
|
||||
|
||||
/**
|
||||
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||
*/
|
||||
|
@ -46,6 +48,8 @@ public abstract class AbstractRealmCommandTest {
|
|||
|
||||
protected static RuntimeMock runtimeMock;
|
||||
|
||||
protected static Certificate certificate;
|
||||
|
||||
@Rule
|
||||
public ExpectedException expectedException = ExpectedException.none();
|
||||
|
||||
|
@ -61,8 +65,9 @@ public abstract class AbstractRealmCommandTest {
|
|||
runtimeMock.mockRuntime(rootPath, configSrc);
|
||||
runtimeMock.startContainer();
|
||||
|
||||
importFromXml(REALM_CACHED, getServiceHandler());
|
||||
importFromXml(REALM_TRANSACTIONAL, getServiceHandler());
|
||||
certificate = runtimeMock.getPrivilegeHandler().authenticate("test", "test".getBytes());
|
||||
importFromXml(REALM_CACHED, certificate, getServiceHandler());
|
||||
importFromXml(REALM_TRANSACTIONAL, certificate, getServiceHandler());
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
|
@ -81,7 +86,7 @@ public abstract class AbstractRealmCommandTest {
|
|||
expectedException.expectMessage("Fail on purpose after do command!");
|
||||
|
||||
StrolchRealm realm = runtimeMock.getContainer().getRealm(realmName);
|
||||
try (StrolchTransaction tx = realm.openTx()) {
|
||||
try (StrolchTransaction tx = realm.openTx(certificate, "test")) {
|
||||
|
||||
Command command = getCommandInstance(runtimeMock.getContainer(), tx);
|
||||
|
||||
|
@ -92,7 +97,7 @@ public abstract class AbstractRealmCommandTest {
|
|||
|
||||
protected void doCommand(String realmName) {
|
||||
StrolchRealm realm = runtimeMock.getContainer().getRealm(realmName);
|
||||
try (StrolchTransaction tx = realm.openTx()) {
|
||||
try (StrolchTransaction tx = realm.openTx(certificate, "test")) {
|
||||
Command command = getCommandInstance(runtimeMock.getContainer(), tx);
|
||||
tx.addCommand(command);
|
||||
}
|
||||
|
|
|
@ -32,7 +32,6 @@ public class AddOrderCollectionServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
AddOrderCollectionService svc = new AddOrderCollectionService();
|
||||
AddOrderCollectionArg arg = new AddOrderCollectionArg();
|
||||
|
||||
ArrayList<Order> orders = new ArrayList<>();
|
||||
|
@ -42,6 +41,6 @@ public class AddOrderCollectionServiceTest extends AbstractRealmServiceTest {
|
|||
|
||||
arg.orders = orders;
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(AddOrderCollectionService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,10 +29,9 @@ public class AddOrderServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
AddOrderService svc = new AddOrderService();
|
||||
AddOrderArg arg = new AddOrderArg();
|
||||
arg.order = ModelGenerator.createOrder("firstOrder", "First Order", "AdditionalOrders");
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(AddOrderService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,7 +32,6 @@ public class AddResourceCollectionServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
AddResourceCollectionService svc = new AddResourceCollectionService();
|
||||
AddResourceCollectionArg arg = new AddResourceCollectionArg();
|
||||
|
||||
ArrayList<Resource> resources = new ArrayList<>();
|
||||
|
@ -42,6 +41,6 @@ public class AddResourceCollectionServiceTest extends AbstractRealmServiceTest {
|
|||
|
||||
arg.resources = resources;
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(AddResourceCollectionService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,10 +29,9 @@ public class AddResourceServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
AddResourceService svc = new AddResourceService();
|
||||
AddResourceArg arg = new AddResourceArg();
|
||||
arg.resource = ModelGenerator.createResource("firstRes", "First Resource", "AdditionalResources");
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(AddResourceService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,19 +35,18 @@ public class ClearModelServiceTest extends AbstractRealmServiceTest {
|
|||
Runner validator = new Runner() {
|
||||
@Override
|
||||
public void run(StrolchRealm strolchRealm, ComponentContainer container) {
|
||||
try (StrolchTransaction tx = strolchRealm.openTx()) {
|
||||
try (StrolchTransaction tx = strolchRealm.openTx(certificate, "test")) {
|
||||
assertEquals(0, tx.getResourceMap().querySize(tx));
|
||||
assertEquals(0, tx.getOrderMap().querySize(tx));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ClearModelService svc = new ClearModelService();
|
||||
ClearModelArgument arg = new ClearModelArgument();
|
||||
arg.clearOrders = true;
|
||||
arg.clearResources = true;
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg, null, validator, null);
|
||||
runServiceInAllRealmTypes(ClearModelService.class, arg, null, validator, null);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -56,19 +55,18 @@ public class ClearModelServiceTest extends AbstractRealmServiceTest {
|
|||
Runner validator = new Runner() {
|
||||
@Override
|
||||
public void run(StrolchRealm strolchRealm, ComponentContainer container) {
|
||||
try (StrolchTransaction tx = strolchRealm.openTx()) {
|
||||
try (StrolchTransaction tx = strolchRealm.openTx(certificate, "test")) {
|
||||
assertNotEquals(0, tx.getResourceMap().querySize(tx));
|
||||
assertEquals(0, tx.getOrderMap().querySize(tx));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ClearModelService svc = new ClearModelService();
|
||||
ClearModelArgument arg = new ClearModelArgument();
|
||||
arg.clearOrders = true;
|
||||
arg.clearResources = false;
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg, null, validator, null);
|
||||
runServiceInAllRealmTypes(ClearModelService.class, arg, null, validator, null);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -77,19 +75,18 @@ public class ClearModelServiceTest extends AbstractRealmServiceTest {
|
|||
Runner validator = new Runner() {
|
||||
@Override
|
||||
public void run(StrolchRealm strolchRealm, ComponentContainer container) {
|
||||
try (StrolchTransaction tx = strolchRealm.openTx()) {
|
||||
try (StrolchTransaction tx = strolchRealm.openTx(certificate, "test")) {
|
||||
assertNotEquals(0, tx.getOrderMap().querySize(tx));
|
||||
assertEquals(0, tx.getResourceMap().querySize(tx));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ClearModelService svc = new ClearModelService();
|
||||
ClearModelArgument arg = new ClearModelArgument();
|
||||
arg.clearOrders = false;
|
||||
arg.clearResources = true;
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg, null, validator, null);
|
||||
runServiceInAllRealmTypes(ClearModelService.class, arg, null, validator, null);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -32,7 +32,6 @@ public class RemoveOrderCollectionServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
RemoveOrderCollectionService svc = new RemoveOrderCollectionService();
|
||||
RemoveOrderCollectionArg arg = new RemoveOrderCollectionArg();
|
||||
|
||||
ArrayList<Locator> locators = new ArrayList<>();
|
||||
|
@ -42,6 +41,6 @@ public class RemoveOrderCollectionServiceTest extends AbstractRealmServiceTest {
|
|||
|
||||
arg.locators = locators;
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(RemoveOrderCollectionService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,10 +30,9 @@ public class RemoveOrderServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
RemoveOrderService svc = new RemoveOrderService();
|
||||
RemoveOrderArg arg = new RemoveOrderArg();
|
||||
arg.locator = Locator.newBuilder(Tags.ORDER, "TestType", "@3").build();
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(RemoveOrderService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,7 +32,6 @@ public class RemoveResourceCollectionServiceTest extends AbstractRealmServiceTes
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
RemoveResourceCollectionService svc = new RemoveResourceCollectionService();
|
||||
RemoveResourceCollectionArg arg = new RemoveResourceCollectionArg();
|
||||
|
||||
ArrayList<Locator> locators = new ArrayList<>();
|
||||
|
@ -42,6 +41,6 @@ public class RemoveResourceCollectionServiceTest extends AbstractRealmServiceTes
|
|||
|
||||
arg.locators = locators;
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(RemoveResourceCollectionService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,10 +30,9 @@ public class RemoveResourceServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
RemoveResourceService svc = new RemoveResourceService();
|
||||
RemoveResourceArg arg = new RemoveResourceArg();
|
||||
arg.locator = Locator.newBuilder(Tags.RESOURCE, "Enumeration", "sex").build();
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(RemoveResourceService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,7 +33,6 @@ public class UpdateOrderCollectionServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
UpdateOrderCollectionService svc = new UpdateOrderCollectionService();
|
||||
UpdateOrderCollectionArg arg = new UpdateOrderCollectionArg();
|
||||
|
||||
List<Order> orders = new ArrayList<>();
|
||||
|
@ -43,6 +42,6 @@ public class UpdateOrderCollectionServiceTest extends AbstractRealmServiceTest {
|
|||
|
||||
arg.orders = orders;
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(UpdateOrderCollectionService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,10 +29,9 @@ public class UpdateOrderServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
UpdateOrderService svc = new UpdateOrderService();
|
||||
UpdateOrderArg arg = new UpdateOrderArg();
|
||||
arg.order = ModelGenerator.createOrder("myCarOrder", "Modified Car Order", "ProductionOrder");
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(UpdateOrderService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,7 +32,6 @@ public class UpdateResourceCollectionServiceTest extends AbstractRealmServiceTes
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
UpdateResourceCollectionService svc = new UpdateResourceCollectionService();
|
||||
UpdateResourceCollectionArg arg = new UpdateResourceCollectionArg();
|
||||
|
||||
ArrayList<Resource> resources = new ArrayList<>();
|
||||
|
@ -42,6 +41,6 @@ public class UpdateResourceCollectionServiceTest extends AbstractRealmServiceTes
|
|||
|
||||
arg.resources = resources;
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(UpdateResourceCollectionService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,10 +29,9 @@ public class UpdateResourceServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
UpdateResourceService svc = new UpdateResourceService();
|
||||
UpdateResourceArg arg = new UpdateResourceArg();
|
||||
arg.resource = ModelGenerator.createResource("yellow", "Modified Yellow Ball", "Ball");
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(UpdateResourceService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,12 +49,11 @@ public class XmlExportModelServiceTest extends AbstractRealmServiceTest {
|
|||
}
|
||||
};
|
||||
|
||||
XmlExportModelService svc = new XmlExportModelService();
|
||||
XmlExportModelArgument arg = new XmlExportModelArgument();
|
||||
arg.modelFileName = TMP_XML_EXPORT_XML;
|
||||
arg.multiFile = true;
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg, before, null, null);
|
||||
runServiceInAllRealmTypes(XmlExportModelService.class, arg, before, null, null);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -75,7 +74,7 @@ public class XmlExportModelServiceTest extends AbstractRealmServiceTest {
|
|||
arg.multiFile = true;
|
||||
arg.modelFileName = TMP_XML_EXPORT_XML;
|
||||
|
||||
ServiceResult result = getServiceHandler().doService(null, svc, arg);
|
||||
ServiceResult result = getServiceHandler().doService(certificate, svc, arg);
|
||||
assertServiceResult(ServiceResultState.FAILED, ServiceResult.class, result);
|
||||
assertThat(result.getMessage(), containsString("Model File already exists with name"));
|
||||
}
|
||||
|
@ -98,7 +97,7 @@ public class XmlExportModelServiceTest extends AbstractRealmServiceTest {
|
|||
arg.multiFile = true;
|
||||
arg.modelFileName = TMP_XML_EXPORT_XML;
|
||||
|
||||
ServiceResult result = getServiceHandler().doService(null, svc, arg);
|
||||
ServiceResult result = getServiceHandler().doService(certificate, svc, arg);
|
||||
assertServiceResult(ServiceResultState.SUCCESS, ServiceResult.class, result);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,10 +27,9 @@ public class XmlImportModelServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
XmlImportModelService svc = new XmlImportModelService();
|
||||
XmlImportModelArgument arg = new XmlImportModelArgument();
|
||||
arg.modelFileName = "Enums.xml";
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(XmlImportModelService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,6 +37,8 @@ import li.strolch.testbase.runtime.RuntimeMock;
|
|||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
|
||||
import ch.eitchnet.privilege.model.Certificate;
|
||||
|
||||
/**
|
||||
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||
*/
|
||||
|
@ -49,6 +51,7 @@ public abstract class AbstractRealmServiceTest {
|
|||
public static final String CONFIG_SRC = "src/test/resources/svctest"; //$NON-NLS-1$
|
||||
|
||||
protected static RuntimeMock runtimeMock;
|
||||
protected Certificate certificate;
|
||||
|
||||
@Before
|
||||
public void before() throws SQLException {
|
||||
|
@ -62,8 +65,9 @@ public abstract class AbstractRealmServiceTest {
|
|||
runtimeMock.mockRuntime(rootPath, configSrc);
|
||||
runtimeMock.startContainer();
|
||||
|
||||
importFromXml(REALM_CACHED, getServiceHandler());
|
||||
importFromXml(REALM_TRANSACTIONAL, getServiceHandler());
|
||||
certificate = runtimeMock.getPrivilegeHandler().authenticate("test", "test".getBytes());
|
||||
importFromXml(REALM_CACHED, certificate, getServiceHandler());
|
||||
importFromXml(REALM_TRANSACTIONAL, certificate, getServiceHandler());
|
||||
}
|
||||
|
||||
@After
|
||||
|
@ -79,13 +83,13 @@ public abstract class AbstractRealmServiceTest {
|
|||
}
|
||||
}
|
||||
|
||||
public static void importFromXml(String realm, ServiceHandler serviceHandler) {
|
||||
public static void importFromXml(String realm, Certificate certificate, ServiceHandler serviceHandler) {
|
||||
|
||||
XmlImportModelService svc = new XmlImportModelService();
|
||||
XmlImportModelArgument arg = new XmlImportModelArgument();
|
||||
arg.realm = realm;
|
||||
arg.modelFileName = "StrolchModel.xml";
|
||||
ServiceResult result = serviceHandler.doService(null, svc, arg);
|
||||
ServiceResult result = serviceHandler.doService(certificate, svc, arg);
|
||||
assertServiceResult(ServiceResultState.SUCCESS, ServiceResult.class, result);
|
||||
}
|
||||
|
||||
|
@ -97,7 +101,8 @@ public abstract class AbstractRealmServiceTest {
|
|||
before.run(runtimeMock.getContainer().getRealm(realm), runtimeMock.getContainer());
|
||||
|
||||
arg.realm = realm;
|
||||
ServiceResult result = getServiceHandler().doService(null, svc, arg);
|
||||
|
||||
ServiceResult result = getServiceHandler().doService(certificate, svc, arg);
|
||||
assertServiceResult(expectedState, expectedServiceResultType, result);
|
||||
|
||||
if (validator != null)
|
||||
|
@ -115,17 +120,21 @@ public abstract class AbstractRealmServiceTest {
|
|||
public void run(StrolchRealm strolchRealm, ComponentContainer container);
|
||||
}
|
||||
|
||||
protected <T extends ServiceArgument, U extends ServiceResult> void runServiceInAllRealmTypes(Service<T, U> svc,
|
||||
T arg) {
|
||||
runServiceInAllRealmTypes(svc, arg, null, null, null);
|
||||
protected <T extends ServiceArgument, U extends ServiceResult> void runServiceInAllRealmTypes(
|
||||
Class<? extends Service<T, U>> svcClass, T arg) {
|
||||
runServiceInAllRealmTypes(svcClass, arg, null, null, null);
|
||||
}
|
||||
|
||||
protected <T extends ServiceArgument, U extends ServiceResult> void runServiceInAllRealmTypes(Service<T, U> svc,
|
||||
T arg, Runner before, Runner validator, Runner after) {
|
||||
protected <T extends ServiceArgument, U extends ServiceResult> void runServiceInAllRealmTypes(
|
||||
Class<? extends Service<T, U>> svcClass, T arg, Runner before, Runner validator, Runner after) {
|
||||
|
||||
runTransient(svc, arg, before, validator, after);
|
||||
runCached(svc, arg, before, validator, after);
|
||||
runTransactional(svc, arg, before, validator, after);
|
||||
try {
|
||||
runTransient(svcClass.newInstance(), arg, before, validator, after);
|
||||
runCached(svcClass.newInstance(), arg, before, validator, after);
|
||||
runTransactional(svcClass.newInstance(), arg, before, validator, after);
|
||||
} catch (InstantiationException | IllegalAccessException e) {
|
||||
throw new RuntimeException("Failed to instantiate class " + svcClass.getName() + ": " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
private <T extends ServiceArgument, U extends ServiceResult> void runTransactional(Service<T, U> svc, T arg,
|
||||
|
|
|
@ -37,6 +37,8 @@ import org.junit.AfterClass;
|
|||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import ch.eitchnet.privilege.model.Certificate;
|
||||
|
||||
/**
|
||||
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||
*/
|
||||
|
@ -69,6 +71,10 @@ public class LockingTest {
|
|||
return runtimeMock.getContainer().getComponent(ServiceHandler.class);
|
||||
}
|
||||
|
||||
public static Certificate login() {
|
||||
return runtimeMock.getPrivilegeHandler().authenticate("admin", "admin".getBytes());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldLockElements() throws InterruptedException {
|
||||
|
||||
|
@ -112,7 +118,7 @@ public class LockingTest {
|
|||
LockingArgumentTest arg = new LockingArgumentTest();
|
||||
arg.longRunning = false;
|
||||
arg.resourceLoc = Locator.valueOf(RESOURCE_LOCATOR);
|
||||
ServiceResult result = getServiceHandler().doService(null, svc, arg);
|
||||
ServiceResult result = getServiceHandler().doService(login(), svc, arg);
|
||||
assertEquals(ServiceResultState.SUCCESS, result.getState());
|
||||
}
|
||||
|
||||
|
@ -140,7 +146,7 @@ public class LockingTest {
|
|||
continue;
|
||||
}
|
||||
|
||||
this.result = getServiceHandler().doService(null, svc, arg);
|
||||
this.result = getServiceHandler().doService(login(), svc, arg);
|
||||
}
|
||||
|
||||
public ServiceResult getResult() {
|
||||
|
|
|
@ -1,72 +0,0 @@
|
|||
/*
|
||||
* Copyright 2013 Robert von Burg <eitch@eitchnet.ch>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package li.strolch.service.test;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import li.strolch.service.api.ServiceHandler;
|
||||
import li.strolch.service.test.model.GreetingResult;
|
||||
import li.strolch.service.test.model.GreetingService;
|
||||
import li.strolch.service.test.model.GreetingService.GreetingArgument;
|
||||
import li.strolch.testbase.runtime.RuntimeMock;
|
||||
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||
*
|
||||
*/
|
||||
public class NoPrivilegeServiceTest {
|
||||
|
||||
private static final String RUNTIME_PATH = "target/strolchRuntime/"; //$NON-NLS-1$
|
||||
private static final String CONFIG_SRC = "src/test/resources/withoutPrivilegeRuntime"; //$NON-NLS-1$
|
||||
protected static RuntimeMock runtimeMock;
|
||||
|
||||
@BeforeClass
|
||||
public static void beforeClass() {
|
||||
|
||||
File rootPath = new File(RUNTIME_PATH);
|
||||
File configSrc = new File(CONFIG_SRC);
|
||||
runtimeMock = new RuntimeMock();
|
||||
runtimeMock.mockRuntime(rootPath, configSrc);
|
||||
runtimeMock.startContainer();
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void afterClass() {
|
||||
runtimeMock.destroyRuntime();
|
||||
}
|
||||
|
||||
public static ServiceHandler getServiceHandler() {
|
||||
return runtimeMock.getContainer().getComponent(ServiceHandler.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldPerformSimpleService() {
|
||||
|
||||
GreetingService greetingService = new GreetingService();
|
||||
GreetingArgument greetingArgument = new GreetingArgument();
|
||||
greetingArgument.name = "Robert"; //$NON-NLS-1$
|
||||
|
||||
GreetingResult greetingResult = getServiceHandler().doService(null, greetingService, greetingArgument);
|
||||
assertThat(greetingResult.getGreeting(), containsString("Hello Robert. Nice to meet you!")); //$NON-NLS-1$
|
||||
}
|
||||
}
|
|
@ -49,14 +49,15 @@ public class ServiceTest extends AbstractServiceTest {
|
|||
public void shouldFailInvalidCertificate1() {
|
||||
this.thrown.expect(PrivilegeException.class);
|
||||
TestService testService = new TestService();
|
||||
getServiceHandler().doService(new Certificate(null, 0, null, null, null, null), testService);
|
||||
getServiceHandler().doService(new Certificate(null, 0, null, null, null, null, null, null), testService);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldFailInvalidCertificate2() {
|
||||
this.thrown.expect(AccessDeniedException.class);
|
||||
TestService testService = new TestService();
|
||||
Certificate badCert = new Certificate("1", System.currentTimeMillis(), "bob", "dsdf", null, null); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
Certificate badCert = new Certificate(
|
||||
"1", System.currentTimeMillis(), "bob", "Bob", "Brown", "dsdf", null, null); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
|
||||
getServiceHandler().doService(badCert, testService);
|
||||
}
|
||||
|
||||
|
|
|
@ -33,6 +33,8 @@ import org.junit.AfterClass;
|
|||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import ch.eitchnet.privilege.model.Certificate;
|
||||
|
||||
/**
|
||||
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||
*/
|
||||
|
@ -41,6 +43,7 @@ public class XmlExportServiceTest {
|
|||
private static final String RUNTIME_PATH = "target/transienttest/"; //$NON-NLS-1$
|
||||
private static final String CONFIG_SRC = "src/test/resources/transienttest"; //$NON-NLS-1$
|
||||
protected static RuntimeMock runtimeMock;
|
||||
private static Certificate certificate;
|
||||
|
||||
@BeforeClass
|
||||
public static void beforeClass() {
|
||||
|
@ -50,6 +53,8 @@ public class XmlExportServiceTest {
|
|||
runtimeMock = new RuntimeMock();
|
||||
runtimeMock.mockRuntime(rootPath, configSrc);
|
||||
runtimeMock.startContainer();
|
||||
|
||||
certificate = runtimeMock.getPrivilegeHandler().authenticate("admin", "admin".getBytes());
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
|
@ -64,7 +69,7 @@ public class XmlExportServiceTest {
|
|||
XmlExportModelArgument arg = new XmlExportModelArgument();
|
||||
arg.modelFileName = "TestExportSingle.xml";
|
||||
arg.multiFile = false;
|
||||
ServiceResult result = runtimeMock.getServiceHandler().doService(null, service, arg);
|
||||
ServiceResult result = runtimeMock.getServiceHandler().doService(certificate, service, arg);
|
||||
RuntimeMock.assertServiceResult(ServiceResultState.SUCCESS, ServiceResult.class, result);
|
||||
assertNumberOfFilesCreated(arg.modelFileName.split("\\.")[0], 1);
|
||||
|
||||
|
@ -78,7 +83,7 @@ public class XmlExportServiceTest {
|
|||
XmlExportModelArgument arg = new XmlExportModelArgument();
|
||||
arg.modelFileName = "TestExportMulti.xml";
|
||||
arg.multiFile = true;
|
||||
ServiceResult result = runtimeMock.getServiceHandler().doService(null, service, arg);
|
||||
ServiceResult result = runtimeMock.getServiceHandler().doService(certificate, service, arg);
|
||||
RuntimeMock.assertServiceResult(ServiceResultState.SUCCESS, ServiceResult.class, result);
|
||||
assertNumberOfFilesCreated(arg.modelFileName.split("\\.")[0], 6);
|
||||
|
||||
|
@ -94,7 +99,7 @@ public class XmlExportServiceTest {
|
|||
arg.doOrders = false;
|
||||
arg.resourceTypes.add(StrolchConstants.TEMPLATE);
|
||||
arg.multiFile = true;
|
||||
ServiceResult result = runtimeMock.getServiceHandler().doService(null, service, arg);
|
||||
ServiceResult result = runtimeMock.getServiceHandler().doService(certificate, service, arg);
|
||||
RuntimeMock.assertServiceResult(ServiceResultState.SUCCESS, ServiceResult.class, result);
|
||||
assertNumberOfFilesCreated(arg.modelFileName.split("\\.")[0], 2);
|
||||
|
||||
|
@ -105,7 +110,7 @@ public class XmlExportServiceTest {
|
|||
XmlImportModelService importService = new XmlImportModelService();
|
||||
XmlImportModelArgument importArgument = new XmlImportModelArgument();
|
||||
importArgument.modelFileName = modelFileName;
|
||||
ServiceResult result = runtimeMock.getServiceHandler().doService(null, importService, importArgument);
|
||||
ServiceResult result = runtimeMock.getServiceHandler().doService(certificate, importService, importArgument);
|
||||
RuntimeMock.assertServiceResult(ServiceResultState.SUCCESS, ServiceResult.class, result);
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@ public class AddParameterServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
AddParameterService svc = new AddParameterService();
|
||||
AddParameterArg arg = new AddParameterArg();
|
||||
arg.locator = Locator.valueOf("Resource/Ball/yellow/Bag/parameters");
|
||||
FloatParameter parameter = new FloatParameter("diameter", "Diameter", 22.0);
|
||||
|
@ -39,6 +38,6 @@ public class AddParameterServiceTest extends AbstractRealmServiceTest {
|
|||
parameter.setUom("cm");
|
||||
arg.parameter = parameter;
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(AddParameterService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,10 +30,9 @@ public class RemoveParameterServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
RemoveParameterService svc = new RemoveParameterService();
|
||||
RemoveParameterArg arg = new RemoveParameterArg();
|
||||
arg.locator = Locator.valueOf("Resource/Ball/yellow/Bag/parameters/owner");
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(RemoveParameterService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,7 +30,6 @@ public class SetParameterServiceTest extends AbstractRealmServiceTest {
|
|||
@Test
|
||||
public void runTest() {
|
||||
|
||||
SetParameterService svc = new SetParameterService();
|
||||
SetParameterArg arg = new SetParameterArg();
|
||||
arg.locator = Locator.valueOf("Resource/Ball/yellow/Bag/parameters/owner");
|
||||
arg.name = "The Owner";
|
||||
|
@ -40,6 +39,6 @@ public class SetParameterServiceTest extends AbstractRealmServiceTest {
|
|||
arg.index = 99;
|
||||
arg.valueAsString = "someotherdude";
|
||||
|
||||
runServiceInAllRealmTypes(svc, arg);
|
||||
runServiceInAllRealmTypes(SetParameterService.class, arg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Privilege>
|
||||
|
||||
<Container>
|
||||
|
||||
<Parameters>
|
||||
<!-- parameters for the container itself -->
|
||||
<Parameter name="autoPersistOnPasswordChange" value="true" />
|
||||
</Parameters>
|
||||
|
||||
<EncryptionHandler class="ch.eitchnet.privilege.handler.DefaultEncryptionHandler">
|
||||
<Parameters>
|
||||
<Parameter name="hashAlgorithm" value="SHA-256" />
|
||||
</Parameters>
|
||||
</EncryptionHandler>
|
||||
|
||||
<PersistenceHandler class="ch.eitchnet.privilege.handler.XmlPersistenceHandler">
|
||||
<Parameters>
|
||||
<Parameter name="basePath" value="target/strolchRuntime/config" />
|
||||
<Parameter name="modelXmlFile" value="PrivilegeModel.xml" />
|
||||
</Parameters>
|
||||
</PersistenceHandler>
|
||||
|
||||
</Container>
|
||||
|
||||
<Policies>
|
||||
<Policy name="DefaultPrivilege" class="ch.eitchnet.privilege.policy.DefaultPrivilege" />
|
||||
</Policies>
|
||||
|
||||
</Privilege>
|
|
@ -0,0 +1,36 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<UsersAndRoles>
|
||||
|
||||
<Users>
|
||||
<User userId="1" username="agent">
|
||||
<State>SYSTEM</State>
|
||||
<Roles>
|
||||
<Role>agent</Role>
|
||||
</Roles>
|
||||
</User>
|
||||
<User userId="2" username="test" password="9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08">
|
||||
<Firstname>Application</Firstname>
|
||||
<Lastname>Administrator</Lastname>
|
||||
<State>ENABLED</State>
|
||||
<Locale>en_GB</Locale>
|
||||
<Roles>
|
||||
<Role>PrivilegeAdmin</Role>
|
||||
<Role>AppUser</Role>
|
||||
</Roles>
|
||||
</User>
|
||||
</Users>
|
||||
|
||||
<Roles>
|
||||
<Role name="PrivilegeAdmin" />
|
||||
<Role name="agent">
|
||||
<Privilege name="li.strolch.agent.impl.StartRealms" policy="DefaultPrivilege">
|
||||
<AllAllowed>true</AllAllowed>
|
||||
</Privilege>
|
||||
</Role>
|
||||
<Role name="AppUser">
|
||||
<Privilege name="li.strolch.service.api.Service" policy="DefaultPrivilege">
|
||||
<AllAllowed>true</AllAllowed>
|
||||
</Privilege>
|
||||
</Role>
|
||||
</Roles>
|
||||
</UsersAndRoles>
|
|
@ -7,10 +7,19 @@
|
|||
<verbose>true</verbose>
|
||||
</Properties>
|
||||
</Runtime>
|
||||
<Component>
|
||||
<name>PrivilegeHandler</name>
|
||||
<api>li.strolch.runtime.privilege.PrivilegeHandler</api>
|
||||
<impl>li.strolch.runtime.privilege.DefaultStrolchPrivilegeHandler</impl>
|
||||
<Properties>
|
||||
<privilegeConfigFile>PrivilegeConfig.xml</privilegeConfigFile>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component>
|
||||
<name>RealmHandler</name>
|
||||
<api>li.strolch.agent.api.RealmHandler</api>
|
||||
<impl>li.strolch.agent.impl.DefaultRealmHandler</impl>
|
||||
<depends>PrivilegeHandler</depends>
|
||||
<depends>PersistenceHandler</depends>
|
||||
<Properties>
|
||||
<realms>svcTransient, svcCached, svcTransactional</realms>
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Privilege>
|
||||
|
||||
<Container>
|
||||
|
||||
<Parameters>
|
||||
<!-- parameters for the container itself -->
|
||||
<Parameter name="autoPersistOnPasswordChange" value="true" />
|
||||
</Parameters>
|
||||
|
||||
<EncryptionHandler class="ch.eitchnet.privilege.handler.DefaultEncryptionHandler">
|
||||
<Parameters>
|
||||
<Parameter name="hashAlgorithm" value="SHA-256" />
|
||||
</Parameters>
|
||||
</EncryptionHandler>
|
||||
|
||||
<PersistenceHandler class="ch.eitchnet.privilege.handler.XmlPersistenceHandler">
|
||||
<Parameters>
|
||||
<Parameter name="basePath" value="target/strolchRuntime/config" />
|
||||
<Parameter name="modelXmlFile" value="PrivilegeModel.xml" />
|
||||
</Parameters>
|
||||
</PersistenceHandler>
|
||||
|
||||
</Container>
|
||||
|
||||
<Policies>
|
||||
<Policy name="DefaultPrivilege" class="ch.eitchnet.privilege.policy.DefaultPrivilege" />
|
||||
</Policies>
|
||||
|
||||
</Privilege>
|
|
@ -0,0 +1,36 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<UsersAndRoles>
|
||||
|
||||
<Users>
|
||||
<User userId="1" username="agent">
|
||||
<State>SYSTEM</State>
|
||||
<Roles>
|
||||
<Role>agent</Role>
|
||||
</Roles>
|
||||
</User>
|
||||
<User userId="2" username="admin" password="8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918">
|
||||
<Firstname>Application</Firstname>
|
||||
<Lastname>Administrator</Lastname>
|
||||
<State>ENABLED</State>
|
||||
<Locale>en_GB</Locale>
|
||||
<Roles>
|
||||
<Role>PrivilegeAdmin</Role>
|
||||
<Role>AppUser</Role>
|
||||
</Roles>
|
||||
</User>
|
||||
</Users>
|
||||
|
||||
<Roles>
|
||||
<Role name="PrivilegeAdmin" />
|
||||
<Role name="agent">
|
||||
<Privilege name="li.strolch.agent.impl.StartRealms" policy="DefaultPrivilege">
|
||||
<AllAllowed>true</AllAllowed>
|
||||
</Privilege>
|
||||
</Role>
|
||||
<Role name="AppUser">
|
||||
<Privilege name="li.strolch.service.api.Service" policy="DefaultPrivilege">
|
||||
<AllAllowed>true</AllAllowed>
|
||||
</Privilege>
|
||||
</Role>
|
||||
</Roles>
|
||||
</UsersAndRoles>
|
|
@ -7,10 +7,19 @@
|
|||
<verbose>true</verbose>
|
||||
</Properties>
|
||||
</Runtime>
|
||||
<Component>
|
||||
<name>PrivilegeHandler</name>
|
||||
<api>li.strolch.runtime.privilege.PrivilegeHandler</api>
|
||||
<impl>li.strolch.runtime.privilege.DefaultStrolchPrivilegeHandler</impl>
|
||||
<Properties>
|
||||
<privilegeConfigFile>PrivilegeConfig.xml</privilegeConfigFile>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component>
|
||||
<name>RealmHandler</name>
|
||||
<api>li.strolch.agent.api.RealmHandler</api>
|
||||
<impl>li.strolch.agent.impl.DefaultRealmHandler</impl>
|
||||
<depends>PrivilegeHandler</depends>
|
||||
<Properties>
|
||||
<tryLockTimeUnit>SECONDS</tryLockTimeUnit>
|
||||
<tryLockTime>1</tryLockTime>
|
||||
|
|
|
@ -2,10 +2,16 @@
|
|||
<UsersAndRoles>
|
||||
|
||||
<Users>
|
||||
<User userId="0" username="agent">
|
||||
<State>SYSTEM</State>
|
||||
<Roles>
|
||||
<Role>agent</Role>
|
||||
</Roles>
|
||||
</User>
|
||||
|
||||
<User userId="1" username="admin" password="8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918">
|
||||
<Firstname>Application</Firstname>
|
||||
<Surname>Administrator</Surname>
|
||||
<Lastname>Administrator</Lastname>
|
||||
<State>ENABLED</State>
|
||||
<Locale>en_GB</Locale>
|
||||
<Roles>
|
||||
|
@ -20,7 +26,7 @@
|
|||
|
||||
<User userId="2" username="bob" password="81b637d8fcd2c6da6359e6963113a1170de795e4b725b84d1e0b4cfd9ec58ce9">
|
||||
<Firstname>Bob</Firstname>
|
||||
<Surname>Bernstein</Surname>
|
||||
<Lastname>Bernstein</Lastname>
|
||||
<State>ENABLED</State>
|
||||
<Locale>en_GB</Locale>
|
||||
<Roles>
|
||||
|
@ -30,7 +36,7 @@
|
|||
</User>
|
||||
<User userId="3" username="jill" password="8cf37351b60f00084392043ce2e6256b96cea92949f90c7abce464cf164fbfa6">
|
||||
<Firstname>Jill</Firstname>
|
||||
<Surname>Johnson</Surname>
|
||||
<Lastname>Johnson</Lastname>
|
||||
<State>ENABLED</State>
|
||||
<Locale>en_GB</Locale>
|
||||
<Roles>
|
||||
|
@ -40,7 +46,7 @@
|
|||
</User>
|
||||
<User userId="4" username="sysAdmin" password="8cffb494ef5ff3f74a571206e141d4fb84f833e431b98c8b3be43727c4cbddc1">
|
||||
<Firstname>System User</Firstname>
|
||||
<Surname>Administrator</Surname>
|
||||
<Lastname>Administrator</Lastname>
|
||||
<State>SYSTEM</State>
|
||||
<Locale>en_GB</Locale>
|
||||
<Roles>
|
||||
|
@ -52,18 +58,19 @@
|
|||
</Users>
|
||||
|
||||
<Roles>
|
||||
|
||||
<Role name="PrivilegeAdmin" />
|
||||
|
||||
<Role name="agent">
|
||||
<Privilege name="li.strolch.agent.impl.StartRealms" policy="DefaultPrivilege">
|
||||
<AllAllowed>true</AllAllowed>
|
||||
</Privilege>
|
||||
</Role>
|
||||
<Role name="AppUser">
|
||||
<Privilege name="li.strolch.service.api.Service" policy="DefaultPrivilege">
|
||||
<AllAllowed>true</AllAllowed>
|
||||
</Privilege>
|
||||
</Role>
|
||||
|
||||
<Role name="sysAdmin">
|
||||
</Role>
|
||||
|
||||
<Role name="OnlyGreetingServiceRole">
|
||||
<Privilege name="li.strolch.service.api.Service" policy="DefaultPrivilege">
|
||||
<Allow>li.strolch.service.test.model.GreetingService</Allow>
|
||||
|
|
|
@ -7,10 +7,19 @@
|
|||
<verbose>true</verbose>
|
||||
</Properties>
|
||||
</Runtime>
|
||||
<Component>
|
||||
<name>PrivilegeHandler</name>
|
||||
<api>li.strolch.runtime.privilege.PrivilegeHandler</api>
|
||||
<impl>li.strolch.runtime.privilege.DefaultStrolchPrivilegeHandler</impl>
|
||||
<Properties>
|
||||
<privilegeConfigFile>PrivilegeConfig.xml</privilegeConfigFile>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component>
|
||||
<name>RealmHandler</name>
|
||||
<api>li.strolch.agent.api.RealmHandler</api>
|
||||
<impl>li.strolch.agent.impl.DefaultRealmHandler</impl>
|
||||
<depends>PrivilegeHandler</depends>
|
||||
<Properties>
|
||||
<dataStoreMode>EMPTY</dataStoreMode>
|
||||
</Properties>
|
||||
|
@ -24,13 +33,5 @@
|
|||
<verbose>true</verbose>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component>
|
||||
<name>PrivilegeHandler</name>
|
||||
<api>li.strolch.runtime.privilege.StrolchPrivilegeHandler</api>
|
||||
<impl>li.strolch.runtime.privilege.DefaultStrolchPrivilegeHandler</impl>
|
||||
<Properties>
|
||||
<privilegeConfigFile>PrivilegeConfig.xml</privilegeConfigFile>
|
||||
</Properties>
|
||||
</Component>
|
||||
</env>
|
||||
</StrolchConfiguration>
|
|
@ -1,27 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<StrolchConfiguration>
|
||||
<env id="dev">
|
||||
<Runtime>
|
||||
<applicationName>StrolchPersistenceTest</applicationName>
|
||||
<Properties>
|
||||
<verbose>true</verbose>
|
||||
</Properties>
|
||||
</Runtime>
|
||||
<Component>
|
||||
<name>RealmHandler</name>
|
||||
<api>li.strolch.agent.api.RealmHandler</api>
|
||||
<impl>li.strolch.agent.impl.DefaultRealmHandler</impl>
|
||||
<Properties>
|
||||
<dataStoreMode>EMPTY</dataStoreMode>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component>
|
||||
<name>ServiceHandler</name>
|
||||
<api>li.strolch.service.api.ServiceHandler</api>
|
||||
<impl>li.strolch.service.api.DefaultServiceHandler</impl>
|
||||
<Properties>
|
||||
<verbose>true</verbose>
|
||||
</Properties>
|
||||
</Component>
|
||||
</env>
|
||||
</StrolchConfiguration>
|
Loading…
Reference in New Issue