]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.init/src/org/argeo/init/osgi/ForeignBundleConnectContent.java
Improve runtime manager
[lgpl/argeo-commons.git] / org.argeo.init / src / org / argeo / init / osgi / ForeignBundleConnectContent.java
1 package org.argeo.init.osgi;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.net.URL;
6 import java.util.Collections;
7 import java.util.Dictionary;
8 import java.util.List;
9 import java.util.Map;
10 import java.util.Optional;
11 import java.util.function.Function;
12 import java.util.stream.Collectors;
13
14 import org.osgi.framework.Bundle;
15 import org.osgi.framework.BundleContext;
16 import org.osgi.framework.connect.ConnectContent;
17
18 /**
19 * A {@link ConnectContent} based on a {@link Bundle} from another OSGi runtime.
20 */
21 class ForeignBundleConnectContent implements ConnectContent {
22 private final Bundle foreignBundle;
23 private final ClassLoader classLoader;
24
25 public ForeignBundleConnectContent(BundleContext localBundleContext, Bundle foreignBundle) {
26 this.foreignBundle = foreignBundle;
27 this.classLoader = new ForeignBundleClassLoader(localBundleContext, foreignBundle);
28 }
29
30 @Override
31 public Optional<Map<String, String>> getHeaders() {
32 Dictionary<String, String> dict = foreignBundle.getHeaders();
33 List<String> keys = Collections.list(dict.keys());
34 Map<String, String> dictCopy = keys.stream().collect(Collectors.toMap(Function.identity(), dict::get));
35 return Optional.of(dictCopy);
36 }
37
38 @Override
39 public Iterable<String> getEntries() throws IOException {
40 List<String> lst = Collections.list(foreignBundle.findEntries("", "*", true)).stream().map((u) -> u.getPath())
41 .toList();
42 return lst;
43 }
44
45 @Override
46 public Optional<ConnectEntry> getEntry(String path) {
47 URL u = foreignBundle.getEntry(path);
48 if (u == null) {
49 u = foreignBundle.getEntry("bin/" + path);
50 // System.err.println(u2);
51 }
52 if (u == null) {
53 if ("plugin.xml".equals(path))
54 return Optional.empty();
55 if (path.startsWith("META-INF/versions/"))
56 return Optional.empty();
57 System.err.println(foreignBundle.getSymbolicName() + " " + path + " not found");
58 return Optional.empty();
59 }
60 URL url = u;
61 ConnectEntry urlConnectEntry = new ConnectEntry() {
62
63 @Override
64 public String getName() {
65 return path;
66 }
67
68 @Override
69 public long getLastModified() {
70 return foreignBundle.getLastModified();
71 }
72
73 @Override
74 public InputStream getInputStream() throws IOException {
75 return url.openStream();
76 }
77
78 @Override
79 public long getContentLength() {
80 return -1;
81 }
82 };
83 return Optional.of(urlConnectEntry);
84 }
85
86 @Override
87 public Optional<ClassLoader> getClassLoader() {
88 ClassLoader cl;
89 // cl = bundle.adapt(BundleWiring.class).getClassLoader();
90
91 // cl = subFrameworkClassLoader;
92 cl = classLoader;
93 return Optional.of(cl);
94 // return Optional.empty();
95 }
96
97 @Override
98 public void open() throws IOException {
99 }
100
101 @Override
102 public void close() throws IOException {
103
104 }
105
106 }