Make ServerRuntimeContext.getStorageProvider generic
diff --git a/server/core/src/main/java/org/apache/vysper/storage/OpenStorageProviderRegistry.java b/server/core/src/main/java/org/apache/vysper/storage/OpenStorageProviderRegistry.java
index 4e2c25b..01d6313 100644
--- a/server/core/src/main/java/org/apache/vysper/storage/OpenStorageProviderRegistry.java
+++ b/server/core/src/main/java/org/apache/vysper/storage/OpenStorageProviderRegistry.java
@@ -48,8 +48,9 @@
         storageServices.putAll(entries);
     }
 
-    public StorageProvider retrieve(Class<? extends StorageProvider> clazz) {
-        return storageServices.get(clazz);
+    @SuppressWarnings("unchecked")
+    public <T extends StorageProvider> T retrieve(Class<T> clazz) {
+        return (T) storageServices.get(clazz);
     }
 
     /**
diff --git a/server/core/src/main/java/org/apache/vysper/storage/StorageProviderRegistry.java b/server/core/src/main/java/org/apache/vysper/storage/StorageProviderRegistry.java
index 1644442..9b9114a 100644
--- a/server/core/src/main/java/org/apache/vysper/storage/StorageProviderRegistry.java
+++ b/server/core/src/main/java/org/apache/vysper/storage/StorageProviderRegistry.java
@@ -34,7 +34,7 @@
      * @param clazz a class implementing StorageProvider 
      * @return the fully initialized storage provider
      */
-    StorageProvider retrieve(Class<? extends StorageProvider> clazz);
+    <T extends StorageProvider> T retrieve(Class<T> clazz);
 
     /**
      * adds a storage provider implementation to the registry
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java
index 4abcada..461fd77 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java
@@ -262,7 +262,7 @@
         registry.setResourcePriority(resourceId, presenceStanza.getPrioritySafe());
 
 		// check for pending offline stored stanzas, and send them out 
-		OfflineStorageProvider offlineProvider = (OfflineStorageProvider) serverRuntimeContext
+		OfflineStorageProvider offlineProvider = serverRuntimeContext
 				.getStorageProvider(OfflineStorageProvider.class);
 		if (offlineProvider == null) {
 			logger.warn("No Offline Storage Provider configured");
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0049_privatedata/PrivateDataModule.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0049_privatedata/PrivateDataModule.java
index efa320a..91faa6f 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0049_privatedata/PrivateDataModule.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0049_privatedata/PrivateDataModule.java
@@ -49,7 +49,7 @@
     public void initialize(ServerRuntimeContext serverRuntimeContext) {
         super.initialize(serverRuntimeContext);
 
-        PrivateDataPersistenceManager persistenceManager = (PrivateDataPersistenceManager) serverRuntimeContext
+        PrivateDataPersistenceManager persistenceManager = serverRuntimeContext
                 .getStorageProvider(PrivateDataPersistenceManager.class);
         if (persistenceManager == null) {
             logger.error("no PrivateDataPersistenceManager found");
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempModule.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempModule.java
index d7e68d3..20810f0 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempModule.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0054_vcardtemp/VcardTempModule.java
@@ -49,7 +49,7 @@
     public void initialize(ServerRuntimeContext serverRuntimeContext) {
         super.initialize(serverRuntimeContext);
 
-        VcardTempPersistenceManager persistenceManager = (VcardTempPersistenceManager) serverRuntimeContext
+        VcardTempPersistenceManager persistenceManager = serverRuntimeContext
                 .getStorageProvider(VcardTempPersistenceManager.class);
         if (persistenceManager == null) {
             logger.error("no VcardTempPersistenceManager found");
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0077_inbandreg/InBandRegistrationHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0077_inbandreg/InBandRegistrationHandler.java
index 0987bb9..1f39b8a 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0077_inbandreg/InBandRegistrationHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0077_inbandreg/InBandRegistrationHandler.java
@@ -116,7 +116,7 @@
                 String password = passwordElm.getInnerText().getText();
                 if(password.trim().length() == 0) throw new XMLSemanticError("Invalid password");
     
-                AccountManagement accountManagement = (AccountManagement) serverRuntimeContext.getStorageProvider(AccountManagement.class);
+                AccountManagement accountManagement = serverRuntimeContext.getStorageProvider(AccountManagement.class);
                 Entity user;
                 if(username.contains("@")) {
                     user = EntityImpl.parse(username);
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0133_service_administration/ServiceAdministrationModule.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0133_service_administration/ServiceAdministrationModule.java
index ea2212c..7bd7754 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0133_service_administration/ServiceAdministrationModule.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0133_service_administration/ServiceAdministrationModule.java
@@ -133,7 +133,7 @@
     public AdhocCommandHandler getCommandHandler(String commandNode, Entity executingUser) {
         if (executingUser == null) return null;
 
-        final AccountManagement accountManagement = (AccountManagement)serverRuntimeContext.getStorageProvider(AccountManagement.class);
+        final AccountManagement accountManagement = serverRuntimeContext.getStorageProvider(AccountManagement.class);
         final ResourceRegistry resourceRegistry = serverRuntimeContext.getResourceRegistry();
         
         if (!admins.contains(executingUser.getBareJID())) {
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/roster/handler/RosterIQHandler.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/roster/handler/RosterIQHandler.java
index a1b8610..cc3081c 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/roster/handler/RosterIQHandler.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/roster/handler/RosterIQHandler.java
@@ -89,7 +89,7 @@
     protected List<Stanza> handleGet(IQStanza stanza, ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext) {
 
         ResourceRegistry registry = serverRuntimeContext.getResourceRegistry();
-        RosterManager rosterManager = (RosterManager) serverRuntimeContext.getStorageProvider(RosterManager.class);
+        RosterManager rosterManager = serverRuntimeContext.getStorageProvider(RosterManager.class);
 
         if (rosterManager == null) {
             return handleCannotRetrieveRoster(stanza, sessionContext);
@@ -131,7 +131,7 @@
             @SpecCompliant(spec = "rfc3921bis-08", section = "2.5", status = FINISHED, coverage = COMPLETE, comment = "only calling from here") })
     @Override
     protected List<Stanza> handleSet(IQStanza stanza, ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext) {
-        RosterManager rosterManager = (RosterManager) serverRuntimeContext.getStorageProvider(RosterManager.class);
+        RosterManager rosterManager = serverRuntimeContext.getStorageProvider(RosterManager.class);
 
         if (rosterManager == null) {
             return handleCannotRetrieveRoster(stanza, sessionContext);
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/modules/roster/persistence/RosterManagerUtils.java b/server/core/src/main/java/org/apache/vysper/xmpp/modules/roster/persistence/RosterManagerUtils.java
index 6e1e3c1..2b480b7 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/modules/roster/persistence/RosterManagerUtils.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/modules/roster/persistence/RosterManagerUtils.java
@@ -38,7 +38,7 @@
             SessionContext sessionContext) {
         RosterManager rosterManager;
         try {
-            rosterManager = (RosterManager) serverRuntimeContext.getStorageProvider(RosterManager.class);
+            rosterManager = serverRuntimeContext.getStorageProvider(RosterManager.class);
         } catch (Exception e) {
             // System.err.println("failed to retrieve roster manager for session id = " + sessionContext.getSessionId());
             String sessionId = sessionContext == null ? "NO_SESSION" : sessionContext.getSessionId();
diff --git a/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java b/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
index 439a6c3..56a7475 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
@@ -260,6 +260,7 @@
      * @param name
      * @return
      */
+    @Override
     public ServerRuntimeContextService getServerRuntimeContextService(String name) {
         return serverRuntimeContextServiceMap.get(name);
     }
@@ -279,7 +280,7 @@
      * @param clazz
      * @return
      */
-    public StorageProvider getStorageProvider(Class<? extends StorageProvider> clazz) {
+    public <T extends StorageProvider> T getStorageProvider(Class<T> clazz) {
         return storageProviderRegistry.retrieve(clazz);
     }
 
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 88ebbb3..13a4c90 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
@@ -71,7 +71,7 @@
 
     ServerRuntimeContextService getServerRuntimeContextService(String name);
 
-    StorageProvider getStorageProvider(Class<? extends StorageProvider> clazz);
+    <T extends StorageProvider> T getStorageProvider(Class<T> clazz);
 
     void registerComponent(Component component);
 
diff --git a/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java b/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java
index 71f4422..1aaa388 100644
--- a/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java
+++ b/server/extensions/xep0045-muc/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/MUCModule.java
@@ -105,9 +105,9 @@
         processor.addHandler(new MUCIqAdminHandler(conference));
         stanzaProcessor = processor;
 
-        RoomStorageProvider roomStorageProvider = (RoomStorageProvider) serverRuntimeContext
+        RoomStorageProvider roomStorageProvider = serverRuntimeContext
                 .getStorageProvider(RoomStorageProvider.class);
-        OccupantStorageProvider occupantStorageProvider = (OccupantStorageProvider) serverRuntimeContext
+        OccupantStorageProvider occupantStorageProvider = serverRuntimeContext
                 .getStorageProvider(OccupantStorageProvider.class);
 
         if (roomStorageProvider == null) {
diff --git a/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java b/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java
index fca334c..9ae9448 100644
--- a/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java
+++ b/server/extensions/xep0060-pubsub/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/PublishSubscribeModule.java
@@ -120,9 +120,9 @@
 
         fullDomain = EntityUtils.createComponentDomain(subdomain, serverRuntimeContext);
 
-        CollectionNodeStorageProvider collectionNodeStorageProvider = (CollectionNodeStorageProvider) serverRuntimeContext
+        CollectionNodeStorageProvider collectionNodeStorageProvider = serverRuntimeContext
                 .getStorageProvider(CollectionNodeStorageProvider.class);
-        LeafNodeStorageProvider leafNodeStorageProvider = (LeafNodeStorageProvider) serverRuntimeContext
+        LeafNodeStorageProvider leafNodeStorageProvider = serverRuntimeContext
                 .getStorageProvider(LeafNodeStorageProvider.class);
 
         if (collectionNodeStorageProvider == null) {
diff --git a/server/extensions/xep0065-socks/src/test/java/org/apache/vysper/xmpp/extension/xep0065_socks/Socks5IntegrationTest.java b/server/extensions/xep0065-socks/src/test/java/org/apache/vysper/xmpp/extension/xep0065_socks/Socks5IntegrationTest.java
index 4d63419..96d4390 100644
--- a/server/extensions/xep0065-socks/src/test/java/org/apache/vysper/xmpp/extension/xep0065_socks/Socks5IntegrationTest.java
+++ b/server/extensions/xep0065-socks/src/test/java/org/apache/vysper/xmpp/extension/xep0065_socks/Socks5IntegrationTest.java
@@ -202,7 +202,7 @@
         server.start();
         System.out.println("vysper server is running...");
 
-        RosterManager rosterManager = (RosterManager) server.getServerRuntimeContext()
+        RosterManager rosterManager = server.getServerRuntimeContext()
                 .getStorageProvider(RosterManager.class);
         rosterManager.addContact(USER1, new RosterItem(USER2, SubscriptionType.BOTH));
         rosterManager.addContact(USER2, new RosterItem(USER1, SubscriptionType.BOTH));