Thread: [Japi-cvs] SF.net SVN: japi: [554] libs/argparser/trunk/src (Page 2)
Status: Beta
Brought to you by:
christianhujer
|
From: <chr...@us...> - 2007-07-29 19:22:18
|
Revision: 554
http://japi.svn.sourceforge.net/japi/?rev=554&view=rev
Author: christianhujer
Date: 2007-07-29 12:22:12 -0700 (Sun, 29 Jul 2007)
Log Message:
-----------
[ 1758846 ] Multiple command file inclusion fails
Modified Paths:
--------------
libs/argparser/trunk/src/net/sf/japi/io/args/ArgParser.java
libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest.java
Added Paths:
-----------
libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileMaster
libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave1
libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave2
Modified: libs/argparser/trunk/src/net/sf/japi/io/args/ArgParser.java
===================================================================
--- libs/argparser/trunk/src/net/sf/japi/io/args/ArgParser.java 2007-07-15 10:32:03 UTC (rev 553)
+++ libs/argparser/trunk/src/net/sf/japi/io/args/ArgParser.java 2007-07-29 19:22:12 UTC (rev 554)
@@ -19,6 +19,7 @@
package net.sf.japi.io.args;
+import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.lang.reflect.InvocationTargetException;
@@ -77,7 +78,7 @@
this.command = command;
commandClass = command.getClass();
initMethods();
- final List<String> argList = getAllArguments(Arrays.asList(args));
+ final List<String> argList = getAllArguments(new File("."), Arrays.asList(args));
argIterator = argList.listIterator();
parse();
checkRequiredMethods();
@@ -95,10 +96,11 @@
/**
* Returns a list of all arguments after parsing arguments files.
+ * @param context File relative to which @-inclusions have to be resolved.
* @param args arguments before parsing argument files.
* @return all arguments after parsing argument files.
*/
- public List<String> getAllArguments(@NotNull final List<String> args) {
+ public List<String> getAllArguments(@NotNull final File context, @NotNull final List<String> args) {
final List<String> argList = new ArrayList<String>(args);
for (final ListIterator<String> iterator = argList.listIterator(); iterator.hasNext();) {
final String arg = iterator.next();
@@ -107,7 +109,9 @@
}
if (arg.startsWith("@")) {
iterator.remove();
- for (final String insertArg : getAllArguments(readFromFile(arg.substring(1)))) {
+ final String filename = arg.substring(1);
+ final File file = new File(context.getParentFile(), filename);
+ for (final String insertArg : getAllArguments(file, readFromFile(file))) {
iterator.add(insertArg);
}
}
@@ -117,14 +121,14 @@
/**
* Returns a tokenized unparsed list of arguments from an arguments file.
- * @param filename Argument file to read.
+ * @param file Argument file to read.
* @return all arguments from that argument file.
*/
- public List<String> readFromFile(@NotNull final String filename) {
+ public List<String> readFromFile(@NotNull final File file) {
final List<String> args = new ArrayList<String>();
final TokenReader in;
try {
- in = new TokenReader(new FileInputStream(filename));
+ in = new TokenReader(new FileInputStream(file));
} catch (final FileNotFoundException e) {
// TODO TODO TODO TODO TODO
return args;
Modified: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest.java
===================================================================
--- libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest.java 2007-07-15 10:32:03 UTC (rev 553)
+++ libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest.java 2007-07-29 19:22:12 UTC (rev 554)
@@ -262,6 +262,26 @@
}
/**
+ * Tests that including multiple command files from a command file works.
+ * @throws RequiredOptionsMissingException (unexpected)
+ * @throws TerminalException (unexpected)
+ * @throws UnknownOptionException (unexpected)
+ * @throws MissingArgumentException (unexpected)
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1758846&group_id=149894&atid=776737">[ 1758846 ] Multiple command file inclusion fails</a>
+ */
+ @Test
+ public void testOptionsFromFileMultiple() throws RequiredOptionsMissingException, MissingArgumentException, TerminalException, UnknownOptionException {
+ final MockCommand command = new MockCommand();
+ ArgParser.parseAndRun(command, "@src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileMaster");
+ final List<String> args = command.getArgs();
+ Assert.assertEquals("Option value must be stored.", "fooInput", command.getInput());
+ Assert.assertTrue("Run must be called even with zero arguments.", command.isRunCalled());
+ Assert.assertEquals("Arguments must be stored.", 2, args.size());
+ Assert.assertEquals("Argument foo must be stored.", "foo", args.get(0));
+ Assert.assertEquals("Argument bar must be stored.", "bar", args.get(1));
+ }
+
+ /**
* Tests that single dash options also work.
* @throws RequiredOptionsMissingException (unexpected)
* @throws TerminalException (unexpected)
Added: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileMaster
===================================================================
--- libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileMaster (rev 0)
+++ libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileMaster 2007-07-29 19:22:12 UTC (rev 554)
@@ -0,0 +1,3 @@
+@ArgParserTest_MultipleOptionsFileSlave1
+@ArgParserTest_MultipleOptionsFileSlave2
+-i fooInput
\ No newline at end of file
Property changes on: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileMaster
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:eol-style
+ LF
Added: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave1
===================================================================
--- libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave1 (rev 0)
+++ libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave1 2007-07-29 19:22:12 UTC (rev 554)
@@ -0,0 +1 @@
+foo
\ No newline at end of file
Property changes on: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave1
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:eol-style
+ LF
Added: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave2
===================================================================
--- libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave2 (rev 0)
+++ libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave2 2007-07-29 19:22:12 UTC (rev 554)
@@ -0,0 +1 @@
+bar
\ No newline at end of file
Property changes on: libs/argparser/trunk/src/test/net/sf/japi/io/args/ArgParserTest_MultipleOptionsFileSlave2
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:eol-style
+ LF
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <chr...@us...> - 2007-09-10 21:36:31
|
Revision: 609
http://japi.svn.sourceforge.net/japi/?rev=609&view=rev
Author: christianhujer
Date: 2007-09-10 14:36:27 -0700 (Mon, 10 Sep 2007)
Log Message:
-----------
[ 1791713 ] quotation marks removed from @arg files
[ 1791715 ] \" silently changed to \\ in argfiles
Modified Paths:
--------------
libs/argparser/trunk/src/net/sf/japi/io/args/TokenReader.java
libs/argparser/trunk/src/test/net/sf/japi/io/args/TokenReaderTest.java
Modified: libs/argparser/trunk/src/net/sf/japi/io/args/TokenReader.java
===================================================================
--- libs/argparser/trunk/src/net/sf/japi/io/args/TokenReader.java 2007-09-09 17:21:28 UTC (rev 608)
+++ libs/argparser/trunk/src/net/sf/japi/io/args/TokenReader.java 2007-09-10 21:36:27 UTC (rev 609)
@@ -31,7 +31,13 @@
/**
* A TokenReader reads arguments from a file, non-recursive.
- * That means the arguments are read regarding a certain argument syntax, but remain otherwise unparsed.
+ * That means the arguments are read regarding a certain argument syntax which should match with bash-like Quoting, but remain otherwise unparsed.
+ * <h4>Quoting and Escaping</h4>
+ * <ul>
+ * <li>\ introduces an escape. The escape character will be ignored, and the character following the escape character looses its special meaning if any.</li>
+ * <li>" introduces a string. A string is ended with ". Inside a string, \ only escapes ".</li>
+ * <li>' introduces a literal string. A literal string is ended with '. Inside a literal string, only ' has special meaning.</li>
+ * </ul>
* @author <a href="mailto:ch...@ri...">Christian Hujer</a>
*/
public class TokenReader implements Closeable, Iterable<String>, Iterator<String> {
@@ -99,6 +105,12 @@
} else if (c == '"') {
mode = Mode.STRING;
tokenValid = true;
+ } else if (c == '\'') {
+ mode = Mode.CHARS;
+ tokenValid = true;
+ } else if (c == '\\') {
+ mode = Mode.ESCAPE;
+ tokenValid = true;
} else {
nextToken.append(c);
mode = Mode.NORMAL;
@@ -112,6 +124,10 @@
return nextToken.toString();
} else if (c == '"') {
mode = Mode.STRING;
+ } else if (c == '\'') {
+ mode = Mode.CHARS;
+ } else if (c == '\\') {
+ mode = Mode.ESCAPE;
} else {
nextToken.append(c);
}
@@ -126,9 +142,22 @@
}
break;
case STRING_ESCAPE:
+ if (c != '"') {
+ nextToken.append('\\');
+ }
nextToken.append(c);
mode = Mode.STRING;
break;
+ case ESCAPE:
+ nextToken.append(c);
+ mode = Mode.NORMAL;
+ break;
+ case CHARS:
+ if (c == '\'') {
+ mode = Mode.NORMAL;
+ } else {
+ nextToken.append(c);
+ }
default:
assert false;
}
@@ -152,7 +181,13 @@
STRING,
/** String Escape - \ inside "". */
- STRING_ESCAPE
- }
+ STRING_ESCAPE,
+ /** Secape - after \ but outside "". */
+ ESCAPE,
+
+ /** String - inside ''. */
+ CHARS
+ } // enum Mode
+
} // class TokenReader
Modified: libs/argparser/trunk/src/test/net/sf/japi/io/args/TokenReaderTest.java
===================================================================
--- libs/argparser/trunk/src/test/net/sf/japi/io/args/TokenReaderTest.java 2007-09-09 17:21:28 UTC (rev 608)
+++ libs/argparser/trunk/src/test/net/sf/japi/io/args/TokenReaderTest.java 2007-09-10 21:36:27 UTC (rev 609)
@@ -151,6 +151,148 @@
reader.next();
}
+ /** Tests that the TokenReader treats escaped quotes correctly.
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a>
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a>
+ */
+ @Test
+ public void testTokenEscapedQuotesRandom() {
+ final TokenReader reader = new TokenReader(createStream(" \\\" \\\" \\\" a\\\"a \"\\\"\" a\"\\\"\"a "));
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "\"", reader.next());
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "\"", reader.next());
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "\"", reader.next());
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "a\"a", reader.next());
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "\"", reader.next());
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "a\"a", reader.next());
+ Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext());
+ }
+
+ /** Tests that <samp>\n</samp> returns <samp>n</samp>.
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a>
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a>
+ */
+ @Test
+ public void testTokenReaderNormalEscape() {
+ final TokenReader reader = new TokenReader(createStream("\\n"));
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "n", reader.next());
+ Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext());
+ }
+
+ /** Tests that <samp>\"</samp> returns <samp>"</samp>.
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a>
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a>
+ */
+ @Test
+ public void testTokenReaderNormalQuote() {
+ final TokenReader reader = new TokenReader(createStream("\\\""));
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "\"", reader.next());
+ Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext());
+ }
+
+ /** Tests that <samp>\'</samp> returns <samp>'</samp>.
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a>
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a>
+ */
+ @Test
+ public void testTokenReaderNormalApos() {
+ final TokenReader reader = new TokenReader(createStream("\\'"));
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "'", reader.next());
+ Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext());
+ }
+
+ /** Tests that <samp>"\n"</samp> returns <samp>\n</samp>.
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a>
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a>
+ */
+ @Test
+ public void testTokenReaderQuotesEscape() {
+ final TokenReader reader = new TokenReader(createStream("\"\\n\""));
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "\\n", reader.next());
+ Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext());
+ }
+
+ /** Tests that <samp>"\""</samp> returns <samp>"</samp>.
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a>
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a>
+ */
+ @Test
+ public void testTokenReaderQuotesQuote() {
+ final TokenReader reader = new TokenReader(createStream("\"\\\"\""));
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "\"", reader.next());
+ Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext());
+ }
+
+ /** Tests that <samp>"'"</samp> returns <samp>'</samp>.
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a>
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a>
+ */
+ @Test
+ public void testTokenReaderQuotesApos1() {
+ final TokenReader reader = new TokenReader(createStream("\"'\""));
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "'", reader.next());
+ Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext());
+ }
+
+ /** Tests that <samp>"\'"</samp> returns <samp>\'</samp>.
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a>
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a>
+ */
+ @Test
+ public void testTokenReaderQuotesApos2() {
+ final TokenReader reader = new TokenReader(createStream("\"\\'\""));
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "\\'", reader.next());
+ Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext());
+ }
+
+ /** Tests that <samp>'\n'</samp> returns <samp>\n</samp>.
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a>
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a>
+ */
+ @Test
+ public void testTokenReaderAposEscape1() {
+ final TokenReader reader = new TokenReader(createStream("'\\n'"));
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "\\n", reader.next());
+ Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext());
+ }
+
+ /** Tests that <samp>'\\'</samp> returns <samp>\\</samp>.
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a>
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a>
+ */
+ @Test
+ public void testTokenReaderAposEscape2() {
+ final TokenReader reader = new TokenReader(createStream("'\\\\'"));
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "\\\\", reader.next());
+ Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext());
+ }
+
+ /** Tests that <samp>'"'</samp> returns <samp>"</samp>.
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791713&group_id=149894&atid=776737">[ 1791713 ] quotation marks removed from @arg files</a>
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1791715&group_id=149894&atid=776737">[ 1791715 ] \" silently changed to \\ in argfiles</a>
+ */
+ @Test
+ public void testTokenReaderAposQuote() {
+ final TokenReader reader = new TokenReader(createStream("'\"'"));
+ Assert.assertTrue("Before reading the last token, hasNext() must return true.", reader.hasNext());
+ Assert.assertEquals("Expecting token", "\"", reader.next());
+ Assert.assertFalse("After reading the last token, hasNext() must return false.", reader.hasNext());
+ }
+
/** Creates an InputStream for reading from a String.
* @param s String to read from.
* @return InputStream created from s.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <chr...@us...> - 2007-09-30 11:01:36
|
Revision: 621
http://japi.svn.sourceforge.net/japi/?rev=621&view=rev
Author: christianhujer
Date: 2007-09-30 04:01:34 -0700 (Sun, 30 Sep 2007)
Log Message:
-----------
Moved META-INF to src/prj where it belongs.
Added Paths:
-----------
libs/argparser/trunk/src/prj/META-INF/
Removed Paths:
-------------
libs/argparser/trunk/src/META-INF/
Copied: libs/argparser/trunk/src/prj/META-INF (from rev 619, libs/argparser/trunk/src/META-INF)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <chr...@us...> - 2007-10-12 19:27:42
|
Revision: 629
http://japi.svn.sourceforge.net/japi/?rev=629&view=rev
Author: christianhujer
Date: 2007-10-12 12:27:40 -0700 (Fri, 12 Oct 2007)
Log Message:
-----------
[ 1812417 ] auto-add newline to help header and footer
Modified Paths:
--------------
libs/argparser/trunk/src/prj/net/sf/japi/io/args/BasicCommand.java
libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/BasicCommandTest.java
libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommand.properties
libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommandMyBundle.properties
Modified: libs/argparser/trunk/src/prj/net/sf/japi/io/args/BasicCommand.java
===================================================================
--- libs/argparser/trunk/src/prj/net/sf/japi/io/args/BasicCommand.java 2007-10-12 19:23:31 UTC (rev 628)
+++ libs/argparser/trunk/src/prj/net/sf/japi/io/args/BasicCommand.java 2007-10-12 19:27:40 UTC (rev 629)
@@ -165,7 +165,8 @@
* @return Help header.
*/
@NotNull public String getHelpHeader() {
- return getString("helpHeader");
+ final String helpHeader = getString("helpHeader");
+ return helpHeader.endsWith("\n") ? helpHeader : helpHeader + "\n";
}
/**
@@ -175,7 +176,8 @@
* @return Help footer.
*/
@NotNull public String getHelpFooter() {
- return getString("helpFooter");
+ final String helpFooter = getString("helpFooter");
+ return helpFooter.endsWith("\n") ? helpFooter : helpFooter + "\n";
}
/**
Modified: libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/BasicCommandTest.java
===================================================================
--- libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/BasicCommandTest.java 2007-10-12 19:23:31 UTC (rev 628)
+++ libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/BasicCommandTest.java 2007-10-12 19:27:40 UTC (rev 629)
@@ -115,4 +115,42 @@
Assert.assertEquals("HelpHeaderFromMyBundle", mock.getString("helpHeader"));
}
+ /**
+ * Tests that {@link BasicCommand#getHelpHeader()} returns either the empty String or a String ending on "\n".
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1812417&group_id=149894&atid=776737">[ 1812417 ] auto-add newline to help header and footer</a>
+ */
+ @Test
+ public void testGetHelpHeaderNewline() {
+ final RBMockCommand mock = new RBMockCommand();
+ mock.setReturnOwnBundle(false);
+ Assert.assertEquals("HelpHeaderFromDefaultBundle\n", mock.getHelpHeader());
+ mock.setReturnOwnBundle(true);
+ Assert.assertEquals("HelpHeaderFromMyBundle\n", mock.getHelpHeader());
+ }
+
+ /**
+ * Tests that {@link BasicCommand#getHelpFooter()} returns the value from the correct bundle.
+ */
+ @Test
+ public void testGetHelpFooter() {
+ final RBMockCommand mock = new RBMockCommand();
+ mock.setReturnOwnBundle(false);
+ Assert.assertEquals("HelpFooterFromDefaultBundle", mock.getString("helpFooter"));
+ mock.setReturnOwnBundle(true);
+ Assert.assertEquals("HelpFooterFromMyBundle", mock.getString("helpFooter"));
+ }
+
+ /**
+ * Tests that {@link BasicCommand#getHelpFooter()} returns either the empty String or a String ending on "\n".
+ * @see <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1812417&group_id=149894&atid=776737">[ 1812417 ] auto-add newline to help header and footer</a>
+ */
+ @Test
+ public void testGetHelpFooterNewline() {
+ final RBMockCommand mock = new RBMockCommand();
+ mock.setReturnOwnBundle(false);
+ Assert.assertEquals("HelpFooterFromDefaultBundle\n", mock.getHelpFooter());
+ mock.setReturnOwnBundle(true);
+ Assert.assertEquals("HelpFooterFromMyBundle\n", mock.getHelpFooter());
+ }
+
} // class BasicCommandTest
Modified: libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommand.properties
===================================================================
--- libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommand.properties 2007-10-12 19:23:31 UTC (rev 628)
+++ libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommand.properties 2007-10-12 19:27:40 UTC (rev 629)
@@ -19,3 +19,4 @@
testGetString1=String1FromDefaultBundle
testGetString2=String2FromDefaultBundle
helpHeader=HelpHeaderFromDefaultBundle
+helpFooter=HelpFooterFromDefaultBundle
Modified: libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommandMyBundle.properties
===================================================================
--- libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommandMyBundle.properties 2007-10-12 19:23:31 UTC (rev 628)
+++ libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/RBMockCommandMyBundle.properties 2007-10-12 19:27:40 UTC (rev 629)
@@ -18,3 +18,4 @@
#
testGetString1=String1FromMyBundle
helpHeader=HelpHeaderFromMyBundle
+helpFooter=HelpFooterFromMyBundle
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <chr...@us...> - 2007-12-16 23:40:11
|
Revision: 632
http://japi.svn.sourceforge.net/japi/?rev=632&view=rev
Author: christianhujer
Date: 2007-12-16 15:40:08 -0800 (Sun, 16 Dec 2007)
Log Message:
-----------
Implemented -W for GNU style long option parsing.
Modified Paths:
--------------
libs/argparser/trunk/src/prj/net/sf/japi/io/args/ArgParser.java
libs/argparser/trunk/src/prj/net/sf/japi/io/args/Option.java
libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/ArgParserTest.java
Modified: libs/argparser/trunk/src/prj/net/sf/japi/io/args/ArgParser.java
===================================================================
--- libs/argparser/trunk/src/prj/net/sf/japi/io/args/ArgParser.java 2007-10-21 12:57:24 UTC (rev 631)
+++ libs/argparser/trunk/src/prj/net/sf/japi/io/args/ArgParser.java 2007-12-16 23:40:08 UTC (rev 632)
@@ -43,11 +43,11 @@
* @todo better handling of boolean arguments
* @todo Handling of - for STDIN as input argument filestream
* @todo automatic printout of default values if property getter available.
- * @todo Add -W long for gnu style long option parsing
* @todo Let the programmer choose whether long options with one dash should be supported (for Ragnor). If long options with one dash are supported, short option concatenation should be disabled.
* @todo Abbreviation of long options as long as the abbreviation is unique
* @todo Treat a single dash not as option
* @todo Alternative way of getting arguments by a callback mechanism which processes single arguments.
+ * @todo Disallow "W" as Option argument.
*/
public final class ArgParser {
@@ -226,7 +226,12 @@
break;
}
final boolean doubleDash = arg.charAt(1) == '-';
- currentOption = arg.substring(doubleDash ? 2 : 1);
+ if ("-W".equals(arg)) {
+ currentOption = argIterator.next();
+ argIterator.remove();
+ } else {
+ currentOption = arg.substring(doubleDash ? 2 : 1);
+ }
final int indexOfEq = currentOption.indexOf('=');
if (indexOfEq != -1) {
argIterator.add(currentOption.substring(indexOfEq + 1));
Modified: libs/argparser/trunk/src/prj/net/sf/japi/io/args/Option.java
===================================================================
--- libs/argparser/trunk/src/prj/net/sf/japi/io/args/Option.java 2007-10-21 12:57:24 UTC (rev 631)
+++ libs/argparser/trunk/src/prj/net/sf/japi/io/args/Option.java 2007-12-16 23:40:08 UTC (rev 632)
@@ -46,6 +46,8 @@
* The option names.
* Usually this is two Strings, a single letter and a descriptive String.
* Multiple descriptive Strings as well as no single letter String are allowed.
+ * It is an error to use an empty array.
+ * It is an error to use "W".
* @note the supplied string values MUST consist of ASCII-letters only (match regex <code>[a-zA-Z]+</code>).
* @return option names
*/
Modified: libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/ArgParserTest.java
===================================================================
--- libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/ArgParserTest.java 2007-10-21 12:57:24 UTC (rev 631)
+++ libs/argparser/trunk/src/tst/test/net/sf/japi/io/args/ArgParserTest.java 2007-12-16 23:40:08 UTC (rev 632)
@@ -38,6 +38,7 @@
/**
* Test for {@link ArgParser}.
+ * @todo Add a test that empty @Option value is not allowed.
* @author <a href="mailto:ch...@ri...">Christian Hujer</a>
*/
public class ArgParserTest {
@@ -331,6 +332,24 @@
}
/**
+ * Tests that GNU style options with -W are accepted and processed properly.
+ * @throws RequiredOptionsMissingException (unexpected)
+ * @throws TerminalException (unexpected)
+ * @throws UnknownOptionException (unexpected)
+ * @throws MissingArgumentException (unexpected)
+ * @throws ArgumentFileNotFoundException (unexpected)
+ */
+ @Test
+ public void testPosixStyleLong() throws RequiredOptionsMissingException, MissingArgumentException, TerminalException, UnknownOptionException, ArgumentFileNotFoundException {
+ final MockCommand command = new MockCommand();
+ ArgParser.parseAndRun(command, "-W", "input", "fooInput");
+ Assert.assertEquals("Option value must be stored.", "fooInput", command.getInput());
+ Assert.assertTrue("Run must be called even with zero arguments.", command.isRunCalled());
+ Assert.assertEquals("Argument list for invocation without arguments must be empty.", 0, command.getArgs().size());
+ // TODO -W as an option should either be disallowed or disable GNU style option parsing.
+ }
+
+ /**
* This MockCommand serves as a command for performing simple tests.
* @author <a href="mailto:ch...@ri...">Christian Hujer</a>
*/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|