Repository: incubator-juneau Updated Branches: refs/heads/master 374d592e1 -> ca48a2ffd
Add BeanDictionaryMap class and clean up the way Map and Collection class metas are constructed. Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/ca48a2ff Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/ca48a2ff Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/ca48a2ff Branch: refs/heads/master Commit: ca48a2ffd22cbc51db31b3a91a27adae132d9560 Parents: 374d592 Author: JamesBognar <[email protected]> Authored: Fri Feb 3 12:42:25 2017 -0500 Committer: JamesBognar <[email protected]> Committed: Fri Feb 3 12:42:25 2017 -0500 ---------------------------------------------------------------------- .../java/org/apache/juneau/BeanConfigTest.java | 13 - .../java/org/apache/juneau/BeanMapTest.java | 123 +++--- .../a/rttests/RoundTripPrimitivesBeansTest.java | 2 +- .../apache/juneau/a/rttests/RoundTripTest.java | 4 +- .../a/rttests/RoundTripToObjectMapsTest.java | 4 +- .../java/org/apache/juneau/jena/CommonTest.java | 4 +- .../CommonParser_UrlEncodingTest.java | 3 +- .../urlencoding/UrlEncodingParserTest.java | 6 +- .../apache/juneau/utils/FilteredMapTest.java | 5 +- .../java/org/apache/juneau/BeanContext.java | 386 +++++++++---------- .../java/org/apache/juneau/BeanDictionary.java | 47 --- .../org/apache/juneau/BeanDictionaryList.java | 55 +++ .../org/apache/juneau/BeanDictionaryMap.java | 86 +++++ .../main/java/org/apache/juneau/BeanMap.java | 3 + .../java/org/apache/juneau/BeanRegistry.java | 31 +- .../java/org/apache/juneau/BeanSession.java | 108 ++---- .../java/org/apache/juneau/ContextFactory.java | 2 +- .../main/java/org/apache/juneau/ObjectMap.java | 19 +- .../java/org/apache/juneau/annotation/Bean.java | 4 +- .../apache/juneau/annotation/BeanProperty.java | 4 +- .../juneau/dto/html5/HtmlBeanDictionary.java | 2 +- .../apache/juneau/internal/DelegateList.java | 3 +- .../java/org/apache/juneau/parser/Parser.java | 4 +- .../juneau/urlencoding/UrlEncodingParser.java | 2 +- .../urlencoding/UrlEncodingSerializer.java | 2 +- .../java/org/apache/juneau/xml/XmlParser.java | 4 +- juneau-core/src/main/javadoc/overview.html | 8 +- .../org/apache/juneau/rest/client/RestCall.java | 4 +- 28 files changed, 489 insertions(+), 449 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core-test/src/test/java/org/apache/juneau/BeanConfigTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/BeanConfigTest.java b/juneau-core-test/src/test/java/org/apache/juneau/BeanConfigTest.java index de7fe8b..24fe4a1 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/BeanConfigTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/BeanConfigTest.java @@ -538,19 +538,6 @@ public class BeanConfigTest { } //==================================================================================================== - // testGetClassMetaFromString - //==================================================================================================== - @Test - public void testGetClassMetaFromString() throws Exception { - BeanContext bc = BeanContext.DEFAULT; - assertEquals("java.lang.String[]", bc.getClassMetaFromString("java.lang.String[]").toString()); - assertEquals("java.lang.String[]", bc.getClassMetaFromString("[Ljava.lang.String;").toString()); - assertEquals("java.lang.String[][]", bc.getClassMetaFromString("java.lang.String[][]").toString()); - assertEquals("java.lang.String[][]", bc.getClassMetaFromString("[[Ljava.lang.String;").toString()); - assertEquals("boolean", bc.getClassMetaFromString("boolean").toString()); - } - - //==================================================================================================== // testFluentStyleSetters //==================================================================================================== @Test http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core-test/src/test/java/org/apache/juneau/BeanMapTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/BeanMapTest.java b/juneau-core-test/src/test/java/org/apache/juneau/BeanMapTest.java index 0b43eb7..17dfc5e 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/BeanMapTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/BeanMapTest.java @@ -33,13 +33,36 @@ public class BeanMapTest { JsonSerializer serializer = JsonSerializer.DEFAULT_LAX.clone().setClassLoader(BeanMapTest.class.getClassLoader()); + BeanContext bc = ContextFactory.create() + .setClassLoader(this.getClass().getClassLoader()) + .addToDictionary(MyBeanDictionaryMap.class) + .addPojoSwaps(CalendarSwap.ISO8601DTZ.class) + .getBeanContext(); + BeanSession session = bc.createSession(); + + public static class MyBeanDictionaryMap extends BeanDictionaryMap { + public MyBeanDictionaryMap() { + addClass("StringArray", String[].class); + addClass("String2dArray", String[][].class); + addClass("IntArray", int[].class); + addClass("Int2dArray", int[][].class); + addClass("S", S.class); + addClass("R1", R1.class); + addClass("R2", R2.class); + addClass("LinkedList", LinkedList.class); + addClass("TreeMap", TreeMap.class); + addCollectionClass("LinkedListOfInts", LinkedList.class, Integer.class); + addCollectionClass("LinkedListOfR1", LinkedList.class, R1.class); + addCollectionClass("LinkedListOfCalendar", LinkedList.class, Calendar.class); + } + } + //==================================================================================================== // Primitive field properties //==================================================================================================== @Test public void testPrimitiveFieldProperties() { A t = new A(); - BeanSession session = BeanContext.DEFAULT.createSession(); Map m = session.toBeanMap(t); // Make sure setting primitive values to null causes them to get default values. @@ -119,7 +142,6 @@ public class BeanMapTest { @Test public void testPrimitiveMethodProperties() { B t = new B(); - BeanSession session = BeanContext.DEFAULT.createSession(); Map m = session.toBeanMap(t); // Make sure setting primitive values to null causes them to get default values. @@ -229,7 +251,6 @@ public class BeanMapTest { @Test public void testCollectionFieldProperties() throws Exception { C t = new C(); - BeanSession session = BeanContext.DEFAULT.createSession(); Map m = session.toBeanMap(t); // Non-initialized list fields. @@ -311,7 +332,6 @@ public class BeanMapTest { @Test public void testCollectionMethodProperties() throws Exception { D t = new D(); - BeanSession session = BeanContext.DEFAULT.createSession(); Map m = session.toBeanMap(t); // Non-initialized list fields. @@ -446,7 +466,6 @@ public class BeanMapTest { @Test public void testArrayProperties() throws Exception { D1 t = new D1(); - BeanSession session = getBeanContext().createSession(); Map m = session.toBeanMap(t); m.put("b", new ObjectMap("{s:'foo'}")); assertNotNull(t.b); @@ -502,7 +521,6 @@ public class BeanMapTest { @Test public void testArrayPropertiesInObjectList() throws Exception { E t = new E(); - BeanSession session = BeanContext.DEFAULT.createSession(); Map m = session.toBeanMap(t); m.put("s", new ObjectList("['foo']")); m.put("s2", new ObjectList("[['foo']]")); @@ -528,7 +546,6 @@ public class BeanMapTest { public void testInvokeMethod() throws Exception { F t5 = new F(); ReaderParser p = JsonParser.DEFAULT; - BeanSession session = BeanContext.DEFAULT.createSession(); BeanMap m = session.toBeanMap(t5); new PojoIntrospector(t5, p).invokeMethod("doSetAProperty(java.lang.String)", "['baz']"); assertEquals("baz", m.get("prop")); @@ -549,7 +566,6 @@ public class BeanMapTest { @Test public void testBeanPropertyAnnotation() throws Exception { G1 t6 = new G1(); - BeanSession session = BeanContext.DEFAULT.createSession(); BeanMap m = session.toBeanMap(t6); try { @@ -632,7 +648,6 @@ public class BeanMapTest { //==================================================================================================== @Test public void testEnum() throws Exception { - BeanSession session = getBeanContext().createSession(); // Initialize existing bean. H t7 = new H(); @@ -761,7 +776,7 @@ public class BeanMapTest { //==================================================================================================== @Test public void testOverridingDetectionOfGenericTypes2() throws Exception { - BeanMap bm = BeanContext.DEFAULT.createSession().newBeanMap(K.class); + BeanMap bm = session.newBeanMap(K.class); assertEquals(Float.class, bm.getProperty("p1").getMeta().getClassMeta().getElementType().getInnerClass()); assertEquals(Float.class, bm.getProperty("p2").getMeta().getClassMeta().getElementType().getInnerClass()); assertEquals(Float.class, bm.getProperty("p3").getMeta().getClassMeta().getElementType().getInnerClass()); @@ -803,7 +818,7 @@ public class BeanMapTest { //==================================================================================================== @Test public void testGenericListSubclass() throws Exception { - BeanMap<L> bm = BeanContext.DEFAULT.createSession().newBeanMap(L.class); + BeanMap<L> bm = session.newBeanMap(L.class); bm.put("list", "[{name:'1',value:'1'},{name:'2',value:'2'}]"); L b = bm.getBean(); assertEquals("1", b.list.get(0).name); @@ -830,7 +845,6 @@ public class BeanMapTest { //==================================================================================================== @Test public void testGenericFields() throws Exception { - BeanSession session = BeanContext.DEFAULT.createSession(); M2 t1 = new M2(); BeanMap<M2> bm = session.toBeanMap(t1); @@ -882,7 +896,6 @@ public class BeanMapTest { //==================================================================================================== @Test public void testGenericMethods() throws Exception { - BeanSession session = BeanContext.DEFAULT.createSession(); N2 t1 = new N2(); BeanMap<N2> bm = session.toBeanMap(t1); @@ -1024,7 +1037,6 @@ public class BeanMapTest { //==================================================================================================== @Test public void testPropertyNameFactoryDashedLC1() throws Exception { - BeanSession session = BeanContext.DEFAULT.createSession(); BeanMap<P1> m = session.newBeanMap(P1.class).load("{'foo':1,'bar-baz':2,'bing-boo-url':3}"); assertEquals(1, m.get("foo")); assertEquals(2, m.get("bar-baz")); @@ -1126,11 +1138,10 @@ public class BeanMapTest { //==================================================================================================== @Test public void testCastWithNormalBean() throws Exception { - BeanSession session = getBeanContext().createSession(); // With _type ObjectMap m = new ObjectMap(session); - m.put("_type", R2.class.getName()); + m.put("_type", "R2"); m.put("f1", 1); m.put("f2", "2"); @@ -1177,12 +1188,11 @@ public class BeanMapTest { //==================================================================================================== @Test public void testCastWithNestedBean() throws Exception { - BeanSession session = getBeanContext().createSession(); // With _type ObjectMap m = new ObjectMap(session); - m.put("_type", S.class.getName()); - m.put("f1", new ObjectMap(session).append("_type", R1.class.getName()).append("f1", 1)); + m.put("_type", "S"); + m.put("f1", new ObjectMap(session).append("_type", "R1").append("f1", 1)); S t = (S)m.cast(); assertEquals(1, t.f1.f1); @@ -1216,12 +1226,11 @@ public class BeanMapTest { //==================================================================================================== @Test public void testCastToAnotherMapType() throws Exception { - BeanContext bc = BeanContext.DEFAULT; Map m2; // With _type - ObjectMap m = new ObjectMap(); - m.put("_type", TreeMap.class.getName()); + ObjectMap m = new ObjectMap(session); + m.put("_type", "TreeMap"); m.put("1", "ONE"); m2 = (Map)m.cast(); @@ -1236,7 +1245,7 @@ public class BeanMapTest { assertTrue(m2 instanceof TreeMap); assertEquals("ONE", m2.get("1")); - m2 = (Map)m.cast(bc.getMapClassMeta(TreeMap.class, Integer.class, TEnum.class)); + m2 = (Map)m.cast(bc.getClassMeta(TreeMap.class, Integer.class, TEnum.class)); assertTrue(m2 instanceof TreeMap); Map.Entry e = (Map.Entry)m2.entrySet().iterator().next(); assertTrue(e.getKey() instanceof Integer); @@ -1250,7 +1259,7 @@ public class BeanMapTest { assertTrue(e.getValue() instanceof String); assertEquals("ONE", m2.get("1")); - m2 = (Map)m.cast(bc.getMapClassMeta(HashMap.class, Integer.class, TEnum.class)); + m2 = (Map)m.cast(bc.getClassMeta(HashMap.class, Integer.class, TEnum.class)); assertTrue(m2 instanceof HashMap); e = (Map.Entry)m2.entrySet().iterator().next(); assertTrue(e.getKey() instanceof Integer); @@ -1273,7 +1282,7 @@ public class BeanMapTest { assertTrue(m2 instanceof TreeMap); assertEquals("ONE", m2.get("1")); - m2 = (Map)m.cast(bc.getMapClassMeta(TreeMap.class, Integer.class, TEnum.class)); + m2 = (Map)m.cast(bc.getClassMeta(TreeMap.class, Integer.class, TEnum.class)); assertTrue(m2 instanceof TreeMap); e = (Map.Entry)m2.entrySet().iterator().next(); assertTrue(e.getKey() instanceof Integer); @@ -1297,11 +1306,10 @@ public class BeanMapTest { //==================================================================================================== @Test public void testCastToLinkedList() throws Exception { - BeanContext bc = BeanContext.DEFAULT; // With _type - ObjectMap m = new ObjectMap(); - m.put("_type", LinkedList.class.getName()); + ObjectMap m = new ObjectMap(session); + m.put("_type", "LinkedList"); m.put("items", new ObjectList().append("1").append("2")); List l = (List)m.cast(); @@ -1340,7 +1348,7 @@ public class BeanMapTest { assertTrue(l instanceof ArrayList); assertEquals("1", l.get(0)); - l = (List)m.cast(bc.getCollectionClassMeta(List.class, Integer.class)); + l = (List)m.cast(bc.getClassMeta(List.class, Integer.class)); assertTrue(l instanceof LinkedList); assertTrue(l.get(0) instanceof Integer); assertEquals(1, l.get(0)); @@ -1351,11 +1359,10 @@ public class BeanMapTest { //==================================================================================================== @Test public void testToLinkedListInteger() throws Exception { - BeanContext bc = BeanContext.DEFAULT; - + // With _type - ObjectMap m = new ObjectMap(); - m.put("_type", LinkedList.class.getName() + "<java.lang.Integer>"); + ObjectMap m = new ObjectMap(session); + m.put("_type", "LinkedListOfInts"); m.put("items", new ObjectList().append("1").append("2")); List l = (List)m.cast(); @@ -1378,7 +1385,7 @@ public class BeanMapTest { assertTrue(l instanceof ArrayList); assertEquals(1, l.get(0)); - l = (List)m.cast(bc.getCollectionClassMeta(List.class, String.class)); + l = (List)m.cast(bc.getClassMeta(List.class, String.class)); assertTrue(l instanceof LinkedList); assertTrue(l.get(0) instanceof String); assertEquals("1", l.get(0)); @@ -1403,7 +1410,7 @@ public class BeanMapTest { assertTrue(l instanceof ArrayList); assertEquals("1", l.get(0)); - l = (List)m.cast(bc.getCollectionClassMeta(List.class, Integer.class)); + l = (List)m.cast(bc.getClassMeta(List.class, Integer.class)); assertTrue(l instanceof ObjectList); assertTrue(l.get(0) instanceof Integer); assertEquals(1, l.get(0)); @@ -1414,11 +1421,10 @@ public class BeanMapTest { //==================================================================================================== @Test public void testCastToLinkedListBean() throws Exception { - BeanSession session = getBeanContext().createSession(); // With _type ObjectMap m = new ObjectMap(session); - m.put("_type", LinkedList.class.getName() + "<"+R1.class.getName()+">"); + m.put("_type", "LinkedListOfR1"); m.put("items", new ObjectList(session).append("{f1:1}")); List l = (List)m.cast(); @@ -1446,7 +1452,7 @@ public class BeanMapTest { assertTrue(l.get(0) instanceof R1); assertEquals(1, ((R1)l.get(0)).f1); - l = (List)m.cast(session.getCollectionClassMeta(List.class, HashMap.class)); + l = (List)m.cast(session.getClassMeta(List.class, HashMap.class)); assertTrue(l instanceof LinkedList); assertTrue(l.get(0) instanceof HashMap); assertEquals(1, ((Map)l.get(0)).get("f1")); @@ -1475,17 +1481,17 @@ public class BeanMapTest { assertTrue(l.get(0) instanceof String); assertEquals("{f1:1}", l.get(0)); - l = (List)m.cast(session.getCollectionClassMeta(List.class, R1.class)); + l = (List)m.cast(session.getClassMeta(List.class, R1.class)); assertTrue(l instanceof LinkedList); assertTrue(l.get(0) instanceof R1); assertEquals(1, ((R1)l.get(0)).f1); - l = (List)m.cast(session.getCollectionClassMeta(List.class, HashMap.class)); + l = (List)m.cast(session.getClassMeta(List.class, HashMap.class)); assertTrue(l instanceof LinkedList); assertTrue(l.get(0) instanceof HashMap); assertEquals(1, ((Map)l.get(0)).get("f1")); - l = (List)m.cast(session.getCollectionClassMeta(List.class, Map.class)); + l = (List)m.cast(session.getClassMeta(List.class, Map.class)); assertTrue(l instanceof LinkedList); assertTrue(l.get(0) instanceof ObjectMap); assertEquals(1, ((Map)l.get(0)).get("f1")); @@ -1496,11 +1502,10 @@ public class BeanMapTest { //==================================================================================================== @Test public void testCastToLinkedListUsingSwap() throws Exception { - BeanSession session = ContextFactory.create().addPojoSwaps(CalendarSwap.ISO8601DTZ.class).getBeanContext().createSession(); // With _type ObjectMap m = new ObjectMap(session); - m.put("_type", LinkedList.class.getName() + "<"+Calendar.class.getName()+">"); + m.put("_type", "LinkedListOfCalendar"); m.put("items", new ObjectList().append("2001-07-04T15:30:45Z")); List l = (List)m.cast(); @@ -1525,7 +1530,7 @@ public class BeanMapTest { assertTrue(l instanceof ArrayList); assertEquals(2001, ((Calendar)l.get(0)).get(Calendar.YEAR)); - l = (List)m.cast(session.getCollectionClassMeta(List.class, String.class)); + l = (List)m.cast(session.getClassMeta(List.class, String.class)); assertTrue(l instanceof LinkedList); assertTrue(l.get(0) instanceof String); assertEquals("2001-07-04T15:30:45Z", l.get(0)); @@ -1548,7 +1553,7 @@ public class BeanMapTest { l = m.cast(session.getClassMeta(ArrayList.class)); assertTrue(l instanceof ArrayList); - l = (List)m.cast(session.getCollectionClassMeta(List.class, Calendar.class)); + l = (List)m.cast(session.getClassMeta(List.class, Calendar.class)); assertTrue(l instanceof LinkedList); assertTrue(l.get(0) instanceof Calendar); assertEquals(2001, ((Calendar)l.get(0)).get(Calendar.YEAR)); @@ -1559,11 +1564,10 @@ public class BeanMapTest { //==================================================================================================== @Test public void testCastToStringArray() throws Exception { - BeanContext bc = BeanContext.DEFAULT; - + // With _type - ObjectMap m = new ObjectMap(); - m.put("_type", String[].class.getName()); + ObjectMap m = new ObjectMap(session); + m.put("_type", "StringArray"); m.put("items", new ObjectList().append("1").append("2")); String[] l = (String[])m.cast(); @@ -1600,17 +1604,16 @@ public class BeanMapTest { l2 = m.cast(bc.getClassMeta(StringBuffer[].class)); assertEquals("1", l[0].toString()); } - + //==================================================================================================== // testCastToIntArray - cast() to int[] //==================================================================================================== @Test public void testCastToIntArray() throws Exception { - BeanContext bc = BeanContext.DEFAULT; // With _type - ObjectMap m = new ObjectMap(); - m.put("_type", int[].class.getName()); + ObjectMap m = new ObjectMap(session); + m.put("_type", "IntArray"); m.put("items", new ObjectList().append("1").append("2")); int[] l = (int[])m.cast(); @@ -1652,11 +1655,10 @@ public class BeanMapTest { //==================================================================================================== @Test public void testCastToString2dArray() throws Exception { - BeanContext bc = BeanContext.DEFAULT; // With _type - ObjectMap m = new ObjectMap(); - m.put("_type", String[][].class.getName()); + ObjectMap m = new ObjectMap(session); + m.put("_type", "String2dArray"); m.put("items", new ObjectList().append(new ObjectList().append("1")).append(new ObjectList().append("2"))); String[][] l = (String[][])m.cast(); @@ -1685,11 +1687,10 @@ public class BeanMapTest { //==================================================================================================== @Test public void testCastToInt2dArray() throws Exception { - BeanContext bc = BeanContext.DEFAULT; // With _type - ObjectMap m = new ObjectMap(); - m.put("_type", int[][].class.getName()); + ObjectMap m = new ObjectMap(session); + m.put("_type", "Int2dArray"); m.put("items", new ObjectList().append(new ObjectList().append("1")).append(new ObjectList().append("2"))); int[][] l = (int[][])m.cast(); @@ -1881,10 +1882,6 @@ public class BeanMapTest { } } - private BeanContext getBeanContext() { - return ContextFactory.create().setClassLoader(this.getClass().getClassLoader()).getBeanContext(); - } - @Test public void testSettingCollectionPropertyMultipleTimes() throws Exception { http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripPrimitivesBeansTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripPrimitivesBeansTest.java b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripPrimitivesBeansTest.java index cd83e0f..8dd1407 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripPrimitivesBeansTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripPrimitivesBeansTest.java @@ -274,7 +274,7 @@ public class RoundTripPrimitivesBeansTest extends RoundTripTest { }}; if (p == null) return; - t = roundTrip(t, p.getBeanContext().getCollectionClassMeta(List.class, PrimitivesBean.class)); + t = roundTrip(t, p.getBeanContext().createSession().getCollectionClassMeta(List.class, PrimitivesBean.class)); PrimitivesBean t2 = t.get(2); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java index 3c9b63a..675084a 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java @@ -248,7 +248,7 @@ public abstract class RoundTripTest { Object out = serialize(object, this.s); if (p == null) return object; - ClassMeta<? extends T> cm = p.getBeanContext().getMapClassMeta(c, k, v); + ClassMeta<? extends T> cm = p.getBeanContext().getClassMeta(c, k, v); T o = this.p.parse(out, cm); return (returnOriginalObject ? object : o); } @@ -256,7 +256,7 @@ public abstract class RoundTripTest { Object out = serialize(object, this.s); if (p == null) return object; - ClassMeta<? extends T> cm = p.getBeanContext().getCollectionClassMeta(c, e); + ClassMeta<? extends T> cm = p.getBeanContext().getClassMeta(c, e); T o = this.p.parse(out, cm); return (returnOriginalObject ? object : o); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripToObjectMapsTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripToObjectMapsTest.java b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripToObjectMapsTest.java index 9e48e24..4a9ada9 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripToObjectMapsTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/a/rttests/RoundTripToObjectMapsTest.java @@ -50,13 +50,13 @@ public class RoundTripToObjectMapsTest extends RoundTripTest { assertEquals(2, aa[0].f2); List<A> a2 = new ArrayList<A>(){{add(new A(new ObjectMap("{f1:'a',f2:2}")));}}; - a2 = roundTrip(a2, BeanContext.DEFAULT.getCollectionClassMeta(List.class, A.class)); + a2 = roundTrip(a2, BeanContext.DEFAULT.createSession().getCollectionClassMeta(List.class, A.class)); assertEquals(1, a2.size()); assertEquals("a", a2.get(0).f1); assertEquals(2, a2.get(0).f2); Map<String,A> a3 = new LinkedHashMap<String,A>(){{put("a", new A(new ObjectMap("{f1:'a',f2:2}")));}}; - a3 = roundTrip(a3, BeanContext.DEFAULT.getMapClassMeta(Map.class, String.class, A.class)); + a3 = roundTrip(a3, BeanContext.DEFAULT.createSession().getMapClassMeta(Map.class, String.class, A.class)); assertEquals(1, a3.size()); assertEquals("a", a3.get("a").f1); assertEquals(2, a3.get("a").f2); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java b/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java index c2085a2..45994ec 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/jena/CommonTest.java @@ -30,7 +30,7 @@ import org.apache.juneau.testbeans.*; import org.apache.juneau.xml.*; import org.junit.*; -@SuppressWarnings({"unchecked","serial","javadoc"}) +@SuppressWarnings({"serial","javadoc"}) public class CommonTest { private RdfSerializer getBasicSerializer() { @@ -236,7 +236,7 @@ public class CommonTest { String r = s.serialize(l1); assertEquals("<rdf:Seq><rdf:li rdf:parseType='Resource'><jp:x1><rdf:Seq><rdf:li rdf:parseType='Resource'><jp:x2>2</jp:x2></rdf:li></rdf:Seq></jp:x1><jp:x2>2</jp:x2></rdf:li></rdf:Seq>", strip(r)); - ClassMeta<LinkedList<F>> cm = p.getBeanContext().getCollectionClassMeta(LinkedList.class, F.class); + ClassMeta<LinkedList<F>> cm = p.getBeanContext().getClassMeta(LinkedList.class, F.class); l2 = p.parse(r, cm); assertEqualObjects(l1, l2); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java index b75834d..6e3823a 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java @@ -170,7 +170,6 @@ public class CommonParser_UrlEncodingTest { assertEquals("unknownProperty,1,4", events.get(0)); } - @SuppressWarnings("unchecked") @Test public void testCollections() throws Exception { WriterSerializer s = new UrlEncodingSerializer().setProperty(UonSerializerContext.UON_simpleMode, true); @@ -180,7 +179,7 @@ public class CommonParser_UrlEncodingTest { assertEquals("0=foo&1=bar", s.serialize(l)); String in = "0=foo&1=bar"; - ClassMeta<LinkedList<String>> cm = p.getBeanContext().createSession().getCollectionClassMeta(LinkedList.class, String.class); + ClassMeta<LinkedList<String>> cm = p.getBeanContext().createSession().getClassMeta(LinkedList.class, String.class); l = p.parse(in, cm); assertObjectEquals("['foo','bar']",l); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java index 03198f8..18f12c9 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingParserTest.java @@ -165,7 +165,7 @@ public class UrlEncodingParserTest { l = (List)l.get(0); assertTrue(l.isEmpty()); t = "(())"; - l = (List)p.parseParameter(t, p.getBeanContext().getCollectionClassMeta(LinkedList.class, List.class)); + l = (List)p.parseParameter(t, p.getBeanContext().getClassMeta(LinkedList.class, List.class)); assertTrue(l.size() == 1); l = (List)l.get(0); assertTrue(l.isEmpty()); @@ -185,7 +185,7 @@ public class UrlEncodingParserTest { assertTrue(l.size() == 1); assertEquals("", l.get(0)); t = "(())"; - l = (List)p.parseParameter(t, p.getBeanContext().getCollectionClassMeta(List.class, String.class)); + l = (List)p.parseParameter(t, p.getBeanContext().getClassMeta(List.class, String.class)); assertTrue(l.size() == 1); assertEquals("", l.get(0)); @@ -217,7 +217,7 @@ public class UrlEncodingParserTest { assertEquals("", l.get(1)); assertEquals("", l.get(2)); t = "(,,)"; - l = (List)p.parseParameter(t, p.getBeanContext().getCollectionClassMeta(List.class, Object.class)); + l = (List)p.parseParameter(t, p.getBeanContext().getClassMeta(List.class, Object.class)); assertTrue(l.size() == 3); assertEquals("", l.get(0)); assertEquals("", l.get(1)); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core-test/src/test/java/org/apache/juneau/utils/FilteredMapTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/utils/FilteredMapTest.java b/juneau-core-test/src/test/java/org/apache/juneau/utils/FilteredMapTest.java index ec75da3..db00d39 100755 --- a/juneau-core-test/src/test/java/org/apache/juneau/utils/FilteredMapTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/utils/FilteredMapTest.java @@ -30,12 +30,11 @@ public class FilteredMapTest { // testBasic //==================================================================================================== @Test - @SuppressWarnings("unchecked") public void testBasic() throws Exception { ObjectMap m = new ObjectMap("{a:'1',b:'2'}"); - ClassMeta<Map<String,Object>> cm = BeanContext.DEFAULT.getMapClassMeta(Map.class, String.class, Object.class); - ClassMeta<Map<String,String>> cm2 = BeanContext.DEFAULT.getMapClassMeta(Map.class, String.class, String.class); + ClassMeta<Map<String,Object>> cm = BeanContext.DEFAULT.getClassMeta(Map.class, String.class, Object.class); + ClassMeta<Map<String,String>> cm2 = BeanContext.DEFAULT.getClassMeta(Map.class, String.class, String.class); FilteredMap<String,Object> m2 = new FilteredMap<String,Object>(cm, m, new String[]{"a"}); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/BeanContext.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java index 06e1f8f..1a06ea4 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java @@ -856,7 +856,8 @@ public class BeanContext extends Context { * This list can consist of the following class types: * <ul> * <li>Any bean class that specifies a value for {@link Bean#typeName() @Bean.typeName()}. - * <li>Any collection of bean classes above. + * <li>Any subclass of {@link BeanDictionaryList} containing a collection of bean classes with type name annotations. + * <li>Any subclass of {@link BeanDictionaryMap} containing a mapping of type names to classes without type name annotations. * </ul> */ public static final String BEAN_beanDictionary = "BeanContext.beanDictionary.list"; @@ -1283,18 +1284,91 @@ public class BeanContext extends Context { return cm; if (cm.isMap()) { ClassMeta<Map> cm2 = (ClassMeta<Map>)cm; - cm2 = getMapClassMeta(cm2.getInnerClass(), cm2.getKeyType().getInnerClass(), cm2.getValueType().getInnerClass()); + cm2 = getClassMeta(cm2.getInnerClass(), cm2.getKeyType().getInnerClass(), cm2.getValueType().getInnerClass()); return (ClassMeta<T>)cm2; } if (cm.isCollection()) { ClassMeta<Collection> cm2 = (ClassMeta<Collection>)cm; - cm2 = getCollectionClassMeta(cm2.getInnerClass(), cm2.getElementType().getInnerClass()); + cm2 = getClassMeta(cm2.getInnerClass(), cm2.getElementType().getInnerClass()); return (ClassMeta<T>)cm2; } return getClassMeta(cm.getInnerClass()); } /** + * Resolves the following types of objects: + * <ul> + * <li>{@link Class} + * <li><code>Object[2]</code> containing <code>{Class<? extends Collection>, Object}</code> + * where the 2nd entry is the entry type which can be anything on this list. + * <li><code>Object[3]</code> containing <code>{Class<? extends Map>, Object, Object}</code> + * where the 2nd entry is the key type and 3rd entry is the value type which can be anything on this list. + * </ul> + * + * @param o + * @return The resolved class meta. + */ + public final <T> ClassMeta<T> getClassMeta(Object o) { + if (o == null) + return null; + if (o instanceof Class) + return getClassMeta((Class)o); + if (o instanceof Type) + return getClassMeta((Type)o); + if (List.class.isAssignableFrom(o.getClass())) { + List l = (List)o; + o = l.toArray(new Object[l.size()]); + return getClassMeta((Object[])o); + } + if (o.getClass().isArray()) + return getClassMeta((Object[])o); + throw new BeanRuntimeException("Invalid object type passed to getClassMeta(): ''{0}''. Only Class or arrays containing Class is supported.", o.getClass().getName()); + } + + /** + * Resolves the following types of objects: + * <ul> + * <li><code>Object[2]</code> containing <code>{Class<? extends Collection>, Object}</code> + * where the 2nd entry is the entry type which can be anything on this list. + * <li><code>Object[3]</code> containing <code>{Class<? extends Map>, Object, Object}</code> + * where the 2nd entry is the key type and 3rd entry is the value type which can be anything on this list. + * </ul> + * + * @param o + * @return The resolved class meta. + */ + public final <T> ClassMeta<T> getClassMeta(Object...o) { + if (o == null) + return null; + int len = o.length; + if (len == 2) { + Object oc = Array.get(o, 0); + if (oc instanceof Class) { + Class c = (Class)oc; + if (Collection.class.isAssignableFrom(c)) { + ClassMeta<?> ce = getClassMeta(Array.get(o, 1)); + if (ce.isObject()) + return getClassMeta(c); + return new ClassMeta(c, this).setElementType(ce); + } + } + } else if (len == 3) { + Object oc = Array.get(o, 0); + if (oc instanceof Class) { + Class c = (Class)oc; + if (Map.class.isAssignableFrom(c)) { + ClassMeta<?> ck = getClassMeta(Array.get(o, 1)); + ClassMeta<?> cv = getClassMeta(Array.get(o, 2)); + if (ck.isObject() && cv.isObject()) + return getClassMeta(c); + return new ClassMeta(c, this).setKeyType(ck).setValueType(cv); + } + } + } + throw new BeanRuntimeException("Invalid object type passed to getClassMeta(): ''{0}''. Only Class or arrays containing Class is supported.", o.getClass().getName()); + } + + /** * Construct a {@code ClassMeta} wrapper around a {@link Class} object. * * @param <T> The class type being wrapped. @@ -1346,97 +1420,6 @@ public class BeanContext extends Context { } /** - * Construct a {@code ClassMeta} wrapper around a {@link Map} object. - * - * @param <K> The map key class type. - * @param <V> The map value class type. - * @param <T> The map class type. - * @param c The map class type. - * @param keyType The map key class type. - * @param valueType The map value class type. - * @return If the key and value types are OBJECT, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public final <K,V,T extends Map<K,V>> ClassMeta<T> getMapClassMeta(Class<T> c, ClassMeta<K> keyType, ClassMeta<V> valueType) { - if (keyType.isObject() && valueType.isObject()) - return getClassMeta(c); - return new ClassMeta(c, this).setKeyType(keyType).setValueType(valueType); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Map} object. - * - * @param <K> The map key class type. - * @param <V> The map value class type. - * @param <T> The map class type. - * @param c The map class type. - * @param keyType The map key class type. - * @param valueType The map value class type. - * @return If the key and value types are Object, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public final <K,V,T extends Map<K,V>> ClassMeta<T> getMapClassMeta(Class<T> c, Class<K> keyType, Class<V> valueType) { - return getMapClassMeta(c, getClassMeta(keyType), getClassMeta(valueType)); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Map} object. - * - * @param <T> The map class type. - * @param c The map class type. - * @param keyType The map key class type. - * @param valueType The map value class type. - * @return If the key and value types are Object, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public final <T extends Map> ClassMeta<T> getMapClassMeta(Class<T> c, Type keyType, Type valueType) { - return getMapClassMeta(c, getClassMeta(keyType), getClassMeta(valueType)); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Collection} object. - * - * @param <E> The collection element class type. - * @param <T> The collection class type. - * @param c The collection class type. - * @param elementType The collection element class type. - * @return If the element type is <code>OBJECT</code>, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public final <E,T extends Collection<E>> ClassMeta<T> getCollectionClassMeta(Class<T> c, ClassMeta<E> elementType) { - if (elementType.isObject()) - return getClassMeta(c); - return new ClassMeta(c, this).setElementType(elementType); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Collection} object. - * - * @param <E> The collection element class type. - * @param <T> The collection class type. - * @param c The collection class type. - * @param elementType The collection element class type. - * @return If the element type is <code>OBJECT</code>, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public final <E,T extends Collection<E>> ClassMeta<T> getCollectionClassMeta(Class<T> c, Class<E> elementType) { - return getCollectionClassMeta(c, getClassMeta(elementType)); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Collection} object. - * - * @param <T> The collection class type. - * @param c The collection class type. - * @param elementType The collection element class type. - * @return If the element type is <code>OBJECT</code>, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public final <T extends Collection> ClassMeta<T> getCollectionClassMeta(Class<T> c, Type elementType) { - return getCollectionClassMeta(c, getClassMeta(elementType)); - } - - /** * Constructs a ClassMeta object given the specified object and parameters. * * @param o The parent class type. @@ -1648,112 +1631,115 @@ public class BeanContext extends Context { return cmObject; } - /** - * Converts class name strings to ClassMeta objects. - * - * <h6 class='topic'>Example:</h6> - * <ul> - * <li><js>"java.lang.String"</js> - * <li><js>"com.foo.sample.MyBean[]"</js> - * <li><js>"java.util.HashMap<java.lang.String,java.lang.Integer>"</js> - * <li><js>"[Ljava.lang.String;"</js> (i.e. the value of <code>String[].<jk>class</jk>.getName()</code>) - * </ul> - * - * @param s The class name. - * @return The ClassMeta corresponding to the class name string. - */ - protected final ClassMeta<?> getClassMetaFromString(String s) { - int d = 0; - if (s == null || s.isEmpty()) - return null; - - // Check for Class.getName() on array class types. - if (s.charAt(0) == '[') { - try { - return getClassMeta(findClass(s)); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - int i1 = 0; - int i2 = 0; - int dim = 0; - List<ClassMeta<?>> p = null; - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - if (c == '<') { - if (d == 0) { - i1 = i; - i2 = i+1; - p = new LinkedList<ClassMeta<?>>(); - } - d++; - } else if (c == '>') { - d--; - if (d == 0 && p != null) - p.add(getClassMetaFromString(s.substring(i2, i))); - } else if (c == ',' && d == 1) { - if (p != null) - p.add(getClassMetaFromString(s.substring(i2, i))); - i2 = i+1; - } - if (c == '[') { - if (i1 == 0) - i1 = i; - dim++; - } - } - if (i1 == 0) - i1 = s.length(); - try { - String name = s.substring(0, i1).trim(); - char x = name.charAt(0); - Class<?> c = null; - if (x >= 'b' && x <= 's') { - if (x == 'b' && name.equals("boolean")) - c = boolean.class; - else if (x == 'b' && name.equals("byte")) - c = byte.class; - else if (x == 'c' && name.equals("char")) - c = char.class; - else if (x == 'd' && name.equals("double")) - c = double.class; - else if (x == 'i' && name.equals("int")) - c = int.class; - else if (x == 'l' && name.equals("long")) - c = long.class; - else if (x == 's' && name.equals("short")) - c = short.class; - else - c = findClass(name); - } else { - c = findClass(name); - } - - ClassMeta<?> cm = getClassMeta(c); - - if (p != null) { - if (cm.isMap()) - cm = new ClassMeta(c, this).setKeyType(p.get(0)).setValueType(p.get(1)); - if (cm.isCollection()) - cm = new ClassMeta(c, this).setElementType(p.get(0)); - } - - while (dim > 0) { - cm = new ClassMeta(Array.newInstance(cm.getInnerClass(), 0).getClass(), this); - dim--; - } - - return cm; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - private Class<?> findClass(String name) throws ClassNotFoundException { - return classLoader == null ? Class.forName(name) : Class.forName(name, true, classLoader); - } +// +// This code is inherently unsafe (but still potentially useful?) +// +// /** +// * Converts class name strings to ClassMeta objects. +// * +// * <h6 class='topic'>Example:</h6> +// * <ul> +// * <li><js>"java.lang.String"</js> +// * <li><js>"com.foo.sample.MyBean[]"</js> +// * <li><js>"java.util.HashMap<java.lang.String,java.lang.Integer>"</js> +// * <li><js>"[Ljava.lang.String;"</js> (i.e. the value of <code>String[].<jk>class</jk>.getName()</code>) +// * </ul> +// * +// * @param s The class name. +// * @return The ClassMeta corresponding to the class name string. +// */ +// protected final ClassMeta<?> getClassMetaFromString(String s) { +// int d = 0; +// if (s == null || s.isEmpty()) +// return null; +// +// // Check for Class.getName() on array class types. +// if (s.charAt(0) == '[') { +// try { +// return getClassMeta(findClass(s)); +// } catch (ClassNotFoundException e) { +// throw new RuntimeException(e); +// } +// } +// +// int i1 = 0; +// int i2 = 0; +// int dim = 0; +// List<ClassMeta<?>> p = null; +// for (int i = 0; i < s.length(); i++) { +// char c = s.charAt(i); +// if (c == '<') { +// if (d == 0) { +// i1 = i; +// i2 = i+1; +// p = new LinkedList<ClassMeta<?>>(); +// } +// d++; +// } else if (c == '>') { +// d--; +// if (d == 0 && p != null) +// p.add(getClassMetaFromString(s.substring(i2, i))); +// } else if (c == ',' && d == 1) { +// if (p != null) +// p.add(getClassMetaFromString(s.substring(i2, i))); +// i2 = i+1; +// } +// if (c == '[') { +// if (i1 == 0) +// i1 = i; +// dim++; +// } +// } +// if (i1 == 0) +// i1 = s.length(); +// try { +// String name = s.substring(0, i1).trim(); +// char x = name.charAt(0); +// Class<?> c = null; +// if (x >= 'b' && x <= 's') { +// if (x == 'b' && name.equals("boolean")) +// c = boolean.class; +// else if (x == 'b' && name.equals("byte")) +// c = byte.class; +// else if (x == 'c' && name.equals("char")) +// c = char.class; +// else if (x == 'd' && name.equals("double")) +// c = double.class; +// else if (x == 'i' && name.equals("int")) +// c = int.class; +// else if (x == 'l' && name.equals("long")) +// c = long.class; +// else if (x == 's' && name.equals("short")) +// c = short.class; +// else +// c = findClass(name); +// } else { +// c = findClass(name); +// } +// +// ClassMeta<?> cm = getClassMeta(c); +// +// if (p != null) { +// if (cm.isMap()) +// cm = new ClassMeta(c, this).setKeyType(p.get(0)).setValueType(p.get(1)); +// if (cm.isCollection()) +// cm = new ClassMeta(c, this).setElementType(p.get(0)); +// } +// +// while (dim > 0) { +// cm = new ClassMeta(Array.newInstance(cm.getInnerClass(), 0).getClass(), this); +// dim--; +// } +// +// return cm; +// } catch (ClassNotFoundException e) { +// throw new RuntimeException(e); +// } +// } +// +// private Class<?> findClass(String name) throws ClassNotFoundException { +// return classLoader == null ? Class.forName(name) : Class.forName(name, true, classLoader); +// } /** * Returns the {@link PojoSwap} associated with the specified class, or <jk>null</jk> if there is no http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java b/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java deleted file mode 100644 index 333ef6d..0000000 --- a/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java +++ /dev/null @@ -1,47 +0,0 @@ -// *************************************************************************************************************************** -// * 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; - -import java.util.*; - -import org.apache.juneau.annotation.*; - -/** - * Represents a collection of bean classes that make up a bean dictionary. - */ -public class BeanDictionary extends ArrayList<Class<?>> { - private static final long serialVersionUID = 1L; - - /** - * Constructor. - * - * @param c The list of bean classes to add to this dictionary. - * Classes must either specify a {@link Bean#typeName()} value or be another subclass of <code>BeanDictionary</code>. - */ - public BeanDictionary(Class<?>...c) { - append(c); - } - - /** - * Append one or more bean classes to this bean dictionary. - * - * @param c The list of bean classes to add to this dictionary. - * Classes must either specify a {@link Bean#typeName()} value or be another subclass of <code>BeanDictionary</code>. - * @return This object (for method chaining). - */ - public BeanDictionary append(Class<?>...c) { - for (Class<?> cc : c) - add(cc); - return this; - } -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryList.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryList.java b/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryList.java new file mode 100644 index 0000000..3ce75d0 --- /dev/null +++ b/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryList.java @@ -0,0 +1,55 @@ +// *************************************************************************************************************************** +// * 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; + +import java.util.*; + +import org.apache.juneau.annotation.*; + +/** + * Represents a collection of bean classes that make up a bean dictionary. + * <p> + * The classes in the list must be one of the following: + * <ul> + * <li>Beans that provide a dictionary name using the {@link Bean#typeName()} annotation. + * <li>Other subclasses of {@link BeanDictionaryList}. + * <li>Other subclasses of {@link BeanDictionaryMap}. + * <p> + * Subclasses must implement a public no-arg constructor so that it can be instantiated by the bean context code. + */ +public class BeanDictionaryList extends ArrayList<Class<?>> { + private static final long serialVersionUID = 1L; + + /** + * Constructor. + * + * @param c The list of bean classes to add to this dictionary. + * Classes must either specify a {@link Bean#typeName()} value or be another subclass of <code>BeanDictionaryList</code>. + */ + public BeanDictionaryList(Class<?>...c) { + append(c); + } + + /** + * Append one or more bean classes to this bean dictionary. + * + * @param c The list of bean classes to add to this dictionary. + * Classes must either specify a {@link Bean#typeName()} value or be another subclass of <code>BeanDictionaryList</code>. + * @return This object (for method chaining). + */ + protected BeanDictionaryList append(Class<?>...c) { + for (Class<?> cc : c) + add(cc); + return this; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryMap.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryMap.java b/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryMap.java new file mode 100644 index 0000000..b6bd314 --- /dev/null +++ b/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryMap.java @@ -0,0 +1,86 @@ +// *************************************************************************************************************************** +// * 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; + +import java.lang.reflect.*; +import java.util.*; + +import org.apache.juneau.annotation.*; + +/** + * Represents a map of dictionary type names to bean classes that make up a bean dictionary. + * <p> + * In general, this approach for defining dictionary names for classes is used when it's not possible + * to use the {@link Bean#typeName()} annotation. + * <p> + * Subclasses must implement a public no-arg constructor so that it can be instantiated by the bean context code. + */ +@SuppressWarnings("rawtypes") +public class BeanDictionaryMap extends LinkedHashMap<String,Object> { + private static final long serialVersionUID = 1L; + + /** + * Add a dictionary name mapping for the specified class. + * + * @param typeName The dictionary name of the class. + * @param c The class represented by the dictionary name. + * @return This object (for method chaining). + */ + protected BeanDictionaryMap addClass(String typeName, Class<?> c) { + put(typeName, c); + return this; + } + + /** + * Add a dictionary name mapping for the specified map class with the specified key and value classes. + * + * @param typeName The dictionary name of the class. + * @param mapClass The map implementation class. + * @param keyClass The key class. + * @param valueClass The value class. + * @return This object (for method chaining). + */ + protected BeanDictionaryMap addMapClass(String typeName, Class<? extends Map> mapClass, Object keyClass, Object valueClass) { + assertValidParameter(keyClass); + assertValidParameter(valueClass); + put(typeName, new Object[]{mapClass, keyClass, valueClass}); + return this; + } + + /** + * Add a dictionary name mapping for the specified collection class with the specified entry class. + * + * @param typeName The dictionary name of the class. + * @param collectionClass The collection implementation class. + * @param entryClass The entry class. + * @return This object (for method chaining). + */ + protected BeanDictionaryMap addCollectionClass(String typeName, Class<? extends Collection> collectionClass, Object entryClass) { + assertValidParameter(entryClass); + put(typeName, new Object[]{collectionClass, entryClass}); + return this; + } + + private void assertValidParameter(Object o) { + if (o != null) { + if (o instanceof Class) + return; + if (o.getClass().isArray()) { + for (int i = 0; i < Array.getLength(o); i++) + assertValidParameter(Array.get(o, i)); + return; + } + } + throw new BeanRuntimeException("Invalid object type passed to BeanDictionaryMap: ''{0}''. Only objects of type Class or Object[] containing Class or Object[] objects can be used."); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/BeanMap.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanMap.java b/juneau-core/src/main/java/org/apache/juneau/BeanMap.java index 7ea88f0..8b7d563 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanMap.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanMap.java @@ -212,6 +212,9 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T return propertyCache.put(property, value); } + if (property.equals(session.getBeanTypePropertyName())) + return null; + throw new BeanRuntimeException(meta.c, "Bean property ''{0}'' not found.", property); } if (meta.beanFilter != null) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java b/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java index 679a3e5..0bc404c 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java @@ -54,26 +54,35 @@ public class BeanRegistry { } private void addClass(Class<?> c) { - if (c != null) { - if (ClassUtils.isParentClass(Collection.class, c)) { - try { + try { + if (c != null) { + if (ClassUtils.isParentClass(Collection.class, c)) { @SuppressWarnings("rawtypes") Collection cc = (Collection)c.newInstance(); for (Object o : cc) { if (o instanceof Class) addClass((Class<?>)o); else - throw new BeanRuntimeException("Collection class passed to BeanRegistry does not contain Class objects.", c.getName()); + throw new BeanRuntimeException("Collection class ''{0}'' passed to BeanRegistry does not contain Class objects.", c.getName()); } - } catch (Exception e) { - throw new BeanRuntimeException(e); + } else if (ClassUtils.isParentClass(Map.class, c)) { + Map<?,?> m = (Map<?,?>)c.newInstance(); + for (Map.Entry<?,?> e : m.entrySet()) { + String typeName = StringUtils.toString(e.getKey()); + ClassMeta<?> val = beanContext.getClassMeta(e.getValue()); + map.put(typeName, val); + } + } else { + Bean b = c.getAnnotation(Bean.class); + if (b == null || b.typeName().isEmpty()) + throw new BeanRuntimeException("Class ''{0}'' was passed to BeanRegistry but it doesn't have a @Bean.typeName() annotation defined.", c.getName()); + map.put(b.typeName(), beanContext.getClassMeta(c)); } - } else { - Bean b = c.getAnnotation(Bean.class); - if (b == null || b.typeName().isEmpty()) - throw new BeanRuntimeException("Class ''{0}'' was passed to BeanRegistry but it doesn't have a @Bean.typeName() annotation defined.", c.getName()); - map.put(b.typeName(), beanContext.getClassMeta(c)); } + } catch (BeanRuntimeException e) { + throw e; + } catch (Exception e) { + throw new BeanRuntimeException(e); } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/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 dd1ccdf..90b794f 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java @@ -817,53 +817,52 @@ public class BeanSession extends Session { } /** - * Construct a {@code ClassMeta} wrapper around a {@link Class} object. + * Returns a {@code ClassMeta} wrapper around a {@link Class} object. * * @param <T> The class type being wrapped. * @param c The class being wrapped. - * of type {@link Class} or {@link ClassMeta}. - * @return If the class is not an array, returns a cached {@link ClassMeta} object. - * Otherwise, returns a new {@link ClassMeta} object every time.<br> + * @return The class meta object containing information about the class. */ public final <T> ClassMeta<T> getClassMeta(Class<T> c) { return ctx.getClassMeta(c); } /** - * Construct a {@code ClassMeta} wrapper around a {@link Map} object. + * Returns a {@code ClassMeta} wrapper around a {@link Class} or {@link Type} object. * - * @param <K> The map key class type. - * @param <V> The map value class type. - * @param <T> The map class type. - * @param c The map class type. - * @param keyType The map key class type. - * @param valueType The map value class type. - * @return If the key and value types are OBJECT, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. + * @param <T> The class type being wrapped. + * @param c The class being wrapped. + * @return The class meta object containing information about the class. */ - public final <K,V,T extends Map<K,V>> ClassMeta<T> getMapClassMeta(Class<T> c, ClassMeta<K> keyType, ClassMeta<V> valueType) { - return ctx.getMapClassMeta(c, keyType, valueType); + public final <T> ClassMeta<T> getClassMeta(Object c) { + return ctx.getClassMeta(c); } /** - * Construct a {@code ClassMeta} wrapper around a {@link Map} object. + * Returns a {@link ClassMeta} wrapper around a {@link Map} or {@link Collection} class. + * <p> + * Handles the following object arrays: + * <ul> + * <li><code>Object[2]</code> containing <code>{Class<? extends Collection>, Object}</code> + * where the 2nd entry is the entry type which can be a Class/Type or another array. + * <li><code>Object[3]</code> containing <code>{Class<? extends Map>, Object, Object}</code> + * where the 2nd entry is the key type which can be a Class/Type and 3rd entry is the value type which can be a Class/Type or another array. + * </ul> * - * @param <K> The map key class type. - * @param <V> The map value class type. - * @param <T> The map class type. - * @param c The map class type. - * @param keyType The map key class type. - * @param valueType The map value class type. - * @return If the key and value types are Object, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. + * @param c The object array being resolved. + * @return The class meta object containing information about the class. */ - public final <K,V,T extends Map<K,V>> ClassMeta<T> getMapClassMeta(Class<T> c, Class<K> keyType, Class<V> valueType) { - return getMapClassMeta(c, getClassMeta(keyType), getClassMeta(valueType)); + public final <T> ClassMeta<T> getClassMeta(Object...c) { + return ctx.getClassMeta(c); } /** - * Construct a {@code ClassMeta} wrapper around a {@link Map} object. + * Convenience method for creating a {@link Map} class meta. + * <p> + * Equivalent to calling <code>getClassMeta(c, keyType, valueType)</code>. * + * @param <K> The map key class type. + * @param <V> The map value class type. * @param <T> The map class type. * @param c The map class type. * @param keyType The map key class type. @@ -871,26 +870,14 @@ public class BeanSession extends Session { * @return If the key and value types are Object, returns a cached {@link ClassMeta} object.<br> * Otherwise, returns a new {@link ClassMeta} object every time. */ - public final <T extends Map> ClassMeta<T> getMapClassMeta(Class<T> c, Type keyType, Type valueType) { - return getMapClassMeta(c, getClassMeta(keyType), getClassMeta(valueType)); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Collection} object. - * - * @param <E> The collection element class type. - * @param <T> The collection class type. - * @param c The collection class type. - * @param elementType The collection element class type. - * @return If the element type is <code>OBJECT</code>, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public final <E,T extends Collection<E>> ClassMeta<T> getCollectionClassMeta(Class<T> c, ClassMeta<E> elementType) { - return ctx.getCollectionClassMeta(c, elementType); + public final <K,V,T extends Map<K,V>> ClassMeta<T> getMapClassMeta(Class<T> c, Class<K> keyType, Class<V> valueType) { + return getClassMeta(c, keyType, valueType); } /** - * Construct a {@code ClassMeta} wrapper around a {@link Collection} object. + * Convenience method for creating a {@link Collection} class meta. + * <p> + * Equivalent to calling <code>getClassMeta(c, keyType, valueType)</code>. * * @param <E> The collection element class type. * @param <T> The collection class type. @@ -900,20 +887,7 @@ public class BeanSession extends Session { * Otherwise, returns a new {@link ClassMeta} object every time. */ public final <E,T extends Collection<E>> ClassMeta<T> getCollectionClassMeta(Class<T> c, Class<E> elementType) { - return getCollectionClassMeta(c, getClassMeta(elementType)); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Collection} object. - * - * @param <T> The collection class type. - * @param c The collection class type. - * @param elementType The collection element class type. - * @return If the element type is <code>OBJECT</code>, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public final <T extends Collection> ClassMeta<T> getCollectionClassMeta(Class<T> c, Type elementType) { - return getCollectionClassMeta(c, getClassMeta(elementType)); + return getClassMeta(c, getClassMeta(elementType)); } /** @@ -962,24 +936,6 @@ public class BeanSession extends Session { } /** - * Converts class name strings to ClassMeta objects. - * - * <h6 class='topic'>Example:</h6> - * <ul> - * <li><js>"java.lang.String"</js> - * <li><js>"com.foo.sample.MyBean[]"</js> - * <li><js>"java.util.HashMap<java.lang.String,java.lang.Integer>"</js> - * <li><js>"[Ljava.lang.String;"</js> (i.e. the value of <code>String[].<jk>class</jk>.getName()</code>) - * </ul> - * - * @param s The class name. - * @return The ClassMeta corresponding to the class name string. - */ - public final ClassMeta<?> getClassMetaFromString(String s) { - return ctx.getClassMetaFromString(s); - } - - /** * Returns the type property name as defined by {@link BeanContext#BEAN_beanTypePropertyName}. * * @return The type property name. Never <jk>null</jk>. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java b/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java index 0057dff..efa69b3 100644 --- a/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java +++ b/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java @@ -866,7 +866,7 @@ public final class ContextFactory extends Lockable { try { if (isBeanSessionAvailable()) { BeanSession session = getBeanSession(); - return (Map<K,V>)session.convertToType(p.value, session.getMapClassMeta(LinkedHashMap.class, keyType, valueType)); + return (Map<K,V>)session.convertToType(p.value, session.getClassMeta(LinkedHashMap.class, keyType, valueType)); } return def; } catch (InvalidDataConversionException e) { http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java b/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java index 48aceeb..5f54e5a 100644 --- a/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java +++ b/juneau-core/src/main/java/org/apache/juneau/ObjectMap.java @@ -1081,7 +1081,7 @@ public class ObjectMap extends LinkedHashMap<String,Object> { * @return This object map cast as another object. */ public Object cast() { - return cast((BeanRegistry)null); + return cast(session.getBeanRegistry()); } /** @@ -1094,10 +1094,12 @@ public class ObjectMap extends LinkedHashMap<String,Object> { */ public Object cast(BeanRegistry beanRegistry) { String c = (String)get(session.getBeanTypePropertyName()); - if (c == null) { + if (c == null || beanRegistry == null) return this; - } - return cast2(session.getClassMetaFromString(c)); + ClassMeta<?> cm = beanRegistry.getClassMeta(c); + if (cm == null) + return this; + return cast2(cm); } /** @@ -1116,7 +1118,7 @@ public class ObjectMap extends LinkedHashMap<String,Object> { */ @SuppressWarnings("unchecked") public <T> T cast(Class<T> type) { - ClassMeta<?> c1 = session.getClassMetaFromString((String)get(session.getBeanTypePropertyName())); + ClassMeta<?> c1 = session.getBeanRegistry().getClassMeta((String)get(session.getBeanTypePropertyName())); ClassMeta<?> c2 = session.getClassMeta(type); ClassMeta<?> c = narrowClassMeta(c1, c2); return (T)cast2(c); @@ -1133,7 +1135,7 @@ public class ObjectMap extends LinkedHashMap<String,Object> { */ @SuppressWarnings({"unchecked"}) public <T> T cast(ClassMeta<T> cm) { - ClassMeta<?> c1 = session.getClassMetaFromString((String)get(session.getBeanTypePropertyName())); + ClassMeta<?> c1 = session.getBeanRegistry().getClassMeta((String)get(session.getBeanTypePropertyName())); ClassMeta<?> c = narrowClassMeta(c1, cm); return (T)cast2(c); } @@ -1144,7 +1146,6 @@ public class ObjectMap extends LinkedHashMap<String,Object> { * The rule is that child classes superceed parent classes, and c2 superceeds c1 * if one isn't the parent of another. */ - @SuppressWarnings("unchecked") private ClassMeta<?> narrowClassMeta(ClassMeta<?> c1, ClassMeta<?> c2) { if (c1 == null) return c2; @@ -1152,11 +1153,11 @@ public class ObjectMap extends LinkedHashMap<String,Object> { if (c1.isMap()) { ClassMeta<?> k = getNarrowedClassMeta(c1.getKeyType(), c2.getKeyType()); ClassMeta<?> v = getNarrowedClassMeta(c1.getValueType(), c2.getValueType()); - return session.getMapClassMeta((Class<? extends Map<?,?>>)c.getInnerClass(), k, v); + return session.getClassMeta(c.getInnerClass(), k, v); } if (c1.isCollection()) { ClassMeta<?> e = getNarrowedClassMeta(c1.getElementType(), c2.getElementType()); - return session.getCollectionClassMeta((Class<? extends Collection<?>>)c.getInnerClass(), e); + return session.getClassMeta(c.getInnerClass(), e); } return c; } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java b/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java index b6c6d8f..f694e0e 100644 --- a/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java +++ b/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java @@ -280,7 +280,9 @@ public @interface Bean { * This list can consist of the following class types: * <ul> * <li>Any bean class that specifies a value for {@link Bean#typeName() @Bean.name()}; - * <li>Any subclass of {@link BeanDictionary} that defines an entire set of mappings. + * <li>Any subclass of {@link BeanDictionaryList} that defines an entire set of mappings. + * Note that the subclass MUST implement a no-arg constructor so that it can be instantiated. + * <li>Any subclass of {@link BeanDictionaryMap} that defines an entire set of mappings. * Note that the subclass MUST implement a no-arg constructor so that it can be instantiated. * </ul> */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java b/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java index bd68408..3e4cc76 100644 --- a/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java +++ b/juneau-core/src/main/java/org/apache/juneau/annotation/BeanProperty.java @@ -158,7 +158,9 @@ public @interface BeanProperty { * This list can consist of the following class types: * <ul> * <li>Any bean class that specifies a value for {@link Bean#typeName() @Bean.name()}; - * <li>Any subclass of {@link BeanDictionary} that defines an entire set of mappings. + * <li>Any subclass of {@link BeanDictionaryList} that defines an entire set of mappings. + * Note that the subclass MUST implement a no-arg constructor so that it can be instantiated. + * <li>Any subclass of {@link BeanDictionaryMap} that defines an entire set of mappings. * Note that the subclass MUST implement a no-arg constructor so that it can be instantiated. * </ul> */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlBeanDictionary.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlBeanDictionary.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlBeanDictionary.java index af301bc..46d5c2b 100644 --- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlBeanDictionary.java +++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlBeanDictionary.java @@ -18,7 +18,7 @@ import org.apache.juneau.*; * Defines the Java classes that make up the HTML DTO type dictionary. * <p> */ -public class HtmlBeanDictionary extends BeanDictionary { +public class HtmlBeanDictionary extends BeanDictionaryList { private static final long serialVersionUID = 1L; /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/internal/DelegateList.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/DelegateList.java b/juneau-core/src/main/java/org/apache/juneau/internal/DelegateList.java index 35e6b11..596ec85 100644 --- a/juneau-core/src/main/java/org/apache/juneau/internal/DelegateList.java +++ b/juneau-core/src/main/java/org/apache/juneau/internal/DelegateList.java @@ -32,10 +32,9 @@ public class DelegateList<T extends Collection<?>> extends ObjectList implements * * @param classMeta The data type represented by this delegate. */ - @SuppressWarnings("unchecked") public DelegateList(ClassMeta<T> classMeta) { if (classMeta.isArray()) - classMeta = classMeta.getBeanContext().getCollectionClassMeta(List.class, classMeta.getElementType()); + classMeta = classMeta.getBeanContext().getClassMeta(List.class, classMeta.getElementType()); this.classMeta = classMeta; } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java index 0084be8..d546b18 100644 --- a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java +++ b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java @@ -303,7 +303,7 @@ public abstract class Parser extends CoreApi { */ public final <K,V,T extends Map<K,V>> T parseMap(Object input, Class<T> mapClass, Class<K> keyClass, Class<V> valueClass) throws ParseException { ParserSession session = createSession(input); - ClassMeta<T> cm = session.getMapClassMeta(mapClass, keyClass, valueClass); + ClassMeta<T> cm = session.getClassMeta(mapClass, keyClass, valueClass); return parse(session, cm); } @@ -343,7 +343,7 @@ public abstract class Parser extends CoreApi { */ public final <E,T extends Collection<E>> T parseCollection(Object input, Class<T> collectionClass, Class<E> entryClass) throws ParseException, IOException { ParserSession session = createSession(input); - ClassMeta<T> cm = session.getCollectionClassMeta(collectionClass, entryClass); + ClassMeta<T> cm = session.getClassMeta(collectionClass, entryClass); return parse(session, cm); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java index 32a68f2..fac17c9 100644 --- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java @@ -416,7 +416,7 @@ public class UrlEncodingParser extends UonParser { private Object[] parseArgs(UrlEncodingParserSession session, ParserReader r, ClassMeta<?>[] argTypes) throws Exception { // TODO - This can be made more efficient. - ClassMeta<TreeMap<Integer,String>> cm = session.getMapClassMeta(TreeMap.class, Integer.class, String.class); + ClassMeta<TreeMap<Integer,String>> cm = session.getClassMeta(TreeMap.class, Integer.class, String.class); TreeMap<Integer,String> m = parseAnything(session, cm, r, session.getOuter()); Object[] vals = m.values().toArray(new Object[m.size()]); if (vals.length != argTypes.length) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java index 64c420f..99862d0 100644 --- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java +++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java @@ -254,7 +254,7 @@ public class UrlEncodingSerializer extends UonSerializer { } else if (sType.isBean()) { serializeBeanMap(session, out, session.toBeanMap(o), addTypeProperty); } else if (sType.isCollection()) { - serializeMap(session, out, getCollectionMap((Collection)o), session.getMapClassMeta(Map.class, Integer.class, sType.getElementType())); + serializeMap(session, out, getCollectionMap((Collection)o), session.getClassMeta(Map.class, Integer.class, sType.getElementType())); } else { // All other types can't be serialized as key/value pairs, so we create a // mock key/value pair with a "_value" key. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java index 8d0932a..b5ec875 100644 --- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java @@ -521,14 +521,14 @@ public class XmlParser extends ReaderParser { @Override /* ReaderParser */ protected <K,V> Map<K,V> doParseIntoMap(ParserSession session, Map<K,V> m, Type keyType, Type valueType) throws Exception { XmlParserSession s = (XmlParserSession)session; - ClassMeta cm = session.getMapClassMeta(m.getClass(), keyType, valueType); + ClassMeta cm = session.getClassMeta(m.getClass(), keyType, valueType); return parseIntoMap(s, m, cm.getKeyType(), cm.getValueType()); } @Override /* ReaderParser */ protected <E> Collection<E> doParseIntoCollection(ParserSession session, Collection<E> c, Type elementType) throws Exception { XmlParserSession s = (XmlParserSession)session; - ClassMeta cm = session.getCollectionClassMeta(c.getClass(), elementType); + ClassMeta cm = session.getClassMeta(c.getClass(), elementType); return parseIntoCollection(s,c, cm.getElementType()); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-core/src/main/javadoc/overview.html ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/javadoc/overview.html b/juneau-core/src/main/javadoc/overview.html index 620e8b5..10431b6 100644 --- a/juneau-core/src/main/javadoc/overview.html +++ b/juneau-core/src/main/javadoc/overview.html @@ -5377,7 +5377,10 @@ <li>New method {@link org.apache.juneau.encoders.EncoderGroup#getEncoderMatch(String)} that returns the matched encoder and encoding. <li>General improvements to Bean Dictionary support. <ul> - <li>New {@link org.apache.juneau.BeanDictionary} class can be used for defining reusable sets of bean dictionaries. + <li>New {@link org.apache.juneau.BeanDictionaryList} class can be used for defining reusable sets of bean dictionaries consisting + of classes annotated with {@link org.apache.juneau.annotation.Bean#typeName()}. + <li>New {@link org.apache.juneau.BeanDictionaryMap} class can be used for defining reusable sets of bean dictionaries consisting + of classes not annotated with {@link org.apache.juneau.annotation.Bean#typeName()}. <li>New {@link org.apache.juneau.annotation.Bean#beanDictionary()} annotation. </ul> <li>Removed restriction on getters and setters to be prefixed with "getX/setX/isX" if a {@link org.apache.juneau.annotation.BeanProperty#name()} annotation is used. @@ -5389,6 +5392,9 @@ </ul> <li>New {@link org.apache.juneau.transform.MapSwap} and {@link org.apache.juneau.transform.StringSwap} classes. <li>New {@link org.apache.juneau.serializer.WriterSerializer#println(Object)} method. Useful for debugging purposes. + <li>New {@link org.apache.juneau.BeanContext#getClassMeta(Object[])} and {@link org.apache.juneau.BeanSession#getClassMeta(Object[])} + methods for retrieving Map and Collection class metas. + Replaces the various <code>getMapClassMeta()</code>/<code>getCollectionClassMeta()</code> methods. <li>New section added to this document: <a class='doclink' href='#DTOs'>Juneau Data Transfer Objects (org.apache.juneau.dto)</a> </ul> http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ca48a2ff/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java ---------------------------------------------------------------------- diff --git a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java index 916fa6b..b49c59a 100644 --- a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java +++ b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java @@ -795,7 +795,7 @@ public final class RestCall { * @throws IOException */ public final <K,V,T extends Map<K,V>> T getResponseMap(Class<T> mapClass, Class<K> keyClass, Class<V> valueClass) throws ParseException, IOException { - ClassMeta<T> cm = getBeanContext().getMapClassMeta(mapClass, keyClass, valueClass); + ClassMeta<T> cm = getBeanContext().getClassMeta(mapClass, keyClass, valueClass); return getResponse(cm); } @@ -822,7 +822,7 @@ public final class RestCall { * @throws IOException */ public final <E,T extends Collection<E>> T getResponseCollection(Class<T> collectionClass, Class<E> entryClass) throws ParseException, IOException { - ClassMeta<T> cm = getBeanContext().getCollectionClassMeta(collectionClass, entryClass); + ClassMeta<T> cm = getBeanContext().getClassMeta(collectionClass, entryClass); return getResponse(cm); }
