You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2017/08/05 17:23:12 UTC
[1/4] metamodel-membrane git commit: METAMODEL-1147: Created
controller models with swagger-codegen
Repository: metamodel-membrane
Updated Branches:
refs/heads/master d5419cb34 -> d9bde2a90
METAMODEL-1147: Created controller models with swagger-codegen
Project: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/commit/609cc85b
Tree: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/tree/609cc85b
Diff: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/diff/609cc85b
Branch: refs/heads/master
Commit: 609cc85b1ebb01104f0e5af38b33d44737b97ba1
Parents: d5419cb
Author: Kasper Sørensen <i....@gmail.com>
Authored: Mon Jul 31 21:47:36 2017 -0700
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Mon Jul 31 21:58:29 2017 -0700
----------------------------------------------------------------------
.gitignore | 1 +
CHANGES.md | 1 +
core/pom.xml | 5 +
.../membrane/controllers/ColumnController.java | 44 +-
.../controllers/DataSourceController.java | 33 +-
.../membrane/controllers/QueryController.java | 33 +-
.../controllers/RootInformationController.java | 40 +-
.../membrane/controllers/SchemaController.java | 27 +-
.../membrane/controllers/TableController.java | 32 +-
.../controllers/TableDataController.java | 25 +-
.../membrane/controllers/TenantController.java | 51 ++-
.../membrane/controllers/model/RestLink.java | 59 ---
core/src/main/resources/swagger.yaml | 455 +++++++++++--------
.../TenantInteractionScenarioTest.java | 14 +-
pom.xml | 1 +
swagger-codegen/pom.xml | 122 +++++
16 files changed, 543 insertions(+), 400 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index eb25b83..e1befa5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@ target/
*.ipr
*.iws
.vscode/
+.DS_Store
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/CHANGES.md
----------------------------------------------------------------------
diff --git a/CHANGES.md b/CHANGES.md
index 9610fa8..6a0a894 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,4 @@
### Apache MetaModel Membrane 0.1 [work in progress]
+* [METAMODEL-1147] - Implemented Swagger codegen to build model classes from swagger file.
* Established project source control, structure and build.
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 7042a08..c46c699 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -30,6 +30,11 @@ under the License.
<dependencies>
<dependency>
+ <groupId>org.apache.metamodel.membrane</groupId>
+ <artifactId>Membrane-swagger-model</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
<groupId>org.apache.metamodel</groupId>
<artifactId>MetaModel-spring</artifactId>
</dependency>
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java
index 6e99371..5e51a39 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/ColumnController.java
@@ -18,13 +18,12 @@
*/
package org.apache.metamodel.membrane.controllers;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
import org.apache.metamodel.DataContext;
import org.apache.metamodel.membrane.app.DataContextTraverser;
import org.apache.metamodel.membrane.app.TenantContext;
import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.swagger.model.GetColumnResponse;
+import org.apache.metamodel.membrane.swagger.model.GetColumnResponseMetadata;
import org.apache.metamodel.schema.Column;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
@@ -48,7 +47,7 @@ public class ColumnController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
- public Map<String, Object> get(@PathVariable("tenant") String tenantId,
+ public GetColumnResponse get(@PathVariable("tenant") String tenantId,
@PathVariable("dataContext") String dataSourceName, @PathVariable("schema") String schemaId,
@PathVariable("table") String tableId, @PathVariable("column") String columnId) {
final TenantContext tenantContext = tenantRegistry.getTenantContext(tenantId);
@@ -62,25 +61,24 @@ public class ColumnController {
final String tableName = column.getTable().getName();
final String schemaName = column.getTable().getSchema().getName();
- final Map<String, Object> metadata = new LinkedHashMap<>();
- metadata.put("number", column.getColumnNumber());
- metadata.put("size", column.getColumnSize());
- metadata.put("nullable", column.isNullable());
- metadata.put("primary-key", column.isPrimaryKey());
- metadata.put("indexed", column.isIndexed());
- metadata.put("column-type", column.getType() == null ? null : column.getType().getName());
- metadata.put("native-type", column.getNativeType());
- metadata.put("remarks", column.getRemarks());
-
- final Map<String, Object> map = new LinkedHashMap<>();
- map.put("type", "column");
- map.put("name", column.getName());
- map.put("table", tableName);
- map.put("schema", schemaName);
- map.put("datasource", dataSourceName);
- map.put("tenant", tenantName);
- map.put("metadata", metadata);
+ final GetColumnResponseMetadata metadata = new GetColumnResponseMetadata();
+ metadata.number(column.getColumnNumber());
+ metadata.size(column.getColumnSize());
+ metadata.nullable(column.isNullable());
+ metadata.primaryKey(column.isPrimaryKey());
+ metadata.indexed(column.isIndexed());
+ metadata.columnType(column.getType() == null ? null : column.getType().getName());
+ metadata.nativeType(column.getNativeType());
+ metadata.remarks(column.getRemarks());
- return map;
+ final GetColumnResponse response = new GetColumnResponse();
+ response.type("column");
+ response.name(column.getName());
+ response.table(tableName);
+ response.schema(schemaName);
+ response.datasource(dataSourceName);
+ response.tenant(tenantName);
+ response.metadata(metadata);
+ return response ;
}
}
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java
index c9df027..309893e 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/DataSourceController.java
@@ -20,7 +20,6 @@ package org.apache.metamodel.membrane.controllers;
import java.util.Arrays;
import java.util.HashMap;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -35,7 +34,8 @@ import org.apache.metamodel.factory.DataContextPropertiesImpl;
import org.apache.metamodel.membrane.app.TenantContext;
import org.apache.metamodel.membrane.app.TenantRegistry;
import org.apache.metamodel.membrane.controllers.model.RestDataSourceDefinition;
-import org.apache.metamodel.membrane.controllers.model.RestLink;
+import org.apache.metamodel.membrane.swagger.model.GetDatasourceResponse;
+import org.apache.metamodel.membrane.swagger.model.GetDatasourceResponseSchemas;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
@@ -58,7 +58,7 @@ public class DataSourceController {
@RequestMapping(method = RequestMethod.PUT)
@ResponseBody
- public Map<String, Object> put(@PathVariable("tenant") String tenantId,
+ public GetDatasourceResponse put(@PathVariable("tenant") String tenantId,
@PathVariable("datasource") String dataSourceId,
@Valid @RequestBody RestDataSourceDefinition dataContextDefinition) {
@@ -81,7 +81,7 @@ public class DataSourceController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
- public Map<String, Object> get(@PathVariable("tenant") String tenantId,
+ public GetDatasourceResponse get(@PathVariable("tenant") String tenantId,
@PathVariable("datasource") String dataSourceName) {
final TenantContext tenantContext = tenantRegistry.getTenantContext(tenantId);
final DataContext dataContext = tenantContext.getDataSourceRegistry().openDataContext(dataSourceName);
@@ -89,16 +89,19 @@ public class DataSourceController {
final String tenantName = tenantContext.getTenantName();
final UriBuilder uriBuilder = UriBuilder.fromPath("/{tenant}/{dataContext}/s/{schema}");
- final List<RestLink> schemaLinks = Arrays.stream(dataContext.getSchemaNames()).map(s -> new RestLink(s,
- uriBuilder.build(tenantName, dataSourceName, s))).collect(Collectors.toList());
-
- final Map<String, Object> map = new LinkedHashMap<>();
- map.put("type", "datasource");
- map.put("name", dataSourceName);
- map.put("tenant", tenantName);
- map.put("updateable", dataContext instanceof UpdateableDataContext);
- map.put("query_uri", UriBuilder.fromPath("/{tenant}/{dataContext}/query").build(tenantName, dataSourceName));
- map.put("schemas", schemaLinks);
- return map;
+ final List<GetDatasourceResponseSchemas> schemaLinks = Arrays.stream(dataContext.getSchemaNames()).map(s -> {
+ final String uri = uriBuilder.build(tenantName, dataSourceName, s).toString();
+ return new GetDatasourceResponseSchemas().name(s).uri(uri);
+ }).collect(Collectors.toList());
+
+ final GetDatasourceResponse resp = new GetDatasourceResponse();
+ resp.type("datasource");
+ resp.name(dataSourceName);
+ resp.tenant(tenantName);
+ resp.updateable(dataContext instanceof UpdateableDataContext);
+ resp.queryUri(UriBuilder.fromPath("/{tenant}/{dataContext}/query").build(tenantName, dataSourceName)
+ .toString());
+ resp.schemas(schemaLinks);
+ return resp;
}
}
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java
index 1cd6ed6..7cf90b5 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/QueryController.java
@@ -18,15 +18,16 @@
*/
package org.apache.metamodel.membrane.controllers;
+import java.util.ArrayList;
import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.List;
import java.util.stream.Collectors;
import org.apache.metamodel.DataContext;
import org.apache.metamodel.data.DataSet;
import org.apache.metamodel.membrane.app.TenantContext;
import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.swagger.model.QueryResponse;
import org.apache.metamodel.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
@@ -51,7 +52,7 @@ public class QueryController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
- public Map<String, Object> get(@PathVariable("tenant") String tenantId,
+ public QueryResponse get(@PathVariable("tenant") String tenantId,
@PathVariable("dataContext") String dataSourceName,
@RequestParam(value = "sql", required = true) String queryString,
@RequestParam(value = "offset", required = false) Integer offset,
@@ -60,11 +61,11 @@ public class QueryController {
final DataContext dataContext = tenantContext.getDataSourceRegistry().openDataContext(dataSourceName);
final Query query = dataContext.parseQuery(queryString);
-
+
return executeQuery(dataContext, query, offset, limit);
}
- public static Map<String, Object> executeQuery(DataContext dataContext, Query query, Integer offset, Integer limit) {
+ public static QueryResponse executeQuery(DataContext dataContext, Query query, Integer offset, Integer limit) {
if (offset != null) {
query.setFirstRow(offset);
@@ -73,13 +74,21 @@ public class QueryController {
query.setMaxRows(limit);
}
- final DataSet dataSet = dataContext.executeQuery(query);
+ final List<String> headers;
+ final List<List<Object>> data = new ArrayList<>();
+
+ try (final DataSet dataSet = dataContext.executeQuery(query)) {
+ headers = Arrays.stream(dataSet.getSelectItems()).map((si) -> si.toString()).collect(Collectors.toList());
+ while (dataSet.next()) {
+ final Object[] values = dataSet.getRow().getValues();
+ data.add(Arrays.asList(values));
+ }
+ }
- final Map<String, Object> map = new LinkedHashMap<>();
- map.put("type", "dataset");
- map.put("header", Arrays.stream(dataSet.getSelectItems()).map((si) -> si.toString()).collect(Collectors
- .toList()));
- map.put("data", dataSet.toObjectArrays());
- return map;
+ final QueryResponse resp = new QueryResponse();
+ resp.type("dataset");
+ resp.headers(headers);
+ resp.data(data);
+ return resp;
}
}
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/core/src/main/java/org/apache/metamodel/membrane/controllers/RootInformationController.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/RootInformationController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/RootInformationController.java
index 0a624aa..49fad5d 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/RootInformationController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/RootInformationController.java
@@ -23,12 +23,13 @@ import java.net.InetAddress;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.Map;
import java.util.Properties;
import javax.servlet.ServletContext;
+import org.apache.metamodel.membrane.swagger.model.HelloResponse;
+import org.apache.metamodel.membrane.swagger.model.HelloResponseOpenapi;
+import org.apache.metamodel.membrane.swagger.model.HelloResponseServertime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -48,35 +49,34 @@ public class RootInformationController {
@RequestMapping(method = RequestMethod.GET, value = "/", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
- public Map<String, Object> index() {
- final Map<String, Object> map = new LinkedHashMap<>();
- map.put("ping", "pong!");
- map.put("application", "Apache MetaModel Membrane");
- map.put("version", getVersion());
- map.put("server-time", getServerTime());
+ public HelloResponse index() {
+ final HelloResponse resp = new HelloResponse();
+ resp.ping("pong!");
+ resp.application("Apache MetaModel Membrane");
+ resp.version(getVersion());
+ resp.serverTime(getServerTime());
try {
- map.put("canonical-hostname", InetAddress.getLocalHost().getCanonicalHostName());
+ resp.canonicalHostname(InetAddress.getLocalHost().getCanonicalHostName());
} catch (Exception e) {
logger.info("Failed to get canonical-hostname", e);
}
- map.put("open-api", getOpenApi());
- return map;
+ resp.openApi(getOpenApi());
+ return resp;
}
- private Map<String, Object> getOpenApi() {
- final Map<String, Object> map = new LinkedHashMap<>();
- map.put("spec", servletContext.getContextPath() + "/swagger.json");
- return map;
+ private HelloResponseOpenapi getOpenApi() {
+ final String swaggerUri = servletContext.getContextPath() + "/swagger.json";
+ return new HelloResponseOpenapi().spec(swaggerUri);
}
- private Map<String, Object> getServerTime() {
+ private HelloResponseServertime getServerTime() {
final ZonedDateTime now = ZonedDateTime.now();
final String dateFormatted = now.format(DateTimeFormatter.ISO_INSTANT);
- final Map<String, Object> map = new LinkedHashMap<>();
- map.put("timestamp", new Date().getTime());
- map.put("iso8601", dateFormatted);
- return map;
+ final HelloResponseServertime serverTime = new HelloResponseServertime();
+ serverTime.timestamp(new Date().getTime());
+ serverTime.iso8601(dateFormatted);
+ return serverTime;
}
/**
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java
index 0332138..0fdf49b 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/SchemaController.java
@@ -19,9 +19,7 @@
package org.apache.metamodel.membrane.controllers;
import java.util.Arrays;
-import java.util.LinkedHashMap;
import java.util.List;
-import java.util.Map;
import java.util.stream.Collectors;
import javax.ws.rs.core.UriBuilder;
@@ -30,7 +28,8 @@ import org.apache.metamodel.DataContext;
import org.apache.metamodel.membrane.app.DataContextTraverser;
import org.apache.metamodel.membrane.app.TenantContext;
import org.apache.metamodel.membrane.app.TenantRegistry;
-import org.apache.metamodel.membrane.controllers.model.RestLink;
+import org.apache.metamodel.membrane.swagger.model.GetSchemaResponse;
+import org.apache.metamodel.membrane.swagger.model.GetSchemaResponseTables;
import org.apache.metamodel.schema.Schema;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
@@ -54,7 +53,7 @@ public class SchemaController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
- public Map<String, Object> get(@PathVariable("tenant") String tenantId,
+ public GetSchemaResponse get(@PathVariable("tenant") String tenantId,
@PathVariable("dataContext") String dataSourceName, @PathVariable("schema") String schemaId) {
final TenantContext tenantContext = tenantRegistry.getTenantContext(tenantId);
final DataContext dataContext = tenantContext.getDataSourceRegistry().openDataContext(dataSourceName);
@@ -66,15 +65,17 @@ public class SchemaController {
final UriBuilder uriBuilder = UriBuilder.fromPath("/{tenant}/{dataContext}/s/{schema}/t/{table}");
final String schemaName = schema.getName();
- final List<RestLink> tableLinks = Arrays.stream(schema.getTableNames()).map(t -> new RestLink(String.valueOf(t),
- uriBuilder.build(tenantName, dataSourceName, schemaName, t))).collect(Collectors.toList());
+ final List<GetSchemaResponseTables> tableLinks = Arrays.stream(schema.getTableNames()).map(t -> {
+ final String uri = uriBuilder.build(tenantName, dataSourceName, schemaName, t).toString();
+ return new GetSchemaResponseTables().name(String.valueOf(t)).uri(uri);
+ }).collect(Collectors.toList());
- final Map<String, Object> map = new LinkedHashMap<>();
- map.put("type", "schema");
- map.put("name", schemaName);
- map.put("datasource", dataSourceName);
- map.put("tenant", tenantName);
- map.put("tables", tableLinks);
- return map;
+ final GetSchemaResponse resp = new GetSchemaResponse();
+ resp.type("schema");
+ resp.name(schemaName);
+ resp.datasource(dataSourceName);
+ resp.tenant(tenantName);
+ resp.tables(tableLinks);
+ return resp;
}
}
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java
index 82f568d..f43f598 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableController.java
@@ -19,9 +19,7 @@
package org.apache.metamodel.membrane.controllers;
import java.util.Arrays;
-import java.util.LinkedHashMap;
import java.util.List;
-import java.util.Map;
import java.util.stream.Collectors;
import javax.ws.rs.core.UriBuilder;
@@ -30,7 +28,8 @@ import org.apache.metamodel.DataContext;
import org.apache.metamodel.membrane.app.DataContextTraverser;
import org.apache.metamodel.membrane.app.TenantContext;
import org.apache.metamodel.membrane.app.TenantRegistry;
-import org.apache.metamodel.membrane.controllers.model.RestLink;
+import org.apache.metamodel.membrane.swagger.model.GetTableResponse;
+import org.apache.metamodel.membrane.swagger.model.GetTableResponseColumns;
import org.apache.metamodel.schema.Table;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
@@ -54,12 +53,12 @@ public class TableController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
- public Map<String, Object> get(@PathVariable("tenant") String tenantId,
+ public GetTableResponse get(@PathVariable("tenant") String tenantId,
@PathVariable("dataContext") String dataSourceName, @PathVariable("schema") String schemaId,
@PathVariable("table") String tableId) {
final TenantContext tenantContext = tenantRegistry.getTenantContext(tenantId);
final DataContext dataContext = tenantContext.getDataSourceRegistry().openDataContext(dataSourceName);
-
+
final DataContextTraverser traverser = new DataContextTraverser(dataContext);
final Table table = traverser.getTable(schemaId, tableId);
@@ -69,17 +68,18 @@ public class TableController {
final String tableName = table.getName();
final String schemaName = table.getSchema().getName();
- final List<RestLink> columnsLinks = Arrays.stream(table.getColumnNames()).map(c -> new RestLink(String.valueOf(
- c), uriBuilder.build(tenantName, dataSourceName, schemaName, tableName, c))).collect(Collectors
- .toList());
+ final List<GetTableResponseColumns> columnsLinks = Arrays.stream(table.getColumnNames()).map(c -> {
+ final String uri = uriBuilder.build(tenantName, dataSourceName, schemaName, tableName, c).toString();
+ return new GetTableResponseColumns().name(c).uri(uri);
+ }).collect(Collectors.toList());
- final Map<String, Object> map = new LinkedHashMap<>();
- map.put("type", "table");
- map.put("name", tableName);
- map.put("schema", schemaName);
- map.put("datasource", dataSourceName);
- map.put("tenant", tenantName);
- map.put("columns", columnsLinks);
- return map;
+ final GetTableResponse resp = new GetTableResponse();
+ resp.type("table");
+ resp.name(tableName);
+ resp.schema(schemaName);
+ resp.datasource(dataSourceName);
+ resp.tenant(tenantName);
+ resp.columns(columnsLinks);
+ return resp;
}
}
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java
index e906556..91d2588 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/TableDataController.java
@@ -18,7 +18,7 @@
*/
package org.apache.metamodel.membrane.controllers;
-import java.util.LinkedHashMap;
+import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -32,6 +32,8 @@ import org.apache.metamodel.insert.RowInsertionBuilder;
import org.apache.metamodel.membrane.app.DataContextTraverser;
import org.apache.metamodel.membrane.app.TenantContext;
import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.swagger.model.InsertionResponse;
+import org.apache.metamodel.membrane.swagger.model.QueryResponse;
import org.apache.metamodel.query.Query;
import org.apache.metamodel.schema.Table;
import org.springframework.beans.factory.annotation.Autowired;
@@ -44,6 +46,8 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
+import com.google.common.collect.Lists;
+
@RestController
@RequestMapping(value = { "/{tenant}/{dataContext}/schemas/{schema}/tables/{table}/data",
"/{tenant}/{dataContext}/s/{schema}/t/{table}/d" }, produces = MediaType.APPLICATION_JSON_VALUE)
@@ -58,13 +62,13 @@ public class TableDataController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
- public Map<String, Object> get(@PathVariable("tenant") String tenantId,
+ public QueryResponse get(@PathVariable("tenant") String tenantId,
@PathVariable("dataContext") String dataSourceName, @PathVariable("schema") String schemaId,
@PathVariable("table") String tableId, @RequestParam(value = "offset", required = false) Integer offset,
@RequestParam(value = "limit", required = false) Integer limit) {
final TenantContext tenantContext = tenantRegistry.getTenantContext(tenantId);
final DataContext dataContext = tenantContext.getDataSourceRegistry().openDataContext(dataSourceName);
-
+
final DataContextTraverser traverser = new DataContextTraverser(dataContext);
final Table table = traverser.getTable(schemaId, tableId);
@@ -76,12 +80,13 @@ public class TableDataController {
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
- public Map<String, Object> post(@PathVariable("tenant") String tenantId,
+ public InsertionResponse post(@PathVariable("tenant") String tenantId,
@PathVariable("dataContext") String dataSourceName, @PathVariable("schema") String schemaId,
@PathVariable("table") String tableId, @RequestBody final List<Map<String, Object>> inputRecords) {
final TenantContext tenantContext = tenantRegistry.getTenantContext(tenantId);
- final UpdateableDataContext dataContext = tenantContext.getDataSourceRegistry().openDataContextForUpdate(dataSourceName);
+ final UpdateableDataContext dataContext = tenantContext.getDataSourceRegistry().openDataContextForUpdate(
+ dataSourceName);
final DataContextTraverser traverser = new DataContextTraverser(dataContext);
@@ -100,14 +105,16 @@ public class TableDataController {
}
});
- final Map<String, Object> response = new LinkedHashMap<>();
- response.put("status", "ok");
+ final InsertionResponse response = new InsertionResponse();
+ response.status("ok");
if (result.getInsertedRows().isPresent()) {
- response.put("inserted-rows", result.getInsertedRows().get());
+ final Integer insertedRecords = result.getInsertedRows().get();
+ response.insertedRows(new BigDecimal(insertedRecords));
}
if (result.getGeneratedKeys().isPresent()) {
- response.put("generated-keys", result.getGeneratedKeys().get());
+ final Iterable<Object> keys = result.getGeneratedKeys().get();
+ response.generatedKeys(Lists.newArrayList(keys));
}
return response;
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java
index c4af271..76197a1 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/controllers/TenantController.java
@@ -18,16 +18,17 @@
*/
package org.apache.metamodel.membrane.controllers;
-import java.util.LinkedHashMap;
+import java.util.Collections;
import java.util.List;
-import java.util.Map;
import java.util.stream.Collectors;
import javax.ws.rs.core.UriBuilder;
import org.apache.metamodel.membrane.app.TenantContext;
import org.apache.metamodel.membrane.app.TenantRegistry;
-import org.apache.metamodel.membrane.controllers.model.RestLink;
+import org.apache.metamodel.membrane.swagger.model.DeleteTenantResponse;
+import org.apache.metamodel.membrane.swagger.model.GetTenantResponse;
+import org.apache.metamodel.membrane.swagger.model.GetTenantResponseDatasources;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
@@ -49,46 +50,48 @@ public class TenantController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
- public Map<String, Object> getTenant(@PathVariable("tenant") String tenantName) {
+ public GetTenantResponse getTenant(@PathVariable("tenant") String tenantName) {
final TenantContext tenantContext = tenantRegistry.getTenantContext(tenantName);
final String tenantNameNormalized = tenantContext.getTenantName();
final UriBuilder uriBuilder = UriBuilder.fromPath("/{tenant}/{datasource}");
final List<String> dataContextIdentifiers = tenantContext.getDataSourceRegistry().getDataSourceNames();
- final List<RestLink> dataSourceLinks = dataContextIdentifiers.stream().map(s -> new RestLink(s, uriBuilder
- .build(tenantNameNormalized, s))).collect(Collectors.toList());
-
- final Map<String, Object> map = new LinkedHashMap<>();
- map.put("type", "tenant");
- map.put("name", tenantNameNormalized);
- map.put("datasources", dataSourceLinks);
- return map;
+ final List<GetTenantResponseDatasources> dataSourceLinks = dataContextIdentifiers.stream().map(s -> {
+ final String uri = uriBuilder.build(tenantNameNormalized, s).toString();
+ return new GetTenantResponseDatasources().name(s).uri(uri);
+ }).collect(Collectors.toList());
+
+ final GetTenantResponse resp = new GetTenantResponse();
+ resp.type("tenant");
+ resp.name(tenantNameNormalized);
+ resp.datasources(dataSourceLinks);
+ return resp;
}
@RequestMapping(method = RequestMethod.PUT)
@ResponseBody
- public Map<String, Object> putTenant(@PathVariable("tenant") String tenantName) {
+ public GetTenantResponse putTenant(@PathVariable("tenant") String tenantName) {
final TenantContext tenantContext = tenantRegistry.createTenantContext(tenantName);
final String tenantIdentifier = tenantContext.getTenantName();
- final Map<String, Object> map = new LinkedHashMap<>();
- map.put("type", "tenant");
- map.put("name", tenantIdentifier);
-
- return map;
+ final GetTenantResponse resp = new GetTenantResponse();
+ resp.type("tenant");
+ resp.name(tenantIdentifier);
+ resp.datasources(Collections.emptyList());
+ return resp;
}
@RequestMapping(method = RequestMethod.DELETE)
@ResponseBody
- public Map<String, Object> deleteTenant(@PathVariable("tenant") String tenantName) {
+ public DeleteTenantResponse deleteTenant(@PathVariable("tenant") String tenantName) {
tenantRegistry.deleteTenantContext(tenantName);
- final Map<String, Object> map = new LinkedHashMap<>();
- map.put("type", "tenant");
- map.put("name", tenantName);
- map.put("deleted", true);
+ final DeleteTenantResponse resp = new DeleteTenantResponse();
+ resp.type("tenant");
+ resp.name(tenantName);
+ resp.deleted(true);
- return map;
+ return resp;
}
}
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/core/src/main/java/org/apache/metamodel/membrane/controllers/model/RestLink.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/membrane/controllers/model/RestLink.java b/core/src/main/java/org/apache/metamodel/membrane/controllers/model/RestLink.java
deleted file mode 100644
index cde135c..0000000
--- a/core/src/main/java/org/apache/metamodel/membrane/controllers/model/RestLink.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.metamodel.membrane.controllers.model;
-
-import java.io.Serializable;
-import java.net.URI;
-
-/**
- * Represents a hyper-link to a service (typically provided in the REST
- * responses)
- */
-public class RestLink implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- private String name;
- private URI uri;
-
- public RestLink() {
- }
-
- public RestLink(final String name, final URI uri) {
- this();
- this.name = name;
- this.uri = uri;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(final String name) {
- this.name = name;
- }
-
- public URI getUri() {
- return uri;
- }
-
- public void setUri(final URI uri) {
- this.uri = uri;
- }
-}
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/core/src/main/resources/swagger.yaml
----------------------------------------------------------------------
diff --git a/core/src/main/resources/swagger.yaml b/core/src/main/resources/swagger.yaml
index dc5ef93..0666728 100644
--- a/core/src/main/resources/swagger.yaml
+++ b/core/src/main/resources/swagger.yaml
@@ -38,30 +38,7 @@ paths:
200:
description: The system is operational
schema:
- type: object
- properties:
- ping:
- type: string
- description: Should return 'pong!' when the system is operational
- application:
- type: string
- description: The name of the application running (Apache MetaModel Membrane)
- version:
- type: string
- description: The version of the application running
- server-time:
- type: object
- properties:
- timestamp:
- type: integer
- format: int64
- description: The server-time in timestamp format (millis since 1st of January 1970)
- iso8601:
- type: string
- description: The server-time in ISO-8601 format
- canonical-hostname:
- type: string
- description: The canonical hostname of the server
+ $ref: "#/definitions/helloResponse"
/{tenant}:
parameters:
- name: tenant
@@ -75,13 +52,7 @@ paths:
200:
description: Tenant created
schema:
- properties:
- type:
- type: string
- description: The type of entity (tenant)
- name:
- type: string
- description: The tenant name/identifier
+ $ref: "#/definitions/putTenantResponse"
409:
description: Tenant already exist
schema:
@@ -97,26 +68,7 @@ paths:
200:
description: Tenant found
schema:
- type: object
- properties:
- type:
- type: string
- description: The type of entity (tenant)
- name:
- type: string
- description: The tenant name/identifier
- datasources:
- type: array
- items:
- type: object
- properties:
- name:
- type: string
- description: The name of the datasource
- uri:
- type: string
- format: uri
- description: A link to the datasource information
+ $ref: "#/definitions/getTenantResponse"
delete:
summary: Delete tenant
description: Deletes a tenant from the system
@@ -124,14 +76,7 @@ paths:
200:
description: Tenant deleted
schema:
- type: object
- properties:
- type:
- type: string
- description: The type of entity (tenant)
- name:
- type: string
- description: The tenant name/identifier
+ ref: "#/definitions/deleteTenantResponse"
404:
description: Tenant not found
schema:
@@ -153,37 +98,7 @@ paths:
200:
description: Datasource found
schema:
- type: object
- properties:
- type:
- type: string
- description: The type of entity (datasource)
- name:
- type: string
- description: The datasource name
- tenant:
- type: string
- description: The tenant name
- updateable:
- type: boolean
- description: Is this datasource updateable?
- query_uri:
- type: string
- description: A link to the query endpoint for this datasource
- format: uri
- schemas:
- type: array
- description: The schemas of this datasource
- items:
- type: object
- properties:
- name:
- type: string
- description: The schema name
- uri:
- type: string
- description: A link to the schema information
- format: uri
+ $ref: "#/definitions/getDatasourceResponse"
404:
description: Datasource not found
schema:
@@ -195,10 +110,12 @@ paths:
description: The definition of the datasource using properties. The same properties as normally applied in MetaModel factories (e.g. 'type', 'resource', 'url', 'driver-class' ,'hostname', 'port', 'catalog', 'database', 'username', 'port', 'table-defs') are used here.
required: true
schema:
- type: object
+ $ref: "#/definitions/putDatasourceResponse"
responses:
200:
description: Datasource created
+ schema:
+ $ref: "#/definitions/getDatasourceResponse"
/{tenant}/{datasource}/q:
parameters:
- name: tenant
@@ -268,30 +185,7 @@ paths:
200:
description: Schema found
schema:
- type: object
- properties:
- type:
- type: string
- description: The type of entity (schema)
- name:
- type: string
- description: The schema name
- datasource:
- type: string
- description: The datasource name
- tables:
- type: array
- description: The names of the schema's tables
- items:
- type: object
- properties:
- name:
- type: string
- description: The table name
- uri:
- type: string
- description: A link to the table information
- format: uri
+ $ref: "#/definitions/getSchemaResponse"
404:
description: Schema not found
schema:
@@ -323,36 +217,7 @@ paths:
200:
description: Table found
schema:
- type: object
- properties:
- type:
- type: string
- description: The type of entity (table)
- name:
- type: string
- description: The table name
- schema:
- type: string
- description: The schema name
- datasource:
- type: string
- description: The datasource name
- tenant:
- type: string
- description: The tenant name
- columns:
- type: array
- description: The names of the table's columns
- items:
- type: object
- properties:
- name:
- type: string
- description: The column name
- uri:
- type: string
- description: A link to the column information
- format: uri
+ $ref: "#/definitions/getTableResponse"
404:
description: Table not found
schema:
@@ -406,14 +271,12 @@ paths:
description: The data to insert
required: true
schema:
- type: array
- items:
- description: A record to insert where each key is expected to match a column name and each value is the value to put.
- type: object
+ $ref: "#/definitions/insertionRequest"
responses:
200:
description: Data inserted
- #TODO
+ schema:
+ $ref: "#/definitions/insertionResponse"
404:
description: Table not found
schema:
@@ -451,54 +314,7 @@ paths:
200:
description: Query executed
schema:
- type: object
- properties:
- type:
- type: string
- description: The type of entity (column)
- name:
- type: string
- description: The column name
- table:
- type: string
- description: The table name
- schema:
- type: string
- description: The schema name
- datasource:
- type: string
- description: The datasource name
- tenant:
- type: string
- description: The tenant name
- metadata:
- type: object
- description: Metadata about the column
- properties:
- number:
- type: integer
- description: The column number (0-based)
- size:
- type: integer
- description: The column size
- nullable:
- type: boolean
- description: Is the column nullable?
- primary-key:
- type: boolean
- description: Is the column a primary key?
- indexed:
- type: boolean
- description: Is the column indexed?
- column-type:
- type: string
- description: The column type (as interpreted/adapted by Apache MetaModel)
- native-type:
- type: string
- description: The native column type (as defined by the datasource itself)
- remarks:
- type: string
- description: Any remarks on the column
+ $ref: "#/definitions/getColumnResponse"
404:
description: Column not found
schema:
@@ -523,6 +339,249 @@ definitions:
type: array
items:
type: object
+ helloResponse:
+ type: object
+ properties:
+ ping:
+ type: string
+ description: Should return 'pong!' when the system is operational
+ application:
+ type: string
+ description: The name of the application running (Apache MetaModel Membrane)
+ version:
+ type: string
+ description: The version of the application running
+ server-time:
+ type: object
+ properties:
+ timestamp:
+ type: integer
+ format: int64
+ description: The server-time in timestamp format (millis since 1st of January 1970)
+ iso8601:
+ type: string
+ description: The server-time in ISO-8601 format
+ canonical-hostname:
+ type: string
+ description: The canonical hostname of the server
+ open-api:
+ type: object
+ properties:
+ spec:
+ type: string
+ format: uri
+ description: Href for the Open API (fka. Swagger) specification that describes the service.
+ getTenantResponse:
+ type: object
+ properties:
+ type:
+ type: string
+ description: The type of entity (tenant)
+ name:
+ type: string
+ description: The tenant name/identifier
+ datasources:
+ type: array
+ items:
+ type: object
+ properties:
+ name:
+ type: string
+ description: The name of the datasource
+ uri:
+ type: string
+ format: uri
+ description: A link to the datasource information
+ putTenantResponse:
+ type: object
+ properties:
+ type:
+ type: string
+ description: The type of entity (tenant)
+ name:
+ type: string
+ description: The tenant name/identifier
+ deleteTenantResponse:
+ type: object
+ properties:
+ type:
+ type: string
+ description: The type of entity (tenant)
+ name:
+ type: string
+ description: The tenant name/identifier
+ deleted:
+ type: boolean
+ description: A confirmation boolean to indicate that the deletion is effectuated.
+ insertionRequest:
+ type: array
+ items:
+ description: A record to insert where each key is expected to match a column name and each value is the value to put.
+ type: object
+ insertionResponse:
+ description: Represents the result of inserting records to a table
+ type: object
+ properties:
+ status:
+ type: string
+ description: A confirmation 'ok' that the insertion went well.
+ inserted-rows:
+ type: number
+ format: int32
+ description: The amount of inserted records
+ generated-keys:
+ type: array
+ description: An array of generated keys for the records, if any
+ items:
+ type: object
+ putDatasourceResponse:
+ type: object
+ properties:
+ type:
+ type: string
+ description: DataContext type (e.g. 'jdbc', 'csv' etc.)
+ additionalProperties:
+ type: string
+ getDatasourceResponse:
+ type: object
+ properties:
+ type:
+ type: string
+ description: The type of entity (datasource)
+ name:
+ type: string
+ description: The datasource name
+ tenant:
+ type: string
+ description: The tenant name
+ updateable:
+ type: boolean
+ description: Is this datasource updateable?
+ query_uri:
+ type: string
+ description: A link to the query endpoint for this datasource
+ format: uri
+ schemas:
+ type: array
+ description: The schemas of this datasource
+ items:
+ type: object
+ properties:
+ name:
+ type: string
+ description: The schema name
+ uri:
+ type: string
+ description: A link to the schema information
+ format: uri
+ getSchemaResponse:
+ type: object
+ properties:
+ type:
+ type: string
+ description: The type of entity (schema)
+ name:
+ type: string
+ description: The schema name
+ datasource:
+ type: string
+ description: The datasource name
+ tenant:
+ type: string
+ description: The tenant name
+ tables:
+ type: array
+ description: The names of the schema's tables
+ items:
+ type: object
+ properties:
+ name:
+ type: string
+ description: The table name
+ uri:
+ type: string
+ description: A link to the table information
+ format: uri
+ getTableResponse:
+ type: object
+ properties:
+ type:
+ type: string
+ description: The type of entity (table)
+ name:
+ type: string
+ description: The table name
+ schema:
+ type: string
+ description: The schema name
+ datasource:
+ type: string
+ description: The datasource name
+ tenant:
+ type: string
+ description: The tenant name
+ columns:
+ type: array
+ description: The names of the table's columns
+ items:
+ type: object
+ properties:
+ name:
+ type: string
+ description: The column name
+ uri:
+ type: string
+ description: A link to the column information
+ format: uri
+ getColumnResponse:
+ type: object
+ properties:
+ type:
+ type: string
+ description: The type of entity (column)
+ name:
+ type: string
+ description: The column name
+ table:
+ type: string
+ description: The table name
+ schema:
+ type: string
+ description: The schema name
+ datasource:
+ type: string
+ description: The datasource name
+ tenant:
+ type: string
+ description: The tenant name
+ metadata:
+ type: object
+ description: Metadata about the column
+ properties:
+ number:
+ type: integer
+ description: The column number (0-based)
+ size:
+ type: integer
+ description: The column size
+ nullable:
+ type: boolean
+ description: Is the column nullable?
+ primary-key:
+ type: boolean
+ description: Is the column a primary key?
+ indexed:
+ type: boolean
+ description: Is the column indexed?
+ column-type:
+ type: string
+ description: The column type (as interpreted/adapted by Apache MetaModel)
+ native-type:
+ type: string
+ description: The native column type (as defined by the datasource itself)
+ remarks:
+ type: string
+ description: Any remarks on the column
error:
description: Elaborates the error that occurred
type: object
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java b/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
index 4c01e53..59dfbb0 100644
--- a/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
+++ b/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
@@ -19,19 +19,11 @@
package org.apache.metamodel.membrane.controllers;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
import java.util.Map;
import org.apache.metamodel.membrane.app.InMemoryTenantRegistry;
import org.apache.metamodel.membrane.app.TenantRegistry;
-import org.apache.metamodel.membrane.controllers.ColumnController;
-import org.apache.metamodel.membrane.controllers.DataSourceController;
-import org.apache.metamodel.membrane.controllers.QueryController;
-import org.apache.metamodel.membrane.controllers.SchemaController;
-import org.apache.metamodel.membrane.controllers.TableController;
-import org.apache.metamodel.membrane.controllers.TableDataController;
-import org.apache.metamodel.membrane.controllers.TenantController;
import org.junit.Before;
import org.junit.Test;
import org.springframework.http.MediaType;
@@ -73,7 +65,7 @@ public class TenantInteractionScenarioTest {
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("tenant", map.get("type"));
assertEquals("tenant1", map.get("name"));
- assertNull(map.get("datasources"));
+ assertEquals("[]", map.get("datasources").toString());
}
// create datasource
@@ -157,7 +149,7 @@ public class TenantInteractionScenarioTest {
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("dataset", map.get("type"));
- assertEquals("[columns.name, columns.table]", map.get("header").toString());
+ assertEquals("[columns.name, columns.table]", map.get("headers").toString());
assertEquals("[[bar, foo], [baz, foo], [greeting, hello_world], [who, hello_world]]", map.get("data")
.toString());
}
@@ -194,7 +186,7 @@ public class TenantInteractionScenarioTest {
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("dataset", map.get("type"));
- assertEquals("[hello_world.greeting, hello_world.who AS who_is_it]", map.get("header").toString());
+ assertEquals("[hello_world.greeting, hello_world.who AS who_is_it]", map.get("headers").toString());
assertEquals("[[Howdy, MetaModel], [Hi, Apache]]", map.get("data")
.toString());
}
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index ebac406..46d967b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -43,6 +43,7 @@ under the License.
<inceptionYear>2017</inceptionYear>
<packaging>pom</packaging>
<modules>
+ <module>swagger-codegen</module>
<module>core</module>
<module>war</module>
<module>undertow</module>
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/609cc85b/swagger-codegen/pom.xml
----------------------------------------------------------------------
diff --git a/swagger-codegen/pom.xml b/swagger-codegen/pom.xml
new file mode 100644
index 0000000..5f50f49
--- /dev/null
+++ b/swagger-codegen/pom.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.apache.metamodel.membrane</groupId>
+ <artifactId>Membrane-parent</artifactId>
+ <version>0.1-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>Membrane-swagger-model</artifactId>
+ <packaging>jar</packaging>
+
+ <properties>
+ <swagger.version>2.2.3</swagger.version>
+ <jersey-version>2.22.2</jersey-version>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>io.swagger</groupId>
+ <artifactId>swagger-codegen-maven-plugin</artifactId>
+ <version>${swagger.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ <configuration>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>Membrane-swagger-model</artifactId>
+ <inputSpec>${project.basedir}/../core/src/main/resources/swagger.yaml</inputSpec>
+ <language>java</language>
+ <modelPackage>org.apache.metamodel.membrane.swagger.model</modelPackage>
+ <apiPackage>org.apache.metamodel.membrane.swagger.api</apiPackage>
+ <invokerPackage>org.apache.metamodel.membrane.swagger.invoker</invokerPackage>
+ <library>jersey2</library>
+ <configOptions>
+ <sourceFolder>src/gen/java/main</sourceFolder>
+ <dateLibrary>java8</dateLibrary>
+ </configOptions>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>io.swagger</groupId>
+ <artifactId>swagger-annotations</artifactId>
+ <version>1.5.16</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.datatype</groupId>
+ <artifactId>jackson-datatype-jsr310</artifactId>
+ <version>${jackson.version}</version>
+ </dependency>
+ <!--
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-validator</artifactId>
+ </dependency>
+ -->
+
+ <!-- Client-side dependencies that swagger-codegen requires for client-stubs,
+ but we don't need them on the server side -->
+ <dependency>
+ <groupId>org.glassfish.jersey.core</groupId>
+ <artifactId>jersey-client</artifactId>
+ <version>${jersey-version}</version>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.glassfish.jersey.media</groupId>
+ <artifactId>jersey-media-json-jackson</artifactId>
+ <version>${jersey-version}</version>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.glassfish.jersey.media</groupId>
+ <artifactId>jersey-media-multipart</artifactId>
+ <version>${jersey-version}</version>
+ <optional>true</optional>
+ </dependency>
+
+ <!-- Base64 encoding that works in both JVM and Android -->
+ <dependency>
+ <groupId>com.brsanthu</groupId>
+ <artifactId>migbase64</artifactId>
+ <version>2.2</version>
+ <optional>true</optional>
+ </dependency>
+ </dependencies>
+</project>
[2/4] metamodel-membrane git commit: METAMODEL-1147: Fixed tests and
use of Jackson ObjectMapper from codegen
Posted by ka...@apache.org.
METAMODEL-1147: Fixed tests and use of Jackson ObjectMapper from codegen
Project: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/commit/dfdad119
Tree: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/tree/dfdad119
Diff: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/diff/dfdad119
Branch: refs/heads/master
Commit: dfdad119d3d4af0fecb0d587f710f3a253796cd9
Parents: 609cc85
Author: Kasper Sørensen <i....@gmail.com>
Authored: Mon Jul 31 22:20:11 2017 -0700
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Mon Jul 31 22:20:11 2017 -0700
----------------------------------------------------------------------
.../membrane/app/config/JacksonConfig.java | 18 +++++++++
.../resources/context/dispatcher-servlet.xml | 6 ++-
core/src/main/resources/swagger.yaml | 2 +
.../TenantInteractionScenarioTest.java | 40 +++++++++++---------
swagger-codegen/pom.xml | 3 +-
5 files changed, 49 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/dfdad119/core/src/main/java/org/apache/metamodel/membrane/app/config/JacksonConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/config/JacksonConfig.java b/core/src/main/java/org/apache/metamodel/membrane/app/config/JacksonConfig.java
new file mode 100644
index 0000000..8021541
--- /dev/null
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/config/JacksonConfig.java
@@ -0,0 +1,18 @@
+package org.apache.metamodel.membrane.app.config;
+
+import org.apache.metamodel.membrane.swagger.invoker.JSON;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Configuration
+public class JacksonConfig {
+
+ @Bean(name = "objectMapper")
+ public ObjectMapper objectMapper() {
+ // use the JSON class from swagger-codegen
+ final JSON json = new JSON();
+ return json.getContext(Object.class);
+ }
+}
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/dfdad119/core/src/main/resources/context/dispatcher-servlet.xml
----------------------------------------------------------------------
diff --git a/core/src/main/resources/context/dispatcher-servlet.xml b/core/src/main/resources/context/dispatcher-servlet.xml
index 437d2b1..6be361b 100644
--- a/core/src/main/resources/context/dispatcher-servlet.xml
+++ b/core/src/main/resources/context/dispatcher-servlet.xml
@@ -34,7 +34,7 @@ under the License.
<ref bean="jsonMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
-
+
<!-- Message converters -->
<bean id="jsonMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
@@ -44,6 +44,10 @@ under the License.
<value>application/json</value>
</list>
</property>
+ <property name="objectMapper">
+ <bean class="com.fasterxml.jackson.databind.ObjectMapper">
+ </bean>
+ </property>
</bean>
<bean
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/dfdad119/core/src/main/resources/swagger.yaml
----------------------------------------------------------------------
diff --git a/core/src/main/resources/swagger.yaml b/core/src/main/resources/swagger.yaml
index 0666728..f183feb 100644
--- a/core/src/main/resources/swagger.yaml
+++ b/core/src/main/resources/swagger.yaml
@@ -421,6 +421,8 @@ definitions:
insertionResponse:
description: Represents the result of inserting records to a table
type: object
+ required:
+ - status
properties:
status:
type: string
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/dfdad119/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java b/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
index 59dfbb0..eccff2c 100644
--- a/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
+++ b/core/src/test/java/org/apache/metamodel/membrane/controllers/TenantInteractionScenarioTest.java
@@ -24,9 +24,11 @@ import java.util.Map;
import org.apache.metamodel.membrane.app.InMemoryTenantRegistry;
import org.apache.metamodel.membrane.app.TenantRegistry;
+import org.apache.metamodel.membrane.app.config.JacksonConfig;
import org.junit.Before;
import org.junit.Test;
import org.springframework.http.MediaType;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@@ -41,17 +43,21 @@ public class TenantInteractionScenarioTest {
@Before
public void init() {
- TenantRegistry tenantRegistry = new InMemoryTenantRegistry();
- TenantController tenantController = new TenantController(tenantRegistry);
- DataSourceController dataContextController = new DataSourceController(tenantRegistry);
- SchemaController schemaController = new SchemaController(tenantRegistry);
- TableController tableController = new TableController(tenantRegistry);
- ColumnController columnController = new ColumnController(tenantRegistry);
- QueryController queryController = new QueryController(tenantRegistry);
- TableDataController tableDataController = new TableDataController(tenantRegistry);
+ final MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
+ messageConverter.setObjectMapper(new JacksonConfig().objectMapper());
+
+ final TenantRegistry tenantRegistry = new InMemoryTenantRegistry();
+ final TenantController tenantController = new TenantController(tenantRegistry);
+ final DataSourceController dataContextController = new DataSourceController(tenantRegistry);
+ final SchemaController schemaController = new SchemaController(tenantRegistry);
+ final TableController tableController = new TableController(tenantRegistry);
+ final ColumnController columnController = new ColumnController(tenantRegistry);
+ final QueryController queryController = new QueryController(tenantRegistry);
+ final TableDataController tableDataController = new TableDataController(tenantRegistry);
mockMvc = MockMvcBuilders.standaloneSetup(tenantController, dataContextController, schemaController,
- tableController, columnController, queryController, tableDataController).build();
+ tableController, columnController, queryController, tableDataController).setMessageConverters(
+ messageConverter).build();
}
@Test
@@ -135,9 +141,8 @@ public class TenantInteractionScenarioTest {
assertEquals("column", map.get("type"));
assertEquals("bar", map.get("name"));
- assertEquals(
- "{number=0, size=null, nullable=true, primary-key=false, indexed=false, column-type=INTEGER, native-type=null, remarks=null}",
- map.get("metadata").toString());
+ assertEquals("{number=0, nullable=true, primary-key=false, indexed=false, column-type=INTEGER}", map.get(
+ "metadata").toString());
}
// query metadata from information_schema
@@ -167,15 +172,15 @@ public class TenantInteractionScenarioTest {
}
{
final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post(
- "/tenant1/mydata/s/mydata/t/hello_world/d").content("[{'greeting':'Hi','who':'Apache'}]"
- .replace('\'', '"')).contentType(MediaType.APPLICATION_JSON)).andExpect(
- MockMvcResultMatchers.status().isOk()).andReturn();
+ "/tenant1/mydata/s/mydata/t/hello_world/d").content("[{'greeting':'Hi','who':'Apache'}]".replace(
+ '\'', '"')).contentType(MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers
+ .status().isOk()).andReturn();
final String content = result.getResponse().getContentAsString();
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("{status=ok}", map.toString());
}
-
+
// query the actual data
// query metadata from information_schema
{
@@ -187,8 +192,7 @@ public class TenantInteractionScenarioTest {
final Map<?, ?> map = new ObjectMapper().readValue(content, Map.class);
assertEquals("dataset", map.get("type"));
assertEquals("[hello_world.greeting, hello_world.who AS who_is_it]", map.get("headers").toString());
- assertEquals("[[Howdy, MetaModel], [Hi, Apache]]", map.get("data")
- .toString());
+ assertEquals("[[Howdy, MetaModel], [Hi, Apache]]", map.get("data").toString());
}
}
}
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/dfdad119/swagger-codegen/pom.xml
----------------------------------------------------------------------
diff --git a/swagger-codegen/pom.xml b/swagger-codegen/pom.xml
index 5f50f49..ace3549 100644
--- a/swagger-codegen/pom.xml
+++ b/swagger-codegen/pom.xml
@@ -50,9 +50,10 @@ under the License.
<inputSpec>${project.basedir}/../core/src/main/resources/swagger.yaml</inputSpec>
<language>java</language>
<modelPackage>org.apache.metamodel.membrane.swagger.model</modelPackage>
- <apiPackage>org.apache.metamodel.membrane.swagger.api</apiPackage>
<invokerPackage>org.apache.metamodel.membrane.swagger.invoker</invokerPackage>
+ <generateApis>false</generateApis>
<library>jersey2</library>
+ <useJaxbAnnotations>true</useJaxbAnnotations>
<configOptions>
<sourceFolder>src/gen/java/main</sourceFolder>
<dateLibrary>java8</dateLibrary>
[3/4] metamodel-membrane git commit: Fixed license header
Posted by ka...@apache.org.
Fixed license header
Project: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/commit/07a7b19a
Tree: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/tree/07a7b19a
Diff: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/diff/07a7b19a
Branch: refs/heads/master
Commit: 07a7b19a777c1d8fef7580b9686a247d09c47886
Parents: dfdad11
Author: Kasper Sørensen <i....@gmail.com>
Authored: Mon Jul 31 22:22:54 2017 -0700
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Mon Jul 31 22:22:54 2017 -0700
----------------------------------------------------------------------
.../membrane/app/config/JacksonConfig.java | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/07a7b19a/core/src/main/java/org/apache/metamodel/membrane/app/config/JacksonConfig.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/membrane/app/config/JacksonConfig.java b/core/src/main/java/org/apache/metamodel/membrane/app/config/JacksonConfig.java
index 8021541..a9ad0cd 100644
--- a/core/src/main/java/org/apache/metamodel/membrane/app/config/JacksonConfig.java
+++ b/core/src/main/java/org/apache/metamodel/membrane/app/config/JacksonConfig.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
package org.apache.metamodel.membrane.app.config;
import org.apache.metamodel.membrane.swagger.invoker.JSON;
[4/4] metamodel-membrane git commit: Fixed the `jersey.version`
property naming in pom.xml
Posted by ka...@apache.org.
Fixed the `jersey.version` property naming in pom.xml
Project: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/commit/d9bde2a9
Tree: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/tree/d9bde2a9
Diff: http://git-wip-us.apache.org/repos/asf/metamodel-membrane/diff/d9bde2a9
Branch: refs/heads/master
Commit: d9bde2a90d854353701e8a7e3f919fae7350c29b
Parents: 07a7b19
Author: Kasper Sørensen <i....@gmail.com>
Authored: Tue Aug 1 19:47:42 2017 -0700
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Tue Aug 1 19:47:42 2017 -0700
----------------------------------------------------------------------
swagger-codegen/pom.xml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/metamodel-membrane/blob/d9bde2a9/swagger-codegen/pom.xml
----------------------------------------------------------------------
diff --git a/swagger-codegen/pom.xml b/swagger-codegen/pom.xml
index ace3549..728feb3 100644
--- a/swagger-codegen/pom.xml
+++ b/swagger-codegen/pom.xml
@@ -30,7 +30,7 @@ under the License.
<properties>
<swagger.version>2.2.3</swagger.version>
- <jersey-version>2.22.2</jersey-version>
+ <jersey.version>2.22.2</jersey.version>
</properties>
<build>
@@ -96,19 +96,19 @@ under the License.
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
- <version>${jersey-version}</version>
+ <version>${jersey.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
- <version>${jersey-version}</version>
+ <version>${jersey.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
- <version>${jersey-version}</version>
+ <version>${jersey.version}</version>
<optional>true</optional>
</dependency>