Improved throwing of exceptions from controllers.

Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/79af7dde
Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/79af7dde
Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/79af7dde

Branch: refs/heads/feature/5.x/swagger-docs
Commit: 79af7dded8df48e829a70b1d8c2defdd7076cb60
Parents: 704790b
Author: Kasper Sørensen <[email protected]>
Authored: Sun Jun 12 22:11:06 2016 -0700
Committer: Kasper Sørensen <[email protected]>
Committed: Sun Jun 12 22:11:06 2016 -0700

----------------------------------------------------------------------
 .../service/app/DataContextTraverser.java       | 67 ++++++++++++++++++++
 .../app/exceptions/NoSuchColumnException.java   | 29 +++++++++
 .../app/exceptions/NoSuchSchemaException.java   | 29 +++++++++
 .../app/exceptions/NoSuchTableException.java    | 29 +++++++++
 .../service/controllers/ColumnController.java   | 13 ++--
 .../service/controllers/RestErrorHandler.java   |  6 +-
 .../service/controllers/SchemaController.java   |  8 ++-
 .../service/controllers/TableController.java    |  9 +--
 .../controllers/TableDataController.java        | 12 ++--
 9 files changed, 183 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/79af7dde/service-webapp/src/main/java/org/apache/metamodel/service/app/DataContextTraverser.java
----------------------------------------------------------------------
diff --git 
a/service-webapp/src/main/java/org/apache/metamodel/service/app/DataContextTraverser.java
 
b/service-webapp/src/main/java/org/apache/metamodel/service/app/DataContextTraverser.java
new file mode 100644
index 0000000..6ec7122
--- /dev/null
+++ 
b/service-webapp/src/main/java/org/apache/metamodel/service/app/DataContextTraverser.java
@@ -0,0 +1,67 @@
+/**
+ * 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.service.app;
+
+import org.apache.metamodel.DataContext;
+import org.apache.metamodel.schema.Column;
+import org.apache.metamodel.schema.Schema;
+import org.apache.metamodel.schema.Table;
+import org.apache.metamodel.service.app.exceptions.NoSuchColumnException;
+import org.apache.metamodel.service.app.exceptions.NoSuchSchemaException;
+import org.apache.metamodel.service.app.exceptions.NoSuchTableException;
+
+/**
+ * Utility object responsible for traversing the schema/table/column structures
+ * of a {@link DataContext} based on String identifiers and names.
+ * 
+ * This class will throw the appropriate exceptions if needed which is more
+ * communicative than the usual NPEs that would otherwise be thrown.
+ */
+public class DataContextTraverser {
+
+    private final DataContext dataContext;
+
+    public DataContextTraverser(DataContext dataContext) {
+        this.dataContext = dataContext;
+    }
+
+    public Schema getSchema(String schemaName) {
+        final Schema schema = dataContext.getSchemaByName(schemaName);
+        if (schema == null) {
+            throw new NoSuchSchemaException(schemaName);
+        }
+        return schema;
+    }
+
+    public Table getTable(String schemaName, String tableName) {
+        final Table table = getSchema(schemaName).getTableByName(tableName);
+        if (table == null) {
+            throw new NoSuchTableException(tableName);
+        }
+        return table;
+    }
+
+    public Column getColumn(String schemaName, String tableName, String 
columnName) {
+        final Column column = getTable(schemaName, 
tableName).getColumnByName(columnName);
+        if (column == null) {
+            throw new NoSuchColumnException(columnName);
+        }
+        return column;
+    }
+}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/79af7dde/service-webapp/src/main/java/org/apache/metamodel/service/app/exceptions/NoSuchColumnException.java
----------------------------------------------------------------------
diff --git 
a/service-webapp/src/main/java/org/apache/metamodel/service/app/exceptions/NoSuchColumnException.java
 
