Merge branch 'master' into dev
# Conflicts: # credit-tracker.properties # pom.xml # src/main/java/ru/nbch/credit_tracker/config/datasource/DatabaseConfig.java # src/main/java/ru/nbch/credit_tracker/config/datasource/IndicDataSourceConfig.java # src/main/java/ru/nbch/credit_tracker/config/datasource/ScoringDataSourceConfig.java # src/main/java/ru/nbch/credit_tracker/config/datasource/SignalDataSourceConfig.java # src/main/java/ru/nbch/credit_tracker/config/rest/GlobalExceptionHandler.java # src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java # src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java # src/main/java/ru/nbch/credit_tracker/utils/ValidationService.java # src/main/java/ru/nbch/credit_tracker/utils/error/ExceptionUtils.java # src/main/resources/logback.xml
This commit is contained in:
commit
c013b616c7
30 changed files with 605 additions and 183 deletions
|
|
@ -8,21 +8,45 @@ server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b
|
||||||
# datasources
|
# datasources
|
||||||
# indic
|
# indic
|
||||||
ct.indic-data-source-settings.driver=com.ibm.db2.jcc.DB2Driver
|
ct.indic-data-source-settings.driver=com.ibm.db2.jcc.DB2Driver
|
||||||
ct.indic-data-source-settings.url=${DB_URL_INDIC:jdbc:db2://10.230.227.100:2668/cprosd22:currentSchema=INDIC;}
|
ct.indic-data-source-settings.url=${DB_URL_INDIC:jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=INDIC;}
|
||||||
ct.indic-data-source-settings.username=${USERNAME_INDIC:ros9appl}
|
ct.indic-data-source-settings.username=${USERNAME_INDIC:tester}
|
||||||
ct.indic-data-source-settings.password=${PASSWORD_INDIC:R0s9Appl}
|
ct.indic-data-source-settings.password=${PASSWORD_INDIC:tester}
|
||||||
|
ct.indic-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_INDIC:10}
|
||||||
|
ct.indic-data-source-settings.minimum-idle=${MINIMUM_IDLE_INDIC:10}
|
||||||
|
ct.indic-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_INDIC:10000}
|
||||||
|
ct.indic-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_INDIC:5000}
|
||||||
|
ct.indic-data-source-settings.idle-timeout=${IDLE_TIMEOUT_INDIC:600000}
|
||||||
|
ct.indic-data-source-settings.max-lifetime=${MAX_LIFETIME_INDIC:1800000}
|
||||||
|
ct.indic-data-source-settings.keepalive-time=${KEEPALIVE_TIME_INDIC:0}
|
||||||
|
ct.indic-data-source-settings.leak-detection-threshold=${LEAK_DETECTION_THRESHOLD_INDIC:0}
|
||||||
|
|
||||||
# signal
|
# signal
|
||||||
ct.signal-data-source-settings.driver=org.postgresql.Driver
|
ct.signal-data-source-settings.driver=org.postgresql.Driver
|
||||||
ct.signal-data-source-settings.url=${DB_URL_SIGNAL:jdbc:postgresql://10.200.200.133:5432/credit_tracker}
|
ct.signal-data-source-settings.url=${DB_URL_SIGNAL:jdbc:postgresql://10.200.200.133:5432/credit_tracker}
|
||||||
ct.signal-data-source-settings.username=${USERNAME_SIGNAL:credit_tracker_user}
|
ct.signal-data-source-settings.username=${USERNAME_SIGNAL:credit_tracker_user}
|
||||||
ct.signal-data-source-settings.password=${PASSWORD_SIGNAL:-}
|
ct.signal-data-source-settings.password=${PASSWORD_SIGNAL:-}
|
||||||
|
ct.signal-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_SIGNAL:10}
|
||||||
|
ct.signal-data-source-settings.minimum-idle=${MINIMUM_IDLE_SIGNAL:10}
|
||||||
|
ct.signal-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_SIGNAL:10000}
|
||||||
|
ct.signal-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_SIGNAL:5000}
|
||||||
|
ct.signal-data-source-settings.idle-timeout=${IDLE_TIMEOUT_SIGNAL:600000}
|
||||||
|
ct.signal-data-source-settings.max-lifetime=${MAX_LIFETIME_SIGNAL:1800000}
|
||||||
|
ct.signal-data-source-settings.keepalive-time=${KEEPALIVE_TIME_SIGNAL:0}
|
||||||
|
ct.signal-data-source-settings.leak-detection-threshold=${LEAK_DETECTION_THRESHOLD_SIGNAL:0}
|
||||||
|
|
||||||
# scoring
|
# scoring
|
||||||
ct.scoring-data-source-settings.driver=com.ibm.db2.jcc.DB2Driver
|
ct.scoring-data-source-settings.driver=com.ibm.db2.jcc.DB2Driver
|
||||||
ct.scoring-data-source-settings.url=${DB_URL_SCORING:jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=TEST_2_INDIC;}
|
ct.scoring-data-source-settings.url=${DB_URL_SCORING:jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=TEST_2_INDIC;}
|
||||||
ct.scoring-data-source-settings.username=${USERNAME_SCORING:tester}
|
ct.scoring-data-source-settings.username=${USERNAME_SCORING:tester}
|
||||||
ct.scoring-data-source-settings.password=${PASSWORD_SCORING:tester}
|
ct.scoring-data-source-settings.password=${PASSWORD_SCORING:tester}
|
||||||
|
ct.scoring-data-source-settings.maximum-pool-size=${MAXIMUM_POOL_SIZE_SCORING:10}
|
||||||
|
ct.scoring-data-source-settings.minimum-idle=${MINIMUM_IDLE_SCORING:10}
|
||||||
|
ct.scoring-data-source-settings.connection-timeout=${CONNECTION_TIMEOUT_SCORING:10000}
|
||||||
|
ct.scoring-data-source-settings.validation-timeout=${VALIDATION_TIMEOUT_SCORING:5000}
|
||||||
|
ct.scoring-data-source-settings.idle-timeout=${IDLE_TIMEOUT_SCORING:600000}
|
||||||
|
ct.scoring-data-source-settings.max-lifetime=${MAX_LIFETIME_SCORING:1800000}
|
||||||
|
ct.scoring-data-source-settings.keepalive-time=${KEEPALIVE_TIME_SCORING:0}
|
||||||
|
ct.scoring-data-source-settings.leak-detection-threshold=${LEAK_DETECTION_THRESHOLD_SCORING:0}
|
||||||
|
|
||||||
ct.max_xml_file_size=${ACCEPTED_XML_SIZE:1024}
|
ct.max_xml_file_size=${ACCEPTED_XML_SIZE:1024}
|
||||||
spring.servlet.multipart.max-file-size=${ACCEPTED_ARCHIVE_SIZE:2048MB}
|
spring.servlet.multipart.max-file-size=${ACCEPTED_ARCHIVE_SIZE:2048MB}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#commons
|
#commons
|
||||||
APP_VERSION=1.15
|
APP_VERSION=1.17
|
||||||
REGISTRY_URL=rh8-vm3.nbki.msk:5000
|
REGISTRY_URL=rh8-vm3.nbki.msk:5000
|
||||||
JMX_PORT=
|
JMX_PORT=
|
||||||
JMX_HOSTNAME=
|
JMX_HOSTNAME=
|
||||||
|
|
@ -24,16 +24,41 @@ SERVER_PORT=8099
|
||||||
DB_URL_INDIC=jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=INDIC;
|
DB_URL_INDIC=jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=INDIC;
|
||||||
USERNAME_INDIC=tester
|
USERNAME_INDIC=tester
|
||||||
PASSWORD_INDIC=tester
|
PASSWORD_INDIC=tester
|
||||||
|
MAXIMUM_POOL_SIZE_INDIC=10
|
||||||
|
MINIMUM_IDLE_INDIC=10
|
||||||
|
CONNECTION_TIMEOUT_INDIC=10000
|
||||||
|
VALIDATION_TIMEOUT_INDIC=5000
|
||||||
|
IDLE_TIMEOUT_INDIC=600000
|
||||||
|
MAX_LIFETIME_INDIC=1800000
|
||||||
|
KEEPALIVE_TIME_INDIC=0
|
||||||
|
LEAK_DETECTION_THRESHOLD_INDIC=0
|
||||||
|
|
||||||
|
|
||||||
# signal
|
# signal
|
||||||
DB_URL_SIGNAL=jdbc:postgresql://10.200.200.133:5432/credit_tracker
|
DB_URL_SIGNAL=jdbc:postgresql://10.200.200.133:5432/credit_tracker
|
||||||
USERNAME_SIGNAL=credit_tracker_user
|
USERNAME_SIGNAL=credit_tracker_user
|
||||||
PASSWORD_SIGNAL=
|
PASSWORD_SIGNAL=
|
||||||
|
MAXIMUM_POOL_SIZE_SIGNAL=10
|
||||||
|
MINIMUM_IDLE_SIGNAL=10
|
||||||
|
CONNECTION_TIMEOUT_SIGNAL=10000
|
||||||
|
VALIDATION_TIMEOUT_SIGNAL=5000
|
||||||
|
IDLE_TIMEOUT_SIGNAL=600000
|
||||||
|
MAX_LIFETIME_SIGNAL=1800000
|
||||||
|
KEEPALIVE_TIME_SIGNAL=0
|
||||||
|
LEAK_DETECTION_THRESHOLD_SIGNAL=0
|
||||||
|
|
||||||
# scoring
|
# scoring
|
||||||
DB_URL_SCORING=jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=TEST_2_INDIC;
|
DB_URL_SCORING=jdbc:db2://10.230.227.101:2668/cprosd22:currentSchema=TEST_2_INDIC;
|
||||||
USERNAME_SCORING=tester
|
USERNAME_SCORING=tester
|
||||||
PASSWORD_SCORING=tester
|
PASSWORD_SCORING=tester
|
||||||
|
MAXIMUM_POOL_SIZE_SCORING=10
|
||||||
|
MINIMUM_IDLE_SCORING=10
|
||||||
|
CONNECTION_TIMEOUT_SCORING=10000
|
||||||
|
VALIDATION_TIMEOUT_SCORING=5000
|
||||||
|
IDLE_TIMEOUT_SCORING=600000
|
||||||
|
MAX_LIFETIME_SCORING=1800000
|
||||||
|
KEEPALIVE_TIME_SCORING=0
|
||||||
|
LEAK_DETECTION_THRESHOLD_SCORING=0
|
||||||
|
|
||||||
# размер в mb
|
# размер в mb
|
||||||
ACCEPTED_XML_SIZE=1024
|
ACCEPTED_XML_SIZE=1024
|
||||||
|
|
|
||||||
|
|
@ -23,12 +23,36 @@ services:
|
||||||
- DB_URL_INDIC=${DB_URL_INDIC}
|
- DB_URL_INDIC=${DB_URL_INDIC}
|
||||||
- USERNAME_INDIC=${USERNAME_INDIC}
|
- USERNAME_INDIC=${USERNAME_INDIC}
|
||||||
- PASSWORD_INDIC=${PASSWORD_INDIC}
|
- PASSWORD_INDIC=${PASSWORD_INDIC}
|
||||||
|
- MAXIMUM_POOL_SIZE_INDIC=${MAXIMUM_POOL_SIZE_INDIC}
|
||||||
|
- MINIMUM_IDLE_INDIC=${MINIMUM_IDLE_INDIC}
|
||||||
|
- CONNECTION_TIMEOUT_INDIC=${CONNECTION_TIMEOUT_INDIC}
|
||||||
|
- VALIDATION_TIMEOUT_INDIC=${VALIDATION_TIMEOUT_INDIC}
|
||||||
|
- IDLE_TIMEOUT_INDIC=${IDLE_TIMEOUT_INDIC}
|
||||||
|
- MAX_LIFETIME_INDIC=${MAX_LIFETIME_INDIC}
|
||||||
|
- KEEPALIVE_TIME_INDIC=${KEEPALIVE_TIME_INDIC}
|
||||||
|
- LEAK_DETECTION_THRESHOLD_INDIC=${LEAK_DETECTION_THRESHOLD_INDIC}
|
||||||
- DB_URL_SIGNAL=${DB_URL_SIGNAL}
|
- DB_URL_SIGNAL=${DB_URL_SIGNAL}
|
||||||
- USERNAME_SIGNAL=${USERNAME_SIGNAL}
|
- USERNAME_SIGNAL=${USERNAME_SIGNAL}
|
||||||
- PASSWORD_SIGNAL=${PASSWORD_SIGNAL}
|
- PASSWORD_SIGNAL=${PASSWORD_SIGNAL}
|
||||||
|
- MAXIMUM_POOL_SIZE_SIGNAL=${MAXIMUM_POOL_SIZE_SIGNAL}
|
||||||
|
- MINIMUM_IDLE_SIGNAL=${MINIMUM_IDLE_SIGNAL}
|
||||||
|
- CONNECTION_TIMEOUT_SIGNAL=${CONNECTION_TIMEOUT_SIGNAL}
|
||||||
|
- VALIDATION_TIMEOUT_SIGNAL=${VALIDATION_TIMEOUT_SIGNAL}
|
||||||
|
- IDLE_TIMEOUT_SIGNAL=${IDLE_TIMEOUT_SIGNAL}
|
||||||
|
- MAX_LIFETIME_SIGNAL=${MAX_LIFETIME_SIGNAL}
|
||||||
|
- KEEPALIVE_TIME_SIGNAL=${KEEPALIVE_TIME_SIGNAL}
|
||||||
|
- LEAK_DETECTION_THRESHOLD_SIGNAL=${LEAK_DETECTION_THRESHOLD_SIGNAL}
|
||||||
- DB_URL_SCORING=${DB_URL_SCORING}
|
- DB_URL_SCORING=${DB_URL_SCORING}
|
||||||
- USERNAME_SCORING=${USERNAME_SCORING}
|
- USERNAME_SCORING=${USERNAME_SCORING}
|
||||||
- PASSWORD_SCORING=${PASSWORD_SCORING}
|
- PASSWORD_SCORING=${PASSWORD_SCORING}
|
||||||
|
- MAXIMUM_POOL_SIZE_SCORING=${MAXIMUM_POOL_SIZE_SCORING}
|
||||||
|
- MINIMUM_IDLE_SCORING=${MINIMUM_IDLE_SCORING}
|
||||||
|
- CONNECTION_TIMEOUT_SCORING=${CONNECTION_TIMEOUT_SCORING}
|
||||||
|
- VALIDATION_TIMEOUT_SCORING=${VALIDATION_TIMEOUT_SCORING}
|
||||||
|
- IDLE_TIMEOUT_SCORING=${IDLE_TIMEOUT_SCORING}
|
||||||
|
- MAX_LIFETIME_SCORING=${MAX_LIFETIME_SCORING}
|
||||||
|
- KEEPALIVE_TIME_SCORING=${KEEPALIVE_TIME_SCORING}
|
||||||
|
- LEAK_DETECTION_THRESHOLD_SCORING=${LEAK_DETECTION_THRESHOLD_SCORING}
|
||||||
- ACCEPTED_XML_SIZE=${ACCEPTED_XML_SIZE}
|
- ACCEPTED_XML_SIZE=${ACCEPTED_XML_SIZE}
|
||||||
- ACCEPTED_ARCHIVE_SIZE=${ACCEPTED_ARCHIVE_SIZE}
|
- ACCEPTED_ARCHIVE_SIZE=${ACCEPTED_ARCHIVE_SIZE}
|
||||||
- SIGNALS_ROOT_URI=${SIGNALS_ROOT_URI}
|
- SIGNALS_ROOT_URI=${SIGNALS_ROOT_URI}
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,12 @@ import ru.nbch.credit_tracker.entities.external_request.signals.Person;
|
||||||
import ru.nbch.credit_tracker.service.indic.PersonService;
|
import ru.nbch.credit_tracker.service.indic.PersonService;
|
||||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||||
|
|
||||||
import java.text.DateFormat;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class PersonFactoryBuilder {
|
public class PersonFactoryBuilder {
|
||||||
private final static DateFormat DATE_FORMAT = new SimpleDateFormat("dd.MM.yyyy");
|
private final static DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd.MM.yyyy");
|
||||||
|
|
||||||
private final static String DEFAULT_DATE = "01.01.2000";
|
private final static String DEFAULT_DATE = "01.01.2000";
|
||||||
private final static String IP = "0";
|
private final static String IP = "0";
|
||||||
|
|
@ -57,10 +56,10 @@ public class PersonFactoryBuilder {
|
||||||
person.setS(nameData.getLastName());
|
person.setS(nameData.getLastName());
|
||||||
person.setN(nameData.getFirstName());
|
person.setN(nameData.getFirstName());
|
||||||
person.setM(StringUtils.isNotBlank(nameData.getMiddleName()) ? nameData.getMiddleName() : null);
|
person.setM(StringUtils.isNotBlank(nameData.getMiddleName()) ? nameData.getMiddleName() : null);
|
||||||
person.setD(DATE_FORMAT.format(CTUtil.localDatetoDate(nameData.getBirthDate())));
|
person.setD(DATE_FORMAT.format(nameData.getBirthDate()));
|
||||||
|
|
||||||
person.setPn(getPn(passportData.getSerNum(), passportData.getIdNum()));
|
person.setPn(getPn(passportData.getSerNum(), passportData.getIdNum()));
|
||||||
person.setPd(DATE_FORMAT.format(CTUtil.localDatetoDate(LocalDate.now()))); // Do not use passport iss_date. Signal service could reject the package
|
person.setPd(DATE_FORMAT.format(LocalDate.now())); // Do not use passport iss_date. Signal service could reject the package
|
||||||
person.setDt(getDt(passportData.getIdType(), passportData.getIdType2()));
|
person.setDt(getDt(passportData.getIdType(), passportData.getIdType2()));
|
||||||
if (person.getDt() != null && person.getDt().equals("999")) {
|
if (person.getDt() != null && person.getDt().equals("999")) {
|
||||||
person.setOdt(ODT);
|
person.setOdt(ODT);
|
||||||
|
|
@ -69,12 +68,12 @@ public class PersonFactoryBuilder {
|
||||||
person.setIp(IP);
|
person.setIp(IP);
|
||||||
person.setUid(uid);
|
person.setUid(uid);
|
||||||
person.setOksm(OKSM);
|
person.setOksm(OKSM);
|
||||||
person.setConsentDate(DATE_FORMAT.format(CTUtil.localDatetoDate(LocalDate.now())));
|
person.setConsentDate(DATE_FORMAT.format(LocalDate.now()));
|
||||||
person.setConsentPurpose(CONSENT_PURPOSE);
|
person.setConsentPurpose(CONSENT_PURPOSE);
|
||||||
person.setReportUser(REPORT_USER);
|
person.setReportUser(REPORT_USER);
|
||||||
person.setLiability(LIABILITY);
|
person.setLiability(LIABILITY);
|
||||||
person.setConsentPeriod(CONSENT_PERIOD);
|
person.setConsentPeriod(CONSENT_PERIOD);
|
||||||
person.setAgrDate(DATE_FORMAT.format(CTUtil.localDatetoDate(LocalDate.now())));
|
person.setAgrDate(DATE_FORMAT.format(LocalDate.now()));
|
||||||
person.setReportUserRegNum(REPORT_USER_REG_NUM);
|
person.setReportUserRegNum(REPORT_USER_REG_NUM);
|
||||||
person.setReportUserTaxID(REPORT_USER_TAX_ID);
|
person.setReportUserTaxID(REPORT_USER_TAX_ID);
|
||||||
person.setConsentHash(CONSENT_HASH);
|
person.setConsentHash(CONSENT_HASH);
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,20 @@
|
||||||
package ru.nbch.credit_tracker.config.datasource;
|
package ru.nbch.credit_tracker.config.datasource;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import com.zaxxer.hikari.HikariDataSource;
|
||||||
import org.springframework.boot.jdbc.DataSourceBuilder;
|
import org.springframework.boot.jdbc.DataSourceBuilder;
|
||||||
import ru.nbch.credit_tracker.config.settings.DataSourceSettings;
|
import ru.nbch.credit_tracker.config.settings.DataSourceSettings;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
public class DatabaseConfig {
|
public class DatabaseConfig {
|
||||||
|
|
||||||
protected DataSource createDataSource(DataSourceSettings settings) {
|
protected HikariDataSource createDataSource(DataSourceSettings settings) {
|
||||||
return DataSourceBuilder.create()
|
return DataSourceBuilder.create()
|
||||||
.driverClassName(settings.driver())
|
.driverClassName(settings.driver())
|
||||||
.url(settings.url())
|
.url(settings.url())
|
||||||
.username(settings.username())
|
.username(settings.username())
|
||||||
.password(settings.password())
|
.password(settings.password())
|
||||||
|
.type(HikariDataSource.class)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,8 @@ import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
|
||||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||||
|
import ru.nbch.credit_tracker.config.settings.DataSourceSettings;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
|
|
@ -30,15 +30,25 @@ public class IndicDataSourceConfig extends DatabaseConfig {
|
||||||
|
|
||||||
@Bean(name = "indicDataSource")
|
@Bean(name = "indicDataSource")
|
||||||
public DataSource dataSource(CreditTrackerSettings config) throws SQLException {
|
public DataSource dataSource(CreditTrackerSettings config) throws SQLException {
|
||||||
HikariDataSource dataSource = (HikariDataSource) createDataSource(config.getIndicDataSourceSettings());
|
DataSourceSettings indicSetings = config.getIndicDataSourceSettings();
|
||||||
dataSource.setMaximumPoolSize(50);
|
|
||||||
|
HikariDataSource dataSource = createDataSource(indicSetings);
|
||||||
|
dataSource.setMaximumPoolSize(indicSetings.maximumPoolSize());
|
||||||
|
dataSource.setMinimumIdle(indicSetings.minimumIdle());
|
||||||
|
dataSource.setConnectionTimeout(indicSetings.connectionTimeout());
|
||||||
|
dataSource.setValidationTimeout(indicSetings.validationTimeout());
|
||||||
|
dataSource.setIdleTimeout(indicSetings.idleTimeout());
|
||||||
|
dataSource.setMaxLifetime(indicSetings.maxLifetime());
|
||||||
|
dataSource.setKeepaliveTime(indicSetings.keepaliveTime());
|
||||||
|
dataSource.setLeakDetectionThreshold(indicSetings.leakDetectionThreshold());
|
||||||
|
|
||||||
try (Connection connection = dataSource.getConnection()) {
|
try (Connection connection = dataSource.getConnection()) {
|
||||||
connection.isValid(3);
|
connection.isValid(3);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
log.error("Unable to connect to Indic url={}", config.getIndicDataSourceSettings().url(), e);
|
log.error("Unable to connect to Indic url={}", indicSetings.url(), e);
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
log.info("Connected to Indic: url={}", config.getIndicDataSourceSettings().url());
|
log.info("Connected to Indic: url={}", indicSetings.url());
|
||||||
return dataSource;
|
return dataSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,6 @@
|
||||||
package ru.nbch.credit_tracker.config.datasource;
|
package ru.nbch.credit_tracker.config.datasource;
|
||||||
|
|
||||||
import com.zaxxer.hikari.HikariDataSource;
|
import com.zaxxer.hikari.HikariDataSource;
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import javax.sql.DataSource;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.ibatis.session.SqlSessionFactory;
|
import org.apache.ibatis.session.SqlSessionFactory;
|
||||||
import org.mybatis.spring.SqlSessionFactoryBean;
|
import org.mybatis.spring.SqlSessionFactoryBean;
|
||||||
|
|
@ -14,6 +11,11 @@ import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||||
|
import ru.nbch.credit_tracker.config.settings.DataSourceSettings;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Configuration
|
@Configuration
|
||||||
|
|
@ -28,15 +30,25 @@ public class ScoringDataSourceConfig extends DatabaseConfig {
|
||||||
|
|
||||||
@Bean(name = "scoringDataSource")
|
@Bean(name = "scoringDataSource")
|
||||||
public DataSource dataSource(CreditTrackerSettings config) throws SQLException {
|
public DataSource dataSource(CreditTrackerSettings config) throws SQLException {
|
||||||
HikariDataSource dataSource = (HikariDataSource) createDataSource(config.getScoringDataSourceSettings());
|
DataSourceSettings scoringSetings = config.getScoringDataSourceSettings();
|
||||||
dataSource.setMaximumPoolSize(10);
|
|
||||||
|
HikariDataSource dataSource = createDataSource(scoringSetings);
|
||||||
|
dataSource.setMaximumPoolSize(scoringSetings.maximumPoolSize());
|
||||||
|
dataSource.setMinimumIdle(scoringSetings.minimumIdle());
|
||||||
|
dataSource.setConnectionTimeout(scoringSetings.connectionTimeout());
|
||||||
|
dataSource.setValidationTimeout(scoringSetings.validationTimeout());
|
||||||
|
dataSource.setIdleTimeout(scoringSetings.idleTimeout());
|
||||||
|
dataSource.setMaxLifetime(scoringSetings.maxLifetime());
|
||||||
|
dataSource.setKeepaliveTime(scoringSetings.keepaliveTime());
|
||||||
|
dataSource.setLeakDetectionThreshold(scoringSetings.leakDetectionThreshold());
|
||||||
|
|
||||||
try (Connection connection = dataSource.getConnection()) {
|
try (Connection connection = dataSource.getConnection()) {
|
||||||
connection.isValid(3);
|
connection.isValid(3);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
log.error("Unable to connect to Scoring url={}", config.getScoringDataSourceSettings().url(), e);
|
log.error("Unable to connect to Scoring url={}", scoringSetings.url(), e);
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
log.info("Connected to Scoring: url={}", config.getScoringDataSourceSettings().url());
|
log.info("Connected to Scoring: url={}", scoringSetings.url());
|
||||||
return dataSource;
|
return dataSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,8 @@
|
||||||
package ru.nbch.credit_tracker.config.datasource;
|
package ru.nbch.credit_tracker.config.datasource;
|
||||||
|
|
||||||
import com.zaxxer.hikari.HikariDataSource;
|
import com.zaxxer.hikari.HikariDataSource;
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.UUID;
|
|
||||||
import javax.sql.DataSource;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.ibatis.session.SqlSessionFactory;
|
import org.apache.ibatis.session.SqlSessionFactory;
|
||||||
import org.apache.ibatis.type.TypeHandlerRegistry;
|
|
||||||
import org.mybatis.spring.SqlSessionFactoryBean;
|
import org.mybatis.spring.SqlSessionFactoryBean;
|
||||||
import org.mybatis.spring.annotation.MapperScan;
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
|
@ -15,8 +10,12 @@ import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
import ru.nbch.credit_tracker.config.datasource.handlers.UUIDTypeHandler;
|
|
||||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||||
|
import ru.nbch.credit_tracker.config.settings.DataSourceSettings;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Configuration
|
@Configuration
|
||||||
|
|
@ -30,15 +29,25 @@ public class SignalDataSourceConfig extends DatabaseConfig {
|
||||||
|
|
||||||
@Bean(name = "signalDataSource")
|
@Bean(name = "signalDataSource")
|
||||||
public DataSource dataSource(CreditTrackerSettings config) throws SQLException {
|
public DataSource dataSource(CreditTrackerSettings config) throws SQLException {
|
||||||
HikariDataSource dataSource = (HikariDataSource) createDataSource(config.getSignalDataSourceSettings());
|
DataSourceSettings signalSetings = config.getSignalDataSourceSettings();
|
||||||
dataSource.setMaximumPoolSize(100);
|
|
||||||
|
HikariDataSource dataSource = createDataSource(signalSetings);
|
||||||
|
dataSource.setMaximumPoolSize(signalSetings.maximumPoolSize());
|
||||||
|
dataSource.setMinimumIdle(signalSetings.minimumIdle());
|
||||||
|
dataSource.setConnectionTimeout(signalSetings.connectionTimeout());
|
||||||
|
dataSource.setValidationTimeout(signalSetings.validationTimeout());
|
||||||
|
dataSource.setIdleTimeout(signalSetings.idleTimeout());
|
||||||
|
dataSource.setMaxLifetime(signalSetings.maxLifetime());
|
||||||
|
dataSource.setKeepaliveTime(signalSetings.keepaliveTime());
|
||||||
|
dataSource.setLeakDetectionThreshold(signalSetings.leakDetectionThreshold());
|
||||||
|
|
||||||
try (Connection connection = dataSource.getConnection()) {
|
try (Connection connection = dataSource.getConnection()) {
|
||||||
connection.isValid(3);
|
connection.isValid(3);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
log.error("Unable to connect to Signal url={}", config.getSignalDataSourceSettings().url(), e);
|
log.error("Unable to connect to Signal url={}", signalSetings.url(), e);
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
log.info("Connected to Signal: url={}", config.getSignalDataSourceSettings().url());
|
log.info("Connected to Signal: url={}", signalSetings.url());
|
||||||
return dataSource;
|
return dataSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -47,11 +56,6 @@ public class SignalDataSourceConfig extends DatabaseConfig {
|
||||||
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
|
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
|
||||||
sqlSessionFactoryBean.setDataSource(dataSource);
|
sqlSessionFactoryBean.setDataSource(dataSource);
|
||||||
sqlSessionFactoryBean.setMapperLocations(resources);
|
sqlSessionFactoryBean.setMapperLocations(resources);
|
||||||
|
|
||||||
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
|
|
||||||
TypeHandlerRegistry typeHandlerRegistry = sqlSessionFactory.getConfiguration().getTypeHandlerRegistry();
|
|
||||||
typeHandlerRegistry.register(UUID.class, UUIDTypeHandler.class);
|
|
||||||
|
|
||||||
return sqlSessionFactoryBean.getObject();
|
return sqlSessionFactoryBean.getObject();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
package ru.nbch.credit_tracker.config.mdc;
|
||||||
|
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@ConditionalOnClass(Aspect.class)
|
||||||
|
@EnableAspectJAutoProxy(proxyTargetClass = true)
|
||||||
|
public class AopMdcConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public MdcAspect mdcAspect() {
|
||||||
|
return new MdcAspect();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
package ru.nbch.credit_tracker.config.mdc;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||||
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.Around;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.slf4j.MDC;
|
||||||
|
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||||
|
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Aspect
|
||||||
|
public class MdcAspect {
|
||||||
|
|
||||||
|
// For methods that set an MDC value (from a method argument) and then clear it at the end
|
||||||
|
@Around("@annotation(setAndClearMdc)")
|
||||||
|
public Object setAndClearMdcAdvice(ProceedingJoinPoint pjp, SetAndClearMdc setAndClearMdc) throws Throwable {
|
||||||
|
Object[] args = pjp.getArgs();
|
||||||
|
int index = setAndClearMdc.argIndex();
|
||||||
|
Object obj = (args != null && args.length > index) ? args[index] : null;
|
||||||
|
if (obj instanceof MonitoringRequest request) {
|
||||||
|
if (request.getPackageName() != null) {
|
||||||
|
putMdcValue(setAndClearMdc.key(), request.getPackageName());
|
||||||
|
}
|
||||||
|
} else if (obj instanceof UserPackage userPackage) {
|
||||||
|
if (userPackage.getPackageName() != null) {
|
||||||
|
putMdcValue(setAndClearMdc.key(), userPackage.getPackageName());
|
||||||
|
}
|
||||||
|
} else if (obj instanceof String packageName) {
|
||||||
|
putMdcValue(setAndClearMdc.key(), packageName);
|
||||||
|
} else {
|
||||||
|
log.debug("no packageName found for for {}", pjp.toShortString());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return pjp.proceed();
|
||||||
|
} finally {
|
||||||
|
MDC.remove(setAndClearMdc.key());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void putMdcValue(String key, String value) {
|
||||||
|
try {
|
||||||
|
MDC.put(key, "[" + value + "] ");
|
||||||
|
} catch (Throwable e) {
|
||||||
|
log.error("{}", ExceptionUtils.getStackTrace(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
package ru.nbch.credit_tracker.config.mdc;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
// Annotation to set an MDC key based on a method argument and clear it after method execution
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
public @interface SetAndClearMdc {
|
||||||
|
String key() default "ru.nbch.credit_tracker.log.mdc.key";
|
||||||
|
// The index of the method argument to use for the MDC value (defaults to the first argument)
|
||||||
|
int argIndex() default 0;
|
||||||
|
}
|
||||||
|
|
@ -55,7 +55,12 @@ public class GlobalExceptionHandler {
|
||||||
commonError.setErrorText(errorText);
|
commonError.setErrorText(errorText);
|
||||||
|
|
||||||
if (ex instanceof SignalClientException) {
|
if (ex instanceof SignalClientException) {
|
||||||
log.warn("Response error: {}", errorText);
|
String packageName = ((SignalClientException) ex).getPackageName();
|
||||||
|
if(packageName != null ) {
|
||||||
|
log.warn("Response error: {}. PackageName: {}", errorText, packageName);
|
||||||
|
} else {
|
||||||
|
log.warn("Response error: {}", errorText);
|
||||||
|
}
|
||||||
return new ResponseEntity<>(commonError, headers, HttpStatus.BAD_REQUEST);
|
return new ResponseEntity<>(commonError, headers, HttpStatus.BAD_REQUEST);
|
||||||
} else {
|
} else {
|
||||||
Exception cause = ((SignalServerException) ex).getCause();
|
Exception cause = ((SignalServerException) ex).getCause();
|
||||||
|
|
|
||||||
|
|
@ -3,17 +3,9 @@ package ru.nbch.credit_tracker.config.rest.filters;
|
||||||
import jakarta.servlet.FilterChain;
|
import jakarta.servlet.FilterChain;
|
||||||
import jakarta.servlet.ServletException;
|
import jakarta.servlet.ServletException;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletRequestWrapper;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import jakarta.servlet.http.Part;
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.core.annotation.Order;
|
import org.springframework.core.annotation.Order;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
@ -22,6 +14,10 @@ import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
import org.springframework.web.util.ContentCachingRequestWrapper;
|
import org.springframework.web.util.ContentCachingRequestWrapper;
|
||||||
import org.springframework.web.util.ContentCachingResponseWrapper;
|
import org.springframework.web.util.ContentCachingResponseWrapper;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Order(0)
|
@Order(0)
|
||||||
|
|
@ -34,12 +30,12 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
|
||||||
protected boolean shouldNotFilter(HttpServletRequest request) {
|
protected boolean shouldNotFilter(HttpServletRequest request) {
|
||||||
String path = request.getRequestURI();
|
String path = request.getRequestURI();
|
||||||
return path.startsWith("/actuator/health") || path.startsWith("/swagger")
|
return path.startsWith("/actuator/health") || path.startsWith("/swagger")
|
||||||
|| path.startsWith("/v3/api-docs") || path.startsWith("/static/");
|
|| path.startsWith("/v3/api-docs") || path.startsWith("/static/") || path.equals("/");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
|
||||||
throws ServletException, IOException {
|
throws ServletException, IOException {
|
||||||
|
|
||||||
long startNs = System.nanoTime();
|
long startNs = System.nanoTime();
|
||||||
|
|
||||||
|
|
@ -47,17 +43,18 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
|
||||||
ContentCachingResponseWrapper resp = new ContentCachingResponseWrapper(response);
|
ContentCachingResponseWrapper resp = new ContentCachingResponseWrapper(response);
|
||||||
|
|
||||||
String correlationId = Optional.ofNullable(request.getHeader("X-Correlation-Id"))
|
String correlationId = Optional.ofNullable(request.getHeader("X-Correlation-Id"))
|
||||||
.filter(StringUtils::hasText)
|
.filter(StringUtils::hasText)
|
||||||
.orElse(UUID.randomUUID().toString());
|
.orElse(UUID.randomUUID().toString());
|
||||||
resp.setHeader("X-Correlation-Id", correlationId);
|
resp.setHeader("X-Correlation-Id", correlationId);
|
||||||
|
|
||||||
|
logIncomingRequest(req, correlationId);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
chain.doFilter(req, resp);
|
chain.doFilter(req, resp);
|
||||||
} finally {
|
} finally {
|
||||||
long tookMs = (System.nanoTime() - startNs) / 1_000_000;
|
long tookMs = (System.nanoTime() - startNs) / 1_000_000;
|
||||||
|
|
||||||
String requestBody = readBody(req.getContentAsByteArray(), req.getCharacterEncoding());
|
Map<String, String> reqParams = paramsMap(req);
|
||||||
String responseBody = readBody(resp.getContentAsByteArray(), resp.getCharacterEncoding());
|
|
||||||
|
|
||||||
Map<String, String> reqHeaders = headersMap(req);
|
Map<String, String> reqHeaders = headersMap(req);
|
||||||
Map<String, String> respHeaders = headersMap(resp);
|
Map<String, String> respHeaders = headersMap(resp);
|
||||||
|
|
@ -66,43 +63,67 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
|
||||||
mask(respHeaders);
|
mask(respHeaders);
|
||||||
|
|
||||||
log.info(
|
log.info(
|
||||||
"HTTP {} {}{} | status={} | took={}ms | cid={} | reqHeaders={} | reqBody={} | respHeaders={} | respBody={}",
|
"HTTP (RESPONSE) {} {} | status={} | took={}ms | cid={} | reqHeaders={} | reqParams={} | respHeaders={}",
|
||||||
req.getMethod(),
|
req.getMethod(),
|
||||||
req.getRequestURI(),
|
req.getRequestURI(),
|
||||||
req.getQueryString() == null ? "" : "?" + req.getQueryString(),
|
resp.getStatus(),
|
||||||
resp.getStatus(),
|
tookMs,
|
||||||
tookMs,
|
correlationId,
|
||||||
correlationId,
|
reqHeaders,
|
||||||
reqHeaders,
|
reqParams,
|
||||||
requestBody,
|
respHeaders
|
||||||
respHeaders,
|
|
||||||
responseBody
|
|
||||||
);
|
);
|
||||||
|
|
||||||
resp.copyBodyToResponse();
|
resp.copyBodyToResponse();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ContentCachingRequestWrapper wrapRequest(HttpServletRequest request) {
|
private void logIncomingRequest(ContentCachingRequestWrapper req, String correlationId) {
|
||||||
|
Map<String, String> reqParams = paramsMap(req);
|
||||||
|
Map<String, String> reqHeaders = headersMap(req);
|
||||||
|
mask(reqHeaders);
|
||||||
|
|
||||||
|
log.info(
|
||||||
|
"HTTP (REQUEST) {} {} | cid={} | reqHeaders={} | reqParams={}",
|
||||||
|
req.getMethod(),
|
||||||
|
req.getRequestURI(),
|
||||||
|
correlationId,
|
||||||
|
reqHeaders,
|
||||||
|
reqParams
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ContentCachingRequestWrapper wrapRequest(HttpServletRequest request) throws IOException {
|
||||||
return (request instanceof ContentCachingRequestWrapper c) ? c : new ContentCachingRequestWrapper(request, MAX_BODY);
|
return (request instanceof ContentCachingRequestWrapper c) ? c : new ContentCachingRequestWrapper(request, MAX_BODY);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String readBody(byte[] buf, String encoding) {
|
|
||||||
if (buf == null || buf.length == 0) return "";
|
|
||||||
var bytes = buf.length > MAX_BODY ? Arrays.copyOf(buf, MAX_BODY) : buf;
|
|
||||||
String body = new String(bytes, encoding != null ? java.nio.charset.Charset.forName(encoding) : StandardCharsets.UTF_8);
|
|
||||||
if (buf.length > MAX_BODY) body += "…[truncated]";
|
|
||||||
return body;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Map<String, String> headersMap(HttpServletRequest req) {
|
private static Map<String, String> headersMap(HttpServletRequest req) {
|
||||||
return Collections.list(req.getHeaderNames()).stream()
|
return Collections.list(req.getHeaderNames()).stream()
|
||||||
.collect(Collectors.toMap(h -> h, req::getHeader, (a, b) -> a, LinkedHashMap::new));
|
.collect(Collectors.toMap(h -> h, req::getHeader, (a, b) -> a, LinkedHashMap::new));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, String> paramsMap(HttpServletRequestWrapper req) {
|
||||||
|
Map<String, String> paramsMap = new LinkedHashMap<>();
|
||||||
|
req.getParameterMap().forEach((k, v) -> {
|
||||||
|
String params = String.join(", ", v);
|
||||||
|
paramsMap.put(k, params);
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
Collection<Part> fileParts = req.getParts();
|
||||||
|
fileParts.forEach(part -> {
|
||||||
|
paramsMap.put(part.getName(), part.getSubmittedFileName());
|
||||||
|
});
|
||||||
|
} catch (Exception e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
return paramsMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map<String, String> headersMap(HttpServletResponse resp) {
|
private static Map<String, String> headersMap(HttpServletResponse resp) {
|
||||||
return resp.getHeaderNames().stream()
|
return resp.getHeaderNames().stream()
|
||||||
.collect(Collectors.toMap(h -> h, resp::getHeader, (a, b) -> a, LinkedHashMap::new));
|
.collect(Collectors.toMap(h -> h, resp::getHeader, (a, b) -> a, LinkedHashMap::new));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void mask(Map<String, String> headers) {
|
private static void mask(Map<String, String> headers) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
package ru.nbch.credit_tracker.config.rest.filters;
|
||||||
|
|
||||||
|
|
||||||
|
import jakarta.servlet.FilterChain;
|
||||||
|
import jakarta.servlet.ServletException;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
|
import ru.nbch.credit_tracker.config.rest.wrappers.CachedHttpRequestWrapper;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
@Order(1)
|
||||||
|
public class MemberCodeHttpLoggingFilter extends OncePerRequestFilter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean shouldNotFilter(HttpServletRequest request) {
|
||||||
|
String path = request.getRequestURI();
|
||||||
|
return !(path.startsWith("/api/v1/signal/all_packages") || path.startsWith("/api/v1/signal/active_packages"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
||||||
|
CachedHttpRequestWrapper req = wrapRequest(request);
|
||||||
|
String body = IOUtils.toString(req.getBody(), req.getCharacterEncoding());
|
||||||
|
if (StringUtils.isNotBlank(body)) {
|
||||||
|
try {
|
||||||
|
int startIndex = body.indexOf("<UserId>") + 8;
|
||||||
|
int endIndex = body.indexOf("</UserId>");
|
||||||
|
String userId = body.substring(startIndex, endIndex);
|
||||||
|
log.info(
|
||||||
|
"HTTP (REQUEST) {} {} | memberCode={}",
|
||||||
|
req.getMethod(),
|
||||||
|
req.getRequestURI(),
|
||||||
|
userId.substring(0, 6)
|
||||||
|
);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
filterChain.doFilter(req, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static CachedHttpRequestWrapper wrapRequest(HttpServletRequest request) throws IOException {
|
||||||
|
return new CachedHttpRequestWrapper(request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
package ru.nbch.credit_tracker.config.rest.wrappers;
|
||||||
|
|
||||||
|
import jakarta.servlet.ServletInputStream;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletRequestWrapper;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class CachedHttpRequestWrapper extends HttpServletRequestWrapper {
|
||||||
|
private final byte[] body;
|
||||||
|
|
||||||
|
|
||||||
|
public CachedHttpRequestWrapper(HttpServletRequest request) throws IOException {
|
||||||
|
super(request);
|
||||||
|
this.body = request.getInputStream().readAllBytes();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ServletInputStream getInputStream() {
|
||||||
|
return new CachedServletInputStream(body);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
package ru.nbch.credit_tracker.config.rest.wrappers;
|
||||||
|
|
||||||
|
import jakarta.servlet.ReadListener;
|
||||||
|
import jakarta.servlet.ServletInputStream;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
|
||||||
|
public class CachedServletInputStream extends ServletInputStream {
|
||||||
|
|
||||||
|
private final ByteArrayInputStream byteArray;
|
||||||
|
|
||||||
|
public CachedServletInputStream(byte[] data) {
|
||||||
|
this.byteArray = new ByteArrayInputStream(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int read() {
|
||||||
|
return byteArray.read();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isFinished() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isReady() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setReadListener(ReadListener listener) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,5 +4,13 @@ public record DataSourceSettings(
|
||||||
String username,
|
String username,
|
||||||
String password,
|
String password,
|
||||||
String url,
|
String url,
|
||||||
String driver
|
String driver,
|
||||||
|
Integer maximumPoolSize,
|
||||||
|
Integer minimumIdle,
|
||||||
|
long connectionTimeout,
|
||||||
|
long validationTimeout,
|
||||||
|
long idleTimeout,
|
||||||
|
long maxLifetime,
|
||||||
|
long keepaliveTime,
|
||||||
|
long leakDetectionThreshold
|
||||||
) {}
|
) {}
|
||||||
|
|
@ -6,6 +6,8 @@ import org.springframework.context.annotation.Configuration;
|
||||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||||
import ru.nbch.credit_tracker.entities.external_response.monitoring_report_file.SgnlReportMonitorigSetupError;
|
import ru.nbch.credit_tracker.entities.external_response.monitoring_report_file.SgnlReportMonitorigSetupError;
|
||||||
import ru.nbch.credit_tracker.entities.external_response.online_report.SgnlOnlineReport;
|
import ru.nbch.credit_tracker.entities.external_response.online_report.SgnlOnlineReport;
|
||||||
|
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
||||||
|
import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest;
|
||||||
import ru.nbch.credit_tracker.entities.user_response.errors.MonitoringError;
|
import ru.nbch.credit_tracker.entities.user_response.errors.MonitoringError;
|
||||||
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse;
|
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse;
|
||||||
import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor;
|
import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor;
|
||||||
|
|
@ -26,6 +28,8 @@ public class XmlConfig {
|
||||||
// unmarshalling classes
|
// unmarshalling classes
|
||||||
SgnlOnlineReport.class,
|
SgnlOnlineReport.class,
|
||||||
SgnlReportMonitorigSetupError.class,
|
SgnlReportMonitorigSetupError.class,
|
||||||
|
MonitoringActivePackagesRequest.class,
|
||||||
|
MonitoringAllPackagesRequest.class,
|
||||||
// marshalling classes
|
// marshalling classes
|
||||||
MonitoringError.class,
|
MonitoringError.class,
|
||||||
MonitoringSetupResponse.class);
|
MonitoringSetupResponse.class);
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,10 @@ import ru.nbch.credit_tracker.enums.XmlErrorFormat;
|
||||||
@Getter
|
@Getter
|
||||||
public class SignalClientException extends SignalException {
|
public class SignalClientException extends SignalException {
|
||||||
|
|
||||||
public SignalClientException(EnumKeyMessage errorMessage, XmlErrorFormat errorFormat) {
|
private final String packageName;
|
||||||
|
|
||||||
|
public SignalClientException(EnumKeyMessage errorMessage, XmlErrorFormat errorFormat, String packageName) {
|
||||||
super(errorMessage, errorFormat);
|
super(errorMessage, errorFormat);
|
||||||
|
this.packageName = packageName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,16 @@
|
||||||
package ru.nbch.credit_tracker.facade;
|
package ru.nbch.credit_tracker.facade;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.slf4j.MDC;
|
||||||
|
import org.springframework.aop.framework.AopContext;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||||
import org.springframework.core.io.FileUrlResource;
|
import org.springframework.core.io.FileUrlResource;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||||
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
|
||||||
|
|
@ -31,7 +35,7 @@ import ru.nbch.credit_tracker.service.scoring.AuthorizationService;
|
||||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||||
import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor;
|
import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor;
|
||||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||||
import ru.nbch.credit_tracker.utils.ValidationUtil;
|
import ru.nbch.credit_tracker.utils.ValidationService;
|
||||||
import ru.nbch.credit_tracker.utils.ZipUtils;
|
import ru.nbch.credit_tracker.utils.ZipUtils;
|
||||||
|
|
||||||
import javax.xml.stream.XMLStreamException;
|
import javax.xml.stream.XMLStreamException;
|
||||||
|
|
@ -43,6 +47,7 @@ import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
@ -54,12 +59,17 @@ import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.serverExcp;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
|
@EnableAspectJAutoProxy(exposeProxy = true)
|
||||||
public class SignalFacade {
|
public class SignalFacade {
|
||||||
|
|
||||||
|
private SignalFacade self;
|
||||||
|
|
||||||
private final CreditTrackerSettings config;
|
private final CreditTrackerSettings config;
|
||||||
private final AuthorizationService authorizationService;
|
private final AuthorizationService authorizationService;
|
||||||
private final SignalService signalService;
|
private final SignalService signalService;
|
||||||
private final SignalRestService signalRestService;
|
private final SignalRestService signalRestService;
|
||||||
private final MonitoringErrorProcesingService monitoringErrorProcesingService;
|
private final MonitoringErrorProcesingService monitoringErrorProcesingService;
|
||||||
|
private final ValidationService validationService;
|
||||||
private final StaxXmlProcessor staxXmlProcessor;
|
private final StaxXmlProcessor staxXmlProcessor;
|
||||||
|
|
||||||
private final ExecutorService executor;
|
private final ExecutorService executor;
|
||||||
|
|
@ -71,6 +81,7 @@ public class SignalFacade {
|
||||||
SignalService signalService,
|
SignalService signalService,
|
||||||
SignalRestService signalRestService,
|
SignalRestService signalRestService,
|
||||||
MonitoringErrorProcesingService monitoringErrorProcesingService,
|
MonitoringErrorProcesingService monitoringErrorProcesingService,
|
||||||
|
ValidationService validationService,
|
||||||
StaxXmlProcessor staxXmlProcessor,
|
StaxXmlProcessor staxXmlProcessor,
|
||||||
@Qualifier("executorService") ExecutorService executor) {
|
@Qualifier("executorService") ExecutorService executor) {
|
||||||
this.config = config;
|
this.config = config;
|
||||||
|
|
@ -78,6 +89,7 @@ public class SignalFacade {
|
||||||
this.signalService = signalService;
|
this.signalService = signalService;
|
||||||
this.signalRestService = signalRestService;
|
this.signalRestService = signalRestService;
|
||||||
this.monitoringErrorProcesingService = monitoringErrorProcesingService;
|
this.monitoringErrorProcesingService = monitoringErrorProcesingService;
|
||||||
|
this.validationService = validationService;
|
||||||
this.staxXmlProcessor = staxXmlProcessor;
|
this.staxXmlProcessor = staxXmlProcessor;
|
||||||
this.executor = executor;
|
this.executor = executor;
|
||||||
this.maxXmlFileSize = config.getMaxXmlFileSize() * 1024 * 1024;
|
this.maxXmlFileSize = config.getMaxXmlFileSize() * 1024 * 1024;
|
||||||
|
|
@ -144,13 +156,13 @@ public class SignalFacade {
|
||||||
AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(monitoringRequest.getUserId(), monitoringRequest.getPassword());
|
AuthorizationService.AuthResult authResult = authorizationService.findAuthInfo(monitoringRequest.getUserId(), monitoringRequest.getPassword());
|
||||||
if (!authResult.isSuccess()) {
|
if (!authResult.isSuccess()) {
|
||||||
signalService.rejectPackage(monitoringRequest);
|
signalService.rejectPackage(monitoringRequest);
|
||||||
throw clientExcp(authResult.getError(), XmlErrorFormat.MonitoringError);
|
throw clientExcp(authResult.getError(), monitoringRequest.getPackageName(), XmlErrorFormat.MonitoringError);
|
||||||
}
|
}
|
||||||
|
|
||||||
// проверка на уникальность пакета
|
// проверка на уникальность пакета
|
||||||
if (signalService.isPackageNotUnique(monitoringRequest)) {
|
if (signalService.isPackageNotUnique(monitoringRequest)) {
|
||||||
signalService.rejectPackage(monitoringRequest);
|
signalService.rejectPackage(monitoringRequest);
|
||||||
throw clientExcp(SignalError.ERROR_007, XmlErrorFormat.MonitoringError);
|
throw clientExcp(SignalError.ERROR_007, monitoringRequest.getPackageName(), XmlErrorFormat.MonitoringError);
|
||||||
}
|
}
|
||||||
|
|
||||||
packageId = signalService.registerPackage(monitoringRequest);
|
packageId = signalService.registerPackage(monitoringRequest);
|
||||||
|
|
@ -164,7 +176,7 @@ public class SignalFacade {
|
||||||
}
|
}
|
||||||
|
|
||||||
// в отдельном потоке запускаем регистрацию субъектов, поиск фидов и расчет флагов просрочек
|
// в отдельном потоке запускаем регистрацию субъектов, поиск фидов и расчет флагов просрочек
|
||||||
registerFidsAndDebts(packageId, monitoringRequest.getPackageName(), filePath);
|
getCurrentProxy().registerFidsAndDebts(packageId, monitoringRequest.getPackageName(), filePath);
|
||||||
|
|
||||||
return ResponseEntity.ok().body(new MonitoringSetupResponse());
|
return ResponseEntity.ok().body(new MonitoringSetupResponse());
|
||||||
}
|
}
|
||||||
|
|
@ -175,7 +187,7 @@ public class SignalFacade {
|
||||||
monitoringRequest = staxXmlProcessor.read(in, MonitoringRequest.class,
|
monitoringRequest = staxXmlProcessor.read(in, MonitoringRequest.class,
|
||||||
request -> {
|
request -> {
|
||||||
try {
|
try {
|
||||||
ValidationUtil.validateMonitoringRequest(request);
|
validationService.validateMonitoringRequest(request);
|
||||||
} catch (SignalClientException e) {
|
} catch (SignalClientException e) {
|
||||||
if (request != null) {
|
if (request != null) {
|
||||||
signalService.rejectPackage(request);
|
signalService.rejectPackage(request);
|
||||||
|
|
@ -211,8 +223,13 @@ public class SignalFacade {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerFidsAndDebts(Integer packageId, String packageName, String filePath) {
|
@SetAndClearMdc(argIndex = 1)
|
||||||
|
public void registerFidsAndDebts(Integer packageId, String packageName, String filePath) {
|
||||||
|
Map<String, String> context = MDC.getCopyOfContextMap();
|
||||||
executor.execute(() -> {
|
executor.execute(() -> {
|
||||||
|
if (context != null) {
|
||||||
|
MDC.setContextMap(context);
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
signalService.registerSubjects(filePath, packageId);
|
signalService.registerSubjects(filePath, packageId);
|
||||||
CTUtil.removeFile(filePath);
|
CTUtil.removeFile(filePath);
|
||||||
|
|
@ -408,4 +425,11 @@ public class SignalFacade {
|
||||||
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringDownloadError, e);
|
throw serverExcp(SignalError.ERROR_013, XmlErrorFormat.MonitoringDownloadError, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private SignalFacade getCurrentProxy() {
|
||||||
|
if (self == null) {
|
||||||
|
self = (SignalFacade) AopContext.currentProxy();
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,15 +2,21 @@ package ru.nbch.credit_tracker.service;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.aop.framework.AopContext;
|
||||||
|
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||||
import ru.nbch.credit_tracker.utils.CTUtil;
|
import ru.nbch.credit_tracker.utils.CTUtil;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
|
@EnableAspectJAutoProxy(exposeProxy = true)
|
||||||
public class MonitoringErrorProcesingService {
|
public class MonitoringErrorProcesingService {
|
||||||
|
|
||||||
|
private MonitoringErrorProcesingService self;
|
||||||
|
|
||||||
private final SignalService signalService;
|
private final SignalService signalService;
|
||||||
private final SignalRestService signalRestService;
|
private final SignalRestService signalRestService;
|
||||||
|
|
||||||
|
|
@ -21,6 +27,11 @@ public class MonitoringErrorProcesingService {
|
||||||
|
|
||||||
public void findErrors(Integer packageId) {
|
public void findErrors(Integer packageId) {
|
||||||
UserPackage userPackage = signalService.findPackage(packageId);
|
UserPackage userPackage = signalService.findPackage(packageId);
|
||||||
|
getCurrentProxy().processPackage(userPackage, packageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SetAndClearMdc
|
||||||
|
public void processPackage(UserPackage userPackage, Integer packageId) {
|
||||||
if (userPackage != null) {
|
if (userPackage != null) {
|
||||||
String packCode = userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName();
|
String packCode = userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName();
|
||||||
log.info("Проверка на ошибки при постановке на мониторинг. packCode={}, packageId={}", packCode, packageId);
|
log.info("Проверка на ошибки при постановке на мониторинг. packCode={}, packageId={}", packCode, packageId);
|
||||||
|
|
@ -38,4 +49,11 @@ public class MonitoringErrorProcesingService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private MonitoringErrorProcesingService getCurrentProxy() {
|
||||||
|
if (self == null) {
|
||||||
|
self = (MonitoringErrorProcesingService) AopContext.currentProxy();
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package ru.nbch.credit_tracker.service;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.slf4j.MDC;
|
||||||
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
|
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||||
|
|
@ -69,83 +70,89 @@ public class MonitoringService {
|
||||||
log.info("Start monitoring");
|
log.info("Start monitoring");
|
||||||
List<UserPackage> packages = signalService.findPackagesOnMonitoring();
|
List<UserPackage> packages = signalService.findPackagesOnMonitoring();
|
||||||
for (UserPackage userPackage : packages) {
|
for (UserPackage userPackage : packages) {
|
||||||
log.info("Processing package {}", userPackage.getPackageName());
|
MDC.put("ru.nbch.credit_tracker.log.mdc.key", "[" + userPackage.getPackageName() +"]");
|
||||||
if (!signalService.hasNonNullfids(userPackage.getId())) {
|
processPackage(userPackage);
|
||||||
log.info("Package {} has no fids. Package will be skipped.", userPackage.getPackageName());
|
MDC.remove("ru.nbch.credit_tracker.log.mdc.key");
|
||||||
continue;
|
|
||||||
}
|
|
||||||
SgnlOnlineReport onlineReports = signalRestService.getReports(userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName());
|
|
||||||
|
|
||||||
if (onlineReports == null) {
|
|
||||||
log.info("No reports found for package {}", userPackage.getPackageName());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Формируем список имен файлов, по которым сработали сигналы. Сюда входят только те имена, у которых парсится дата формирования отчета
|
|
||||||
List<String> fileNames = onlineReports.getOperationReport().getReports().getReports().stream().map(Report::getFilename)
|
|
||||||
.filter(fileName -> CTUtil.parseDateFromReportFileName(fileName) != null).toList();
|
|
||||||
|
|
||||||
if (fileNames.isEmpty()) {
|
|
||||||
log.info("No new report found for package {}", userPackage.getPackageName());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
LocalDateTime lastDownloadedReportDate = CTUtil.parseDateFromReportFileName(userPackage.getLastDownloadedReport());
|
|
||||||
|
|
||||||
if (lastDownloadedReportDate != null) {
|
|
||||||
// Отбираем только те отчеты, дата которых позже даты последнего загруженного отчета
|
|
||||||
fileNames = fileNames.stream()
|
|
||||||
.filter(fileName -> CTUtil.parseDateFromReportFileName(fileName).isAfter(lastDownloadedReportDate)) // отфильтровали только те имена, которые парсятся в дату, так что null тут не придет
|
|
||||||
.sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате
|
|
||||||
.toList();
|
|
||||||
} else {
|
|
||||||
fileNames = fileNames.stream()
|
|
||||||
.sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате
|
|
||||||
.toList();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(userPackage.getLastDownloadedReport())) {
|
|
||||||
log.info("Last downloaded report found for package {}. Last Downloaded Report Name: {}", userPackage.getPackageName(), userPackage.getLastDownloadedReport());
|
|
||||||
} else {
|
|
||||||
log.info("Last Downloaded Report Name is empty");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (String newReport : fileNames) {
|
|
||||||
try {
|
|
||||||
String loadedReportPath = null;
|
|
||||||
if (StringUtils.isBlank(userPackage.getLastDownloadedReport())) {
|
|
||||||
loadedReportPath = loadReport(userPackage.getId(), newReport); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным
|
|
||||||
} else if (lastDownloadedReportDate != null) {
|
|
||||||
LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport);
|
|
||||||
if (newReportDate.isAfter(lastDownloadedReportDate)) {
|
|
||||||
loadedReportPath = loadReport(userPackage.getId(), newReport); // полученный отчет новее записанного в базу
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (loadedReportPath == null) {
|
|
||||||
log.info("Report was not loaded for package {}", userPackage.getPackageName());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
String responsePath = generateResponse(userPackage, loadedReportPath);
|
|
||||||
String fileName = null;
|
|
||||||
if (responsePath != null) {
|
|
||||||
fileName = createResponseFile(userPackage, responsePath);
|
|
||||||
}
|
|
||||||
if (fileName != null) {
|
|
||||||
log.info("New report fileName: {}", fileName);
|
|
||||||
updateSignalHits(userPackage, responsePath, fileName);
|
|
||||||
signalService.updateLastDownloadedReport(userPackage.getId(), newReport);
|
|
||||||
} else {
|
|
||||||
log.info("Report was not created for package {}", userPackage.getPackageName());
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error(e.getMessage(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
log.info("Finish monitoring");
|
log.info("Finish monitoring");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void processPackage(UserPackage userPackage) {
|
||||||
|
log.info("Processing package");
|
||||||
|
if (!signalService.hasNonNullfids(userPackage.getId())) {
|
||||||
|
log.info("Package has no fids. Package will be skipped.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SgnlOnlineReport onlineReports = signalRestService.getReports(userPackage.getUserId().substring(0, 6) + "_" + userPackage.getPackageName());
|
||||||
|
|
||||||
|
if (onlineReports == null) {
|
||||||
|
log.info("No reports found for package");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Формируем список имен файлов, по которым сработали сигналы. Сюда входят только те имена, у которых парсится дата формирования отчета
|
||||||
|
List<String> fileNames = onlineReports.getOperationReport().getReports().getReports().stream().map(Report::getFilename)
|
||||||
|
.filter(fileName -> CTUtil.parseDateFromReportFileName(fileName) != null).toList();
|
||||||
|
|
||||||
|
if (fileNames.isEmpty()) {
|
||||||
|
log.info("No new report found for package");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LocalDateTime lastDownloadedReportDate = CTUtil.parseDateFromReportFileName(userPackage.getLastDownloadedReport());
|
||||||
|
|
||||||
|
if (lastDownloadedReportDate != null) {
|
||||||
|
// Отбираем только те отчеты, дата которых позже даты последнего загруженного отчета
|
||||||
|
fileNames = fileNames.stream()
|
||||||
|
.filter(fileName -> CTUtil.parseDateFromReportFileName(fileName).isAfter(lastDownloadedReportDate)) // отфильтровали только те имена, которые парсятся в дату, так что null тут не придет
|
||||||
|
.sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате
|
||||||
|
.toList();
|
||||||
|
} else {
|
||||||
|
fileNames = fileNames.stream()
|
||||||
|
.sorted(Comparator.comparing(CTUtil::parseDateFromReportFileName)) // Сортируем по дате
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.isNotBlank(userPackage.getLastDownloadedReport())) {
|
||||||
|
log.info("Last downloaded report found for package. Last Downloaded Report Name: {}", userPackage.getLastDownloadedReport());
|
||||||
|
} else {
|
||||||
|
log.info("Last Downloaded Report Name is empty");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String newReport : fileNames) {
|
||||||
|
try {
|
||||||
|
String loadedReportPath = null;
|
||||||
|
if (StringUtils.isBlank(userPackage.getLastDownloadedReport())) {
|
||||||
|
loadedReportPath = loadReport(userPackage.getId(), newReport); // по этому пакету еще не было загруженных отчетов, продолжаем работу с полученным
|
||||||
|
} else if (lastDownloadedReportDate != null) {
|
||||||
|
LocalDateTime newReportDate = CTUtil.parseDateFromReportFileName(newReport);
|
||||||
|
if (newReportDate.isAfter(lastDownloadedReportDate)) {
|
||||||
|
loadedReportPath = loadReport(userPackage.getId(), newReport); // полученный отчет новее записанного в базу
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (loadedReportPath == null) {
|
||||||
|
log.info("Report was not loaded for package");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String responsePath = generateResponse(userPackage, loadedReportPath);
|
||||||
|
String fileName = null;
|
||||||
|
if (responsePath != null) {
|
||||||
|
fileName = createResponseFile(userPackage, responsePath);
|
||||||
|
}
|
||||||
|
if (fileName != null) {
|
||||||
|
log.info("New report fileName: {}", fileName);
|
||||||
|
updateSignalHits(userPackage, responsePath, fileName);
|
||||||
|
signalService.updateLastDownloadedReport(userPackage.getId(), newReport);
|
||||||
|
} else {
|
||||||
|
log.info("Report was not created for package");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Формирует результирующий xml файл для конечного пользователя на основе файла из официального сервиса сигналов
|
* Формирует результирующий xml файл для конечного пользователя на основе файла из официального сервиса сигналов
|
||||||
* @return Путь к временному рещультирующему файлу
|
* @return Путь к временному рещультирующему файлу
|
||||||
|
|
@ -297,7 +304,7 @@ public class MonitoringService {
|
||||||
10000,
|
10000,
|
||||||
"/MonitoringSignalResponse/Subjects/Subject");
|
"/MonitoringSignalResponse/Subjects/Subject");
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException("Error while and updating hits", e);
|
throw new RuntimeException("Error while updating hits", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
CTUtil.removeFile(responsePath); // удалям результирующий xml файл с диска (Он уже заархивирован к этому моменту)
|
CTUtil.removeFile(responsePath); // удалям результирующий xml файл с диска (Он уже заархивирован к этому моменту)
|
||||||
|
|
|
||||||
|
|
@ -334,7 +334,7 @@ public class SignalService {
|
||||||
request -> {
|
request -> {
|
||||||
if (!request.getPersons().isEmpty()) {
|
if (!request.getPersons().isEmpty()) {
|
||||||
List<PhoneFidMap> subjects = request.getPersons().stream().map(p -> {
|
List<PhoneFidMap> subjects = request.getPersons().stream().map(p -> {
|
||||||
log.error("Ошибка при формировании субъекта. package_id = {}, id = {}. Описание: {}", packageId, p.getUid(), p.getValue());
|
log.warn("Ошибка при формировании субъекта. package_id = {}, id = {}. Описание: {}", packageId, p.getUid(), p.getValue());
|
||||||
return PhoneFidMap.builder()
|
return PhoneFidMap.builder()
|
||||||
.id(p.getUid())
|
.id(p.getUid())
|
||||||
.errorText(p.getValue())
|
.errorText(p.getValue())
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
package ru.nbch.credit_tracker.service;
|
package ru.nbch.credit_tracker.service;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.aop.framework.AopContext;
|
||||||
|
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||||
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
import ru.nbch.credit_tracker.entities.dto.UserPackage;
|
||||||
import ru.nbch.credit_tracker.enums.Status;
|
import ru.nbch.credit_tracker.enums.Status;
|
||||||
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
import ru.nbch.credit_tracker.service.signal.SignalRestService;
|
||||||
|
|
@ -14,8 +17,11 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
|
@EnableAspectJAutoProxy(exposeProxy = true)
|
||||||
public class UpdateProcessingPackagesService {
|
public class UpdateProcessingPackagesService {
|
||||||
|
|
||||||
|
private UpdateProcessingPackagesService self;
|
||||||
|
|
||||||
private final SignalService signalService;
|
private final SignalService signalService;
|
||||||
private final SignalRestService signalRestService;
|
private final SignalRestService signalRestService;
|
||||||
private final MonitoringErrorProcesingService monitoringErrorProcesingService;
|
private final MonitoringErrorProcesingService monitoringErrorProcesingService;
|
||||||
|
|
@ -33,25 +39,26 @@ public class UpdateProcessingPackagesService {
|
||||||
List<UserPackage> packages = signalService.findPackagesOnProcessing();
|
List<UserPackage> packages = signalService.findPackagesOnProcessing();
|
||||||
for (UserPackage userPackage : packages) {
|
for (UserPackage userPackage : packages) {
|
||||||
log.info("Updating flags for Package {}", userPackage.getPackageName());
|
log.info("Updating flags for Package {}", userPackage.getPackageName());
|
||||||
process(userPackage.getId(), userPackage.getPackageName());
|
getCurrentProxy().process(userPackage.getId(), userPackage.getPackageName());
|
||||||
}
|
}
|
||||||
log.info("Finish updating processing packages");
|
log.info("Finish updating processing packages");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void process(Integer packageId, String packageName) {
|
@SetAndClearMdc(argIndex = 1)
|
||||||
|
public void process(Integer packageId, String packageName) {
|
||||||
try {
|
try {
|
||||||
SignalService.UpdateResult updateResult = signalService.updateSubjects(packageId, null);
|
SignalService.UpdateResult updateResult = signalService.updateSubjects(packageId, null);
|
||||||
if (updateResult.isNoFidsFound()) {
|
if (updateResult.isNoFidsFound()) {
|
||||||
log.info("No fids found for PackageId: {} PackageName: {}. Package status ON_MONITORING. No registration in signal service.", packageId, packageName);
|
log.info("No fids found for PackageId: {} . Package status ON_MONITORING. No registration in signal service.", packageId);
|
||||||
signalService.updatePackageStatus(packageId, Status.ON_MONITORING);
|
signalService.updatePackageStatus(packageId, Status.ON_MONITORING);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (signalRestService.setupMonitoring(packageId)) {
|
if (signalRestService.setupMonitoring(packageId)) {
|
||||||
log.info("Package was successfully registered in signal service. PackageId: {} PackageName: {}", packageId, packageName);
|
log.info("Package was successfully registered in signal service. PackageId: {}", packageId);
|
||||||
signalService.updatePackageStatus(packageId, Status.ON_MONITORING);
|
signalService.updatePackageStatus(packageId, Status.ON_MONITORING);
|
||||||
monitoringErrorProcesingService.findErrors(packageId);
|
monitoringErrorProcesingService.findErrors(packageId);
|
||||||
} else {
|
} else {
|
||||||
log.info("Package registration was rejected by signal service. PackageId: {} PackageName: {}", packageId, packageName);
|
log.info("Package registration was rejected by signal service. PackageId: {}", packageId);
|
||||||
signalService.updatePackageStatus(packageId, Status.ERROR);
|
signalService.updatePackageStatus(packageId, Status.ERROR);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
@ -59,4 +66,11 @@ public class UpdateProcessingPackagesService {
|
||||||
log.error("Ошибка при поиске фидов или расчете флагов просрочек. Package_id {}", packageId, e);
|
log.error("Ошибка при поиске фидов или расчете флагов просрочек. Package_id {}", packageId, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private UpdateProcessingPackagesService getCurrentProxy() {
|
||||||
|
if (self == null) {
|
||||||
|
self = (UpdateProcessingPackagesService) AopContext.currentProxy();
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package ru.nbch.credit_tracker.service;
|
package ru.nbch.credit_tracker.service;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.slf4j.MDC;
|
||||||
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
|
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
|
||||||
|
|
@ -52,7 +53,9 @@ public class UpdatingFlagsService {
|
||||||
List<UserPackage> packages = signalService.findPackagesOnMonitoring();
|
List<UserPackage> packages = signalService.findPackagesOnMonitoring();
|
||||||
for (UserPackage userPackage : packages) {
|
for (UserPackage userPackage : packages) {
|
||||||
log.info("Updating flags for Package {}", userPackage.getPackageName());
|
log.info("Updating flags for Package {}", userPackage.getPackageName());
|
||||||
|
MDC.put("ru.nbch.credit_tracker.log.mdc.key", "[" + userPackage.getPackageName() +"]");
|
||||||
updateFlags(userPackage.getId(), userPackage.getPackageName());
|
updateFlags(userPackage.getId(), userPackage.getPackageName());
|
||||||
|
MDC.remove("ru.nbch.credit_tracker.log.mdc.key");
|
||||||
}
|
}
|
||||||
log.info("Finish updating flags");
|
log.info("Finish updating flags");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,7 @@ public class SignalRestService {
|
||||||
SgnlReportMonitorigSetupError report = xmlProcessor.read(answer, SgnlReportMonitorigSetupError.class);
|
SgnlReportMonitorigSetupError report = xmlProcessor.read(answer, SgnlReportMonitorigSetupError.class);
|
||||||
if (report.getOperationReport().getErrorsForNextReport() != null) {
|
if (report.getOperationReport().getErrorsForNextReport() != null) {
|
||||||
String fileName = report.getOperationReport().getErrorsForNextReport().getFilename();
|
String fileName = report.getOperationReport().getErrorsForNextReport().getFilename();
|
||||||
log.error("Найдены ошибки по пакету. packCode={}, packageId={}, fileName = {}", packCode, packageId, fileName);
|
log.warn("Найдены ошибки по пакету. packCode={}, packageId={}, fileName = {}", packCode, packageId, fileName);
|
||||||
return fileName;
|
return fileName;
|
||||||
} else {
|
} else {
|
||||||
log.info("Пакет был поставлен на мониторинг без ошибок. packCode={}, packageId={}", packCode, packageId);
|
log.info("Пакет был поставлен на мониторинг без ошибок. packCode={}, packageId={}", packCode, packageId);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
package ru.nbch.credit_tracker.utils;
|
package ru.nbch.credit_tracker.utils;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.nbch.credit_tracker.config.mdc.SetAndClearMdc;
|
||||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest;
|
||||||
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.Subject;
|
import ru.nbch.credit_tracker.entities.user_request.monitoring_request.Subject;
|
||||||
import ru.nbch.credit_tracker.enums.SignalError;
|
import ru.nbch.credit_tracker.enums.SignalError;
|
||||||
|
|
@ -12,13 +14,15 @@ import java.util.regex.Pattern;
|
||||||
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp;
|
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class ValidationUtil {
|
@Service
|
||||||
|
public class ValidationService {
|
||||||
|
|
||||||
private static final String phoneRegex = "^\\d{9}$";
|
private static final String phoneRegex = "^\\d{9}$";
|
||||||
private static final String packageNameRegex = "^[A-Z0-9_]{1,22}$";
|
private static final String packageNameRegex = "^[A-Z0-9_]{1,22}$";
|
||||||
private static final String npIdRegex = "^\\S{1,36}$";
|
private static final String npIdRegex = "^\\S{1,36}$";
|
||||||
|
|
||||||
public static void validateMonitoringRequest(MonitoringRequest request) throws SignalClientException {
|
@SetAndClearMdc
|
||||||
|
public void validateMonitoringRequest(MonitoringRequest request) throws SignalClientException {
|
||||||
if (request == null) {
|
if (request == null) {
|
||||||
throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError);
|
throw clientExcp(SignalError.ERROR_011, XmlErrorFormat.MonitoringError);
|
||||||
}
|
}
|
||||||
|
|
@ -27,32 +31,34 @@ public class ValidationUtil {
|
||||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "PackageName");
|
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "PackageName");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String packageName = request.getPackageName();
|
||||||
|
|
||||||
if (!validatePackageName(request.getPackageName())) {
|
if (!validatePackageName(request.getPackageName())) {
|
||||||
throw clientExcp(SignalError.ERROR_008, XmlErrorFormat.MonitoringError);
|
throw clientExcp(SignalError.ERROR_008, packageName, XmlErrorFormat.MonitoringError);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.getUserId() == null) {
|
if (request.getUserId() == null) {
|
||||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "UserId");
|
throw clientExcp(SignalError.ERROR_002, packageName, XmlErrorFormat.MonitoringError, "UserId");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.getPassword() == null) {
|
if (request.getPassword() == null) {
|
||||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Password");
|
throw clientExcp(SignalError.ERROR_002, packageName, XmlErrorFormat.MonitoringError, "Password");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.getSubjects() == null) {
|
if (request.getSubjects() == null) {
|
||||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Subjects");
|
throw clientExcp(SignalError.ERROR_002, packageName, XmlErrorFormat.MonitoringError, "Subjects");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.getSubjects().getSubject().isEmpty()) {
|
if (request.getSubjects().getSubject().isEmpty()) {
|
||||||
throw clientExcp(SignalError.ERROR_002, XmlErrorFormat.MonitoringError, "Subject");
|
throw clientExcp(SignalError.ERROR_002, packageName, XmlErrorFormat.MonitoringError, "Subject");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Subject subject : request.getSubjects().getSubject()) {
|
for (Subject subject : request.getSubjects().getSubject()) {
|
||||||
if (!validateNPId(subject.getId())) {
|
if (!validateNPId(subject.getId())) {
|
||||||
throw clientExcp(SignalError.ERROR_010, XmlErrorFormat.MonitoringError, subject.getId());
|
throw clientExcp(SignalError.ERROR_010, packageName, XmlErrorFormat.MonitoringError, subject.getId());
|
||||||
}
|
}
|
||||||
if (!validatePhone(subject.getClientId())) {
|
if (!validatePhone(subject.getClientId())) {
|
||||||
throw clientExcp(SignalError.ERROR_003, XmlErrorFormat.MonitoringError, subject.getId());
|
throw clientExcp(SignalError.ERROR_003, packageName, XmlErrorFormat.MonitoringError, subject.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -9,7 +9,11 @@ import ru.nbch.credit_tracker.exceptions.SignalServerException;
|
||||||
public class ExceptionUtils {
|
public class ExceptionUtils {
|
||||||
|
|
||||||
public static SignalClientException clientExcp(IEnumKeyCode enumKeyCode, XmlErrorFormat xmlErrorFormat, Object... args) {
|
public static SignalClientException clientExcp(IEnumKeyCode enumKeyCode, XmlErrorFormat xmlErrorFormat, Object... args) {
|
||||||
return new SignalClientException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat);
|
return clientExcp(enumKeyCode, null, xmlErrorFormat, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SignalClientException clientExcp(IEnumKeyCode enumKeyCode, String packageName, XmlErrorFormat xmlErrorFormat, Object... args) {
|
||||||
|
return new SignalClientException(new EnumKeyMessage(enumKeyCode, args), xmlErrorFormat, packageName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SignalServerException serverExcp(IEnumKeyCode enumKeyCode, XmlErrorFormat xmlErrorFormat, Exception cause, Object... args) {
|
public static SignalServerException serverExcp(IEnumKeyCode enumKeyCode, XmlErrorFormat xmlErrorFormat, Exception cause, Object... args) {
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
<encoder>
|
<encoder>
|
||||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %X{ru.nbch.credit_tracker.log.mdc.key} - %msg%n</pattern>
|
||||||
<charset>utf-8</charset>
|
<charset>utf-8</charset>
|
||||||
</encoder>
|
</encoder>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
@ -22,7 +22,7 @@
|
||||||
<maxFileSize>100MB</maxFileSize>
|
<maxFileSize>100MB</maxFileSize>
|
||||||
</triggeringPolicy>
|
</triggeringPolicy>
|
||||||
<encoder>
|
<encoder>
|
||||||
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %X{ru.nbch.credit_tracker.log.mdc.key} - %msg%n</pattern>
|
||||||
<charset>utf-8</charset>
|
<charset>utf-8</charset>
|
||||||
</encoder>
|
</encoder>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
|
||||||
|
|
@ -28,14 +28,17 @@ import java.util.zip.ZipInputStream;
|
||||||
|
|
||||||
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp;
|
import static ru.nbch.credit_tracker.utils.error.ExceptionUtils.clientExcp;
|
||||||
|
|
||||||
@SpringBootTest(classes = {ValidationUtilTest.TestConfig.class})
|
@SpringBootTest(classes = {ValidationServiceTest.TestConfig.class})
|
||||||
public class ValidationUtilTest {
|
public class ValidationServiceTest {
|
||||||
|
|
||||||
private final StaxXmlProcessor staxXmlProcessor;
|
private final StaxXmlProcessor staxXmlProcessor;
|
||||||
|
private final ValidationService validationService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public ValidationUtilTest(StaxXmlProcessor staxXmlProcessor) {
|
public ValidationServiceTest(StaxXmlProcessor staxXmlProcessor,
|
||||||
|
ValidationService validationService) {
|
||||||
this.staxXmlProcessor = staxXmlProcessor;
|
this.staxXmlProcessor = staxXmlProcessor;
|
||||||
|
this.validationService = validationService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
|
|
@ -46,6 +49,11 @@ public class ValidationUtilTest {
|
||||||
staxReader.add(MonitoringRequestStaxReader::new);
|
staxReader.add(MonitoringRequestStaxReader::new);
|
||||||
return new XmlProcessorStaxImpl(staxReader);
|
return new XmlProcessorStaxImpl(staxReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ValidationService validationService() {
|
||||||
|
return new ValidationService();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Stream<Arguments> validationTestCases() {
|
private static Stream<Arguments> validationTestCases() {
|
||||||
|
|
@ -107,7 +115,7 @@ public class ValidationUtilTest {
|
||||||
|
|
||||||
if(ex == null) {
|
if(ex == null) {
|
||||||
try {
|
try {
|
||||||
ValidationUtil.validateMonitoringRequest(monitoringRequest);
|
validationService.validateMonitoringRequest(monitoringRequest);
|
||||||
} catch (SignalClientException e) {
|
} catch (SignalClientException e) {
|
||||||
ex = e;
|
ex = e;
|
||||||
}
|
}
|
||||||
Loading…
Add table
Reference in a new issue