diff --git a/wizard-common/pom.xml b/wizard-common/pom.xml
index 26c54a2..17372ae 100644
--- a/wizard-common/pom.xml
+++ b/wizard-common/pom.xml
@@ -98,6 +98,23 @@ This code is available under the Apache License, version 2: http://www.apache.or
2.3.0
+
+
+ io.swagger.core.v3
+ swagger-jaxrs2
+ ${swagger.version}
+
+
+ io.swagger.core.v3
+ swagger-integration
+ ${swagger.version}
+
+
+ io.swagger.core.v3
+ swagger-annotations
+ ${swagger.version}
+
+
diff --git a/wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityConfig.java b/wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityConfig.java
index b05f839..14e844a 100644
--- a/wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityConfig.java
+++ b/wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityConfig.java
@@ -1,5 +1,6 @@
package org.cobbzilla.wizard.model.entityconfig;
+import io.swagger.v3.oas.models.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@@ -24,7 +25,11 @@ import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
+import static lombok.AccessLevel.PRIVATE;
import static org.cobbzilla.util.daemon.ZillaRuntime.empty;
+import static org.cobbzilla.util.daemon.ZillaRuntime.shortError;
+import static org.cobbzilla.util.json.JsonUtil.NOTNULL_MAPPER;
+import static org.cobbzilla.util.json.JsonUtil.json;
import static org.cobbzilla.util.reflect.ReflectionUtil.*;
import static org.cobbzilla.util.string.StringUtil.*;
@@ -698,4 +703,45 @@ public class EntityConfig {
}
return validation;
}
+
+ // do not expose a getter for the example, we don't want this appearing in JSON
+ @Getter(lazy=true, value=PRIVATE) private final Object example = initExample();
+ private Object initExample() {
+ final Object o = instantiate(className);
+ for (String field : fieldNames) {
+ try {
+ ReflectionUtil.set(o, field, fields.get(field).example());
+ } catch (Exception e) {
+ log.info("initExample: error setting "+field+" on "+o.getClass().getName()+": "+shortError(e));
+ }
+ }
+ return o;
+ }
+
+ public T example() { return (T) getExample(); }
+
+ public Schema openApiSchema() {
+ final T defaultObj = instantiate(className);
+ final T example = example();
+ final Schema s = new Schema<>();
+
+ final String simpleName = defaultObj.getClass().getSimpleName();
+ s.name(simpleName)
+ .title(camelCaseToString(simpleName))
+ .example(json(example, NOTNULL_MAPPER));
+ s.setDefault(defaultObj);
+ final Map props = new HashMap<>();
+ final List required = new ArrayList<>();
+ for (String field : fieldNames) {
+ final Schema