Add ConfigFile.getSectionAsInterface() method.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/ca59d8a4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/ca59d8a4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/ca59d8a4

Branch: refs/heads/master
Commit: ca59d8a4e7461857f8bf498029d2d49a31a39a43
Parents: c68cc34
Author: JamesBognar <[email protected]>
Authored: Mon May 15 13:43:37 2017 -0400
Committer: JamesBognar <[email protected]>
Committed: Mon May 15 13:43:37 2017 -0400

----------------------------------------------------------------------
 .../juneau/ini/ConfigFileBuilderTest.java       |  10 +-
 .../juneau/ini/ConfigFileInterfaceTest.java     | 601 +++++++++++++++++++
 .../org/apache/juneau/ini/ConfigFileTest.java   | 190 +++---
 .../org/apache/juneau/test/pojos/ABean.java     |  24 +
 .../org/apache/juneau/test/pojos/Constants.java |  25 +
 .../juneau/test/pojos/ImplicitSwappedPojo.java  |  35 ++
 .../apache/juneau/test/pojos/SwappedPojo.java   |  20 +
 .../juneau/test/pojos/SwappedPojoSwap.java      |  35 ++
 .../org/apache/juneau/test/pojos/TestEnum.java  |  17 +
 .../org/apache/juneau/test/pojos/TypedBean.java |  17 +
 .../apache/juneau/test/pojos/TypedBeanImpl.java |  25 +
 .../java/org/apache/juneau/BeanSession.java     |  92 ++-
 .../java/org/apache/juneau/ini/ConfigFile.java  | 386 +++++++++---
 .../apache/juneau/ini/ConfigFileBuilder.java    |   2 +-
 .../org/apache/juneau/ini/ConfigFileImpl.java   |  66 +-
 .../apache/juneau/ini/ConfigFileWrapped.java    |  27 +-
 .../java/org/apache/juneau/json/JsonParser.java |   2 +-
 juneau-core/src/main/javadoc/overview.html      | 107 +++-
 juneau-examples-rest/examples.cfg               |   4 +-
 juneau-microservice-template/microservice.cfg   |   7 +-
 .../juneau/microservice/RestMicroservice.java   |   6 +-
 juneau-rest-test/juneau-rest-test.cfg           |   6 +-
 .../apache/juneau/rest/test/ConfigResource.java |   2 +-
 .../org/apache/juneau/rest/test/ConfigTest.java |  11 +-
 .../org/apache/juneau/rest/test/_TestSuite.java |   2 +
 25 files changed, 1451 insertions(+), 268 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca59d8a4/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileBuilderTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileBuilderTest.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileBuilderTest.java
