You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2019/05/17 07:12:08 UTC

svn commit: r1859416 - in /felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl: Activator.java persistence/PersistenceManagerTracker.java

Author: cziegeler
Date: Fri May 17 07:12:08 2019
New Revision: 1859416

URL: http://svn.apache.org/viewvc?rev=1859416&view=rev
Log:
FELIX-6131 : Add in-memory persistence manager

Modified:
    felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/Activator.java
    felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/persistence/PersistenceManagerTracker.java

Modified: felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/Activator.java
URL: http://svn.apache.org/viewvc/felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/Activator.java?rev=1859416&r1=1859415&r2=1859416&view=diff
==============================================================================
--- felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/Activator.java (original)
+++ felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/Activator.java Fri May 17 07:12:08 2019
@@ -33,6 +33,7 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceFactory;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.log.LogService;
 
@@ -89,22 +90,20 @@ public class Activator implements Bundle
         Log.logger.start(bundleContext);
 
         // register default file persistence manager
-        final PersistenceManager defaultPM = this.registerFilePersistenceManager(bundleContext);
-        if ( defaultPM == null )
-        {
-            throw new BundleException("Unable to register default persistence manager.");
-        }
+        final ServiceFactory<PersistenceManager> defaultFactory = this.registerFilePersistenceManager(bundleContext);
+
         // register memory persistence manager
         registerMemoryPersistenceManager(bundleContext);
 
         String configuredPM = bundleContext.getProperty(CM_CONFIG_PM);
-        if ( configuredPM != null && configuredPM.isEmpty() )
+        if (configuredPM != null && (configuredPM.isEmpty()
+                || FilePersistenceManager.DEFAULT_PERSISTENCE_MANAGER_NAME.equals(configuredPM)))
         {
             configuredPM = null;
         }
         try
         {
-            this.tracker = new PersistenceManagerTracker(bundleContext, defaultPM, configuredPM);
+            this.tracker = new PersistenceManagerTracker(bundleContext, defaultFactory, configuredPM);
         }
         catch ( InvalidSyntaxException iae )
         {
@@ -132,41 +131,47 @@ public class Activator implements Bundle
         this.unregisterMemoryPersistenceManager();
     }
 
