protected static void parseArgs()

in src/main/java/org/apache/sling/feature/launcher/impl/Main.java [153:357]


    protected static void parseArgs(final LauncherConfig config, final String[] args) {

        final Option artifactClashOverride = Option.builder(OPT_ARTICACT_CLASH)
                .longOpt("artifact-clash")
                .desc("Set artifact clash override")
                .optionalArg(true)
                .numberOfArgs(Option.UNLIMITED_VALUES)
                .build();

        final Option configClashOverride = Option.builder(OPT_CONFIG_CLASH)
                .longOpt("config-clash")
                .desc("Set config clash override")
                .optionalArg(true)
                .numberOfArgs(Option.UNLIMITED_VALUES)
                .build();

        final Option repoOption = Option.builder(OPT_REPOSITORY_URLS)
                .longOpt("repository-urls")
                .desc("Set repository urls")
                .optionalArg(true)
                .valueSeparator(',')
                .numberOfArgs(Option.UNLIMITED_VALUES)
                .build();

        final Option featureOption = Option.builder(OPT_FEATURE_FILES)
                .longOpt("feature-files")
                .desc("Set feature files")
                .optionalArg(true)
                .valueSeparator(',')
                .numberOfArgs(Option.UNLIMITED_VALUES)
                .build();

        final Option featureIdOption = Option.builder(OPT_LAUNCH_FEATURE_ID)
                .longOpt("launch-feature-id")
                .desc("Set the id for the launch feature")
                .optionalArg(true)
                .numberOfArgs(1)
                .build();

        final Option fwkProperties = Option.builder(OPT_FRAMEWORK_PROPERTIES)
                .longOpt("framework-property")
                .desc("Set framework property, format: -D key1=val1 -D key2=val2")
                .hasArg()
                .optionalArg(true)
                .build();

        final Option varValue = Option.builder(OPT_VARIABLE_VALUES)
                .longOpt("variable-value")
                .desc("Set variable value, format: -V key1=val1 -V key2=val2")
                .optionalArg(true)
                .numberOfArgs(Option.UNLIMITED_VALUES)
                .build();

        final Option debugOption = Option.builder(OPT_VERBOSE)
                .longOpt("verbose")
                .desc("Verbose")
                .optionalArg(true)
                .numberOfArgs(1)
                .build();

        final Option cacheOnlyOption = Option.builder(OPT_CACHE_ONLY)
                .longOpt("cacheOnly")
                .desc("Cache only the required dependencies. Don't start the framework.")
                .optionalArg(true)
                .build();

        final Option cacheOption = Option.builder(OPT_CACHE_DIR)
                .longOpt("cache_dir")
                .desc("Set cache dir")
                .optionalArg(true)
                .numberOfArgs(1)
                .build();

        final Option homeOption = Option.builder(OPT_HOME_DIR)
                .longOpt("home_dir")
                .desc("Set home dir")
                .optionalArg(true)
                .numberOfArgs(1)
                .build();

        final Option extensionConfiguration = Option.builder(OPT_EXTENSION_CONFIGURATION)
                .longOpt("extension_configuration")
                .desc("Provide extension configuration, format: extensionName:key1=val1,key2=val2")
                .optionalArg(true)
                .numberOfArgs(Option.UNLIMITED_VALUES)
                .build();

        final Option frameworkVersionOption = Option.builder(OPT_FELIX_FRAMEWORK_VERSION)
                .longOpt("felix-framework-version")
                .desc("Set Apache Felix framework version (default "
                        .concat(Bootstrap.FELIX_FRAMEWORK_VERSION) + ")")
                .optionalArg(true)
                .numberOfArgs(1)
                .build();

        final Option frameworkArtifactOption = Option.builder(OPT_OSGI_FRAMEWORK_ARTIFACT)
                .longOpt("osgi-framework-artifact")
                .desc("Set OSGi framework artifact (overrides Apache Felix framework version)")
                .optionalArg(true)
                .numberOfArgs(1)
                .build();

        final Option printInsideContainerHelp = Option.builder(OPT_PRINT_CONTAINER_ENV_HELP)
              
                .desc("print additional help information for container env vars.")
                .optionalArg(true)
                .build();
        
               options = new Options().addOption(artifactClashOverride)
                .addOption(configClashOverride)
                .addOption(repoOption)
                .addOption(featureOption)
                .addOption(featureIdOption)
                .addOption(fwkProperties)
                .addOption(varValue)
                .addOption(debugOption)
                .addOption(cacheOnlyOption)
                .addOption(cacheOption)
                .addOption(homeOption)
                .addOption(extensionConfiguration)
                .addOption(frameworkVersionOption)
                .addOption(frameworkArtifactOption)
                .addOption(printInsideContainerHelp);

        
        final CommandLineParser clp = new DefaultParser();

        try {
            final CommandLine cl = clp.parse(options, args);

            extractValuesFromOption(cl, OPT_REPOSITORY_URLS).ifPresent(
                    values -> config.setRepositoryUrls(values.stream().toArray(String[]::new)));

            extractValuesFromOption(cl, OPT_ARTICACT_CLASH).ifPresent(values -> values
                    .forEach(v -> config.getArtifactClashOverrides().add(ArtifactId.parse(v))));

            extractValuesFromOption(cl, OPT_CONFIG_CLASH).orElseGet(ArrayList::new)
            .forEach(value -> {
                final String[] keyVal = split(value);
                config.getConfigClashOverrides().put(keyVal[0], keyVal[1]);
            });

            extractValuesFromOption(cl, OPT_FRAMEWORK_PROPERTIES).orElseGet(ArrayList::new)
            .forEach(value -> {
                final String[] keyVal = split(value);
                config.getInstallation().getFrameworkProperties().put(keyVal[0], keyVal[1]);
            });

            extractValuesFromOption(cl, OPT_VARIABLE_VALUES).orElseGet(ArrayList::new)
            .forEach(value -> {
                final String[] keyVal = split(value);
                config.getVariables().put(keyVal[0], keyVal[1]);
            });

            if (cl.hasOption(OPT_VERBOSE)) {
                extractValueFromOption(cl, OPT_VERBOSE, "debug").ifPresent(value -> {

                    if (isLoglevel(value)) {
                        System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", value);
                    }
                });
            } // if not the `org.slf4j.simpleLogger.defaultLogLevel` is by default `info`

            if (cl.hasOption(OPT_CACHE_ONLY)) {
                    config.setCacheOnly(true);
            }

            extractValuesFromOption(cl, OPT_FEATURE_FILES).orElseGet(ArrayList::new)
                    .forEach(config::addFeatureFiles);

            extractValueFromOption(cl, OPT_LAUNCH_FEATURE_ID)
                    .ifPresent(config::setLaunchFeatureId);

            extractValueFromOption(cl, OPT_CACHE_DIR).map(File::new)
                    .ifPresent(config::setCacheDirectory);

            extractValueFromOption(cl, OPT_HOME_DIR).map(File::new)
                    .ifPresent(config::setHomeDirectory);

            extractValuesFromOption(cl, OPT_EXTENSION_CONFIGURATION)
                    .ifPresent(values -> values.forEach(v -> {
                        Map.Entry<String, Map<String, String>> xc = splitMap2(v);
                        Map<String, Map<String, String>> ec = config.getExtensionConfiguration();
                        Map<String, String> c = ec.get(xc.getKey());
                        if (c == null) {
                            c = new HashMap<>();
                            ec.put(xc.getKey(), c);
                        }
                        c.putAll(xc.getValue());
                    }));

            extractValueFromOption(cl, OPT_FELIX_FRAMEWORK_VERSION)
                    .ifPresent(config::setFrameworkVersion);

            extractValueFromOption(cl, OPT_OSGI_FRAMEWORK_ARTIFACT)
                    .ifPresent(config::setFrameworkArtifact);

        } catch (final ParseException pe) {
            Main.LOG().error("Unable to parse command line: {}", pe.getMessage(), pe);

            printHelp();

            System.exit(1);
        }
    }