You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by be...@apache.org on 2009/08/03 18:33:31 UTC

svn commit: r800455 - in /mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper: storage/OpenStorageProviderRegistry.java storage/StorageProviderRegistry.java storage/inmemory/MemoryStorageProviderRegistry.java xmpp/server/ServerMain.java

Author: berndf
Date: Mon Aug  3 16:33:30 2009
New Revision: 800455

URL: http://svn.apache.org/viewvc?rev=800455&view=rev
Log:
allow to specify additional modules on the command line (VYSPER-167).

Modified:
    mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/OpenStorageProviderRegistry.java
    mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/StorageProviderRegistry.java
    mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/inmemory/MemoryStorageProviderRegistry.java
    mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerMain.java

Modified: mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/OpenStorageProviderRegistry.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/OpenStorageProviderRegistry.java?rev=800455&r1=800454&r2=800455&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/OpenStorageProviderRegistry.java (original)
+++ mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/OpenStorageProviderRegistry.java Mon Aug  3 16:33:30 2009
@@ -28,7 +28,8 @@
 import java.util.Set;
 
 /**
- *
+ * multi-purpose storage provider registry. it is recommended to re-use this
+ * class as a base class for own extensions.
  * @author The Apache MINA Project (dev@mina.apache.org)
  */
 public class OpenStorageProviderRegistry implements StorageProviderRegistry {
@@ -65,6 +66,26 @@
         }
     }
 
+    public void add(String storageProviderFQClassname) {
+        Class<StorageProvider> storageProviderClass;
+        try {
+            storageProviderClass = (Class<StorageProvider>)Class.forName(storageProviderFQClassname);
+        } catch (ClassCastException e) {
+            System.err.println("not a Vysper storage provider class: " + storageProviderFQClassname);
+            return;
+        } catch (ClassNotFoundException e) {
+            System.err.println("could not load storage provider class " + storageProviderFQClassname);
+            return;
+        }
+        try {
+            StorageProvider storageProvider = storageProviderClass.newInstance();
+            add(storageProvider);
+        } catch (Exception e) {
+            System.err.println("failed to instantiate storage provider class " + storageProviderFQClassname);
+            return;
+        }
+    }
+
     private Set<Class> getStorageProviderInterfaces(Class clazz) {
         Set<Class> storageProviderInterfaces = new HashSet<Class>();
 

Modified: mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/StorageProviderRegistry.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/StorageProviderRegistry.java?rev=800455&r1=800454&r2=800455&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/StorageProviderRegistry.java (original)
+++ mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/StorageProviderRegistry.java Mon Aug  3 16:33:30 2009
@@ -20,11 +20,34 @@
 package org.apache.vysper.storage;
 
 /**
- *
+ * This registry bundles storage providers. It is primarily intended for
+ * grouping for one kind of underlying storage, for example in-memory, SQL
+ * or JCR, but custom mixed collections are possible. 
+ * 
  * @author The Apache MINA Project (dev@mina.apache.org)
  */
 public interface StorageProviderRegistry {
+
+    /**
+     * access the ready-to-go storage provider instance implementing the
+     * given interface
+     * @param clazz a class implementing StorageProvider 
+     * @return the fully initialized storage provider
+     */
     StorageProvider retrieve(Class<? extends StorageProvider> clazz);
 
+    /**
+     * adds a storage provider implementation to the registry
+     * @param storageProvider
+     */
     void add(StorageProvider storageProvider);
+
+    /**
+     * adds a storage provider implementaton to the registry
+     * the registry is responsible for instantiating the given class 
+     * @param storageProviderFullQualifiedClassname fully qualified
+     * class name of the implementation. the implementation must have a public
+     * no-argument constructor
+     */
+    void add(String  storageProviderFullQualifiedClassname);
 }

Modified: mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/inmemory/MemoryStorageProviderRegistry.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/inmemory/MemoryStorageProviderRegistry.java?rev=800455&r1=800454&r2=800455&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/inmemory/MemoryStorageProviderRegistry.java (original)
+++ mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/inmemory/MemoryStorageProviderRegistry.java Mon Aug  3 16:33:30 2009
@@ -33,6 +33,10 @@
     public MemoryStorageProviderRegistry() {
         add(new SimpleUserAuthorization());
         add(new MemoryRosterManager());
+        
+        // provider from external modules, low coupling, fail when modules are not present
+        add("org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.storageprovider.LeafNodeInMemoryStorageProvider");
+        add("org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.storageprovider.CollectionnodeInMemoryStorageProvider");
     }
 
 }
\ No newline at end of file

