+/*\r
+ * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
package org.argeo.eclipse.spring;\r
\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.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
\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
\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,\r
+ contributorBundle.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
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.trace("Get application context for bundle " + 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, contributorBundle.getBundleContext());\r
+ ApplicationContext applicationContext = null;\r
+ try {\r
+ applicationContext = applicationContextTracker\r
+ .getApplicationContext();\r
+ } finally {\r
+ applicationContextTracker.close();\r
+ }\r
+ return applicationContext;\r
+ }\r
}\r