This commit is contained in:
parent
bfba880629
commit
b3f56db198
3 changed files with 84 additions and 19 deletions
|
|
@ -1,16 +1,21 @@
|
||||||
package ru.spcex.clearing.xml.exporter.logic.data.enums;
|
package ru.spcex.clearing.xml.exporter.logic.data.enums;
|
||||||
|
|
||||||
import static ru.spcex.clearing.xml.exporter.logic.stages.PrepareXMLFile.outDir;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.integration.sftp.session.SftpFileInfo;
|
import org.springframework.integration.sftp.session.SftpFileInfo;
|
||||||
import ru.spcex.clearing.xml.exporter.logic.data.ResultContainer;
|
import ru.spcex.clearing.xml.exporter.logic.data.ResultContainer;
|
||||||
|
import static ru.spcex.clearing.xml.exporter.logic.stages.PrepareXMLFile.outDir;
|
||||||
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||||
|
import ru.spcex.platform.utils.time.TimeUtil;
|
||||||
|
|
||||||
public enum FilenameTemplate {
|
public enum FilenameTemplate {
|
||||||
df_section_dateTime {
|
df_section_dateTime {
|
||||||
|
|
@ -30,6 +35,25 @@ public enum FilenameTemplate {
|
||||||
.append(".XML").toString();
|
.append(".XML").toString();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
df_section_dateTime_counter_with_generation_time {
|
||||||
|
@Override
|
||||||
|
public boolean needSftpFiles() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFileName(ResultContainer resultContainer, ImdgProviderThreadSafeWrapper imdgPr) {
|
||||||
|
Imdg<SpcexObjectBase> imdg = imdgPr.getImdg(resultContainer.getTableForExport().getHazelcastMapName(), SpcexObjectBase.class);
|
||||||
|
ImdgPredicateBuilder pb = imdg.predicateBuilder();
|
||||||
|
Collection<SpcexObjectBase> sdfs = imdg.getCollectionObjectsByPredicate(
|
||||||
|
pb.greatEqual("generationTime", TimeUtil.localDateToInstant(LocalDate.now()))
|
||||||
|
);
|
||||||
|
return appendSection(resultContainer)
|
||||||
|
.append(dateTime(resultContainer))
|
||||||
|
.append("_").append(sdfs.size() + 1)
|
||||||
|
.append(".XML").toString();
|
||||||
|
}
|
||||||
|
},
|
||||||
df_section_sameName {
|
df_section_sameName {
|
||||||
@Override
|
@Override
|
||||||
public String getFileName(ResultContainer resultContainer, List<SftpFileInfo> files) {
|
public String getFileName(ResultContainer resultContainer, List<SftpFileInfo> files) {
|
||||||
|
|
@ -126,4 +150,12 @@ public enum FilenameTemplate {
|
||||||
public String getFileName(ResultContainer resultContainer, List<SftpFileInfo> files) {
|
public String getFileName(ResultContainer resultContainer, List<SftpFileInfo> files) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getFileName(ResultContainer resultContainer, ImdgProviderThreadSafeWrapper provider) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean needSftpFiles() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
package ru.spcex.clearing.xml.exporter.logic.data.enums;
|
||||||
|
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
||||||
|
public final class ImdgProviderThreadSafeWrapper {
|
||||||
|
private final ConcurrentHashMap<String, Imdg<?>> cash = new ConcurrentHashMap<>();
|
||||||
|
private final ImdgProvider imdgProvider;
|
||||||
|
|
||||||
|
public ImdgProviderThreadSafeWrapper(ImdgProvider imdgProvider) {
|
||||||
|
this.imdgProvider = imdgProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends SpcexObjectBase> Imdg<T> getImdg(String mapName, Class<T> clazz) {
|
||||||
|
return (Imdg<T>)
|
||||||
|
cash.computeIfAbsent(mapName, (k) -> imdgProvider.getImdg(k, clazz));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -20,8 +20,10 @@ import ru.spcex.clearing.xml.exporter.config.SFTPConfig;
|
||||||
import ru.spcex.clearing.xml.exporter.config.settings.ExportXMLServiceSettings;
|
import ru.spcex.clearing.xml.exporter.config.settings.ExportXMLServiceSettings;
|
||||||
import ru.spcex.clearing.xml.exporter.logic.data.ResultContainer;
|
import ru.spcex.clearing.xml.exporter.logic.data.ResultContainer;
|
||||||
import ru.spcex.clearing.xml.exporter.logic.data.enums.FilenameTemplate;
|
import ru.spcex.clearing.xml.exporter.logic.data.enums.FilenameTemplate;
|
||||||
|
import ru.spcex.clearing.xml.exporter.logic.data.enums.ImdgProviderThreadSafeWrapper;
|
||||||
import ru.spcex.clearing.xml.exporter.logic.data.enums.StageResult;
|
import ru.spcex.clearing.xml.exporter.logic.data.enums.StageResult;
|
||||||
import ru.spcex.clearing.xml.exporter.logic.data.enums.Table;
|
import ru.spcex.clearing.xml.exporter.logic.data.enums.Table;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.utils.log.ExceptionUtils;
|
import ru.spcex.platform.utils.log.ExceptionUtils;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
|
|
@ -32,11 +34,14 @@ public class PrepareXMLFile implements InitializingBean {
|
||||||
private final ExportXMLServiceSettings settings;
|
private final ExportXMLServiceSettings settings;
|
||||||
public static String outDir;
|
public static String outDir;
|
||||||
private final SFTPConfig.XmlGateway gateway;
|
private final SFTPConfig.XmlGateway gateway;
|
||||||
|
private final ImdgProviderThreadSafeWrapper imdgProviderWrapper;
|
||||||
|
|
||||||
public PrepareXMLFile(ExportXMLServiceSettings settings,
|
public PrepareXMLFile(ImdgProvider imdgProvider,
|
||||||
|
ExportXMLServiceSettings settings,
|
||||||
SFTPConfig.XmlGateway gateway) {
|
SFTPConfig.XmlGateway gateway) {
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
this.gateway = gateway;
|
this.gateway = gateway;
|
||||||
|
this.imdgProviderWrapper = new ImdgProviderThreadSafeWrapper(imdgProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
public StageResult process(ResultContainer resultContainer) {
|
public StageResult process(ResultContainer resultContainer) {
|
||||||
|
|
@ -46,26 +51,34 @@ public class PrepareXMLFile implements InitializingBean {
|
||||||
log.error("No SFTP scanning directories, need will be adding settings like 'export-xml-service.store.out-pay-val-dir.RUB=/RUB' and restart app");
|
log.error("No SFTP scanning directories, need will be adding settings like 'export-xml-service.store.out-pay-val-dir.RUB=/RUB' and restart app");
|
||||||
return StageResult.ERROR;
|
return StageResult.ERROR;
|
||||||
}
|
}
|
||||||
boolean sftpConnectionError = false;
|
|
||||||
List<SftpFileInfo> files = new ArrayList<>();
|
List<SftpFileInfo> files = new ArrayList<>();
|
||||||
log.trace("Get files from SFTP paths: {}", settings.getStore().getOutPayValDir().values());
|
boolean sftpConnectionError = false;
|
||||||
for (String path : settings.getStore().getOutPayValDir().values()) {
|
|
||||||
if (!path.endsWith("/")) path += "/";
|
|
||||||
try {
|
|
||||||
files.addAll(gateway.listFiles(path));
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("SFTP connection error: {}", ExceptionUtils.getStackTrace(e));
|
|
||||||
sftpConnectionError = true;
|
|
||||||
files = new ArrayList<>();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.info("There are {} files on the sFTP server in the search directories.", files.size());
|
|
||||||
Table table = resultContainer.getTableForExport();
|
Table table = resultContainer.getTableForExport();
|
||||||
|
FilenameTemplate template = nameTemplates.get(table);
|
||||||
|
if (template.needSftpFiles()) {
|
||||||
|
log.trace("Get files from SFTP paths: {}", settings.getStore().getOutPayValDir().values());
|
||||||
|
for (String path : settings.getStore().getOutPayValDir().values()) {
|
||||||
|
if (!path.endsWith("/")) path += "/";
|
||||||
|
try {
|
||||||
|
files.addAll(gateway.listFiles(path));
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("SFTP connection error: {}", ExceptionUtils.getStackTrace(e));
|
||||||
|
sftpConnectionError = true;
|
||||||
|
files = new ArrayList<>();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.info("There are {} files on the sFTP server in the search directories.", files.size());
|
||||||
|
}
|
||||||
LocalDateTime currentDateTime = LocalDateTime.now();
|
LocalDateTime currentDateTime = LocalDateTime.now();
|
||||||
resultContainer.setRegistrationDateTime(currentDateTime);
|
resultContainer.setRegistrationDateTime(currentDateTime);
|
||||||
|
|
||||||
File xmlFile = new File(nameTemplates.get(table).getFileName(resultContainer, files));
|
File xmlFile;
|
||||||
|
if (template.needSftpFiles()) {
|
||||||
|
xmlFile = new File(template.getFileName(resultContainer, files));
|
||||||
|
} else {
|
||||||
|
xmlFile = new File(template.getFileName(resultContainer, imdgProviderWrapper));
|
||||||
|
}
|
||||||
if (sftpConnectionError) {
|
if (sftpConnectionError) {
|
||||||
String errorFileName = "error_%s_%s".formatted(LocalDateTime.now().format(FORMATTER), xmlFile.getName());
|
String errorFileName = "error_%s_%s".formatted(LocalDateTime.now().format(FORMATTER), xmlFile.getName());
|
||||||
xmlFile = xmlFile.getParentFile().getAbsoluteFile().toPath().resolve(errorFileName).toFile();
|
xmlFile = xmlFile.getParentFile().getAbsoluteFile().toPath().resolve(errorFileName).toFile();
|
||||||
|
|
@ -108,7 +121,7 @@ public class PrepareXMLFile implements InitializingBean {
|
||||||
nameTemplates.put(Table.S_DF07, FilenameTemplate.df_section_sameName); // df_section_sameName
|
nameTemplates.put(Table.S_DF07, FilenameTemplate.df_section_sameName); // df_section_sameName
|
||||||
nameTemplates.put(Table.S_DF51, FilenameTemplate.df_section_dateTime_counter);
|
nameTemplates.put(Table.S_DF51, FilenameTemplate.df_section_dateTime_counter);
|
||||||
nameTemplates.put(Table.S_DF53, FilenameTemplate.df_section_sameName); // df_section_sameName
|
nameTemplates.put(Table.S_DF53, FilenameTemplate.df_section_sameName); // df_section_sameName
|
||||||
nameTemplates.put(Table.S_DF54, FilenameTemplate.df_section_dateTime_counter);
|
nameTemplates.put(Table.S_DF54, FilenameTemplate.df_section_dateTime_counter_with_generation_time);
|
||||||
nameTemplates.put(Table.S_DF56, FilenameTemplate.df_section_dateTime_counter);
|
nameTemplates.put(Table.S_DF56, FilenameTemplate.df_section_dateTime_counter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue