]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
Factorize code from SLC Equinox command
authorMathieu Baudier <mbaudier@argeo.org>
Fri, 12 Jun 2009 17:10:52 +0000 (17:10 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Fri, 12 Jun 2009 17:10:52 +0000 (17:10 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@2548 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

runtime/org.argeo.slc.support.equinox/src/main/java/org/argeo/slc/equinox/ExecutionCommandProvider.java
runtime/org.argeo.slc.support.equinox/src/main/java/org/argeo/slc/osgi/BundlesManager.java
runtime/org.argeo.slc.support.equinox/src/main/java/org/argeo/slc/osgi/OsgiModulesManager.java [new file with mode: 0644]
runtime/org.argeo.slc.support.equinox/src/main/resources/META-INF/spring/osgi.xml

index f94ded602504f72f828dea8c7280925bb0873fd7..462e2901601a82766fae0fbe47291b91d0e513fd 100644 (file)
@@ -5,34 +5,26 @@ import org.apache.commons.logging.LogFactory;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.execution.ExecutionFlowDescriptor;
 import org.argeo.slc.execution.ExecutionModule;
+import org.argeo.slc.osgi.BundlesManager;
 import org.eclipse.osgi.framework.console.CommandInterpreter;
 import org.eclipse.osgi.framework.console.CommandProvider;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.FrameworkEvent;
-import org.osgi.framework.FrameworkListener;
-import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
-import org.osgi.service.packageadmin.PackageAdmin;
-import org.springframework.beans.factory.InitializingBean;
 import org.springframework.context.ApplicationContext;
 import org.springframework.osgi.context.BundleContextAware;
 
 public class ExecutionCommandProvider implements CommandProvider,
-               BundleContextAware, FrameworkListener, InitializingBean {
+               BundleContextAware {
        private final static Log log = LogFactory
                        .getLog(ExecutionCommandProvider.class);
 
-       private Long defaultTimeout = 10000l;
-
        private BundleContext bundleContext;
+       private BundlesManager bundlesManager;
 
        private String lastModuleName = null;
        private String lastExecutionName = null;
 
-       private final Object refreshedPackageSem = new Object();
-
        /** @deprecated Use slc command instead. */
        public Object _slc_exec(CommandInterpreter ci) {
                return _slc(ci);
@@ -91,21 +83,22 @@ public class ExecutionCommandProvider implements CommandProvider,
                ExecutionModule module = null;
                ServiceReference serviceRef = null;
                try {
-                       stopSynchronous(bundle);
-                       updateSynchronous(bundle);
+                       bundlesManager.stopSynchronous(bundle);
+                       bundlesManager.updateSynchronous(bundle);
                        // Refresh in case there are fragments
-                       refreshSynchronous(bundle);
-                       startSynchronous(bundle);
+                       bundlesManager.refreshSynchronous(bundle);
+                       bundlesManager.startSynchronous(bundle);
 
                        String filter = "(Bundle-SymbolicName=" + moduleName + ")";
                        // Wait for application context to be ready
-                       getServiceRefSynchronous(ApplicationContext.class.getName(), filter);
+                       bundlesManager.getServiceRefSynchronous(ApplicationContext.class
+                                       .getName(), filter);
 
                        if (log.isDebugEnabled())
                                log.debug("Bundle " + bundle.getSymbolicName()
                                                + " ready to be used at latest version.");
 
-                       ServiceReference[] sfs = getServiceRefSynchronous(
+                       ServiceReference[] sfs = bundlesManager.getServiceRefSynchronous(
                                        ExecutionModule.class.getName(), filter);
 
                        if (sfs.length > 1)
@@ -144,150 +137,12 @@ public class ExecutionCommandProvider implements CommandProvider,
 
        }
 
-       /** Updates bundle synchronously. */
-       protected void updateSynchronous(Bundle bundle) throws BundleException {
-               // int originalState = bundle.getState();
-               bundle.update();
-               boolean waiting = true;
-
-               long begin = System.currentTimeMillis();
-               do {
-                       int state = bundle.getState();
-                       if (state == Bundle.INSTALLED || state == Bundle.ACTIVE
-                                       || state == Bundle.RESOLVED)
-                               waiting = false;
-
-                       sleep(100);
-                       if (System.currentTimeMillis() - begin > defaultTimeout)
-                               throw new SlcException("Update of bundle "
-                                               + bundle.getSymbolicName()
-                                               + " timed out. Bundle state = " + bundle.getState());
-               } while (waiting);
-
-               if (log.isTraceEnabled())
-                       log.debug("Bundle " + bundle.getSymbolicName() + " updated.");
-       }
-
-       /** Starts bundle synchronously. Does nothing if already started. */
-       protected void startSynchronous(Bundle bundle) throws BundleException {
-               int originalState = bundle.getState();
-               if (originalState == Bundle.ACTIVE)
-                       return;
-
-               bundle.start();
-               boolean waiting = true;
-
-               long begin = System.currentTimeMillis();
-               do {
-                       if (bundle.getState() == Bundle.ACTIVE)
-                               waiting = false;
-
-                       sleep(100);
-                       if (System.currentTimeMillis() - begin > defaultTimeout)
-                               throw new SlcException("Start of bundle "
-                                               + bundle.getSymbolicName()
-                                               + " timed out. Bundle state = " + bundle.getState());
-               } while (waiting);
-
-               if (log.isTraceEnabled())
-                       log.debug("Bundle " + bundle.getSymbolicName() + " started.");
-       }
-
-       /** Stops bundle synchronously. Does nothing if already started. */
-       protected void stopSynchronous(Bundle bundle) throws BundleException {
-               int originalState = bundle.getState();
-               if (originalState != Bundle.ACTIVE)
-                       return;
-
-               bundle.stop();
-               boolean waiting = true;
-
-               long begin = System.currentTimeMillis();
-               do {
-                       if (bundle.getState() != Bundle.ACTIVE
-                                       && bundle.getState() != Bundle.STOPPING)
-                               waiting = false;
-
-                       sleep(100);
-                       if (System.currentTimeMillis() - begin > defaultTimeout)
-                               throw new SlcException("Stop of bundle "
-                                               + bundle.getSymbolicName()
-                                               + " timed out. Bundle state = " + bundle.getState());
-               } while (waiting);
-
-               if (log.isTraceEnabled())
-                       log.debug("Bundle " + bundle.getSymbolicName() + " stopped.");
-       }
-
-       /** Refresh bundle synchronously. Does nothing if already started. */
-       protected void refreshSynchronous(Bundle bundle) throws BundleException {
-               ServiceReference packageAdminRef = bundleContext
-                               .getServiceReference(PackageAdmin.class.getName());
-               PackageAdmin packageAdmin = (PackageAdmin) bundleContext
-                               .getService(packageAdminRef);
-               Bundle[] bundles = { bundle };
-               packageAdmin.refreshPackages(bundles);
-
-               synchronized (refreshedPackageSem) {
-                       try {
-                               refreshedPackageSem.wait(defaultTimeout);
-                       } catch (InterruptedException e) {
-                               // silent
-                       }
-               }
-
-               if (log.isTraceEnabled())
-                       log.debug("Bundle " + bundle.getSymbolicName() + " refreshed.");
-       }
-
-       public void frameworkEvent(FrameworkEvent event) {
-               if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) {
-                       synchronized (refreshedPackageSem) {
-                               refreshedPackageSem.notifyAll();
-                       }
-               }
-       }
-
-       protected ServiceReference[] getServiceRefSynchronous(String clss,
-                       String filter) throws InvalidSyntaxException {
-               if (log.isTraceEnabled())
-                       log.debug("Filter: '" + filter + "'");
-               ServiceReference[] sfs = null;
-               boolean waiting = true;
-               long begin = System.currentTimeMillis();
-               do {
-                       sfs = bundleContext.getServiceReferences(clss, filter);
-
-                       if (sfs != null)
-                               waiting = false;
-
-                       sleep(100);
-                       if (System.currentTimeMillis() - begin > defaultTimeout)
-                               throw new SlcException("Search of services " + clss
-                                               + " with filter " + filter + " timed out.");
-               } while (waiting);
-
-               return sfs;
-       }
-
-       protected void sleep(long ms) {
-               try {
-                       Thread.sleep(ms);
-               } catch (InterruptedException e) {
-                       // silent
-               }
-       }
-
        public void setBundleContext(BundleContext bundleContext) {
                this.bundleContext = bundleContext;
        }
 
-       public void afterPropertiesSet() throws Exception {
-               bundleContext.addFrameworkListener(this);
-       }
-
-       public void setDefaultTimeout(Long defaultTimeout) {
-               this.defaultTimeout = defaultTimeout;
+       public void setBundlesManager(BundlesManager bundlesManager) {
+               this.bundlesManager = bundlesManager;
        }
 
 }
index 2cd2b37c617bfe65dfb20f12a1b1f096ab5daf71..3ac12603eeb9c9775da76c9908866d6359b4be57 100644 (file)
 package org.argeo.slc.osgi;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.argeo.slc.SlcException;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.springframework.beans.factory.InitializingBean;
 import org.springframework.osgi.context.BundleContextAware;
 
-public class BundlesManager implements BundleContextAware {
+public class BundlesManager implements BundleContextAware, FrameworkListener,
+               InitializingBean {
        private final static Log log = LogFactory.getLog(BundlesManager.class);
 
        private BundleContext bundleContext;
 
-       private List<String> urlsToInstall;
-
-       public void init() {
-               // Install
-               if (urlsToInstall != null) {
-                       Map<String, Bundle> installedBundles = new HashMap<String, Bundle>();
-                       for (Bundle bundle : bundleContext.getBundles())
-                               installedBundles.put(bundle.getLocation(), bundle);
-
-                       for (String url : urlsToInstall)
-                               try {
-
-                                       if (installedBundles.containsKey(url)) {
-                                               Bundle bundle = installedBundles.get(url);
-                                               // bundle.update();
-                                               log.debug("Bundle " + bundle.getSymbolicName()
-                                                               + " already installed from " + url);
-                                       } else {
-                                               Bundle bundle = bundleContext.installBundle(url);
-                                               log.debug("Installed bundle "
-                                                               + bundle.getSymbolicName() + " from " + url);
-                                       }
-                               } catch (BundleException e) {
-                                       log.warn("Could not install bundle from " + url + ": "
-                                                       + e.getMessage());
-                               }
+       private Long defaultTimeout = 10000l;
+       private final Object refreshedPackageSem = new Object();
+
+       /** Updates bundle synchronously. */
+       public void updateSynchronous(Bundle bundle) throws BundleException {
+               // int originalState = bundle.getState();
+               bundle.update();
+               boolean waiting = true;
+
+               long begin = System.currentTimeMillis();
+               do {
+                       int state = bundle.getState();
+                       if (state == Bundle.INSTALLED || state == Bundle.ACTIVE
+                                       || state == Bundle.RESOLVED)
+                               waiting = false;
+
+                       sleep(100);
+                       if (System.currentTimeMillis() - begin > defaultTimeout)
+                               throw new SlcException("Update of bundle "
+                                               + bundle.getSymbolicName()
+                                               + " timed out. Bundle state = " + bundle.getState());
+               } while (waiting);
+
+               if (log.isTraceEnabled())
+                       log.debug("Bundle " + bundle.getSymbolicName() + " updated.");
+       }
+
+       /** Starts bundle synchronously. Does nothing if already started. */
+       public void startSynchronous(Bundle bundle) throws BundleException {
+               int originalState = bundle.getState();
+               if (originalState == Bundle.ACTIVE)
+                       return;
+
+               bundle.start();
+               boolean waiting = true;
+
+               long begin = System.currentTimeMillis();
+               do {
+                       if (bundle.getState() == Bundle.ACTIVE)
+                               waiting = false;
+
+                       sleep(100);
+                       if (System.currentTimeMillis() - begin > defaultTimeout)
+                               throw new SlcException("Start of bundle "
+                                               + bundle.getSymbolicName()
+                                               + " timed out. Bundle state = " + bundle.getState());
+               } while (waiting);
+
+               if (log.isTraceEnabled())
+                       log.debug("Bundle " + bundle.getSymbolicName() + " started.");
+       }
+
+       /** Stops bundle synchronously. Does nothing if already started. */
+       public void stopSynchronous(Bundle bundle) throws BundleException {
+               int originalState = bundle.getState();
+               if (originalState != Bundle.ACTIVE)
+                       return;
+
+               bundle.stop();
+               boolean waiting = true;
+
+               long begin = System.currentTimeMillis();
+               do {
+                       if (bundle.getState() != Bundle.ACTIVE
+                                       && bundle.getState() != Bundle.STOPPING)
+                               waiting = false;
+
+                       sleep(100);
+                       if (System.currentTimeMillis() - begin > defaultTimeout)
+                               throw new SlcException("Stop of bundle "
+                                               + bundle.getSymbolicName()
+                                               + " timed out. Bundle state = " + bundle.getState());
+               } while (waiting);
+
+               if (log.isTraceEnabled())
+                       log.debug("Bundle " + bundle.getSymbolicName() + " stopped.");
+       }
+
+       /** Refresh bundle synchronously. Does nothing if already started. */
+       public void refreshSynchronous(Bundle bundle) throws BundleException {
+               ServiceReference packageAdminRef = bundleContext
+                               .getServiceReference(PackageAdmin.class.getName());
+               PackageAdmin packageAdmin = (PackageAdmin) bundleContext
+                               .getService(packageAdminRef);
+               Bundle[] bundles = { bundle };
+               packageAdmin.refreshPackages(bundles);
+
+               synchronized (refreshedPackageSem) {
+                       try {
+                               refreshedPackageSem.wait(defaultTimeout);
+                       } catch (InterruptedException e) {
+                               // silent
+                       }
                }
 
+               if (log.isTraceEnabled())
+                       log.debug("Bundle " + bundle.getSymbolicName() + " refreshed.");
+       }
+
+       public void frameworkEvent(FrameworkEvent event) {
+               if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) {
+                       synchronized (refreshedPackageSem) {
+                               refreshedPackageSem.notifyAll();
+                       }
+               }
+       }
+
+       public ServiceReference[] getServiceRefSynchronous(String clss,
+                       String filter) throws InvalidSyntaxException {
+               if (log.isTraceEnabled())
+                       log.debug("Filter: '" + filter + "'");
+               ServiceReference[] sfs = null;
+               boolean waiting = true;
+               long begin = System.currentTimeMillis();
+               do {
+                       sfs = bundleContext.getServiceReferences(clss, filter);
+
+                       if (sfs != null)
+                               waiting = false;
+
+                       sleep(100);
+                       if (System.currentTimeMillis() - begin > defaultTimeout)
+                               throw new SlcException("Search of services " + clss
+                                               + " with filter " + filter + " timed out.");
+               } while (waiting);
+
+               return sfs;
+       }
+
+       protected void sleep(long ms) {
+               try {
+                       Thread.sleep(ms);
+               } catch (InterruptedException e) {
+                       // silent
+               }
        }
 
        public void setBundleContext(BundleContext bundleContext) {
                this.bundleContext = bundleContext;
        }
 
-       public void setUrlsToInstall(List<String> urlsToInstall) {
-               this.urlsToInstall = urlsToInstall;
+       public void afterPropertiesSet() throws Exception {
+               bundleContext.addFrameworkListener(this);
        }
 
 }
diff --git a/runtime/org.argeo.slc.support.equinox/src/main/java/org/argeo/slc/osgi/OsgiModulesManager.java b/runtime/org.argeo.slc.support.equinox/src/main/java/org/argeo/slc/osgi/OsgiModulesManager.java
new file mode 100644 (file)
index 0000000..41ee388
--- /dev/null
@@ -0,0 +1,24 @@
+package org.argeo.slc.osgi;
+
+import java.util.List;
+
+import org.argeo.slc.core.execution.DefaultModulesManager;
+import org.argeo.slc.execution.ExecutionModule;
+
+public class OsgiModulesManager extends DefaultModulesManager {
+
+
+       @Override
+       protected ExecutionModule getExecutionModule(String moduleName,
+                       String version) {
+               // TODO Auto-generated method stub
+               return super.getExecutionModule(moduleName, version);
+       }
+
+       @Override
+       public List<ExecutionModule> listExecutionModules() {
+               // TODO Auto-generated method stub
+               return super.listExecutionModules();
+       }
+
+}
index 609e8e5df095a2429cece2f6eeefb93f780860f5..6ecec13592ba363d5bfe88edb871b4ceb3a01458 100644 (file)
@@ -7,6 +7,10 @@
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">\r
 \r
        <service interface="org.eclipse.osgi.framework.console.CommandProvider">\r
-               <beans:bean class="org.argeo.slc.equinox.ExecutionCommandProvider" />\r
+               <beans:bean class="org.argeo.slc.equinox.ExecutionCommandProvider">\r
+                       <beans:property name="bundlesManager" ref="bundlesManager" />\r
+               </beans:bean>\r
        </service>\r
+\r
+       <beans:bean id="bundlesManager" class="org.argeo.slc.osgi.BundlesManager" />\r
 </beans:beans>
\ No newline at end of file