diff --git a/src/main/java/me/bearns/fias/domain/FiasVersion.java b/src/main/java/me/bearns/fias/domain/FiasVersion.java index e3c6121..4d3bb09 100644 --- a/src/main/java/me/bearns/fias/domain/FiasVersion.java +++ b/src/main/java/me/bearns/fias/domain/FiasVersion.java @@ -32,6 +32,9 @@ public class FiasVersion { @Column(name = "delta_xml_url") protected String fiasDeltaXmlUrl; + @Column(name = "regions") + protected String regions; + public Long getVersionId() { return versionId; } @@ -47,4 +50,25 @@ public class FiasVersion { public String getFiasDeltaXmlUrl() { return fiasDeltaXmlUrl; } + + public String getRegions() { + return regions; + } + + public void setRegions(Long ... regions) { + StringBuilder sb = new StringBuilder(); + + for(Long region : regions) { + if((region != null) && (region > 0) && (region < 100)){ + if(sb.length() > 0) sb.append(","); + sb.append(String.format("%1$02d", region)); + } + } + + this.regions = sb.length() > 0 ? sb.toString() : null; + } + + public void setRegions(String regions){ + this.regions = regions; + } } diff --git a/src/main/java/me/bearns/fias/service/FiasUpdater.java b/src/main/java/me/bearns/fias/service/FiasUpdater.java index cc0ee89..109c601 100644 --- a/src/main/java/me/bearns/fias/service/FiasUpdater.java +++ b/src/main/java/me/bearns/fias/service/FiasUpdater.java @@ -15,6 +15,7 @@ import java.io.*; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.function.Predicate; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; @@ -46,6 +47,7 @@ public class FiasUpdater implements Updater { if(dbVersionObj != null) { final Long dbVersion = dbVersionObj.getVersionId(); + final String regions = dbVersionObj.getRegions(); final long lastOnlineVersion = clientStub.getLastVersionId(); @@ -54,6 +56,9 @@ public class FiasUpdater implements Updater { final List updates = clientStub.getVersionsAfter(dbVersion); + //set region filters for updates + if(regions != null) updates.forEach(u -> u.setRegions(regions)); + if(updates != null && !updates.isEmpty()) { processUpdates(updates, false); } @@ -67,14 +72,19 @@ public class FiasUpdater implements Updater { public void reload(Long... regions) throws CommonException { final List lastVersion = clientStub.getLastVersion(); - if(lastVersion != null) { - processUpdates(lastVersion, true, regions); + + //exist and only one + if(lastVersion != null && lastVersion.size() == 1) { + //set region filter + lastVersion.get(0).setRegions(regions); + + processUpdates(lastVersion, true); } } //transaction from here - private void processUpdates(List updates, boolean reloadFlag, Long ... regions) throws CommonException { + private void processUpdates(List updates, boolean reloadFlag) throws CommonException { if(reloadFlag) { //todo reload flag impl @@ -91,13 +101,20 @@ public class FiasUpdater implements Updater { //strict order for (FiasVersion item : updates) { + //set region filter + final String regions = item.getRegions(); + RegionFilter filter = null; + if(regions != null) { + filter = new RegionFilter(regions); + } + final File file; try { //wait for downloading file = map.get(item).get(); //process update - processArchive(file, regions); + processArchive(file, filter); //apply this version versions.save(item); @@ -113,7 +130,7 @@ public class FiasUpdater implements Updater { } } - private void processArchive(File file, Long ... regions) throws CommonException { + private void processArchive(File file, Predicate filter) throws CommonException { try(final ZipFile zipFile = new ZipFile(file)){ @@ -123,8 +140,6 @@ public class FiasUpdater implements Updater { final ZipEntry entry = entries.nextElement(); - final RegionFilter filter = regions != null ? new RegionFilter(regions) : null; - final UnmarshallerParameters config = catalog.getByPrefix(entry.getName()); if(config!=null) { //todo diff --git a/src/main/java/me/bearns/fias/util/RegionFilter.java b/src/main/java/me/bearns/fias/util/RegionFilter.java index 16fe279..69a767e 100644 --- a/src/main/java/me/bearns/fias/util/RegionFilter.java +++ b/src/main/java/me/bearns/fias/util/RegionFilter.java @@ -3,7 +3,9 @@ package me.bearns.fias.util; import me.bearns.fias.domain.Addrobj; import me.bearns.fias.domain.House; +import java.util.Arrays; import java.util.HashSet; +import java.util.Objects; import java.util.Set; import java.util.function.Predicate; @@ -11,14 +13,9 @@ public class RegionFilter implements Predicate { private final Set set = new HashSet<>(); - public RegionFilter(Long[] codes) { - for (Long code : codes){ - if(code>0L && code<100L) { - set.add(String.format("%1$02d", code)); - } else { - //todo - //log.warn("Element out of range: {}", code); - } + public RegionFilter(String codes) { + if(codes!=null){ + Arrays.stream(codes.split(",")).filter(Objects::nonNull).filter(s -> s.matches("^\\d{2}$")).forEach(set::add); } } diff --git a/src/main/resources/db/changelog/000_initial_schema.yaml b/src/main/resources/db/changelog/000_initial_schema.yaml index 220a9b9..e53081a 100644 --- a/src/main/resources/db/changelog/000_initial_schema.yaml +++ b/src/main/resources/db/changelog/000_initial_schema.yaml @@ -21,3 +21,6 @@ databaseChangeLog: - column: name: delta_xml_url type: varchar + - column: + name: regions + type: varchar \ No newline at end of file