b/service-webapp/src/main/java/org/apache/metamodel/service/app/exceptions/NoSuchColumnException.java
new file mode 100644
index 0000000..1902af1
--- /dev/null
+++ 
b/service-webapp/src/main/java/org/apache/metamodel/service/app/exceptions/NoSuchColumnException.java
@@ -0,0 +1,29 @@
+/**
+ * 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.service.app.exceptions;
+
+public class NoSuchColumnException extends AbstractIdentifierNamingException {
+
+    private static final long serialVersionUID = 1L;
+
+    public NoSuchColumnException(String name) {
+        super(name);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/79af7dde/service-webapp/src/main/java/org/apache/metamodel/service/app/exceptions/NoSuchSchemaException.java
----------------------------------------------------------------------
diff --git 
a/service-webapp/src/main/java/org/apache/metamodel/service/app/exceptions/NoSuchSchemaException.java
 
b/service-webapp/src/main/java/org/apache/metamodel/service/app/exceptions/NoSuchSchemaException.java
new file mode 100644
index 0000000..5b238a8
--- /dev/null
+++ 
b/service-webapp/src/main/java/org/apache/metamodel/service/app/exceptions/NoSuchSchemaException.java
@@ -0,0 +1,29 @@
+/**
+ * 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.service.app.exceptions;
+
+public class NoSuchSchemaException extends AbstractIdentifierNamingException {
+
+    private static final long serialVersionUID = 1L;
+
+    public NoSuchSchemaException(String name) {
+        super(name);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/79af7dde/service-webapp/src/main/java/org/apache/metamodel/service/app/exceptions/NoSuchTableException.java
----------------------------------------------------------------------
diff --git 
a/service-webapp/src/main/java/org/apache/metamodel/service/app/exceptions/NoSuchTableException.java
 
b/service-webapp/src/main/java/org/apache/metamodel/service/app/exceptions/NoSuchTableException.java
new file mode 100644
index 0000000..73141cd
--- /dev/null
+++ 
b/service-webapp/src/main/java/org/apache/metamodel/service/app/exceptions/NoSuchTableException.java
@@ -0,0 +1,29 @@
+/**
+ * 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.service.app.exceptions;
+
+public class NoSuchTableException extends AbstractIdentifierNamingException {
+
+    private static final long serialVersionUID = 1L;
+
+    public NoSuchTableException(String name) {
+        super(name);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/79af7dde/service-webapp/src/main/java/org/apache/metamodel/service/controllers/ColumnController.java
----------------------------------------------------------------------
diff --git 
a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/ColumnController.java
 
b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/ColumnController.java
index 1eb1a13..7d6d5ff 100644
--- 
a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/ColumnController.java
+++ 
b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/ColumnController.java
@@ -23,8 +23,7 @@ import java.util.Map;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.schema.Column;
-import org.apache.metamodel.schema.Schema;
-import org.apache.metamodel.schema.Table;
+import org.apache.metamodel.service.app.DataContextTraverser;
 import org.apache.metamodel.service.app.TenantContext;
 import org.apache.metamodel.service.app.TenantRegistry;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,13 +54,13 @@ public class ColumnController {
         final TenantContext tenantContext = 
tenantRegistry.getTenantContext(tenantId);
         final DataContext dataContext = 
tenantContext.getDataSourceRegistry().openDataContext(dataSourceName);
 
-        final Schema schema = dataContext.getSchemaByName(schemaId);
-        final Table table = schema.getTableByName(tableId);
-        final Column column = table.getColumnByName(columnId);
+        final DataContextTraverser traverser = new 
DataContextTraverser(dataContext);
+
+        final Column column = traverser.getColumn(schemaId, tableId, columnId);
 
         final String tenantName = tenantContext.getTenantName();
-        final String tableName = table.getName();
-        final String schemaName = schema.getName();
+        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());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/79af7dde/service-webapp/src/main/java/org/apache/metamodel/service/controllers/RestErrorHandler.java
----------------------------------------------------------------------
diff --git 
a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/RestErrorHandler.java
 
b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/RestErrorHandler.java
index 690ee0e..8a08151 100644
--- 
a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/RestErrorHandler.java
+++ 
b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/RestErrorHandler.java
@@ -27,7 +27,10 @@ import 
org.apache.metamodel.query.parser.QueryParserException;
 import 
org.apache.metamodel.service.app.exceptions.AbstractIdentifierNamingException;
 import 
org.apache.metamodel.service.app.exceptions.DataSourceAlreadyExistException;
 import 
org.apache.metamodel.service.app.exceptions.DataSourceNotUpdateableException;
+import org.apache.metamodel.service.app.exceptions.NoSuchColumnException;
 import org.apache.metamodel.service.app.exceptions.NoSuchDataSourceException;
+import org.apache.metamodel.service.app.exceptions.NoSuchSchemaException;
+import org.apache.metamodel.service.app.exceptions.NoSuchTableException;
 import org.apache.metamodel.service.app.exceptions.NoSuchTenantException;
 import org.apache.metamodel.service.app.exceptions.TenantAlreadyExistException;
 import org.apache.metamodel.service.controllers.model.RestErrorResponse;
@@ -91,7 +94,8 @@ public class RestErrorHandler {
      * @param ex
      * @return
      */
-    @ExceptionHandler({ NoSuchTenantException.class, 
NoSuchDataSourceException.class })
+    @ExceptionHandler({ NoSuchTenantException.class, 
NoSuchDataSourceException.class, NoSuchSchemaException.class,
+            NoSuchTableException.class, NoSuchColumnException.class })
     @ResponseStatus(HttpStatus.NOT_FOUND)
     @ResponseBody
     public RestErrorResponse 
processNoSuchEntity(AbstractIdentifierNamingException ex) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/79af7dde/service-webapp/src/main/java/org/apache/metamodel/service/controllers/SchemaController.java
----------------------------------------------------------------------
diff --git 
a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/SchemaController.java
 
b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/SchemaController.java
index bfdbe5f..6208d49 100644
--- 
a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/SchemaController.java
+++ 
b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/SchemaController.java
@@ -28,6 +28,7 @@ import javax.ws.rs.core.UriBuilder;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.schema.Schema;
+import org.apache.metamodel.service.app.DataContextTraverser;
 import org.apache.metamodel.service.app.TenantContext;
 import org.apache.metamodel.service.app.TenantRegistry;
 import org.apache.metamodel.service.controllers.model.RestLink;
@@ -40,7 +41,8 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
-@RequestMapping(value = {"/{tenant}/{dataContext}/schemas/{schema}", 
"/{tenant}/{dataContext}/s/{schema}"}, produces = 
MediaType.APPLICATION_JSON_VALUE)
+@RequestMapping(value = { "/{tenant}/{dataContext}/schemas/{schema}",
+        "/{tenant}/{dataContext}/s/{schema}" }, produces = 
MediaType.APPLICATION_JSON_VALUE)
 public class SchemaController {
 
     private final TenantRegistry tenantRegistry;
@@ -57,7 +59,9 @@ public class SchemaController {
         final TenantContext tenantContext = 
tenantRegistry.getTenantContext(tenantId);
         final DataContext dataContext = 
tenantContext.getDataSourceRegistry().openDataContext(dataSourceName);
 
-        final Schema schema = dataContext.getSchemaByName(schemaId);
+        final DataContextTraverser traverser = new 
DataContextTraverser(dataContext);
+
+        final Schema schema = traverser.getSchema(schemaId);
         final String tenantName = tenantContext.getTenantName();
         final UriBuilder uriBuilder = 
UriBuilder.fromPath("/{tenant}/{dataContext}/s/{schema}/t/{table}");
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/79af7dde/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableController.java
----------------------------------------------------------------------
diff --git 
a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableController.java
 
b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableController.java
index cca0edc..4157dac 100644
--- 
a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableController.java
+++ 
b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableController.java
@@ -27,8 +27,8 @@ import java.util.stream.Collectors;
 import javax.ws.rs.core.UriBuilder;
 
 import org.apache.metamodel.DataContext;
-import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
+import org.apache.metamodel.service.app.DataContextTraverser;
 import org.apache.metamodel.service.app.TenantContext;
 import org.apache.metamodel.service.app.TenantRegistry;
 import org.apache.metamodel.service.controllers.model.RestLink;
@@ -59,15 +59,16 @@ public class TableController {
             @PathVariable("table") String tableId) {
         final TenantContext tenantContext = 
tenantRegistry.getTenantContext(tenantId);
         final DataContext dataContext = 
tenantContext.getDataSourceRegistry().openDataContext(dataSourceName);
+        
+        final DataContextTraverser traverser = new 
DataContextTraverser(dataContext);
 
-        final Schema schema = dataContext.getSchemaByName(schemaId);
-        final Table table = schema.getTableByName(tableId);
+        final Table table = traverser.getTable(schemaId, tableId);
 
         final String tenantName = tenantContext.getTenantName();
         final UriBuilder uriBuilder = 
UriBuilder.fromPath("/{tenant}/{dataContext}/s/{schema}/t/{table}/c/{column}");
 
         final String tableName = table.getName();
-        final String schemaName = schema.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());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/79af7dde/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableDataController.java
----------------------------------------------------------------------
diff --git 
a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableDataController.java
 
b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableDataController.java
index e25258f..c48d74f 100644
--- 
a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableDataController.java
+++ 
b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableDataController.java
@@ -27,8 +27,8 @@ import org.apache.metamodel.UpdateSummary;
 import org.apache.metamodel.UpdateableDataContext;
 import org.apache.metamodel.insert.InsertInto;
 import org.apache.metamodel.query.Query;
-import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
+import org.apache.metamodel.service.app.DataContextTraverser;
 import org.apache.metamodel.service.app.TenantContext;
 import org.apache.metamodel.service.app.TenantRegistry;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -61,9 +61,10 @@ public class TableDataController {
             @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 Schema schema = dataContext.getSchemaByName(schemaId);
-        final Table table = schema.getTableByName(tableId);
+        final Table table = traverser.getTable(schemaId, tableId);
 
         final Query query = 
dataContext.query().from(table).selectAll().toQuery();
 
@@ -79,8 +80,9 @@ public class TableDataController {
         final TenantContext tenantContext = 
tenantRegistry.getTenantContext(tenantId);
         final UpdateableDataContext dataContext = 
tenantContext.getDataSourceRegistry().openDataContextForUpdate(dataSourceName);
 
-        final Schema schema = dataContext.getSchemaByName(schemaId);
-        final Table table = schema.getTableByName(tableId);
+        final DataContextTraverser traverser = new 
DataContextTraverser(dataContext);
+
+        final Table table = traverser.getTable(schemaId, tableId);
 
         final InsertInto insert = new InsertInto(table);
         for (Entry<String, Object> entry : inputMap.entrySet()) {

Reply via email to