From 1344b50a6269bb059397d86db6ebb659ecfc37fe Mon Sep 17 00:00:00 2001 From: Terekhin Alexander Date: Wed, 19 Aug 2020 14:01:29 +0300 Subject: [PATCH] Split updeter functional for enable transaction support --- .../fias/{util => helpers}/Catalog.java | 2 +- .../fias/{util => helpers}/RegionFilter.java | 2 +- .../UnmarshallerParameters.java | 2 +- .../me/bearns/fias/helpers/UpdateHelper.java | 10 ++ .../me/bearns/fias/helpers/UpdaterImpl.java | 118 ++++++++++++++++++ .../me/bearns/fias/service/FiasUpdater.java | 92 ++------------ .../me/bearns/fias/service/StreamSaver.java | 3 +- .../bearns/fias/service/StreamSaverImpl.java | 2 +- .../java/me/bearns/fias/TransactionsTest.java | 13 +- 9 files changed, 147 insertions(+), 97 deletions(-) rename src/main/java/me/bearns/fias/{util => helpers}/Catalog.java (98%) rename src/main/java/me/bearns/fias/{util => helpers}/RegionFilter.java (96%) rename src/main/java/me/bearns/fias/{util => helpers}/UnmarshallerParameters.java (89%) create mode 100644 src/main/java/me/bearns/fias/helpers/UpdateHelper.java create mode 100644 src/main/java/me/bearns/fias/helpers/UpdaterImpl.java diff --git a/src/main/java/me/bearns/fias/util/Catalog.java b/src/main/java/me/bearns/fias/helpers/Catalog.java similarity index 98% rename from src/main/java/me/bearns/fias/util/Catalog.java rename to src/main/java/me/bearns/fias/helpers/Catalog.java index 75b9a64..bb25ad8 100644 --- a/src/main/java/me/bearns/fias/util/Catalog.java +++ b/src/main/java/me/bearns/fias/helpers/Catalog.java @@ -1,4 +1,4 @@ -package me.bearns.fias.util; +package me.bearns.fias.helpers; import me.bearns.fias.domain.AddressObjects; import me.bearns.fias.domain.Addrobj; diff --git a/src/main/java/me/bearns/fias/util/RegionFilter.java b/src/main/java/me/bearns/fias/helpers/RegionFilter.java similarity index 96% rename from src/main/java/me/bearns/fias/util/RegionFilter.java rename to src/main/java/me/bearns/fias/helpers/RegionFilter.java index 69a767e..b0ebf01 100644 --- a/src/main/java/me/bearns/fias/util/RegionFilter.java +++ b/src/main/java/me/bearns/fias/helpers/RegionFilter.java @@ -1,4 +1,4 @@ -package me.bearns.fias.util; +package me.bearns.fias.helpers; import me.bearns.fias.domain.Addrobj; import me.bearns.fias.domain.House; diff --git a/src/main/java/me/bearns/fias/util/UnmarshallerParameters.java b/src/main/java/me/bearns/fias/helpers/UnmarshallerParameters.java similarity index 89% rename from src/main/java/me/bearns/fias/util/UnmarshallerParameters.java rename to src/main/java/me/bearns/fias/helpers/UnmarshallerParameters.java index fe166a7..8f88f3c 100644 --- a/src/main/java/me/bearns/fias/util/UnmarshallerParameters.java +++ b/src/main/java/me/bearns/fias/helpers/UnmarshallerParameters.java @@ -1,4 +1,4 @@ -package me.bearns.fias.util; +package me.bearns.fias.helpers; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/me/bearns/fias/helpers/UpdateHelper.java b/src/main/java/me/bearns/fias/helpers/UpdateHelper.java new file mode 100644 index 0000000..0d2578a --- /dev/null +++ b/src/main/java/me/bearns/fias/helpers/UpdateHelper.java @@ -0,0 +1,10 @@ +package me.bearns.fias.helpers; + +import me.bearns.fias.domain.FiasVersion; +import me.bearns.fias.exceptions.CommonException; + +import java.util.List; + +public interface UpdateHelper { + public void processUpdates(List updates, boolean reloadFlag) throws CommonException; +} diff --git a/src/main/java/me/bearns/fias/helpers/UpdaterImpl.java b/src/main/java/me/bearns/fias/helpers/UpdaterImpl.java new file mode 100644 index 0000000..71df1d6 --- /dev/null +++ b/src/main/java/me/bearns/fias/helpers/UpdaterImpl.java @@ -0,0 +1,118 @@ +package me.bearns.fias.helpers; + +import me.bearns.fias.domain.FiasVersion; +import me.bearns.fias.exceptions.CommonException; +import me.bearns.fias.exceptions.DownloadException; +import me.bearns.fias.exceptions.UnzipException; +import me.bearns.fias.repository.FiasVersionRepository; +import me.bearns.fias.service.Downloader; +import me.bearns.fias.service.StreamSaver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +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; + +@Component +public class UpdaterImpl implements UpdateHelper { + + @Autowired + private static Downloader fileService; + + @Autowired + private static FiasVersionRepository versions; + + @Autowired + private static Catalog catalog; + + @Autowired + private static StreamSaver unmarshaller; + + + //transaction from here + @Transactional(rollbackFor = Exception.class) + public void processUpdates(List updates, boolean reloadFlag) throws CommonException { + + if(reloadFlag) { + //todo reload flag impl + versions.deleteAll(); + } + + updates.sort((o1, o2) -> Math.toIntExact(o1.getVersionId() - o2.getVersionId())); + + Map> map = new HashMap<>(); + + //start download + updates.forEach(u -> map.put(u, fileService.download(reloadFlag ? u.getFiasCompleteXmlUrl() : u.getFiasDeltaXmlUrl()))); + + //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, filter); + //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 processArchive(File file, Predicate filter) throws CommonException { + + try(final ZipFile zipFile = new ZipFile(file)){ + + final Enumeration entries = zipFile.entries(); + + while (entries.hasMoreElements()){ + + final ZipEntry entry = entries.nextElement(); + + final UnmarshallerParameters config = catalog.getByPrefix(entry.getName()); + + if(config!=null) { //todo + try (InputStream is = zipFile.getInputStream(entry)) { + unmarshaller.process(is, config, filter); + } + } + } + + } catch (ZipException e) { + throw new UnzipException(e); + } catch (IOException e) { + throw new UnzipException(e); + } + + } +} diff --git a/src/main/java/me/bearns/fias/service/FiasUpdater.java b/src/main/java/me/bearns/fias/service/FiasUpdater.java index 534a256..da2438e 100644 --- a/src/main/java/me/bearns/fias/service/FiasUpdater.java +++ b/src/main/java/me/bearns/fias/service/FiasUpdater.java @@ -4,10 +4,11 @@ import me.bearns.fias.domain.FiasVersion; import me.bearns.fias.exceptions.CommonException; import me.bearns.fias.exceptions.DownloadException; import me.bearns.fias.exceptions.UnzipException; +import me.bearns.fias.helpers.UpdateHelper; import me.bearns.fias.repository.FiasVersionRepository; -import me.bearns.fias.util.Catalog; -import me.bearns.fias.util.RegionFilter; -import me.bearns.fias.util.UnmarshallerParameters; +import me.bearns.fias.helpers.Catalog; +import me.bearns.fias.helpers.RegionFilter; +import me.bearns.fias.helpers.UnmarshallerParameters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,17 +28,11 @@ public class FiasUpdater implements Updater { @Autowired private static FiasVersionRepository versions; - @Autowired - private static StreamSaver unmarshaller; - - @Autowired - private static Downloader fileService; - @Autowired private static OnlineVersion clientStub; @Autowired - private static Catalog catalog; + private static UpdateHelper helper; @Override public void update() throws CommonException { @@ -61,7 +56,7 @@ public class FiasUpdater implements Updater { if(regions != null) updates.forEach(u -> u.setRegions(regions)); if(updates != null && !updates.isEmpty()) { - processUpdates(updates, false); + helper.processUpdates(updates, false); } } } @@ -79,83 +74,10 @@ public class FiasUpdater implements Updater { //set region filter lastVersion.get(0).setRegions(regions); - processUpdates(lastVersion, true); - } - - } - - //transaction from here - @Transactional - private void processUpdates(List updates, boolean reloadFlag) throws CommonException { - - if(reloadFlag) { - //todo reload flag impl - versions.deleteAll(); + helper.processUpdates(lastVersion, true); } - updates.sort((o1, o2) -> Math.toIntExact(o1.getVersionId() - o2.getVersionId())); - - Map> map = new HashMap<>(); - - //start download - updates.forEach(u -> map.put(u, fileService.download(reloadFlag ? u.getFiasCompleteXmlUrl() : u.getFiasDeltaXmlUrl()))); - - //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, filter); - //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 processArchive(File file, Predicate filter) throws CommonException { - - try(final ZipFile zipFile = new ZipFile(file)){ - - final Enumeration entries = zipFile.entries(); - - while (entries.hasMoreElements()){ - - final ZipEntry entry = entries.nextElement(); - final UnmarshallerParameters config = catalog.getByPrefix(entry.getName()); - - if(config!=null) { //todo - try (InputStream is = zipFile.getInputStream(entry)) { - unmarshaller.process(is, config, filter); - } - } - } - - } catch (ZipException e) { - throw new UnzipException(e); - } catch (IOException e) { - throw new UnzipException(e); - } - - } } \ No newline at end of file diff --git a/src/main/java/me/bearns/fias/service/StreamSaver.java b/src/main/java/me/bearns/fias/service/StreamSaver.java index 5a6912a..5424824 100644 --- a/src/main/java/me/bearns/fias/service/StreamSaver.java +++ b/src/main/java/me/bearns/fias/service/StreamSaver.java @@ -1,8 +1,7 @@ package me.bearns.fias.service; import me.bearns.fias.exceptions.CommonException; -import me.bearns.fias.exceptions.UnmarshallingException; -import me.bearns.fias.util.UnmarshallerParameters; +import me.bearns.fias.helpers.UnmarshallerParameters; import java.io.InputStream; import java.util.function.Predicate; diff --git a/src/main/java/me/bearns/fias/service/StreamSaverImpl.java b/src/main/java/me/bearns/fias/service/StreamSaverImpl.java index a3ce559..82f5f75 100644 --- a/src/main/java/me/bearns/fias/service/StreamSaverImpl.java +++ b/src/main/java/me/bearns/fias/service/StreamSaverImpl.java @@ -2,7 +2,7 @@ package me.bearns.fias.service; import me.bearns.fias.exceptions.CommonException; import me.bearns.fias.exceptions.UnmarshallingException; -import me.bearns.fias.util.UnmarshallerParameters; +import me.bearns.fias.helpers.UnmarshallerParameters; import org.springframework.stereotype.Component; import javax.xml.bind.JAXBContext; diff --git a/src/test/java/me/bearns/fias/TransactionsTest.java b/src/test/java/me/bearns/fias/TransactionsTest.java index 6a75891..c1b4b4f 100644 --- a/src/test/java/me/bearns/fias/TransactionsTest.java +++ b/src/test/java/me/bearns/fias/TransactionsTest.java @@ -1,15 +1,16 @@ package me.bearns.fias; import me.bearns.fias.domain.FiasVersion; +import me.bearns.fias.exceptions.UnmarshallingException; import me.bearns.fias.helper.TransactionalSaveHelper; import me.bearns.fias.repository.FiasVersionRepository; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; -import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; @@ -17,7 +18,6 @@ import java.util.List; import static me.bearns.fias.helper.TransactionalSaveHelper.FIRST; import static me.bearns.fias.helper.TransactionalSaveHelper.NEXT; -import static org.springframework.transaction.annotation.Isolation.READ_COMMITTED; @RunWith(SpringRunner.class) @SpringBootTest @@ -42,13 +42,9 @@ public class TransactionsTest { try { helper.addNext(); - assert false; - } catch (Exception e) { - //e.printStackTrace(); //just as plained - assert true; } @@ -62,5 +58,10 @@ public class TransactionsTest { } + @After + public void clear(){ + repository.deleteAll(); + } + }