/** * Checks whether the passed property can be represented as node attribute. * * @param property property instance to be checked * @return <code>true</code> if the passed property can be represented as * node attribute */ private static boolean isAttributeAllowed(Schema property) { for (Class<?> item : new Class<?>[]{ArraySchema.class, MapSchema.class, ObjectSchema.class}) { if (item.isInstance(property)) { return false; } } if (!StringUtils.isBlank(property.get$ref())) { return false; } return true; }
@Override public void serialize( Schema value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { // handle ref schema serialization skipping all other props if (StringUtils.isBlank(value.get$ref())) { defaultSerializer.serialize(value, jgen, provider); } else { jgen.writeStartObject(); jgen.writeStringField("$ref", value.get$ref()); jgen.writeEndObject(); } } }
@Override public Optional<Schema> filterSchemaProperty(Schema property, Schema schema, String propName, Map<String, List<String>> params, Map<String, String> cookies, Map<String, List<String>> headers) { if (property == null || StringUtils.isBlank(property.get$ref())) { return Optional.of(property); } if (property.get$ref().contains(MODEL)) { return Optional.empty(); } return Optional.of(property); } }
if (arraySchema.schema().implementation().equals(Void.class)) { getSchemaFromAnnotation(arraySchema.schema(), components, jsonViewAnnotation).ifPresent(schema -> { if (StringUtils.isNotBlank(schema.getType()) || StringUtils.isNotBlank(schema.get$ref())) { arraySchemaObject.setItems(schema);
@Test public void testMultipleInheritedChildBean() throws Exception { final Schema subModel = context.resolve(new AnnotatedType(MultipleSub1Bean.class)); assertNotNull(subModel); // make sure child points at parent assertTrue(subModel instanceof ComposedSchema); ComposedSchema cm = (ComposedSchema) subModel; assertEquals(cm.getAllOf().get(0).get$ref(), "#/components/schemas/MultipleBaseBean"); // make sure parent properties are filtered out of subclass assertSub1PropertiesValid(cm.getProperties()); final Schema baseModel = context.getDefinedModels().get("MultipleBaseBean"); assertNotNull(baseModel); assertBasePropertiesValid(baseModel.getProperties()); final Schema sub1Model = context.getDefinedModels().get("MultipleSub1Bean"); assertNotNull(sub1Model); // make sure child points at parent assertTrue(sub1Model instanceof ComposedSchema); ComposedSchema cm1 = (ComposedSchema) sub1Model; assertEquals(cm1.getAllOf().get(0).get$ref(), "#/components/schemas/MultipleBaseBean"); // make sure parent properties are filtered out of subclass assertSub1PropertiesValid(cm1.getProperties()); final Schema sub2Model = context.getDefinedModels().get("MultipleSub2Bean"); assertNotNull(sub2Model); assertTrue(sub2Model instanceof ComposedSchema); ComposedSchema cm2 = (ComposedSchema) sub2Model; assertEquals(cm2.getAllOf().get(0).get$ref(), "#/components/schemas/MultipleBaseBean"); // make sure parent properties are filtered out of subclass assertSub2PropertiesValid(cm2.getProperties()); }
@Test public void testHierarchy() throws Exception { final Schema baseModel = context.resolve(new AnnotatedType(BaseBean3.class)); assertNotNull(baseModel); assertBasePropertiesValid(baseModel.getProperties()); assertEquals(baseModel.getDiscriminator().getPropertyName(), "type"); assertEquals(baseModel.getDiscriminator().getMapping().get("ChildBean3Mapped"), "#/components/schemas/ChildBean3"); final Schema subModel = context.getDefinedModels().get("ChildBean3"); assertNotNull(subModel); // make sure child points at parent assertTrue(subModel instanceof ComposedSchema); ComposedSchema cm = (ComposedSchema) subModel; assertEquals(cm.getAllOf().get(0).get$ref(), "#/components/schemas/BaseBean3"); // make sure parent properties are filtered out of subclass assertSub1PropertiesValid(cm.getProperties()); // assert grandchild final Schema subSubModel = context.getDefinedModels().get("GrandChildBean3"); assertNotNull(subSubModel); // make sure child points at parent assertTrue(subSubModel instanceof ComposedSchema); cm = (ComposedSchema) subSubModel; assertEquals(cm.getAllOf().get(0).get$ref(), "#/components/schemas/ChildBean3"); // make sure parent properties are filtered out of subclass assertSub2PropertiesValid(cm.getProperties()); }
public static Schema resolveSchemaFromType(Class<?> schemaImplementation, Components components, JsonView jsonViewAnnotation) { Schema schemaObject = new Schema(); if (schemaImplementation.getName().startsWith("java.lang")) { schemaObject.setType(schemaImplementation.getSimpleName().toLowerCase()); } else { ResolvedSchema resolvedSchema = ModelConverters.getInstance().readAllAsResolvedSchema(new AnnotatedType().type(schemaImplementation).jsonViewAnnotation(jsonViewAnnotation)); Map<String, Schema> schemaMap; if (resolvedSchema != null) { schemaMap = resolvedSchema.referencedSchemas; schemaMap.forEach((key, referencedSchema) -> { if (components != null) { components.addSchemas(key, referencedSchema); } }); schemaObject.set$ref(COMPONENTS_REF + resolvedSchema.schema.getName()); } } if (StringUtils.isBlank(schemaObject.get$ref()) && StringUtils.isBlank(schemaObject.getType())) { // default to string schemaObject.setType("string"); } return schemaObject; }
@Test(description = "it should serialize a parameterized type per 606") public void serializeParameterizedType() { final Map<String, Schema> schemas = readAll(Employee.class); final Schema employee = (Schema) schemas.get("employee"); final Map<String, Schema> props = employee.getProperties(); final Iterator<String> et = props.keySet().iterator(); final Schema id = props.get(et.next()); assertTrue(id instanceof IntegerSchema); final Schema firstName = props.get(et.next()); assertTrue(firstName instanceof StringSchema); final Schema lastName = props.get(et.next()); assertTrue(lastName instanceof StringSchema); final Schema department = props.get(et.next()); assertNotNull(department.get$ref()); final Schema manager = props.get(et.next()); assertNotNull(manager.get$ref()); final Schema team = props.get(et.next()); assertTrue(team instanceof ArraySchema); final ArraySchema ap = (ArraySchema) team; assertTrue(ap.getUniqueItems()); assertNotNull(employee.getXml()); assertEquals(employee.getXml().getName(), "employee"); }
@Test(description = "read composed schem refs #2900") public void readComposedSchema_ticket2900() { Json.mapper().addMixIn(TestObjectTicket2900.GsonJsonPrimitive.class, TestObjectTicket2900.GsonJsonPrimitiveMixIn.class); Map<String, Schema> schemas = ModelConverters.getInstance().readAll(TestObjectTicket2900.class); Schema model = schemas.get("SomeDTO"); Assert.assertNotNull(model); Map<String, Schema> properties = model.getProperties(); Assert.assertNotNull(properties.get("value")); Assert.assertEquals(properties.get("value").get$ref(), "#/components/schemas/MyJsonPrimitive"); Assert.assertEquals(properties.get("valueWithMixIn").get$ref(), "#/components/schemas/GsonJsonPrimitive"); model = schemas.get("MyJsonPrimitive"); Assert.assertNotNull(model); Assert.assertTrue(((ComposedSchema)model).getOneOf().size() == 2); Assert.assertEquals(((ComposedSchema)model).getOneOf().get(0).getType(), "string"); Assert.assertEquals(((ComposedSchema)model).getOneOf().get(1).getType(), "number"); model = schemas.get("GsonJsonPrimitive"); Assert.assertNotNull(model); Assert.assertTrue(((ComposedSchema)model).getOneOf().size() == 2); Assert.assertEquals(((ComposedSchema)model).getOneOf().get(0).getType(), "string"); Assert.assertEquals(((ComposedSchema)model).getOneOf().get(1).getType(), "number"); Assert.assertNull(model.getProperties()); }
@Test public void testMultipleInheritedBean() throws Exception { final Schema baseModel = context.resolve(new AnnotatedType(MultipleBaseBean.class)); assertNotNull(baseModel); assertBasePropertiesValid(baseModel.getProperties()); final Schema sub1Model = context.getDefinedModels().get("MultipleSub1Bean"); assertNotNull(sub1Model); // make sure child points at parent assertTrue(sub1Model instanceof ComposedSchema); ComposedSchema cm1 = (ComposedSchema) sub1Model; assertEquals(cm1.getAllOf().get(0).get$ref(), "#/components/schemas/MultipleBaseBean"); // make sure parent properties are filtered out of subclass assertSub1PropertiesValid(cm1.getProperties()); final Schema sub2Model = context.getDefinedModels().get("MultipleSub2Bean"); assertNotNull(sub2Model); assertTrue(sub2Model instanceof ComposedSchema); ComposedSchema cm2 = (ComposedSchema) sub2Model; assertEquals(cm2.getAllOf().get(0).get$ref(), "#/components/schemas/MultipleBaseBean"); // make sure parent properties are filtered out of subclass assertSub2PropertiesValid(cm2.getProperties()); }
@Test(description = "read single composed schem refs #2616") public void readComposedSchema_ticket2616() { Map<String, Schema> schemas = ModelConverters.getInstance().readAll(TestObject2616.TestObject2616_Schema.class); Schema model = schemas.get("TestObject2616_Schema"); Assert.assertNotNull(model); Map<String, Schema> properties = model.getProperties(); Assert.assertNotNull(properties.get("object")); Assert.assertTrue(properties.get("object").get$ref().equals("#/components/schemas/AbstractObject")); model = schemas.get("AbstractObject"); Assert.assertNotNull(model); Assert.assertTrue(model instanceof ComposedSchema); Assert.assertTrue(((ComposedSchema)model).getOneOf().size() == 2); model = schemas.get("AObject"); Assert.assertNotNull(model); model = schemas.get("BObject"); Assert.assertNotNull(model); model = schemas.get("objects"); Assert.assertNull(model); }
@Test(description = "it should ignore properties with type Bar") public void testCustomConverter() { // add the custom converter final ModelConverters converters = new ModelConverters(); converters.addConverter(new CustomConverter(Json.mapper())); Map<String, Schema> models = converters.readAll(Foo.class); Schema model = models.get("io.swagger.v3.core.converting.override.CustomResolverTest$Foo"); assertNotNull(model); assertEquals(model.getProperties().size(), 2); final Schema barProperty = (Schema) model.getProperties().get("bar"); assertEquals(barProperty.get$ref(), "#/components/schemas/io.swagger.v3.core.converting.override.CustomResolverTest$Bar"); final Schema titleProperty = (Schema)model.getProperties().get("title"); assertNotNull(titleProperty); model = models.get("io.swagger.v3.core.converting.override.CustomResolverTest$Bar"); assertNotNull(model); }
@Test public void testInheritedBean() throws Exception { final Schema baseModel = context.resolve(new AnnotatedType(BaseBean.class)); assertNotNull(baseModel); assertBasePropertiesValid(baseModel.getProperties()); assertEquals(baseModel.getDiscriminator().getPropertyName(), "type"); assertEquals(baseModel.getDiscriminator().getMapping().get("Sub1BeanMapped"), "#/components/schemas/Sub1Bean"); final Schema subModel = context.getDefinedModels().get("Sub1Bean"); assertNotNull(subModel); // make sure child points at parent assertTrue(subModel instanceof ComposedSchema); ComposedSchema cm = (ComposedSchema) subModel; assertEquals(cm.getAllOf().get(0).get$ref(), "#/components/schemas/BaseBean"); // make sure parent properties are filtered out of subclass assertSub1PropertiesValid(cm.getProperties()); }
@Test public void testComposedUberObject() throws Exception { final Schema uberModel = context.resolve(new AnnotatedType(UberObject.class)); assertNotNull(uberModel); // make sure child points at parent assertTrue(uberModel instanceof ComposedSchema); ComposedSchema cm = (ComposedSchema) uberModel; assertEquals(cm.getAnyOf().size(), 2); assertEquals(cm.getAnyOf().get(0).get$ref(), "#/components/schemas/UserObject"); // parent properties are filtered out of subclass when parent doesn't define subtypes assertNotNull(cm.getProperties()); assertEquals(cm.getProperties().size(), 3); final Schema interfaceModel = context.getDefinedModels().get("UserObject"); assertNotNull(interfaceModel); assertUserObjectPropertiesValid(interfaceModel.getProperties()); }
@Test public void testInheritedChildBean() throws Exception { final Schema subModel = context.resolve(new AnnotatedType(Sub1Bean.class)); assertNotNull(subModel); // make sure child points at parent assertTrue(subModel instanceof ComposedSchema); ComposedSchema cm = (ComposedSchema) subModel; assertEquals(cm.getAllOf().get(0).get$ref(), "#/components/schemas/BaseBean"); // make sure parent properties are filtered out of subclass assertSub1PropertiesValid(cm.getProperties()); final Schema baseModel = context.getDefinedModels().get("BaseBean"); assertNotNull(baseModel); assertBasePropertiesValid(baseModel.getProperties()); }
@Test public void testComposedChildBean() throws Exception { final Schema subModel = context.resolve(new AnnotatedType(Sub2Bean.class)); assertNotNull(subModel); // make sure child points at parent assertTrue(subModel instanceof ComposedSchema); ComposedSchema cm = (ComposedSchema) subModel; assertEquals(cm.getAllOf().get(0).get$ref(), "#/components/schemas/BaseBean2"); // make sure parent properties are filtered out of subclass assertSub1PropertiesValid(cm.getProperties()); final Schema baseModel = context.getDefinedModels().get("BaseBean2"); assertNotNull(baseModel); assertBase2PropertiesValid(baseModel.getProperties()); }
@Test public void extractProperties() { final Map<String, Schema> models = ModelConverters.getInstance().readAll(Family.class); assertEquals(models.size(), 3); final Schema person = models.get("Person"); final Schema employer = (Schema) person.getProperties().get("employer"); assertTrue(employer instanceof ArraySchema); final ArraySchema employerProperty = (ArraySchema) employer; final Schema items = employerProperty.getItems(); assertEquals(items.get$ref(), "#/components/schemas/Employer"); final Schema awards = (Schema) person.getProperties().get("awards"); assertTrue(awards instanceof ArraySchema); assertTrue(((ArraySchema) awards).getItems() instanceof StringSchema); }
@Override public Optional<Schema> filterSchemaProperty(Schema property, Schema schema, String propName, Map<String, List<String>> params, Map<String, String> cookies, Map<String, List<String>> headers) { if (schema == null || StringUtils.isBlank(schema.get$ref())) { return Optional.of(schema); } if (schema.get$ref().contains(MODEL)) { return Optional.empty(); } return Optional.of(schema); } }
private static Schema process(Schema id, String propertyName, AnnotatedType type, ModelConverterContext context) { Schema model = context.resolve(removeJsonIdentityAnnotations(type)); Schema mi = model; mi.addProperties(propertyName, id); return new Schema().$ref(StringUtils.isNotEmpty(mi.get$ref()) ? mi.get$ref() : mi.getName()); } private static AnnotatedType removeJsonIdentityAnnotations(AnnotatedType type) {