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()) {
