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