public Integer call()

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;
    }