-    private PersistenceManager registerFilePersistenceManager(final BundleContext bundleContext)
+    private ServiceFactory<PersistenceManager> registerFilePersistenceManager(final BundleContext bundleContext)
     {
-        try
+        final Dictionary<String, Object> props = new Hashtable<>();
+        props.put(Constants.SERVICE_DESCRIPTION, "Platform Filesystem Persistence Manager");
+        props.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
+        props.put(Constants.SERVICE_RANKING, new Integer(Integer.MIN_VALUE));
+        props.put(PersistenceManager.PROPERTY_NAME, FilePersistenceManager.DEFAULT_PERSISTENCE_MANAGER_NAME);
+
+        final ServiceFactory<PersistenceManager> factory = new ServiceFactory<PersistenceManager>()
         {
-            final FilePersistenceManager fpm = new FilePersistenceManager( bundleContext,
-                    bundleContext.getProperty( CM_CONFIG_DIR ) );
-            final Dictionary<String, Object> props = new Hashtable<>();
-            props.put( Constants.SERVICE_DESCRIPTION, "Platform Filesystem Persistence Manager" );
-            props.put( Constants.SERVICE_VENDOR, "The Apache Software Foundation" );
-            props.put( Constants.SERVICE_RANKING, new Integer( Integer.MIN_VALUE ) );
-            props.put( PersistenceManager.PROPERTY_NAME, FilePersistenceManager.DEFAULT_PERSISTENCE_MANAGER_NAME);
-            filepmRegistration = bundleContext.registerService( PersistenceManager.class, fpm, props );
 
-            return fpm;
+            private volatile FilePersistenceManager fpm;
 
-        }
-        catch ( final IllegalArgumentException iae )
-        {
-            Log.logger.log( LogService.LOG_ERROR, "Cannot create the FilePersistenceManager", iae );
-        }
-        return null;
+            @Override
+            public PersistenceManager getService(Bundle bundle, ServiceRegistration<PersistenceManager> registration) {
+                if (fpm == null) {
+                    fpm = new FilePersistenceManager(bundleContext, bundleContext.getProperty(CM_CONFIG_DIR));
+                }
+
+                return fpm;
+            }
+
+            @Override
+            public void ungetService(Bundle bundle, ServiceRegistration<PersistenceManager> registration,
+                    PersistenceManager service) {
+                // nothing to do
+            }
+
+        };
+        filepmRegistration = bundleContext.registerService(PersistenceManager.class, factory, props);
+
+        return factory;
     }
 
     private void registerMemoryPersistenceManager(final BundleContext bundleContext) {
-        try {
-            final MemoryPersistenceManager mpm = new MemoryPersistenceManager();
-            final Dictionary<String, Object> props = new Hashtable<>();
-            props.put(Constants.SERVICE_DESCRIPTION, "Platform Memory Persistence Manager");
-            props.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
-            props.put(PersistenceManager.PROPERTY_NAME, "memory");
-            memorypmRegistration = bundleContext.registerService(PersistenceManager.class, mpm, props);
-
-        } catch (final IllegalArgumentException iae) {
-            Log.logger.log(LogService.LOG_ERROR, "Cannot create the MemoryPersistenceManager", iae);
-        }
+        final MemoryPersistenceManager mpm = new MemoryPersistenceManager();
+        final Dictionary<String, Object> props = new Hashtable<>();
+        props.put(Constants.SERVICE_DESCRIPTION, "Platform Memory Persistence Manager");
+        props.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
+        props.put(PersistenceManager.PROPERTY_NAME, "memory");
+        memorypmRegistration = bundleContext.registerService(PersistenceManager.class, mpm, props);
     }
 
     private void unregisterFilePersistenceManager()

Modified: felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/persistence/PersistenceManagerTracker.java
URL: http://svn.apache.org/viewvc/felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/persistence/PersistenceManagerTracker.java?rev=1859416&r1=1859415&r2=1859416&view=diff
==============================================================================
--- felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/persistence/PersistenceManagerTracker.java (original)
+++ felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/persistence/PersistenceManagerTracker.java Fri May 17 07:12:08 2019
@@ -31,8 +31,10 @@ import org.apache.felix.cm.PersistenceMa
 import org.apache.felix.cm.impl.ConfigurationManager;
 import org.apache.felix.cm.impl.Log;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceFactory;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.log.LogService;
@@ -64,9 +66,9 @@ public class PersistenceManagerTracker
     private volatile ServiceTracker<Object, Object> coordinatorTracker;
 
     public PersistenceManagerTracker(final BundleContext bundleContext,
-            final PersistenceManager defaultPM,
+            final ServiceFactory<PersistenceManager> defaultFactory,
             final String pmName )
-    throws InvalidSyntaxException
+            throws BundleException, InvalidSyntaxException
     {
         this.bundleContext = bundleContext;
         if ( pmName != null )
@@ -81,6 +83,15 @@ public class PersistenceManagerTracker
         else
         {
             Log.logger.log(LogService.LOG_DEBUG, "Using default persistence manager", (Object[])null);
+            PersistenceManager defaultPM = null;
+            try {
+                defaultPM = defaultFactory.getService(null, null);
+            } catch (final IllegalArgumentException iae) {
+                Log.logger.log(LogService.LOG_ERROR, "Cannot create the FilePersistenceManager", iae);
+            }
+            if (defaultPM == null) {
+                throw new BundleException("Unable to register default persistence manager.");
+            }
             this.workerQueue = null;
             this.persistenceManagerTracker = null;
             this.activate(this.createPersistenceManagerProxy(defaultPM));