From e510a210909ac1350dfe810ef88bf816246ae787 Mon Sep 17 00:00:00 2001 From: niccoutu Date: Mon, 14 Oct 2013 13:54:33 +0200 Subject: [PATCH 1/4] fix for the @Extension problem from ABDERA-351 --- .../abdera/ext/serializer/BaseSerializer.java | 18 ++- .../test/ext/serializer/SerializerTest.java | 103 ++++++++++++++++++ 2 files changed, 111 insertions(+), 10 deletions(-) diff --git a/extensions/serializer/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java b/extensions/serializer/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java index 22503035..58a47bb6 100644 --- a/extensions/serializer/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java +++ b/extensions/serializer/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java @@ -93,16 +93,14 @@ protected void writeExtensions(Object source, Extension extension = valueContext.getAnnotation(Extension.class); boolean simple = extension != null ? extension.simple() : false; Serializer ser = context.getSerializer(valueContext); - if (ser == null) { - if (simple) { + if (simple || ser == null) { + QName qname = getQName(accessor); + ser = new SimpleElementSerializer(qname); + } else { + ser = context.getSerializer(valueContext); + if (ser == null) { QName qname = getQName(accessor); - ser = new SimpleElementSerializer(qname); - } else { - ser = context.getSerializer(valueContext); - if (ser == null) { - QName qname = getQName(accessor); - ser = new ExtensionSerializer(qname); - } + ser = new ExtensionSerializer(qname); } } ser.serialize(value, valueContext, context); @@ -249,7 +247,7 @@ protected static QName getQName(AccessibleObject accessor) { protected static QName getQName(Extension extension) { QName qname = null; if (extension != null) { - if (isUndefined(extension.prefix()) && isUndefined(extension.ns()) && isUndefined(extension.name())) { + if (!isUndefined(extension.prefix()) && !isUndefined(extension.ns()) && !isUndefined(extension.name())) { qname = new QName(extension.ns(), extension.name(), extension.prefix()); } else if (isUndefined(extension.prefix()) && !isUndefined(extension.ns()) && !isUndefined(extension.name())) { diff --git a/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/SerializerTest.java b/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/SerializerTest.java index 26e36315..21c0be51 100644 --- a/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/SerializerTest.java +++ b/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/SerializerTest.java @@ -18,15 +18,19 @@ package org.apache.abdera.test.ext.serializer; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Calendar; import java.util.Date; +import javax.xml.namespace.QName; + import org.apache.abdera.Abdera; import org.apache.abdera.ext.serializer.ConventionSerializationContext; import org.apache.abdera.ext.serializer.annotation.Author; +import org.apache.abdera.ext.serializer.annotation.Extension; import org.apache.abdera.ext.serializer.annotation.ID; import org.apache.abdera.ext.serializer.annotation.Link; import org.apache.abdera.ext.serializer.annotation.Published; @@ -36,6 +40,7 @@ import org.apache.abdera.ext.serializer.impl.EntrySerializer; import org.apache.abdera.model.Document; import org.apache.abdera.model.Entry; +import org.apache.abdera.model.ExtensibleElement; import org.apache.abdera.writer.StreamWriter; import org.junit.Test; @@ -119,6 +124,69 @@ public void testAnnotated() throws Exception { assertEquals("James", entry.getAuthor().getName()); assertEquals("this is the summary", entry.getSummary()); assertEquals("http://example.org/foo", entry.getAlternateLink().getResolvedHref().toString()); + + final ExtensibleElement simpleExtension = entry.getExtension(SimpleExtensionQName.INSTANCE); + assertNotNull(simpleExtension); + assertEquals("baz", simpleExtension.getText()); + + final ExtensibleElement complexExtension = entry.getExtension(ComplexExtensionQName.INSTANCE); + assertNotNull(complexExtension); + final ExtensibleElement nestedSimpleExtension = complexExtension.getExtension(SimpleExtensionQName.INSTANCE); + assertNotNull(nestedSimpleExtension); + assertEquals("baz", nestedSimpleExtension.getText()); + + final ExtensibleElement moreComplexExtension = entry.getExtension(MoreComplexExtensionQName.INSTANCE); + assertNotNull(moreComplexExtension); + final ExtensibleElement nestedComplexExtension = moreComplexExtension.getExtension(ComplexExtensionQName.INSTANCE); + assertNotNull(nestedComplexExtension); + final ExtensibleElement deepNestedSimpleExtension = nestedComplexExtension.getExtension(SimpleExtensionQName.INSTANCE); + assertNotNull(deepNestedSimpleExtension); + assertEquals("baz", deepNestedSimpleExtension.getText()); + } + + private static final class SimpleExtensionQName extends QName { + + public static final String NS = "http://example.org/simple"; + + public static final String NAME = "foo"; + + public static final String PREFIX = "simple"; + + public static final QName INSTANCE = new SimpleExtensionQName(); + + private SimpleExtensionQName() { + super(NS, NAME, PREFIX); + } + } + + private static final class ComplexExtensionQName extends QName { + + public static final String NS = "http://example.org/complex"; + + public static final String NAME = "foo"; + + public static final String PREFIX = "complex"; + + public static final QName INSTANCE = new ComplexExtensionQName(); + + private ComplexExtensionQName() { + super(NS, NAME, PREFIX); + } + } + + private static final class MoreComplexExtensionQName extends QName { + + public static final String NS = "http://example.org/morecomplex"; + + public static final String NAME = "foo"; + + public static final String PREFIX = "morecomplex"; + + public static final QName INSTANCE = new MoreComplexExtensionQName(); + + private MoreComplexExtensionQName() { + super(NS, NAME, PREFIX); + } } @org.apache.abdera.ext.serializer.annotation.Entry @@ -153,5 +221,40 @@ public String getText() { public String getUri() { return "http://example.org/foo"; } + + @Extension(ns = SimpleExtensionQName.NS, name = SimpleExtensionQName.NAME, prefix = SimpleExtensionQName.PREFIX, simple = true) + public String getSimpleExtension() { + return "baz"; + } + + @Extension(ns = ComplexExtensionQName.NS, name = ComplexExtensionQName.NAME, prefix = ComplexExtensionQName.PREFIX) + public ComplexExtension getComplexExtension() { + return new ComplexExtension(); + } + + @Extension(ns = MoreComplexExtensionQName.NS, name = MoreComplexExtensionQName.NAME, prefix = MoreComplexExtensionQName.PREFIX) + public MoreComplexExtension getMoreComplexExtension() { + return new MoreComplexExtension(); + } + } + + public static class ComplexExtension { + + @Extension(ns = SimpleExtensionQName.NS, name = SimpleExtensionQName.NAME, prefix = SimpleExtensionQName.PREFIX, simple = true) + public String getSimpleExtension() { + return "baz"; + } + + } + + public static class MoreComplexExtension { + + @Extension(ns = ComplexExtensionQName.NS, name = ComplexExtensionQName.NAME, prefix = ComplexExtensionQName.PREFIX) + public ComplexExtension getComplexExtension() { + return new ComplexExtension(); + } + + } + } From e3a9170f052624c18dc9c2d4f0b541dcd732d787 Mon Sep 17 00:00:00 2001 From: niccoutu Date: Wed, 16 Oct 2013 12:08:03 +0200 Subject: [PATCH 2/4] cleaner extension serializer instantiation flow for ABDERA-351 --- .../abdera/ext/serializer/BaseSerializer.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/extensions/serializer/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java b/extensions/serializer/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java index 58a47bb6..b6bf198e 100644 --- a/extensions/serializer/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java +++ b/extensions/serializer/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java @@ -92,16 +92,16 @@ protected void writeExtensions(Object source, ObjectContext valueContext = new ObjectContext(value, source, accessor); Extension extension = valueContext.getAnnotation(Extension.class); boolean simple = extension != null ? extension.simple() : false; - Serializer ser = context.getSerializer(valueContext); - if (simple || ser == null) { - QName qname = getQName(accessor); + Serializer ser; + if (simple) { + final QName qname = getQName(accessor); ser = new SimpleElementSerializer(qname); } else { ser = context.getSerializer(valueContext); - if (ser == null) { - QName qname = getQName(accessor); - ser = new ExtensionSerializer(qname); - } + } + if (ser == null) { + final QName qname = getQName(accessor); + ser = new ExtensionSerializer(qname); } ser.serialize(value, valueContext, context); } From 6117d1c24262c189aad9a2bffb02bd3e6131d519 Mon Sep 17 00:00:00 2001 From: niccoutu Date: Wed, 16 Oct 2013 12:49:00 +0200 Subject: [PATCH 3/4] ABDERA-351 move @Extension annotation tests in its own test class --- .../test/ext/serializer/AbderaTestHelper.java | 18 ++ .../serializer/ExtensionAnnotationTest.java | 198 ++++++++++++++++++ .../test/ext/serializer/SerializerTest.java | 103 --------- .../abdera/test/ext/serializer/TestSuite.java | 1 + 4 files changed, 217 insertions(+), 103 deletions(-) create mode 100644 extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/AbderaTestHelper.java create mode 100644 extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/ExtensionAnnotationTest.java diff --git a/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/AbderaTestHelper.java b/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/AbderaTestHelper.java new file mode 100644 index 00000000..6ca67ab3 --- /dev/null +++ b/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/AbderaTestHelper.java @@ -0,0 +1,18 @@ +package org.apache.abdera.test.ext.serializer; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +import org.apache.abdera.Abdera; +import org.apache.abdera.model.Document; +import org.apache.abdera.model.Element; + +public final class AbderaTestHelper { + + public static final T deserialize(final ByteArrayOutputStream serialized) { + final ByteArrayInputStream in = new ByteArrayInputStream(serialized.toByteArray()); + final Document doc = Abdera.getInstance().getParser().parse(in); + return doc.getRoot(); + } + +} diff --git a/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/ExtensionAnnotationTest.java b/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/ExtensionAnnotationTest.java new file mode 100644 index 00000000..0d9dd040 --- /dev/null +++ b/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/ExtensionAnnotationTest.java @@ -0,0 +1,198 @@ +package org.apache.abdera.test.ext.serializer; + +import java.io.ByteArrayOutputStream; +import javax.xml.namespace.QName; + +import org.apache.abdera.Abdera; +import org.apache.abdera.ext.serializer.ConventionSerializationContext; +import org.apache.abdera.ext.serializer.annotation.Entry; +import org.apache.abdera.ext.serializer.annotation.Extension; +import org.apache.abdera.model.Element; +import org.apache.abdera.model.ExtensibleElement; +import org.apache.abdera.writer.StreamWriter; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public final class ExtensionAnnotationTest { + + private static final String PREFIX = "foo"; + + private static final String NS = "http://example.org/foo"; + + private static final String EXT_NAME = "ext"; + + private static final QName EXT_QNAME = new QName(NS, EXT_NAME, PREFIX); + + /** + * Expected serialized result: + * + * + * + * foo + * + * + */ + @Entry + public static final class EntryWithSimpleExtension { + + private final String value; + + public EntryWithSimpleExtension(final String value) { + this.value = value; + } + + @Extension(prefix = PREFIX, ns = NS, name = EXT_NAME, simple = true) + public String getSimpleExtension() { + return value; + } + + } + + /** + * Expected serialized result: + * + * + * + * + * foo + * + * + * + */ + @Entry + public static final class EntryWithExtensionNestingSimpleExtension { + + @Extension(prefix = PREFIX, ns = NS, name = EXT_NAME) + public ExtensionNestingSimpleExtension getExtension() { + return new ExtensionNestingSimpleExtension("foo"); + } + + } + + public static final class ExtensionNestingSimpleExtension { + + private final String value; + + public ExtensionNestingSimpleExtension(final String value) { + this.value = value; + } + + @Extension(prefix = PREFIX, ns = NS, name = EXT_NAME, simple = true) + public String getNestedExtension() { + return value; + } + + } + + /** + * Expected serialized result: + * + * + * + * + * + * foo + * + * + * + * + */ + @Entry + public static final class EntryWithExtensionNestingExtensionNestingSimpleExtension { + + @Extension(prefix = PREFIX, ns = NS, name = EXT_NAME) + public ExtensionNestingExtensionNestingSimpleExtension getExtension() { + return new ExtensionNestingExtensionNestingSimpleExtension("foo"); + } + + } + + public static final class ExtensionNestingExtensionNestingSimpleExtension { + + private final String value; + + public ExtensionNestingExtensionNestingSimpleExtension(final String value) { + this.value = value; + } + + @Extension(prefix = PREFIX, ns = NS, name = EXT_NAME) + public ExtensionNestingSimpleExtension getExtensionNestingSimpleExtension() { + return new ExtensionNestingSimpleExtension(value); + } + + } + + private final Abdera abdera = Abdera.getInstance(); + + @Test + public void shouldGenerateSimpleExtension() { + // given + final EntryWithSimpleExtension source = new EntryWithSimpleExtension("foo"); + + // when + final StreamWriter streamWriter = abdera.newStreamWriter(); + final ByteArrayOutputStream serialized = new ByteArrayOutputStream(); + streamWriter.setOutputStream(serialized).setAutoIndent(true); + final ConventionSerializationContext context = new ConventionSerializationContext(streamWriter); + streamWriter.startDocument(); + context.serialize(source); + streamWriter.endDocument(); + + // then + final org.apache.abdera.model.Entry entry = AbderaTestHelper.deserialize(serialized); + final ExtensibleElement extension = entry.getExtension(EXT_QNAME); + assertNotNull(extension); + assertEquals("foo", extension.getText().trim()); + } + + @Test + public void shouldGenerateExtensionNestingSimpleExtension() { + // given + final EntryWithExtensionNestingSimpleExtension source = new EntryWithExtensionNestingSimpleExtension(); + + // when + final StreamWriter streamWriter = abdera.newStreamWriter(); + final ByteArrayOutputStream serialized = new ByteArrayOutputStream(); + streamWriter.setOutputStream(serialized).setAutoIndent(true); + final ConventionSerializationContext context = new ConventionSerializationContext(streamWriter); + streamWriter.startDocument(); + context.serialize(source); + streamWriter.endDocument(); + + // then + final org.apache.abdera.model.Entry entry = AbderaTestHelper.deserialize(serialized); + final ExtensibleElement extension = entry.getExtension(EXT_QNAME); + assertNotNull(extension); + final Element simple = extension.getExtension(EXT_QNAME); + assertNotNull(simple); + assertEquals("foo", simple.getText().trim()); + } + + @Test + public void shouldGenerateExtensionNestingExtensionNestingSimpleExtension() { + // given + final EntryWithExtensionNestingExtensionNestingSimpleExtension source = + new EntryWithExtensionNestingExtensionNestingSimpleExtension(); + + // when + final StreamWriter streamWriter = abdera.newStreamWriter(); + final ByteArrayOutputStream serialized = new ByteArrayOutputStream(); + streamWriter.setOutputStream(serialized).setAutoIndent(true); + final ConventionSerializationContext context = new ConventionSerializationContext(streamWriter); + streamWriter.startDocument(); + context.serialize(source); + streamWriter.endDocument(); + + // then + final org.apache.abdera.model.Entry entry = AbderaTestHelper.deserialize(serialized); + final ExtensibleElement extension = entry.getExtension(EXT_QNAME); + assertNotNull(extension); + final ExtensibleElement nested = extension.getExtension(EXT_QNAME); + assertNotNull(nested); + final Element simple = nested.getExtension(EXT_QNAME); + assertNotNull(simple); + assertEquals("foo", simple.getText().trim()); + } +} diff --git a/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/SerializerTest.java b/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/SerializerTest.java index 21c0be51..26e36315 100644 --- a/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/SerializerTest.java +++ b/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/SerializerTest.java @@ -18,19 +18,15 @@ package org.apache.abdera.test.ext.serializer; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Calendar; import java.util.Date; -import javax.xml.namespace.QName; - import org.apache.abdera.Abdera; import org.apache.abdera.ext.serializer.ConventionSerializationContext; import org.apache.abdera.ext.serializer.annotation.Author; -import org.apache.abdera.ext.serializer.annotation.Extension; import org.apache.abdera.ext.serializer.annotation.ID; import org.apache.abdera.ext.serializer.annotation.Link; import org.apache.abdera.ext.serializer.annotation.Published; @@ -40,7 +36,6 @@ import org.apache.abdera.ext.serializer.impl.EntrySerializer; import org.apache.abdera.model.Document; import org.apache.abdera.model.Entry; -import org.apache.abdera.model.ExtensibleElement; import org.apache.abdera.writer.StreamWriter; import org.junit.Test; @@ -124,69 +119,6 @@ public void testAnnotated() throws Exception { assertEquals("James", entry.getAuthor().getName()); assertEquals("this is the summary", entry.getSummary()); assertEquals("http://example.org/foo", entry.getAlternateLink().getResolvedHref().toString()); - - final ExtensibleElement simpleExtension = entry.getExtension(SimpleExtensionQName.INSTANCE); - assertNotNull(simpleExtension); - assertEquals("baz", simpleExtension.getText()); - - final ExtensibleElement complexExtension = entry.getExtension(ComplexExtensionQName.INSTANCE); - assertNotNull(complexExtension); - final ExtensibleElement nestedSimpleExtension = complexExtension.getExtension(SimpleExtensionQName.INSTANCE); - assertNotNull(nestedSimpleExtension); - assertEquals("baz", nestedSimpleExtension.getText()); - - final ExtensibleElement moreComplexExtension = entry.getExtension(MoreComplexExtensionQName.INSTANCE); - assertNotNull(moreComplexExtension); - final ExtensibleElement nestedComplexExtension = moreComplexExtension.getExtension(ComplexExtensionQName.INSTANCE); - assertNotNull(nestedComplexExtension); - final ExtensibleElement deepNestedSimpleExtension = nestedComplexExtension.getExtension(SimpleExtensionQName.INSTANCE); - assertNotNull(deepNestedSimpleExtension); - assertEquals("baz", deepNestedSimpleExtension.getText()); - } - - private static final class SimpleExtensionQName extends QName { - - public static final String NS = "http://example.org/simple"; - - public static final String NAME = "foo"; - - public static final String PREFIX = "simple"; - - public static final QName INSTANCE = new SimpleExtensionQName(); - - private SimpleExtensionQName() { - super(NS, NAME, PREFIX); - } - } - - private static final class ComplexExtensionQName extends QName { - - public static final String NS = "http://example.org/complex"; - - public static final String NAME = "foo"; - - public static final String PREFIX = "complex"; - - public static final QName INSTANCE = new ComplexExtensionQName(); - - private ComplexExtensionQName() { - super(NS, NAME, PREFIX); - } - } - - private static final class MoreComplexExtensionQName extends QName { - - public static final String NS = "http://example.org/morecomplex"; - - public static final String NAME = "foo"; - - public static final String PREFIX = "morecomplex"; - - public static final QName INSTANCE = new MoreComplexExtensionQName(); - - private MoreComplexExtensionQName() { - super(NS, NAME, PREFIX); - } } @org.apache.abdera.ext.serializer.annotation.Entry @@ -221,40 +153,5 @@ public String getText() { public String getUri() { return "http://example.org/foo"; } - - @Extension(ns = SimpleExtensionQName.NS, name = SimpleExtensionQName.NAME, prefix = SimpleExtensionQName.PREFIX, simple = true) - public String getSimpleExtension() { - return "baz"; - } - - @Extension(ns = ComplexExtensionQName.NS, name = ComplexExtensionQName.NAME, prefix = ComplexExtensionQName.PREFIX) - public ComplexExtension getComplexExtension() { - return new ComplexExtension(); - } - - @Extension(ns = MoreComplexExtensionQName.NS, name = MoreComplexExtensionQName.NAME, prefix = MoreComplexExtensionQName.PREFIX) - public MoreComplexExtension getMoreComplexExtension() { - return new MoreComplexExtension(); - } - } - - public static class ComplexExtension { - - @Extension(ns = SimpleExtensionQName.NS, name = SimpleExtensionQName.NAME, prefix = SimpleExtensionQName.PREFIX, simple = true) - public String getSimpleExtension() { - return "baz"; - } - - } - - public static class MoreComplexExtension { - - @Extension(ns = ComplexExtensionQName.NS, name = ComplexExtensionQName.NAME, prefix = ComplexExtensionQName.PREFIX) - public ComplexExtension getComplexExtension() { - return new ComplexExtension(); - } - - } - } diff --git a/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/TestSuite.java b/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/TestSuite.java index c6e221b6..3d1e902c 100644 --- a/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/TestSuite.java +++ b/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/TestSuite.java @@ -25,5 +25,6 @@ public static void main(String[] args) { JUnitCore runner = new JUnitCore(); runner.addListener(new TextListener(System.out)); runner.run(SerializerTest.class); + runner.run(ExtensionAnnotationTest.class); } } From 33d2de88e34a2ca5e3fdb6657d8d9dde8fa78936 Mon Sep 17 00:00:00 2001 From: niccoutu Date: Wed, 16 Oct 2013 12:15:36 +0200 Subject: [PATCH 4/4] ABDERA-352 serialized @Extension annotated List<> accessor as several extension elements --- .../abdera/ext/serializer/BaseSerializer.java | 35 +++--- .../serializer/ExtensionAnnotationTest.java | 114 ++++++++++++++++++ 2 files changed, 133 insertions(+), 16 deletions(-) diff --git a/extensions/serializer/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java b/extensions/serializer/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java index b6bf198e..12188b2e 100644 --- a/extensions/serializer/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java +++ b/extensions/serializer/src/main/java/org/apache/abdera/ext/serializer/BaseSerializer.java @@ -86,24 +86,27 @@ protected void writeExtensions(Object source, ObjectContext objectContext, SerializationContext context, Conventions conventions) { - AccessibleObject[] accessors = objectContext.getAccessors(Extension.class, conventions); + final AccessibleObject[] accessors = objectContext.getAccessors(Extension.class, conventions); for (AccessibleObject accessor : accessors) { - Object value = eval(accessor, source); - ObjectContext valueContext = new ObjectContext(value, source, accessor); - Extension extension = valueContext.getAnnotation(Extension.class); - boolean simple = extension != null ? extension.simple() : false; - Serializer ser; - if (simple) { - final QName qname = getQName(accessor); - ser = new SimpleElementSerializer(qname); - } else { - ser = context.getSerializer(valueContext); - } - if (ser == null) { - final QName qname = getQName(accessor); - ser = new ExtensionSerializer(qname); + final Object value = eval(accessor, source); + final Object[] values = toArray(value); + for (Object val : values) { + final ObjectContext valueContext = new ObjectContext(val, source, accessor); + final Extension extension = valueContext.getAnnotation(Extension.class); + final boolean simple = extension != null ? extension.simple() : false; + Serializer ser; + if (simple) { + final QName qname = getQName(accessor); + ser = new SimpleElementSerializer(qname); + } else { + ser = context.getSerializer(valueContext); + } + if (ser == null) { + final QName qname = getQName(accessor); + ser = new ExtensionSerializer(qname); + } + ser.serialize(val, valueContext, context); } - ser.serialize(value, valueContext, context); } } diff --git a/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/ExtensionAnnotationTest.java b/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/ExtensionAnnotationTest.java index 0d9dd040..575faf85 100644 --- a/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/ExtensionAnnotationTest.java +++ b/extensions/serializer/src/test/java/org/apache/abdera/test/ext/serializer/ExtensionAnnotationTest.java @@ -1,6 +1,8 @@ package org.apache.abdera.test.ext.serializer; import java.io.ByteArrayOutputStream; +import java.util.Arrays; +import java.util.List; import javax.xml.namespace.QName; import org.apache.abdera.Abdera; @@ -124,6 +126,64 @@ public ExtensionNestingSimpleExtension getExtensionNestingSimpleExtension() { } + /** + * Expected serialized result: + * + * + * + * foo + * + * + * bar + * + * + * baz + * + * + */ + @Entry + public static final class EntryWithListOfSimpleExtensions { + + @Extension(prefix = PREFIX, ns = NS, name = EXT_NAME, simple = true) + public List getSimpleExtensions() { + return Arrays.asList("foo", "bar", "baz"); + } + + } + + /** + * Expected serialized result: + * + * + * + * + * foo + * + * + * + * + * bar + * + * + * + * + * baz + * + * + * + */ + @Entry + public static final class EntryWithListOfExtensionsNestingSimpleExtension { + + @Extension(prefix = PREFIX, ns = NS, name = EXT_NAME) + public List getComplexExtensionExtensions() { + return Arrays.asList(new ExtensionNestingSimpleExtension("foo"), + new ExtensionNestingSimpleExtension("bar"), + new ExtensionNestingSimpleExtension("baz")); + } + + } + private final Abdera abdera = Abdera.getInstance(); @Test @@ -195,4 +255,58 @@ public void shouldGenerateExtensionNestingExtensionNestingSimpleExtension() { assertNotNull(simple); assertEquals("foo", simple.getText().trim()); } + + @Test + public void shouldGenerateSeveralSimpleExtensions() { + // given + final EntryWithListOfSimpleExtensions source = new EntryWithListOfSimpleExtensions(); + + // when + final StreamWriter streamWriter = abdera.newStreamWriter(); + final ByteArrayOutputStream serialized = new ByteArrayOutputStream(); + streamWriter.setOutputStream(serialized).setAutoIndent(true); + final ConventionSerializationContext context = new ConventionSerializationContext(streamWriter); + streamWriter.startDocument(); + context.serialize(source); + streamWriter.endDocument(); + + // then + final org.apache.abdera.model.Entry entry = AbderaTestHelper.deserialize(serialized); + final List extensions = entry.getExtensions(EXT_QNAME); + assertNotNull(extensions); + assertEquals(3, extensions.size()); + assertEquals("foo", extensions.get(0).getText().trim()); + assertEquals("bar", extensions.get(1).getText().trim()); + assertEquals("baz", extensions.get(2).getText().trim()); + } + + @Test + public void shouldGenerateSeveralExtensionsNestingSimpleExtension() { + // given + final EntryWithListOfExtensionsNestingSimpleExtension source = new EntryWithListOfExtensionsNestingSimpleExtension(); + + // when + final StreamWriter streamWriter = abdera.newStreamWriter(); + final ByteArrayOutputStream serialized = new ByteArrayOutputStream(); + streamWriter.setOutputStream(serialized).setAutoIndent(true); + final ConventionSerializationContext context = new ConventionSerializationContext(streamWriter); + streamWriter.startDocument(); + context.serialize(source); + streamWriter.endDocument(); + + // then + final org.apache.abdera.model.Entry entry = AbderaTestHelper.deserialize(serialized); + final List extensions = entry.getExtensions(EXT_QNAME); + assertNotNull(extensions); + assertEquals(3, extensions.size()); + final Element first = extensions.get(0).getExtension(EXT_QNAME); + assertNotNull(first); + assertEquals("foo", first.getText().trim()); + final Element second = extensions.get(1).getExtension(EXT_QNAME); + assertNotNull(second); + assertEquals("bar", second.getText().trim()); + final Element third = extensions.get(2).getExtension(EXT_QNAME); + assertNotNull(third); + assertEquals("baz", third.getText().trim()); + } }