]> git.argeo.org Git - lgpl/argeo-commons.git/blob - eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/ApplicationContextTracker.java
3ab629fd033bb6166ba8ddbef0ea0ae9d1295334
[lgpl/argeo-commons.git] / eclipse / plugins / org.argeo.eclipse.ui / src / main / java / org / argeo / eclipse / spring / ApplicationContextTracker.java
1 package org.argeo.eclipse.spring;
2
3 import static java.text.MessageFormat.format;
4
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;
16
17 /**
18 * @author Heiko Seeberger
19 * @author Mathieu Baudier
20 */
21 class ApplicationContextTracker {
22 private final static Log log = LogFactory
23 .getLog(ApplicationContextTracker.class);
24
25 private static final String FILTER = "(&(objectClass=org.springframework.context.ApplicationContext)" //$NON-NLS-1$
26 + "(org.springframework.context.service.name={0}))"; //$NON-NLS-1$
27
28 private ServiceTracker applicationContextServiceTracker;
29
30 /**
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.
38 */
39 public ApplicationContextTracker(final Bundle contributorBundle,
40 final BundleContext factoryBundleContext) {
41 final String filter = format(FILTER, contributorBundle
42 .getSymbolicName());
43 try {
44 applicationContextServiceTracker = new ServiceTracker(
45 factoryBundleContext, FrameworkUtil.createFilter(filter),
46 null);
47 applicationContextServiceTracker.open();
48 } catch (final InvalidSyntaxException e) {
49 e.printStackTrace();
50 }
51 }
52
53 public void close() {
54 if (applicationContextServiceTracker != null) {
55 applicationContextServiceTracker.close();
56 }
57 }
58
59 public ApplicationContext getApplicationContext() {
60 ApplicationContext applicationContext = null;
61 if (applicationContextServiceTracker != null) {
62 try {
63 applicationContext = (ApplicationContext) applicationContextServiceTracker
64 .waitForService(5000);
65 } catch (InterruptedException e) {
66 e.printStackTrace();
67 }
68 }
69 return applicationContext;
70 }
71
72 @Override
73 protected void finalize() throws Throwable {
74 close();
75 super.finalize();
76 }
77
78 static ApplicationContext getApplicationContext(String bundleSymbolicName) {
79 Bundle contributorBundle = Platform.getBundle(bundleSymbolicName);
80 return getApplicationContext(contributorBundle);
81 }
82
83 static ApplicationContext getApplicationContext(Bundle contributorBundle) {
84 if (log.isTraceEnabled())
85 log
86 .trace("Get application context for bundle "
87 + contributorBundle);
88
89 if (contributorBundle.getState() != Bundle.ACTIVE
90 && contributorBundle.getState() != Bundle.STARTING) {
91 try {
92 log.info("Starting bundle: "
93 + contributorBundle.getSymbolicName());
94 contributorBundle.start();
95 } catch (BundleException e) {
96 e.printStackTrace();
97 }
98 }
99
100 final ApplicationContextTracker applicationContextTracker = new ApplicationContextTracker(
101 contributorBundle, ArgeoUiPlugin.getDefault()
102 .getBundleContext());
103 ApplicationContext applicationContext = null;
104 try {
105 applicationContext = applicationContextTracker
106 .getApplicationContext();
107 } finally {
108 applicationContextTracker.close();
109 }
110 return applicationContext;
111 }
112 }