This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch 3292-openapi
in repository https://gitbox.apache.org/repos/asf/isis.git

commit ee86fe9fffef0f7308d813f76f037d72da666055
Author: Andi Huber <[email protected]>
AuthorDate: Tue Nov 22 17:28:51 2022 +0100

    ISIS-3292: migrate Swagger Model v2 to OpenAPI v3
    
    - yet using some stubs, to fill in details later (TODO markers)
---
 bom/pom.xml                                        |   2 +-
 core/metamodel/pom.xml                             |   4 +-
 core/pom.xml                                       |   4 +-
 .../rendering/src/main/java/module-info.java       |   4 +-
 .../service/swagger/internal/BodyParameter.java    |   9 +
 .../service/swagger/internal/Caching.java          |  25 +-
 .../service/swagger/internal/Generation.java       | 516 ++++++++++-----------
 .../service/swagger/internal/RefSchema.java        |  11 +
 .../swagger/internal/SwaggerSpecGenerator.java     |   8 +-
 .../swagger/internal/ValuePropertyFactory.java     |   4 +-
 .../internal/ValuePropertyFactoryDefault.java      |  89 ++--
 .../rendering/service/swagger/internal/_Util.java  |  33 +-
 .../viewer/resources/SwaggerSpecResource.java      |   5 +
 13 files changed, 377 insertions(+), 337 deletions(-)

diff --git a/bom/pom.xml b/bom/pom.xml
index 8c8957e9b2..d8068e66d4 100644
--- a/bom/pom.xml
+++ b/bom/pom.xml
@@ -415,7 +415,7 @@ It is therefore a copy of org.apache:apache, with 
customisations clearly identif
         <spring-boot.version>2.7.5</spring-boot.version>
         <summernote.version>0.8.20</summernote.version>
         <surefire-plugin.argLine>-Xmx384m</surefire-plugin.argLine>
-        <swagger-core.version>1.6.9</swagger-core.version>
+        <swagger-core.version>2.2.7</swagger-core.version>
 
         <togglz.version>3.3.2</togglz.version>
 
diff --git a/core/metamodel/pom.xml b/core/metamodel/pom.xml
index dd56597c3f..812e8baad2 100644
--- a/core/metamodel/pom.xml
+++ b/core/metamodel/pom.xml
@@ -80,8 +80,8 @@
         </dependency>
 
         <dependency>
-            <groupId>io.swagger</groupId>
-            <artifactId>swagger-core</artifactId>
+                       <groupId>io.swagger.core.v3</groupId>
+                       <artifactId>swagger-core</artifactId>
             <exclusions>
                <!-- metamodel no longer has a dependency on guava -->
                <exclusion>
diff --git a/core/pom.xml b/core/pom.xml
index 6a6a93f861..19fa7b929b 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -851,8 +851,8 @@
                        </dependency>
 
                        <dependency>
-                               <groupId>io.swagger</groupId>
-                               <artifactId>swagger-core</artifactId>
+                           <groupId>io.swagger.core.v3</groupId>
+                           <artifactId>swagger-core</artifactId>
                                <version>${swagger-core.version}</version>
                        </dependency>
 
diff --git a/viewers/restfulobjects/rendering/src/main/java/module-info.java 
b/viewers/restfulobjects/rendering/src/main/java/module-info.java
index e6a4afd8d3..959a3ef468 100644
--- a/viewers/restfulobjects/rendering/src/main/java/module-info.java
+++ b/viewers/restfulobjects/rendering/src/main/java/module-info.java
@@ -49,6 +49,6 @@ module org.apache.causeway.viewer.restfulobjects.rendering {
     requires spring.beans;
     requires spring.context;
     requires spring.core;
-    requires swagger.core;
-    requires swagger.models;
+    requires io.swagger.v3.oas.models;
+    requires io.swagger.v3.core;
 }
\ No newline at end of file
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/BodyParameter.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/BodyParameter.java
new file mode 100644
index 0000000000..59d50466eb
--- /dev/null
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/BodyParameter.java
@@ -0,0 +1,9 @@
+package 
org.apache.causeway.viewer.restfulobjects.rendering.service.swagger.internal;
+
+import io.swagger.v3.oas.models.parameters.Parameter;
+
+public class BodyParameter extends Parameter {
+
+    //TODO[ISIS-3292] implement or replace
+
+}
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/Caching.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/Caching.java
index ef5f9f6996..05de310157 100644
--- 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/Caching.java
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/Caching.java
@@ -18,8 +18,9 @@
  */
 package 
org.apache.causeway.viewer.restfulobjects.rendering.service.swagger.internal;
 
