diff --git a/src/main/java/iudx/rs/proxy/apiserver/ApiServerVerticle.java b/src/main/java/iudx/rs/proxy/apiserver/ApiServerVerticle.java index c79fdaf..e425b16 100644 --- a/src/main/java/iudx/rs/proxy/apiserver/ApiServerVerticle.java +++ b/src/main/java/iudx/rs/proxy/apiserver/ApiServerVerticle.java @@ -23,7 +23,11 @@ import static iudx.rs.proxy.common.ResponseUrn.BACKING_SERVICE_FORMAT_URN; import static iudx.rs.proxy.common.ResponseUrn.INVALID_PARAM_URN; import static iudx.rs.proxy.common.ResponseUrn.INVALID_TEMPORAL_PARAM_URN; - +import java.util.List; +import java.util.Map; +import java.util.Optional; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import io.netty.handler.codec.http.HttpConstants; import io.netty.handler.codec.http.QueryStringDecoder; import io.vertx.core.AbstractVerticle; @@ -41,6 +45,7 @@ import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.CorsHandler; +import io.vertx.serviceproxy.ServiceException; import iudx.rs.proxy.apiserver.exceptions.DxRuntimeException; import iudx.rs.proxy.apiserver.handlers.AuthHandler; import iudx.rs.proxy.apiserver.handlers.FailureHandler; @@ -54,11 +59,6 @@ import iudx.rs.proxy.common.ResponseUrn; import iudx.rs.proxy.database.DatabaseService; import iudx.rs.proxy.metering.MeteringService; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; public class ApiServerVerticle extends AbstractVerticle { @@ -282,6 +282,7 @@ private void executeSearchQuery( handleSuccessResponse(response, ResponseType.Ok.getCode(), handler.result().toString()); } else if (handler.failed()) { LOGGER.error("Fail: Search Fail"); + LOGGER.debug(handler instanceof ServiceException); processBackendResponse(response, handler.cause().getMessage()); } }); @@ -345,9 +346,10 @@ private void processBackendResponse(HttpServerResponse response, String failureM LOGGER.debug("Info : " + failureMessage); try { JsonObject json = new JsonObject(failureMessage); - int type = json.getInteger(JSON_TYPE); - HttpStatusCode status = HttpStatusCode.getByValue(type); - String urnTitle = json.getString(JSON_TITLE); + String type = json.getString(JSON_TYPE); + int status=json.getInteger("status"); + HttpStatusCode httpStatus = HttpStatusCode.getByValue(status); + String urnTitle = type; ResponseUrn urn; if (urnTitle != null) { urn = ResponseUrn.fromCode(urnTitle); @@ -357,8 +359,8 @@ private void processBackendResponse(HttpServerResponse response, String failureM // return urn in body response .putHeader(CONTENT_TYPE, APPLICATION_JSON) - .setStatusCode(type) - .end(generateResponse(status, urn).toString()); + .setStatusCode(status) + .end(generateResponse(httpStatus, urn).toString()); } catch (DecodeException ex) { LOGGER.error("ERROR : Expecting Json from backend service [ jsonFormattingException ]"); handleResponse(response, HttpStatusCode.BAD_REQUEST, BACKING_SERVICE_FORMAT_URN); diff --git a/src/main/java/iudx/rs/proxy/authenticator/AuthenticationVerticle.java b/src/main/java/iudx/rs/proxy/authenticator/AuthenticationVerticle.java index 2c1123c..77b87a2 100644 --- a/src/main/java/iudx/rs/proxy/authenticator/AuthenticationVerticle.java +++ b/src/main/java/iudx/rs/proxy/authenticator/AuthenticationVerticle.java @@ -1,6 +1,6 @@ package iudx.rs.proxy.authenticator; -import static iudx.rs.proxy.common.Constants.CACHE_SERVICE_ADDRESS; +import static iudx.rs.proxy.common.Constants.*; import io.vertx.core.AbstractVerticle; import io.vertx.core.Future; @@ -23,15 +23,15 @@ * *

Authentication Verticle

* - *

The Authentication Verticle implementation in the the IUDX Resource Server exposes the {@link - * iudx.rs.proxy.authenticator.AuthenticationService} over the Vert.x Event Bus. + *

+ * The Authentication Verticle implementation in the the IUDX Resource Server exposes the + * {@link iudx.rs.proxy.authenticator.AuthenticationService} over the Vert.x Event Bus. * * @version 1.0 * @since 2020-05-31 */ public class AuthenticationVerticle extends AbstractVerticle { - private static final String AUTH_SERVICE_ADDRESS = "iudx.rs.proxy.auth.service"; private static final Logger LOGGER = LogManager.getLogger(AuthenticationVerticle.class); private AuthenticationService jwtAuthenticationService; private ServiceBinder binder; diff --git a/src/main/java/iudx/rs/proxy/database/example/postgres/Constants.java b/src/main/java/iudx/rs/proxy/database/example/postgres/Constants.java index 82398f1..e3ce78f 100644 --- a/src/main/java/iudx/rs/proxy/database/example/postgres/Constants.java +++ b/src/main/java/iudx/rs/proxy/database/example/postgres/Constants.java @@ -14,11 +14,11 @@ public class Constants { public static final String SEARCH_TYPE = "searchType"; public static final String TIME_REL = "timerel"; public static final String TIME = "time"; - public static final String END_TIME = "endTime"; + public static final String END_TIME = "endtime"; public static final String ATTRS = "attrs"; public static final String BEFORE = "before"; public static final String AFTER = "after"; - public static final String ATTR_QUERY = "attr_query"; + public static final String ATTR_QUERY = "attr-query"; public static final String ATTRIBUTE = "attribute"; public static final String OPERATOR = "operator"; public static final String VALUE = "value"; @@ -31,7 +31,7 @@ public class Constants { // SQL public static String PSQL_TABLE_EXISTS_QUERY = "SELECT EXISTS ( SELECT FROM pg_tables WHERE schemaname='public' AND tablename='$1');"; - public static String PSQL_SELECT_QUERY = "SELECT $1 FROM $$"; - public static String PSQL_TEMPORAL_CONDITION = " WHERE time BETWEEN '$2' and '$3'"; + public static String PSQL_SELECT_QUERY = "SELECT $1 FROM $$ WHERE id='$2'"; + public static String PSQL_TEMPORAL_CONDITION = "observationdatetime BETWEEN '$2' and '$3'"; public static String PSQL_ATTR_CONDITION = "$4 $op $5"; } diff --git a/src/main/java/iudx/rs/proxy/database/example/postgres/PostgresServiceImpl.java b/src/main/java/iudx/rs/proxy/database/example/postgres/PostgresServiceImpl.java index 1a41b82..f762165 100644 --- a/src/main/java/iudx/rs/proxy/database/example/postgres/PostgresServiceImpl.java +++ b/src/main/java/iudx/rs/proxy/database/example/postgres/PostgresServiceImpl.java @@ -1,39 +1,15 @@ package iudx.rs.proxy.database.example.postgres; -import static iudx.rs.proxy.database.example.postgres.Constants.AFTER; -import static iudx.rs.proxy.database.example.postgres.Constants.ATTRS; -import static iudx.rs.proxy.database.example.postgres.Constants.BEFORE; -import static iudx.rs.proxy.database.example.postgres.Constants.DATABASE_IP; -import static iudx.rs.proxy.database.example.postgres.Constants.DATABASE_NAME; -import static iudx.rs.proxy.database.example.postgres.Constants.DATABASE_PASSWORD; -import static iudx.rs.proxy.database.example.postgres.Constants.DATABASE_PORT; -import static iudx.rs.proxy.database.example.postgres.Constants.DATABASE_USERNAME; -import static iudx.rs.proxy.database.example.postgres.Constants.END_TIME; -import static iudx.rs.proxy.database.example.postgres.Constants.ID; -import static iudx.rs.proxy.database.example.postgres.Constants.POOL_SIZE; -import static iudx.rs.proxy.database.example.postgres.Constants.PSQL_SELECT_QUERY; -import static iudx.rs.proxy.database.example.postgres.Constants.PSQL_TABLE_EXISTS_QUERY; -import static iudx.rs.proxy.database.example.postgres.Constants.PSQL_TEMPORAL_CONDITION; -import static iudx.rs.proxy.database.example.postgres.Constants.PSQL_ATTR_CONDITION; -import static iudx.rs.proxy.database.example.postgres.Constants.TIME; -import static iudx.rs.proxy.database.example.postgres.Constants.TIME_REL; -import static iudx.rs.proxy.database.example.postgres.Constants.SEARCH_TYPE; -import static iudx.rs.proxy.database.example.postgres.Constants.TEMPORAL_SEARCH_REGEX; -import static iudx.rs.proxy.database.example.postgres.Constants.GEOSEARCH_REGEX; -import static iudx.rs.proxy.database.example.postgres.Constants.ATTRIBUTE_SEARCH_REGEX; -import static iudx.rs.proxy.database.example.postgres.Constants.ATTR_QUERY; -import static iudx.rs.proxy.database.example.postgres.Constants.ATTRIBUTE; -import static iudx.rs.proxy.database.example.postgres.Constants.OPERATOR; -import static iudx.rs.proxy.database.example.postgres.Constants.VALUE; - -import io.vertx.sqlclient.SqlResult; -import iudx.rs.proxy.common.Response; -import iudx.rs.proxy.common.ResponseUrn; -import java.time.LocalDateTime; +import static iudx.rs.proxy.database.example.postgres.Constants.*; +import java.time.ZonedDateTime; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collector; import java.util.stream.Collectors; import org.apache.http.HttpStatus; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import io.vertx.core.AsyncResult; import io.vertx.core.Future; import io.vertx.core.Handler; @@ -46,15 +22,19 @@ import io.vertx.sqlclient.PoolOptions; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.RowSet; +import io.vertx.sqlclient.SqlResult; +import iudx.rs.proxy.common.Response; +import iudx.rs.proxy.common.ResponseUrn; import iudx.rs.proxy.common.ServiceExceptionMessage; import iudx.rs.proxy.database.DatabaseService; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; public class PostgresServiceImpl implements DatabaseService { private final PgPool pgClient; private boolean exists; + private Map resourceGroup2TableMapping; + private Map iudxQueryOperator2PgMapping; + private static final Logger LOGGER = LogManager.getLogger(PostgresServiceImpl.class); public PostgresServiceImpl(Vertx vertx, JsonObject config) { @@ -75,6 +55,20 @@ public PostgresServiceImpl(Vertx vertx, JsonObject config) { PoolOptions poolOptions = new PoolOptions().setMaxSize(poolSize); this.pgClient = PgPool.pool(vertx, connectOptions, poolOptions); + + resourceGroup2TableMapping = new HashMap<>(); + resourceGroup2TableMapping.put( + "iisc.ac.in/89a36273d77dac4cf38114fca1bbe64392547f86/rs.iudx.io/pune-env-flood", + "pune_flood"); + + iudxQueryOperator2PgMapping = new HashMap<>(); + iudxQueryOperator2PgMapping.put("==", "="); + iudxQueryOperator2PgMapping.put(">=", ">="); + iudxQueryOperator2PgMapping.put("<=", "<="); + iudxQueryOperator2PgMapping.put("<", "<"); + iudxQueryOperator2PgMapping.put(">", ">"); + iudxQueryOperator2PgMapping.put("!=", "!="); + } @Override @@ -87,22 +81,11 @@ public DatabaseService searchQuery(JsonObject request, Handler> rowCollector = Collectors.mapping(Row::toJson, Collectors.toList()); - + LOGGER.debug("query : " + query); pgClient .withConnection( connection -> connection.query(query).collecting(rowCollector).execute() @@ -117,12 +100,12 @@ public DatabaseService searchQuery(JsonObject request, Handler { - ServiceExceptionMessage detailedMsg = - new ServiceExceptionMessage.Builder("urn:dx:rs:DatabaseError") - .withDetails(new JsonObject().put("message", failureHandler.getMessage())) - .build(); - throw new ServiceException(HttpStatus.SC_NOT_FOUND, "brief message", - detailedMsg.toJson()); + LOGGER.debug(failureHandler); + Response response = new Response.Builder() + .withUrn(ResponseUrn.DB_ERROR_URN.getUrn()) + .withStatus(HttpStatus.SC_BAD_REQUEST) + .withDetail(failureHandler.getLocalizedMessage()).build(); + handler.handle(Future.failedFuture(response.toString())); }); return this; } @@ -137,19 +120,8 @@ public DatabaseService countQuery(JsonObject request, Handler sqlConnection @@ -162,7 +134,12 @@ public DatabaseService countQuery(JsonObject request, Handler { - throw new ServiceException(HttpStatus.SC_NOT_FOUND, "message for failure"); + LOGGER.debug(failureHandler); + Response response = new Response.Builder() + .withUrn(ResponseUrn.DB_ERROR_URN.getUrn()) + .withStatus(HttpStatus.SC_BAD_REQUEST) + .withDetail(failureHandler.getLocalizedMessage()).build(); + handler.handle(Future.failedFuture(response.toString())); }); return this; } @@ -170,10 +147,19 @@ public DatabaseService countQuery(JsonObject request, Handler { - if (existsHandler.succeeded()) { - RowSet rowSet = existsHandler.result(); - rowSet.forEach( - row -> { - if (row.getBoolean("exists")) { - exists = true; - } - }); - } else { - throw new ServiceException(HttpStatus.SC_NOT_FOUND, "message for failure"); - } - }); - - return exists; - } - @Override public DatabaseService executeQuery(final JsonObject jsonObject, - Handler> handler) { - LOGGER.info("In execute query"); + Handler> handler) { + LOGGER.info("In execute query"); Collector> rowCollector = Collectors.mapping(Row::toJson, Collectors.toList()); - String query=jsonObject.getString("query"); + String query = jsonObject.getString("query"); pgClient .withConnection(connection -> connection.query(query) @@ -285,8 +253,8 @@ public DatabaseService executeQuery(final JsonObject jsonObject, JsonArray result = new JsonArray(successHandler); JsonObject responseJson = new JsonObject() .put("type", ResponseUrn.SUCCESS_URN.getUrn()) - .put("title",ResponseUrn.SUCCESS_URN.getMessage()) - .put("result",result); + .put("title", ResponseUrn.SUCCESS_URN.getMessage()) + .put("result", result); handler.handle(Future.succeededFuture(responseJson)); }) .onFailure(failureHandler -> { @@ -302,4 +270,8 @@ public DatabaseService executeQuery(final JsonObject jsonObject, return this; } + private String getResourceGroup(String id) { + return id.substring(0, id.lastIndexOf('/')); + } + } diff --git a/src/main/java/iudx/rs/proxy/metering/MeteringVerticle.java b/src/main/java/iudx/rs/proxy/metering/MeteringVerticle.java index ed5fb14..8586ccc 100644 --- a/src/main/java/iudx/rs/proxy/metering/MeteringVerticle.java +++ b/src/main/java/iudx/rs/proxy/metering/MeteringVerticle.java @@ -1,26 +1,21 @@ package iudx.rs.proxy.metering; +import static iudx.rs.proxy.common.Constants.*; import static iudx.rs.proxy.metering.util.Constants.DATABASE_IP; import static iudx.rs.proxy.metering.util.Constants.DATABASE_NAME; import static iudx.rs.proxy.metering.util.Constants.DATABASE_PASSWORD; import static iudx.rs.proxy.metering.util.Constants.DATABASE_PORT; import static iudx.rs.proxy.metering.util.Constants.DATABASE_USERNAME; import static iudx.rs.proxy.metering.util.Constants.POOL_SIZE; - +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import io.vertx.core.AbstractVerticle; import io.vertx.core.eventbus.MessageConsumer; import io.vertx.core.json.JsonObject; -import io.vertx.pgclient.PgConnectOptions; -import io.vertx.pgclient.PgPool; import io.vertx.serviceproxy.ServiceBinder; -import io.vertx.sqlclient.PoolOptions; -import iudx.rs.proxy.common.Constants; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; public class MeteringVerticle extends AbstractVerticle { - private static final String METERING_SERVICE_ADDRESS = Constants.METERING_SERVICE_ADDRESS; private static final Logger LOGGER = LogManager.getLogger(MeteringVerticle.class); private String databaseIP; private int databasePort;