Merge branch 'develop' into feature/update/3.192.5

This commit is contained in:
kochetkov 2025-04-11 08:45:21 +03:00
commit e9334bfe30
9 changed files with 155 additions and 47 deletions

View file

@ -1,13 +1,11 @@
package org.micord.models;
import lombok.Setter;
import org.micord.enums.RequestArgumentType;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlElementWrapper;
import jakarta.xml.bind.annotation.XmlRootElement;
import java.util.List;
import lombok.Setter;
/**
* @author Maksim Tereshin

View file

@ -1,5 +1,7 @@
package org.micord.models.requests;
import java.util.List;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
@ -7,8 +9,6 @@ import jakarta.xml.bind.annotation.XmlElementWrapper;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@XmlAccessorType(XmlAccessType.FIELD)
@ -17,6 +17,9 @@ public class AqlRequest extends BaseRequest {
@XmlElement(name = "AqlConnectionParams")
private AqlConnectionParams aqlConnectionParams;
@XmlElement(name = "AqlRequestParameters")
private AqlRequestParameters aqlRequestParameters;
@XmlElementWrapper(name = "AqlRequestCollections")
@XmlElement(name = "AqlRequestCollection")
private List<AqlRequestCollection> aqlRequestCollections;

View file

@ -0,0 +1,40 @@
package org.micord.models.requests;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "AqlRequestParameter")
public class AqlRequestParameter {
private String type;
private SqlConnectionParams sqlConnectionParams;
private String aqlRequestParameterURL;
@XmlAttribute(name = "type")
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@XmlElement(name = "SqlConnectionParams")
public SqlConnectionParams getSqlConnectionParams() {
return sqlConnectionParams;
}
public void setSqlConnectionParams(SqlConnectionParams sqlConnectionParams) {
this.sqlConnectionParams = sqlConnectionParams;
}
@XmlElement(name = "AqlRequestParameterURL")
public String getAqlRequestParameterURL() {
return aqlRequestParameterURL;
}
public void setAqlRequestParameterURL(String aqlRequestParameterURL) {
this.aqlRequestParameterURL = aqlRequestParameterURL;
}
}

View file

@ -0,0 +1,22 @@
package org.micord.models.requests;
import java.util.ArrayList;
import java.util.List;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "AqlRequestParameters")
public class AqlRequestParameters {
private List<AqlRequestParameter> parameters = new ArrayList<>();
@XmlElement(name = "AqlRequestParameter")
public List<AqlRequestParameter> getParameters() {
return parameters;
}
public void setParameters(List<AqlRequestParameter> parameters) {
this.parameters = parameters;
}
}

View file

@ -1,15 +1,12 @@
package org.micord.models.requests;
import java.util.List;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlSeeAlso;
import lombok.Getter;
import lombok.Setter;
import org.micord.models.requests.downloads.AQLDownloadRequest;
import org.micord.models.requests.downloads.SQLDownloadRequest;
import java.util.List;
@Getter
@Setter

View file

@ -1,10 +1,11 @@
package org.micord.models.requests;
import org.micord.enums.RequestArgumentType;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
import lombok.Setter;
import org.micord.enums.RequestArgumentType;
/**
* @author Maksim Tereshin

View file

@ -1,13 +1,16 @@
package org.micord.models.requests.downloads;
import jakarta.xml.bind.annotation.*;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
import org.micord.models.requests.AqlConnectionParams;
import org.micord.models.requests.AqlRequestCollection;
import org.micord.models.requests.SqlConnectionParams;
import java.util.List;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlElementWrapper;
import lombok.Getter;
import lombok.Setter;
@Getter

View file

@ -1,12 +1,12 @@
package org.micord.models.requests.downloads;
import org.micord.models.requests.BaseRequest;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlSeeAlso;
import lombok.Getter;
import lombok.Setter;
import org.micord.models.requests.BaseRequest;
@Getter
@Setter

View file

@ -1,28 +1,5 @@
package org.micord.service;
import com.arangodb.ArangoCursor;
import com.arangodb.ArangoDBException;
import com.arangodb.ArangoDatabase;
import com.arangodb.entity.StreamTransactionEntity;
import com.arangodb.model.AqlQueryOptions;
import com.arangodb.model.StreamTransactionOptions;
import org.micord.config.ArangoDBConnection;
import org.micord.config.DatabaseConnection;
import org.micord.config.S3HttpConnection;
import org.micord.enums.RequestArgumentType;
import org.micord.exceptions.IllegalRequestParametersException;
import org.micord.models.requests.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.FileNotFoundException;
import java.io.StringReader;
import java.net.HttpURLConnection;
@ -34,10 +11,46 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.micord.config.ArangoDBConnection;
import org.micord.config.DatabaseConnection;
import org.micord.config.S3HttpConnection;
import org.micord.enums.RequestArgumentType;
import org.micord.models.requests.AqlRequest;
import org.micord.models.requests.AqlRequestParameter;
import org.micord.models.requests.BaseRequest;
import org.micord.models.requests.RequestArgument;
import org.micord.models.requests.RequestParameters;
import org.micord.models.requests.Requests;
import org.micord.models.requests.S3Request;
import org.micord.models.requests.SqlRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import com.arangodb.ArangoCursor;
import com.arangodb.ArangoDBException;
import com.arangodb.ArangoDatabase;
import com.arangodb.entity.StreamTransactionEntity;
import com.arangodb.model.AqlQueryOptions;
import com.arangodb.model.StreamTransactionOptions;
@Service
public class RequestService {
@ -549,23 +562,23 @@ public class RequestService {
// TODO: implement for multiple request arguments
RequestArgument requestArgument = request.getRequestArguments().get(0);
List<String> collectionTypes = new ArrayList<>();
List<String> collectionNames = new ArrayList<>();
request.getAqlRequestCollections().forEach(collection -> {
collectionTypes.add(collection.getType());
collectionNames.add(collection.getType());
});
StreamTransactionEntity tx = null;
try {
StreamTransactionOptions options = new StreamTransactionOptions()
.writeCollections(collectionTypes.toArray(new String[0]))
.readCollections(collectionTypes.toArray(new String[0]));
.writeCollections(collectionNames.toArray(new String[0]))
.readCollections(collectionNames.toArray(new String[0]));
tx = arangoDb.beginStreamTransaction(options);
String transactionId = tx.getId();
logger.info("Stream transaction started with ID: {}", transactionId);
Map<String, Object> entities = executeSelectAqlRequest(arangoDb, requestArgument, ids, transactionId, validationResults);
Map<String, Object> entities = executeSelectAqlRequest(arangoDb, request, requestArgument, ids, transactionId, validationResults);
if (entities.isEmpty()) {
logger.warn("No entities found for main AQL request.");
@ -607,6 +620,7 @@ public class RequestService {
}
private Map<String, Object> executeSelectAqlRequest(ArangoDatabase arangoDb,
AqlRequest request,
RequestArgument requestArgument,
List<String> ids, String transactionId, Map<String, Boolean> validationResults) {
Map<String, Object> entities = new HashMap<>();
@ -621,8 +635,38 @@ public class RequestService {
if (!emptyIdsAllowed) bindVars.put("ids", ids);
if (request.getAqlRequestParameters() != null) {
for (AqlRequestParameter parameter : request.getAqlRequestParameters().getParameters()) {
try (Connection connection = DatabaseConnection.getConnection(parameter.getSqlConnectionParams())) {
String sqlQuery = parameter.getAqlRequestParameterURL();
if (sqlQuery.contains("${endpointArguments}")) {
String inClause = ids.stream()
.map(id -> "'" + id + "'")
.collect(Collectors.joining(", "));
sqlQuery = sqlQuery.replace("${endpointArguments}", "(" + inClause + ")");
}
logger.info("Executing SQL query: {}", sqlQuery);
List<String> parameterValues = fetchFileListFromDatabaseSQL(connection, sqlQuery);
if (parameterValues != null && !parameterValues.isEmpty()) {
logger.info("Parameter type: {}; values: {}", parameter.getType(), parameterValues.get(0));
} else {
logger.info("No values found for parameter type: {}", parameter.getType());
}
bindVars.put(parameter.getType(), parameterValues);
} catch (SQLException e) {
logger.error("Failed to fetch parameter values for type: {}", parameter.getType(), e);
throw new RuntimeException("Failed to execute SQL query: " + e.getMessage(), e);
}
}
}
AqlQueryOptions aqlQueryOptions = new AqlQueryOptions().streamTransactionId(transactionId);
bindVars.forEach((key, value) -> {
logger.info("Key: {}; Value: {}", key, value);
});
try (ArangoCursor<Map> cursor = arangoDb.query(url, Map.class, bindVars, aqlQueryOptions)) {
while (cursor.hasNext()) {
Map<String, Object> result = cursor.next();