Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public final class JBangSettings {
Expand Down Expand Up @@ -59,6 +62,9 @@ public final class JBangSettings {
private static final String APP_ENV = JBANG_ENV_PREFIX + "APP";
private static final String APP_DEFAULT = "citrus@citrusframework/citrus";

private static final String ARGS_PROPERTY = JBANG_PROPERTY_PREFIX + "args";
private static final String ARGS_ENV = JBANG_ENV_PREFIX + "ARGS";

private static final String JBANG_EXECUTABLE_PROPERTY = JBANG_PROPERTY_PREFIX + "executable";
private static final String JBANG_EXECUTABLE_ENV = JBANG_ENV_PREFIX + "EXECUTABLE";
private static final String JBANG_EXECUTABLE_DEFAULT = "";
Expand Down Expand Up @@ -158,4 +164,64 @@ public static String getJBangExecutable() {
.or(() -> Optional.ofNullable(System.getProperty(JBANG_EXECUTABLE_PROPERTY, System.getenv(JBANG_EXECUTABLE_ENV))))
.orElse(JBANG_EXECUTABLE_DEFAULT);
}

/**
* JBang command arguments resolved from system property or environment variable.
* Arguments are specified as comma-delimited key=value pairs. Repeated argument names
* are merged into a single argument with comma-separated values.
*/
public static List<String> getArgs() {
return parseArgs(System.getProperty(ARGS_PROPERTY, System.getenv(ARGS_ENV)));
}

/**
* Parses comma-delimited key=value argument pairs into a list of JBang command arguments.
* Adds the "--" prefix to argument names when not already present.
* Merges repeated argument names into a single "--arg=value1,value2" argument.
* Empty values produce flag-only arguments (e.g., "fresh=" becomes "--fresh").
*/
static List<String> parseArgs(String argsValue) {
if (argsValue == null || argsValue.isBlank()) {
return Collections.emptyList();
}

LinkedHashMap<String, List<String>> argMap = new LinkedHashMap<>();
for (String part : argsValue.split(",")) {
String trimmed = part.trim();
if (trimmed.isEmpty()) {
continue;
}

int eqIndex = trimmed.indexOf('=');
String name;
String value;
if (eqIndex >= 0) {
name = trimmed.substring(0, eqIndex).trim();
value = trimmed.substring(eqIndex + 1).trim();
} else {
name = trimmed;
value = "";
}

if (!name.startsWith("--")) {
name = "--" + name;
}

argMap.computeIfAbsent(name, k -> new ArrayList<>());
if (!value.isEmpty()) {
argMap.get(name).add(value);
}
}

List<String> result = new ArrayList<>();
for (Map.Entry<String, List<String>> entry : argMap.entrySet()) {
if (entry.getValue().isEmpty()) {
result.add(entry.getKey());
} else {
result.add(entry.getKey() + "=" + String.join(",", entry.getValue()));
}
}

return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,8 @@ public ProcessAndOutput runAsync(String command, File output, List<String> args)
private List<String> constructAllArgs(String command, List<String> args) {
List<String> allArgs = new ArrayList<>();

// JBang app name
allArgs.addAll(JBangSettings.getArgs());

if (app != null) {
allArgs.add(app);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* Copyright the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.citrusframework.jbang;

import java.util.List;

import org.testng.Assert;
import org.testng.annotations.Test;

public class JBangSettingsTest {

@Test
public void shouldReturnEmptyListForNullInput() {
Assert.assertTrue(JBangSettings.parseArgs(null).isEmpty());
}

@Test
public void shouldReturnEmptyListForEmptyInput() {
Assert.assertTrue(JBangSettings.parseArgs("").isEmpty());
}

@Test
public void shouldReturnEmptyListForBlankInput() {
Assert.assertTrue(JBangSettings.parseArgs(" ").isEmpty());
}

@Test
public void shouldParseSingleArgWithValue() {
List<String> result = JBangSettings.parseArgs("deps=org.foo:bar:1.0");
Assert.assertEquals(result, List.of("--deps=org.foo:bar:1.0"));
}

@Test
public void shouldParseMultipleArgs() {
List<String> result = JBangSettings.parseArgs("deps=org.foo:bar:1.0,fresh=");
Assert.assertEquals(result, List.of("--deps=org.foo:bar:1.0", "--fresh"));
}

@Test
public void shouldMergeRepeatedArgNames() {
List<String> result = JBangSettings.parseArgs("deps=org.foo:bar:1.0,deps=org.baz:qux:2.0");
Assert.assertEquals(result, List.of("--deps=org.foo:bar:1.0,org.baz:qux:2.0"));
}

@Test
public void shouldHandleEmptyValueAsFlag() {
List<String> result = JBangSettings.parseArgs("fresh=");
Assert.assertEquals(result, List.of("--fresh"));
}

@Test
public void shouldHandleArgWithoutEqualsAsFlag() {
List<String> result = JBangSettings.parseArgs("fresh");
Assert.assertEquals(result, List.of("--fresh"));
}

@Test
public void shouldNotAddDoubleDashPrefix() {
List<String> result = JBangSettings.parseArgs("--deps=org.foo:bar:1.0");
Assert.assertEquals(result, List.of("--deps=org.foo:bar:1.0"));
}

@Test
public void shouldHandleFullExampleFromIssue() {
List<String> result = JBangSettings.parseArgs("deps=org.foo:bar:1.0,deps=org.baz:qux:2.0,fresh=");
Assert.assertEquals(result, List.of("--deps=org.foo:bar:1.0,org.baz:qux:2.0", "--fresh"));
}

@Test
public void shouldPreserveArgOrder() {
List<String> result = JBangSettings.parseArgs("fresh=,deps=org.foo:bar:1.0,verbose=");
Assert.assertEquals(result, List.of("--fresh", "--deps=org.foo:bar:1.0", "--verbose"));
}

@Test
public void shouldTrimWhitespace() {
List<String> result = JBangSettings.parseArgs(" deps = org.foo:bar:1.0 , fresh = ");
Assert.assertEquals(result, List.of("--deps=org.foo:bar:1.0", "--fresh"));
}
}
Loading