Author: tchemit Date: 2011-01-22 11:37:38 +0100 (Sat, 22 Jan 2011) New Revision: 2029 Url: http://nuiton.org/repositories/revision/nuiton-utils/2029 Log: Anomalie #628: [ApplicationConfig] getOptionAsFile throws an exception if option is null Evolution #1222: [ApplicationConfig] Add more convinient conversion methods Modified: trunk/nuiton-utils/src/main/java/org/nuiton/util/ApplicationConfig.java trunk/nuiton-utils/src/test/java/org/nuiton/util/ApplicationConfigTest.java Modified: trunk/nuiton-utils/src/main/java/org/nuiton/util/ApplicationConfig.java =================================================================== --- trunk/nuiton-utils/src/main/java/org/nuiton/util/ApplicationConfig.java 2011-01-22 10:37:02 UTC (rev 2028) +++ trunk/nuiton-utils/src/main/java/org/nuiton/util/ApplicationConfig.java 2011-01-22 10:37:38 UTC (rev 2029) @@ -56,6 +56,7 @@ import java.util.LinkedList; import java.util.List; import java.util.ListIterator; +import java.util.Locale; import java.util.Map; import java.util.Properties; @@ -1270,7 +1271,10 @@ */ public <T> T getOption(Class<T> clazz, String key) { String value = getOption(key); - T result = (T)convertOption(clazz, key, value, false); + T result = null; + if (value != null) { + result = (T) convertOption(clazz, key, value, false); + } return result; } @@ -1317,7 +1321,7 @@ } cacheItem = new CacheItem(list, hash); } else { - // prefer use our convertert method (auto-register more converters) + // prefer use our converter method (auto-register more converters) T v = ConverterUtil.convert(clazz, value); cacheItem = new CacheItem(v, hash); } @@ -1352,7 +1356,9 @@ */ public File getOptionAsFile(String key) { File result = getOption(File.class, key); - result = result.getAbsoluteFile(); + if (result != null) { + result = result.getAbsoluteFile(); + } return result; } @@ -1419,6 +1425,10 @@ */ public int getOptionAsInt(String key) { Integer result = getOption(Integer.class, key); + if (result==null) { + // primitive value can not be null + result = 0; + } return result; } @@ -1430,6 +1440,10 @@ */ public double getOptionAsDouble(String key) { Double result = getOption(Double.class, key); + if (result == null) { + // primitive value can not be null + result = 0d; + } return result; } @@ -1441,10 +1455,39 @@ */ public boolean getOptionAsBoolean(String key) { Boolean result = getOption(Boolean.class, key); + if (result == null) { + // primitive value can not be null + result = false; + } return result; } /** + * Get option value as {@link Locale}. + * + * @param key the option's key + * @return value as {@link Locale}. + * @since 2.0 + */ + public Locale getOptionAsLocale(String key) { + Locale result = getOption(Locale.class, key); + return result; + } + + /** + * Get option value as {@link Version}. + * + * @param key the option's key + * @return value as {@link Version}. + * @since 2.0 + */ + public Version getOptionAsVersion(String key) { + Version result = getOption(Version.class, key); + return result; + } + + + /** * Get all options from configuration. * * @return Properties which contains all options Modified: trunk/nuiton-utils/src/test/java/org/nuiton/util/ApplicationConfigTest.java =================================================================== --- trunk/nuiton-utils/src/test/java/org/nuiton/util/ApplicationConfigTest.java 2011-01-22 10:37:02 UTC (rev 2028) +++ trunk/nuiton-utils/src/test/java/org/nuiton/util/ApplicationConfigTest.java 2011-01-22 10:37:38 UTC (rev 2029) @@ -25,11 +25,16 @@ package org.nuiton.util; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.nuiton.util.ApplicationConfig.Action; + import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.IOException; import java.io.PrintStream; -import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.lang.reflect.Method; import java.util.ArrayList; @@ -37,42 +42,37 @@ import java.util.Collections; import java.util.List; import java.util.ListIterator; +import java.util.Locale; import java.util.Map; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; -import org.nuiton.util.ApplicationConfig.Action; - /** * * @author poussin */ public class ApplicationConfigTest { - private static final Log log = LogFactory.getLog(ApplicationConfigTest.class); + private static final Log log = + LogFactory.getLog(ApplicationConfigTest.class); /** main folder for tests data **/ protected static File DIR_TESTS_DATA; protected static final String SYSTEM_PROPERTY_USER_HOME = "user.home"; - protected static int DUMMY_ACTION_CALL = 0; + protected static int DUMMY_ACTION_CALL; public static class DummyAction { @Action.Step(1) public void dummyAction(String s, int step) { DUMMY_ACTION_CALL++; - System.out.println(s + ":" + step); + log.info(s + ":" + step); } } @BeforeClass public static void setUpClass() { // Initialize DIR_TESTS_DATA to target/surefire-data - DIR_TESTS_DATA = TestUtil.createDefaultTestsDataDirectory(); + DIR_TESTS_DATA = TestHelper.createDefaultTestsDataDirectory(); } @Test @@ -118,10 +118,11 @@ /** * Test of getUnparsed method, of class ApplicationConfig. + * @throws Exception */ @Test public void testGetUnparsed() throws Exception { - System.out.println("getUnparsed"); + log.info("getUnparsed"); ApplicationConfig instance = new ApplicationConfig(); List<String> expResult = new ArrayList<String>(); List<String> result = instance.getUnparsed(); @@ -130,38 +131,40 @@ expResult.add("toto"); expResult.add("titi"); expResult.add("tata"); - - instance.parse(new String[]{"toto", "titi", "tata"}); + + instance.parse("toto", "titi", "tata"); result = instance.getUnparsed(); Assert.assertEquals(expResult, result); } /** * Test of addAction method, of class ApplicationConfig. + * @throws Exception */ @Test public void testAddAction() throws Exception { - System.out.println("addAction"); + log.info("addAction"); Action action = null; ApplicationConfig instance = new ApplicationConfig(); - + // test add null Action instance.addAction(action); - + action = new Action(1, new DummyAction(), DummyAction.class.getMethod("dummyAction", String.class, Integer.TYPE), "coucou", "12"); - instance.addAction(action); + instance.addAction(action); } /** * Test of doAction method, of class ApplicationConfig. + * @throws Exception */ @Test public void testDoAction() throws Exception { - System.out.println("doAction"); + log.info("doAction"); ApplicationConfig instance = new ApplicationConfig(); - + Action action = new Action(1, new DummyAction(), DummyAction.class.getMethod("dummyAction", String.class, Integer.TYPE), "coucou", "12"); - instance.addAction(action); + instance.addAction(action); DUMMY_ACTION_CALL = 0; Assert.assertEquals(0, DUMMY_ACTION_CALL); @@ -178,7 +181,7 @@ */ @Test public void testSetUseOnlyAliases() { - System.out.println("setUseOnlyAliases"); + log.info("setUseOnlyAliases"); ApplicationConfig instance = new ApplicationConfig(); Assert.assertEquals(false, instance.isUseOnlyAliases()); instance.setUseOnlyAliases(false); @@ -189,10 +192,11 @@ /** * Test of addAlias method, of class ApplicationConfig. + * @throws Exception */ @Test public void testAddAlias() throws Exception { - System.out.println("addAlias"); + log.info("addAlias"); ApplicationConfig instance = new ApplicationConfig(); instance.addAlias("toto", "totochange"); instance.addAlias("titi", "titichange"); @@ -204,8 +208,8 @@ expResult.add("totochange"); expResult.add("titichange"); expResult.add("tata"); - - instance.parse(new String[]{"toto", "titi", "tata"}); + + instance.parse("toto", "titi", "tata"); result = instance.getUnparsed(); Assert.assertEquals(expResult, result); } @@ -215,7 +219,7 @@ */ @Test public void testSetConfigFileName() { - System.out.println("setConfigFileName"); + log.info("setConfigFileName"); ApplicationConfig instance = new ApplicationConfig(); instance.setConfigFileName("bidulle"); Assert.assertEquals("bidulle", instance.getConfigFileName()); @@ -226,7 +230,7 @@ */ @Test public void testSetOption() { - System.out.println("setOption"); + log.info("setOption"); ApplicationConfig instance = new ApplicationConfig(); Assert.assertEquals(null, instance.getOption("truc")); instance.setOption("truc", "bidulle"); @@ -262,7 +266,7 @@ */ @Test public void testGetMethods() { - System.out.println("getMethods"); + log.info("getMethods"); ApplicationConfig instance = new ApplicationConfig(); Map<String, Method> result = instance.getMethods(); Assert.assertTrue(result.containsKey("option")); @@ -270,10 +274,11 @@ /** * Test of getParams method, of class ApplicationConfig. + * @throws Exception */ @Test public void testGetParams() throws Exception { - System.out.println("getParams"); + log.info("getParams"); Method m = DummyAction.class.getMethod("dummyAction", String.class, Integer.TYPE); List<String> list = new ArrayList<String>(Arrays.asList("toto", "10", "/tmp", "9")); ListIterator<String> args = list.listIterator(); @@ -287,10 +292,11 @@ /** * Test of createAction method, of class ApplicationConfig. + * @throws Exception */ @Test public void testCreateAction() throws Exception { - System.out.println("createAction"); + log.info("createAction"); List<String> list = new ArrayList<String>(Arrays.asList("dummy", "toto", "10", "/tmp", "9")); ListIterator<String> args = list.listIterator(); args.next(); @@ -306,10 +312,11 @@ /** * Test of parse method, of class ApplicationConfig. + * @throws Exception */ @Test public void testParse() throws Exception { - System.out.println("parse"); + log.info("parse"); String[] args = "-f file -v -d -o /tmp/file -m coucou 10 others args".split(" "); ApplicationConfig instance = new ApplicationConfig(); instance.addAlias("-f", "--option", "file"); @@ -318,7 +325,7 @@ instance.addAlias("-o", "--option", "output"); instance.addAlias("-m", "--" + DummyAction.class.getName() + "#dummyAction"); instance.parse(args); - + DUMMY_ACTION_CALL = 0; Assert.assertEquals("file", instance.getOption("file")); Assert.assertEquals("true", instance.getOption("verbose")); @@ -333,35 +340,36 @@ /** * Test that system properties such as ${user.home}, ${user.name} are * replaced. - * @throws ArgumentsParserException + * @throws ArgumentsParserException */ @Test public void testSystemProperties() throws ArgumentsParserException { ApplicationConfig instance = new ApplicationConfig(); - instance.parse(new String[]{}); + instance.parse(); instance.printConfig(); - + instance.setOption("hellomessage", "Hello ${user.name} !"); - + Assert.assertEquals("Hello " + System.getProperty("user.name") + " !", instance.getOption("hellomessage")); Assert.assertEquals("Hello ${user.name} !", instance.options.getProperty("hellomessage")); - + instance.setOption("tempdir", "${java.io.tmpdir}" + File.separator + "blah"); File tempDir = instance.getOptionAsFile("tempdir"); Assert.assertEquals(System.getProperty("java.io.tmpdir") + File.separator + "blah", tempDir.getAbsolutePath()); - + instance.setOption("system", "${os.name}"); instance.setOption("os", "${system}"); instance.setOption("sysinfo", "I'm running ${os} :)"); Assert.assertEquals("I'm running " + System.getProperty("os.name") + " :)", instance.getOption("sysinfo")); - + // test not found properties instance.setOption("notexists", "Attention ${blah.bloh.bluh} :("); Assert.assertEquals("Attention ${blah.bloh.bluh} :(", instance.getOption("notexists")); } - + /** * Test unparsed options + * @throws Exception */ @Test public void testUnparsed() throws Exception { @@ -372,27 +380,28 @@ instance.parse(args); instance.doAction(1); - System.out.println(instance.getUnparsed()); + log.info(instance.getUnparsed()); Assert.assertEquals(8, instance.getUnparsed().size()); Assert.assertEquals("test", instance.getUnparsed().get(0)); } - + /** * Test get flat options method. + * @throws Exception */ @Test public void testGetFlatOptions() throws Exception { ApplicationConfig instance = new ApplicationConfig(); - instance.parse(new String[]{}); + instance.parse(); instance.setDefaultOption("user.firstname", "toto"); instance.setDefaultOption("user.lastname", "tutu"); instance.setOption("user.fullname", "${user.lastname} ${user.firstname}"); - + Assert.assertEquals(1, instance.getOptions().size()); // il y en a plus de 3 car il y a aussi les variables d'environnement Assert.assertTrue(instance.getFlatOptions().size() > 3); - + // test replacement and non replacement Assert.assertEquals("tutu toto", instance.getFlatOptions().getProperty("user.fullname")); @@ -401,40 +410,102 @@ Assert.assertEquals("${user.lastname} ${user.firstname}", instance.getFlatOptions(false).getProperty("user.fullname")); } - + /** * Test null options. - * + * * TODO EC20100503 this test throw a huge exception + * @throws Exception */ + @Test public void testGetNullOptions() throws Exception { ApplicationConfig instance = new ApplicationConfig(); - instance.parse(new String[]{}); + instance.parse(); + // primitives can not be null + Assert.assertNotNull(instance.getOptionAsBoolean("dfsdfgqsgqfg")); + Assert.assertNotNull(instance.getOptionAsDouble("dfsdfgqsgqfg")); + Assert.assertNotNull(instance.getOptionAsInt("dfsdfgqsgqfg")); + // list option can not be null + Assert.assertNotNull(instance.getOptionAsList("dfsdfgqsgqfg")); + + // all other types can be null + Assert.assertNull(instance.getOptionAsClass("dfsdfgqsgqfg")); + Assert.assertNull(instance.getOptionAsDate("dfsdfgqsgqfg")); Assert.assertNull(instance.getOptionAsFile("dfsdfgqsgqfg")); + Assert.assertNull(instance.getOptionAsLocale("dfsdfgqsgqfg")); + Assert.assertNull(instance.getOptionAsTime("dfsdfgqsgqfg")); + Assert.assertNull(instance.getOptionAsTimestamp("dfsdfgqsgqfg")); + Assert.assertNull(instance.getOptionAsURL("dfsdfgqsgqfg")); + Assert.assertNull(instance.getOptionAsVersion("dfsdfgqsgqfg")); } /** * Test on printConfig output. - * - * @throws ArgumentsParserException - * @throws UnsupportedEncodingException + * + * @throws ArgumentsParserException + * @throws UnsupportedEncodingException */ public void testxx() throws ArgumentsParserException, UnsupportedEncodingException { ApplicationConfig instance = new ApplicationConfig(); - instance.parse(new String[]{}); + instance.parse(); instance.setOption("toto", "tata"); - + // get content of printConfig ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); - instance.printConfig(ps); + try { + instance.printConfig(ps); + } finally { + ps.close(); + } String content = baos.toString("UTF-8"); if (log.isDebugEnabled()) { log.debug("printConfig = " + content); } - + Assert.assertTrue(content.indexOf("toto=tata") > 0); } + + @Test + public void testGetOptionAsLocale() { + Locale expected; + Locale actual; + + ApplicationConfig instance = new ApplicationConfig(); + + // test null locale + actual = instance.getOptionAsLocale("toto"); + Assert.assertNull(actual); + + // test not null locale + instance.setOption("toto", "fr"); + + expected = Locale.FRENCH; + actual = instance.getOptionAsLocale("toto"); + Assert.assertNotNull(actual); + Assert.assertEquals(expected, actual); + + } + + @Test + public void testGetOptionAsVersion() { + Version expected; + Version actual; + + ApplicationConfig instance = new ApplicationConfig(); + + // test null version + actual = instance.getOptionAsVersion("toto"); + Assert.assertNull(actual); + + // not null version + instance.setOption("toto", "1.2"); + expected = VersionUtil.valueOf("1.2"); + actual = instance.getOptionAsVersion("toto"); + Assert.assertNotNull(actual); + Assert.assertEquals(expected, actual); + + } }