Add dates and loggers
This commit is contained in:
parent
725a26478c
commit
d475f482d6
6 changed files with 80 additions and 11 deletions
|
|
@ -2,6 +2,8 @@ package org.micord.config;
|
|||
|
||||
import com.atomikos.jdbc.AtomikosDataSourceBean;
|
||||
import org.micord.models.SqlConnectionParams;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.Connection;
|
||||
|
|
@ -15,19 +17,28 @@ import java.util.Properties;
|
|||
*/
|
||||
public class DatabaseConnection {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(DatabaseConnection.class);
|
||||
|
||||
private static final Map<String, DataSource> dataSources = new HashMap<>();
|
||||
|
||||
public static Connection getConnection(SqlConnectionParams params) throws SQLException {
|
||||
logger.debug("Get connection for params: {}", params);
|
||||
long startExecTime = System.currentTimeMillis();
|
||||
try {
|
||||
Class.forName(params.getJdbcDriverClassName());
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new SQLException("Unable to load the JDBC driver class", e);
|
||||
}
|
||||
|
||||
long endExecTime = System.currentTimeMillis();
|
||||
logger.debug("Time to load JDBC driver class: {} ms", endExecTime - startExecTime);
|
||||
|
||||
return getXaDataSource(params).getConnection();
|
||||
}
|
||||
|
||||
public static DataSource getXaDataSource(SqlConnectionParams params) {
|
||||
logger.debug("Getting XA data source for params: {}", params);
|
||||
long startExecTime = System.currentTimeMillis();
|
||||
String database = params.getJdbcDatabase();
|
||||
|
||||
if (!dataSources.containsKey(database)) {
|
||||
|
|
@ -46,6 +57,9 @@ public class DatabaseConnection {
|
|||
dataSources.put(database, xaDataSource);
|
||||
}
|
||||
|
||||
long endExecTime = System.currentTimeMillis();
|
||||
logger.debug("Time to get XA data source: {} ms", endExecTime - startExecTime);
|
||||
|
||||
return dataSources.get(database);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ import java.util.List;
|
|||
|
||||
import org.micord.models.DownloadCSVRequest;
|
||||
import org.micord.service.ApiService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.io.InputStreamResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
|
|
@ -23,44 +25,60 @@ import org.springframework.web.bind.annotation.*;
|
|||
@RequestMapping("/api")
|
||||
public class ApiController {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ApiController.class);
|
||||
|
||||
@Autowired
|
||||
private ApiService apiService;
|
||||
|
||||
@PostMapping("/block")
|
||||
public ResponseEntity<?> block(@RequestBody List<String> ids) throws FileNotFoundException {
|
||||
logger.debug("Starting block process for ids: {}", ids);
|
||||
apiService.process("block", ids);
|
||||
logger.debug("Finished block process for ids: {}", ids);
|
||||
return ResponseEntity.ok("");
|
||||
}
|
||||
|
||||
@PostMapping("/unblock")
|
||||
public ResponseEntity<?> unblock(@RequestBody List<String> ids) throws FileNotFoundException {
|
||||
|
||||
logger.debug("Starting unblock process for ids: {}", ids);
|
||||
apiService.process("unblock", ids);
|
||||
logger.debug("Finished unblock process for ids: {}", ids);
|
||||
return ResponseEntity.ok("");
|
||||
}
|
||||
|
||||
@PostMapping("/removeFromSystem")
|
||||
public ResponseEntity<?> removeFromSystem(@RequestBody List<String> ids)
|
||||
throws FileNotFoundException {
|
||||
|
||||
logger.debug("Starting removeFromSystem process for ids: {}", ids);
|
||||
apiService.process("removeFromSystem", ids);
|
||||
logger.debug("Finished removeFromSystem process for ids: {}", ids);
|
||||
return ResponseEntity.ok("");
|
||||
}
|
||||
|
||||
@PostMapping("/removeFromCallList")
|
||||
public ResponseEntity<?> removeFromCallList(@RequestBody List<String> ids)
|
||||
throws FileNotFoundException {
|
||||
logger.debug("Starting removeFromCallList process for ids: {}", ids);
|
||||
apiService.process("removeFromCallList", ids);
|
||||
logger.debug("Finished removeFromCallList process for ids: {}", ids);
|
||||
return ResponseEntity.ok("");
|
||||
}
|
||||
|
||||
@PostMapping("/downloadCSV")
|
||||
public ResponseEntity<Resource> downloadCSV(@RequestBody DownloadCSVRequest request)
|
||||
throws IOException {
|
||||
logger.debug("Starting downloadCSV process for request: {}", request.getType());
|
||||
if (request.getStartDate() != null && request.getEndDate() != null) {
|
||||
if (request.getStartDate().isAfter(request.getEndDate())) {
|
||||
throw new IllegalArgumentException("Start date must be before end date");
|
||||
}
|
||||
}
|
||||
|
||||
File csvFile = apiService.download("downloadCSV", request);
|
||||
InputStreamResource resource = new InputStreamResource(new FileInputStream(csvFile));
|
||||
|
||||
logger.debug("Finished downloadCSV process for request: {}. Sending to user...", request.getType());
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + csvFile.getName())
|
||||
.contentType(MediaType.parseMediaType("text/csv"))
|
||||
|
|
|
|||
|
|
@ -3,11 +3,14 @@ package org.micord.models;
|
|||
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class DownloadCSVRequest {
|
||||
private String type;
|
||||
private List<String> ids;
|
||||
private LocalDate startDate;
|
||||
private LocalDate endDate;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@ package org.micord.service;
|
|||
|
||||
import org.micord.models.*;
|
||||
import org.micord.utils.ConfigLoader;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
|
|
@ -14,6 +16,8 @@ import java.util.stream.Collectors;
|
|||
@Service
|
||||
public class ApiService {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ApiService.class);
|
||||
|
||||
@Autowired
|
||||
private ConfigLoader configLoader;
|
||||
|
||||
|
|
@ -41,7 +45,7 @@ public class ApiService {
|
|||
.findFirst()
|
||||
.orElseThrow(() -> new IllegalArgumentException("Invalid download type: " + type));
|
||||
|
||||
return downloadService.download(selectedRequest, ids);
|
||||
return downloadService.download(selectedRequest, ids, request.getStartDate(), request.getEndDate());
|
||||
}
|
||||
|
||||
public List<String> getDownloadTypes(String methodName) throws FileNotFoundException {
|
||||
|
|
@ -53,6 +57,7 @@ public class ApiService {
|
|||
}
|
||||
|
||||
private Requests getConfig(String methodName) throws FileNotFoundException {
|
||||
logger.debug("Loading configuration for method: {}", methodName);
|
||||
Optional<Requests> optionalConfig = configLoader.loadConfigIfModified(methodName);
|
||||
|
||||
if (optionalConfig.isEmpty()) {
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import java.sql.Connection;
|
|||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.time.LocalDate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
|
@ -25,13 +26,13 @@ public class DownloadService {
|
|||
|
||||
private static final Logger logger = LoggerFactory.getLogger(DownloadService.class);
|
||||
|
||||
public File download(DownloadRequest selectedRequest, List<String> ids) {
|
||||
public File download(DownloadRequest selectedRequest, List<String> ids, LocalDate startDate, LocalDate endDate) {
|
||||
|
||||
return processDownloadRequest(selectedRequest, ids);
|
||||
return processDownloadRequest(selectedRequest, ids, startDate, endDate);
|
||||
}
|
||||
|
||||
private File processDownloadRequest(DownloadRequest request, List<String> ids) {
|
||||
Map<String, Object> query = buildSqlQuery(request, ids);
|
||||
private File processDownloadRequest(DownloadRequest request, List<String> ids, LocalDate startDate, LocalDate endDate) {
|
||||
Map<String, Object> query = buildSqlQuery(request, ids, startDate, endDate);
|
||||
try (Connection connection = DatabaseConnection.getConnection(
|
||||
request.getSqlConnectionParams())) {
|
||||
String requestURL = (String) query.get("requestURL");
|
||||
|
|
@ -57,15 +58,14 @@ public class DownloadService {
|
|||
return null;
|
||||
}
|
||||
|
||||
private Map<String, Object> buildSqlQuery(DownloadRequest request, List<String> ids) {
|
||||
private Map<String, Object> buildSqlQuery(DownloadRequest request, List<String> ids, LocalDate startDate, LocalDate endDate) {
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
String endpointArguments;
|
||||
|
||||
String requestURL = request.getRequestURL();
|
||||
String requestURL = prepareRequestURL(request, startDate, endDate);
|
||||
|
||||
if (ids == null || ids.isEmpty()) {
|
||||
resultMap.put("requestURL", requestURL
|
||||
.replace("${DB}", request.getSqlConnectionParams().getJdbcDatabase())
|
||||
.replace("where id in ${endpointArguments}", ""));
|
||||
|
||||
return resultMap;
|
||||
|
|
@ -105,18 +105,25 @@ public class DownloadService {
|
|||
}
|
||||
catch (SQLException e) {
|
||||
logger.error("Failed to execute query for RequestArgument", e);
|
||||
throw new RuntimeException("Error executing database query: " + argument.getRequestArgumentURL(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resultMap.put("requestURL", requestURL
|
||||
.replace("${DB}", request.getSqlConnectionParams().getJdbcDatabase())
|
||||
.replace("${endpointArguments}", endpointArguments));
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
private String prepareRequestURL(DownloadRequest request, LocalDate startDate, LocalDate endDate) {
|
||||
return request.getRequestURL()
|
||||
.replace("${startDate}", startDate.toString())
|
||||
.replace("${endDate}", endDate.toString())
|
||||
.replace("${DB}", request.getSqlConnectionParams().getJdbcDatabase());
|
||||
}
|
||||
|
||||
private List<String[]> executeSqlQuery(Connection connection, String query) throws SQLException {
|
||||
List<String[]> results = new ArrayList<>();
|
||||
try (PreparedStatement stmt = connection.prepareStatement(query);
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ public class RequestService {
|
|||
private HttpClient httpClient;
|
||||
|
||||
public void processS3Requests(List<S3Request> s3Requests, List<String> ids) {
|
||||
logger.debug("Starting processing of S3 requests");
|
||||
if (s3Requests != null) {
|
||||
s3Requests.forEach(request -> {
|
||||
List<CompletableFuture<Void>> futures = ids.stream()
|
||||
|
|
@ -58,6 +59,7 @@ public class RequestService {
|
|||
}
|
||||
|
||||
private void processS3Request(S3Request request, String id) {
|
||||
logger.debug("Starting processing of S3 request for id: {}", id);
|
||||
try {
|
||||
List<String> files = new ArrayList<>();
|
||||
|
||||
|
|
@ -66,10 +68,14 @@ public class RequestService {
|
|||
try (Connection connection = DatabaseConnection.getConnection(
|
||||
argument.getRequestArgumentConnectionParams())) {
|
||||
String query = argument.getRequestArgumentURL();
|
||||
logger.debug("Starting fetching paths from database for S3 request");
|
||||
long startExecTime = System.currentTimeMillis();
|
||||
List<String> result = fetchFileListFromDatabaseSQL(connection, query);
|
||||
if (result != null && !result.isEmpty()) {
|
||||
files.addAll(result);
|
||||
}
|
||||
long endExecTime = System.currentTimeMillis();
|
||||
logger.debug("Paths fetched in {} ms", endExecTime - startExecTime);
|
||||
}
|
||||
catch (SQLException e) {
|
||||
logger.error("Failed to execute query for RequestArgument", e);
|
||||
|
|
@ -79,12 +85,16 @@ public class RequestService {
|
|||
|
||||
files.forEach(file -> {
|
||||
HttpRequest httpRequest;
|
||||
logger.debug("Starting building HTTP request for S3 request");
|
||||
long startExecTime = System.currentTimeMillis();
|
||||
try {
|
||||
httpRequest = S3HttpConnection.buildHttpRequest(request, file);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
long endExecTime = System.currentTimeMillis();
|
||||
logger.debug("HTTP request built in {} ms", endExecTime - startExecTime);
|
||||
|
||||
httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofString())
|
||||
.thenAccept(response -> {
|
||||
|
|
@ -112,6 +122,7 @@ public class RequestService {
|
|||
|
||||
@Transactional
|
||||
public void processSqlAndAqlRequests(Requests config, List<String> ids) {
|
||||
logger.debug("Starting transactional processing of requests");
|
||||
if (config.getSqlRequests() != null) {
|
||||
for (SqlRequest request : config.getSqlRequests()) {
|
||||
processSqlRequests(request, ids);
|
||||
|
|
@ -127,7 +138,10 @@ public class RequestService {
|
|||
}
|
||||
|
||||
private void processSqlRequests(SqlRequest request, List<String> ids) {
|
||||
logger.debug("Starting transactional processing of SQL requests");
|
||||
Map<String, Object> query = buildSqlQuery(request, ids);
|
||||
logger.debug("Opening connection for SQL Request: {}", request.getRequestURL());
|
||||
long startExecTime = System.currentTimeMillis();
|
||||
try (Connection connection = DatabaseConnection.getConnection(
|
||||
request.getSqlConnectionParams())) {
|
||||
String requestURL = (String) query.get("requestURL");
|
||||
|
|
@ -139,6 +153,8 @@ public class RequestService {
|
|||
} else {
|
||||
logger.warn("No IDs found for the query");
|
||||
}
|
||||
long endExecTime = System.currentTimeMillis();
|
||||
logger.debug("SQL request executed in {} ms", endExecTime - startExecTime);
|
||||
|
||||
logger.info("Successfully executed query {} for IDs: ({})", requestURL, String.join(", ", ids));
|
||||
}
|
||||
|
|
@ -148,6 +164,8 @@ public class RequestService {
|
|||
}
|
||||
|
||||
private Map<String, Object> buildSqlQuery(SqlRequest request, List<String> ids) {
|
||||
logger.debug("Starting building SQL query for request: {}", request.getRequestURL());
|
||||
long startExecTime = System.currentTimeMillis();
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
String endpointArguments;
|
||||
|
||||
|
|
@ -167,6 +185,7 @@ private Map<String, Object> buildSqlQuery(SqlRequest request, List<String> ids)
|
|||
for (RequestArgument argument : request.getRequestArguments()) {
|
||||
|
||||
if (argument.getRequestArgumentConnectionParams() != null) {
|
||||
logger.debug("Opening connection for SQL RequestArgument: {}", argument.getRequestArgumentName());
|
||||
try (Connection connection = DatabaseConnection.getConnection(
|
||||
argument.getRequestArgumentConnectionParams())) {
|
||||
String query = argument.getRequestArgumentURL();
|
||||
|
|
@ -196,6 +215,9 @@ private Map<String, Object> buildSqlQuery(SqlRequest request, List<String> ids)
|
|||
.replace("${DB}", request.getSqlConnectionParams().getJdbcDatabase())
|
||||
.replace("${endpointArguments}", endpointArguments));
|
||||
|
||||
long endExecTime = System.currentTimeMillis();
|
||||
logger.debug("SQL query built in {} ms", endExecTime - startExecTime);
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue