1 package org
.argeo
.eclipse
.spring
;
3 import static java
.text
.MessageFormat
.format
;
5 import org
.apache
.commons
.logging
.Log
;
6 import org
.apache
.commons
.logging
.LogFactory
;
7 import org
.argeo
.eclipse
.ui
.ArgeoUiPlugin
;
8 import org
.eclipse
.core
.runtime
.Platform
;
9 import org
.osgi
.framework
.Bundle
;
10 import org
.osgi
.framework
.BundleContext
;
11 import org
.osgi
.framework
.BundleException
;
12 import org
.osgi
.framework
.FrameworkUtil
;
13 import org
.osgi
.framework
.InvalidSyntaxException
;
14 import org
.osgi
.util
.tracker
.ServiceTracker
;
15 import org
.springframework
.context
.ApplicationContext
;
18 * @author Heiko Seeberger
19 * @author Mathieu Baudier
21 class ApplicationContextTracker
{
22 private final static Log log
= LogFactory
23 .getLog(ApplicationContextTracker
.class);
25 private static final String FILTER
= "(&(objectClass=org.springframework.context.ApplicationContext)" //$NON-NLS-1$
26 + "(org.springframework.context.service.name={0}))"; //$NON-NLS-1$
28 private ServiceTracker applicationContextServiceTracker
;
31 * @param contributorBundle
32 * OSGi bundle for which the Spring application context is to be
33 * tracked. Must not be null!
34 * @param factoryBundleContext
35 * BundleContext object which can be used to track services
36 * @throws IllegalArgumentException
37 * if the given bundle is null.
39 public ApplicationContextTracker(final Bundle contributorBundle
,
40 final BundleContext factoryBundleContext
) {
41 final String filter
= format(FILTER
, contributorBundle
44 applicationContextServiceTracker
= new ServiceTracker(
45 factoryBundleContext
, FrameworkUtil
.createFilter(filter
),
47 applicationContextServiceTracker
.open();
48 } catch (final InvalidSyntaxException e
) {
54 if (applicationContextServiceTracker
!= null) {
55 applicationContextServiceTracker
.close();
59 public ApplicationContext
getApplicationContext() {
60 ApplicationContext applicationContext
= null;
61 if (applicationContextServiceTracker
!= null) {
63 applicationContext
= (ApplicationContext
) applicationContextServiceTracker
64 .waitForService(5000);
65 } catch (InterruptedException e
) {
69 return applicationContext
;
73 protected void finalize() throws Throwable
{
78 static ApplicationContext
getApplicationContext(String bundleSymbolicName
) {
79 Bundle contributorBundle
= Platform
.getBundle(bundleSymbolicName
);
80 return getApplicationContext(contributorBundle
);
83 static ApplicationContext
getApplicationContext(Bundle contributorBundle
) {
84 if (log
.isTraceEnabled())
86 .trace("Get application context for bundle "
89 if (contributorBundle
.getState() != Bundle
.ACTIVE
90 && contributorBundle
.getState() != Bundle
.STARTING
) {
92 log
.info("Starting bundle: "
93 + contributorBundle
.getSymbolicName());
94 contributorBundle
.start();
95 } catch (BundleException e
) {
100 final ApplicationContextTracker applicationContextTracker
= new ApplicationContextTracker(
101 contributorBundle
, ArgeoUiPlugin
.getDefault()
102 .getBundleContext());
103 ApplicationContext applicationContext
= null;
105 applicationContext
= applicationContextTracker
106 .getApplicationContext();
108 applicationContextTracker
.close();
110 return applicationContext
;