Improve Spring Integration
[lgpl/argeo-commons.git] / eclipse / plugins / org.argeo.eclipse.ui / src / main / java / org / argeo / eclipse / spring / ApplicationContextTracker.java
index be53a97fcba764029ce9534753d0cce31b122891..3ab629fd033bb6166ba8ddbef0ea0ae9d1295334 100644 (file)
@@ -2,8 +2,13 @@ package org.argeo.eclipse.spring;
 \r
 import static java.text.MessageFormat.format;\r
 \r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+import org.argeo.eclipse.ui.ArgeoUiPlugin;\r
+import org.eclipse.core.runtime.Platform;\r
 import org.osgi.framework.Bundle;\r
 import org.osgi.framework.BundleContext;\r
+import org.osgi.framework.BundleException;\r
 import org.osgi.framework.FrameworkUtil;\r
 import org.osgi.framework.InvalidSyntaxException;\r
 import org.osgi.util.tracker.ServiceTracker;\r
@@ -11,8 +16,11 @@ import org.springframework.context.ApplicationContext;
 \r
 /**\r
  * @author Heiko Seeberger\r
+ * @author Mathieu Baudier\r
  */\r
-public class ApplicationContextTracker {\r
+class ApplicationContextTracker {\r
+       private final static Log log = LogFactory\r
+                       .getLog(ApplicationContextTracker.class);\r
 \r
        private static final String FILTER = "(&(objectClass=org.springframework.context.ApplicationContext)" //$NON-NLS-1$\r
                        + "(org.springframework.context.service.name={0}))"; //$NON-NLS-1$\r
@@ -21,18 +29,21 @@ public class ApplicationContextTracker {
 \r
        /**\r
         * @param contributorBundle\r
-        *              OSGi bundle for which the Spring application context is to be\r
-        *              tracked. Must not be null!\r
+        *            OSGi bundle for which the Spring application context is to be\r
+        *            tracked. Must not be null!\r
         * @param factoryBundleContext\r
-        *      BundleContext object which can be used to track services\r
+        *            BundleContext object which can be used to track services\r
         * @throws IllegalArgumentException\r
-        *              if the given bundle is null.\r
+        *             if the given bundle is null.\r
         */\r
-       public ApplicationContextTracker(final Bundle contributorBundle, final BundleContext factoryBundleContext) {\r
-               final String filter = format(FILTER, contributorBundle.getSymbolicName());\r
+       public ApplicationContextTracker(final Bundle contributorBundle,\r
+                       final BundleContext factoryBundleContext) {\r
+               final String filter = format(FILTER, contributorBundle\r
+                               .getSymbolicName());\r
                try {\r
                        applicationContextServiceTracker = new ServiceTracker(\r
-                                       factoryBundleContext, FrameworkUtil.createFilter(filter), null);\r
+                                       factoryBundleContext, FrameworkUtil.createFilter(filter),\r
+                                       null);\r
                        applicationContextServiceTracker.open();\r
                } catch (final InvalidSyntaxException e) {\r
                        e.printStackTrace();\r
@@ -63,4 +74,39 @@ public class ApplicationContextTracker {
                close();\r
                super.finalize();\r
        }\r
+\r
+       static ApplicationContext getApplicationContext(String bundleSymbolicName) {\r
+               Bundle contributorBundle = Platform.getBundle(bundleSymbolicName);\r
+               return getApplicationContext(contributorBundle);\r
+       }\r
+\r
+       static ApplicationContext getApplicationContext(Bundle contributorBundle) {\r
+               if (log.isTraceEnabled())\r
+                       log\r
+                                       .trace("Get application context for bundle "\r
+                                                       + contributorBundle);\r
+\r
+               if (contributorBundle.getState() != Bundle.ACTIVE\r
+                               && contributorBundle.getState() != Bundle.STARTING) {\r
+                       try {\r
+                               log.info("Starting bundle: "\r
+                                               + contributorBundle.getSymbolicName());\r
+                               contributorBundle.start();\r
+                       } catch (BundleException e) {\r
+                               e.printStackTrace();\r
+                       }\r
+               }\r
+\r
+               final ApplicationContextTracker applicationContextTracker = new ApplicationContextTracker(\r
+                               contributorBundle, ArgeoUiPlugin.getDefault()\r
+                                               .getBundleContext());\r
+               ApplicationContext applicationContext = null;\r
+               try {\r
+                       applicationContext = applicationContextTracker\r
+                                       .getApplicationContext();\r
+               } finally {\r
+                       applicationContextTracker.close();\r
+               }\r
+               return applicationContext;\r
+       }\r
 }\r