http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/jena/CommonParserTest.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau/src/test/java/org/apache/juneau/jena/CommonParserTest.java b/org.apache.juneau/src/test/java/org/apache/juneau/jena/CommonParserTest.java new file mode 100755 index 0000000..76e6a73 --- /dev/null +++ b/org.apache.juneau/src/test/java/org/apache/juneau/jena/CommonParserTest.java @@ -0,0 +1,208 @@ +/*************************************************************************************************************************** + * 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.jena; + +import static org.apache.juneau.BeanContext.*; +import static org.apache.juneau.jena.RdfCommonContext.*; +import static org.apache.juneau.jena.RdfSerializerContext.*; +import static org.apache.juneau.serializer.SerializerContext.*; +import static org.junit.Assert.*; + +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.serializer.*; +import org.junit.*; + +@SuppressWarnings({"rawtypes","serial"}) +public class CommonParserTest { + + private String wrap(String in) { + return "" + + "<rdf:RDF" + + " xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'" + + " xmlns:j='http://www.ibm.com/juneau/'" + + " xmlns:jp='http://www.ibm.com/juneaubp/'>" + + in + + "</rdf:RDF>"; + } + + private String strip(String s) { + return s.replaceFirst("<rdf:RDF[^>]+>\\s*", "").replaceAll("</rdf:RDF>$", "").trim().replaceAll("[\\r\\n]", ""); + } + + private RdfSerializer getBasicSerializer() { + return new RdfSerializer() + .setProperty(SERIALIZER_quoteChar, '\'') + .setProperty(RDF_addLiteralTypes, true) + .setProperty(SERIALIZER_useIndentation, false) + .setProperty(RDF_rdfxml_allowBadUris, true) + .setProperty(RDF_rdfxml_showDoctypeDeclaration, false) + .setProperty(RDF_rdfxml_showXmlDeclaration, false); + } + + //==================================================================================================== + // testBasicFromSerializer + //==================================================================================================== + @Test + public void testFromSerializer() throws Exception { + WriterSerializer s = getBasicSerializer(); + ReaderParser p = new RdfParser.Xml().setProperty(RdfParserContext.RDF_trimWhitespace, true).setClassLoader(getClass().getClassLoader()); + Map m = null; + String in; + Integer one = Integer.valueOf(1); + + in = wrap("<rdf:Description><jp:a rdf:datatype='http://www.w3.org/2001/XMLSchema#int'>1</jp:a></rdf:Description>"); + m = (Map)p.parse(in, Object.class); + assertEquals(one, m.get("a")); + + in = wrap("<rdf:Description><jp:a rdf:datatype='http://www.w3.org/2001/XMLSchema#int'>1</jp:a><jp:b>foo bar</jp:b><jp:c rdf:datatype='http://www.w3.org/2001/XMLSchema#boolean'>false</jp:c></rdf:Description>"); + m = (Map)p.parse(in, Object.class); + assertEquals(one, m.get("a")); + assertEquals("foo bar", m.get("b")); + in = wrap("<rdf:Description><jp:a rdf:datatype='http://www.w3.org/2001/XMLSchema#int'> 1 </jp:a><jp:b> foo bar </jp:b><jp:c rdf:datatype='http://www.w3.org/2001/XMLSchema#boolean'> false </jp:c></rdf:Description>"); + m = (Map)p.parse(in, Object.class); + assertEquals(one, m.get("a")); + assertEquals("foo bar", m.get("b")); + assertEquals(false, m.get("c")); + + in = wrap("<rdf:Description><jp:x>org.apache.juneau.test.Person</jp:x><jp:addresses><rdf:Seq><rdf:li rdf:parseType='Resource'><jp:x>org.apache.juneau.test.Address</jp:x><jp:city>city A</jp:city><jp:state>state A</jp:state><jp:street>street A</jp:street><jp:zip rdf:datatype='http://www.w3.org/2001/XMLSchema#int'>12345</jp:zip></rdf:li></rdf:Seq></jp:addresses></rdf:Description>"); + m = (Map)p.parse(in, Object.class); + assertEquals("org.apache.juneau.test.Person", m.get("x")); + List l = (List)m.get("addresses"); + assertNotNull(l); + m = (Map)l.get(0); + assertNotNull(m); + assertEquals("org.apache.juneau.test.Address", m.get("x")); + assertEquals("city A", m.get("city")); + assertEquals("state A", m.get("state")); + assertEquals("street A", m.get("street")); + assertEquals(12345, m.get("zip")); + + in = wrap("<rdf:Seq><rdf:li rdf:parseType='Resource'><jp:attribute>value</jp:attribute></rdf:li><rdf:li rdf:parseType='Resource'><jp:attribute>value</jp:attribute></rdf:li></rdf:Seq>"); + ObjectList jl = (ObjectList)p.parse(in, Object.class); + assertEquals("value", jl.getObjectMap(0).getString("attribute")); + assertEquals("value", jl.getObjectMap(1).getString("attribute")); + + // Verify that all the following return null. + assertNull(p.parse((CharSequence)null, Object.class)); + assertNull(p.parse(wrap(""), Object.class)); + assertNull(p.parse(wrap(" "), Object.class)); + assertNull(p.parse(wrap(" \t"), Object.class)); + assertNull(p.parse(wrap(" <!--foo-->"), Object.class)); + assertNull(p.parse(wrap(" <!--foo--> "), Object.class)); + assertNull(p.parse(wrap(" //foo "), Object.class)); + + + A1 t1 = new A1(); + A2 t2 = new A2(); + t2.add(new A3("name0","value0")); + t2.add(new A3("name1","value1")); + t1.list = t2; + + s.setProperty(SERIALIZER_addClassAttrs, true); + in = strip(s.serialize(t1)); + assertEquals("<rdf:Description><j:class>"+A1.class.getName()+"</j:class><jp:list><rdf:Seq><rdf:li rdf:parseType='Resource'><jp:name>name0</jp:name><jp:value>value0</jp:value></rdf:li><rdf:li rdf:parseType='Resource'><jp:name>name1</jp:name><jp:value>value1</jp:value></rdf:li></rdf:Seq></jp:list></rdf:Description>", in); + in = wrap(in); + t1 = (A1)p.parse(in, Object.class); + assertEquals("value1", t1.list.get(1).value); + t1 = p.parse(in, A1.class); + assertEquals("value1", t1.list.get(1).value); + } + + public static class A1 { + public A2 list; + } + + public static class A2 extends LinkedList<A3> { + } + + public static class A3 { + public String name, value; + public A3(){} + public A3(String name, String value) { + this.name = name; + this.value = value; + } + } + + //==================================================================================================== + // Correct handling of unknown properties. + //==================================================================================================== + @Test + public void testCorrectHandlingOfUnknownProperties() throws Exception { + ReaderParser p = new RdfParser.Xml().setProperty(BEAN_ignoreUnknownBeanProperties, true); + B t; + + String in = wrap("<rdf:Description><jp:a rdf:datatype='http://www.w3.org/2001/XMLSchema#int'>1</jp:a><jp:unknownProperty>foo</jp:unknownProperty><jp:b rdf:datatype='http://www.w3.org/2001/XMLSchema#int'>2</jp:b></rdf:Description>"); + t = p.parse(in, B.class); + assertEquals(t.a, 1); + assertEquals(t.b, 2); + + try { + p = new RdfParser.Xml(); + p.parse(in, B.class); + fail("Exception expected"); + } catch (ParseException e) {} + } + + public static class B { + public int a, b; + } + + //==================================================================================================== + // Writing to Collection properties with no setters. + //==================================================================================================== + @Test + public void testCollectionPropertiesWithNoSetters() throws Exception { + RdfParser p = new RdfParser.Xml(); + String in = wrap("<rdf:Description><jp:ints><rdf:Seq><rdf:li>1</rdf:li><rdf:li>2</rdf:li></rdf:Seq></jp:ints><jp:beans><rdf:Seq><rdf:li rdf:parseType='Resource'><jp:a>1</jp:a><jp:b>2</jp:b></rdf:li></rdf:Seq></jp:beans></rdf:Description>"); + C t = p.parse(in, C.class); + assertEquals(t.getInts().size(), 2); + assertEquals(t.getBeans().get(0).b, 2); + } + + public static class C { + private Collection<Integer> ints = new LinkedList<Integer>(); + private List<B> beans = new LinkedList<B>(); + public Collection<Integer> getInts() { + return ints; + } + public List<B> getBeans() { + return beans; + } + } + + //==================================================================================================== + // Parser listeners. + //==================================================================================================== + @Test + public void testParserListeners() throws Exception { + final List<String> events = new LinkedList<String>(); + RdfParser p = new RdfParser.Xml().setProperty(BEAN_ignoreUnknownBeanProperties, true); + p.addListener( + new ParserListener() { + @Override /* ParserListener */ + public <T> void onUnknownProperty(String propertyName, Class<T> beanClass, T bean, int line, int col) { + events.add(propertyName + "," + line + "," + col); + } + } + ); + + String in = wrap("<rdf:Description><jp:a rdf:datatype='http://www.w3.org/2001/XMLSchema#int'>1</jp:a><jp:unknownProperty>foo</jp:unknownProperty><jp:b rdf:datatype='http://www.w3.org/2001/XMLSchema#int'>2</jp:b></rdf:Description>"); + p.parse(in, B.class); + assertEquals(1, events.size()); + assertEquals("unknownProperty,-1,-1", events.get(0)); + } +}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/jena/CommonTest.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau/src/test/java/org/apache/juneau/jena/CommonTest.java b/org.apache.juneau/src/test/java/org/apache/juneau/jena/CommonTest.java new file mode 100755 index 0000000..664ce71 --- /dev/null +++ b/org.apache.juneau/src/test/java/org/apache/juneau/jena/CommonTest.java @@ -0,0 +1,513 @@ +/*************************************************************************************************************************** + * 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.jena; + +import static org.apache.juneau.TestUtils.*; +import static org.apache.juneau.jena.RdfCommonContext.*; +import static org.apache.juneau.serializer.SerializerContext.*; +import static org.junit.Assert.*; + +import java.net.*; +import java.net.URI; +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.annotation.*; +import org.apache.juneau.internal.*; +import org.apache.juneau.serializer.*; +import org.apache.juneau.testbeans.*; +import org.apache.juneau.xml.*; +import org.junit.*; + +@SuppressWarnings({"unchecked","serial"}) +public class CommonTest { + + private RdfSerializer getBasicSerializer() { + return new RdfSerializer() + .setProperty(SERIALIZER_quoteChar, '\'') + .setProperty(SERIALIZER_useIndentation, false) + .setProperty(RDF_rdfxml_allowBadUris, true) + .setProperty(RDF_rdfxml_showDoctypeDeclaration, false) + .setProperty(RDF_rdfxml_showXmlDeclaration, false); + } + + private String strip(String s) { + return s.replaceFirst("<rdf:RDF[^>]+>\\s*", "").replaceAll("</rdf:RDF>$", "").trim().replaceAll("[\\r\\n]", ""); + } + + //==================================================================================================== + // Trim nulls from beans + //==================================================================================================== + @Test + public void testTrimNullsFromBeans() throws Exception { + RdfSerializer s = getBasicSerializer(); + RdfParser p = RdfParser.DEFAULT_XML; + A t1 = A.create(), t2; + + s.setProperty(SERIALIZER_trimNullProperties, false); + String r = s.serialize(t1); + assertEquals("<rdf:Description><jp:s1 rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/><jp:s2>s2</jp:s2></rdf:Description>", strip(r)); + t2 = p.parse(r, A.class); + assertEqualObjects(t1, t2); + + s.setProperty(SERIALIZER_trimNullProperties, true); + r = s.serialize(t1); + assertEquals("<rdf:Description><jp:s2>s2</jp:s2></rdf:Description>", strip(r)); + t2 = p.parse(r, A.class); + assertEqualObjects(t1, t2); + } + + public static class A { + public String s1, s2; + + public static A create() { + A t = new A(); + t.s2 = "s2"; + return t; + } + } + + //==================================================================================================== + // Trim empty maps + //==================================================================================================== + @Test + public void testTrimEmptyMaps() throws Exception { + RdfSerializer s = getBasicSerializer(); + RdfParser p = RdfParser.DEFAULT_XML; + B t1 = B.create(), t2; + String r; + + s.setProperty(SERIALIZER_trimEmptyMaps, false); + r = s.serialize(t1); + assertEquals("<rdf:Description><jp:f1 rdf:parseType='Resource'></jp:f1><jp:f2 rdf:parseType='Resource'><jp:f2a rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/><jp:f2b rdf:parseType='Resource'><jp:s2>s2</jp:s2></jp:f2b></jp:f2></rdf:Description>", strip(r)); + t2 = p.parse(r, B.class); + assertEqualObjects(t1, t2); + + s.setProperty(SERIALIZER_trimEmptyMaps, true); + r = s.serialize(t1); + assertEquals("<rdf:Description><jp:f2 rdf:parseType='Resource'><jp:f2a rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/><jp:f2b rdf:parseType='Resource'><jp:s2>s2</jp:s2></jp:f2b></jp:f2></rdf:Description>", strip(r)); + t2 = p.parse(r, B.class); + assertNull(t2.f1); + } + + public static class B { + public TreeMap<String,A> f1, f2; + + public static B create() { + B t = new B(); + t.f1 = new TreeMap<String,A>(); + t.f2 = new TreeMap<String,A>(){{put("f2a",null);put("f2b",A.create());}}; + return t; + } + } + + //==================================================================================================== + // Trim empty lists + //==================================================================================================== + @Test + public void testTrimEmptyLists() throws Exception { + RdfSerializer s = getBasicSerializer(); + RdfParser p = RdfParser.DEFAULT_XML; + C t1 = C.create(), t2; + String r; + + s.setProperty(SERIALIZER_trimEmptyLists, false); + r = s.serialize(t1); + assertEquals("<rdf:Description><jp:f1><rdf:Seq/></jp:f1><jp:f2><rdf:Seq><rdf:li rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/><rdf:li rdf:parseType='Resource'><jp:s2>s2</jp:s2></rdf:li></rdf:Seq></jp:f2></rdf:Description>", strip(r)); + t2 = p.parse(r, C.class); + assertEqualObjects(t1, t2); + + s.setProperty(SERIALIZER_trimEmptyLists, true); + r = s.serialize(t1); + assertEquals("<rdf:Description><jp:f2><rdf:Seq><rdf:li rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/><rdf:li rdf:parseType='Resource'><jp:s2>s2</jp:s2></rdf:li></rdf:Seq></jp:f2></rdf:Description>", strip(r)); + t2 = p.parse(r, C.class); + assertNull(t2.f1); + t2 = p.parse(r, C.class); + } + + public static class C { + public List<A> f1, f2; + + public static C create() { + C t = new C(); + t.f1 = new LinkedList<A>(); + t.f2 = new LinkedList<A>(){{add(null);add(A.create());}}; + return t; + } + } + + //==================================================================================================== + // Trim empty arrays + //==================================================================================================== + @Test + public void testTrimEmptyArrays() throws Exception { + RdfSerializer s = getBasicSerializer(); + RdfParser p = RdfParser.DEFAULT_XML; + D t1 = D.create(), t2; + String r; + + s.setProperty(SERIALIZER_trimEmptyLists, false); + r = s.serialize(t1); + assertEquals("<rdf:Description><jp:f1><rdf:Seq/></jp:f1><jp:f2><rdf:Seq><rdf:li rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/><rdf:li rdf:parseType='Resource'><jp:s2>s2</jp:s2></rdf:li></rdf:Seq></jp:f2></rdf:Description>", strip(r)); + t2 = p.parse(r, D.class); + assertEqualObjects(t1, t2); + + s.setProperty(SERIALIZER_trimEmptyLists, true); + r = s.serialize(t1); + assertEquals("<rdf:Description><jp:f2><rdf:Seq><rdf:li rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/><rdf:li rdf:parseType='Resource'><jp:s2>s2</jp:s2></rdf:li></rdf:Seq></jp:f2></rdf:Description>", strip(r)); + t2 = p.parse(r, D.class); + assertNull(t2.f1); + } + + public static class D { + public A[] f1, f2; + + public static D create() { + D t = new D(); + t.f1 = new A[]{}; + t.f2 = new A[]{null, A.create()}; + return t; + } + } + + //==================================================================================================== + // @BeanProperty.properties annotation. + //==================================================================================================== + @Test + public void testBeanPropertyProperties() throws Exception { + RdfSerializer s = getBasicSerializer(); + RdfParser p = RdfParser.DEFAULT_XML; + E1 t1 = E1.create(), t2; + String r; + + r = s.serialize(t1); + assertEquals("<rdf:Description><jp:x1 rdf:parseType='Resource'><jp:f1>1</jp:f1></jp:x1><jp:x2 rdf:parseType='Resource'><jp:f1>1</jp:f1></jp:x2><jp:x3><rdf:Seq><rdf:li rdf:parseType='Resource'><jp:f1>1</jp:f1></rdf:li></rdf:Seq></jp:x3><jp:x4><rdf:Seq><rdf:li rdf:parseType='Resource'><jp:f1>1</jp:f1></rdf:li></rdf:Seq></jp:x4><jp:x5><rdf:Seq><rdf:li rdf:parseType='Resource'><jp:f1>1</jp:f1></rdf:li></rdf:Seq></jp:x5><jp:x6><rdf:Seq><rdf:li rdf:parseType='Resource'><jp:f1>1</jp:f1></rdf:li></rdf:Seq></jp:x6></rdf:Description>", strip(r)); + t2 = p.parse(r, E1.class); + assertEqualObjects(t1, t2); + } + + public static class E1 { + @BeanProperty(properties={"f1"}) public E2 x1; + @BeanProperty(properties={"f1"}) public Map<String,Integer> x2; + @BeanProperty(properties={"f1"}) public E2[] x3; + @BeanProperty(properties={"f1"}) public List<E2> x4; + @BeanProperty(properties={"f1"}) public ObjectMap[] x5; + @BeanProperty(properties={"f1"}) public List<ObjectMap> x6; + + public static E1 create() { + E1 t = new E1(); + t.x1 = new E2(); + t.x2 = new LinkedHashMap<String,Integer>() {{ put("f1",1); put("f2",2); }}; + t.x3 = new E2[] {new E2()}; + t.x4 = new LinkedList<E2>() {{ add(new E2()); }}; + t.x5 = new ObjectMap[] {new ObjectMap().append("f1","1").append("f2","2")}; + t.x6 = new LinkedList<ObjectMap>() {{ add(new ObjectMap().append("f1","1").append("f2","2")); }}; + return t; + } + } + + public static class E2 { + public int f1 = 1; + public int f2 = 2; + } + + //==================================================================================================== + // @BeanProperty.properties annotation on list of beans. + //==================================================================================================== + @Test + public void testBeanPropertyProperiesOnListOfBeans() throws Exception { + RdfSerializer s = getBasicSerializer(); + RdfParser p = RdfParser.DEFAULT_XML; + List<F> l1 = new LinkedList<F>(), l2; + F t = F.create(); + t.x1.add(F.create()); + l1.add(t); + + 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); + l2 = p.parse(r, cm); + assertEqualObjects(l1, l2); + } + + public static class F { + @BeanProperty(properties={"x2"}) public List<F> x1; + public int x2; + + public static F create() { + F t = new F(); + t.x1 = new LinkedList<F>(); + t.x2 = 2; + return t; + } + } + + //==================================================================================================== + // Test URIAttr - Test that URLs and URIs are serialized and parsed correctly. + //==================================================================================================== + @Test + public void testURIAttr() throws Exception { + RdfSerializer s = getBasicSerializer(); + RdfParser p = RdfParser.DEFAULT_XML; + + G t = new G(); + t.uri = new URI("http://uri"); + t.f1 = new URI("http://f1"); + t.f2 = new URL("http://f2"); + + String xml = s.serialize(t); + t = p.parse(xml, G.class); + assertEquals("http://uri", t.uri.toString()); + assertEquals("http://f1", t.f1.toString()); + assertEquals("http://f2", t.f2.toString()); + } + + public static class G { + @BeanProperty(beanUri=true) public URI uri; + public URI f1; + public URL f2; + } + + //==================================================================================================== + // Test URIs with URI_CONTEXT and URI_AUTHORITY + //==================================================================================================== + @Test + public void testUris() throws Exception { + WriterSerializer s = getBasicSerializer(); + TestURI t = new TestURI(); + String r; + String expected = ""; + + s.setProperty(SERIALIZER_relativeUriBase, null); + r = stripAndSort(s.serialize(t)); + expected = "" + +"</rdf:Description>>" + +"\n<<rdf:Description rdf:about='f0/x0'>" + +"\n<jp:f1 rdf:resource='f1/x1'/>" + +"\n<jp:f2 rdf:resource='/f2/x2'/>" + +"\n<jp:f3 rdf:resource='http://www.ibm.com/f3/x3'/>" + +"\n<jp:f4 rdf:resource='f4/x4'/>" + +"\n<jp:f5 rdf:resource='/f5/x5'/>" + +"\n<jp:f6 rdf:resource='http://www.ibm.com/f6/x6'/>" + +"\n<jp:f7 rdf:resource='http://www.ibm.com/f7/x7'/>" + +"\n<jp:f8 rdf:resource='f8/x8'/>" + +"\n<jp:f9 rdf:resource='f9/x9'/>" + +"\n<jp:fa>http://www.ibm.com/fa/xa#MY_LABEL</jp:fa>" + +"\n<jp:fb>http://www.ibm.com/fb/xb?label=MY_LABEL&foo=bar</jp:fb>" + +"\n<jp:fc>http://www.ibm.com/fc/xc?foo=bar&label=MY_LABEL</jp:fc>" + +"\n<jp:fd>http://www.ibm.com/fd/xd?label2=MY_LABEL&foo=bar</jp:fd>" + +"\n<jp:fe>http://www.ibm.com/fe/xe?foo=bar&label2=MY_LABEL</jp:fe>" + ; + assertEquals(expected, r); + + s.setProperty(SERIALIZER_relativeUriBase, ""); // Same as null. + r = stripAndSort(s.serialize(t)); + assertEquals(expected, r); + + s.setProperty(SERIALIZER_relativeUriBase, "/cr"); + r = stripAndSort(s.serialize(t)); + expected = "" + +"</rdf:Description>>" + +"\n<<rdf:Description rdf:about='/cr/f0/x0'>" + +"\n<jp:f1 rdf:resource='/cr/f1/x1'/>" + +"\n<jp:f2 rdf:resource='/f2/x2'/>" + +"\n<jp:f3 rdf:resource='http://www.ibm.com/f3/x3'/>" + +"\n<jp:f4 rdf:resource='/cr/f4/x4'/>" + +"\n<jp:f5 rdf:resource='/f5/x5'/>" + +"\n<jp:f6 rdf:resource='http://www.ibm.com/f6/x6'/>" + +"\n<jp:f7 rdf:resource='http://www.ibm.com/f7/x7'/>" + +"\n<jp:f8 rdf:resource='/cr/f8/x8'/>" + +"\n<jp:f9 rdf:resource='/cr/f9/x9'/>" + +"\n<jp:fa>http://www.ibm.com/fa/xa#MY_LABEL</jp:fa>" + +"\n<jp:fb>http://www.ibm.com/fb/xb?label=MY_LABEL&foo=bar</jp:fb>" + +"\n<jp:fc>http://www.ibm.com/fc/xc?foo=bar&label=MY_LABEL</jp:fc>" + +"\n<jp:fd>http://www.ibm.com/fd/xd?label2=MY_LABEL&foo=bar</jp:fd>" + +"\n<jp:fe>http://www.ibm.com/fe/xe?foo=bar&label2=MY_LABEL</jp:fe>" + ; + assertEquals(expected, r); + + s.setProperty(SERIALIZER_relativeUriBase, "/cr/"); // Same as above + r = stripAndSort(s.serialize(t)); + assertEquals(expected, r); + + s.setProperty(SERIALIZER_relativeUriBase, "/"); + r = stripAndSort(s.serialize(t)); + expected = "" + +"</rdf:Description>>" + +"\n<<rdf:Description rdf:about='/f0/x0'>" + +"\n<jp:f1 rdf:resource='/f1/x1'/>" + +"\n<jp:f2 rdf:resource='/f2/x2'/>" + +"\n<jp:f3 rdf:resource='http://www.ibm.com/f3/x3'/>" + +"\n<jp:f4 rdf:resource='/f4/x4'/>" + +"\n<jp:f5 rdf:resource='/f5/x5'/>" + +"\n<jp:f6 rdf:resource='http://www.ibm.com/f6/x6'/>" + +"\n<jp:f7 rdf:resource='http://www.ibm.com/f7/x7'/>" + +"\n<jp:f8 rdf:resource='/f8/x8'/>" + +"\n<jp:f9 rdf:resource='/f9/x9'/>" + +"\n<jp:fa>http://www.ibm.com/fa/xa#MY_LABEL</jp:fa>" + +"\n<jp:fb>http://www.ibm.com/fb/xb?label=MY_LABEL&foo=bar</jp:fb>" + +"\n<jp:fc>http://www.ibm.com/fc/xc?foo=bar&label=MY_LABEL</jp:fc>" + +"\n<jp:fd>http://www.ibm.com/fd/xd?label2=MY_LABEL&foo=bar</jp:fd>" + +"\n<jp:fe>http://www.ibm.com/fe/xe?foo=bar&label2=MY_LABEL</jp:fe>" + ; + assertEquals(expected, r); + + s.setProperty(SERIALIZER_relativeUriBase, null); + + s.setProperty(SERIALIZER_absolutePathUriBase, "http://foo"); + r = stripAndSort(s.serialize(t)); + expected = "" + +"</rdf:Description>>" + +"\n<<rdf:Description rdf:about='f0/x0'>" + +"\n<jp:f1 rdf:resource='f1/x1'/>" + +"\n<jp:f2 rdf:resource='http://foo/f2/x2'/>" + +"\n<jp:f3 rdf:resource='http://www.ibm.com/f3/x3'/>" + +"\n<jp:f4 rdf:resource='f4/x4'/>" + +"\n<jp:f5 rdf:resource='http://foo/f5/x5'/>" + +"\n<jp:f6 rdf:resource='http://www.ibm.com/f6/x6'/>" + +"\n<jp:f7 rdf:resource='http://www.ibm.com/f7/x7'/>" + +"\n<jp:f8 rdf:resource='f8/x8'/>" + +"\n<jp:f9 rdf:resource='f9/x9'/>" + +"\n<jp:fa>http://www.ibm.com/fa/xa#MY_LABEL</jp:fa>" + +"\n<jp:fb>http://www.ibm.com/fb/xb?label=MY_LABEL&foo=bar</jp:fb>" + +"\n<jp:fc>http://www.ibm.com/fc/xc?foo=bar&label=MY_LABEL</jp:fc>" + +"\n<jp:fd>http://www.ibm.com/fd/xd?label2=MY_LABEL&foo=bar</jp:fd>" + +"\n<jp:fe>http://www.ibm.com/fe/xe?foo=bar&label2=MY_LABEL</jp:fe>" + ; + assertEquals(expected, r); + + s.setProperty(SERIALIZER_absolutePathUriBase, "http://foo/"); + r = stripAndSort(s.serialize(t)); + assertEquals(expected, r); + + s.setProperty(SERIALIZER_absolutePathUriBase, ""); // Same as null. + r = stripAndSort(s.serialize(t)); + expected = "" + +"</rdf:Description>>" + +"\n<<rdf:Description rdf:about='f0/x0'>" + +"\n<jp:f1 rdf:resource='f1/x1'/>" + +"\n<jp:f2 rdf:resource='/f2/x2'/>" + +"\n<jp:f3 rdf:resource='http://www.ibm.com/f3/x3'/>" + +"\n<jp:f4 rdf:resource='f4/x4'/>" + +"\n<jp:f5 rdf:resource='/f5/x5'/>" + +"\n<jp:f6 rdf:resource='http://www.ibm.com/f6/x6'/>" + +"\n<jp:f7 rdf:resource='http://www.ibm.com/f7/x7'/>" + +"\n<jp:f8 rdf:resource='f8/x8'/>" + +"\n<jp:f9 rdf:resource='f9/x9'/>" + +"\n<jp:fa>http://www.ibm.com/fa/xa#MY_LABEL</jp:fa>" + +"\n<jp:fb>http://www.ibm.com/fb/xb?label=MY_LABEL&foo=bar</jp:fb>" + +"\n<jp:fc>http://www.ibm.com/fc/xc?foo=bar&label=MY_LABEL</jp:fc>" + +"\n<jp:fd>http://www.ibm.com/fd/xd?label2=MY_LABEL&foo=bar</jp:fd>" + +"\n<jp:fe>http://www.ibm.com/fe/xe?foo=bar&label2=MY_LABEL</jp:fe>" + ; + assertEquals(expected, r); + } + + private String stripAndSort(String s) { + s = strip(s); + Set<String> set = new TreeSet<String>(); + for (String s2 : s.split("><")) + set.add('<' + s2 + '>'); + return StringUtils.join(set, "\n"); + } + + //==================================================================================================== + // Validate that you cannot update properties on locked serializer. + //==================================================================================================== + @Test + public void testLockedSerializer() throws Exception { + RdfSerializer s = getBasicSerializer().lock(); + try { + s.setProperty(XmlSerializerContext.XML_enableNamespaces, true); + fail("Locked exception not thrown"); + } catch (LockedException e) {} + try { + s.setProperty(SerializerContext.SERIALIZER_addClassAttrs, true); + fail("Locked exception not thrown"); + } catch (LockedException e) {} + try { + s.setProperty(BeanContext.BEAN_beanMapPutReturnsOldValue, true); + fail("Locked exception not thrown"); + } catch (LockedException e) {} + } + + //==================================================================================================== + // Recursion + //==================================================================================================== + @Test + public void testRecursion() throws Exception { + WriterSerializer s = new RdfSerializer.XmlAbbrev().setProperty(SERIALIZER_quoteChar, '\''); + + R1 r1 = new R1(); + R2 r2 = new R2(); + R3 r3 = new R3(); + r1.r2 = r2; + r2.r3 = r3; + r3.r1 = r1; + + // No recursion detection + try { + s.serialize(r1); + fail("Exception expected!"); + } catch (Exception e) { + String msg = e.getLocalizedMessage(); + assertTrue(msg.contains("It's recommended you use the SerializerContext.SERIALIZER_detectRecursions setting to help locate the loop.")); + } + + // Recursion detection, no ignore + s.setProperty(SERIALIZER_detectRecursions, true); + try { + s.serialize(r1); + fail("Exception expected!"); + } catch (Exception e) { + String msg = e.getLocalizedMessage(); + assertTrue(msg.contains("[0]root:org.apache.juneau.jena.CommonTest$R1")); + assertTrue(msg.contains("->[1]r2:org.apache.juneau.jena.CommonTest$R2")); + assertTrue(msg.contains("->[2]r3:org.apache.juneau.jena.CommonTest$R3")); + assertTrue(msg.contains("->[3]r1:org.apache.juneau.jena.CommonTest$R1")); + } + + s.setProperty(SERIALIZER_ignoreRecursions, true); + String r = s.serialize(r1).replace("\r", ""); + // Note...the order of the namespaces is not always the same depending on the JVM. + // The Jena libraries appear to use a hashmap for these. + assertTrue(r.contains( + "<rdf:Description>\n"+ + "<jp:name>foo</jp:name>\n"+ + "<jp:r2 rdf:parseType='Resource'>\n"+ + "<jp:name>bar</jp:name>\n"+ + "<jp:r3 rdf:parseType='Resource'>\n"+ + "<jp:name>baz</jp:name>\n"+ + "</jp:r3>\n"+ + "</jp:r2>\n"+ + "</rdf:Description>\n"+ + "</rdf:RDF>\n" + )); + assertTrue(r.contains("xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#")); + assertTrue(r.contains("xmlns:j='http://www.ibm.com/juneau/")); + assertTrue(r.contains("xmlns:jp='http://www.ibm.com/juneaubp/")); + } + + public static class R1 { + public String name = "foo"; + public R2 r2; + } + public static class R2 { + public String name = "bar"; + public R3 r3; + } + public static class R3 { + public String name = "baz"; + public R1 r1; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/jena/CommonXmlTest.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau/src/test/java/org/apache/juneau/jena/CommonXmlTest.java b/org.apache.juneau/src/test/java/org/apache/juneau/jena/CommonXmlTest.java new file mode 100755 index 0000000..447d803 --- /dev/null +++ b/org.apache.juneau/src/test/java/org/apache/juneau/jena/CommonXmlTest.java @@ -0,0 +1,95 @@ +/*************************************************************************************************************************** + * 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.jena; + +import static org.apache.juneau.TestUtils.*; +import static org.apache.juneau.jena.RdfCommonContext.*; +import static org.apache.juneau.serializer.SerializerContext.*; +import static org.junit.Assert.*; + +import java.net.*; + +import org.apache.juneau.annotation.*; +import org.junit.*; + +public class CommonXmlTest { + + private RdfSerializer getBasicSerializer() { + return new RdfSerializer() + .setProperty(SERIALIZER_quoteChar, '\'') + .setProperty(SERIALIZER_useIndentation, false) + .setProperty(RDF_rdfxml_allowBadUris, true) + .setProperty(RDF_rdfxml_showDoctypeDeclaration, false) + .setProperty(RDF_rdfxml_showXmlDeclaration, false); + } + + private String strip(String s) { + return s.replaceFirst("<rdf:RDF[^>]+>\\s*", "").replaceAll("</rdf:RDF>$", "").trim().replaceAll("[\\r\\n]", ""); + } + + //==================================================================================================== + // Bean.uri annotation + //==================================================================================================== + @Test + public void testBeanUriAnnotation() throws Exception { + RdfSerializer s = getBasicSerializer(); + RdfParser p = RdfParser.DEFAULT_XML; + A t1 = A.create(), t2; + String r; + + r = s.serialize(t1); + assertEquals("<rdf:Description rdf:about='http://foo'><jp:name>bar</jp:name></rdf:Description>", strip(r)); + t2 = p.parse(r, A.class); + assertEqualObjects(t1, t2); + } + + public static class A { + @BeanProperty(beanUri=true) public URL url; + public String name; + + public static A create() throws Exception { + A t = new A(); + t.url = new URL("http://foo"); + t.name = "bar"; + return t; + } + } + + //==================================================================================================== + // Bean.uri annotation, only uri property + //==================================================================================================== + @Test + public void testBeanUriAnnotationOnlyUriProperty() throws Exception { + RdfSerializer s = getBasicSerializer(); + RdfParser p = RdfParser.DEFAULT_XML; + B t1 = B.create(), t2; + String r; + + r = s.serialize(t1); + assertEquals("<rdf:Description rdf:about='http://foo'><jp:url2 rdf:resource='http://foo/2'/></rdf:Description>", strip(r)); + t2 = p.parse(r, B.class); + assertEqualObjects(t1, t2); + } + + public static class B { + @BeanProperty(beanUri=true) public URL url; + public URL url2; + + public static B create() throws Exception { + B t = new B(); + t.url = new URL("http://foo"); + t.url2 = new URL("http://foo/2"); + return t; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/jena/RdfParserTest.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau/src/test/java/org/apache/juneau/jena/RdfParserTest.java b/org.apache.juneau/src/test/java/org/apache/juneau/jena/RdfParserTest.java new file mode 100755 index 0000000..279228f --- /dev/null +++ b/org.apache.juneau/src/test/java/org/apache/juneau/jena/RdfParserTest.java @@ -0,0 +1,149 @@ +/*************************************************************************************************************************** + * 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.jena; + +import static org.apache.juneau.TestUtils.*; +import static org.apache.juneau.jena.RdfCommonContext.*; +import static org.apache.juneau.jena.RdfSerializerContext.*; +import static org.apache.juneau.serializer.SerializerContext.*; +import static org.junit.Assert.*; + +import java.net.URI; +import java.text.*; +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.annotation.*; +import org.apache.juneau.jena.annotation.*; +import org.apache.juneau.json.*; +import org.apache.juneau.transforms.*; +import org.junit.*; + +public class RdfParserTest { + + @Test + public void testParseIntoGenericPojos() throws Exception { + A a = new A().init(); + + // Create a new serializer with readable output. + RdfSerializer s = new RdfSerializer.XmlAbbrev() + .setProperty(RDF_rdfxml_tab, 3) + .setProperty(SERIALIZER_quoteChar, '\'') + .setProperty(RDF_addRootProperty, true); + + String expected = + "<rdf:RDF a='http://ns/' a1='http://ns2/' j='http://www.ibm.com/juneau/' jp='http://www.ibm.com/juneaubp/' rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>" + + "\n <rdf:Description about='http://test/a'>" + + "\n <a:f1>1</a:f1>" + + "\n <a:f2>f2</a:f2>" + + "\n <a:f4a rdf:resource='http://test/a'/>" + + "\n <a:f4b rdf:resource='http://test/external'/>" + + "\n <a:f5>1999-01-01T00:00:00Z</a:f5>" + + "\n <a:f6>" + + "\n <rdf:Seq>" + + "\n <rdf:li>" + + "\n <rdf:Description about='http://test/a/a1'>" + + "\n <a1:f1>1</a1:f1>" + + "\n <a1:f2>f2</a1:f2>" + + "\n <a1:f4a rdf:resource='http://test/a'/>" + + "\n <a1:f4b rdf:resource='http://test/external'/>" + + "\n <a1:f5>1999-01-01T00:00:00Z</a1:f5>" + + "\n </rdf:Description>" + + "\n </rdf:li>" + + "\n </rdf:Seq>" + + "\n </a:f6>" + + "\n <j:root>true</j:root>" + + "\n </rdf:Description>" + + "\n</rdf:RDF>"; + + String rdfXml = s.serialize(a); + assertXmlEquals(expected, rdfXml); + + A a2 = RdfParser.DEFAULT_XML.parse(rdfXml, A.class); + + assertEqualObjects(a, a2); + + ObjectMap m = RdfParser.DEFAULT_XML.parse(rdfXml, ObjectMap.class); + String json = JsonSerializer.DEFAULT_LAX_READABLE.serialize(m); + + String e = "" + + "{\n" + + " uri: 'http://test/a', \n" + + " f6: [\n" + + " {\n" + + " uri: 'http://test/a/a1', \n" + + " f5: '1999-01-01T00:00:00Z', \n" + + " f4b: 'http://test/external', \n" + + " f4a: 'http://test/a', \n" + + " f2: 'f2', \n" + + " f1: '1'\n" + + " }\n" + + " ], \n" + + " f5: '1999-01-01T00:00:00Z', \n" + + " f4b: 'http://test/external', \n" + + " f4a: 'http://test/a', \n" + + " f2: 'f2', \n" + + " f1: '1', \n" + + " root: 'true'\n" + + "}"; + assertEquals(e, json.replace("\r", "")); + + } + + @Rdf(prefix="a", namespace="http://ns/") + public static class A { + public int f1; + public String f2; + @BeanProperty(beanUri=true) public URI f3; + public URI f4a, f4b; + @BeanProperty(transform=CalendarTransform.ISO8601DTZ.class) public Calendar f5; + public LinkedList<A1> f6 = new LinkedList<A1>(); + + public A init() throws Exception { + f1 = 1; + f2 = "f2"; + f3 = new URI("http://test/a"); // Bean URI. + f4a = new URI("http://test/a"); // Points to itself. + f4b = new URI("http://test/external"); + f5 = new GregorianCalendar(); + DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); + df.setTimeZone(TimeZone.getTimeZone("GMT")); + f5.setTime(df.parse("Jan 1, 1999")); + f6 = new LinkedList<A1>(); + f6.add(new A1().init()); + return this; + } + } + + @Rdf(prefix="a1", namespace="http://ns2/") + public static class A1 { + public int f1; + public String f2; + @BeanProperty(beanUri=true) public URI f3; + public URI f4a, f4b; + @BeanProperty(transform=CalendarTransform.ISO8601DTZ.class) public Calendar f5; + + public A1 init() throws Exception { + f1 = 1; + f2 = "f2"; + f3 = new URI("http://test/a/a1"); + f4a = new URI("http://test/a"); + f4b = new URI("http://test/external"); + f5 = new GregorianCalendar(); + DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); + df.setTimeZone(TimeZone.getTimeZone("GMT")); + f5.setTime(df.parse("Jan 1, 1999")); + return this; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/jena/RdfTest.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau/src/test/java/org/apache/juneau/jena/RdfTest.java b/org.apache.juneau/src/test/java/org/apache/juneau/jena/RdfTest.java new file mode 100755 index 0000000..9b2a980 --- /dev/null +++ b/org.apache.juneau/src/test/java/org/apache/juneau/jena/RdfTest.java @@ -0,0 +1,597 @@ +/*************************************************************************************************************************** + * 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.jena; + +import static org.apache.juneau.TestUtils.*; +import static org.apache.juneau.jena.RdfCommonContext.*; +import static org.apache.juneau.jena.RdfSerializerContext.*; +import static org.apache.juneau.serializer.SerializerContext.*; + +import java.net.URI; +import java.util.*; + +import org.apache.juneau.annotation.*; +import org.apache.juneau.jena.annotation.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.serializer.*; +import org.junit.*; + +@SuppressWarnings("serial") +public class RdfTest { + + @Test + public void testCollectionFormatProperties() throws Exception { + A a = new A().init(), a2; + String rdfXml; + String expected; + + RdfSerializer s = new RdfSerializer.XmlAbbrev() + .setProperty(RDF_rdfxml_tab, 3) + .setProperty(SERIALIZER_quoteChar, '\'') + .setProperty(RDF_addRootProperty, true); + RdfParser p = RdfParser.DEFAULT_XML.clone(); + + //-------------------------------------------------------------------------------- + // Normal format - Sequence + //-------------------------------------------------------------------------------- + expected = + "<rdf:RDF a='http://ns/' j='http://www.ibm.com/juneau/' jp='http://www.ibm.com/juneaubp/' rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>" + + "\n <rdf:Description about='http://test/a'>" + + "\n <a:f2>" + + "\n <rdf:Seq>" + + "\n <rdf:li>f2a</rdf:li>" + + "\n <rdf:li>f2b</rdf:li>" + + "\n </rdf:Seq>" + + "\n </a:f2>" + + "\n <a:f3>" + + "\n <rdf:Seq>" + + "\n <rdf:li>1</rdf:li>" + + "\n <rdf:li>2</rdf:li>" + + "\n </rdf:Seq>" + + "\n </a:f3>" + + "\n <j:root>true</j:root>" + + "\n </rdf:Description>" + + "\n</rdf:RDF>"; + rdfXml = s.serialize(a); + assertXmlEquals(expected, rdfXml); + + a2 = p.parse(rdfXml, A.class); + assertEqualObjects(a, a2); + + //-------------------------------------------------------------------------------- + // Explicit sequence + //-------------------------------------------------------------------------------- + s.setProperty(RDF_collectionFormat, RdfCollectionFormat.SEQ); + expected = + "<rdf:RDF a='http://ns/' j='http://www.ibm.com/juneau/' jp='http://www.ibm.com/juneaubp/' rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>" + + "\n <rdf:Description about='http://test/a'>" + + "\n <a:f2>" + + "\n <rdf:Seq>" + + "\n <rdf:li>f2a</rdf:li>" + + "\n <rdf:li>f2b</rdf:li>" + + "\n </rdf:Seq>" + + "\n </a:f2>" + + "\n <a:f3>" + + "\n <rdf:Seq>" + + "\n <rdf:li>1</rdf:li>" + + "\n <rdf:li>2</rdf:li>" + + "\n </rdf:Seq>" + + "\n </a:f3>" + + "\n <j:root>true</j:root>" + + "\n </rdf:Description>" + + "\n</rdf:RDF>"; + rdfXml = s.serialize(a); + assertXmlEquals(expected, rdfXml); + + a2 = p.parse(rdfXml, A.class); + assertEqualObjects(a, a2); + + //-------------------------------------------------------------------------------- + // Bag + //-------------------------------------------------------------------------------- + s.setProperty(RDF_collectionFormat, RdfCollectionFormat.BAG); + expected = + "<rdf:RDF a='http://ns/' j='http://www.ibm.com/juneau/' jp='http://www.ibm.com/juneaubp/' rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>" + + "\n <rdf:Description about='http://test/a'>" + + "\n <a:f2>" + + "\n <rdf:Bag>" + + "\n <rdf:li>f2a</rdf:li>" + + "\n <rdf:li>f2b</rdf:li>" + + "\n </rdf:Bag>" + + "\n </a:f2>" + + "\n <a:f3>" + + "\n <rdf:Bag>" + + "\n <rdf:li>1</rdf:li>" + + "\n <rdf:li>2</rdf:li>" + + "\n </rdf:Bag>" + + "\n </a:f3>" + + "\n <j:root>true</j:root>" + + "\n </rdf:Description>" + + "\n</rdf:RDF>"; + rdfXml = s.serialize(a); + assertXmlEquals(expected, rdfXml); + + a2 = p.parse(rdfXml, A.class); + assertEqualObjects(a, a2); + + //-------------------------------------------------------------------------------- + // List + //-------------------------------------------------------------------------------- + s.setProperty(RDF_collectionFormat, RdfCollectionFormat.LIST); + expected = + "<rdf:RDF a='http://ns/' j='http://www.ibm.com/juneau/' jp='http://www.ibm.com/juneaubp/' rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>" + + "\n <rdf:Description about='http://test/a'>" + + "\n <a:f2 parseType='Resource'>" + + "\n <rdf:first>f2a</rdf:first>" + + "\n <rdf:rest parseType='Resource'>" + + "\n <rdf:first>f2b</rdf:first>" + + "\n <rdf:rest resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>" + + "\n </rdf:rest>" + + "\n </a:f2>" + + "\n <a:f3 parseType='Resource'>" + + "\n <rdf:first>1</rdf:first>" + + "\n <rdf:rest parseType='Resource'>" + + "\n <rdf:first>2</rdf:first>" + + "\n <rdf:rest resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>" + + "\n </rdf:rest>" + + "\n </a:f3>" + + "\n <j:root>true</j:root>" + + "\n </rdf:Description>" + + "\n</rdf:RDF>"; + rdfXml = s.serialize(a); + assertXmlEquals(expected, rdfXml); + + a2 = p.parse(rdfXml, A.class); + assertEqualObjects(a, a2); + + //-------------------------------------------------------------------------------- + // Multi-properties + //-------------------------------------------------------------------------------- + s.setProperty(RDF_collectionFormat, RdfCollectionFormat.MULTI_VALUED); + expected = + "<rdf:RDF a='http://ns/' j='http://www.ibm.com/juneau/' jp='http://www.ibm.com/juneaubp/' rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>" + + "\n <rdf:Description about='http://test/a'>" + + "\n <a:f2>f2a</a:f2>" + + "\n <a:f2>f2b</a:f2>" + + "\n <a:f3>1</a:f3>" + + "\n <a:f3>2</a:f3>" + + "\n <j:root>true</j:root>" + + "\n </rdf:Description>" + + "\n</rdf:RDF>"; + rdfXml = s.serialize(a); + assertXmlEquals(expected, rdfXml); + + // Note - Must specify collection format on parser for it to be able to understand this layout. + p.setProperty(RDF_collectionFormat, RdfCollectionFormat.MULTI_VALUED); + a2 = p.parse(rdfXml, A.class); + assertEqualObjects(a, a2); + } + + @Rdf(prefix="a", namespace="http://ns/") + public static class A { + @BeanProperty(beanUri=true) public URI f1; + public String[] f2; + public List<Integer> f3; + + public A init() throws Exception { + f1 = new URI("http://test/a"); + f2 = new String[]{"f2a","f2b"}; + f3 = Arrays.asList(new Integer[]{1,2}); + return this; + } + } + + @Test + public void testCollectionFormatAnnotations() throws Exception { + B b = new B().init(), b2; + String rdfXml, expected; + RdfSerializer s = new RdfSerializer.XmlAbbrev() + .setProperty(RDF_rdfxml_tab, 3) + .setProperty(SERIALIZER_quoteChar, '\'') + .setProperty(RDF_addRootProperty, true); + RdfParser p = RdfParser.DEFAULT_XML.clone(); + + //-------------------------------------------------------------------------------- + // Normal format - Sequence + //-------------------------------------------------------------------------------- + + expected = + "<rdf:RDF b='http://ns/' j='http://www.ibm.com/juneau/' jp='http://www.ibm.com/juneaubp/' rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>" + + "\n <rdf:Description about='http://test/b'>" + + "\n <b:f2>" + + "\n <rdf:Seq>" + + "\n <rdf:li>f2a</rdf:li>" + + "\n <rdf:li>f2b</rdf:li>" + + "\n </rdf:Seq>" + + "\n </b:f2>" + + "\n <b:f3>" + + "\n <rdf:Bag>" + + "\n <rdf:li>f3a</rdf:li>" + + "\n <rdf:li>f3b</rdf:li>" + + "\n </rdf:Bag>" + + "\n </b:f3>" + + "\n <b:f4 parseType='Resource'>" + + "\n <rdf:first>f4a</rdf:first>" + + "\n <rdf:rest parseType='Resource'>" + + "\n <rdf:first>f4b</rdf:first>" + + "\n <rdf:rest resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>" + + "\n </rdf:rest>" + + "\n </b:f4>" + + "\n <b:f5>f5a</b:f5>" + + "\n <b:f5>f5b</b:f5>" + + "\n <b:f6>" + + "\n <rdf:Seq>" + + "\n <rdf:li>f6a</rdf:li>" + + "\n <rdf:li>f6b</rdf:li>" + + "\n </rdf:Seq>" + + "\n </b:f6>" + + "\n <b:f7>" + + "\n <rdf:Seq>" + + "\n <rdf:li>f7a</rdf:li>" + + "\n <rdf:li>f7b</rdf:li>" + + "\n </rdf:Seq>" + + "\n </b:f7>" + + "\n <b:f8>" + + "\n <rdf:Bag>" + + "\n <rdf:li>f8a</rdf:li>" + + "\n <rdf:li>f8b</rdf:li>" + + "\n </rdf:Bag>" + + "\n </b:f8>" + + "\n <b:f9 parseType='Resource'>" + + "\n <rdf:first>f9a</rdf:first>" + + "\n <rdf:rest parseType='Resource'>" + + "\n <rdf:first>f9b</rdf:first>" + + "\n <rdf:rest resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>" + + "\n </rdf:rest>" + + "\n </b:f9>" + + "\n <b:fa>faa</b:fa>" + + "\n <b:fa>fab</b:fa>" + + "\n <b:fb>" + + "\n <rdf:Seq>" + + "\n <rdf:li>fba</rdf:li>" + + "\n <rdf:li>fbb</rdf:li>" + + "\n </rdf:Seq>" + + "\n </b:fb>" + + "\n <j:root>true</j:root>" + + "\n </rdf:Description>" + + "\n</rdf:RDF>"; + rdfXml = s.serialize(b); + assertXmlEquals(expected, rdfXml); + + b2 = p.parse(rdfXml, B.class); + assertEqualObjects(b, b2, true); + + //-------------------------------------------------------------------------------- + // Default is Bag - Should only affect DEFAULT properties. + //-------------------------------------------------------------------------------- + s.setProperty(RDF_collectionFormat, RdfCollectionFormat.BAG); + expected = + "<rdf:RDF b='http://ns/' j='http://www.ibm.com/juneau/' jp='http://www.ibm.com/juneaubp/' rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>" + + "\n <rdf:Description about='http://test/b'>" + + "\n <b:f2>" + + "\n <rdf:Seq>" + + "\n <rdf:li>f2a</rdf:li>" + + "\n <rdf:li>f2b</rdf:li>" + + "\n </rdf:Seq>" + + "\n </b:f2>" + + "\n <b:f3>" + + "\n <rdf:Bag>" + + "\n <rdf:li>f3a</rdf:li>" + + "\n <rdf:li>f3b</rdf:li>" + + "\n </rdf:Bag>" + + "\n </b:f3>" + + "\n <b:f4 parseType='Resource'>" + + "\n <rdf:first>f4a</rdf:first>" + + "\n <rdf:rest parseType='Resource'>" + + "\n <rdf:first>f4b</rdf:first>" + + "\n <rdf:rest resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>" + + "\n </rdf:rest>" + + "\n </b:f4>" + + "\n <b:f5>f5a</b:f5>" + + "\n <b:f5>f5b</b:f5>" + + "\n <b:f6>" + + "\n <rdf:Bag>" + + "\n <rdf:li>f6a</rdf:li>" + + "\n <rdf:li>f6b</rdf:li>" + + "\n </rdf:Bag>" + + "\n </b:f6>" + + "\n <b:f7>" + + "\n <rdf:Seq>" + + "\n <rdf:li>f7a</rdf:li>" + + "\n <rdf:li>f7b</rdf:li>" + + "\n </rdf:Seq>" + + "\n </b:f7>" + + "\n <b:f8>" + + "\n <rdf:Bag>" + + "\n <rdf:li>f8a</rdf:li>" + + "\n <rdf:li>f8b</rdf:li>" + + "\n </rdf:Bag>" + + "\n </b:f8>" + + "\n <b:f9 parseType='Resource'>" + + "\n <rdf:first>f9a</rdf:first>" + + "\n <rdf:rest parseType='Resource'>" + + "\n <rdf:first>f9b</rdf:first>" + + "\n <rdf:rest resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>" + + "\n </rdf:rest>" + + "\n </b:f9>" + + "\n <b:fa>faa</b:fa>" + + "\n <b:fa>fab</b:fa>" + + "\n <b:fb>" + + "\n <rdf:Bag>" + + "\n <rdf:li>fba</rdf:li>" + + "\n <rdf:li>fbb</rdf:li>" + + "\n </rdf:Bag>" + + "\n </b:fb>" + + "\n <j:root>true</j:root>" + + "\n </rdf:Description>" + + "\n</rdf:RDF>"; + + rdfXml = s.serialize(b); + assertXmlEquals(expected, rdfXml); + + b2 = p.parse(rdfXml, B.class); + assertEqualObjects(b, b2, true); + } + + @Rdf(prefix="b", namespace="http://ns/") + public static class B { + @BeanProperty(beanUri=true) public URI f1; + + @Rdf(collectionFormat=RdfCollectionFormat.SEQ) + public String[] f2; + + @Rdf(collectionFormat=RdfCollectionFormat.BAG) + public String[] f3; + + @Rdf(collectionFormat=RdfCollectionFormat.LIST) + public String[] f4; + + @Rdf(collectionFormat=RdfCollectionFormat.MULTI_VALUED) + public String[] f5; + + @Rdf(collectionFormat=RdfCollectionFormat.DEFAULT) + public String[] f6; + + public BA f7; + public BB f8; + public BC f9; + public BD fa; + public BE fb; + + public B init() throws Exception { + f1 = new URI("http://test/b"); + f2 = new String[]{"f2a","f2b"}; + f3 = new String[]{"f3a","f3b"}; + f4 = new String[]{"f4a","f4b"}; + f5 = new String[]{"f5a","f5b"}; + f6 = new String[]{"f6a","f6b"}; + f7 = new BA().append("f7a","f7b"); + f8 = new BB().append("f8a","f8b"); + f9 = new BC().append("f9a","f9b"); + fa = new BD().append("faa","fab"); + fb = new BE().append("fba","fbb"); + return this; + } + } + + @Rdf(prefix="ba", namespace="http://ns/", collectionFormat=RdfCollectionFormat.SEQ) + public static class BA extends ArrayList<String> { + public BA append(String...s) { + this.addAll(Arrays.asList(s)); + return this; + } + } + + @Rdf(prefix="bb", namespace="http://ns/", collectionFormat=RdfCollectionFormat.BAG) + public static class BB extends ArrayList<String> { + public BB append(String...s) { + this.addAll(Arrays.asList(s)); + return this; + } + } + + @Rdf(prefix="bc", namespace="http://ns/", collectionFormat=RdfCollectionFormat.LIST) + public static class BC extends ArrayList<String> { + public BC append(String...s) { + this.addAll(Arrays.asList(s)); + return this; + } + } + + @Rdf(prefix="bd", namespace="http://ns/", collectionFormat=RdfCollectionFormat.MULTI_VALUED) + public static class BD extends ArrayList<String> { + public BD append(String...s) { + this.addAll(Arrays.asList(s)); + return this; + } + } + + @Rdf(prefix="bd", namespace="http://ns/", collectionFormat=RdfCollectionFormat.DEFAULT) + public static class BE extends ArrayList<String> { + public BE append(String...s) { + this.addAll(Arrays.asList(s)); + return this; + } + } + + @Test + public void testCollectionFormatAnnotationOnClass() throws Exception { + C c = new C().init(), c2; + String rdfXml, expected; + RdfSerializer s = new RdfSerializer.XmlAbbrev() + .setProperty(RDF_rdfxml_tab, 3) + .setProperty(SERIALIZER_quoteChar, '\'') + .setProperty(RDF_addRootProperty, true); + RdfParser p = RdfParser.DEFAULT_XML.clone(); + + //-------------------------------------------------------------------------------- + // Default on class is Bag - Should only affect DEFAULT properties. + //-------------------------------------------------------------------------------- + s.setProperty(RDF_collectionFormat, RdfCollectionFormat.BAG); + expected = + "<rdf:RDF b='http://ns/' j='http://www.ibm.com/juneau/' jp='http://www.ibm.com/juneaubp/' rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>" + + "\n <rdf:Description about='http://test/b'>" + + "\n <b:f2>" + + "\n <rdf:Seq>" + + "\n <rdf:li>f2a</rdf:li>" + + "\n <rdf:li>f2b</rdf:li>" + + "\n </rdf:Seq>" + + "\n </b:f2>" + + "\n <b:f3>" + + "\n <rdf:Bag>" + + "\n <rdf:li>f3a</rdf:li>" + + "\n <rdf:li>f3b</rdf:li>" + + "\n </rdf:Bag>" + + "\n </b:f3>" + + "\n <b:f4 parseType='Resource'>" + + "\n <rdf:first>f4a</rdf:first>" + + "\n <rdf:rest parseType='Resource'>" + + "\n <rdf:first>f4b</rdf:first>" + + "\n <rdf:rest resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>" + + "\n </rdf:rest>" + + "\n </b:f4>" + + "\n <b:f5>f5a</b:f5>" + + "\n <b:f5>f5b</b:f5>" + + "\n <b:f6>" + + "\n <rdf:Bag>" + + "\n <rdf:li>f6a</rdf:li>" + + "\n <rdf:li>f6b</rdf:li>" + + "\n </rdf:Bag>" + + "\n </b:f6>" + + "\n <b:f7>" + + "\n <rdf:Seq>" + + "\n <rdf:li>f7a</rdf:li>" + + "\n <rdf:li>f7b</rdf:li>" + + "\n </rdf:Seq>" + + "\n </b:f7>" + + "\n <b:f8>" + + "\n <rdf:Bag>" + + "\n <rdf:li>f8a</rdf:li>" + + "\n <rdf:li>f8b</rdf:li>" + + "\n </rdf:Bag>" + + "\n </b:f8>" + + "\n <b:f9 parseType='Resource'>" + + "\n <rdf:first>f9a</rdf:first>" + + "\n <rdf:rest parseType='Resource'>" + + "\n <rdf:first>f9b</rdf:first>" + + "\n <rdf:rest resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>" + + "\n </rdf:rest>" + + "\n </b:f9>" + + "\n <b:fa>faa</b:fa>" + + "\n <b:fa>fab</b:fa>" + + "\n <b:fb>" + + "\n <rdf:Bag>" + + "\n <rdf:li>fba</rdf:li>" + + "\n <rdf:li>fbb</rdf:li>" + + "\n </rdf:Bag>" + + "\n </b:fb>" + + "\n <j:root>true</j:root>" + + "\n </rdf:Description>" + + "\n</rdf:RDF>"; + + rdfXml = s.serialize(c); + assertXmlEquals(expected, rdfXml); + + c2 = p.parse(rdfXml, C.class); + assertEqualObjects(c, c2, true); + } + + @Rdf(collectionFormat=RdfCollectionFormat.BAG) + public static class C extends B { + @Override /* B */ + public C init() throws Exception { + f1 = new URI("http://test/b"); + f2 = new String[]{"f2a","f2b"}; + f3 = new String[]{"f3a","f3b"}; + f4 = new String[]{"f4a","f4b"}; + f5 = new String[]{"f5a","f5b"}; + f6 = new String[]{"f6a","f6b"}; + f7 = new BA().append("f7a","f7b"); + f8 = new BB().append("f8a","f8b"); + f9 = new BC().append("f9a","f9b"); + fa = new BD().append("faa","fab"); + fb = new BE().append("fba","fbb"); + return this; + } + } + + @Test + @SuppressWarnings("unchecked") + public void testLooseCollectionsOfBeans() throws Exception { + WriterSerializer s = new RdfSerializer.XmlAbbrev().setProperty(RDF_looseCollection, true); + ReaderParser p = new RdfParser.Xml().setProperty(RDF_looseCollection, true); + String rdfXml, expected; + + List<D> l = new LinkedList<D>(); + l.add(new D().init(1)); + l.add(new D().init(2)); + + rdfXml = s.serialize(l); + expected = + "<rdf:RDF j='http://www.ibm.com/juneau/' jp='http://www.ibm.com/juneaubp/' rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>" + + "\n <rdf:Description about='http://localhost/f1/2'>" + + "\n <jp:f2>f2</jp:f2>" + + "\n <jp:f3 resource='http://localhost/f3/2'/>" + + "\n </rdf:Description>" + + "\n <rdf:Description about='http://localhost/f1/1'>" + + "\n <jp:f2>f2</jp:f2>" + + "\n <jp:f3 resource='http://localhost/f3/1'/>" + + "\n </rdf:Description>" + + "\n</rdf:RDF>"; + assertXmlEquals(expected, rdfXml); + + l = p.parseCollection(rdfXml, LinkedList.class, D.class); + D[] da = l.toArray(new D[l.size()]); + rdfXml = s.serialize(da); + expected = + "<rdf:RDF j='http://www.ibm.com/juneau/' jp='http://www.ibm.com/juneaubp/' rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>" + + "\n <rdf:Description about='http://localhost/f1/2'>" + + "\n <jp:f2>f2</jp:f2>" + + "\n <jp:f3 resource='http://localhost/f3/2'/>" + + "\n </rdf:Description>" + + "\n <rdf:Description about='http://localhost/f1/1'>" + + "\n <jp:f2>f2</jp:f2>" + + "\n <jp:f3 resource='http://localhost/f3/1'/>" + + "\n </rdf:Description>" + + "\n</rdf:RDF>"; + assertXmlEquals(expected, rdfXml); + + da = p.parse(rdfXml, D[].class); + rdfXml = s.serialize(da); + expected = + "<rdf:RDF j='http://www.ibm.com/juneau/' jp='http://www.ibm.com/juneaubp/' rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>" + + "\n <rdf:Description about='http://localhost/f1/2'>" + + "\n <jp:f2>f2</jp:f2>" + + "\n <jp:f3 resource='http://localhost/f3/2'/>" + + "\n </rdf:Description>" + + "\n <rdf:Description about='http://localhost/f1/1'>" + + "\n <jp:f2>f2</jp:f2>" + + "\n <jp:f3 resource='http://localhost/f3/1'/>" + + "\n </rdf:Description>" + + "\n</rdf:RDF>"; + assertXmlEquals(expected, rdfXml); + } + + public static class D { + @BeanProperty(beanUri=true) public URI f1; + public String f2; + public URI f3; + + public D init(int num) throws Exception { + f1 = new URI("http://localhost/f1/" + num); + f2 = "f2"; + f3 = new URI("http://localhost/f3/" + num); + return this; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/df0f8689/org.apache.juneau/src/test/java/org/apache/juneau/json/CT_Common.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau/src/test/java/org/apache/juneau/json/CT_Common.java b/org.apache.juneau/src/test/java/org/apache/juneau/json/CT_Common.java deleted file mode 100755 index 57281e8..0000000 --- a/org.apache.juneau/src/test/java/org/apache/juneau/json/CT_Common.java +++ /dev/null @@ -1,501 +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.json; - -import static org.apache.juneau.BeanContext.*; -import static org.apache.juneau.TestUtils.*; -import static org.apache.juneau.serializer.SerializerContext.*; -import static org.junit.Assert.*; - -import java.net.*; -import java.net.URI; -import java.util.*; - -import org.apache.juneau.*; -import org.apache.juneau.annotation.*; -import org.apache.juneau.serializer.*; -import org.apache.juneau.testbeans.*; -import org.junit.*; - -@SuppressWarnings({"serial"}) -public class CT_Common { - - //==================================================================================================== - // Trim nulls from beans - //==================================================================================================== - @Test - public void testTrimNullsFromBeans() throws Exception { - JsonSerializer s = new JsonSerializer.Simple(); - JsonParser p = JsonParser.DEFAULT; - A t1 = A.create(), t2; - - s.setProperty(SERIALIZER_trimNullProperties, false); - String r = s.serialize(t1); - assertEquals("{s1:null,s2:'s2'}", r); - t2 = p.parse(r, A.class); - assertEqualObjects(t1, t2); - - s.setProperty(SERIALIZER_trimNullProperties, true); - r = s.serialize(t1); - assertEquals("{s2:'s2'}", r); - t2 = p.parse(r, A.class); - assertEqualObjects(t1, t2); - } - - public static class A { - public String s1, s2; - - public static A create() { - A t = new A(); - t.s2 = "s2"; - return t; - } - } - - //==================================================================================================== - // Trim empty maps - //==================================================================================================== - @Test - public void testTrimEmptyMaps() throws Exception { - JsonSerializer s = new JsonSerializer.Simple(); - JsonParser p = JsonParser.DEFAULT; - B t1 = B.create(), t2; - String r; - - s.setProperty(SERIALIZER_trimEmptyMaps, false); - r = s.serialize(t1); - assertEquals("{f1:{},f2:{f2a:null,f2b:{s2:'s2'}}}", r); - t2 = p.parse(r, B.class); - assertEqualObjects(t1, t2); - - s.setProperty(SERIALIZER_trimEmptyMaps, true); - r = s.serialize(t1); - assertEquals("{f2:{f2a:null,f2b:{s2:'s2'}}}", r); - t2 = p.parse(r, B.class); - assertNull(t2.f1); - } - - public static class B { - public TreeMap<String,A> f1, f2; - - public static B create() { - B t = new B(); - t.f1 = new TreeMap<String,A>(); - t.f2 = new TreeMap<String,A>(){{put("f2a",null);put("f2b",A.create());}}; - return t; - } - } - - //==================================================================================================== - // Trim empty lists - //==================================================================================================== - @Test - public void testTrimEmptyLists() throws Exception { - JsonSerializer s = new JsonSerializer.Simple(); - JsonParser p = JsonParser.DEFAULT; - C t1 = C.create(), t2; - String r; - - s.setProperty(SERIALIZER_trimEmptyLists, false); - r = s.serialize(t1); - assertEquals("{f1:[],f2:[null,{s2:'s2'}]}", r); - t2 = p.parse(r, C.class); - assertEqualObjects(t1, t2); - - s.setProperty(SERIALIZER_trimEmptyLists, true); - r = s.serialize(t1); - assertEquals("{f2:[null,{s2:'s2'}]}", r); - t2 = p.parse(r, C.class); - assertNull(t2.f1); - } - - public static class C { - public List<A> f1, f2; - - public static C create() { - C t = new C(); - t.f1 = new LinkedList<A>(); - t.f2 = new LinkedList<A>(){{add(null);add(A.create());}}; - return t; - } - } - - //==================================================================================================== - // Trim empty arrays - //==================================================================================================== - @Test - public void testTrimEmptyArrays() throws Exception { - JsonSerializer s = new JsonSerializer.Simple(); - JsonParser p = JsonParser.DEFAULT; - D t1 = D.create(), t2; - String r; - - s.setProperty(SERIALIZER_trimEmptyLists, false); - r = s.serialize(t1); - assertEquals("{f1:[],f2:[null,{s2:'s2'}]}", r); - t2 = p.parse(r, D.class); - assertEqualObjects(t1, t2); - - s.setProperty(SERIALIZER_trimEmptyLists, true); - r = s.serialize(t1); - assertEquals("{f2:[null,{s2:'s2'}]}", r); - t2 = p.parse(r, D.class); - assertNull(t2.f1); - } - - public static class D { - public A[] f1, f2; - - public static D create() { - D t = new D(); - t.f1 = new A[]{}; - t.f2 = new A[]{null, A.create()}; - return t; - } - } - - //==================================================================================================== - // @BeanProperty.properties annotation. - //==================================================================================================== - @Test - public void testBeanPropertyProperies() throws Exception { - JsonSerializer s = JsonSerializer.DEFAULT_LAX; - E1 t = new E1(); - String r; - - r = s.serialize(t); - assertEquals("{x1:{f1:1},x2:{f1:1},x3:[{f1:1}],x4:[{f1:1}],x5:[{f1:1}],x6:[{f1:1}]}", r); - r = s.getSchemaSerializer().serialize(t); - assertTrue(r.indexOf("f2") == -1); - } - - public static class E1 { - @BeanProperty(properties={"f1"}) public E2 x1 = new E2(); - @BeanProperty(properties={"f1"}) public Map<String,Integer> x2 = new LinkedHashMap<String,Integer>() {{ - put("f1",1); put("f2",2); - }}; - @BeanProperty(properties={"f1"}) public E2[] x3 = {new E2()}; - @BeanProperty(properties={"f1"}) public List<E2> x4 = new LinkedList<E2>() {{ - add(new E2()); - }}; - @BeanProperty(properties={"f1"}) public ObjectMap[] x5 = {new ObjectMap().append("f1",1).append("f2",2)}; - @BeanProperty(properties={"f1"}) public List<ObjectMap> x6 = new LinkedList<ObjectMap>() {{ - add(new ObjectMap().append("f1",1).append("f2",2)); - }}; - } - - public static class E2 { - public int f1 = 1; - public int f2 = 2; - } - - //==================================================================================================== - // @BeanProperty.properties annotation on list of beans. - //==================================================================================================== - @Test - public void testBeanPropertyProperiesOnListOfBeans() throws Exception { - JsonSerializer s = JsonSerializer.DEFAULT_LAX; - List<F> l = new LinkedList<F>(); - F t = new F(); - t.x1.add(new F()); - l.add(t); - String json = s.serialize(l); - assertEquals("[{x1:[{x2:2}],x2:2}]", json); - } - - public static class F { - @BeanProperty(properties={"x2"}) public List<F> x1 = new LinkedList<F>(); - public int x2 = 2; - } - - //==================================================================================================== - // Test that URLs and URIs are serialized and parsed correctly. - //==================================================================================================== - @Test - public void testURIAttr() throws Exception { - JsonSerializer s = JsonSerializer.DEFAULT_LAX; - JsonParser p = JsonParser.DEFAULT; - - G t = new G(); - t.uri = new URI("http://uri"); - t.f1 = new URI("http://f1"); - t.f2 = new URL("http://f2"); - - String json = s.serialize(t); - t = p.parse(json, G.class); - assertEquals("http://uri", t.uri.toString()); - assertEquals("http://f1", t.f1.toString()); - assertEquals("http://f2", t.f2.toString()); - } - - public static class G { - @BeanProperty(beanUri=true) public URI uri; - public URI f1; - public URL f2; - } - - //==================================================================================================== - // Test URIs with URI_CONTEXT and URI_AUTHORITY - //==================================================================================================== - @Test - public void testUris() throws Exception { - WriterSerializer s = new JsonSerializer.Simple(); - TestURI t = new TestURI(); - String r; - String expected = ""; - - s.setProperty(SERIALIZER_relativeUriBase, null); - r = s.serialize(t); - expected = "{" - +"f0:'f0/x0'," - +"f1:'f1/x1'," - +"f2:'/f2/x2'," - +"f3:'http://www.ibm.com/f3/x3'," - +"f4:'f4/x4'," - +"f5:'/f5/x5'," - +"f6:'http://www.ibm.com/f6/x6'," - +"f7:'http://www.ibm.com/f7/x7'," - +"f8:'f8/x8'," - +"f9:'f9/x9'," - +"fa:'http://www.ibm.com/fa/xa#MY_LABEL'," - +"fb:'http://www.ibm.com/fb/xb?label=MY_LABEL&foo=bar'," - +"fc:'http://www.ibm.com/fc/xc?foo=bar&label=MY_LABEL'," - +"fd:'http://www.ibm.com/fd/xd?label2=MY_LABEL&foo=bar'," - +"fe:'http://www.ibm.com/fe/xe?foo=bar&label2=MY_LABEL'" - +"}"; - assertEquals(expected, r); - - s.setProperty(SERIALIZER_relativeUriBase, ""); // Same as null. - r = s.serialize(t); - assertEquals(expected, r); - - s.setProperty(SERIALIZER_relativeUriBase, "/cr"); - r = s.serialize(t); - expected = "{" - +"f0:'/cr/f0/x0'," - +"f1:'/cr/f1/x1'," - +"f2:'/f2/x2'," - +"f3:'http://www.ibm.com/f3/x3'," - +"f4:'/cr/f4/x4'," - +"f5:'/f5/x5'," - +"f6:'http://www.ibm.com/f6/x6'," - +"f7:'http://www.ibm.com/f7/x7'," - +"f8:'/cr/f8/x8'," - +"f9:'/cr/f9/x9'," - +"fa:'http://www.ibm.com/fa/xa#MY_LABEL'," - +"fb:'http://www.ibm.com/fb/xb?label=MY_LABEL&foo=bar'," - +"fc:'http://www.ibm.com/fc/xc?foo=bar&label=MY_LABEL'," - +"fd:'http://www.ibm.com/fd/xd?label2=MY_LABEL&foo=bar'," - +"fe:'http://www.ibm.com/fe/xe?foo=bar&label2=MY_LABEL'" - +"}"; - assertEquals(expected, r); - - s.setProperty(SERIALIZER_relativeUriBase, "/cr/"); // Same as above - r = s.serialize(t); - assertEquals(expected, r); - - s.setProperty(SERIALIZER_relativeUriBase, "/"); - r = s.serialize(t); - expected = "{" - +"f0:'/f0/x0'," - +"f1:'/f1/x1'," - +"f2:'/f2/x2'," - +"f3:'http://www.ibm.com/f3/x3'," - +"f4:'/f4/x4'," - +"f5:'/f5/x5'," - +"f6:'http://www.ibm.com/f6/x6'," - +"f7:'http://www.ibm.com/f7/x7'," - +"f8:'/f8/x8'," - +"f9:'/f9/x9'," - +"fa:'http://www.ibm.com/fa/xa#MY_LABEL'," - +"fb:'http://www.ibm.com/fb/xb?label=MY_LABEL&foo=bar'," - +"fc:'http://www.ibm.com/fc/xc?foo=bar&label=MY_LABEL'," - +"fd:'http://www.ibm.com/fd/xd?label2=MY_LABEL&foo=bar'," - +"fe:'http://www.ibm.com/fe/xe?foo=bar&label2=MY_LABEL'" - +"}"; - assertEquals(expected, r); - - s.setProperty(SERIALIZER_relativeUriBase, null); - - s.setProperty(SERIALIZER_absolutePathUriBase, "http://foo"); - r = s.serialize(t); - expected = "{" - +"f0:'f0/x0'," - +"f1:'f1/x1'," - +"f2:'http://foo/f2/x2'," - +"f3:'http://www.ibm.com/f3/x3'," - +"f4:'f4/x4'," - +"f5:'http://foo/f5/x5'," - +"f6:'http://www.ibm.com/f6/x6'," - +"f7:'http://www.ibm.com/f7/x7'," - +"f8:'f8/x8'," - +"f9:'f9/x9'," - +"fa:'http://www.ibm.com/fa/xa#MY_LABEL'," - +"fb:'http://www.ibm.com/fb/xb?label=MY_LABEL&foo=bar'," - +"fc:'http://www.ibm.com/fc/xc?foo=bar&label=MY_LABEL'," - +"fd:'http://www.ibm.com/fd/xd?label2=MY_LABEL&foo=bar'," - +"fe:'http://www.ibm.com/fe/xe?foo=bar&label2=MY_LABEL'" - +"}"; - assertEquals(expected, r); - - s.setProperty(SERIALIZER_absolutePathUriBase, "http://foo/"); - r = s.serialize(t); - assertEquals(expected, r); - - s.setProperty(SERIALIZER_absolutePathUriBase, ""); // Same as null. - r = s.serialize(t); - expected = "{" - +"f0:'f0/x0'," - +"f1:'f1/x1'," - +"f2:'/f2/x2'," - +"f3:'http://www.ibm.com/f3/x3'," - +"f4:'f4/x4'," - +"f5:'/f5/x5'," - +"f6:'http://www.ibm.com/f6/x6'," - +"f7:'http://www.ibm.com/f7/x7'," - +"f8:'f8/x8'," - +"f9:'f9/x9'," - +"fa:'http://www.ibm.com/fa/xa#MY_LABEL'," - +"fb:'http://www.ibm.com/fb/xb?label=MY_LABEL&foo=bar'," - +"fc:'http://www.ibm.com/fc/xc?foo=bar&label=MY_LABEL'," - +"fd:'http://www.ibm.com/fd/xd?label2=MY_LABEL&foo=bar'," - +"fe:'http://www.ibm.com/fe/xe?foo=bar&label2=MY_LABEL'" - +"}"; - assertEquals(expected, r); - } - - //==================================================================================================== - // Validate that you cannot update properties on locked serializer. - //==================================================================================================== - @Test - public void testLockedSerializer() throws Exception { - JsonSerializer s = new JsonSerializer().lock(); - try { - s.setProperty(JsonSerializerContext.JSON_simpleMode, true); - fail("Locked exception not thrown"); - } catch (LockedException e) {} - try { - s.setProperty(SerializerContext.SERIALIZER_addClassAttrs, true); - fail("Locked exception not thrown"); - } catch (LockedException e) {} - try { - s.setProperty(BeanContext.BEAN_beanMapPutReturnsOldValue, true); - fail("Locked exception not thrown"); - } catch (LockedException e) {} - } - - //==================================================================================================== - // Recursion - //==================================================================================================== - @Test - public void testRecursion() throws Exception { - JsonSerializer s = new JsonSerializer.Simple(); - - R1 r1 = new R1(); - R2 r2 = new R2(); - R3 r3 = new R3(); - r1.r2 = r2; - r2.r3 = r3; - r3.r1 = r1; - - // No recursion detection - try { - s.serialize(r1); - fail("Exception expected!"); - } catch (Exception e) { - String msg = e.getLocalizedMessage(); - assertTrue(msg.contains("It's recommended you use the SerializerContext.SERIALIZER_detectRecursions setting to help locate the loop.")); - } - - // Recursion detection, no ignore - s.setProperty(SERIALIZER_detectRecursions, true); - try { - s.serialize(r1); - fail("Exception expected!"); - } catch (Exception e) { - String msg = e.getLocalizedMessage(); - assertTrue(msg.contains("[0]root:org.apache.juneau.json.CT_Common$R1")); - assertTrue(msg.contains("->[1]r2:org.apache.juneau.json.CT_Common$R2")); - assertTrue(msg.contains("->[2]r3:org.apache.juneau.json.CT_Common$R3")); - assertTrue(msg.contains("->[3]r1:org.apache.juneau.json.CT_Common$R1")); - } - - s.setProperty(SERIALIZER_ignoreRecursions, true); - assertEquals("{name:'foo',r2:{name:'bar',r3:{name:'baz'}}}", s.serialize(r1)); - - // Make sure this doesn't blow up. - s.getSchemaSerializer().serialize(r1); - } - - public static class R1 { - public String name = "foo"; - public R2 r2; - } - public static class R2 { - public String name = "bar"; - public R3 r3; - } - public static class R3 { - public String name = "baz"; - public R1 r1; - } - - //==================================================================================================== - // Basic bean - //==================================================================================================== - @Test - public void testBasicBean() throws Exception { - JsonSerializer s = new JsonSerializer.Simple().setProperty(SERIALIZER_trimNullProperties, false).setProperty(BEAN_sortProperties, true); - - J a = new J(); - a.setF1("J"); - a.setF2(100); - a.setF3(true); - assertEquals("C1", "{f1:'J',f2:100,f3:true}", s.serialize(a)); - } - - public static class J { - private String f1 = null; - private int f2 = -1; - private boolean f3 = false; - - public String getF1() { - return this.f1; - } - - public void setF1(String f1) { - this.f1 = f1; - } - - public int getF2() { - return this.f2; - } - - public void setF2(int f2) { - this.f2 = f2; - } - - public boolean isF3() { - return this.f3; - } - - public void setF3(boolean f3) { - this.f3 = f3; - } - - @Override /* Object */ - public String toString() { - return ("J(f1: " + this.getF1() + ", f2: " + this.getF2() + ")"); - } - } -}
