]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.init/src/org/argeo/init/osgi/SubFrameworkActivator.java
Improve runtime manager
[lgpl/argeo-commons.git] / org.argeo.init / src / org / argeo / init / osgi / SubFrameworkActivator.java
1 package org.argeo.init.osgi;
2
3 import static java.lang.System.Logger.Level.INFO;
4
5 import java.io.InputStream;
6 import java.lang.System.Logger;
7 import java.net.URL;
8 import java.nio.file.Path;
9 import java.nio.file.Paths;
10 import java.util.Collections;
11 import java.util.HashMap;
12 import java.util.Iterator;
13 import java.util.Map;
14 import java.util.UUID;
15
16 import org.argeo.api.init.InitConstants;
17 import org.argeo.api.init.RuntimeManager;
18 import org.osgi.framework.Bundle;
19 import org.osgi.framework.BundleActivator;
20 import org.osgi.framework.BundleContext;
21 import org.osgi.framework.Constants;
22 import org.osgi.framework.FrameworkEvent;
23 import org.osgi.framework.connect.ConnectFrameworkFactory;
24 import org.osgi.framework.connect.ModuleConnector;
25 import org.osgi.framework.launch.Framework;
26
27 public class SubFrameworkActivator implements BundleActivator {
28 private final static Logger logger = System.getLogger(SubFrameworkActivator.class.getName());
29
30 // private final static String EQUINOX_FRAMEWORK_CLASS = "org.eclipse.osgi.launch.Equinox";
31 private final static String EQUINOX_FRAMEWORK_FACTORY_CLASS = "org.eclipse.osgi.launch.EquinoxFactory";
32
33 // private ClassLoader bundleClassLoader;
34 // private ClassLoader subFrameworkClassLoader;
35 private BundleContext foreignBundleContext;
36
37 private ConnectFrameworkFactory frameworkFactory;
38
39 private Map<UUID, Framework> subFrameworks = Collections.synchronizedMap(new HashMap<>());
40
41 private UUID foreignFrameworkUuid;
42
43 @Override
44 public void start(BundleContext context) throws Exception {
45 this.foreignBundleContext = context;
46 foreignFrameworkUuid = UUID.fromString(foreignBundleContext.getProperty(Constants.FRAMEWORK_UUID));
47
48 try {
49 // Bundle bundle = context.getBundle();
50 // ClassLoader bundleClassLoader = bundle.adapt(BundleWiring.class).getClassLoader();
51 // subFrameworkClassLoader = new URLClassLoader(new URL[0], bundleClassLoader);
52
53 @SuppressWarnings("unchecked")
54 Class<? extends ConnectFrameworkFactory> frameworkFactoryClass = (Class<? extends ConnectFrameworkFactory>) Framework.class
55 .getClassLoader().loadClass(EQUINOX_FRAMEWORK_FACTORY_CLASS);
56 frameworkFactory = frameworkFactoryClass.getConstructor().newInstance();
57
58 boolean test = false;
59 if (test)
60 new Thread() {
61
62 @Override
63 public void run() {
64 for (int i = 0; i < 5; i++) {
65 Map<String, String> config = new HashMap<>();
66 Path basePase = Paths.get(System.getProperty("user.home"), ".config/argeo/test/",
67 "test" + i);
68 config.put(InitConstants.PROP_OSGI_CONFIGURATION_AREA,
69 basePase.resolve(RuntimeManager.STATE).toString());
70 config.put(InitConstants.PROP_OSGI_INSTANCE_AREA,
71 basePase.resolve(RuntimeManager.DATA).toString());
72 config.put("argeo.host", "host" + i);
73 config.put("osgi.console", "host" + i + ":2023");
74 createFramework(config);
75 }
76 }
77
78 }.start();
79 } catch (Exception e) {
80 e.printStackTrace();
81 throw e;
82 }
83 }
84
85 Framework createFramework(Map<String, String> config) {
86 try {
87 URL bundleConfigUrl = foreignBundleContext.getBundle().getEntry("config.ini");
88 try (InputStream in = bundleConfigUrl.openStream()) {
89 RuntimeManager.loadConfig(in, config);
90 }
91
92 // Equinox
93 // config.put("osgi.frameworkParentClassloader", "current");
94 // config.put("osgi.parentClassLoader", "app");
95 // config.put("osgi.contextClassLoaderParent", "app");
96
97 ModuleConnector moduleConnector = new ForeignModuleConnector(foreignBundleContext, null);
98
99 // URL frameworkUrl = URI.create(bundleContext.getProperty("osgi.framework")).toURL();
100 // URLClassLoader frameworkClassLoader = new URLClassLoader(new URL[] { frameworkUrl, });
101 // Class<? extends Framework> frameworkClass = (Class<? extends Framework>) frameworkClassLoader
102 // .loadClass(EQUINOX_FRAMEWORK_CLASS);
103 // Framework framework = frameworkClass.getConstructor(Map.class, ModuleConnector.class).newInstance(config,
104 // moduleConnector);
105
106 config.put(InitConstants.PROP_ARGEO_OSGI_PARENT_UUID, foreignFrameworkUuid.toString());
107 Framework framework = frameworkFactory.newFramework(config, moduleConnector);
108
109 framework.init((e) -> {
110 UUID frameworkUuid = UUID
111 .fromString(framework.getBundleContext().getProperty(Constants.FRAMEWORK_UUID));
112 if (e.getType() == FrameworkEvent.STOPPED) {
113 subFrameworks.remove(frameworkUuid);
114 logger.log(INFO, "Removed subframework " + frameworkUuid + " in parent " + foreignFrameworkUuid);
115 }
116 });
117
118 for (Bundle b : foreignBundleContext.getBundles()) {
119 if (b.getBundleId() == 0)
120 continue;
121 String location = b.getLocation();
122 if (location.contains("/org.argeo.tp/") //
123 || location.contains("/org.argeo.tp.sys/") //
124 || location.contains("/org.argeo.tp.httpd/") //
125 || location.contains("/org.argeo.tp.sshd/") //
126 ) {
127 framework.getBundleContext().installBundle(b.getLocation());
128 }
129 }
130
131 OsgiBoot osgiBoot = new OsgiBoot(framework.getBundleContext());
132 osgiBoot.install();
133 // OsgiBoot.uninstallBundles(osgiBoot.getBundleContext(), "org.argeo.api.cms");
134 // OsgiBoot.uninstallBundles(osgiBoot.getBundleContext(), "org.osgi.service.useradmin");
135 // osgiBoot.getBundleContext()
136 // .installBundle("initial@reference:file:../../../../../argeo-commons/org.argeo.api.cms/");
137 // osgiBoot.getBundleContext().installBundle(
138 // "reference:file:/usr/local/share/a2/osgi/equinox/org.argeo.tp.osgi/org.osgi.service.useradmin.1.1.jar");
139 osgiBoot.refresh();
140 framework.start();
141 osgiBoot.startBundles();
142
143 // for (Bundle b : framework.getBundleContext().getBundles()) {
144 // BundleContext bc = b.getBundleContext();
145 // if (bc == null)
146 // System.err.println(b.getSymbolicName() + " BC null");
147 // }
148
149 UUID frameworkUuid = UUID.fromString(framework.getBundleContext().getProperty(Constants.FRAMEWORK_UUID));
150 subFrameworks.put(frameworkUuid, framework);
151 logger.log(INFO, "Created subframework " + frameworkUuid + " in parent " + foreignFrameworkUuid);
152 return framework;
153 } catch (Exception e) {
154 throw new IllegalStateException("Cannot start framework", e);
155 }
156 }
157
158 @Override
159 public void stop(BundleContext context) throws Exception {
160 for (Iterator<Framework> it = subFrameworks.values().iterator(); it.hasNext();) {
161 Framework framework = it.next();
162 framework.stop();
163 it.remove();
164
165 }
166 // for (Framework framework : subFrameworks.values()) {
167 // framework.stop();
168 // }
169 subFrameworks.clear();
170 foreignBundleContext = null;
171 frameworkFactory = null;
172 }
173
174 }