Reworking main method argument parsing.

Updated gradle build file.
This commit is contained in:
Geert Bevin 2023-01-01 10:26:29 -05:00
parent 076c95d132
commit c98db644bd
3 changed files with 72 additions and 54 deletions

View file

@ -1,4 +1,8 @@
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
plugins { plugins {
application
`java-library` `java-library`
`maven-publish` `maven-publish`
signing signing
@ -9,6 +13,9 @@ plugins {
group = "com.uwyn" group = "com.uwyn"
version = "1.0.1-SNAPSHOT" version = "1.0.1-SNAPSHOT"
val mavenName = "UrlEncoder"
val javaMainClass = "$group.${rootProject.name}.$mavenName"
base { base {
archivesName.set(rootProject.name) archivesName.set(rootProject.name)
} }
@ -16,21 +23,12 @@ base {
java { java {
withJavadocJar() withJavadocJar()
withSourcesJar() withSourcesJar()
toolchain { sourceCompatibility = JavaVersion.VERSION_11
languageVersion.set(JavaLanguageVersion.of(11)) targetCompatibility = JavaVersion.VERSION_11
}
} }
tasks.jar { application {
manifest { mainClass.set(javaMainClass)
attributes["Main-Class"] = "com.uwyn.urlencoder.UrlEncoder"
}
}
tasks.jacocoTestReport {
reports {
xml.required.set(true)
}
} }
sonarqube { sonarqube {
@ -50,8 +48,26 @@ dependencies {
testImplementation("org.junit.jupiter:junit-jupiter:5.9.0") testImplementation("org.junit.jupiter:junit-jupiter:5.9.0")
} }
tasks.named<Test>("test") { tasks {
jar {
manifest {
attributes["Main-Class"] = javaMainClass
}
}
withType<Test> {
useJUnitPlatform() useJUnitPlatform()
testLogging {
exceptionFormat = TestExceptionFormat.FULL
events = setOf(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
}
}
jacocoTestReport {
reports {
xml.required.set(true)
}
}
} }
publishing { publishing {
@ -60,7 +76,7 @@ publishing {
artifactId = rootProject.name artifactId = rootProject.name
from(components["java"]) from(components["java"])
pom { pom {
name.set("URLEncoder") name.set(mavenName)
description.set("A simple library to encode/decode URL parameters") description.set("A simple library to encode/decode URL parameters")
url.set("https://github.com/gbevin/urlencoder") url.set("https://github.com/gbevin/urlencoder")
licenses { licenses {

View file

@ -5,7 +5,7 @@
package com.uwyn.urlencoder; package com.uwyn.urlencoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.BitSet; import java.util.*;
/** /**
* URL encoding and decoding. * URL encoding and decoding.
@ -229,46 +229,48 @@ public final class UrlEncoder {
} }
} }
static MainResult handleMain(String[] arguments) { static MainResult processMain(String[] arguments) {
var valid_arguments = true; var valid_arguments = false;
if (arguments.length < 1 || var perform_decode = false;
arguments.length > 2) { var args = new ArrayList<>(List.of(arguments));
valid_arguments = false; if (!args.isEmpty() && args.get(0).startsWith("-")) {
} else if (!arguments[0].startsWith("-")) { var option = args.remove(0);
if (arguments.length > 1) { if (option.equals("-d")) {
valid_arguments = false; perform_decode = true;
} valid_arguments = true;
} else if (option.equals("-e")) {
valid_arguments = true;
} else { } else {
if (!arguments[0].equals("-e") && args.clear();
!arguments[0].equals("-d")) {
valid_arguments = false;
} }
} }
var text = "";
if (args.size() == 1) {
text = args.remove(0);
valid_arguments = true;
}
if (!valid_arguments) { if (!valid_arguments) {
return new MainResult("Usage : java " + UrlEncoder.class.getName() + " [-ed] text" + System.lineSeparator() + return new MainResult("Usage : java -jar urlencoder-*.jar [-ed] text" + System.lineSeparator() +
"Encode and decode URL parameters." + System.lineSeparator() + "Encode and decode URL parameters." + System.lineSeparator() +
" -e encode (default)" + System.lineSeparator() + " -e encode (default)" + System.lineSeparator() +
" -d decode", 1); " -d decode", 1);
} }
if (perform_decode) {
if (1 == arguments.length) { return new MainResult(UrlEncoder.decode(text), 0);
return new MainResult(UrlEncoder.encode(arguments[0]), 0); } else {
} else if (arguments[0].equals("-e")) { return new MainResult(UrlEncoder.encode(text), 0);
return new MainResult(UrlEncoder.encode(arguments[1]), 0);
} }
return new MainResult(UrlEncoder.decode(arguments[1]), 0);
} }
public static void main(String[] arguments) { public static void main(String[] arguments) {
var result = handleMain(arguments); var result = processMain(arguments);
if (result.status == 0) { if (result.status == 0) {
System.out.println(result.output); System.out.println(result.output);
System.exit(0);
} else { } else {
System.err.println(result.output); System.err.println(result.output);
}
System.exit(result.status); System.exit(result.status);
} }
}
} }

View file

@ -47,43 +47,43 @@ class UrlEncoderTest {
@Test @Test
void testMainNoArgs() { void testMainNoArgs() {
var result = UrlEncoder.handleMain(new String[0]); var result = UrlEncoder.processMain(new String[0]);
assertEquals(1, result.status); assertEquals(1, result.status);
assertTrue(result.output.contains(UrlEncoder.class.getName())); assertTrue(result.output.contains("Usage :"));
} }
@Test @Test
void testMainTooManyArgs() { void testMainTooManyArgs() {
var result = UrlEncoder.handleMain(new String[] {"-x", "-g", "f"}); var result = UrlEncoder.processMain(new String[] {"-x", "-g", "f"});
assertEquals(1, result.status); assertEquals(1, result.status);
assertTrue(result.output.contains(UrlEncoder.class.getName())); assertTrue(result.output.contains("Usage :"));
} }
@Test @Test
void testMainWrongArgs1() { void testMainWrongArgs1() {
var result = UrlEncoder.handleMain(new String[] {"-p"}); var result = UrlEncoder.processMain(new String[] {"-p"});
assertEquals(1, result.status); assertEquals(1, result.status);
assertTrue(result.output.contains(UrlEncoder.class.getName())); assertTrue(result.output.contains("Usage :"));
} }
@Test @Test
void testMainWrongArgs2() { void testMainWrongArgs2() {
var result = UrlEncoder.handleMain(new String[] {"-x", "txt"}); var result = UrlEncoder.processMain(new String[] {"-x", "txt"});
assertEquals(1, result.status); assertEquals(1, result.status);
assertTrue(result.output.contains(UrlEncoder.class.getName())); assertTrue(result.output.contains("Usage :"));
} }
@Test @Test
void testMainWrongArgs3() { void testMainWrongArgs3() {
var result = UrlEncoder.handleMain(new String[] {"stuff", "txt"}); var result = UrlEncoder.processMain(new String[] {"stuff", "txt"});
assertEquals(1, result.status); assertEquals(1, result.status);
assertTrue(result.output.contains(UrlEncoder.class.getName())); assertTrue(result.output.contains("Usage :"));
} }
@Test @Test
void testDecodeMainOption() { void testDecodeMainOption() {
validMap.forEach((expected, source) -> { validMap.forEach((expected, source) -> {
var result = UrlEncoder.handleMain(new String[] {"-d", source}); var result = UrlEncoder.processMain(new String[] {"-d", source});
assertEquals(0, result.status); assertEquals(0, result.status);
assertEquals(expected, result.output); assertEquals(expected, result.output);
}); });
@ -92,7 +92,7 @@ class UrlEncoderTest {
@Test @Test
void testEncodeMainDefault() { void testEncodeMainDefault() {
validMap.forEach((source, expected) -> { validMap.forEach((source, expected) -> {
var result = UrlEncoder.handleMain(new String[] {source}); var result = UrlEncoder.processMain(new String[] {source});
assertEquals(0, result.status); assertEquals(0, result.status);
assertEquals(expected, result.output); assertEquals(expected, result.output);
}); });
@ -101,7 +101,7 @@ class UrlEncoderTest {
@Test @Test
void testEncodeMainOption() { void testEncodeMainOption() {
validMap.forEach((source, expected) -> { validMap.forEach((source, expected) -> {
var result = UrlEncoder.handleMain(new String[] {"-e", source}); var result = UrlEncoder.processMain(new String[] {"-e", source});
assertEquals(0, result.status); assertEquals(0, result.status);
assertEquals(expected, result.output); assertEquals(expected, result.output);
}); });