in atomosfeaturelauncherconfig/src/main/java/org/apache/sling/feature/launcher/atomos/config/AtomosConfigRunner.java [113:355]
public Integer call() throws Exception {
int defaultStartLevel = getFrameworkProperty("felix.startlevel.bundle", 1);
List<String> classPath = new ArrayList<>();
Path currentDir = Paths.get("").toAbsolutePath();
List<URL> synthetics = this.bundleMap.remove(Integer.MAX_VALUE);
if (synthetics != null) {
for (final URL file : synthetics) {
File localFile = IOUtils.getFileFromURL(file, false, null);
classPath.add(currentDir.relativize(localFile.toPath().toAbsolutePath()).toString());
}
}
List<String> bundles = new ArrayList<>();
for(final Integer startLevel : sortStartLevels(this.bundleMap.keySet(), defaultStartLevel)) {
logger.debug("Installing bundles with start level {}", startLevel);
for (final URL file : bundleMap.get(startLevel)) {
File localFile = IOUtils.getFileFromURL(file, false, null);
classPath.add(currentDir.relativize(localFile.toPath().toAbsolutePath()).toString());
bundles.add(currentDir.relativize(localFile.toPath().toAbsolutePath()).toString());
}
}
System.out.println(String.join(File.pathSeparator, classPath));
bundles.add(0, "artifacts/org/apache/felix/org.apache.felix.framework/7.0.5/org.apache.felix.framework-7.0.5.jar");
LauncherBuilder builder = Launcher.builder();
Config cfg = new Config() {};
builder.addPlugin(new FileCollectorPlugin<Config>() {
@Override
public void init(Config unused) {
}
@Override
public void collectFiles(Context context) {
bundles.stream().map(File::new).map(File::toPath).forEach(entry -> context.addFile(entry, FileType.ARTIFACT));
}
}, cfg);
File outputDir = new File(currentDir.toFile(), "atomos-config");
outputDir.mkdirs();
IndexPluginConfig ic = new IndexPluginConfig()
{
@Override
public Path indexOutputDirectory()
{
return outputDir.toPath();
}
@Override
public IndexOutputType indexOutputType()
{
return IndexOutputType.JAR;
}
};
builder.addPlugin(IndexPlugin.class, ic);
ComponentDescriptionPlugin test = new ComponentDescriptionPlugin();
builder//
.addPlugin(ReflectionBundleActivatorPlugin.class, cfg)//
.addPlugin(new ComponentMetaDataPlugin<Config>() {
@Override
public void doComponentMetaData(ComponentDescription componentDescription, Context context, ClassLoader classLoader) {
try {
test.doComponentMetaData(componentDescription, new Context() {
@Override
public void addReflectionClass(String s) {
context.addReflectionClass(s);
}
@Override
public void addReflectionConstructor(String s, String[] strings) {
context.addReflectionConstructor(s, strings);
if (strings != null) {
Arrays.stream(strings).forEach(name -> {
try {
if (classLoader.loadClass(name).isAnnotation()) {
addDynamicProxyConfigs(name);
}
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
@Override
public void addReflectionConstructorAllPublic(String s) {
context.addReflectionConstructorAllPublic(s);
}
@Override
public void addReflectionField(String s, Class<?> aClass) {
context.addReflectionField(s, aClass);
if (aClass != null && aClass.isAnnotation()) addDynamicProxyConfigs(aClass.getName());
try {
if (aClass.getField(s).getType().isAnnotation()) addDynamicProxyConfigs(aClass.getField(s).getType().getName());
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void addReflectionFieldsAllPublic(String s) {
context.addReflectionFieldsAllPublic(s);
}
@Override
public void addFile(Path path, FileType fileType) {
context.addFile(path, fileType);
}
@Override
public void addReflectionMethod(String name, Class<?> aClass) {
Arrays.stream(aClass.getDeclaredMethods()).filter(m -> m.getName().equals(name)).findFirst()
.ifPresent(m -> addReflectionMethod(m));
}
@Override
public void addReflecionMethod(String s, Class<?>[] classes, Class<?> aClass) {
context.addReflecionMethod(s, classes, aClass);
try {
Arrays.stream(aClass.getDeclaredMethods()).filter(m -> m.getName().equals(s)).map(Method::getParameterTypes).flatMap(Arrays::stream).filter(Class::isAnnotation).map(Class::getName).forEach(this::addDynamicProxyConfigs);
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void addReflectionMethodsAllPublic(String s) {
context.addReflectionMethodsAllPublic(s);
}
@Override
public void addRegisterServiceCalls(RegisterServiceCall registerServiceCall) {
context.addRegisterServiceCalls(registerServiceCall);
}
@Override
public void addResourceConfig(ResourceConfiguration resourceConfiguration) {
context.addResourceConfig(resourceConfiguration);
}
@Override
public Stream<Path> getFiles(FileType... fileTypes) {
return context.getFiles(fileTypes);
}
@Override
public List<RegisterServiceCall> getRegisterServiceCalls() {
return context.getRegisterServiceCalls();
}
@Override
public ResourceConfiguration getResourceConfig() {
return context.getResourceConfig();
}
@Override
public DynamicProxyConfiguration getDynamicProxyConfig() {
return context.getDynamicProxyConfig();
}
@Override
public void addDynamicProxyConfigs(String... strings) {
context.addDynamicProxyConfigs(strings);
}
@Override
public ReflectionConfiguration getReflectConfig() {
return context.getReflectConfig();
}
}
, new SecureClassLoader() {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
try {
return getClass().getClassLoader().loadClass(name);
} catch (Exception e) {
return classLoader.loadClass(name);
}
}
}); } catch (NoClassDefFoundError err) {
err.printStackTrace();
}
}
@Override
public void init(Config config) {
test.init(config);
}
}, cfg)//
.addPlugin(InvocatingBundleActivatorPlugin.class, cfg)//
.addPlugin(OsgiDTOPlugin.class, cfg)//
.addPlugin(ResourcePlugin.class, cfg);//
builder.addPlugin(new FinalPlugin<Void>() {
@Override
public void init(Void unused) {
}
@Override
public void doFinal(Context context) {
try {
// prepare configuration files
DynamicProxyConfiguration dynPrC = context.getDynamicProxyConfig();
String sDynPrC = NativeImageConfigJsonProvider.newInstance().json(dynPrC);
ReflectionConfiguration refCs = context.getReflectConfig();
String sRefCs = NativeImageConfigJsonProvider.newInstance().json(refCs);
ResourceConfiguration resC = context.getResourceConfig();
String sResC = NativeImageConfigJsonProvider.newInstance().json(resC);
bundles.add("atomos.substrate.jar");
String configFeature =
"{\"id\":\"org.apache.sling:org.apache.sling.feature.launcher.atomos.config:0.0.1-SNAPSHOT:calculated\"," +
"\"atomos-config:JSON|false\": {" +
"\"proxy-config\":" + sDynPrC +
",\"reflect-config\":" + sRefCs +
",\"resource-config\":" + sResC +
",\"classpath\": [" + bundles.stream().map(entry -> "\"" + entry + "\"").collect(Collectors.joining(",")) + "]" +
"}}";
try (OutputStream output = new FileOutputStream(new File(outputDir, "config-feature.slingosgifeature"))) {
output.write(configFeature.getBytes("UTF-8"));
}
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}, null);
builder.build().execute();
return FrameworkEvent.STOPPED;
}