/** * 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 * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * 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.ambari.view.hive2.resources.browser; import org.apache.ambari.view.ViewContext; import org.apache.ambari.view.ViewResourceHandler; import org.apache.ambari.view.hive2.ConnectionFactory; import org.apache.ambari.view.hive2.ConnectionSystem; import org.apache.ambari.view.hive2.client.ColumnDescription; import org.apache.ambari.view.hive2.client.ConnectionConfig; import org.apache.ambari.view.hive2.client.Cursor; import org.apache.ambari.view.hive2.client.DDLDelegator; import org.apache.ambari.view.hive2.client.DDLDelegatorImpl; import org.apache.ambari.view.hive2.client.Row; import org.apache.ambari.view.hive2.resources.jobs.ResultsPaginationController; import org.apache.ambari.view.hive2.utils.BadRequestFormattedException; import org.apache.ambari.view.hive2.utils.ServiceFormattedException; import org.json.simple.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.List; import java.util.concurrent.Callable; /** * Database access resource */ public class HiveBrowserService { @Inject ViewResourceHandler handler; @Inject protected ViewContext context; protected final static Logger LOG = LoggerFactory.getLogger(HiveBrowserService.class); /** * Returns list of databases */ @GET @Path("database") @Produces(MediaType.APPLICATION_JSON) public Response databases(@QueryParam("like") String like, @QueryParam("first") String fromBeginning, @QueryParam("count") Integer count, @QueryParam("columns") final String requestedColumns) { if (like == null) like = "*"; else like = "*" + like + "*"; JSONObject response = new JSONObject(); ConnectionConfig hiveConnectionConfig = getHiveConnectionConfig(); DDLDelegator delegator = new DDLDelegatorImpl(context, ConnectionSystem.getInstance().getActorSystem(), ConnectionSystem.getInstance().getOperationController(context)); List<String> databases = delegator.getDbList(hiveConnectionConfig, like); response.put("databases", databases); return Response.ok(response).build(); } /** * Returns list of databases */ @GET @Path("database.page") @Produces(MediaType.APPLICATION_JSON) public Response databasesPaginated(@QueryParam("like") String like, @QueryParam("first") String fromBeginning, @QueryParam("count") Integer count, @QueryParam("searchId") String searchId, @QueryParam("format") String format, @QueryParam("columns") final String requestedColumns) { if (like == null) like = "*"; else like = "*" + like + "*"; String curl = null; try { final String finalLike = like; final DDLDelegator delegator = new DDLDelegatorImpl(context, ConnectionSystem.getInstance().getActorSystem(), ConnectionSystem.getInstance().getOperationController(context)); return ResultsPaginationController.getInstance(context) .request("databases", searchId, false, fromBeginning, count, format, requestedColumns, new Callable<Cursor<Row, ColumnDescription>>() { @Override public Cursor<Row, ColumnDescription> call() throws Exception { return delegator.getDbListCursor(getHiveConnectionConfig(), finalLike); } }).build(); } catch (WebApplicationException ex) { throw ex; } catch (IllegalArgumentException ex) { throw new BadRequestFormattedException(ex.getMessage(), ex); } catch (Exception ex) { throw new ServiceFormattedException(ex.getMessage(), ex, curl); } } /** * Returns list of databases */ @GET @Path("database/{db}/table") @Produces(MediaType.APPLICATION_JSON) public Response tablesInDatabase(@PathParam("db") String db, @QueryParam("like") String like, @QueryParam("first") String fromBeginning, @QueryParam("count") Integer count, @QueryParam("columns") final String requestedColumns) { if (like == null) like = "*"; else like = "*" + like + "*"; JSONObject response = new JSONObject(); DDLDelegator delegator = new DDLDelegatorImpl(context, ConnectionSystem.getInstance().getActorSystem(), ConnectionSystem.getInstance().getOperationController(context)); List<String> tables = delegator.getTableList(getHiveConnectionConfig(), db, like); response.put("tables", tables); response.put("database", db); return Response.ok(response).build(); } /** * Returns list of databases */ @GET @Path("database/{db}/table.page") @Produces(MediaType.APPLICATION_JSON) public Response tablesInDatabasePaginated(@PathParam("db") final String db, @QueryParam("like") String like, @QueryParam("first") String fromBeginning, @QueryParam("count") Integer count, @QueryParam("searchId") String searchId, @QueryParam("format") String format, @QueryParam("columns") final String requestedColumns) { if (like == null) like = "*"; else like = "*" + like + "*"; String curl = null; try { final String finalLike = like; final DDLDelegator delegator = new DDLDelegatorImpl(context, ConnectionSystem.getInstance().getActorSystem(), ConnectionSystem.getInstance().getOperationController(context)); try { return ResultsPaginationController.getInstance(context) .request(db + ":tables:", searchId, false, fromBeginning, count, format, requestedColumns, new Callable<Cursor<Row, ColumnDescription>>() { @Override public Cursor<Row, ColumnDescription> call() throws Exception { return delegator.getTableListCursor(getHiveConnectionConfig(), db, finalLike); } }).build(); } catch (Exception ex) { throw new ServiceFormattedException(ex.getMessage(), ex); } } catch (WebApplicationException ex) { throw ex; } catch (IllegalArgumentException ex) { throw new BadRequestFormattedException(ex.getMessage(), ex); } catch (Exception ex) { throw new ServiceFormattedException(ex.getMessage(), ex, curl); } } /** * Returns list of databases */ @GET @Path("database/{db}/table/{table}") @Produces(MediaType.APPLICATION_JSON) public Response describeTable(@PathParam("db") String db, @PathParam("table") String table, @QueryParam("like") String like, @QueryParam("columns") String requestedColumns, @QueryParam("extended") String extended) { boolean extendedTableDescription = (extended != null && extended.equals("true")); String curl = null; try { JSONObject response = new JSONObject(); DDLDelegator delegator = new DDLDelegatorImpl(context, ConnectionSystem.getInstance().getActorSystem(), ConnectionSystem.getInstance().getOperationController(context)); List<ColumnDescription> descriptions = delegator.getTableDescription(getHiveConnectionConfig(), db, table, "%", extendedTableDescription); response.put("columns", descriptions); response.put("database", db); response.put("table", table); //TODO: New implementation return Response.ok(response).build(); } catch (WebApplicationException ex) { throw ex; } catch (IllegalArgumentException ex) { throw new BadRequestFormattedException(ex.getMessage(), ex); } catch (Exception ex) { throw new ServiceFormattedException(ex.getMessage(), ex, curl); } } /** * Returns list of databases */ @GET @Path("database/{db}/table/{table}.page") @Produces(MediaType.APPLICATION_JSON) public Response describeTablePaginated(@PathParam("db") final String db, @PathParam("table") final String table, @QueryParam("like") String like, @QueryParam("first") String fromBeginning, @QueryParam("searchId") String searchId, @QueryParam("count") Integer count, @QueryParam("format") String format, @QueryParam("columns") final String requestedColumns) { if (like == null) like = ".*"; else like = ".*" + like + ".*"; final String finalLike = like; final DDLDelegator delegator = new DDLDelegatorImpl(context, ConnectionSystem.getInstance().getActorSystem(), ConnectionSystem.getInstance().getOperationController(context)); try { return ResultsPaginationController.getInstance(context) .request(db + ":tables:" + table + ":columns", searchId, false, fromBeginning, count, format, requestedColumns, new Callable<Cursor<Row, ColumnDescription>>() { @Override public Cursor<Row, ColumnDescription> call() throws Exception { return delegator.getTableDescriptionCursor(getHiveConnectionConfig(), db, table, finalLike, false); } }).build(); } catch (Exception ex) { throw new ServiceFormattedException(ex.getMessage(), ex); } } private ConnectionConfig getHiveConnectionConfig() { return ConnectionFactory.create(context); } }