From 34fbf561731ec6f972f304d9cd03ccacd8e21577 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 12 Feb 2018 17:19:25 +0100
Subject: [PATCH] when importing zip file from max, ignore max specific
 "hidden" files

---
 .../converter/ComplexZipConverter.java        |  20 +-
 .../converter/ComplexZipConverterTest.java    | 947 +++++++++---------
 2 files changed, 508 insertions(+), 459 deletions(-)

diff --git a/converter/src/main/java/lcsb/mapviewer/converter/ComplexZipConverter.java b/converter/src/main/java/lcsb/mapviewer/converter/ComplexZipConverter.java
index e2640f0b3e..12f391a07b 100644
--- a/converter/src/main/java/lcsb/mapviewer/converter/ComplexZipConverter.java
+++ b/converter/src/main/java/lcsb/mapviewer/converter/ComplexZipConverter.java
@@ -114,6 +114,8 @@ public class ComplexZipConverter {
         ZipEntry entry = entries.nextElement();
         if (!entry.isDirectory()) {
           ZipEntryFile zef = params.getEntry(entry.getName());
+          logger.debug(entry.getName());
+          logger.debug(zef);
           if (zef instanceof ModelZipEntryFile) {
             ModelZipEntryFile modelEntryFile = (ModelZipEntryFile) zef;
             InputStream is = zipFile.getInputStream(entry);
@@ -133,7 +135,7 @@ public class ComplexZipConverter {
             // imageEntries.add((ImageZipEntryFile) zef);
           } else if (zef instanceof DataMiningZipEntryFile) {
             dataMiningSets.add(dataMiningZipEntryToDataMiningSet(zipFile, entry, (DataMiningZipEntryFile) zef));
-          } else {
+          } else if (!isIgnoredFile(entry.getName())) {
             throw new NotImplementedException("Unknwon entry type: " + zef.getClass());
           }
         }
@@ -181,6 +183,19 @@ public class ComplexZipConverter {
     }
   }
 
+  protected boolean isIgnoredFile(String name) {
+    if (name == null) {
+      return true;
+    } else if (name.isEmpty()) {
+      return true;
+    } else if (name.startsWith(".DS_Store")) {
+      return true;
+    } else if (name.startsWith("__MACOSX")) {
+      return true;
+    }
+    return false;
+  }
+
   /**
    * Process a single reaction in mapping file (transfomring reaction into
    * connection between submodels).
@@ -278,13 +293,12 @@ public class ComplexZipConverter {
 
     String root = null;
     String mapping = null;
-    logger.debug(params.getFilenames());
     while (entries.hasMoreElements()) {
       ZipEntry entry = entries.nextElement();
       if (!entry.isDirectory()) {
         String name = entry.getName();
         ZipEntryFile zef = params.getEntry(name);
-        if (zef == null) {
+        if (zef == null && !isIgnoredFile(name)) {
           throw new InvalidArgumentException("No information found in params about file: " + name);
         }
         if (zef instanceof ModelZipEntryFile) {
diff --git a/converter/src/test/java/lcsb/mapviewer/converter/ComplexZipConverterTest.java b/converter/src/test/java/lcsb/mapviewer/converter/ComplexZipConverterTest.java
index 6d8f7acb69..4d768d5aa9 100644
--- a/converter/src/test/java/lcsb/mapviewer/converter/ComplexZipConverterTest.java
+++ b/converter/src/test/java/lcsb/mapviewer/converter/ComplexZipConverterTest.java
@@ -1,8 +1,10 @@
 package lcsb.mapviewer.converter;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.File;
@@ -35,461 +37,494 @@ import lcsb.mapviewer.model.map.species.Species;
 
 public class ComplexZipConverterTest {
 
-	@SuppressWarnings("unused")
-	private static Logger logger = Logger.getLogger(ComplexZipConverterTest.class);
-
-	private abstract class AbstractConverter implements IConverter {
-
-	}
-
-	private interface InterfaceConverter extends IConverter {
-
-	}
-
-	public static class MockConverter implements IConverter {
-
-		@Override
-		public Model createModel(ConverterParams params) {
-			Model result = new ModelFullIndexed(null);
-
-			Species sa1 = new GenericProtein("sa1");
-			result.addElement(sa1);
-
-			Species sa2 = new GenericProtein("sa2");
-			result.addElement(sa2);
-
-			Species sa3 = new GenericProtein("sa3");
-			result.addElement(sa3);
-
-			Species sa4 = new Phenotype("sa4");
-			result.addElement(sa4);
-
-			Complex ca1 = new Complex("ca1");
-			ca1.setName("main");
-			result.addElement(ca1);
-			Species sa5 = new GenericProtein("sa5");
-			sa5.setName("sa1");
-			result.addElement(sa5);
-			ca1.addSpecies(sa5);
-			Species sa6 = new Phenotype("sa6");
-			sa6.setName("sa4");
-			result.addElement(sa6);
-			ca1.addSpecies(sa6);
-
-			Complex ca2 = new Complex("ca2");
-			ca2.setName("s1");
-			result.addElement(ca2);
-			Species sa7 = new GenericProtein("sa7");
-			sa7.setName("sa1");
-			result.addElement(sa7);
-			ca2.addSpecies(sa7);
-
-			Complex ca3 = new Complex("cs3");
-			ca3.setName("s2");
-			result.addElement(ca3);
-
-			Complex ca4 = new Complex("cs4");
-			ca4.setName("s3");
-			result.addElement(ca4);
-
-			Reaction r1 = new TransportReaction("re1");
-			r1.addReactant(new Reactant(sa5));
-			r1.addProduct(new Product(sa7));
-			result.addReaction(r1);
-
-			Reaction r2 = new TransportReaction("re2");
-			r2.addReactant(new Reactant(sa6));
-			r2.addProduct(new Product(ca3));
-			result.addReaction(r2);
-
-			Reaction r3 = new TransportReaction("re3");
-			r3.addReactant(new Reactant(sa7));
-			r3.addProduct(new Product(ca4));
-			result.addReaction(r3);
-			return result;
-		}
-
-		@Override
-		public InputStream exportModelToInputStream(Model model) throws InconsistentModelException {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		@Override
-		public File exportModelToFile(Model model, String filePath) throws InconsistentModelException {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		@Override
-		public String getCommonName() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		@Override
-		public MimeType getMimeType() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		@Override
-		public String getFileExtension() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-	}
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testConstructor() throws Exception {
-		try {
-			new ComplexZipConverter(AbstractConverter.class);
-			fail("Exception expected");
-
-		} catch (InvalidClassException e) {
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-
-	}
-
-	@Test
-	public void testConstructor2() throws Exception {
-		try {
-			new ComplexZipConverter(InterfaceConverter.class);
-			fail("Exception expected");
-
-		} catch (InvalidClassException e) {
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-
-	}
-
-	@Test
-	public void testConstructor3() throws Exception {
-		try {
-			new ComplexZipConverter(MockConverter.class);
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-
-	}
-
-	@Test
-	public void testParamsOk() throws Exception {
-		try {
-			ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
-			ComplexZipConverterParams params = new ComplexZipConverterParams();
-			params.zipFile(new ZipFile("testFiles/complex_model.zip"));
-			params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
-			params.entry(new ModelZipEntryFile("s1.xml", "s1", false, false, SubmodelType.DOWNSTREAM_TARGETS));
-			params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
-			params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
-			params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
-			Model model = converter.createModel(params);
-			assertNotNull(model);
-			assertEquals("main", model.getName());
-			assertEquals(3, model.getSubmodelConnections().size());
-
-			Model s1Model = null;
-			Model s2Model = null;
-			Model s3Model = null;
-
-			for (ModelSubmodelConnection submodel : model.getSubmodelConnections()) {
-				if (submodel.getName().equals("s1")) {
-					s1Model = submodel.getSubmodel().getModel();
-				}
-				if (submodel.getName().equals("s2")) {
-					s2Model = submodel.getSubmodel().getModel();
-				}
-				if (submodel.getName().equals("s3")) {
-					s3Model = submodel.getSubmodel().getModel();
-				}
-			}
-			assertNotNull(s1Model);
-			assertNotNull(s2Model);
-			assertNotNull(s3Model);
-
-			Element al1 = model.getElementByElementId("sa1");
-			assertNotNull(al1.getSubmodel());
-			assertEquals(SubmodelType.DOWNSTREAM_TARGETS, al1.getSubmodel().getType());
-			assertEquals(s1Model, al1.getSubmodel().getSubmodel().getModel());
-
-			Element al2 = model.getElementByElementId("sa2");
-			assertNull(al2.getSubmodel());
-
-			Element al4 = model.getElementByElementId("sa4");
-			assertNotNull(al4.getSubmodel());
-			assertEquals(SubmodelType.PATHWAY, al4.getSubmodel().getType());
-			assertEquals(s2Model, al4.getSubmodel().getSubmodel().getModel());
-
-			Element s1_al1 = s1Model.getElementByElementId("sa1");
-			assertNotNull(s1_al1.getSubmodel());
-			assertEquals(SubmodelType.DOWNSTREAM_TARGETS, s1_al1.getSubmodel().getType());
-			assertEquals(s3Model, s1_al1.getSubmodel().getSubmodel().getModel());
-
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-
-	}
-
-	@Test
-	public void testChangeModelZipEntry() throws Exception {
-		try {
-			ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
-			ComplexZipConverterParams params = new ComplexZipConverterParams();
-			params.zipFile(new ZipFile("testFiles/complex_model.zip"));
-			params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
-			params.entry(new ModelZipEntryFile("s1.xml", "s12", false, false, SubmodelType.DOWNSTREAM_TARGETS));
-			params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
-			params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
-			params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
-			Model model = converter.createModel(params);
-			assertNotNull(model);
-			assertEquals("main", model.getName());
-			assertEquals(3, model.getSubmodelConnections().size());
-
-			Model s1Model = null;
-			Model s2Model = null;
-			Model s3Model = null;
-
-			for (ModelSubmodelConnection submodel : model.getSubmodelConnections()) {
-				if (submodel.getName().equals("s12")) {
-					s1Model = submodel.getSubmodel().getModel();
-				}
-				if (submodel.getName().equals("s2")) {
-					s2Model = submodel.getSubmodel().getModel();
-				}
-				if (submodel.getName().equals("s3")) {
-					s3Model = submodel.getSubmodel().getModel();
-				}
-			}
-			assertNotNull(s1Model);
-			assertNotNull(s2Model);
-			assertNotNull(s3Model);
-
-			Element al1 = model.getElementByElementId("sa1");
-			assertNotNull(al1.getSubmodel());
-			assertEquals(SubmodelType.DOWNSTREAM_TARGETS, al1.getSubmodel().getType());
-			assertEquals(s1Model, al1.getSubmodel().getSubmodel().getModel());
-
-			Element al2 = model.getElementByElementId("sa2");
-			assertNull(al2.getSubmodel());
-
-			Element al4 = model.getElementByElementId("sa4");
-			assertNotNull(al4.getSubmodel());
-			assertEquals(SubmodelType.PATHWAY, al4.getSubmodel().getType());
-			assertEquals(s2Model, al4.getSubmodel().getSubmodel().getModel());
-
-			Element s1_al1 = s1Model.getElementByElementId("sa1");
-			assertNotNull(s1_al1.getSubmodel());
-			assertEquals(SubmodelType.DOWNSTREAM_TARGETS, s1_al1.getSubmodel().getType());
-			assertEquals(s3Model, s1_al1.getSubmodel().getSubmodel().getModel());
-
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-
-	}
-
-	@Test
-	public void testParamsMissing() throws Exception {
-		try {
-			ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
-			ComplexZipConverterParams params = new ComplexZipConverterParams();
-			params.zipFile(new ZipFile("testFiles/complex_model.zip"));
-			params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
-			params.entry(new ModelZipEntryFile("s1.xml", "s1", false, false, SubmodelType.DOWNSTREAM_TARGETS));
-			params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
-			params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
-			try {
-				converter.createModel(params);
-				fail("Exception expected");
-			} catch (InvalidArgumentException e) {
-
-			}
-
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-
-	}
-
-	@Test
-	public void testParamsInvalid1() throws Exception {
-		try {
-			// two mains
-			ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
-			ComplexZipConverterParams params = new ComplexZipConverterParams();
-			params.zipFile(new ZipFile("testFiles/complex_model.zip"));
-			params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
-			params.entry(new ModelZipEntryFile("s1.xml", "s1", true, false, SubmodelType.DOWNSTREAM_TARGETS));
-			params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
-			params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
-			params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
-			try {
-				converter.createModel(params);
-				fail("Exception expected");
-			} catch (InvalidArgumentException e) {
-
-			}
-
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-
-	}
-
-	@Test
-	public void testParamsInvalid2() throws Exception {
-		try {
-			// zero mains
-			ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
-			ComplexZipConverterParams params = new ComplexZipConverterParams();
-			params.zipFile(new ZipFile("testFiles/complex_model.zip"));
-			params.entry(new ModelZipEntryFile("main.xml", "main", false, false, null));
-			params.entry(new ModelZipEntryFile("s1.xml", "s1", false, false, SubmodelType.DOWNSTREAM_TARGETS));
-			params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
-			params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
-			params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
-			try {
-				converter.createModel(params);
-				fail("Exception expected");
-			} catch (InvalidArgumentException e) {
-
-			}
-
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-
-	}
-
-	@Test
-	public void testParamsInvalid3() throws Exception {
-		try {
-			// two mappings
-			ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
-			ComplexZipConverterParams params = new ComplexZipConverterParams();
-			params.zipFile(new ZipFile("testFiles/complex_model.zip"));
-			params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
-			params.entry(new ModelZipEntryFile("s1.xml", "s1", false, true, SubmodelType.DOWNSTREAM_TARGETS));
-			params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
-			params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
-			params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
-			try {
-				converter.createModel(params);
-				fail("Exception expected");
-			} catch (InvalidArgumentException e) {
-
-			}
-
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-
-	}
-
-	@Test
-	public void testParamsMissingMapping() throws Exception {
-		try {
-			// zero mappings (should be ok)
-			ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
-			ComplexZipConverterParams params = new ComplexZipConverterParams();
-			params.zipFile(new ZipFile("testFiles/complex_model.zip"));
-			params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
-			params.entry(new ModelZipEntryFile("s1.xml", "s1", false, false, SubmodelType.DOWNSTREAM_TARGETS));
-			params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
-			params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
-			params.entry(new ModelZipEntryFile("mapping.xml", "", false, false, null));
-			Model model = converter.createModel(params);
-
-			assertNotNull(model);
-
-			assertEquals(4, model.getSubmodelConnections().size());
-
-			for (ModelSubmodelConnection submodel : model.getSubmodelConnections()) {
-				if (submodel.getName().equals("s1")) {
-					assertEquals(SubmodelType.DOWNSTREAM_TARGETS, submodel.getType());
-				} else if (submodel.getName().equals("s2")) {
-					assertEquals(SubmodelType.PATHWAY, submodel.getType());
-				} else if (submodel.getName().equals("s3")) {
-					assertEquals(SubmodelType.UNKNOWN, submodel.getType());
-				} else if (submodel.getName().equals("mapping")) {
-					assertEquals(SubmodelType.UNKNOWN, submodel.getType());
-				}
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-
-	}
-
-	@Test
-	public void testTooManyParams() throws Exception {
-		try {
-			// zero mappings (should be ok)
-			ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
-			ComplexZipConverterParams params = new ComplexZipConverterParams();
-			params.zipFile(new ZipFile("testFiles/complex_model.zip"));
-			params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
-			params.entry(new ModelZipEntryFile("s1.xml", "s1", false, false, SubmodelType.DOWNSTREAM_TARGETS));
-			params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
-			params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
-			params.entry(new ModelZipEntryFile("mapping.xml", "", false, false, null));
-			params.entry(new ModelZipEntryFile("blabla.xml", "s3", false, false, SubmodelType.UNKNOWN));
-			try {
-				converter.createModel(params);
-				fail("Exception expected");
-			} catch (InvalidArgumentException e) {
-
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-	}
-
-	@Test
-	public void testInvalidMappingFile() throws Exception {
-		try {
-			// zero mappings (should be ok)
-			ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
-			ComplexZipConverterParams params = new ComplexZipConverterParams();
-			params.zipFile(new ZipFile("testFiles/invalid_mapping.zip"));
-			params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
-			params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
-			try {
-				converter.createModel(params);
-				fail("Exception expected");
-			} catch (InvalidArgumentException e) {
-
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-	}
+  @SuppressWarnings("unused")
+  private static Logger logger = Logger.getLogger(ComplexZipConverterTest.class);
+
+  private abstract class AbstractConverter implements IConverter {
+
+  }
+
+  private interface InterfaceConverter extends IConverter {
+
+  }
+
+  public static class MockConverter implements IConverter {
+
+    @Override
+    public Model createModel(ConverterParams params) {
+      Model result = new ModelFullIndexed(null);
+
+      Species sa1 = new GenericProtein("sa1");
+      result.addElement(sa1);
+
+      Species sa2 = new GenericProtein("sa2");
+      result.addElement(sa2);
+
+      Species sa3 = new GenericProtein("sa3");
+      result.addElement(sa3);
+
+      Species sa4 = new Phenotype("sa4");
+      result.addElement(sa4);
+
+      Complex ca1 = new Complex("ca1");
+      ca1.setName("main");
+      result.addElement(ca1);
+      Species sa5 = new GenericProtein("sa5");
+      sa5.setName("sa1");
+      result.addElement(sa5);
+      ca1.addSpecies(sa5);
+      Species sa6 = new Phenotype("sa6");
+      sa6.setName("sa4");
+      result.addElement(sa6);
+      ca1.addSpecies(sa6);
+
+      Complex ca2 = new Complex("ca2");
+      ca2.setName("s1");
+      result.addElement(ca2);
+      Species sa7 = new GenericProtein("sa7");
+      sa7.setName("sa1");
+      result.addElement(sa7);
+      ca2.addSpecies(sa7);
+
+      Complex ca3 = new Complex("cs3");
+      ca3.setName("s2");
+      result.addElement(ca3);
+
+      Complex ca4 = new Complex("cs4");
+      ca4.setName("s3");
+      result.addElement(ca4);
+
+      Reaction r1 = new TransportReaction("re1");
+      r1.addReactant(new Reactant(sa5));
+      r1.addProduct(new Product(sa7));
+      result.addReaction(r1);
+
+      Reaction r2 = new TransportReaction("re2");
+      r2.addReactant(new Reactant(sa6));
+      r2.addProduct(new Product(ca3));
+      result.addReaction(r2);
+
+      Reaction r3 = new TransportReaction("re3");
+      r3.addReactant(new Reactant(sa7));
+      r3.addProduct(new Product(ca4));
+      result.addReaction(r3);
+      return result;
+    }
+
+    @Override
+    public InputStream exportModelToInputStream(Model model) throws InconsistentModelException {
+      // TODO Auto-generated method stub
+      return null;
+    }
+
+    @Override
+    public File exportModelToFile(Model model, String filePath) throws InconsistentModelException {
+      // TODO Auto-generated method stub
+      return null;
+    }
+
+    @Override
+    public String getCommonName() {
+      // TODO Auto-generated method stub
+      return null;
+    }
+
+    @Override
+    public MimeType getMimeType() {
+      // TODO Auto-generated method stub
+      return null;
+    }
+
+    @Override
+    public String getFileExtension() {
+      // TODO Auto-generated method stub
+      return null;
+    }
+
+  }
+
+  @Before
+  public void setUp() throws Exception {
+  }
+
+  @After
+  public void tearDown() throws Exception {
+  }
+
+  @Test
+  public void testConstructor() throws Exception {
+    try {
+      new ComplexZipConverter(AbstractConverter.class);
+      fail("Exception expected");
+
+    } catch (InvalidClassException e) {
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+
+  }
+
+  @Test
+  public void testConstructor2() throws Exception {
+    try {
+      new ComplexZipConverter(InterfaceConverter.class);
+      fail("Exception expected");
+
+    } catch (InvalidClassException e) {
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+
+  }
+
+  @Test
+  public void testConstructor3() throws Exception {
+    try {
+      new ComplexZipConverter(MockConverter.class);
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+
+  }
+
+  @Test
+  public void testParamsOk() throws Exception {
+    try {
+      ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
+      ComplexZipConverterParams params = new ComplexZipConverterParams();
+      params.zipFile(new ZipFile("testFiles/complex_model.zip"));
+      params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
+      params.entry(new ModelZipEntryFile("s1.xml", "s1", false, false, SubmodelType.DOWNSTREAM_TARGETS));
+      params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
+      params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
+      params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
+      Model model = converter.createModel(params);
+      assertNotNull(model);
+      assertEquals("main", model.getName());
+      assertEquals(3, model.getSubmodelConnections().size());
+
+      Model s1Model = null;
+      Model s2Model = null;
+      Model s3Model = null;
+
+      for (ModelSubmodelConnection submodel : model.getSubmodelConnections()) {
+        if (submodel.getName().equals("s1")) {
+          s1Model = submodel.getSubmodel().getModel();
+        }
+        if (submodel.getName().equals("s2")) {
+          s2Model = submodel.getSubmodel().getModel();
+        }
+        if (submodel.getName().equals("s3")) {
+          s3Model = submodel.getSubmodel().getModel();
+        }
+      }
+      assertNotNull(s1Model);
+      assertNotNull(s2Model);
+      assertNotNull(s3Model);
+
+      Element al1 = model.getElementByElementId("sa1");
+      assertNotNull(al1.getSubmodel());
+      assertEquals(SubmodelType.DOWNSTREAM_TARGETS, al1.getSubmodel().getType());
+      assertEquals(s1Model, al1.getSubmodel().getSubmodel().getModel());
+
+      Element al2 = model.getElementByElementId("sa2");
+      assertNull(al2.getSubmodel());
+
+      Element al4 = model.getElementByElementId("sa4");
+      assertNotNull(al4.getSubmodel());
+      assertEquals(SubmodelType.PATHWAY, al4.getSubmodel().getType());
+      assertEquals(s2Model, al4.getSubmodel().getSubmodel().getModel());
+
+      Element s1_al1 = s1Model.getElementByElementId("sa1");
+      assertNotNull(s1_al1.getSubmodel());
+      assertEquals(SubmodelType.DOWNSTREAM_TARGETS, s1_al1.getSubmodel().getType());
+      assertEquals(s3Model, s1_al1.getSubmodel().getSubmodel().getModel());
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+
+  }
+
+  @Test
+  public void testChangeModelZipEntry() throws Exception {
+    try {
+      ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
+      ComplexZipConverterParams params = new ComplexZipConverterParams();
+      params.zipFile(new ZipFile("testFiles/complex_model.zip"));
+      params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
+      params.entry(new ModelZipEntryFile("s1.xml", "s12", false, false, SubmodelType.DOWNSTREAM_TARGETS));
+      params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
+      params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
+      params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
+      Model model = converter.createModel(params);
+      assertNotNull(model);
+      assertEquals("main", model.getName());
+      assertEquals(3, model.getSubmodelConnections().size());
+
+      Model s1Model = null;
+      Model s2Model = null;
+      Model s3Model = null;
+
+      for (ModelSubmodelConnection submodel : model.getSubmodelConnections()) {
+        if (submodel.getName().equals("s12")) {
+          s1Model = submodel.getSubmodel().getModel();
+        }
+        if (submodel.getName().equals("s2")) {
+          s2Model = submodel.getSubmodel().getModel();
+        }
+        if (submodel.getName().equals("s3")) {
+          s3Model = submodel.getSubmodel().getModel();
+        }
+      }
+      assertNotNull(s1Model);
+      assertNotNull(s2Model);
+      assertNotNull(s3Model);
+
+      Element al1 = model.getElementByElementId("sa1");
+      assertNotNull(al1.getSubmodel());
+      assertEquals(SubmodelType.DOWNSTREAM_TARGETS, al1.getSubmodel().getType());
+      assertEquals(s1Model, al1.getSubmodel().getSubmodel().getModel());
+
+      Element al2 = model.getElementByElementId("sa2");
+      assertNull(al2.getSubmodel());
+
+      Element al4 = model.getElementByElementId("sa4");
+      assertNotNull(al4.getSubmodel());
+      assertEquals(SubmodelType.PATHWAY, al4.getSubmodel().getType());
+      assertEquals(s2Model, al4.getSubmodel().getSubmodel().getModel());
+
+      Element s1_al1 = s1Model.getElementByElementId("sa1");
+      assertNotNull(s1_al1.getSubmodel());
+      assertEquals(SubmodelType.DOWNSTREAM_TARGETS, s1_al1.getSubmodel().getType());
+      assertEquals(s3Model, s1_al1.getSubmodel().getSubmodel().getModel());
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+
+  }
+
+  @Test
+  public void testParamsMissing() throws Exception {
+    try {
+      ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
+      ComplexZipConverterParams params = new ComplexZipConverterParams();
+      params.zipFile(new ZipFile("testFiles/complex_model.zip"));
+      params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
+      params.entry(new ModelZipEntryFile("s1.xml", "s1", false, false, SubmodelType.DOWNSTREAM_TARGETS));
+      params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
+      params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
+      try {
+        converter.createModel(params);
+        fail("Exception expected");
+      } catch (InvalidArgumentException e) {
+
+      }
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+
+  }
+
+  @Test
+  public void testParamsInvalid1() throws Exception {
+    try {
+      // two mains
+      ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
+      ComplexZipConverterParams params = new ComplexZipConverterParams();
+      params.zipFile(new ZipFile("testFiles/complex_model.zip"));
+      params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
+      params.entry(new ModelZipEntryFile("s1.xml", "s1", true, false, SubmodelType.DOWNSTREAM_TARGETS));
+      params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
+      params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
+      params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
+      try {
+        converter.createModel(params);
+        fail("Exception expected");
+      } catch (InvalidArgumentException e) {
+
+      }
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+
+  }
+
+  @Test
+  public void testParamsInvalid2() throws Exception {
+    try {
+      // zero mains
+      ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
+      ComplexZipConverterParams params = new ComplexZipConverterParams();
+      params.zipFile(new ZipFile("testFiles/complex_model.zip"));
+      params.entry(new ModelZipEntryFile("main.xml", "main", false, false, null));
+      params.entry(new ModelZipEntryFile("s1.xml", "s1", false, false, SubmodelType.DOWNSTREAM_TARGETS));
+      params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
+      params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
+      params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
+      try {
+        converter.createModel(params);
+        fail("Exception expected");
+      } catch (InvalidArgumentException e) {
+
+      }
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+
+  }
+
+  @Test
+  public void testParamsInvalid3() throws Exception {
+    try {
+      // two mappings
+      ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
+      ComplexZipConverterParams params = new ComplexZipConverterParams();
+      params.zipFile(new ZipFile("testFiles/complex_model.zip"));
+      params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
+      params.entry(new ModelZipEntryFile("s1.xml", "s1", false, true, SubmodelType.DOWNSTREAM_TARGETS));
+      params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
+      params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
+      params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
+      try {
+        converter.createModel(params);
+        fail("Exception expected");
+      } catch (InvalidArgumentException e) {
+
+      }
+
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+
+  }
+
+  @Test
+  public void testParamsMissingMapping() throws Exception {
+    try {
+      // zero mappings (should be ok)
+      ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
+      ComplexZipConverterParams params = new ComplexZipConverterParams();
+      params.zipFile(new ZipFile("testFiles/complex_model.zip"));
+      params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
+      params.entry(new ModelZipEntryFile("s1.xml", "s1", false, false, SubmodelType.DOWNSTREAM_TARGETS));
+      params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
+      params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
+      params.entry(new ModelZipEntryFile("mapping.xml", "", false, false, null));
+      Model model = converter.createModel(params);
+
+      assertNotNull(model);
+
+      assertEquals(4, model.getSubmodelConnections().size());
+
+      for (ModelSubmodelConnection submodel : model.getSubmodelConnections()) {
+        if (submodel.getName().equals("s1")) {
+          assertEquals(SubmodelType.DOWNSTREAM_TARGETS, submodel.getType());
+        } else if (submodel.getName().equals("s2")) {
+          assertEquals(SubmodelType.PATHWAY, submodel.getType());
+        } else if (submodel.getName().equals("s3")) {
+          assertEquals(SubmodelType.UNKNOWN, submodel.getType());
+        } else if (submodel.getName().equals("mapping")) {
+          assertEquals(SubmodelType.UNKNOWN, submodel.getType());
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+
+  }
+
+  @Test
+  public void testTooManyParams() throws Exception {
+    try {
+      // zero mappings (should be ok)
+      ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
+      ComplexZipConverterParams params = new ComplexZipConverterParams();
+      params.zipFile(new ZipFile("testFiles/complex_model.zip"));
+      params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
+      params.entry(new ModelZipEntryFile("s1.xml", "s1", false, false, SubmodelType.DOWNSTREAM_TARGETS));
+      params.entry(new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.PATHWAY));
+      params.entry(new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN));
+      params.entry(new ModelZipEntryFile("mapping.xml", "", false, false, null));
+      params.entry(new ModelZipEntryFile("blabla.xml", "s3", false, false, SubmodelType.UNKNOWN));
+      try {
+        converter.createModel(params);
+        fail("Exception expected");
+      } catch (InvalidArgumentException e) {
+
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
+  @Test
+  public void testInvalidMappingFile() throws Exception {
+    try {
+      // zero mappings (should be ok)
+      ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
+      ComplexZipConverterParams params = new ComplexZipConverterParams();
+      params.zipFile(new ZipFile("testFiles/invalid_mapping.zip"));
+      params.entry(new ModelZipEntryFile("main.xml", "main", true, false, null));
+      params.entry(new ModelZipEntryFile("mapping.xml", null, false, true, null));
+      try {
+        converter.createModel(params);
+        fail("Exception expected");
+      } catch (InvalidArgumentException e) {
+
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
+  @Test
+  public void testIsIgnoredFileForMac() throws Exception {
+    try {
+      ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
+      assertTrue(converter.isIgnoredFile("__MACOSX/.desc"));
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
+  @Test
+  public void testIsIgnoredFileForOldMacEntries() throws Exception {
+    try {
+      ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
+      assertTrue(converter.isIgnoredFile(".DS_Store/.desc"));
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
+  @Test
+  public void testIsIgnoredFileForValidFiles() throws Exception {
+    try {
+      ComplexZipConverter converter = new ComplexZipConverter(MockConverter.class);
+      assertFalse(converter.isIgnoredFile("mapping.xml"));
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
 
 }
-- 
GitLab