Modified: mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerMain.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerMain.java?rev=800455&r1=800454&r2=800455&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerMain.java (original)
+++ mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerMain.java Mon Aug  3 16:33:30 2009
@@ -20,9 +20,12 @@
 package org.apache.vysper.xmpp.server;
 
 import java.io.File;
+import java.util.List;
+import java.util.ArrayList;
 
 import org.apache.vysper.mina.TCPEndpoint;
 import org.apache.vysper.storage.StorageProviderRegistry;
+import org.apache.vysper.storage.jcr.JcrStorageProviderRegistry;
 import org.apache.vysper.storage.inmemory.MemoryStorageProviderRegistry;
 import org.apache.vysper.xmpp.addressing.EntityFormatException;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
@@ -32,6 +35,8 @@
 import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule;
 import org.apache.vysper.xmpp.modules.extension.xep0119_xmppping.XmppPingModule;
 import org.apache.vysper.xmpp.modules.extension.xep0202_entity_time.EntityTimeModule;
+import org.apache.vysper.xmpp.modules.extension.xep0049_privatedata.PrivateDataModule;
+import org.apache.vysper.xmpp.modules.Module;
 
 /**
  * starts the server as a standalone application
@@ -42,20 +47,37 @@
 
     /**
      * boots the server as a standalone application
-     * found on the classpath
+     * 
+     * adding a module from the command line:
+     * using a runtime property, one or more modules can be specified, like this:
+     * -Dvysper.add.module=org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PublishSubscribeModule,... more ...
+     * 
      * @param args
      */
     public static void main(String[] args) throws AccountCreationException, EntityFormatException {
 
+        String addedModuleProperty = System.getProperty("vysper.add.module");
+        List<Module> listOfModules = null;
+        if (addedModuleProperty != null) {
+            String[] moduleClassNames = addedModuleProperty.split(",");
+            listOfModules = createModuleInstances(moduleClassNames);
+        }
+
         // choose the storage you want to use
         //StorageProviderRegistry providerRegistry = new JcrStorageProviderRegistry();
         StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();
-        
-        final AccountManagement accountManagement = (AccountManagement) providerRegistry.retrieve(AccountManagement.class);
 
-        if(!accountManagement.verifyAccountExists(EntityImpl.parse("user1@vysper.org"))) accountManagement.addUser("user1@vysper.org", "password1");
-        if(!accountManagement.verifyAccountExists(EntityImpl.parse("user2@vysper.org"))) accountManagement.addUser("user2@vysper.org", "password1");
-        if(!accountManagement.verifyAccountExists(EntityImpl.parse("user3@vysper.org"))) accountManagement.addUser("user3@vysper.org", "password1");
+        final AccountManagement accountManagement = (AccountManagement)providerRegistry.retrieve(AccountManagement.class);
+
+        if (!accountManagement.verifyAccountExists(EntityImpl.parse("user1@vysper.org"))) {
+            accountManagement.addUser("user1@vysper.org", "password1");
+        }
+        if (!accountManagement.verifyAccountExists(EntityImpl.parse("user2@vysper.org"))) {
+            accountManagement.addUser("user2@vysper.org", "password1");
+        }
+        if (!accountManagement.verifyAccountExists(EntityImpl.parse("user3@vysper.org"))) {
+            accountManagement.addUser("user3@vysper.org", "password1");
+        }
 
         XMPPServer server = new XMPPServer("vysper.org");
         server.addEndpoint(new TCPEndpoint());
@@ -75,5 +97,37 @@
         server.addModule(new EntityTimeModule());
         server.addModule(new VcardTempModule());
         server.addModule(new XmppPingModule());
+        server.addModule(new PrivateDataModule());
+
+        if (listOfModules != null) {
+            for (Module module : listOfModules) {
+                server.addModule(module);
+            }
+        }
+    }
+
+    private static List<Module> createModuleInstances(String[] moduleClassNames) {
+        List<Module> modules = new ArrayList<Module>();
+        
+        for (String moduleClassName : moduleClassNames) {
+            Class<Module> moduleClass;
+            try {
+                moduleClass = (Class<Module>)Class.forName(moduleClassName);
+            } catch (ClassCastException e) {
+                System.err.println("not a Vysper module class: " + moduleClassName);
+                continue;
+            } catch (ClassNotFoundException e) {
+                System.err.println("could not load module class " + moduleClassName);
+                continue;
+            }
+            try {
+                Module module = moduleClass.newInstance();
+                modules.add(module);
+            } catch (Exception e) {
+                System.err.println("failed to instantiate module class " + moduleClassName);
+                continue;
+            }
+        }
+        return modules;
     }
 }