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>
