You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by in...@apache.org on 2008/12/03 17:29:31 UTC

svn commit: r722959 - in /synapse/trunk/java/modules: core/src/main/java/org/apache/synapse/config/ utils/src/main/java/org/apache/synapse/commons/util/ utils/src/main/java/org/apache/synapse/commons/util/datasource/ utils/src/main/java/org/apache/syna...

Author: indika
Date: Wed Dec  3 08:29:31 2008
New Revision: 722959

URL: http://svn.apache.org/viewvc?rev=722959&view=rev
Log:
Improve JNDI based DataSource registration
Add RMIRegistry controler to make multiple RMIRegistry if need or shared a single regsitry by many datasources

Modified:
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/SynapseConfiguration.java
    synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/RMIRegistryController.java
    synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceConfigurationConstants.java
    synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceInformation.java
    synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/JNDIBasedDataSourceRepository.java
    synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/factory/DataSourceInformationFactory.java
    synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/serializer/DataSourceInformationSerializer.java

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/SynapseConfiguration.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/SynapseConfiguration.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/SynapseConfiguration.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/SynapseConfiguration.java Wed Dec  3 08:29:31 2008
@@ -811,7 +811,7 @@
 
         // clear session information used for SA load balancing
         try {
-            RMIRegistryController.getInstance().removeLocalRegistry();
+            RMIRegistryController.getInstance().shutDown();
             SALSessions.getInstance().reset();
             InMemoryDataSourceRepository.getInstance().clear();
             JNDIBasedDataSourceRepository registry = JNDIBasedDataSourceRepository.getInstance();

Modified: synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/RMIRegistryController.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/RMIRegistryController.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/RMIRegistryController.java (original)
+++ synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/RMIRegistryController.java Wed Dec  3 08:29:31 2008
@@ -11,14 +11,15 @@
 import java.rmi.registry.LocateRegistry;
 import java.rmi.registry.Registry;
 import java.rmi.server.UnicastRemoteObject;
+import java.util.HashMap;
+import java.util.Map;
 
 public class RMIRegistryController {
 
     public static final Log log = LogFactory.getLog(RMIRegistryController.class);
 
     private static RMIRegistryController ourInstance = new RMIRegistryController();
-    private Registry localRegistry;
-    private boolean weCreatedRMIReg = false;
+    private final Map<String, Registry> registriesCache = new HashMap<String, Registry>();
 
     public static RMIRegistryController getInstance() {
         return ourInstance;
@@ -30,11 +31,28 @@
     /**
      * Creates a RMI local registry with given port
      *
-     * @param port The port
+     * @param port The port of the RMI registry to be created
      */
     public void createLocalRegistry(int port) {
+
         try {
-            localRegistry = LocateRegistry.createRegistry(port);
+
+            String key = toKey(port);
+
+            if (registriesCache.containsKey(key)) {
+                if (log.isDebugEnabled()) {
+                    log.debug("There is an RMI registry bound to given port :" + port);
+                }
+                return;
+            }
+
+            Registry locateRegistry = LocateRegistry.createRegistry(port);
+            if (locateRegistry == null) {
+                handleException("Unable to create a RMI registry with port : " + port);
+            }
+
+            registriesCache.put(key, locateRegistry);
+
         } catch (RemoteException e) {
             String msg = "Couldn't create a local registry(RMI) : port " + port +
                     " already in use.";
@@ -44,19 +62,65 @@
 
     /**
      * removes if there is a RMI local registry instance
+     *
+     * @param port The port of the RMI registry to be removed
+     */
+    public void removeLocalRegistry(int port) {
+
+        String key = toKey(port);
+        if (registriesCache.containsKey(key)) {
+            removeRegistry(key, registriesCache.get(key));
+        } else {
+            if (log.isDebugEnabled()) {
+                log.debug("There is no RMi registry for port : " + port);
+            }
+        }
+
+    }
+
+    /**
+     * Removes all registered RMI registries
      */
-    public void removeLocalRegistry() {
-        if (localRegistry != null) {
+    public void shutDown() {
+
+        for (String key : registriesCache.keySet()) {
+            removeRegistry(key, registriesCache.get(key));
+        }
+        registriesCache.clear();
+    }
+
+    /**
+     * Helper method to remove a RMI registry instance
+     *
+     * @param key      The port of the RMI registry to be removed
+     * @param registry Registry instance
+     */
+    private static void removeRegistry(String key, Registry registry) {
+
+        if (registry != null) {
             try {
-                log.info("Removing the RMI registy instance from the RMI runtime ");
-                UnicastRemoteObject.unexportObject(localRegistry, true);
+                log.info("Removing the RMI registry bound to port : " + key);
+                UnicastRemoteObject.unexportObject(registry, true);
             } catch (NoSuchObjectException e) {
                 String msg = "Error when stopping localregistry(RMI)";
                 handleException(msg, e);
             }
         }
+
     }
 
+    private static String toKey(int port) {
+
+        assertPositive(port);
+        return String.valueOf(port);
+    }
+
+    private static void assertPositive(int port) {
+
+        if (port < 0) {
+            handleException("Invalid port number : " + port);
+        }
+    }
 
     /**
      * Helper methods for handle errors.
@@ -69,4 +133,14 @@
         throw new SynapseUtilException(msg, e);
     }
 
+    /**
+     * Helper methods for handle errors.
+     *
+     * @param msg The error message
+     */
+    private static void handleException(String msg) {
+        log.error(msg);
+        throw new SynapseUtilException(msg);
+    }
+
 }

Modified: synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceConfigurationConstants.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceConfigurationConstants.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceConfigurationConstants.java (original)
+++ synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceConfigurationConstants.java Wed Dec  3 08:29:31 2008
@@ -81,5 +81,7 @@
     public static final String PROP_FACTORY = "factory";
     public static final String PROP_NAME = "name";
     public static final String DATASOURCE_INFORMATION_REPOSITORY = "DataSourceInformationRepository";
+    public static final String DEFAULT_IC_FACTORY = "com.sun.jndi.rmi.registry.RegistryContextFactory";
+    public static final int DEFAULT_PROVIDER_PORT = 2199;
 
 }

Modified: synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceInformation.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceInformation.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceInformation.java (original)
+++ synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceInformation.java Wed Dec  3 08:29:31 2008
@@ -314,6 +314,12 @@
         this.properties.putAll(properties);
     }
 
+    public void addProperty(String name, String value) {
+        if (name != null && value != null && !"".equals(name) && !"".equals(value)) {
+            this.properties.put(name, value);
+        }
+    }
+
     public String getRepositoryType() {
         return repositoryType;
     }

Modified: synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/JNDIBasedDataSourceRepository.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/JNDIBasedDataSourceRepository.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/JNDIBasedDataSourceRepository.java (original)
+++ synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/JNDIBasedDataSourceRepository.java Wed Dec  3 08:29:31 2008
@@ -81,27 +81,41 @@
         String dataSourceName = information.getDatasourceName();
         validateDSName(dataSourceName);
         Properties properties = information.getProperties();
-        
+
         InitialContext context = null;
         Properties jndiEvn = null;
 
-        if (properties != null && !properties.isEmpty()) {
-            jndiEvn = createJNDIEnvironment(properties, information.getAlias());
-            context = createInitialContext(jndiEvn);
+        if (properties == null || properties.isEmpty()) {
+            if (initialContext != null) {
+                context = initialContext;
+                if (log.isDebugEnabled()) {
+                    log.debug("Empty JNDI properties for datasource " + dataSourceName);
+                    log.debug("Using system-wide jndi properties : " + jndiProperties);
+                }
+
+                jndiEvn = jndiProperties;
+            }
         }
+
         if (context == null) {
 
-            validateInitialContext(initialContext);
-            context = initialContext;
+            jndiEvn = createJNDIEnvironment(properties, information.getAlias());
+            context = createInitialContext(jndiEvn);
 
-            if (log.isDebugEnabled()) {
-                log.debug("Cannot create a name context with jndi properties : " + jndiEvn);
-                log.debug("Using system-wide jndi properties : " + jndiProperties);
-            }
+            if (context == null) {
 
-            jndiEvn = jndiProperties;
-        } else {
-            perDataSourceICMap.put(dataSourceName, context);
+                validateInitialContext(initialContext);
+                context = initialContext;
+
+                if (log.isDebugEnabled()) {
+                    log.debug("Cannot create a name context with provided jndi properties : " + jndiEvn);
+                    log.debug("Using system-wide JNDI properties : " + jndiProperties);
+                }
+
+                jndiEvn = jndiProperties;
+            } else {
+                perDataSourceICMap.put(dataSourceName, context);
+            }
         }
 
         String dsType = information.getType();
@@ -376,27 +390,44 @@
 
     private static Properties createJNDIEnvironment(Properties dsProperties, String name) {
 
-        StringBuffer buffer = new StringBuffer();
-        buffer.append(DataSourceConfigurationConstants.PROP_SYNAPSE_DATASOURCES);
-        buffer.append(DataSourceConfigurationConstants.DOT_STRING);
-        if (name != null && !"".equals(name)) {
-            buffer.append(name);
-            buffer.append(DataSourceConfigurationConstants.DOT_STRING);
-        }
-        // The prefix for root level jndiProperties
-        String rootPrefix = buffer.toString();
+        String namingFactory = DataSourceConfigurationConstants.DEFAULT_IC_FACTORY;
+        String providerUrl = null;
+        int port = DataSourceConfigurationConstants.DEFAULT_PROVIDER_PORT;
+        String providerPort = null;
         // setting naming provider
         Properties jndiEvn = new Properties();  //This is needed for PerUserPoolDatasource
 
-        String namingFactory = MiscellaneousUtil.getProperty(
-                dsProperties, rootPrefix + DataSourceConfigurationConstants.PROP_ICFACTORY,
-                "com.sun.jndi.rmi.registry.RegistryContextFactory");
+        if (dsProperties != null && !dsProperties.isEmpty()) {
 
-        jndiEvn.put(Context.INITIAL_CONTEXT_FACTORY, namingFactory);
+            if (log.isDebugEnabled()) {
+                log.debug("Using properties " + dsProperties + " to create JNDI Environment");
+            }
 
-        //Provider URL
-        String providerUrl = MiscellaneousUtil.getProperty(
-                dsProperties, rootPrefix + DataSourceConfigurationConstants.PROP_PROVIDER_URL, null);
+            StringBuffer buffer = new StringBuffer();
+            buffer.append(DataSourceConfigurationConstants.PROP_SYNAPSE_DATASOURCES);
+            buffer.append(DataSourceConfigurationConstants.DOT_STRING);
+            if (name != null && !"".equals(name)) {
+                buffer.append(name);
+                buffer.append(DataSourceConfigurationConstants.DOT_STRING);
+            }
+            // The prefix for root level jndiProperties
+            String rootPrefix = buffer.toString();
+
+
+            namingFactory = MiscellaneousUtil.getProperty(
+                    dsProperties, rootPrefix + DataSourceConfigurationConstants.PROP_ICFACTORY,
+                    DataSourceConfigurationConstants.DEFAULT_IC_FACTORY);
+
+            //Provider URL
+            providerUrl = MiscellaneousUtil.getProperty(
+                    dsProperties, rootPrefix + DataSourceConfigurationConstants.PROP_PROVIDER_URL, null);
+            providerPort =
+                    MiscellaneousUtil.getProperty(dsProperties, rootPrefix + DataSourceConfigurationConstants.PROP_PROVIDER_PORT,
+                            String.valueOf(DataSourceConfigurationConstants.DEFAULT_PROVIDER_PORT));
+
+        }
+
+        jndiEvn.put(Context.INITIAL_CONTEXT_FACTORY, namingFactory);
 
         if (providerUrl != null && !"".equals(providerUrl)) {
             if (log.isDebugEnabled()) {
@@ -426,21 +457,18 @@
             }
 
             // default port for RMI registry
-            int port = 2199;
-            String providerPort =
-                    MiscellaneousUtil.getProperty(dsProperties, rootPrefix + DataSourceConfigurationConstants.PROP_PROVIDER_PORT,
-                            String.valueOf(port));
-            try {
-                port = Integer.parseInt(providerPort);
-            } catch (NumberFormatException ignored) {
+
+            if (providerPort != null) {
+                try {
+                    port = Integer.parseInt(providerPort);
+                } catch (NumberFormatException ignored) {
+                }
             }
 
             // Create a RMI local registry
             RMIRegistryController.getInstance().createLocalRegistry(port);
+            providerUrl = "rmi://" + providerHost + ":" + port;
 
-            providerUrl = MiscellaneousUtil.getProperty(dsProperties,
-                    rootPrefix + DataSourceConfigurationConstants.PROP_PROVIDER_URL,
-                    "rmi://" + providerHost + ":" + providerPort);
         }
 
         jndiEvn.put(Context.PROVIDER_URL, providerUrl);

Modified: synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/factory/DataSourceInformationFactory.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/factory/DataSourceInformationFactory.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/factory/DataSourceInformationFactory.java (original)
+++ synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/factory/DataSourceInformationFactory.java Wed Dec  3 08:29:31 2008
@@ -235,6 +235,20 @@
         if (defaultCatalog != null && !"".equals(defaultCatalog)) {
             information.setDefaultCatalog(defaultCatalog);
         }
+
+        information.addProperty(prefix + DataSourceConfigurationConstants.PROP_ICFACTORY,
+                MiscellaneousUtil.getProperty(
+                        properties, prefix + DataSourceConfigurationConstants.PROP_ICFACTORY,
+                        null));
+        //Provider URL
+        information.addProperty(prefix + DataSourceConfigurationConstants.PROP_PROVIDER_URL,
+                MiscellaneousUtil.getProperty(
+                        properties, prefix + DataSourceConfigurationConstants.PROP_PROVIDER_URL, null));
+
+        information.addProperty(prefix + DataSourceConfigurationConstants.PROP_PROVIDER_PORT,
+                MiscellaneousUtil.getProperty(
+                        properties, prefix + DataSourceConfigurationConstants.PROP_PROVIDER_PORT, null));
+        
         return information;
     }
 

Modified: synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/serializer/DataSourceInformationSerializer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/serializer/DataSourceInformationSerializer.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/serializer/DataSourceInformationSerializer.java (original)
+++ synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/serializer/DataSourceInformationSerializer.java Wed Dec  3 08:29:31 2008
@@ -41,7 +41,8 @@
 
         // Prefix for getting particular data source's properties
         String prefix = buffer.toString();
-
+        addProperty(properties, prefix + DataSourceConfigurationConstants.PROP_DSNAME,
+                information.getDatasourceName());
         addProperty(properties, prefix + DataSourceConfigurationConstants.PROP_USER_NAME,
                 information.getUser());
         addProperty(properties, prefix + DataSourceConfigurationConstants.PROP_PASSWORD,