diff --git a/pom.xml b/pom.xml
index 841ed79d3..64000ee0f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,6 +34,10 @@
li.strolch
li.strolch.model
+
+ ch.eitchnet
+ ch.eitchnet.privilege
+
diff --git a/src/main/java/li/strolch/runtime/component/ComponentContainer.java b/src/main/java/li/strolch/runtime/component/ComponentContainer.java
new file mode 100644
index 000000000..d3c74e286
--- /dev/null
+++ b/src/main/java/li/strolch/runtime/component/ComponentContainer.java
@@ -0,0 +1,43 @@
+package li.strolch.runtime.component;
+
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+import li.strolch.runtime.configuration.RuntimeConfiguration;
+
+public class ComponentContainer {
+
+ private Map, StrolchComponent> componentMap;
+
+ public ComponentContainer() {
+ this.componentMap = new HashMap<>();
+ }
+
+ @SuppressWarnings("unchecked")
+ public T getComponent(Class clazz) {
+ T component = (T) this.componentMap.get(clazz);
+ if (component == null) {
+ String msg = "The component does not exist for class {0}"; //$NON-NLS-1$
+ msg = MessageFormat.format(msg, clazz);
+ throw new IllegalArgumentException(msg);
+ }
+ return component;
+ }
+
+ public void setup(RuntimeConfiguration configuration) {
+
+ }
+
+ public void start() {
+
+ }
+
+ public void stop() {
+
+ }
+
+ public void destroy() {
+
+ }
+}
diff --git a/src/main/java/li/strolch/runtime/component/ComponentState.java b/src/main/java/li/strolch/runtime/component/ComponentState.java
new file mode 100644
index 000000000..e7007f6ad
--- /dev/null
+++ b/src/main/java/li/strolch/runtime/component/ComponentState.java
@@ -0,0 +1,6 @@
+package li.strolch.runtime.component;
+
+public enum ComponentState {
+
+ UNDEFINED, INITALIZED, STARTED, STOPPED, DESTROYED;
+}
diff --git a/src/main/java/li/strolch/runtime/component/StrolchComponent.java b/src/main/java/li/strolch/runtime/component/StrolchComponent.java
new file mode 100644
index 000000000..b95daf19d
--- /dev/null
+++ b/src/main/java/li/strolch/runtime/component/StrolchComponent.java
@@ -0,0 +1,67 @@
+package li.strolch.runtime.component;
+
+import java.text.MessageFormat;
+
+import li.strolch.runtime.configuration.ComponentConfiguration;
+
+public class StrolchComponent {
+
+ private ComponentState state;
+
+ public StrolchComponent() {
+ this.state = ComponentState.UNDEFINED;
+ }
+
+ public ComponentState getState() {
+ return this.state;
+ }
+
+ private IllegalStateException getIllegalStateEx(ComponentState currentState, ComponentState newState) {
+ String msg = "Moving from state {0} to state {1} is not allowed!"; //$NON-NLS-1$
+ msg = MessageFormat.format(msg, currentState, newState);
+ throw new IllegalStateException(msg);
+ }
+
+ protected void changeState(ComponentState newState) {
+ switch (this.state) {
+ case UNDEFINED:
+ if (newState != ComponentState.INITALIZED)
+ throw getIllegalStateEx(this.state, newState);
+ break;
+ case INITALIZED:
+ if (newState != ComponentState.STARTED)
+ throw getIllegalStateEx(this.state, newState);
+ break;
+ case STARTED:
+ if (newState != ComponentState.STOPPED)
+ throw getIllegalStateEx(this.state, newState);
+ break;
+ case STOPPED:
+ if (newState != ComponentState.STARTED && newState != ComponentState.DESTROYED)
+ throw getIllegalStateEx(this.state, newState);
+ break;
+ case DESTROYED:
+ throw getIllegalStateEx(this.state, newState);
+ default:
+ throw getIllegalStateEx(this.state, newState);
+ }
+
+ this.state = newState;
+ }
+
+ public void initialize(ComponentConfiguration configuration) {
+ changeState(ComponentState.INITALIZED);
+ }
+
+ public void start() {
+ changeState(ComponentState.STARTED);
+ }
+
+ public void stop() {
+ changeState(ComponentState.STOPPED);
+ }
+
+ public void destroy() {
+ changeState(ComponentState.DESTROYED);
+ }
+}
diff --git a/src/main/java/li/strolch/runtime/AbstractionConfiguration.java b/src/main/java/li/strolch/runtime/configuration/AbstractionConfiguration.java
similarity index 98%
rename from src/main/java/li/strolch/runtime/AbstractionConfiguration.java
rename to src/main/java/li/strolch/runtime/configuration/AbstractionConfiguration.java
index 73ac6283a..a7159ac40 100644
--- a/src/main/java/li/strolch/runtime/AbstractionConfiguration.java
+++ b/src/main/java/li/strolch/runtime/configuration/AbstractionConfiguration.java
@@ -1,4 +1,4 @@
-package li.strolch.runtime;
+package li.strolch.runtime.configuration;
import java.text.MessageFormat;
import java.util.Map;
diff --git a/src/main/java/li/strolch/runtime/ComponentConfiguration.java b/src/main/java/li/strolch/runtime/configuration/ComponentConfiguration.java
similarity index 92%
rename from src/main/java/li/strolch/runtime/ComponentConfiguration.java
rename to src/main/java/li/strolch/runtime/configuration/ComponentConfiguration.java
index 0c4288183..f3ec38c94 100644
--- a/src/main/java/li/strolch/runtime/ComponentConfiguration.java
+++ b/src/main/java/li/strolch/runtime/configuration/ComponentConfiguration.java
@@ -1,4 +1,4 @@
-package li.strolch.runtime;
+package li.strolch.runtime.configuration;
import java.util.Map;
diff --git a/src/main/java/li/strolch/runtime/RuntimeConfiguration.java b/src/main/java/li/strolch/runtime/configuration/RuntimeConfiguration.java
similarity index 53%
rename from src/main/java/li/strolch/runtime/RuntimeConfiguration.java
rename to src/main/java/li/strolch/runtime/configuration/RuntimeConfiguration.java
index e3d964191..73242a253 100644
--- a/src/main/java/li/strolch/runtime/RuntimeConfiguration.java
+++ b/src/main/java/li/strolch/runtime/configuration/RuntimeConfiguration.java
@@ -1,5 +1,7 @@
-package li.strolch.runtime;
+package li.strolch.runtime.configuration;
+import java.io.File;
+import java.text.MessageFormat;
import java.util.Map;
public class RuntimeConfiguration extends AbstractionConfiguration {
@@ -9,6 +11,12 @@ public class RuntimeConfiguration extends AbstractionConfiguration {
public RuntimeConfiguration(Map configurationValues, String rootPath) {
super(RUNTIME, configurationValues);
+ File rootPathF = new File(rootPath);
+ if (!rootPathF.isDirectory() || !rootPathF.canRead()) {
+ String msg = "Root path is not readable at {0}"; //$NON-NLS-1$
+ msg = MessageFormat.format(msg, rootPath);
+ throw new StrolchConfigurationException(msg);
+ }
this.rootPath = rootPath;
}
diff --git a/src/main/java/li/strolch/runtime/StrolchConfiguration.java b/src/main/java/li/strolch/runtime/configuration/StrolchConfiguration.java
similarity index 96%
rename from src/main/java/li/strolch/runtime/StrolchConfiguration.java
rename to src/main/java/li/strolch/runtime/configuration/StrolchConfiguration.java
index 538629ef5..a33c6cdfb 100644
--- a/src/main/java/li/strolch/runtime/StrolchConfiguration.java
+++ b/src/main/java/li/strolch/runtime/configuration/StrolchConfiguration.java
@@ -1,4 +1,4 @@
-package li.strolch.runtime;
+package li.strolch.runtime.configuration;
import java.text.MessageFormat;
import java.util.Map;
diff --git a/src/main/java/li/strolch/runtime/StrolchConfigurationException.java b/src/main/java/li/strolch/runtime/configuration/StrolchConfigurationException.java
similarity index 87%
rename from src/main/java/li/strolch/runtime/StrolchConfigurationException.java
rename to src/main/java/li/strolch/runtime/configuration/StrolchConfigurationException.java
index 47e6e5ee0..01782cf1f 100644
--- a/src/main/java/li/strolch/runtime/StrolchConfigurationException.java
+++ b/src/main/java/li/strolch/runtime/configuration/StrolchConfigurationException.java
@@ -1,4 +1,4 @@
-package li.strolch.runtime;
+package li.strolch.runtime.configuration;
public class StrolchConfigurationException extends RuntimeException {
diff --git a/src/main/java/li/strolch/runtime/privilege/StrolchPrivilegeHandler.java b/src/main/java/li/strolch/runtime/privilege/StrolchPrivilegeHandler.java
new file mode 100644
index 000000000..32cd2242b
--- /dev/null
+++ b/src/main/java/li/strolch/runtime/privilege/StrolchPrivilegeHandler.java
@@ -0,0 +1,42 @@
+package li.strolch.runtime.privilege;
+
+import java.io.File;
+
+import li.strolch.runtime.component.ComponentState;
+import li.strolch.runtime.component.StrolchComponent;
+import li.strolch.runtime.configuration.ComponentConfiguration;
+import ch.eitchnet.privilege.base.PrivilegeException;
+import ch.eitchnet.privilege.handler.PrivilegeHandler;
+import ch.eitchnet.privilege.helper.PrivilegeInitializationHelper;
+import ch.eitchnet.privilege.model.Certificate;
+
+public class StrolchPrivilegeHandler extends StrolchComponent {
+
+ private PrivilegeHandler privilegeHandler;
+
+ @Override
+ public void initialize(ComponentConfiguration configuration) {
+ super.initialize(configuration);
+
+ // initialize privilege
+ File privilegeConfigFile = new File(configuration.getRuntimeConfiguration().getRootPath()
+ + "/config/Privilege.xml");
+ this.privilegeHandler = PrivilegeInitializationHelper.initializeFromXml(privilegeConfigFile);
+ }
+
+ public Certificate authenticate(String username, byte[] password) {
+ assertStarted();
+ return this.privilegeHandler.authenticate(username, password);
+ }
+
+ public void isCertificateValid(Certificate certificate) throws PrivilegeException {
+ assertStarted();
+ this.privilegeHandler.isCertificateValid(certificate);
+ }
+
+ private void assertStarted() {
+ if (getState() != ComponentState.STARTED)
+ throw new IllegalStateException("Component StrolchPrivilegeHandler is not yet started!"); //$NON-NLS-1$
+ }
+
+}
diff --git a/src/test/java/li/strolch/runtime/ComponentContainerTest.java b/src/test/java/li/strolch/runtime/ComponentContainerTest.java
new file mode 100644
index 000000000..3fb3cd542
--- /dev/null
+++ b/src/test/java/li/strolch/runtime/ComponentContainerTest.java
@@ -0,0 +1,12 @@
+package li.strolch.runtime;
+
+import org.junit.Test;
+
+public class ComponentContainerTest {
+
+ @Test
+ public void shouldStartContainer() {
+
+ }
+
+}
diff --git a/src/test/resources/StrolchConfiguration.xml b/src/test/resources/StrolchConfiguration.xml
new file mode 100644
index 000000000..1e53e9755
--- /dev/null
+++ b/src/test/resources/StrolchConfiguration.xml
@@ -0,0 +1,22 @@
+
+
+
+ StrolchRuntimeTest
+
+ target/
+
+
+
+ li.strolch.service.ServiceHandler
+ li.strolch.service.SimpleServiceHandler
+
+
+
+
+ li.strolch.persistence.api.StrolchPersistenceHandler
+ li.strolch.persistence.impl.XmlPersistenceHandler
+
+ true
+
+
+
\ No newline at end of file