-import io.swagger.models.Response;
-import io.swagger.models.properties.IntegerProperty;
+import io.swagger.v3.oas.models.headers.Header;
+import io.swagger.v3.oas.models.media.IntegerSchema;
+import io.swagger.v3.oas.models.responses.ApiResponse;
 
 /*
  *  Licensed to the Apache Software Foundation (ASF) under one
@@ -41,26 +42,26 @@ import io.swagger.models.properties.IntegerProperty;
  */
 enum Caching {
     TRANSACTIONAL {
-        @Override public void withHeaders(final Response response) {
+        @Override public void withHeaders(final ApiResponse response) {
 
         }
     },
     USER_INFO {
-        @Override public void withHeaders(final Response response) {
+        @Override public void withHeaders(final ApiResponse response) {
             response
-            .header("Cache-Control",
-                    new IntegerProperty()
-                    ._default(3600));
+            .addHeaderObject("Cache-Control",
+                    new Header().schema(
+                            new IntegerSchema()._default(3600)));
         }
     },
     NON_EXPIRING {
-        @Override public void withHeaders(final Response response) {
+        @Override public void withHeaders(final ApiResponse response) {
             response
-            .header("Cache-Control",
-                    new IntegerProperty()
-                    ._default(86400).description(_Util.roSpec("2.13")));
+            .addHeaderObject("Cache-Control",
+                    new Header().schema(
+                            new 
IntegerSchema()._default(86400).description(_Util.roSpec("2.13"))));
         }
     };
 
-    public abstract void withHeaders(final Response response);
+    public abstract void withHeaders(final ApiResponse response);
 }
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/Generation.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/Generation.java
index 2fca0ff7c5..44459bf5ab 100644
--- 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/Generation.java
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/Generation.java
@@ -43,21 +43,21 @@ import 
org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import org.apache.causeway.core.metamodel.util.Facets;
 
-import io.swagger.models.Info;
-import io.swagger.models.ModelImpl;
-import io.swagger.models.Operation;
-import io.swagger.models.Path;
-import io.swagger.models.Response;
-import io.swagger.models.Swagger;
-import io.swagger.models.parameters.BodyParameter;
-import io.swagger.models.parameters.PathParameter;
-import io.swagger.models.parameters.QueryParameter;
-import io.swagger.models.properties.ArrayProperty;
-import io.swagger.models.properties.MapProperty;
-import io.swagger.models.properties.ObjectProperty;
-import io.swagger.models.properties.Property;
-import io.swagger.models.properties.RefProperty;
-import io.swagger.models.properties.StringProperty;
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.Operation;
+import io.swagger.v3.oas.models.PathItem;
+import io.swagger.v3.oas.models.Paths;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.media.ArraySchema;
+import io.swagger.v3.oas.models.media.MapSchema;
+import io.swagger.v3.oas.models.media.ObjectSchema;
+import io.swagger.v3.oas.models.media.Schema;
+import io.swagger.v3.oas.models.media.StringSchema;
+import io.swagger.v3.oas.models.parameters.PathParameter;
+import io.swagger.v3.oas.models.parameters.QueryParameter;
+import io.swagger.v3.oas.models.responses.ApiResponse;
+import io.swagger.v3.oas.models.servers.Server;
 import lombok.val;
 
 class Generation {
@@ -75,7 +75,7 @@ class Generation {
 
     private final Set<String> references = _Sets.newLinkedHashSet();
     private final Set<String> definitions = _Sets.newLinkedHashSet();
-    private Swagger swagger;
+    private OpenAPI swagger;
 
     public Generation(
             final String basePath,
@@ -92,20 +92,21 @@ class Generation {
         this.valuePropertyFactory = valuePropertyFactory;
     }
 
-    Swagger generate() {
-        this.swagger = new Swagger();
+    OpenAPI generate() {
+        this.swagger = new OpenAPI();
 
         final String swaggerVersionInfo =
                 String.format("swagger.io (%s)",
-                        Swagger.class.getPackage().getImplementationVersion()
+                        OpenAPI.class.getPackage().getImplementationVersion()
                         );
 
-        swagger.basePath(basePath);
+        swagger.addServersItem(new Server()
+                .url(basePath));
         swagger.info(new Info()
                 .version(swaggerVersionInfo)
                 .title(visibility.name() + " API")
                 );
-
+        swagger.setComponents(new Components());
 
         appendRestfulObjectsSupportingPathsAndDefinitions();
         appendLinkModelDefinition();
@@ -120,27 +121,31 @@ class Generation {
         return swagger;
     }
 
-    private Map<String, Path> sorted(final Map<String, Path> paths) {
+    private Paths sorted(final Map<String, PathItem> paths) {
 
-        final List<Map.Entry<String, Path>> entries = new 
ArrayList<>(paths.entrySet());
-        entries.sort(new Comparator<Map.Entry<String, Path>>() {
+        final List<Map.Entry<String, PathItem>> entries = new 
ArrayList<>(paths.entrySet());
+        entries.sort(new Comparator<Map.Entry<String, PathItem>>() {
             @Override
-            public int compare(final Map.Entry<String, Path> o1, final 
Map.Entry<String, Path> o2) {
+            public int compare(final Map.Entry<String, PathItem> o1, final 
Map.Entry<String, PathItem> o2) {
                 final String tag1 = tagFor(o1);
                 final String tag2 = tagFor(o2);
                 final int tag = tag1.compareTo(tag2);
                 return tag != 0 ? tag : o1.getKey().compareTo(o2.getKey());
             }
 
-            protected String tagFor(final Map.Entry<String, Path> o1) {
-                return 
o1.getValue().getOperations().stream().findFirst().map(operation -> 
operation.getTags().stream().findFirst().orElse("(no tag)")).orElse("(no tag)");
+            protected String tagFor(final Map.Entry<String, PathItem> o1) {
+                return o1.getValue().readOperations().stream()
+                        .findFirst()
+                        .map(operation -> 
operation.getTags().stream().findFirst().orElse("(no tag)")).orElse("(no tag)");
             }
         });
 
-        final LinkedHashMap<String, Path> sorted = new LinkedHashMap<>();
+        final LinkedHashMap<String, PathItem> sorted = new LinkedHashMap<>();
         entries.forEach(entry -> sorted.put(entry.getKey(), entry.getValue()));
 
-        return sorted;
+        val _paths = new Paths();
+        _paths.putAll(sorted);
+        return _paths;
     }
 
     void appendServicePathsAndDefinitions() {
@@ -207,7 +212,7 @@ class Generation {
                     && objectCollections.isEmpty()) {
                 continue;
             }
-            final ModelImpl causewayModel = 
appendObjectPathAndModelDefinitions(objectSpec);
+            final Schema causewayModel = 
appendObjectPathAndModelDefinitions(objectSpec);
             updateObjectModel(causewayModel, objectSpec, objectProperties, 
objectCollections);
 
             for (final OneToManyAssociation objectCollection : 
objectCollections) {
@@ -225,99 +230,96 @@ class Generation {
         final String tag = ". restful objects supporting resources";
 
         swagger.path("/",
-                new Path()
-                .get(newOperation("home-page")
-                        .tag(tag)
-                        .description(_Util.roSpec("5.1"))
-                        .response(200,
-                                newResponse(Caching.NON_EXPIRING)
-                                .description("OK")
-                                
.schema(newRefProperty("RestfulObjectsSupportingHomePageRepr"))
-                                )));
+                new PathItem()
+                .get(_Util.response(
+                        newOperation("home-page")
+                            .addTagsItem(tag)
+                            .description(_Util.roSpec("5.1")),
+                        200,
+                        newResponse(Caching.NON_EXPIRING, 
newRefProperty("RestfulObjectsSupportingHomePageRepr"))
+                            .description("OK"))));
         addDefinition("RestfulObjectsSupportingHomePageRepr", 
newModel(_Util.roSpec("5.2")));
 
         swagger.path("/user",
-                new Path()
-                .get(newOperation("user")
-                        .tag(tag)
-                        .description(_Util.roSpec("6.1"))
-                        .response(200,
-                                newResponse(Caching.USER_INFO)
-                                .description("OK")
-                                
.schema(newRefProperty("RestfulObjectsSupportingUserRepr"))
-                                )));
+                new PathItem()
+                .get(_Util.response(
+                        newOperation("user")
+                            .addTagsItem(tag)
+                            .description(_Util.roSpec("6.1")),
+                        200,
+                        newResponse(Caching.USER_INFO, 
newRefProperty("RestfulObjectsSupportingUserRepr"))
+                            .description("OK"))));
         addDefinition("RestfulObjectsSupportingUserRepr",
                 newModel(_Util.roSpec("6.2"))
-                .property("userName", stringProperty())
-                .property("roles", arrayOfStrings())
-                .property("links", arrayOfLinks())
-                .required("userName")
-                .required("roles"));
+                .addProperty("userName", stringProperty())
+                .addProperty("roles", arrayOfStrings())
+                .addProperty("links", arrayOfLinks())
+                .addRequiredItem("userName")
+                .addRequiredItem("roles"));
 
         swagger.path("/services",
-                new Path()
-                .get(newOperation("services")
-                        .tag(tag)
-                        .description(_Util.roSpec("7.1"))
-                        .response(200,
-                                newResponse(Caching.USER_INFO)
-                                .description("OK")
-                                
.schema(newRefProperty("RestfulObjectsSupportingServicesRepr"))
-                                )));
+                new PathItem()
+                .get(_Util.response(
+                        newOperation("services")
+                            .addTagsItem(tag)
+                            .description(_Util.roSpec("7.1")),
+                        200,
+                        newResponse(Caching.USER_INFO, 
newRefProperty("RestfulObjectsSupportingServicesRepr"))
+                            .description("OK"))));
         addDefinition("RestfulObjectsSupportingServicesRepr",
                 newModel(_Util.roSpec("7.2"))
-                .property("value", arrayOfLinks())
-                .required("userName")
-                .required("roles"));
+                .addProperty("value", arrayOfLinks())
+                .addRequiredItem("userName")
+                .addRequiredItem("roles"));
 
         swagger.path("/version",
-                new Path()
-                .get(newOperation("RestfulObjectsSupportingServicesRepr")
-                        .tag(tag)
-                        .description(_Util.roSpec("8.1"))
-                        .response(200,
-                                newResponse(Caching.NON_EXPIRING)
-                                .description("OK")
-                                .schema(new ObjectProperty())
-                                )));
-        swagger.addDefinition("RestfulObjectsSupportingServicesRepr",
+                new PathItem()
+                .get(_Util.response(
+                        newOperation("RestfulObjectsSupportingServicesRepr")
+                            .addTagsItem(tag)
+                            .description(_Util.roSpec("8.1")),
+                        200,
+                        newResponse(Caching.NON_EXPIRING, new ObjectSchema())
+                            .description("OK"))));
+
+        
swagger.getComponents().addSchemas("RestfulObjectsSupportingServicesRepr",
                 newModel(_Util.roSpec("8.2"))
-                .property("specVersion", stringProperty())
-                .property("implVersion", stringProperty())
-                .property("optionalCapabilities",
-                        new ObjectProperty()
-                        .property("blobsClobs", stringProperty())
-                        .property("deleteObjects", stringProperty())
-                        .property("domainModel", stringProperty())
-                        .property("validateOnly", stringProperty())
-                        .property("protoPersistentObjects", stringProperty())
+                .addProperty("specVersion", stringProperty())
+                .addProperty("implVersion", stringProperty())
+                .addProperty("optionalCapabilities",
+                        new ObjectSchema()
+                        .addProperty("blobsClobs", stringProperty())
+                        .addProperty("deleteObjects", stringProperty())
+                        .addProperty("domainModel", stringProperty())
+                        .addProperty("validateOnly", stringProperty())
+                        .addProperty("protoPersistentObjects", 
stringProperty())
                         )
-                .required("userName")
-                .required("roles"));
+                .addRequiredItem("userName")
+                .addRequiredItem("roles"));
     }
 
     void appendLinkModelDefinition() {
-        swagger.addDefinition("LinkRepr",
-                new ModelImpl()
+        swagger.getComponents().addSchemas("LinkRepr",
+                new Schema()
                 .type("object")
-                .property("rel", stringProperty().description("the 
relationship of the resource to this referencing resource"))
-                .property("href", stringProperty().description("the hyperlink 
reference (URL) of the resource"))
-                .property("title", stringProperty().description("title to 
render"))
-                .property("method", stringPropertyEnum("GET", "POST", "PUT", 
"DELETE").description("HTTP verb to access"))
-                .property("type", stringProperty().description("Content-Type 
recognized by the resource (for HTTP Accept header)"))
-                .property("arguments", new ObjectProperty().description("Any 
arguments, to send as query strings or in body"))
-                .property("value", stringProperty().description("the 
representation of the link if followed"))
-                .required("rel")
-                .required("href")
-                .required("method")
+                .addProperty("rel", stringProperty().description("the 
relationship of the resource to this referencing resource"))
+                .addProperty("href", stringProperty().description("the 
hyperlink reference (URL) of the resource"))
+                .addProperty("title", stringProperty().description("title to 
render"))
+                .addProperty("method", stringPropertyEnum("GET", "POST", 
"PUT", "DELETE").description("HTTP verb to access"))
+                .addProperty("type", 
stringProperty().description("Content-Type recognized by the resource (for HTTP 
Accept header)"))
+                .addProperty("arguments", new ObjectSchema().description("Any 
arguments, to send as query strings or in body"))
+                .addProperty("value", stringProperty().description("the 
representation of the link if followed"))
+                .addRequiredItem("rel")
+                .addRequiredItem("href")
+                .addRequiredItem("method")
                 );
 
-        swagger.addDefinition("HrefRepr",
-                new ModelImpl()
+        swagger.getComponents().addSchemas("HrefRepr",
+                new Schema()
                 .type("object")
                 .description("Abbreviated version of the Link resource, used 
primarily to reference non-value objects")
-                .property("href", stringProperty().description("the hyperlink 
reference (URL) of the resource"))
-                .required("href")
+                .addProperty("href", stringProperty().description("the 
hyperlink reference (URL) of the resource"))
+                .addRequiredItem("href")
                 );
 
     }
@@ -326,76 +328,75 @@ class Generation {
 
         final String serviceId = objectSpec.getLogicalTypeName();
 
-        final Path path = new Path();
+        final PathItem path = new PathItem();
         swagger.path(String.format("/services/%s", serviceId), path);
 
         final String serviceModelDefinition = serviceId + "Repr";
 
         final String tag = tagForlogicalTypeName(serviceId, "> services");
-        path.get(
+        path.get(_Util.response(
                 newOperation("object")
-                .tag(tag)
-                .description(_Util.roSpec("15.1"))
-                .response(200,
-                        newResponse(Caching.TRANSACTIONAL)
-                        .description("OK")
-                        .schema(newRefProperty(serviceModelDefinition)))
-                );
+                    .addTagsItem(tag)
+                    .description(_Util.roSpec("15.1")),
+                200,
+                newResponse(Caching.TRANSACTIONAL, 
newRefProperty(serviceModelDefinition))
+                    .description("OK")));
 
-        final ModelImpl model =
+        final Schema model =
                 newModel(_Util.roSpec("15.1.2") + ": representation of " + 
serviceId)
-                .property("title", stringProperty())
-                .property("serviceId", stringProperty()._default(serviceId))
-                .property("members", new ObjectProperty());
+                .addProperty("title", stringProperty())
+                .addProperty("serviceId", stringProperty()._default(serviceId))
+                .addProperty("members", new ObjectSchema());
 
         addDefinition(serviceModelDefinition, model);
     }
 
-    ModelImpl appendObjectPathAndModelDefinitions(final ObjectSpecification 
objectSpec) {
+    Schema appendObjectPathAndModelDefinitions(final ObjectSpecification 
objectSpec) {
 
         final String logicalTypeName = objectSpec.getLogicalTypeName();
 
-        final Path path = new Path();
+        final PathItem path = new PathItem();
         swagger.path(String.format("/objects/%s/{objectId}", logicalTypeName), 
path);
 
         final String tag = tagForlogicalTypeName(logicalTypeName, null);
         final Operation operation = newOperation("object");
         path.get(operation);
         operation
-        .tag(tag)
+        .addTagsItem(tag)
         .description(_Util.roSpec("14.1"))
-        .parameter(
+        .addParametersItem(
+                _Util.typed(
                 new PathParameter()
-                .name("objectId")
-                .type("string"));
+                .name("objectId"),
+                "string"));
 
         // per https://github.com/swagger-api/swagger-spec/issues/146, swagger 
2.0 doesn't support multiple
         // modelled representations per path and response code;
         // in particular cannot associate representation/model with Accept 
header ('produces(...) method)
         final String restfulObjectsModelDefinition = logicalTypeName + 
"RestfulObjectsRepr";
         if (false) {
-            operation.response(200,
-                    newResponse(Caching.TRANSACTIONAL)
-                    .description("if Accept: 
application/json;profile=urn:org.restfulobjects:repr-types/object")
-                    .schema(newRefProperty(restfulObjectsModelDefinition)));
+            _Util.response(operation,
+                    200,
+                    newResponse(Caching.TRANSACTIONAL, 
newRefProperty(restfulObjectsModelDefinition))
+                    .description("if Accept: 
application/json;profile=urn:org.restfulobjects:repr-types/object"));
 
-            final ModelImpl roSpecModel =
+            final Schema roSpecModel =
                     newModel(_Util.roSpec("14.4") + ": representation of " + 
logicalTypeName)
-                    .property("title", stringProperty())
-                    .property("domainType", 
stringProperty()._default(logicalTypeName))
-                    .property("instanceId", stringProperty())
-                    .property("members", new ObjectProperty());
-            swagger.addDefinition(restfulObjectsModelDefinition, roSpecModel);
+                    .addProperty("title", stringProperty())
+                    .addProperty("domainType", 
stringProperty()._default(logicalTypeName))
+                    .addProperty("instanceId", stringProperty())
+                    .addProperty("members", new ObjectSchema());
+            swagger.getComponents().addSchemas(restfulObjectsModelDefinition, 
roSpecModel);
         }
 
         final String causewayModelDefinition = logicalTypeName + "Repr";
-        operation
-        .response(200,
-                newResponse(Caching.TRANSACTIONAL)
-                .description(logicalTypeName + " , if Accept: 
application/json;profile=urn:org.apache.causeway/v2")
-                .schema(newRefProperty(causewayModelDefinition)));
 
-        final ModelImpl causewayModel = new ModelImpl();
+        _Util.response(operation,
+                200,
+                newResponse(Caching.TRANSACTIONAL, 
newRefProperty(causewayModelDefinition))
+                .description(logicalTypeName + " , if Accept: 
application/json;profile=urn:org.apache.causeway/v2"));
+
+        final Schema causewayModel = new Schema();
         addDefinition(causewayModelDefinition, causewayModel);
 
         // return so can be appended to
@@ -403,21 +404,21 @@ class Generation {
     }
 
     // UNUSED
-    void appendServiceActionPromptTo(final ObjectProperty serviceMembers, 
final ObjectAction action) {
+    void appendServiceActionPromptTo(final ObjectSchema serviceMembers, final 
ObjectAction action) {
         String actionId = action.getId();
 
-        serviceMembers.property(actionId,
-                new ObjectProperty()
-                .property("id", stringPropertyEnum(actionId))
-                .property("memberType", stringPropertyEnum("action"))
-                .property("links",
-                        new ObjectProperty()
-                        .property("rel", stringPropertyEnum( String.format(
+        serviceMembers.addProperty(actionId,
+                new ObjectSchema()
+                .addProperty("id", stringPropertyEnum(actionId))
+                .addProperty("memberType", stringPropertyEnum("action"))
+                .addProperty("links",
+                        new ObjectSchema()
+                        .addProperty("rel", stringPropertyEnum( String.format(
                                 
"urn:org.restfulobjects:rels/details;action=%s", actionId)))
-                        .property("href", stringPropertyEnum(String.format(
+                        .addProperty("href", stringPropertyEnum(String.format(
                                 "actions/%s", actionId))))
-                .property("method", stringPropertyEnum("GET"))
-                .property("type", stringPropertyEnum(
+                .addProperty("method", stringPropertyEnum("GET"))
+                .addProperty("type", stringPropertyEnum(
                         
"application/json;profile=urn:org.restfulobjects:repr-types/object-action"))
                 );
     }
@@ -430,13 +431,13 @@ class Generation {
         final String actionId = serviceAction.getId();
 
         val parameters = serviceAction.getParameters();
-        final Path path = new Path();
+        final PathItem path = new PathItem();
         swagger.path(String.format("/services/%s/actions/%s/invoke", 
serviceId, actionId), path);
 
         final String tag = tagForlogicalTypeName(serviceId, "> services");
         final Operation invokeOperation =
                 newOperation("object", "action-result")
-                .tag(tag)
+                .addTagsItem(tag)
                 .description(_Util.roSpec("19.1") + ": (invoke) resource of " 
+ serviceId + "#" + actionId);
 
         final SemanticsOf semantics = serviceAction.getSemantics();
@@ -448,23 +449,21 @@ class Generation {
                 val describedAs = 
parameter.getStaticDescription().orElse(null);
 
                 invokeOperation
-                .parameter(
-                        new QueryParameter()
+                .addParametersItem(_Util.typed(new QueryParameter()
                         .name(parameter.getId())
                         .description(_Util.roSpec("2.9.1")
                                 + (_Strings.isNotEmpty(describedAs)
                                         ? (": " + describedAs)
                                         : ""))
-                        .required(false)
-                        .type("string")
-                        );
+                        .required(false),
+                        "string"));
             }
             if(!parameters.isEmpty()) {
-                invokeOperation.parameter(new QueryParameter()
+                invokeOperation.addParametersItem(_Util.typed(new 
QueryParameter()
                         .name("x-causeway-querystring")
                         .description(_Util.roSpec("2.10") + ": all (formal) 
arguments as base64 encoded string")
-                        .required(false)
-                        .type("string"));
+                        .required(false),
+                        "string"));
             }
 
         } else {
@@ -474,38 +473,34 @@ class Generation {
                 path.post(invokeOperation);
             }
 
-            final ModelImpl bodyParam =
-                    new ModelImpl()
+            final Schema bodyParam =
+                    new Schema()
                     .type("object");
             for (final ObjectActionParameter parameter : parameters) {
 
-                final Property valueProperty;
+                final Schema valueProperty;
                 // TODO: need to switch on parameter's type and create 
appropriate impl of valueProperty
                 // if(parameter.getSpecification().isValue()) ...
                 valueProperty = stringProperty();
 
                 bodyParam
-                .property(parameter.getId(),
-                        new ObjectProperty()
-                        .property("value", valueProperty)
+                .addProperty(parameter.getId(),
+                        new ObjectSchema()
+                        .addProperty("value", valueProperty)
                         );
             }
 
-            invokeOperation
-            .consumes("application/json")
-            .parameter(
+            _Util.consumes(invokeOperation, "application/json")
+            .addParametersItem(
                     new BodyParameter()
                     .name("body")
                     .schema(bodyParam));
 
         }
 
-        invokeOperation
-        .response(
-                200, new Response()
-                .description(serviceId + "#" + actionId + " , if Accept: 
application/json;profile=urn:org.apache.causeway/v2")
-                .schema(actionReturnTypeFor(serviceAction))
-                );
+        _Util.response(invokeOperation,
+                200, newResponse(actionReturnTypeFor(serviceAction))
+                .description(serviceId + "#" + actionId + " , if Accept: 
application/json;profile=urn:org.apache.causeway/v2"));
     }
 
     void appendCollectionTo(
@@ -515,26 +510,23 @@ class Generation {
         final String logicalTypeName = objectSpec.getLogicalTypeName();
         final String collectionId = collection.getId();
 
-        final Path path = new Path();
+        final PathItem path = new PathItem();
         swagger.path(String.format("/objects/%s/{objectId}/collections/%s", 
logicalTypeName, collectionId), path);
 
         final String tag = tagForlogicalTypeName(logicalTypeName, null);
         final Operation collectionOperation =
                 newOperation("object-collection")
-                .tag(tag)
+                .addTagsItem(tag)
                 .description(_Util.roSpec("17.1") + ": resource of " + 
logicalTypeName + "#" + collectionId)
-                .parameter(
-                        new PathParameter()
-                        .name("objectId")
-                        .type("string"));
+                .addParametersItem(
+                        _Util.typed(new PathParameter(), "string")
+                        .name("objectId"));
 
         path.get(collectionOperation);
-        collectionOperation
-        .response(
-                200, new Response()
-                .description(logicalTypeName + "#" + collectionId + " , if 
Accept: application/json;profile=urn:org.apache.causeway/v2")
-                .schema(modelFor(collection))
-                );
+        _Util.response(collectionOperation,
+                200,
+                newResponse(modelFor(collection))
+                .description(logicalTypeName + "#" + collectionId + " , if 
Accept: application/json;profile=urn:org.apache.causeway/v2"));
     }
 
     void appendObjectActionInvokePath(
@@ -545,18 +537,19 @@ class Generation {
         final String actionId = objectAction.getId();
 
         val parameters = objectAction.getParameters();
-        final Path path = new Path();
+        final PathItem path = new PathItem();
         swagger.path(String.format("/objects/%s/{objectId}/actions/%s/invoke", 
logicalTypeName, actionId), path);
 
         final String tag = tagForlogicalTypeName(logicalTypeName, null);
         final Operation invokeOperation =
                 newOperation("action-result")
-                .tag(tag)
+                .addTagsItem(tag)
                 .description(_Util.roSpec("19.1") + ": (invoke) resource of " 
+ logicalTypeName + "#" + actionId)
-                .parameter(
+                .addParametersItem(
+                        _Util.typed(
                         new PathParameter()
-                        .name("objectId")
-                        .type("string"));
+                        .name("objectId"),
+                        "string"));
 
         final SemanticsOf semantics = objectAction.getSemantics();
         if(semantics.isSafeInNature()) {
@@ -567,23 +560,26 @@ class Generation {
                 val describedAs = 
parameter.getStaticDescription().orElse(null);
 
                 invokeOperation
-                .parameter(
+                .addParametersItem(
+                        _Util.typed(
                         new QueryParameter()
                         .name(parameter.getId())
                         .description(_Util.roSpec("2.9.1")
                                 + (_Strings.isNotEmpty(describedAs)
                                         ? (": " + describedAs)
                                         : ""))
-                        .required(false)
-                        .type("string")
+                        .required(false),
+                        "string")
                         );
             }
             if(!parameters.isEmpty()) {
-                invokeOperation.parameter(new QueryParameter()
+                invokeOperation.addParametersItem(
+                        _Util.typed(
+                        new QueryParameter()
                         .name("x-causeway-querystring")
                         .description(_Util.roSpec("2.10") + ": all (formal) 
arguments as base64 encoded string")
-                        .required(false)
-                        .type("string"));
+                        .required(false),
+                        "string"));
             }
 
         } else {
@@ -593,82 +589,78 @@ class Generation {
                 path.post(invokeOperation);
             }
 
-            final ModelImpl bodyParam =
-                    new ModelImpl()
+            final Schema bodyParam =
+                    new Schema()
                     .type("object");
             for (final ObjectActionParameter parameter : parameters) {
 
                 final ObjectSpecification specification = 
parameter.getElementType();
-                final Property valueProperty = specification.isValue() ? 
modelFor(specification) : refToLinkModel() ;
+                final Schema valueProperty = specification.isValue() ? 
modelFor(specification) : refToLinkModel() ;
                 bodyParam
-                .property(parameter.getId(),
-                        new ObjectProperty()
-                        .property("value", valueProperty)
+                .addProperty(parameter.getId(),
+                        new ObjectSchema()
+                        .addProperty("value", valueProperty)
                         );
             }
 
-            invokeOperation
-            .consumes("application/json")
-            .parameter(
+            _Util.consumes(invokeOperation, "application/json")
+            .addParametersItem(
                     new BodyParameter()
                     .name("body")
                     .schema(bodyParam));
 
         }
 
-        invokeOperation
-        .response(
-                200, new Response()
-                .description(logicalTypeName + "#" + actionId)
-                .schema(actionReturnTypeFor(objectAction))
-                );
+        _Util.response(invokeOperation,
+                200, newResponse(actionReturnTypeFor(objectAction))
+                .description(logicalTypeName + "#" + actionId));
     }
 
     void appendDefinitionsForOrphanedReferences() {
         final Set<String> referencesWithoutDefinition = 
getReferencesWithoutDefinition();
         for (String reference : referencesWithoutDefinition) {
-            swagger.addDefinition(reference, new ModelImpl());
+            swagger.getComponents().addSchemas(reference, new Schema());
         }
     }
 
-    Property actionReturnTypeFor(final ObjectAction objectAction) {
+    Schema actionReturnTypeFor(final ObjectAction objectAction) {
         return objectAction.getReturnType().isPlural()
                 ? arrayPropertyOf(objectAction.getElementType())
                 : modelFor(objectAction.getReturnType());
     }
 
-    private Property modelFor(final OneToManyAssociation collection) {
+    private Schema modelFor(final OneToManyAssociation collection) {
         ObjectSpecification collectionSpecification = 
collection.getElementType();
         return arrayPropertyOf(collectionSpecification);
     }
 
-    private Property arrayPropertyOf(final ObjectSpecification 
objectSpecification) {
-        final ArrayProperty arrayProperty = new ArrayProperty();
+    private Schema arrayPropertyOf(final ObjectSpecification 
objectSpecification) {
+        final ArraySchema arrayProperty = new ArraySchema();
         if(objectSpecification != null && 
objectSpecification.getCorrespondingClass() != Object.class) {
             arrayProperty
             .description("List of " + objectSpecification.getLogicalTypeName())
             .items(modelFor(objectSpecification));
         } else {
-            arrayProperty.items(new ObjectProperty());
+            arrayProperty.items(new ObjectSchema());
         }
         return arrayProperty;
     }
 
-    private Property modelFor(final ObjectSpecification specification) {
+    private Schema modelFor(final ObjectSpecification specification) {
         if(specification == null) {
-            return new ObjectProperty();
+            return new ObjectSchema();
         }
 
         // no "simple" representation for void or values
         final Class<?> correspondingClass = 
specification.getCorrespondingClass();
         if(correspondingClass == void.class || correspondingClass == 
Void.class) {
-            return new ObjectProperty();
+            return new ObjectSchema();
         }
         // no "simple" representation for values
-        final Property property = 
valuePropertyFactory.newProperty(correspondingClass);
+        final Schema property = 
valuePropertyFactory.newProperty(correspondingClass);
         if(property != null) {
             // was recognized as a value
-            return new ObjectProperty();
+            return new ObjectSchema();
         }
 
         if(specification.isPlural()) {
@@ -679,16 +671,16 @@ class Generation {
         }
 
         if(specification.getCorrespondingClass() == java.lang.Object.class) {
-            return new ObjectProperty();
+            return new ObjectSchema();
         }
         if(specification.getCorrespondingClass() == java.lang.Enum.class) {
-            return new StringProperty();
+            return new StringSchema();
         }
         return newRefProperty(specification.getLogicalTypeName() + "Repr");
     }
 
     void updateObjectModel(
-            final ModelImpl model,
+            final Schema model,
             final ObjectSpecification objectSpecification,
             final List<OneToOneAssociation> objectProperties,
             final List<OneToManyAssociation> objectCollections) {
@@ -701,22 +693,22 @@ class Generation {
         .description(String.format("%s (%s)", logicalTypeName, className));
 
         for (OneToOneAssociation objectProperty : objectProperties) {
-            model.property(
+            model.addProperty(
                     objectProperty.getId(),
                     propertyFor(objectProperty.getElementType()));
         }
 
         for (OneToManyAssociation objectCollection : objectCollections) {
             final ObjectSpecification elementSpec = 
objectCollection.getElementType();
-            model.property(
+            model.addProperty(
                     objectCollection.getId(),
                     arrayPropertyOf(elementSpec)
                     );
         }
     }
 
-    Property propertyFor(final ObjectSpecification objectSpecification) {
-        final Property property =
+    Schema propertyFor(final ObjectSpecification objectSpecification) {
+        final Schema property =
                 
valuePropertyFactory.newProperty(objectSpecification.getCorrespondingClass());
         if (property != null) {
             return property;
@@ -742,22 +734,22 @@ class Generation {
         }
     }
 
-    static ModelImpl newModel(final String description) {
-        return new ModelImpl()
+    static Schema newModel(final String description) {
+        return new Schema()
                 .description(description)
                 .type("object")
-                .property("links", arrayOfLinks())
-                .property("extensions", new MapProperty())
-                .required("links")
-                .required("extensions");
+                .addProperty("links", arrayOfLinks())
+                .addProperty("extensions", new MapSchema())
+                .addRequiredItem("links")
+                .addRequiredItem("extensions");
     }
 
-    static StringProperty stringProperty() {
-        return new StringProperty();
+    static StringSchema stringProperty() {
+        return new StringSchema();
     }
 
-    static StringProperty stringPropertyEnum(final String... enumValues) {
-        final StringProperty stringProperty = stringProperty();
+    static StringSchema stringPropertyEnum(final String... enumValues) {
+        final StringSchema stringProperty = stringProperty();
         stringProperty._enum(Arrays.asList(enumValues));
         if(enumValues.length >= 1) {
             stringProperty._default(enumValues[0]);
@@ -765,39 +757,44 @@ class Generation {
         return stringProperty;
     }
 
-    static ArrayProperty arrayOfLinks() {
-        return new ArrayProperty()
+    static ArraySchema arrayOfLinks() {
+        return new ArraySchema()
                 .items(refToLinkModel());
     }
 
-    static RefProperty refToLinkModel() {
-        return new RefProperty("#/definitions/LinkRepr");
+    static RefSchema refToLinkModel() {
+        return new RefSchema("#/definitions/LinkRepr");
+    }
+
+    static RefSchema refToHrefModel() {
+        return new RefSchema("#/definitions/HrefRepr");
     }
 
-    static RefProperty refToHrefModel() {
-        return new RefProperty("#/definitions/HrefRepr");
+    static ArraySchema arrayOfStrings() {
+        return new ArraySchema().items(stringProperty());
     }
 
-    static ArrayProperty arrayOfStrings() {
-        return new ArrayProperty().items(stringProperty());
+    //TODO[ISIS-3292] honor schema
+    static ApiResponse newResponse(final Schema schema) {
+        return new ApiResponse();
     }
 
-    static Response newResponse(final Caching caching) {
-        return _Util.withCachingHeaders(new Response(), caching);
+    static ApiResponse newResponse(final Caching caching, final Schema schema) 
{
+        return _Util.withCachingHeaders(newResponse(schema), caching);
     }
 
     String tagForlogicalTypeName(final String logicalTypeName, final String 
fallback) {
         return tagger.tagForLogicalTypeName(logicalTypeName, fallback);
     }
 
-    private Property newRefProperty(final String model) {
+    private Schema newRefProperty(final String model) {
         addSwaggerReference(model);
-        return new RefProperty("#/definitions/" + model);
+        return new RefSchema("#/definitions/" + model);
     }
 
-    private void addDefinition(final String key, final ModelImpl model) {
+    private void addDefinition(final String key, final Schema model) {
         addSwaggerDefinition(key);
-        swagger.addDefinition(key, model);
+        swagger.getComponents().addSchemas(key, model);
     }
 
     void addSwaggerReference(final String model) {
@@ -815,8 +812,8 @@ class Generation {
     }
 
     private static Operation newOperation(final String ... reprTypes) {
-        Operation operation = new Operation()
-                .produces("application/json");
+        Operation operation =
+                _Util.produces(new Operation(), "application/json");
 
         boolean supportsV1 = false;
 
@@ -827,15 +824,16 @@ class Generation {
                     supportsV1 = true;
                 }
 
-                operation = operation.produces(
+                operation = _Util.produces(operation,
                         "application/json;profile=" + DQ + 
"urn:org.restfulobjects:repr-types/" + reprType + DQ);
             }
         }
 
         if(supportsV1) {
-            operation = operation
-                .produces("application/json;profile=" + DQ + 
"urn:org.apache.causeway/v2" + DQ)
-                .produces("application/json;profile=" + DQ + 
"urn:org.apache.causeway/v2;suppress=all" + DQ);
+            operation = _Util.produces(operation,
+                    "application/json;profile=" + DQ + 
"urn:org.apache.causeway/v2" + DQ);
+            operation = _Util.produces(operation,
+                    "application/json;profile=" + DQ + 
"urn:org.apache.causeway/v2;suppress=all" + DQ);
         }
 
         return operation;
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/RefSchema.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/RefSchema.java
new file mode 100644
index 0000000000..4df7aec133
--- /dev/null
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/RefSchema.java
@@ -0,0 +1,11 @@
+package 
org.apache.causeway.viewer.restfulobjects.rendering.service.swagger.internal;
+
+import io.swagger.v3.oas.models.media.Schema;
+
+public class RefSchema extends Schema {
+
+    public RefSchema(final String string) {
+        //TODO[ISIS-3292] implement or replace
+    }
+
+}
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/SwaggerSpecGenerator.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/SwaggerSpecGenerator.java
index 634330a889..ad2e48d8ec 100644
--- 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/SwaggerSpecGenerator.java
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/SwaggerSpecGenerator.java
@@ -30,9 +30,9 @@ import org.apache.causeway.applib.services.swagger.Visibility;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import 
org.apache.causeway.viewer.restfulobjects.applib.CausewayModuleViewerRestfulObjectsApplib;
 
-import io.swagger.models.Swagger;
-import io.swagger.util.Json;
-import io.swagger.util.Yaml;
+import io.swagger.v3.core.util.Json;
+import io.swagger.v3.core.util.Yaml;
+import io.swagger.v3.oas.models.OpenAPI;
 
 @Component
 @Named(CausewayModuleViewerRestfulObjectsApplib.NAMESPACE + 
".SwaggerSpecGenerator")
@@ -61,7 +61,7 @@ public class SwaggerSpecGenerator {
             final Format format) {
 
         final Generation generation = newGeneration(basePath, visibility);
-        final Swagger swagger = generation.generate();
+        final OpenAPI swagger = generation.generate();
 
         switch (format) {
         case JSON:
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/ValuePropertyFactory.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/ValuePropertyFactory.java
index 23cfaf1085..3c3c1c57e7 100644
--- 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/ValuePropertyFactory.java
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/ValuePropertyFactory.java
@@ -18,8 +18,8 @@
  */
 package 
org.apache.causeway.viewer.restfulobjects.rendering.service.swagger.internal;
 
-import io.swagger.models.properties.Property;
+import io.swagger.v3.oas.models.media.Schema;
 
 public interface ValuePropertyFactory {
-    Property newProperty(Class<?> cls);
+    Schema newProperty(Class<?> cls);
 }
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/ValuePropertyFactoryDefault.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/ValuePropertyFactoryDefault.java
index 381d0622f9..e39343dbcf 100644
--- 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/ValuePropertyFactoryDefault.java
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/ValuePropertyFactoryDefault.java
@@ -19,7 +19,6 @@
 package 
org.apache.causeway.viewer.restfulobjects.rendering.service.swagger.internal;
 
 import java.math.BigDecimal;
-import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -40,18 +39,15 @@ import 
org.apache.causeway.commons.internal.collections._Maps;
 import 
org.apache.causeway.viewer.restfulobjects.applib.CausewayModuleViewerRestfulObjectsApplib;
 import 
org.apache.causeway.viewer.restfulobjects.rendering.service.swagger.internal.ValuePropertyPlugin.ValuePropertyCollector;
 
-import io.swagger.models.properties.BooleanProperty;
-import io.swagger.models.properties.ByteArrayProperty;
-import io.swagger.models.properties.DateProperty;
-import io.swagger.models.properties.DateTimeProperty;
-import io.swagger.models.properties.DecimalProperty;
-import io.swagger.models.properties.DoubleProperty;
-import io.swagger.models.properties.FloatProperty;
-import io.swagger.models.properties.IntegerProperty;
-import io.swagger.models.properties.LongProperty;
-import io.swagger.models.properties.Property;
-import io.swagger.models.properties.StringProperty;
-import io.swagger.models.properties.UUIDProperty;
+import io.swagger.v3.oas.models.media.BooleanSchema;
+import io.swagger.v3.oas.models.media.ByteArraySchema;
+import io.swagger.v3.oas.models.media.DateSchema;
+import io.swagger.v3.oas.models.media.DateTimeSchema;
+import io.swagger.v3.oas.models.media.IntegerSchema;
+import io.swagger.v3.oas.models.media.NumberSchema;
+import io.swagger.v3.oas.models.media.Schema;
+import io.swagger.v3.oas.models.media.StringSchema;
+import io.swagger.v3.oas.models.media.UUIDSchema;
 
 @Component
 @Named(CausewayModuleViewerRestfulObjectsApplib.NAMESPACE + 
".ValuePropertyFactoryDefault")
@@ -61,49 +57,52 @@ public class ValuePropertyFactoryDefault implements 
ValuePropertyFactory {
 
     @Autowired(required = false) private List<ValuePropertyPlugin> 
valuePropertyPlugins;
 
-    public static interface Factory extends Supplier<Property> {};
+    public static interface Factory extends Supplier<Schema> {};
 
     public ValuePropertyFactoryDefault() {
 
-        propertyFactoryByClass.put(boolean.class, BooleanProperty::new);
-        propertyFactoryByClass.put(Boolean.class, BooleanProperty::new);
+        propertyFactoryByClass.put(boolean.class, BooleanSchema::new);
+        propertyFactoryByClass.put(Boolean.class, BooleanSchema::new);
 
-        propertyFactoryByClass.put(byte.class, IntegerProperty::new);
-        propertyFactoryByClass.put(Byte.class, IntegerProperty::new);
-        propertyFactoryByClass.put(short.class, IntegerProperty::new);
-        propertyFactoryByClass.put(Short.class, IntegerProperty::new);
-        propertyFactoryByClass.put(int.class, IntegerProperty::new);
-        propertyFactoryByClass.put(Integer.class, IntegerProperty::new);
-        propertyFactoryByClass.put(BigInteger.class, IntegerProperty::new);
+        propertyFactoryByClass.put(byte.class, IntegerSchema::new);
+        propertyFactoryByClass.put(Byte.class, IntegerSchema::new);
+        propertyFactoryByClass.put(short.class, IntegerSchema::new);
+        propertyFactoryByClass.put(Short.class, IntegerSchema::new);
+        propertyFactoryByClass.put(int.class, IntegerSchema::new);
+        propertyFactoryByClass.put(Integer.class, IntegerSchema::new);
 
-        propertyFactoryByClass.put(long.class, LongProperty::new);
-        propertyFactoryByClass.put(Long.class, LongProperty::new);
-        propertyFactoryByClass.put(java.sql.Timestamp.class, 
LongProperty::new);
+      //TODO[ISIS-3292] implement or replace ...
+//        propertyFactoryByClass.put(BigInteger.class, IntegerSchema::new);
 
-        propertyFactoryByClass.put(BigDecimal.class, DecimalProperty::new);
+//        propertyFactoryByClass.put(long.class, LongSchema::new);
+//        propertyFactoryByClass.put(Long.class, LongSchema::new);
+//        propertyFactoryByClass.put(java.sql.Timestamp.class, 
LongSchema::new);
 
-        propertyFactoryByClass.put(float.class, FloatProperty::new);
-        propertyFactoryByClass.put(Float.class, FloatProperty::new);
+        propertyFactoryByClass.put(BigDecimal.class, NumberSchema::new);
 
-        propertyFactoryByClass.put(double.class, DoubleProperty::new);
-        propertyFactoryByClass.put(Double.class, DoubleProperty::new);
+      //TODO[ISIS-3292] implement or replace ...
+//        propertyFactoryByClass.put(float.class, FloatSchema::new);
+//        propertyFactoryByClass.put(Float.class, FloatSchema::new);
+//
+//        propertyFactoryByClass.put(double.class, DoubleSchema::new);
+//        propertyFactoryByClass.put(Double.class, DoubleSchema::new);
 
-        propertyFactoryByClass.put(char.class, StringProperty::new);
-        propertyFactoryByClass.put(Character.class, StringProperty::new);
-        propertyFactoryByClass.put(char[].class, StringProperty::new);
-        propertyFactoryByClass.put(String.class, StringProperty::new);
+        propertyFactoryByClass.put(char.class, StringSchema::new);
+        propertyFactoryByClass.put(Character.class, StringSchema::new);
+        propertyFactoryByClass.put(char[].class, StringSchema::new);
+        propertyFactoryByClass.put(String.class, StringSchema::new);
 
-        propertyFactoryByClass.put(UUID.class, UUIDProperty::new);
+        propertyFactoryByClass.put(UUID.class, UUIDSchema::new);
 
-        propertyFactoryByClass.put(java.util.Date.class, 
DateTimeProperty::new);
-        propertyFactoryByClass.put(DateTime.class, DateTimeProperty::new);
-        propertyFactoryByClass.put(LocalDateTime.class, DateTimeProperty::new);
+        propertyFactoryByClass.put(java.util.Date.class, DateTimeSchema::new);
+        propertyFactoryByClass.put(DateTime.class, DateTimeSchema::new);
+        propertyFactoryByClass.put(LocalDateTime.class, DateTimeSchema::new);
 
-        propertyFactoryByClass.put(java.sql.Date.class, DateProperty::new);
-        propertyFactoryByClass.put(LocalDate.class, DateProperty::new);
+        propertyFactoryByClass.put(java.sql.Date.class, DateSchema::new);
+        propertyFactoryByClass.put(LocalDate.class, DateSchema::new);
 
-        propertyFactoryByClass.put(byte[].class, ByteArrayProperty::new);
-        
propertyFactoryByClass.put(org.apache.causeway.applib.value.Blob.class, 
ByteArrayProperty::new);
+        propertyFactoryByClass.put(byte[].class, ByteArraySchema::new);
+        
propertyFactoryByClass.put(org.apache.causeway.applib.value.Blob.class, 
ByteArraySchema::new);
 
         // add propertyFactories from plugins
         discoverValueProperties().visitEntries(propertyFactoryByClass::put);
@@ -111,7 +110,7 @@ public class ValuePropertyFactoryDefault implements 
ValuePropertyFactory {
     }
 
     @Override
-    public Property newProperty(Class<?> cls) {
+    public Schema newProperty(final Class<?> cls) {
         if(cls == null) {
             return null;
         }
@@ -123,7 +122,7 @@ public class ValuePropertyFactoryDefault implements 
ValuePropertyFactory {
 
         // special case, want to treat as a value
         if(cls.isEnum()) {
-            final StringProperty property = new StringProperty();
+            final StringSchema property = new StringSchema();
             final Object[] enumConstants = cls.getEnumConstants();
 
             final List<String> enumNames = _Lists.map(
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/_Util.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/_Util.java
index e8ab769be5..a54ad0c8f2 100644
--- 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/_Util.java
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/causeway/viewer/restfulobjects/rendering/service/swagger/internal/_Util.java
@@ -37,7 +37,9 @@ import 
org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.core.metamodel.util.Facets;
 
-import io.swagger.models.Response;
+import io.swagger.v3.oas.models.Operation;
+import io.swagger.v3.oas.models.parameters.Parameter;
+import io.swagger.v3.oas.models.responses.ApiResponse;
 import lombok.val;
 import lombok.experimental.UtilityClass;
 
@@ -100,12 +102,7 @@ final class _Util {
     }
 
     Predicate<ObjectAssociation> associationsWith(final Visibility visibility) 
{
-        return new Predicate<ObjectAssociation>() {
-            @Override
-            public boolean test(final ObjectAssociation objectAssociation) {
-                return !visibility.isPublic() || 
isVisibleForPublic(objectAssociation);
-            }
-        };
+        return objectAssociation -> !visibility.isPublic() || 
isVisibleForPublic(objectAssociation);
     }
 
     List<OneToOneAssociation> propertiesOf(
@@ -148,7 +145,7 @@ final class _Util {
         return "RO Spec v1.0, section " + section;
     }
 
-    Response withCachingHeaders(final Response response, final Caching 
caching) {
+    ApiResponse withCachingHeaders(final ApiResponse response, final Caching 
caching) {
         caching.withHeaders(response);
 
         return response;
@@ -164,4 +161,24 @@ final class _Util {
         }
         throw _Exceptions.unmatchedCase(visibility);
     }
+
+    Operation produces(final Operation operation, final String string) {
+        // TODO[ISIS-3292] Auto-generated method stub
+        return operation;
+    }
+
+    <T extends Parameter> T typed(final T parameter, final String typeLiteral) 
{
+        // TODO[ISIS-3292] Auto-generated method stub
+        return parameter;
+    }
+
+    Operation response(final Operation operation, final int code, final 
ApiResponse response) {
+        // TODO[ISIS-3292] Auto-generated method stub
+        return operation;
+    }
+
+    Operation consumes(final Operation operation, final String string) {
+        // TODO[ISIS-3292] Auto-generated method stub
+        return operation;
+    }
 }
diff --git 
a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/SwaggerSpecResource.java
 
b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/SwaggerSpecResource.java
index 88f96e7a60..29172503b3 100644
--- 
a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/SwaggerSpecResource.java
+++ 
b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/SwaggerSpecResource.java
@@ -133,6 +133,11 @@ public class SwaggerSpecResource {
 
         @Override
         public String call() throws Exception {
+
+//            return format==Format.YAML
+//                    ? _Strings.readFromResource(SwaggerSpecGenerator.class, 
"openapi-sample.yaml", StandardCharsets.UTF_8)
+//                    : _Strings.readFromResource(SwaggerSpecGenerator.class, 
"openapi-sample.json", StandardCharsets.UTF_8);
+
             return swaggerService.generateSwaggerSpec(visibility, format);
         }
 

Reply via email to