diff --git a/pom.xml b/pom.xml index b97fc4f..5037c4f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.2.2.RELEASE + 2.2.6.RELEASE me.bearns diff --git a/src/main/java/me/bearns/fias/config/ApplicationConfig.java b/src/main/java/me/bearns/fias/config/ApplicationConfig.java index 66f6bd0..5a07903 100644 --- a/src/main/java/me/bearns/fias/config/ApplicationConfig.java +++ b/src/main/java/me/bearns/fias/config/ApplicationConfig.java @@ -60,5 +60,4 @@ class ApplicationConfig { return txManager; } - } \ No newline at end of file diff --git a/src/main/java/me/bearns/fias/service/FiasUpdater.java b/src/main/java/me/bearns/fias/service/FiasUpdater.java index 7018dfe..50a6742 100644 --- a/src/main/java/me/bearns/fias/service/FiasUpdater.java +++ b/src/main/java/me/bearns/fias/service/FiasUpdater.java @@ -3,9 +3,10 @@ package me.bearns.fias.service; import me.bearns.fias.domain.FiasVersion; import me.bearns.fias.repository.FiasVersionRepository; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class FiasUpdater implements Updater { @@ -18,11 +19,52 @@ public class FiasUpdater implements Updater { @Override public void update() { - long lastVersion = downloadService.getLastVersionId(); - //Max value - FiasVersion dbVersion = versions.findTopByOrderByVersionIdDesc(); + FiasVersion dbVersionObj = versions.findTopByOrderByVersionIdDesc(); + + if(dbVersionObj != null) { + + final Long dbVersion = dbVersionObj.getVersionId(); + + final long lastOnlineVersion = downloadService.getLastVersionId(); + + if(lastOnlineVersion > dbVersion) { + //need update + + final List updates = downloadService.getVersionsAfter(dbVersion); + + if(updates != null && !updates.isEmpty()) { + processUpdates(updates, false); + } + } + } + + System.out.println("update() Ok"); + } + + @Override + public void reload(Long... regions) { + + final List lastVersion = downloadService.getLastVersion(); + if(lastVersion != null) { + processUpdates(lastVersion, true, regions); + } + + } + + //transaction from here + private void processUpdates(List updates, boolean reloadFlag, Long ... regions) { + + updates.sort((o1, o2) -> Math.toIntExact(o1.getVersionId() - o2.getVersionId())); + + //pre-fetch files if update multiple version + + for (FiasVersion update : updates) { + + final String url = reloadFlag ? update.getFiasCompleteXmlUrl() : update.getFiasDeltaXmlUrl(); + + //run update here + } - System.out.println("get Ok"); } } \ No newline at end of file diff --git a/src/main/java/me/bearns/fias/service/OnlineVersion.java b/src/main/java/me/bearns/fias/service/OnlineVersion.java index 9fee14f..0944475 100644 --- a/src/main/java/me/bearns/fias/service/OnlineVersion.java +++ b/src/main/java/me/bearns/fias/service/OnlineVersion.java @@ -1,6 +1,14 @@ package me.bearns.fias.service; +import me.bearns.fias.domain.FiasVersion; + +import java.util.List; + public interface OnlineVersion { long getLastVersionId(); + + List getVersionsAfter(long version); + + List getLastVersion(); } diff --git a/src/main/java/me/bearns/fias/service/SOAPClient.java b/src/main/java/me/bearns/fias/service/SOAPClient.java index e2858a0..41c43e6 100644 --- a/src/main/java/me/bearns/fias/service/SOAPClient.java +++ b/src/main/java/me/bearns/fias/service/SOAPClient.java @@ -1,6 +1,8 @@ package me.bearns.fias.service; +import me.bearns.fias.domain.FiasVersion; import org.springframework.stereotype.Component; +import ru.nalog.fias.ArrayOfDownloadFileInfo; import ru.nalog.fias.DownloadFileInfo; import ru.nalog.fias.IDownloadService; import ru.nalog.fias.IDownloadService_Service; @@ -13,7 +15,10 @@ import java.io.InputStream; import java.net.URL; import java.nio.file.Files; import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static javax.xml.ws.BindingProvider.ENDPOINT_ADDRESS_PROPERTY; @@ -52,11 +57,60 @@ public class SOAPClient implements OnlineVersion { @Override public long getLastVersionId() { + FiasVersion last = getLast(); + if(last != null) return last.getVersionId(); + + return 0; + } + + @Override + public List getVersionsAfter(long version) { + + final ArrayOfDownloadFileInfo allDownloadFileInfo = downloadService.getAllDownloadFileInfo(); + + if(allDownloadFileInfo != null) { + + final List fileInfos = allDownloadFileInfo.getDownloadFileInfo(); + + if(fileInfos != null) { + return fileInfos.stream() + .filter(f -> f.getVersionId() > version) + .map(f -> new FiasVersion(f.getVersionId(),f.getTextVersion(),f.getFiasCompleteXmlUrl(),f.getFiasDeltaXmlUrl())) + .collect(Collectors.toList()); + } + } + + return null; + } + + @Override + public List getLastVersion() { + + final FiasVersion last = getLast(); + + if(last != null) { + + final ArrayList list = new ArrayList<>(1); + list.add(last); + + return list; + } + + return null; + } + + private FiasVersion getLast() { + DownloadFileInfo fileInfo = downloadService.getLastDownloadFileInfo(); - if(fileInfo != null) return fileInfo.getVersionId(); + if(fileInfo !=null) { - return 0; + //TODO check null in getVersionId() + + return new FiasVersion(fileInfo.getVersionId(), fileInfo.getTextVersion(), fileInfo.getFiasCompleteXmlUrl(), fileInfo.getFiasDeltaXmlUrl()); + } + + return null; } private static void setRedirect(final Object bindingProvider) { diff --git a/src/main/java/me/bearns/fias/service/Updater.java b/src/main/java/me/bearns/fias/service/Updater.java index 85c7697..44ed4a0 100644 --- a/src/main/java/me/bearns/fias/service/Updater.java +++ b/src/main/java/me/bearns/fias/service/Updater.java @@ -7,4 +7,10 @@ public interface Updater { * Run online update for fias database */ public void update(); + + /** + * Load or reload database for selected regions + * @param regions + */ + public void reload(Long ... regions); } diff --git a/src/test/java/me/bearns/fias/VersionRepositoryTests.java b/src/test/java/me/bearns/fias/VersionRepositoryTests.java index 0080cd2..dd99ca8 100644 --- a/src/test/java/me/bearns/fias/VersionRepositoryTests.java +++ b/src/test/java/me/bearns/fias/VersionRepositoryTests.java @@ -36,7 +36,7 @@ public class VersionRepositoryTests { private FiasVersionRepository repository; @Test - public void testFindById() { + public void testPersist() { FiasVersion fiasVersion = new FiasVersion(1L, "last", "c", "d"); entityManager.persist(fiasVersion); @@ -48,14 +48,15 @@ public class VersionRepositoryTests { } @Test - public void testSve() { + public void testSave() { FiasVersion fiasVersion = new FiasVersion(1L, "last", "c", "d"); repository.save(fiasVersion); + repository.flush(); Optional byId = repository.findById(fiasVersion.getVersionId()); FiasVersion version = byId.get(); - assertThat(version).extracting(FiasVersion::getVersionId).isEqualTo(fiasVersion.getVersionId()); + assertThat(version).extracting(FiasVersion::getFiasDeltaXmlUrl).isEqualTo(fiasVersion.getFiasDeltaXmlUrl()); } }