Allow to override ServerRuntimeContext creation in XMPPServer (#7)

diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
index 0a869f4..0972ab4 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
@@ -81,4 +81,6 @@
     List<Module> getModules();
 
     <T> T getModule(Class<T> clazz);
+    
+    void addModule(Module module);
 }
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
index 01baafb..f22f66b 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
@@ -34,8 +34,8 @@
 import org.apache.vysper.xmpp.authentication.AccountManagement;
 import org.apache.vysper.xmpp.authentication.Plain;
 import org.apache.vysper.xmpp.authentication.SASLMechanism;
-import org.apache.vysper.xmpp.cryptography.NonCheckingX509TrustManagerFactory;
 import org.apache.vysper.xmpp.cryptography.InputStreamBasedTLSContextFactory;
+import org.apache.vysper.xmpp.cryptography.NonCheckingX509TrustManagerFactory;
 import org.apache.vysper.xmpp.cryptography.TrustManagerFactory;
 import org.apache.vysper.xmpp.delivery.OfflineStanzaReceiver;
 import org.apache.vysper.xmpp.delivery.StanzaRelayBroker;
@@ -68,7 +68,7 @@
 
     private String serverDomain;
 
-    private DefaultServerRuntimeContext serverRuntimeContext;
+    private ServerRuntimeContext serverRuntimeContext;
 
     private StorageProviderRegistry storageProviderRegistry;
     
@@ -187,12 +187,9 @@
         stanzaRelayBroker.setInternalRelay(internalStanzaRelay);
         stanzaRelayBroker.setExternalRelay(externalStanzaRelay);
 
-        serverRuntimeContext = new DefaultServerRuntimeContext(serverEntity, stanzaRelayBroker, serverFeatures,
-                dictionaries, resourceRegistry);
-        serverRuntimeContext.setStorageProviderRegistry(storageProviderRegistry);
-        serverRuntimeContext.setTlsContextFactory(tlsContextFactory);
-
-        for(Module module : initialModules) {
+        serverRuntimeContext = createServerRuntimeContext(serverFeatures, tlsContextFactory, dictionaries,
+                resourceRegistry, serverEntity);
+        for (Module module : initialModules) {
             serverRuntimeContext.addModule(module);
         }
 
@@ -211,6 +208,17 @@
         }
     }
 
+    protected ServerRuntimeContext createServerRuntimeContext(ServerFeatures serverFeatures,
+            InputStreamBasedTLSContextFactory tlsContextFactory, List<HandlerDictionary> dictionaries,
+            ResourceRegistry resourceRegistry, EntityImpl serverEntity) {
+        DefaultServerRuntimeContext serverRuntimeContext = new DefaultServerRuntimeContext(serverEntity,
+                stanzaRelayBroker, serverFeatures, dictionaries, resourceRegistry);
+        serverRuntimeContext.setStorageProviderRegistry(storageProviderRegistry);
+        serverRuntimeContext.setTlsContextFactory(tlsContextFactory);
+
+        return serverRuntimeContext;
+    }
+
     protected ServerFeatures createServerFeatures() {
         return new ServerFeatures();
     }