From 150895c6e631f028d005889bd41a4f9f33287930 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Thu, 28 Jun 2018 12:05:42 +0200 Subject: [PATCH] when image link is to a submap subdirectry sstructure to the file name is possible (but not requested) --- .../mapviewer/converter/OverviewParser.java | 8 +- .../converter/ProjectFactoryTest.java | 165 +++++++++++------- .../complex_model_with_images_path.zip | Bin 0 -> 20911 bytes 3 files changed, 104 insertions(+), 69 deletions(-) create mode 100644 converter/testFiles/complex_model_with_images_path.zip diff --git a/converter/src/main/java/lcsb/mapviewer/converter/OverviewParser.java b/converter/src/main/java/lcsb/mapviewer/converter/OverviewParser.java index d23f450a0c..0e2473ec1b 100644 --- a/converter/src/main/java/lcsb/mapviewer/converter/OverviewParser.java +++ b/converter/src/main/java/lcsb/mapviewer/converter/OverviewParser.java @@ -113,7 +113,7 @@ public class OverviewParser { /** * Method that parse zip file and creates list of {@link OverviewImage images} * from it. - * + * * @param models * map with models where the key is name of the file and value is model * that was parsed from the file @@ -219,7 +219,7 @@ public class OverviewParser { /** * This method process data from {@link #COORDINATES_FILENAME} in zip archive. * This method adds connections between images and between images and models. - * + * * @param models * map with models where the key is name of the file and value is model * that was parsed from the file @@ -328,7 +328,7 @@ public class OverviewParser { } String filename = columns[filenameColumn]; String polygon = columns[polygonColumn]; - String modelName = FilenameUtils.removeExtension(columns[targetFilenameColumn]); + String modelName = FilenameUtils.getBaseName(columns[targetFilenameColumn]); String coord = columns[redirectionCoordinatesColumn]; String zoomLevel = columns[zoomLevelColumn]; String linkType = columns[targetTypeColumn]; @@ -365,7 +365,7 @@ public class OverviewParser { /** * Creates a link from parameters and place it in appropriate * {@link OverviewImage}. - * + * * @param filename * {@link OverviewImage#filename name of the image} * @param polygon diff --git a/converter/src/test/java/lcsb/mapviewer/converter/ProjectFactoryTest.java b/converter/src/test/java/lcsb/mapviewer/converter/ProjectFactoryTest.java index fc1d6640bb..0ab238b07f 100644 --- a/converter/src/test/java/lcsb/mapviewer/converter/ProjectFactoryTest.java +++ b/converter/src/test/java/lcsb/mapviewer/converter/ProjectFactoryTest.java @@ -25,70 +25,105 @@ import lcsb.mapviewer.model.map.model.ModelData; public class ProjectFactoryTest { - @AfterClass - public static void tearDownAfterClass() throws Exception { - } - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testOverviewImageLink() throws Exception { - try { - ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class); - ProjectFactory projectFactory = new ProjectFactory(converter); - ZipFile zipFile = new ZipFile("testFiles/complex_model_with_img.zip"); - ComplexZipConverterParams params = new ComplexZipConverterParams(); - params.zipFile(zipFile); - - ZipEntryFileFactory factory = new ZipEntryFileFactory(); - Enumeration<? extends ZipEntry> entries = zipFile.entries(); - while (entries.hasMoreElements()) { - ZipEntry entry = entries.nextElement(); - if (!entry.isDirectory()) { - params.entry(factory.createZipEntryFile(entry, zipFile)); - } - } - - Project project = projectFactory.create(params); - assertNotNull(project); - ModelData model = project.getModels().iterator().next(); - assertEquals("main", model.getName()); - - List<OverviewImage> result = project.getOverviewImages(); - - assertNotNull(result); - assertEquals(1, result.size()); - - OverviewImage img = result.get(0); - - assertEquals("test.png", img.getFilename()); - assertEquals((Integer) 639, img.getHeight()); - assertEquals((Integer) 963, img.getWidth()); - assertEquals(2, img.getLinks().size()); - - OverviewLink link = img.getLinks().get(0); - List<Point2D> polygon = link.getPolygonCoordinates(); - assertEquals(4, polygon.size()); - - assertTrue(link instanceof OverviewModelLink); - - OverviewModelLink mLink = (OverviewModelLink) link; - assertEquals((Integer) 10, mLink.getxCoord()); - assertEquals((Integer) 10, mLink.getyCoord()); - assertEquals((Integer) 3, mLink.getZoomLevel()); - assertEquals(model, mLink.getLinkedModel()); - - } catch (Exception e) { - e.printStackTrace(); - throw e; - } - - } + @AfterClass + public static void tearDownAfterClass() throws Exception { + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testOverviewImageLink() throws Exception { + try { + ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class); + ProjectFactory projectFactory = new ProjectFactory(converter); + ZipFile zipFile = new ZipFile("testFiles/complex_model_with_img.zip"); + ComplexZipConverterParams params = new ComplexZipConverterParams(); + params.zipFile(zipFile); + + ZipEntryFileFactory factory = new ZipEntryFileFactory(); + Enumeration<? extends ZipEntry> entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + if (!entry.isDirectory()) { + params.entry(factory.createZipEntryFile(entry, zipFile)); + } + } + + Project project = projectFactory.create(params); + assertNotNull(project); + ModelData model = project.getModels().iterator().next(); + assertEquals("main", model.getName()); + + List<OverviewImage> result = project.getOverviewImages(); + + assertNotNull(result); + assertEquals(1, result.size()); + + OverviewImage img = result.get(0); + + assertEquals("test.png", img.getFilename()); + assertEquals((Integer) 639, img.getHeight()); + assertEquals((Integer) 963, img.getWidth()); + assertEquals(2, img.getLinks().size()); + + OverviewLink link = img.getLinks().get(0); + List<Point2D> polygon = link.getPolygonCoordinates(); + assertEquals(4, polygon.size()); + + assertTrue(link instanceof OverviewModelLink); + + OverviewModelLink mLink = (OverviewModelLink) link; + assertEquals((Integer) 10, mLink.getxCoord()); + assertEquals((Integer) 10, mLink.getyCoord()); + assertEquals((Integer) 3, mLink.getZoomLevel()); + assertEquals(model, mLink.getLinkedModel()); + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + + } + + @Test + public void testOverviewImageLinkToSubmapPath() throws Exception { + try { + ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class); + ProjectFactory projectFactory = new ProjectFactory(converter); + ZipFile zipFile = new ZipFile("testFiles/complex_model_with_images_path.zip"); + ComplexZipConverterParams params = new ComplexZipConverterParams(); + params.zipFile(zipFile); + + ZipEntryFileFactory factory = new ZipEntryFileFactory(); + Enumeration<? extends ZipEntry> entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + if (!entry.isDirectory()) { + params.entry(factory.createZipEntryFile(entry, zipFile)); + } + } + + Project project = projectFactory.create(params); + assertNotNull(project); + ModelData model = project.getModels().iterator().next(); + assertEquals("main", model.getName()); + + List<OverviewImage> result = project.getOverviewImages(); + + assertNotNull(result); + assertEquals(2, result.size()); + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + + } } diff --git a/converter/testFiles/complex_model_with_images_path.zip b/converter/testFiles/complex_model_with_images_path.zip new file mode 100644 index 0000000000000000000000000000000000000000..10246001ea4573b9aa068bf8d9fa3c98299104bc GIT binary patch literal 20911 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 literal 0 HcmV?d00001 -- GitLab