diff --git a/src/main/java/me/bearns/fias/exceptions/DownloadException.java b/src/main/java/me/bearns/fias/exceptions/DownloadException.java new file mode 100644 index 0000000..40a5f99 --- /dev/null +++ b/src/main/java/me/bearns/fias/exceptions/DownloadException.java @@ -0,0 +1,7 @@ +package me.bearns.fias.exceptions; + +public class DownloadException extends Exception { + public DownloadException(Exception e) { + super(e); + } +} diff --git a/src/main/java/me/bearns/fias/service/FiasUpdater.java b/src/main/java/me/bearns/fias/service/FiasUpdater.java index b82353d..f6c73fb 100644 --- a/src/main/java/me/bearns/fias/service/FiasUpdater.java +++ b/src/main/java/me/bearns/fias/service/FiasUpdater.java @@ -1,16 +1,16 @@ package me.bearns.fias.service; import me.bearns.fias.domain.FiasVersion; +import me.bearns.fias.exceptions.DownloadException; import me.bearns.fias.repository.FiasVersionRepository; import me.bearns.fias.util.DownlodableUpdate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.File; -import java.util.AbstractMap; import java.util.HashMap; import java.util.List; -import java.util.Objects; +import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.stream.Collectors; @@ -22,11 +22,14 @@ public class FiasUpdater implements Updater { @Autowired FiasVersionRepository versions; + @Autowired + private static Downloader service; + @Autowired OnlineVersion clientStub; @Override - public void update() { + public void update() throws DownloadException { //Max value FiasVersion dbVersionObj = versions.findTopByOrderByVersionIdDesc(); @@ -52,7 +55,7 @@ public class FiasUpdater implements Updater { } @Override - public void reload(Long... regions) { + public void reload(Long... regions) throws DownloadException { final List lastVersion = clientStub.getLastVersion(); if(lastVersion != null) { @@ -62,29 +65,46 @@ public class FiasUpdater implements Updater { } //transaction from here - private void processUpdates(List updates, boolean reloadFlag, Long ... regions) { + private void processUpdates(List updates, boolean reloadFlag, Long ... regions) throws DownloadException { - //todo reload flag impl + if(reloadFlag) { + //todo reload flag impl + versions.deleteAll(); + } updates.sort((o1, o2) -> Math.toIntExact(o1.getVersionId() - o2.getVersionId())); - final Stream stream = reloadFlag ? updates.stream().map(DownlodableUpdate::processReload) : updates.stream().map(DownlodableUpdate::processUpdate); + Map> map = new HashMap<>(); - for (DownlodableUpdate item : stream.collect(Collectors.toList())) { + //start download + updates.forEach(u -> map.put(u, service.download(reloadFlag ? u.getFiasCompleteXmlUrl() : u.getFiasDeltaXmlUrl()))); + + //strict order + for (FiasVersion item : updates) { + + final File file; try { - //todo process - processFile(item.getFile(), regions); - versions.save(item.getVersion()); - - //todo save updates - } catch (Exception e) { - //todo log - break; + //wait for downloading + file = map.get(item).get(); + + //process update + processArchive(file, regions); + //apply this version + versions.save(item); + + } catch (InterruptedException e) { + e.printStackTrace(); + //todo log + throw new DownloadException(e); + } catch (ExecutionException e) { + e.printStackTrace(); + //todo log + throw new DownloadException(e); } - } + } } - private void processFile(File file, Long ... regions) { + private void processArchive(File file, Long ... regions) { } } \ No newline at end of file diff --git a/src/main/java/me/bearns/fias/service/Updater.java b/src/main/java/me/bearns/fias/service/Updater.java index 44ed4a0..1ff616f 100644 --- a/src/main/java/me/bearns/fias/service/Updater.java +++ b/src/main/java/me/bearns/fias/service/Updater.java @@ -1,16 +1,18 @@ package me.bearns.fias.service; +import me.bearns.fias.exceptions.DownloadException; + public interface Updater { /** * Run online update for fias database */ - public void update(); + public void update() throws DownloadException; /** * Load or reload database for selected regions * @param regions */ - public void reload(Long ... regions); + public void reload(Long ... regions) throws DownloadException; } diff --git a/src/main/java/me/bearns/fias/webapi/API.java b/src/main/java/me/bearns/fias/webapi/API.java index 4f05dbb..4e5293f 100644 --- a/src/main/java/me/bearns/fias/webapi/API.java +++ b/src/main/java/me/bearns/fias/webapi/API.java @@ -1,5 +1,6 @@ package me.bearns.fias.webapi; +import me.bearns.fias.exceptions.DownloadException; import me.bearns.fias.service.Updater; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -13,6 +14,11 @@ public class API { @GetMapping("/update") void update(){ - service.update(); + try { + service.update(); + } catch (DownloadException e) { + //TODO + e.printStackTrace(); + } } }