You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2010/06/18 11:49:29 UTC
svn commit: r955916 - in
/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl:
Activator.java OsgiInstallerImpl.java
Author: cziegeler
Date: Fri Jun 18 09:49:29 2010
New Revision: 955916
URL: http://svn.apache.org/viewvc?rev=955916&view=rev
Log:
SLING-1560 : Improve and clean up code
Move all tracker code into service to hide implementation details
Don't throw an exception on shutdown
Modified:
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Activator.java
sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Activator.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Activator.java?rev=955916&r1=955915&r2=955916&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Activator.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/Activator.java Fri Jun 18 09:49:29 2010
@@ -30,21 +30,11 @@ import org.osgi.framework.Constants;
import org.osgi.framework.FrameworkEvent;
import org.osgi.framework.FrameworkListener;
import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.log.LogService;
-import org.osgi.service.packageadmin.PackageAdmin;
-import org.osgi.service.startlevel.StartLevel;
-import org.osgi.util.tracker.ServiceTracker;
public class Activator implements BundleActivator, FrameworkListener, BundleListener {
private static final String VENDOR = "The Apache Software Foundation";
- private static String PACKAGE_ADMIN_NAME = PackageAdmin.class.getName();
- private static String START_LEVEL_NAME = StartLevel.class.getName();
- private static String LOG_SERVICE_NAME = LogService.class.getName();
-
- private ServiceTracker packageAdminTracker;
- private ServiceTracker logServiceTracker;
private OsgiInstallerImpl osgiControllerService;
private ServiceRegistration osgiControllerServiceReg;
private ServiceRegistration factoryServiceReg;
@@ -55,11 +45,6 @@ public class Activator implements Bundle
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext context) throws Exception {
- this.packageAdminTracker = new ServiceTracker(context, PACKAGE_ADMIN_NAME, null);
- this.logServiceTracker = new ServiceTracker(context, LOG_SERVICE_NAME, null);
- this.packageAdminTracker.open();
- this.logServiceTracker.open();
-
// listen to framework and bundle events
context.addFrameworkListener(this);
context.addBundleListener(this);
@@ -70,11 +55,7 @@ public class Activator implements Bundle
props.put(Constants.SERVICE_DESCRIPTION, "Apache Sling Install Controller Service");
props.put(Constants.SERVICE_VENDOR, VENDOR);
- // Assume PackageAdmin is available before this bundle is started.
- // That's the case when using Felix OSGi, not sure about other frameworks.
- this.osgiControllerService = new OsgiInstallerImpl(context,
- (PackageAdmin)checkNotNull(this.packageAdminTracker.getService(), "PackageAdmin"),
- logServiceTracker);
+ this.osgiControllerService = new OsgiInstallerImpl(context);
final String [] serviceInterfaces = {
OsgiInstaller.class.getName()
};
@@ -99,14 +80,6 @@ public class Activator implements Bundle
}
}
- /** Complain if value is null */
- static Object checkNotNull(Object value, String what) {
- if(value == null) {
- throw new IllegalArgumentException(what + " is null, cannot activate");
- }
- return value;
- }
-
/**
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
@@ -126,14 +99,6 @@ public class Activator implements Bundle
this.osgiControllerService.deactivate();
this.osgiControllerService = null;
}
- if ( this.packageAdminTracker != null ) {
- this.packageAdminTracker.close();
- this.packageAdminTracker = null;
- }
- if ( this.logServiceTracker != null ) {
- this.logServiceTracker.close();
- this.logServiceTracker = null;
- }
}
/** Used for tasks that wait for a framework or bundle event before retrying their operations */
Modified: sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java?rev=955916&r1=955915&r2=955916&view=diff
==============================================================================
--- sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java (original)
+++ sling/trunk/installer/osgi/installer/src/main/java/org/apache/sling/osgi/installer/impl/OsgiInstallerImpl.java Fri Jun 18 09:49:29 2010
@@ -26,7 +26,6 @@ import org.apache.sling.osgi.installer.I
import org.apache.sling.osgi.installer.OsgiInstaller;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
import org.osgi.framework.Version;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.log.LogService;
@@ -36,22 +35,45 @@ import org.osgi.util.tracker.ServiceTrac
/** OsgiInstaller service implementation */
public class OsgiInstallerImpl implements OsgiInstaller, OsgiInstallerContext {
+ /** Interface of the package admin */
+ private static String PACKAGE_ADMIN_NAME = PackageAdmin.class.getName();
+ /** Interface of the log service */
+ private static String LOG_SERVICE_NAME = LogService.class.getName();
+ /** Interface of the config admin */
+ private static String CONFIG_ADMIN_SERVICE_NAME = ConfigurationAdmin.class.getName();
+
public static final String MAVEN_SNAPSHOT_MARKER = "SNAPSHOT";
+ /** The bundle context. */
private final BundleContext bundleContext;
- private final PackageAdmin packageAdmin;
- private final ServiceTracker logServiceTracker;
+
+ /** The actual worker thread. */
private final OsgiInstallerThread installerThread;
+
private long [] counters = new long[COUNTERS_SIZE];
private PersistentBundleInfo bundleDigestsStorage;
- public OsgiInstallerImpl(final BundleContext bc,
- final PackageAdmin pa,
- final ServiceTracker logServiceTracker)
+ /** Tracker for the package admin. */
+ private final ServiceTracker packageAdminTracker;
+ /** Tracker for the log service. */
+ private final ServiceTracker logServiceTracker;
+ /** Tracker for the configuration admin. */
+ private final ServiceTracker configAdminServiceTracker;
+
+ /**
+ * Construct a new service
+ */
+ public OsgiInstallerImpl(final BundleContext bc)
throws IOException {
this.bundleContext = bc;
- this.packageAdmin = pa;
- this.logServiceTracker = logServiceTracker;
+ // create and start tracker
+ this.packageAdminTracker = new ServiceTracker(bc, PACKAGE_ADMIN_NAME, null);
+ this.logServiceTracker = new ServiceTracker(bc, LOG_SERVICE_NAME, null);
+ this.configAdminServiceTracker = new ServiceTracker(bc, CONFIG_ADMIN_SERVICE_NAME, null);
+ this.packageAdminTracker.open();
+ this.logServiceTracker.open();
+ this.configAdminServiceTracker.open();
+
bundleDigestsStorage = new PersistentBundleInfo(this, bc.getDataFile("bundle-digests.properties"));
installerThread = new OsgiInstallerThread(this);
@@ -59,30 +81,42 @@ public class OsgiInstallerImpl implement
installerThread.start();
}
- public void deactivate() throws InterruptedException, IOException {
+ /**
+ * Deactivate this service.
+ */
+ public void deactivate() {
installerThread.deactivate();
final TreeSet<String> installedBundlesSymbolicNames = new TreeSet<String>();
for(Bundle b : bundleContext.getBundles()) {
installedBundlesSymbolicNames.add(b.getSymbolicName());
}
- bundleDigestsStorage.purgeAndSave(installedBundlesSymbolicNames);
+ try {
+ bundleDigestsStorage.purgeAndSave(installedBundlesSymbolicNames);
+ } catch (IOException e) {
+ logWarn(OsgiInstaller.class.getName() + " service failed to save state.", e);
+ }
this.logInfo("Waiting for installer thread to stop");
- installerThread.join();
+ try {
+ installerThread.join();
+ } catch (InterruptedException e) {
+ // we simply ignore this
+ }
+
+ this.packageAdminTracker.close();
+ this.logServiceTracker.close();
+ this.configAdminServiceTracker.close();
this.logWarn(OsgiInstaller.class.getName()
+ " service deactivated - this warning can be ignored if system is shutting down");
}
+ /**
+ * @see org.apache.sling.osgi.installer.impl.OsgiInstallerContext#getConfigurationAdmin()
+ */
public ConfigurationAdmin getConfigurationAdmin() {
- if(bundleContext != null) {
- final ServiceReference ref = bundleContext.getServiceReference(ConfigurationAdmin.class.getName());
- if(ref != null) {
- return (ConfigurationAdmin)bundleContext.getService(ref);
- }
- }
- return null;
+ return (ConfigurationAdmin)this.configAdminServiceTracker.getService();
}
public void addTaskToCurrentCycle(OsgiInstallerTask t) {
@@ -94,12 +128,18 @@ public class OsgiInstallerImpl implement
installerThread.addTaskToNextCycle(t);
}
+ /**
+ * @see org.apache.sling.osgi.installer.impl.OsgiInstallerContext#getBundleContext()
+ */
public BundleContext getBundleContext() {
return bundleContext;
}
+ /**
+ * @see org.apache.sling.osgi.installer.impl.OsgiInstallerContext#getPackageAdmin()
+ */
public PackageAdmin getPackageAdmin() {
- return packageAdmin;
+ return (PackageAdmin)this.packageAdminTracker.getService();
}
public long [] getCounters() {