From 50a0213d6fa3c06d2677a8f3b6926d184f02e710 Mon Sep 17 00:00:00 2001 From: ndebeiss Date: Thu, 4 Feb 2016 13:18:49 +0100 Subject: [PATCH] Ignore property XmlAccessType.NONE no XmlElement Adding functionality, if class is tagged XmlAccessType.NONE and the property is not tagged XmlElement, the property is ignored in the output. --- .../io/swagger/jackson/ModelResolver.java | 46 +++++++---- .../java/io/swagger/jackson/XMLInfoTest.java | 76 +++++++++++++++++-- 2 files changed, 100 insertions(+), 22 deletions(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/jackson/ModelResolver.java b/modules/swagger-core/src/main/java/io/swagger/jackson/ModelResolver.java index d3d6e7792c..c016ef20fe 100644 --- a/modules/swagger-core/src/main/java/io/swagger/jackson/ModelResolver.java +++ b/modules/swagger-core/src/main/java/io/swagger/jackson/ModelResolver.java @@ -12,10 +12,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyMetadata; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.introspect.Annotated; import com.fasterxml.jackson.databind.introspect.AnnotatedMember; import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition; import com.fasterxml.jackson.databind.jsontype.NamedType; import com.fasterxml.jackson.databind.type.TypeFactory; +import com.google.common.collect.Iterables; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import io.swagger.converter.ModelConverter; @@ -37,19 +39,6 @@ import io.swagger.util.AllowableValues; import io.swagger.util.AllowableValuesUtils; import io.swagger.util.PrimitiveType; - -import com.google.common.collect.Iterables; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.validation.constraints.DecimalMax; -import javax.validation.constraints.DecimalMin; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; -import javax.xml.bind.annotation.XmlRootElement; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.ArrayList; @@ -62,6 +51,19 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.validation.constraints.DecimalMax; +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ModelResolver extends AbstractModelConverter implements ModelConverter { Logger LOGGER = LoggerFactory.getLogger(ModelResolver.class); @@ -219,6 +221,7 @@ public Model resolve(JavaType type, ModelConverterContext context, Iterator propertiesToIgnore = new HashSet(); @@ -294,7 +297,7 @@ public Model resolve(JavaType type, ModelConverterContext context, Iterator annotationList = new ArrayList(); for (Annotation a : member.annotations()) { annotationList.add(a); @@ -437,6 +440,21 @@ public Model resolve(JavaType type, ModelConverterContext context, Iterator propertiesToIgnore) { + if (propertiesToIgnore.contains(propName)) { + return true; + } + if (xmlAccessorTypeAnnotation == null) { + return false; + } + if (xmlAccessorTypeAnnotation.value().equals(XmlAccessType.NONE)) { + if (!member.hasAnnotation(XmlElement.class)) { + return true; + } + } + return false; + } private enum GeneratorWrapper { PROPERTY(ObjectIdGenerators.PropertyGenerator.class) { diff --git a/modules/swagger-core/src/test/java/io/swagger/jackson/XMLInfoTest.java b/modules/swagger-core/src/test/java/io/swagger/jackson/XMLInfoTest.java index 3d7c2b78f7..323dd3dc98 100644 --- a/modules/swagger-core/src/test/java/io/swagger/jackson/XMLInfoTest.java +++ b/modules/swagger-core/src/test/java/io/swagger/jackson/XMLInfoTest.java @@ -1,12 +1,6 @@ package io.swagger.jackson; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.assertEquals; - import com.fasterxml.jackson.annotation.JsonProperty; -import org.testng.annotations.Test; - import io.swagger.annotations.ApiModel; import io.swagger.converter.ModelConverter; import io.swagger.converter.ModelConverterContextImpl; @@ -14,11 +8,17 @@ import io.swagger.models.ModelImpl; import io.swagger.models.Xml; import io.swagger.models.properties.Property; - +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; -import java.util.List; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; +import org.testng.annotations.Test; public class XMLInfoTest extends SwaggerTestBase { @@ -48,6 +48,7 @@ public void testSimple() throws Exception { @XmlRootElement(name = "xmlDecoratedBean") @ApiModel(description = "DESC") static class XmlDecoratedBean { + @XmlElement(name = "elementB") public int b; @@ -58,4 +59,63 @@ static class XmlDecoratedBean { @JsonProperty("elementC") public String c; } + + @Test + public void testReadingXmlAccessorTypeNone() throws Exception { + final ModelConverter mr = modelResolver(); + final Model model = mr.resolve(XmlDecoratedBeanXmlAccessorNone.class, new ModelConverterContextImpl(mr), null); + assertTrue(model instanceof ModelImpl); + + final ModelImpl impl = (ModelImpl) model; + + final Xml xml = impl.getXml(); + assertNotNull(xml); + assertEquals(xml.getName(), "xmlDecoratedBean"); + + final Property property = impl.getProperties().get("a"); + assertNotNull(property); + + assertNull(impl.getProperties().get("b")); + } + + @Test + public void testReadingXmlAccessorTypePublic() throws Exception { + final ModelConverter mr = modelResolver(); + final Model model = mr.resolve(XmlDecoratedBeanXmlAccessorPublic.class, new ModelConverterContextImpl(mr), null); + assertTrue(model instanceof ModelImpl); + + final ModelImpl impl = (ModelImpl) model; + + final Xml xml = impl.getXml(); + assertNotNull(xml); + assertEquals(xml.getName(), "xmlDecoratedBean"); + + final Property propertyA = impl.getProperties().get("a"); + assertNotNull(propertyA); + + Property propertyB = impl.getProperties().get("b"); + assertNotNull(propertyB); + } + + @XmlRootElement(name = "xmlDecoratedBean") + @XmlAccessorType(XmlAccessType.NONE) + @ApiModel + static class XmlDecoratedBeanXmlAccessorNone { + + @XmlElement + public int a; + + public String b; + } + + @XmlRootElement(name = "xmlDecoratedBean") + @ApiModel + static class XmlDecoratedBeanXmlAccessorPublic { + + @XmlElement + public int a; + + public String b; + } + }