index 7a3501e..3d34086 100755
--- 
a/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileBuilderTest.java
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileBuilderTest.java
@@ -139,13 +139,13 @@ public class ConfigFileBuilderTest {
                try { cf.addListener(new ConfigFileListener(){}); fail(); } 
catch (UnsupportedOperationException e) {}
 
                // All these should succeed.
-               cf.getObject(String.class, "A");
-               cf.getObject(String.class, "A", "a");
+               cf.getObject("A", String.class);
+               cf.getObject("A", "a", String.class);
                cf.getString("A");
                cf.getString("A","a");
-               cf.getObject(String.class, "A");
-               cf.getObject(String.class, "A", "a");
-               cf.getObject(String[].class, "A");
+               cf.getObject("A", String.class);
+               cf.getObject("A", "a", String.class);
+               cf.getObject("A", String[].class);
                cf.getStringArray("A");
                cf.getStringArray("A", null);
                cf.getInt("A");

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca59d8a4/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileInterfaceTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileInterfaceTest.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileInterfaceTest.java
new file mode 100644
index 0000000..4d34568
--- /dev/null
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileInterfaceTest.java
@@ -0,0 +1,601 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you 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.apache.juneau.ini;
+
+import static org.junit.Assert.*;
+import static org.apache.juneau.TestUtils.*;
+
+import java.util.*;
+
+import org.apache.juneau.test.pojos.*;
+import org.apache.juneau.utils.*;
+import org.junit.*;
+
+@SuppressWarnings("javadoc")
+public class ConfigFileInterfaceTest {
+
+       ConfigFile cf;
+       ConfigInterface proxy;
+       
+       public ConfigFileInterfaceTest() throws Exception {
+               ConfigFileBuilder configFileBuilder = new ConfigFileBuilder();
+               cf = configFileBuilder.build();
+               proxy = cf.getSectionAsInterface("A", ConfigInterface.class);
+       }
+       
+       
+       
//====================================================================================================
+       // getSectionAsInterface(String,Class)
+       
//====================================================================================================
+       
+       @Test
+       public void testString() throws Exception {
+               proxy.setString("foo");
+               assertEquals("foo", proxy.getString());
+               assertEquals("foo", cf.get("A", "string"));
+       }
+       
+       @Test
+       public void testInt() throws Exception {
+               proxy.setInt(1);
+               assertEquals(1, proxy.getInt());
+               assertEquals("1", cf.get("A", "int"));
+       }
+       
+       @Test
+       public void testInteger() throws Exception {
+               proxy.setInteger(2);
+               assertEquals(2, proxy.getInteger().intValue());
+               assertEquals("2", cf.get("A", "integer"));
+               assertType(Integer.class, proxy.getInteger());
+       }
+
+       @Test
+       public void testBoolean() throws Exception {
+               proxy.setBoolean(true);
+               assertEquals(true, proxy.isBoolean());
+               assertEquals("true", cf.get("A", "boolean"));
+       }
+       
+       @Test
+       public void testBooleanObject() throws Exception {
+               proxy.setBooleanObject(true);
+               assertEquals(true, proxy.getBooleanObject().booleanValue());
+               assertEquals("true", cf.get("A", "booleanObject"));
+               assertType(Boolean.class, proxy.getBooleanObject());
+       }
+
+       @Test
+       public void testFloat() throws Exception {
+               proxy.setFloat(1f);
+               assertTrue(1f == proxy.getFloat());
+               assertEquals("1.0", cf.get("A", "float"));
+       }
+       
+       @Test
+       public void testFloatObject() throws Exception {
+               proxy.setFloatObject(1f);
+               assertTrue(1f == proxy.getFloatObject().floatValue());
+               assertEquals("1.0", cf.get("A", "floatObject"));
+               assertType(Float.class, proxy.getFloatObject());
+       }
+
+       @Test
+       public void testInt3dArray() throws Exception {
+               proxy.setInt3dArray(new int[][][]{{{1,2},null},null});
+               assertEquals("[[[1,2],null],null]", cf.get("A", "int3dArray"));
+               assertObjectEquals("[[[1,2],null],null]", 
proxy.getInt3dArray());
+               assertType(int[][][].class, proxy.getInt3dArray());
+       }
+
+       @Test
+       public void testInteger3dArray() throws Exception {
+               proxy.setInteger3dArray(new 
Integer[][][]{{{1,null},null},null});
+               assertObjectEquals("[[[1,null],null],null]", 
proxy.getInteger3dArray());
+               assertEquals("[[[1,null],null],null]", cf.get("A", 
"integer3dArray"));
+               assertType(Integer.class, proxy.getInteger3dArray()[0][0][0]);
+       }
+
+       @Test
+       public void testString3dArray() throws Exception {
+               proxy.setString3dArray(new 
String[][][]{{{"foo",null},null},null});
+               assertObjectEquals("[[['foo',null],null],null]", 
proxy.getString3dArray());
+               assertEquals("[[['foo',null],null],null]", cf.get("A", 
"string3dArray"));
+       }
+
+       @Test
+       public void testIntegerList() throws Exception {
+               proxy.setIntegerList(new 
AList<Integer>().append(1).append(null));
+               assertObjectEquals("[1,null]", proxy.getIntegerList());
+               assertEquals("[1,null]", cf.get("A", "integerList"));
+               assertType(Integer.class, proxy.getIntegerList().get(0));
+       }
+       
+       @Test
+       public void testInteger3dList() throws Exception {
+               proxy.setInteger3dList(
+                       new AList<List<List<Integer>>>()
+                       .append(
+                               new AList<List<Integer>>()
+                               .append(new 
AList<Integer>().append(1).append(null))
+                               .append(null)
+                       )
+                       .append(null)
+               );
+               assertObjectEquals("[[[1,null],null],null]", 
proxy.getInteger3dList());
+               assertEquals("[[[1,null],null],null]", cf.get("A", 
"integer3dList"));
+               assertType(Integer.class, 
proxy.getInteger3dList().get(0).get(0).get(0));
+       }
+
+       @Test
+       public void testInteger1d3dList() throws Exception {
+               proxy.setInteger1d3dList(new AList<Integer[][][]>().append(new 
Integer[][][]{{{1,null},null},null}).append(null));
+               assertObjectEquals("[[[[1,null],null],null],null]", 
proxy.getInteger1d3dList());
+               assertEquals("[[[[1,null],null],null],null]", cf.get("A", 
"integer1d3dList"));
+               assertType(Integer.class, 
proxy.getInteger1d3dList().get(0)[0][0][0]);
+       }
+       
+       @Test
+       public void testInt1d3dList() throws Exception {
+               proxy.setInt1d3dList(new AList<int[][][]>().append(new 
int[][][]{{{1,2},null},null}).append(null));
+               assertObjectEquals("[[[[1,2],null],null],null]", 
proxy.getInt1d3dList());
+               assertEquals("[[[[1,2],null],null],null]", cf.get("A", 
"int1d3dList"));
+               assertType(int[][][].class, proxy.getInt1d3dList().get(0));
+       }
+       
+       @Test
+       public void testStringList() throws Exception {
+               proxy.setStringList(Arrays.asList("foo","bar",null));
+               assertObjectEquals("['foo','bar',null]", proxy.getStringList());
+               assertEquals("['foo','bar',null]", cf.get("A", "stringList"));
+       }
+
+       // Beans
+       
+       @Test
+       public void testBean() throws Exception {
+               proxy.setBean(new ABean().init());
+               assertObjectEquals("{a:1,b:'foo'}", proxy.getBean());
+               assertEquals("{a:1,b:'foo'}", cf.get("A", "bean"));
+               assertType(ABean.class, proxy.getBean());
+       }
+
+       @Test
+       public void testBean3dArray() throws Exception {
+               proxy.setBean3dArray(new ABean[][][]{{{new 
ABean().init(),null},null},null});
+               assertObjectEquals("[[[{a:1,b:'foo'},null],null],null]", 
proxy.getBean3dArray());
+               assertEquals("[[[{a:1,b:'foo'},null],null],null]", cf.get("A", 
"bean3dArray"));
+               assertType(ABean.class, proxy.getBean3dArray()[0][0][0]);
+       }
+
+       @Test
+       public void testBeanList() throws Exception {
+               proxy.setBeanList(Arrays.asList(new ABean().init()));
+               assertObjectEquals("[{a:1,b:'foo'}]", proxy.getBeanList());
+               assertEquals("[{a:1,b:'foo'}]", cf.get("A", "beanList"));
+               assertType(ABean.class, proxy.getBeanList().get(0));
+       }
+
+       @Test
+       public void testBean1d3dList() throws Exception {
+               proxy.setBean1d3dList(new AList<ABean[][][]>().append(new 
ABean[][][]{{{new ABean().init(),null},null},null}).append(null));
+               assertObjectEquals("[[[[{a:1,b:'foo'},null],null],null],null]", 
proxy.getBean1d3dList());
+               assertEquals("[[[[{a:1,b:'foo'},null],null],null],null]", 
cf.get("A", "bean1d3dList"));
+               assertType(ABean.class, 
proxy.getBean1d3dList().get(0)[0][0][0]);
+       }
+
+       @Test
+       public void testBeanMap() throws Exception {
+               proxy.setBeanMap(new AMap<String,ABean>().append("foo",new 
ABean().init()));
+               assertObjectEquals("{foo:{a:1,b:'foo'}}", proxy.getBeanMap());
+               assertEquals("{foo:{a:1,b:'foo'}}", cf.get("A", "beanMap"));
+               assertType(ABean.class, proxy.getBeanMap().get("foo"));
+       }
+
+       @Test
+       public void testBeanListMap() throws Exception {
+               proxy.setBeanListMap(new 
AMap<String,List<ABean>>().append("foo",Arrays.asList(new ABean().init())));
+               assertObjectEquals("{foo:[{a:1,b:'foo'}]}", 
proxy.getBeanListMap());
+               assertEquals("{foo:[{a:1,b:'foo'}]}", cf.get("A", 
"beanListMap"));
+               assertType(ABean.class, 
proxy.getBeanListMap().get("foo").get(0));
+       }
+
+       @Test
+       public void testBean1d3dListMap() throws Exception {
+               proxy.setBean1d3dListMap(new 
AMap<String,List<ABean[][][]>>().append("foo",new 
AList<ABean[][][]>().append(new ABean[][][]{{{new 
ABean().init(),null},null},null}).append(null)));
+               
assertObjectEquals("{foo:[[[[{a:1,b:'foo'},null],null],null],null]}", 
proxy.getBean1d3dListMap());
+               assertEquals("{foo:[[[[{a:1,b:'foo'},null],null],null],null]}", 
cf.get("A", "bean1d3dListMap"));
+               assertType(ABean.class, 
proxy.getBean1d3dListMap().get("foo").get(0)[0][0][0]);
+       }
+
+       @Test
+       public void testBeanListMapIntegerKeys() throws Exception {
+               proxy.setBeanListMapIntegerKeys(new 
AMap<Integer,List<ABean>>().append(1,Arrays.asList(new ABean().init())));
+               assertObjectEquals("{'1':[{a:1,b:'foo'}]}", 
proxy.getBeanListMapIntegerKeys());
+               assertEquals("{'1':[{a:1,b:'foo'}]}", cf.get("A", 
"beanListMapIntegerKeys"));
+               assertType(ABean.class, 
proxy.getBeanListMapIntegerKeys().get(1).get(0));
+       }
+
+       // Typed beans
+       
+       @Test
+       public void testTypedBean() throws Exception {
+               proxy.setTypedBean(new TypedBeanImpl().init());
+               assertObjectEquals("{_type:'TypedBeanImpl',a:1,b:'foo'}", 
proxy.getTypedBean());
+               assertEquals("{_type:'TypedBeanImpl',a:1,b:'foo'}", cf.get("A", 
"typedBean"));
+               assertType(TypedBeanImpl.class, proxy.getTypedBean());
+       }
+
+       @Test
+       public void testTypedBean3dArray() throws Exception {
+               proxy.setTypedBean3dArray(new TypedBean[][][]{{{new 
TypedBeanImpl().init(),null},null},null});
+               
assertObjectEquals("[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null]", 
proxy.getTypedBean3dArray());
+               
assertEquals("[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null]", 
cf.get("A", "typedBean3dArray"));
+               assertType(TypedBeanImpl.class, 
proxy.getTypedBean3dArray()[0][0][0]);
+       }
+
+       @Test
+       public void testTypedBeanList() throws Exception {
+               proxy.setTypedBeanList(Arrays.asList((TypedBean)new 
TypedBeanImpl().init()));
+               assertObjectEquals("[{_type:'TypedBeanImpl',a:1,b:'foo'}]", 
proxy.getTypedBeanList());
+               assertEquals("[{_type:'TypedBeanImpl',a:1,b:'foo'}]", 
cf.get("A", "typedBeanList"));
+               assertType(TypedBeanImpl.class, 
proxy.getTypedBeanList().get(0));
+       }
+
+       @Test
+       public void testTypedBean1d3dList() throws Exception {
+               proxy.setTypedBean1d3dList(new 
AList<TypedBean[][][]>().append(new TypedBean[][][]{{{new 
TypedBeanImpl().init(),null},null},null}).append(null));
+               
assertObjectEquals("[[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null],null]",
 proxy.getTypedBean1d3dList());
+               
assertEquals("[[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null],null]", 
cf.get("A", "typedBean1d3dList"));
+               assertType(TypedBeanImpl.class, 
proxy.getTypedBean1d3dList().get(0)[0][0][0]);
+       }
+
+       @Test
+       public void testTypedBeanMap() throws Exception {
+               proxy.setTypedBeanMap(new 
AMap<String,TypedBean>().append("foo",new TypedBeanImpl().init()));
+               assertObjectEquals("{foo:{_type:'TypedBeanImpl',a:1,b:'foo'}}", 
proxy.getTypedBeanMap());
+               assertEquals("{foo:{_type:'TypedBeanImpl',a:1,b:'foo'}}", 
cf.get("A", "typedBeanMap"));
+               assertType(TypedBeanImpl.class, 
proxy.getTypedBeanMap().get("foo"));
+       }
+
+       @Test
+       public void testTypedBeanListMap() throws Exception {
+               proxy.setTypedBeanListMap(new 
AMap<String,List<TypedBean>>().append("foo",Arrays.asList((TypedBean)new 
TypedBeanImpl().init())));
+               
assertObjectEquals("{foo:[{_type:'TypedBeanImpl',a:1,b:'foo'}]}", 
proxy.getTypedBeanListMap());
+               assertEquals("{foo:[{_type:'TypedBeanImpl',a:1,b:'foo'}]}", 
cf.get("A", "typedBeanListMap"));
+               assertType(TypedBeanImpl.class, 
proxy.getTypedBeanListMap().get("foo").get(0));
+       }
+
+       @Test
+       public void testTypedBean1d3dListMap() throws Exception {
+               proxy.setTypedBean1d3dListMap(new 
AMap<String,List<TypedBean[][][]>>().append("foo",new 
AList<TypedBean[][][]>().append(new TypedBean[][][]{{{new 
TypedBeanImpl().init(),null},null},null}).append(null)));
+               
assertObjectEquals("{foo:[[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null],null]}",
 proxy.getTypedBean1d3dListMap());
+               
assertEquals("{foo:[[[[{_type:'TypedBeanImpl',a:1,b:'foo'},null],null],null],null]}",
 cf.get("A", "typedBean1d3dListMap"));
+               assertType(TypedBeanImpl.class, 
proxy.getTypedBean1d3dListMap().get("foo").get(0)[0][0][0]);
+       }
+
+       @Test
+       public void testTypedBeanListMapIntegerKeys() throws Exception {
+               proxy.setTypedBeanListMapIntegerKeys(new 
AMap<Integer,List<TypedBean>>().append(1,Arrays.asList((TypedBean)new 
TypedBeanImpl().init())));
+               
assertObjectEquals("{'1':[{_type:'TypedBeanImpl',a:1,b:'foo'}]}", 
proxy.getTypedBeanListMapIntegerKeys());
+               assertEquals("{'1':[{_type:'TypedBeanImpl',a:1,b:'foo'}]}", 
cf.get("A", "typedBeanListMapIntegerKeys"));
+               assertType(TypedBeanImpl.class, 
proxy.getTypedBeanListMapIntegerKeys().get(1).get(0));
+       }
+
+       // Swapped POJOs
+       
+       @Test
+       public void testSwappedPojo() throws Exception {
+               proxy.setSwappedPojo(new SwappedPojo());
+               assertObjectEquals("'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/'", 
proxy.getSwappedPojo());
+               assertEquals("swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/", 
cf.get("A", "swappedPojo"));
+               assertType(SwappedPojo.class, proxy.getSwappedPojo());
+       }
+
+       @Test
+       public void testSwappedPojo3dArray() throws Exception {
+               proxy.setSwappedPojo3dArray(new SwappedPojo[][][]{{{new 
SwappedPojo(),null},null},null});
+               
assertObjectEquals("[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]",
 proxy.getSwappedPojo3dArray());
+               
assertEquals("[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]", 
cf.get("A", "swappedPojo3dArray"));
+               assertType(SwappedPojo.class, 
proxy.getSwappedPojo3dArray()[0][0][0]);
+       }
+
+       @Test
+       public void testSwappedPojoMap() throws Exception {
+               proxy.setSwappedPojoMap(new 
AMap<SwappedPojo,SwappedPojo>().append(new SwappedPojo(), new SwappedPojo()));
+               
assertObjectEquals("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/'}",
 proxy.getSwappedPojoMap());
+               
assertEquals("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/'}",
 cf.get("A", "swappedPojoMap"));
+               assertType(SwappedPojo.class, 
proxy.getSwappedPojoMap().keySet().iterator().next());
+               assertType(SwappedPojo.class, 
proxy.getSwappedPojoMap().values().iterator().next());
+       }
+
+       @Test
+       public void testSwappedPojo3dMap() throws Exception {
+               proxy.setSwappedPojo3dMap(new 
AMap<SwappedPojo,SwappedPojo[][][]>().append(new SwappedPojo(), new 
SwappedPojo[][][]{{{new SwappedPojo(),null},null},null}));
+               
assertObjectEquals("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]}",
 proxy.getSwappedPojo3dMap());
+               
assertEquals("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]}",
 cf.get("A", "swappedPojo3dMap"));
+               assertType(SwappedPojo.class, 
proxy.getSwappedPojo3dMap().keySet().iterator().next());
+               assertType(SwappedPojo.class, 
proxy.getSwappedPojo3dMap().values().iterator().next()[0][0][0]);
+       }
+
+       // Implicit swapped POJOs
+       
+       @Test
+       public void testImplicitSwappedPojo() throws Exception {
+               proxy.setImplicitSwappedPojo(new ImplicitSwappedPojo());
+               assertObjectEquals("'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/'", 
proxy.getImplicitSwappedPojo());
+               assertEquals("swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/", 
cf.get("A", "implicitSwappedPojo"));
+               assertType(ImplicitSwappedPojo.class, 
proxy.getImplicitSwappedPojo());
+       }
+
+       @Test
+       public void testImplicitSwappedPojo3dArray() throws Exception {
+               proxy.setImplicitSwappedPojo3dArray(new 
ImplicitSwappedPojo[][][]{{{new ImplicitSwappedPojo(),null},null},null});
+               
assertObjectEquals("[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]",
 proxy.getImplicitSwappedPojo3dArray());
+               
assertEquals("[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]", 
cf.get("A", "implicitSwappedPojo3dArray"));
+               assertType(ImplicitSwappedPojo.class, 
proxy.getImplicitSwappedPojo3dArray()[0][0][0]);
+       }
+
+       @Test
+       public void testImplicitSwappedPojoMap() throws Exception {
+               proxy.setImplicitSwappedPojoMap(new 
AMap<ImplicitSwappedPojo,ImplicitSwappedPojo>().append(new 
ImplicitSwappedPojo(), new ImplicitSwappedPojo()));
+               
assertObjectEquals("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/'}",
 proxy.getImplicitSwappedPojoMap());
+               
assertEquals("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/'}",
 cf.get("A", "implicitSwappedPojoMap"));
+               assertType(ImplicitSwappedPojo.class, 
proxy.getImplicitSwappedPojoMap().keySet().iterator().next());
+               assertType(ImplicitSwappedPojo.class, 
proxy.getImplicitSwappedPojoMap().values().iterator().next());
+       }
+
+       @Test
+       public void testImplicitSwappedPojo3dMap() throws Exception {
+               proxy.setImplicitSwappedPojo3dMap(new 
AMap<ImplicitSwappedPojo,ImplicitSwappedPojo[][][]>().append(new 
ImplicitSwappedPojo(), new ImplicitSwappedPojo[][][]{{{new 
ImplicitSwappedPojo(),null},null},null}));
+               
assertObjectEquals("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]}",
 proxy.getImplicitSwappedPojo3dMap());
+               
assertEquals("{'swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/':[[['swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/',null],null],null]}",
 cf.get("A", "implicitSwappedPojo3dMap"));
+               assertType(ImplicitSwappedPojo.class, 
proxy.getImplicitSwappedPojo3dMap().keySet().iterator().next());
+               assertType(ImplicitSwappedPojo.class, 
proxy.getImplicitSwappedPojo3dMap().values().iterator().next()[0][0][0]);
+       }
+
+       // Enums
+       
+       @Test
+       public void testEnum() throws Exception {
+               proxy.setEnum(TestEnum.TWO);
+               assertObjectEquals("'TWO'", proxy.getEnum());
+               assertEquals("TWO", cf.get("A", "enum"));
+               assertType(TestEnum.class, proxy.getEnum());
+       }
+
+       @Test
+       public void testEnum3d() throws Exception {
+               proxy.setEnum3d(new 
TestEnum[][][]{{{TestEnum.TWO,null},null},null});
+               assertObjectEquals("[[['TWO',null],null],null]", 
proxy.getEnum3d());
+               assertEquals("[[['TWO',null],null],null]", cf.get("A", 
"enum3d"));
+               assertType(TestEnum.class, proxy.getEnum3d()[0][0][0]);
+       }
+
+       @Test
+       public void testEnumList() throws Exception {
+               proxy.setEnumList(new 
AList<TestEnum>().append(TestEnum.TWO).append(null));
+               assertObjectEquals("['TWO',null]", proxy.getEnumList());
+               assertEquals("['TWO',null]", cf.get("A", "enumList"));
+               assertType(TestEnum.class, proxy.getEnumList().get(0));
+       }
+
+       @Test
+       public void testEnum3dList() throws Exception {
+               proxy.setEnum3dList(
+                       new AList<List<List<TestEnum>>>()
+                       .append(
+                               new AList<List<TestEnum>>()
+                               .append(
+                                       new 
AList<TestEnum>().append(TestEnum.TWO).append(null)
+                               )
+                               .append(null)
+                       .append(null)
+                       )
+               );
+               assertObjectEquals("[[['TWO',null],null,null]]", 
proxy.getEnum3dList());
+               assertEquals("[[['TWO',null],null,null]]", cf.get("A", 
"enum3dList"));
+               assertType(TestEnum.class, 
proxy.getEnum3dList().get(0).get(0).get(0));
+       }
+
+       @Test
+       public void testEnum1d3dList() throws Exception {
+               proxy.setEnum1d3dList(new AList<TestEnum[][][]>().append(new 
TestEnum[][][]{{{TestEnum.TWO,null},null},null}).append(null));
+               assertObjectEquals("[[[['TWO',null],null],null],null]", 
proxy.getEnum1d3dList());
+               assertEquals("[[[['TWO',null],null],null],null]", cf.get("A", 
"enum1d3dList"));
+               assertType(TestEnum.class, 
proxy.getEnum1d3dList().get(0)[0][0][0]);
+       }
+
+       @Test
+       public void testEnumMap() throws Exception {
+               proxy.setEnumMap(new 
AMap<TestEnum,TestEnum>().append(TestEnum.ONE,TestEnum.TWO));
+               assertObjectEquals("{ONE:'TWO'}", proxy.getEnumMap());
+               assertEquals("{ONE:'TWO'}", cf.get("A", "enumMap"));
+               assertType(TestEnum.class, 
proxy.getEnumMap().keySet().iterator().next());
+               assertType(TestEnum.class, 
proxy.getEnumMap().values().iterator().next());
+       }
+
+       @Test
+       public void testEnum3dArrayMap() throws Exception {
+               proxy.setEnum3dArrayMap(new 
AMap<TestEnum,TestEnum[][][]>().append(TestEnum.ONE, new 
TestEnum[][][]{{{TestEnum.TWO,null},null},null}));
+               assertObjectEquals("{ONE:[[['TWO',null],null],null]}", 
proxy.getEnum3dArrayMap());
+               assertEquals("{ONE:[[['TWO',null],null],null]}", cf.get("A", 
"enum3dArrayMap"));
+               assertType(TestEnum.class, 
proxy.getEnum3dArrayMap().keySet().iterator().next());
+               assertType(TestEnum.class, 
proxy.getEnum3dArrayMap().values().iterator().next()[0][0][0]);
+       }
+
+       @Test
+       public void testEnum1d3dListMap() throws Exception {
+               proxy.setEnum1d3dListMap(new 
AMap<TestEnum,List<TestEnum[][][]>>().append(TestEnum.ONE, new 
AList<TestEnum[][][]>().append(new 
TestEnum[][][]{{{TestEnum.TWO,null},null},null}).append(null)));
+               assertObjectEquals("{ONE:[[[['TWO',null],null],null],null]}", 
proxy.getEnum1d3dListMap());
+               assertEquals("{ONE:[[[['TWO',null],null],null],null]}", 
cf.get("A", "enum1d3dListMap"));
+               assertType(TestEnum.class, 
proxy.getEnum1d3dListMap().keySet().iterator().next());
+               assertType(TestEnum.class, 
proxy.getEnum1d3dListMap().values().iterator().next().get(0)[0][0][0]);
+       }
+
+       public static interface ConfigInterface {
+
+               // Various primitives
+
+               public String getString();
+               public void setString(String x);
+               
+               public int getInt();
+               public void setInt(int x);
+               
+               public Integer getInteger();
+               public void setInteger(Integer x);
+
+               public boolean isBoolean();
+               public void setBoolean(boolean x);
+               
+               public Boolean getBooleanObject();
+               public void setBooleanObject(Boolean x);
+
+               public float getFloat();
+               public void setFloat(float x);
+               
+               public Float getFloatObject();
+               public void setFloatObject(Float x);
+
+               public int[][][] getInt3dArray();
+               public void setInt3dArray(int[][][] x);
+
+               public Integer[][][] getInteger3dArray();
+               public void setInteger3dArray(Integer[][][] x);
+
+               public String[][][] getString3dArray();
+               public void setString3dArray(String[][][] x);
+
+               public List<Integer> getIntegerList();
+               public void setIntegerList(List<Integer> x);
+               
+               public List<List<List<Integer>>> getInteger3dList();
+               public void setInteger3dList(List<List<List<Integer>>> x);
+
+               public List<Integer[][][]> getInteger1d3dList();
+               public void setInteger1d3dList(List<Integer[][][]> x);
+               
+               public List<int[][][]> getInt1d3dList();
+               public void setInt1d3dList(List<int[][][]> x);
+               
+               public List<String> getStringList();
+               public void setStringList(List<String> x);              
+
+               // Beans
+               
+               public ABean getBean();
+               public void setBean(ABean x);           
+
+               public ABean[][][] getBean3dArray();
+               public void setBean3dArray(ABean[][][] x);              
+
+               public List<ABean> getBeanList();
+               public void setBeanList(List<ABean> x);         
+
+               public List<ABean[][][]> getBean1d3dList();
+               public void setBean1d3dList(List<ABean[][][]> x);               
+
+               public Map<String,ABean> getBeanMap();
+               public void setBeanMap(Map<String,ABean> x);            
+
+               public Map<String,List<ABean>> getBeanListMap();
+               public void setBeanListMap(Map<String,List<ABean>> x);          
+
+               public Map<String,List<ABean[][][]>> getBean1d3dListMap();
+               public void setBean1d3dListMap(Map<String,List<ABean[][][]>> 
x);                
+
+               public Map<Integer,List<ABean>> getBeanListMapIntegerKeys();
+               public void setBeanListMapIntegerKeys(Map<Integer,List<ABean>> 
x);              
+
+               // Typed beans
+               
+               public TypedBean getTypedBean();
+               public void setTypedBean(TypedBean x);          
+
+               public TypedBean[][][] getTypedBean3dArray();
+               public void setTypedBean3dArray(TypedBean[][][] x);             
+
+               public List<TypedBean> getTypedBeanList();
+               public void setTypedBeanList(List<TypedBean> x);                
+
+               public List<TypedBean[][][]> getTypedBean1d3dList();
+               public void setTypedBean1d3dList(List<TypedBean[][][]> x);      
        
+
+               public Map<String,TypedBean> getTypedBeanMap();
+               public void setTypedBeanMap(Map<String,TypedBean> x);           
+
+               public Map<String,List<TypedBean>> getTypedBeanListMap();
+               public void setTypedBeanListMap(Map<String,List<TypedBean>> x); 
        
+
+               public Map<String,List<TypedBean[][][]>> 
getTypedBean1d3dListMap();
+               public void 
setTypedBean1d3dListMap(Map<String,List<TypedBean[][][]>> x);               
+
+               public Map<Integer,List<TypedBean>> 
getTypedBeanListMapIntegerKeys();
+               public void 
setTypedBeanListMapIntegerKeys(Map<Integer,List<TypedBean>> x);             
+
+               // Swapped POJOs
+               
+               public SwappedPojo getSwappedPojo();
+               public void setSwappedPojo(SwappedPojo x);              
+
+               public SwappedPojo[][][] getSwappedPojo3dArray();
+               public void setSwappedPojo3dArray(SwappedPojo[][][] x);         
+
+               public Map<SwappedPojo,SwappedPojo> getSwappedPojoMap();
+               public void setSwappedPojoMap(Map<SwappedPojo,SwappedPojo> x);  
        
+
+               public Map<SwappedPojo,SwappedPojo[][][]> getSwappedPojo3dMap();
+               public void 
setSwappedPojo3dMap(Map<SwappedPojo,SwappedPojo[][][]> x);          
+
+               // Implicit swapped POJOs
+               
+               public ImplicitSwappedPojo getImplicitSwappedPojo();
+               public void setImplicitSwappedPojo(ImplicitSwappedPojo x);      
        
+
+               public ImplicitSwappedPojo[][][] 
getImplicitSwappedPojo3dArray();
+               public void 
setImplicitSwappedPojo3dArray(ImplicitSwappedPojo[][][] x);         
+
+               public Map<ImplicitSwappedPojo,ImplicitSwappedPojo> 
getImplicitSwappedPojoMap();
+               public void 
setImplicitSwappedPojoMap(Map<ImplicitSwappedPojo,ImplicitSwappedPojo> x);      
    
+
+               public Map<ImplicitSwappedPojo,ImplicitSwappedPojo[][][]> 
getImplicitSwappedPojo3dMap();
+               public void 
setImplicitSwappedPojo3dMap(Map<ImplicitSwappedPojo,ImplicitSwappedPojo[][][]> 
x);          
+
+               // Enums
+               
+               public TestEnum getEnum();
+               public void setEnum(TestEnum x);                
+
+               public TestEnum[][][] getEnum3d();
+               public void setEnum3d(TestEnum[][][] x);                
+
+               public List<TestEnum> getEnumList();
+               public void setEnumList(List<TestEnum> x);              
+
+               public List<List<List<TestEnum>>> getEnum3dList();
+               public void setEnum3dList(List<List<List<TestEnum>>> x);        
        
+
+               public List<TestEnum[][][]> getEnum1d3dList();
+               public void setEnum1d3dList(List<TestEnum[][][]> x);            
+
+               public Map<TestEnum,TestEnum> getEnumMap();
+               public void setEnumMap(Map<TestEnum,TestEnum> x);               
+
+               public Map<TestEnum,TestEnum[][][]> getEnum3dArrayMap();
+               public void setEnum3dArrayMap(Map<TestEnum,TestEnum[][][]> x);  
        
+
+               public Map<TestEnum,List<TestEnum[][][]>> getEnum1d3dListMap();
+               public void 
setEnum1d3dListMap(Map<TestEnum,List<TestEnum[][][]>> x);
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca59d8a4/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileTest.java 
b/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileTest.java
index 21c8287..c4b77b3 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/ini/ConfigFileTest.java
@@ -260,34 +260,34 @@ public class ConfigFileTest {
        public void testExampleInConfigFile() throws Exception {
 
                ConfigFile cf = configFileBuilder.build()
-                       .addLines(null, "# Default section", "key1 = 1", "key2 
= true", "key3 = 1,2,3", "key4 = 'http://foo'", "")
+                       .addLines(null, "# Default section", "key1 = 1", "key2 
= true", "key3 = [1,2,3]", "key4 = http://foo";, "")
                        .addHeaderComments("section1", "# Section 1")
-                       .addLines("section1", "key1 = 2", "key2 = false", "key3 
= 4,5,6", "key4 = 'http://bar'");
+                       .addLines("section1", "key1 = 2", "key2 = false", "key3 
= [4,5,6]", "key4 = http://bar";);
                ConfigFile cfw = cf.getResolving(VarResolver.DEFAULT);
 
                assertEquals(1, cf.getInt("key1"));
                assertEquals(true, cf.getBoolean("key2"));
-               assertEquals(3, cf.getObject(int[].class, "key3")[2]);
-               assertEquals(6, cf.getObject(int[].class, "xkey3", new 
int[]{4,5,6})[2]);
-               assertEquals(6, cf.getObject(int[].class, "X/key3", new 
int[]{4,5,6})[2]);
-               assertEquals(new URL("http://foo";).toString(), 
cf.getObject(URL.class, "key4").toString());
+               assertEquals(3, cf.getObject("key3", int[].class)[2]);
+               assertEquals(6, cf.getObjectWithDefault("xkey3", new 
int[]{4,5,6}, int[].class)[2]);
+               assertEquals(6, cf.getObjectWithDefault("X/key3", new 
int[]{4,5,6}, int[].class)[2]);
+               assertEquals(new URL("http://foo";).toString(), 
cf.getObject("key4", URL.class).toString());
 
                assertEquals(1, cfw.getInt("key1"));
                assertEquals(true, cfw.getBoolean("key2"));
-               assertEquals(3, cfw.getObject(int[].class, "key3")[2]);
-               assertEquals(6, cfw.getObject(int[].class, "xkey3", new 
int[]{4,5,6})[2]);
-               assertEquals(6, cfw.getObject(int[].class, "X/key3", new 
int[]{4,5,6})[2]);
-               assertEquals(new URL("http://foo";).toString(), 
cfw.getObject(URL.class, "key4").toString());
+               assertEquals(3, cfw.getObject("key3", int[].class)[2]);
+               assertEquals(6, cfw.getObjectWithDefault("xkey3", new 
int[]{4,5,6}, int[].class)[2]);
+               assertEquals(6, cfw.getObjectWithDefault("X/key3", new 
int[]{4,5,6}, int[].class)[2]);
+               assertEquals(new URL("http://foo";).toString(), 
cfw.getObject("key4", URL.class).toString());
 
                assertEquals(2, cf.getInt("section1/key1"));
                assertEquals(false, cf.getBoolean("section1/key2"));
-               assertEquals(6, cf.getObject(int[].class, "section1/key3")[2]);
-               assertEquals(new URL("http://bar";).toString(), 
cf.getObject(URL.class, "section1/key4").toString());
+               assertEquals(6, cf.getObject("section1/key3", int[].class)[2]);
+               assertEquals(new URL("http://bar";).toString(), 
cf.getObject("section1/key4", URL.class).toString());
 
                assertEquals(2, cfw.getInt("section1/key1"));
                assertEquals(false, cfw.getBoolean("section1/key2"));
-               assertEquals(6, cfw.getObject(int[].class, "section1/key3")[2]);
-               assertEquals(new URL("http://bar";).toString(), 
cfw.getObject(URL.class, "section1/key4").toString());
+               assertEquals(6, cfw.getObject("section1/key3", int[].class)[2]);
+               assertEquals(new URL("http://bar";).toString(), 
cfw.getObject("section1/key4", URL.class).toString());
 
                cf = configFileBuilder.build(getFreshFile())
                        .addLines(null, "# Default section")
@@ -308,23 +308,23 @@ public class ConfigFileTest {
 
                assertEquals(1, cf.getInt("key1"));
                assertEquals(true, cf.getBoolean("key2"));
-               assertEquals(3, cf.getObject(int[].class, "key3")[2]);
-               assertEquals(new URL("http://foo";).toString(), 
cf.getObject(URL.class, "key4").toString());
+               assertEquals(3, cf.getObject("key3", int[].class)[2]);
+               assertEquals(new URL("http://foo";).toString(), 
cf.getObject("key4", URL.class).toString());
 
                assertEquals(1, cfw.getInt("key1"));
                assertEquals(true, cfw.getBoolean("key2"));
-               assertEquals(3, cfw.getObject(int[].class, "key3")[2]);
-               assertEquals(new URL("http://foo";).toString(), 
cfw.getObject(URL.class, "key4").toString());
+               assertEquals(3, cfw.getObject("key3", int[].class)[2]);
+               assertEquals(new URL("http://foo";).toString(), 
cfw.getObject("key4", URL.class).toString());
 
                assertEquals(2, cf.getInt("section1/key1"));
                assertEquals(false, cf.getBoolean("section1/key2"));
-               assertEquals(6, cf.getObject(int[].class, "section1/key3")[2]);
-               assertEquals(new URL("http://bar";).toString(), 
cf.getObject(URL.class, "section1/key4").toString());
+               assertEquals(6, cf.getObject("section1/key3", int[].class)[2]);
+               assertEquals(new URL("http://bar";).toString(), 
cf.getObject("section1/key4", URL.class).toString());
 
                assertEquals(2, cfw.getInt("section1/key1"));
                assertEquals(false, cfw.getBoolean("section1/key2"));
-               assertEquals(6, cfw.getObject(int[].class, "section1/key3")[2]);
-               assertEquals(new URL("http://bar";).toString(), 
cfw.getObject(URL.class, "section1/key4").toString());
+               assertEquals(6, cfw.getObject("section1/key3", int[].class)[2]);
+               assertEquals(new URL("http://bar";).toString(), 
cfw.getObject("section1/key4", URL.class).toString());
 
                cfw.put("key1", 2);
                cfw.put("key2", false);
@@ -340,23 +340,23 @@ public class ConfigFileTest {
 
                assertEquals(2, cf.getInt("key1"));
                assertEquals(false, cf.getBoolean("key2"));
-               assertEquals(6, cf.getObject(int[].class, "key3")[2]);
-               assertEquals(new URL("http://bar";).toString(), 
cf.getObject(URL.class, "key4").toString());
+               assertEquals(6, cf.getObject("key3", int[].class)[2]);
+               assertEquals(new URL("http://bar";).toString(), 
cf.getObject("key4", URL.class).toString());
 
                assertEquals(2, cfw.getInt("key1"));
                assertEquals(false, cfw.getBoolean("key2"));
-               assertEquals(6, cfw.getObject(int[].class, "key3")[2]);
-               assertEquals(new URL("http://bar";).toString(), 
cfw.getObject(URL.class, "key4").toString());
+               assertEquals(6, cfw.getObject("key3", int[].class)[2]);
+               assertEquals(new URL("http://bar";).toString(), 
cfw.getObject("key4", URL.class).toString());
 
                assertEquals(3, cf.getInt("section1/key1"));
                assertEquals(true, cf.getBoolean("section1/key2"));
-               assertEquals(9, cf.getObject(int[].class, "section1/key3")[2]);
-               assertEquals(new URL("http://baz";).toString(), 
cf.getObject(URL.class, "section1/key4").toString());
+               assertEquals(9, cf.getObject("section1/key3", int[].class)[2]);
+               assertEquals(new URL("http://baz";).toString(), 
cf.getObject("section1/key4", URL.class).toString());
 
                assertEquals(3, cfw.getInt("section1/key1"));
                assertEquals(true, cfw.getBoolean("section1/key2"));
-               assertEquals(9, cfw.getObject(int[].class, "section1/key3")[2]);
-               assertEquals(new URL("http://baz";).toString(), 
cfw.getObject(URL.class, "section1/key4").toString());
+               assertEquals(9, cfw.getObject("section1/key3", int[].class)[2]);
+               assertEquals(new URL("http://baz";).toString(), 
cfw.getObject("section1/key4", URL.class).toString());
        }
 
        
//====================================================================================================
@@ -365,17 +365,17 @@ public class ConfigFileTest {
        @Test
        public void testEnum() throws Exception {
                ConfigFile cf = configFileBuilder.build(getFreshFile())
-                       .addLines(null, "key1 = 'MINUTES'");
+                       .addLines(null, "key1 = MINUTES");
                ConfigFile cfw = cf.getResolving(VarResolver.DEFAULT);
 
-               assertEquals(TimeUnit.MINUTES, cf.getObject(TimeUnit.class, 
"key1"));
-               assertEquals(TimeUnit.MINUTES, cfw.getObject(TimeUnit.class, 
"key1"));
+               assertEquals(TimeUnit.MINUTES, cf.getObject("key1", 
TimeUnit.class));
+               assertEquals(TimeUnit.MINUTES, cfw.getObject("key1", 
TimeUnit.class));
 
                cf.save();
                cf.load();
 
-               assertEquals(TimeUnit.MINUTES, cf.getObject(TimeUnit.class, 
"key1"));
-               assertEquals(TimeUnit.MINUTES, cfw.getObject(TimeUnit.class, 
"key1"));
+               assertEquals(TimeUnit.MINUTES, cf.getObject("key1", 
TimeUnit.class));
+               assertEquals(TimeUnit.MINUTES, cfw.getObject("key1", 
TimeUnit.class));
        }
 
        
//====================================================================================================
@@ -1143,41 +1143,41 @@ public class ConfigFileTest {
        
//====================================================================================================
        @Test
        public void testGetObjectArray() throws Exception {
-               ConfigFile cf = configFileBuilder.build().addLines("A", 
"a1=1,2,3");
+               ConfigFile cf = configFileBuilder.build().addLines("A", 
"a1=[1,2,3]");
                ConfigFile cfw = cf.getResolving();
-               assertObjectEquals("[1,2,3]", cf.getObject(Integer[].class, 
"A/a1"));
-               assertObjectEquals("[1,2,3]", cfw.getObject(Integer[].class, 
"A/a1"));
-               assertObjectEquals("[4,5,6]", cf.getObject(Integer[].class, 
"A/a2", new Integer[]{4,5,6}));
-               assertObjectEquals("[4,5,6]", cfw.getObject(Integer[].class, 
"A/a2", new Integer[]{4,5,6}));
-               assertObjectEquals("[7,8,9]", cf.getObject(Integer[].class, 
"B/a1", new Integer[]{7,8,9}));
-               assertObjectEquals("[7,8,9]", cfw.getObject(Integer[].class, 
"B/a1", new Integer[]{7,8,9}));
-               assertObjectEquals("[]", cf.getObject(Integer[].class, "B/a1"));
-               assertObjectEquals("[]", cfw.getObject(Integer[].class, 
"B/a1"));
-
-               cf = configFileBuilder.build().addLines("A", "a1 = 1 ,\n\t2 
,\n\t3 ");
-               assertObjectEquals("[1,2,3]", cf.getObject(Integer[].class, 
"A/a1"));
-               assertObjectEquals("[1,2,3]", cfw.getObject(Integer[].class, 
"A/a1"));
+               assertObjectEquals("[1,2,3]", cf.getObject("A/a1", 
Integer[].class));
+               assertObjectEquals("[1,2,3]", cfw.getObject("A/a1", 
Integer[].class));
+               assertObjectEquals("[4,5,6]", cf.getObjectWithDefault("A/a2", 
new Integer[]{4,5,6}, Integer[].class));
+               assertObjectEquals("[4,5,6]", cfw.getObjectWithDefault("A/a2", 
new Integer[]{4,5,6}, Integer[].class));
+               assertObjectEquals("[7,8,9]", cf.getObjectWithDefault("B/a1", 
new Integer[]{7,8,9}, Integer[].class));
+               assertObjectEquals("[7,8,9]", cfw.getObjectWithDefault("B/a1", 
new Integer[]{7,8,9}, Integer[].class));
+               assertNull(cf.getObject("B/a1", Integer[].class));
+               assertNull(cfw.getObject("B/a1", Integer[].class));
+
+               cf = configFileBuilder.build().addLines("A", "a1 = [1 ,\n\t2 
,\n\t3] ");
+               assertObjectEquals("[1,2,3]", cf.getObject("A/a1", 
Integer[].class));
+               assertObjectEquals("[1,2,3]", cfw.getObject("A/a1", 
Integer[].class));
 
                // We cannot cast primitive arrays to Object[], so the 
following throws exceptions.
-               assertObjectEquals("[1,2,3]", cf.getObject(int[].class, 
"A/a1"));
-               assertEquals("int", cf.getObject(int[].class, 
"A/a1").getClass().getComponentType().getSimpleName());
-               assertObjectEquals("[]", cf.getObject(int[].class, "B/a1"));
-               assertEquals("int", cf.getObject(int[].class, 
"B/a1").getClass().getComponentType().getSimpleName());
-               assertObjectEquals("[]", cf.getObject(int[].class, "A/a2"));
-               assertEquals("int", cf.getObject(int[].class, 
"A/a2").getClass().getComponentType().getSimpleName());
-
-               assertObjectEquals("[1,2,3]", cf.getObject(int[].class, "A/a1", 
new int[]{4}));
-               assertEquals("int", cf.getObject(int[].class, "A/a1", new 
int[]{4}).getClass().getComponentType().getSimpleName());
-               assertObjectEquals("[4]", cf.getObject(int[].class, "B/a1", new 
int[]{4}));
-               assertEquals("int", cf.getObject(int[].class, "B/a1", new 
int[]{4}).getClass().getComponentType().getSimpleName());
-               assertObjectEquals("[4]", cf.getObject(int[].class, "A/a2", new 
int[]{4}));
-               assertEquals("int", cf.getObject(int[].class, "A/a2", new 
int[]{4}).getClass().getComponentType().getSimpleName());
-
-               System.setProperty("X", "4,5,6");
-               cf = configFileBuilder.build().addLines(null, "x1=$C{A/a1}", 
"x2=$S{X}", "x3=$S{Y}").addLines("A", "a1=1,2,3").getResolving();
-               assertObjectEquals("[1,2,3]", cf.getObject(int[].class, "x1", 
new int[]{9}));
-               assertObjectEquals("[4,5,6]", cf.getObject(int[].class, "x2", 
new int[]{9}));
-               assertObjectEquals("[9]", cf.getObject(int[].class, "x3", new 
int[]{9}));
+               assertObjectEquals("[1,2,3]", cf.getObject("A/a1", 
int[].class));
+               assertEquals("int", cf.getObject("A/a1", 
int[].class).getClass().getComponentType().getSimpleName());
+               assertNull(cf.getObject("B/a1", int[].class));
+               assertEquals("int", cf.getObjectWithDefault("B/a1", new int[0], 
int[].class).getClass().getComponentType().getSimpleName());
+               assertNull(cf.getObject("A/a2", int[].class));
+               assertEquals("int", cf.getObjectWithDefault("A/a2", new int[0], 
int[].class).getClass().getComponentType().getSimpleName());
+
+               assertObjectEquals("[1,2,3]", cf.getObjectWithDefault("A/a1", 
new int[]{4}, int[].class));
+               assertEquals("int", cf.getObjectWithDefault("A/a1", new 
int[]{4}, int[].class).getClass().getComponentType().getSimpleName());
+               assertObjectEquals("[4]", cf.getObjectWithDefault("B/a1", new 
int[]{4}, int[].class));
+               assertEquals("int", cf.getObjectWithDefault("B/a1", new 
int[]{4}, int[].class).getClass().getComponentType().getSimpleName());
+               assertObjectEquals("[4]", cf.getObjectWithDefault("A/a2", new 
int[]{4}, int[].class));
+               assertEquals("int", cf.getObjectWithDefault("A/a2", new 
int[]{4}, int[].class).getClass().getComponentType().getSimpleName());
+
+               System.setProperty("X", "[4,5,6]");
+               cf = configFileBuilder.build().addLines(null, "x1=$C{A/a1}", 
"x2=$S{X}", "x3=$S{Y}").addLines("A", "a1=[1,2,3]").getResolving();
+               assertObjectEquals("[1,2,3]", cf.getObjectWithDefault("x1", new 
int[]{9}, int[].class));
+               assertObjectEquals("[4,5,6]", cf.getObjectWithDefault("x2", new 
int[]{9}, int[].class));
+               assertObjectEquals("[9]", cf.getObjectWithDefault("x3", new 
int[]{9}, int[].class));
                System.clearProperty("X");
        }
 
@@ -1627,34 +1627,34 @@ public class ConfigFileTest {
        
//====================================================================================================
        @Test
        public void testGetObject() throws Exception {
-               ConfigFile cf = configFileBuilder.build().addLines("A", 
"a1=1,2,3", "a2=1", "a3=true", "a4=1.2", "a5=1.2,3.4");
+               ConfigFile cf = configFileBuilder.build().addLines("A", 
"a1=[1,2,3]", "a2=1", "a3=true", "a4=1.2", "a5=[1.2,3.4]");
                ConfigFile cfw = cf.getResolving();
 
-               assertObjectEquals("['1','2','3']", 
cf.getObject(String[].class, "A/a1"));
-               assertObjectEquals("'1,2,3'", cf.getObject(String.class, 
"A/a1"));
-               assertObjectEquals("'foobar'", cf.getObject(String.class, 
"X/a1", "foobar"));
-               assertObjectEquals("1", cf.getObject(int.class, "A/a2"));
-               assertObjectEquals("1", cf.getObject(Integer.class, "A/a2"));
-               assertObjectEquals("true", cf.getObject(boolean.class, "A/a3"));
-               assertObjectEquals("true", cf.getObject(Boolean.class, "A/a3"));
-               assertObjectEquals("1.2", cf.getObject(Float.class, "A/a4"));
-               assertObjectEquals("[1.2,3.4]", cf.getObject(Float[].class, 
"A/a5"));
-               assertObjectEquals("1.2", cf.getObject(float.class, "A/a4"));
-               assertObjectEquals("[1.2,3.4]", cf.getObject(float[].class, 
"A/a5"));
-               assertNull(cf.getObject(String.class, "B/a4"));
-
-               assertObjectEquals("['1','2','3']", 
cfw.getObject(String[].class, "A/a1"));
-               assertObjectEquals("'1,2,3'", cfw.getObject(String.class, 
"A/a1"));
-               assertObjectEquals("'foobar'", cfw.getObject(String.class, 
"X/a1", "foobar"));
-               assertObjectEquals("1", cfw.getObject(int.class, "A/a2"));
-               assertObjectEquals("1", cfw.getObject(Integer.class, "A/a2"));
-               assertObjectEquals("true", cfw.getObject(boolean.class, 
"A/a3"));
-               assertObjectEquals("true", cfw.getObject(Boolean.class, 
"A/a3"));
-               assertObjectEquals("1.2", cfw.getObject(Float.class, "A/a4"));
-               assertObjectEquals("[1.2,3.4]", cfw.getObject(Float[].class, 
"A/a5"));
-               assertObjectEquals("1.2", cfw.getObject(float.class, "A/a4"));
-               assertObjectEquals("[1.2,3.4]", cfw.getObject(float[].class, 
"A/a5"));
-               assertNull(cfw.getObject(String.class, "B/a4"));
+               assertObjectEquals("['1','2','3']", cf.getObject("A/a1", 
String[].class));
+               assertObjectEquals("'[1,2,3]'", cf.getObject("A/a1", 
String.class));
+               assertObjectEquals("'foobar'", cf.getObjectWithDefault("X/a1", 
"foobar", String.class));
+               assertObjectEquals("1", cf.getObject("A/a2", int.class));
+               assertObjectEquals("1", cf.getObject("A/a2", Integer.class));
+               assertObjectEquals("true", cf.getObject("A/a3", boolean.class));
+               assertObjectEquals("true", cf.getObject("A/a3", Boolean.class));
+               assertObjectEquals("1.2", cf.getObject("A/a4", Float.class));
+               assertObjectEquals("[1.2,3.4]", cf.getObject("A/a5", 
Float[].class));
+               assertObjectEquals("1.2", cf.getObject("A/a4", float.class));
+               assertObjectEquals("[1.2,3.4]", cf.getObject("A/a5", 
float[].class));
+               assertNull(cf.getObject("B/a4", String.class));
+
+               assertObjectEquals("['1','2','3']", cfw.getObject("A/a1", 
String[].class));
+               assertObjectEquals("'[1,2,3]'", cfw.getObject("A/a1", 
String.class));
+               assertObjectEquals("'foobar'", cfw.getObjectWithDefault("X/a1", 
"foobar", String.class));
+               assertObjectEquals("1", cfw.getObject("A/a2", int.class));
+               assertObjectEquals("1", cfw.getObject("A/a2", Integer.class));
+               assertObjectEquals("true", cfw.getObject("A/a3", 
boolean.class));
+               assertObjectEquals("true", cfw.getObject("A/a3", 
Boolean.class));
+               assertObjectEquals("1.2", cfw.getObject("A/a4", Float.class));
+               assertObjectEquals("[1.2,3.4]", cfw.getObject("A/a5", 
Float[].class));
+               assertObjectEquals("1.2", cfw.getObject("A/a4", float.class));
+               assertObjectEquals("[1.2,3.4]", cfw.getObject("A/a5", 
float[].class));
+               assertNull(cfw.getObject("B/a4", String.class));
        }
 
        
//====================================================================================================
@@ -1909,13 +1909,13 @@ public class ConfigFileTest {
                                assertEquals("Field 'key' cannot be null.", 
e.getLocalizedMessage());
                        }
                        try {
-                               cf.getObject(Object.class, null);
+                               cf.getObject(null, Object.class);
                                fail();
                        } catch (IllegalArgumentException e) {
                                assertEquals("Field 'key' cannot be null.", 
e.getLocalizedMessage());
                        }
                        try {
-                               cf.getObject(null, "");
+                               cf.getObject("", null);
                                fail();
                        } catch (IllegalArgumentException e) {
                                assertEquals("Field 'c' cannot be null.", 
e.getLocalizedMessage());

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca59d8a4/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/ABean.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/ABean.java 
b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/ABean.java
new file mode 100644
index 0000000..aa6a724
--- /dev/null
+++ b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/ABean.java
@@ -0,0 +1,24 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you 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.apache.juneau.test.pojos;
+
+public class ABean {
+       public int a;
+       public String b;
+
+       public ABean init() {
+               this.a = 1;
+               this.b = "foo";
+               return this;
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca59d8a4/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/Constants.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/Constants.java 
b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/Constants.java
new file mode 100644
index 0000000..ccfef31
--- /dev/null
+++ b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/Constants.java
@@ -0,0 +1,25 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you 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.apache.juneau.test.pojos;
+
+/**
+ * Description.
+ * <p>
+ *
+ * @author James Bognar ([email protected])
+ */
+public class Constants {
+
+       public static final String SWAP = 
"swap-~!@#$%^&*()_+`-={}[]|:;\"<,>.?/";
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca59d8a4/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/ImplicitSwappedPojo.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/ImplicitSwappedPojo.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/ImplicitSwappedPojo.java
new file mode 100644
index 0000000..cd1bc0d
--- /dev/null
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/ImplicitSwappedPojo.java
@@ -0,0 +1,35 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you 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.apache.juneau.test.pojos;
+
+import static org.apache.juneau.test.pojos.Constants.*;
+
+import org.apache.juneau.annotation.*;
+
+@BeanIgnore
+public class ImplicitSwappedPojo {
+       public boolean wasUnswapped;
+
+       @Override
+       public String toString() {
+               return SWAP;
+       }
+
+       public ImplicitSwappedPojo() {}
+
+
+       public ImplicitSwappedPojo(String fromString) {
+               if (fromString.equals(SWAP))
+                       wasUnswapped = true;
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca59d8a4/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/SwappedPojo.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/SwappedPojo.java 
b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/SwappedPojo.java
new file mode 100644
index 0000000..605fd25
--- /dev/null
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/SwappedPojo.java
@@ -0,0 +1,20 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you 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.apache.juneau.test.pojos;
+
+import org.apache.juneau.annotation.*;
+
+@Pojo(swap=SwappedPojoSwap.class)
+public class SwappedPojo {
+       public boolean wasUnswapped;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca59d8a4/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/SwappedPojoSwap.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/SwappedPojoSwap.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/SwappedPojoSwap.java
new file mode 100644
index 0000000..6284898
--- /dev/null
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/SwappedPojoSwap.java
@@ -0,0 +1,35 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you 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.apache.juneau.test.pojos;
+
+import static org.apache.juneau.test.pojos.Constants.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.parser.*;
+import org.apache.juneau.serializer.*;
+import org.apache.juneau.transform.*;
+
+public class SwappedPojoSwap extends PojoSwap<SwappedPojo,String> {
+       @Override
+       public String swap(BeanSession session, SwappedPojo c) throws 
SerializeException {
+               return SWAP;
+       }
+
+       @Override
+       public SwappedPojo unswap(BeanSession session, String f, ClassMeta<?> 
hint) throws ParseException {
+               SwappedPojo c = new SwappedPojo();
+               if (f.equals(SWAP))
+                       c.wasUnswapped = true;
+               return c;
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca59d8a4/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/TestEnum.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/TestEnum.java 
b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/TestEnum.java
new file mode 100644
index 0000000..0f4a39a
--- /dev/null
+++ b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/TestEnum.java
@@ -0,0 +1,17 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you 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.apache.juneau.test.pojos;
+
+public enum TestEnum {
+       ONE,TWO,THREE
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca59d8a4/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/TypedBean.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/TypedBean.java 
b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/TypedBean.java
new file mode 100644
index 0000000..2a50d98
--- /dev/null
+++ b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/TypedBean.java
@@ -0,0 +1,17 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you 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.apache.juneau.test.pojos;
+
[email protected](beanDictionary={TypedBeanImpl.class})
+public interface TypedBean {
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca59d8a4/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/TypedBeanImpl.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/TypedBeanImpl.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/TypedBeanImpl.java
new file mode 100644
index 0000000..7b00644
--- /dev/null
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/test/pojos/TypedBeanImpl.java
@@ -0,0 +1,25 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you 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.apache.juneau.test.pojos;
+
[email protected](typeName="TypedBeanImpl", sort=true)
+public class TypedBeanImpl implements TypedBean {
+       public int a;
+       public String b;
+
+       public TypedBeanImpl init() {
+               this.a = 1;
+               this.b = "foo";
+               return this;
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca59d8a4/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java 
b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
index 525f0e3..1a2baca 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
@@ -372,18 +372,31 @@ public class BeanSession extends Session {
                                                        n = 
((Boolean)value).booleanValue() ? "1" : "0";
                                                else
                                                        n = value.toString();
-                                               if (tc == Integer.TYPE)
-                                                       return 
(T)Integer.valueOf(n);
-                                               if (tc == Short.TYPE)
-                                                       return 
(T)Short.valueOf(n);
-                                               if (tc == Long.TYPE)
-                                                       return 
(T)Long.valueOf(n);
-                                               if (tc == Float.TYPE)
-                                                       return (T)new Float(n);
-                                               if (tc == Double.TYPE)
-                                                       return (T)new Double(n);
-                                               if (tc == Byte.TYPE)
-                                                       return 
(T)Byte.valueOf(n);
+
+                                               int multiplier = (tc == 
Integer.TYPE || tc == Short.TYPE || tc == Long.TYPE) ? getMultiplier(n) : 1;
+                                               if (multiplier != 1) {
+                                                       n = n.substring(0, 
n.length()-1).trim();
+                                                       Long l = 
Long.valueOf(n) * multiplier;
+                                                       if (tc == Integer.TYPE)
+                                                               return 
(T)Integer.valueOf(l.intValue());
+                                                       if (tc == Short.TYPE)
+                                                               return 
(T)Short.valueOf(l.shortValue());
+                                                       if (tc == Long.TYPE)
+                                                               return 
(T)Long.valueOf(l.longValue());
+                                               } else {
+                                                       if (tc == Integer.TYPE)
+                                                               return 
(T)Integer.valueOf(n);
+                                                       if (tc == Short.TYPE)
+                                                               return 
(T)Short.valueOf(n);
+                                                       if (tc == Long.TYPE)
+                                                               return 
(T)Long.valueOf(n);
+                                                       if (tc == Float.TYPE)
+                                                               return (T)new 
Float(n);
+                                                       if (tc == Double.TYPE)
+                                                               return (T)new 
Double(n);
+                                                       if (tc == Byte.TYPE)
+                                                               return 
(T)Byte.valueOf(n);
+                                               }
                                        }
                                } else if (type.isChar()) {
                                        String s = value.toString();
@@ -426,22 +439,35 @@ public class BeanSession extends Session {
                                                n = 
((Boolean)value).booleanValue() ? "1" : "0";
                                        else
                                                n = value.toString();
-                                       if (tc == Integer.class)
-                                               return (T)Integer.valueOf(n);
-                                       if (tc == Short.class)
-                                               return (T)Short.valueOf(n);
-                                       if (tc == Long.class)
-                                               return (T)Long.valueOf(n);
-                                       if (tc == Float.class)
-                                               return (T)new Float(n);
-                                       if (tc == Double.class)
-                                               return (T)new Double(n);
-                                       if (tc == Byte.class)
-                                               return (T)Byte.valueOf(n);
-                                       if (tc == AtomicInteger.class)
-                                               return (T)new 
AtomicInteger(Integer.valueOf(n));
-                                       if (tc == AtomicLong.class)
-                                               return (T)new 
AtomicLong(Long.valueOf(n));
+
+                                       int multiplier = (tc == Integer.class 
|| tc == Short.class || tc == Long.class) ? getMultiplier(n) : 1;
+                                       if (multiplier != 1) {
+                                               n = n.substring(0, 
n.length()-1).trim();
+                                               Long l = Long.valueOf(n) * 
multiplier;
+                                               if (tc == Integer.TYPE)
+                                                       return 
(T)Integer.valueOf(l.intValue());
+                                               if (tc == Short.TYPE)
+                                                       return 
(T)Short.valueOf(l.shortValue());
+                                               if (tc == Long.TYPE)
+                                                       return 
(T)Long.valueOf(l.longValue());
+                                       } else {
+                                               if (tc == Integer.class)
+                                                       return 
(T)Integer.valueOf(n);
+                                               if (tc == Short.class)
+                                                       return 
(T)Short.valueOf(n);
+                                               if (tc == Long.class)
+                                                       return 
(T)Long.valueOf(n);
+                                               if (tc == Float.class)
+                                                       return (T)new Float(n);
+                                               if (tc == Double.class)
+                                                       return (T)new Double(n);
+                                               if (tc == Byte.class)
+                                                       return 
(T)Byte.valueOf(n);
+                                               if (tc == AtomicInteger.class)
+                                                       return (T)new 
AtomicInteger(Integer.valueOf(n));
+                                               if (tc == AtomicLong.class)
+                                                       return (T)new 
AtomicLong(Long.valueOf(n));
+                                       }
                                }
                        }
 
@@ -581,6 +607,16 @@ public class BeanSession extends Session {
                throw new InvalidDataConversionException(value, type, null);
        }
 
+       private static int getMultiplier(String s) {
+               if (s.endsWith("G"))
+                       return 1024*1024*1024;
+               if (s.endsWith("M"))
+                       return 1024*1024;
+               if (s.endsWith("K"))
+                       return 1024;
+               return 1;
+       }
+
        /**
         * Converts the contents of the specified list into an array.
         * <p>

Reply via email to