diff --git a/converter/src/main/java/lcsb/mapviewer/converter/ComplexZipConverterParams.java b/converter/src/main/java/lcsb/mapviewer/converter/ComplexZipConverterParams.java index 78946c93d35c5bb5e8d461219429fadf45dd4368..4d059ffe90bbe4644f6e1c1c52249ae2b6a4f905 100644 --- a/converter/src/main/java/lcsb/mapviewer/converter/ComplexZipConverterParams.java +++ b/converter/src/main/java/lcsb/mapviewer/converter/ComplexZipConverterParams.java @@ -1,14 +1,19 @@ package lcsb.mapviewer.converter; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.zip.ZipFile; +import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import lcsb.mapviewer.converter.zip.ZipEntryFile; +import lcsb.mapviewer.model.cache.UploadedFileEntry; /** * Class that contains information about input data used for creation of the @@ -52,6 +57,12 @@ public class ComplexZipConverterParams { return this; } + public ComplexZipConverterParams zipFile(UploadedFileEntry file) throws IOException { + File temp = File.createTempFile("model", ".xml"); + IOUtils.copy(new ByteArrayInputStream(file.getFileContent()), new FileOutputStream(temp)); + return zipFile(temp.getAbsolutePath()); + } + /** * Sets {@link #zipFile}. * diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java index 325645b14f40c7e8f4e17aa9a9b48f9d1c1bcbc2..e13408a974fc63ff5a03a97e5969f9f2f68903da 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java @@ -372,7 +372,7 @@ public class ProjectRestImpl extends BaseRestImpl { params.notifyEmail(getFirstValue(data.get("notify-email"))); params.projectDir(directory); params.projectDisease(getFirstValue(data.get("disease"))); - params.projectFile(new ByteArrayInputStream(file.getFileContent())); + params.projectFile(file); params.projectId(projectId); params.projectName(getFirstValue(data.get("name"))); params.projectOrganism(getFirstValue(data.get("organism"))); diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java index 013ec3131eefab498b9e142983794da2ca2ed140..d73022892d9183f7742b3ca389118c38be6caff3 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java @@ -1,9 +1,9 @@ package lcsb.mapviewer.services.impl; +import java.io.ByteArrayInputStream; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -18,8 +18,6 @@ import java.util.concurrent.CountDownLatch; import javax.mail.MessagingException; import org.apache.commons.io.FileUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org.hibernate.HibernateException; import org.primefaces.model.DefaultTreeNode; @@ -54,7 +52,6 @@ import lcsb.mapviewer.converter.graphics.DrawingException; import lcsb.mapviewer.converter.graphics.MapGenerator; import lcsb.mapviewer.converter.graphics.MapGenerator.MapGeneratorParams; import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser; -import lcsb.mapviewer.converter.model.sbgnml.SbgnmlXmlConverter; import lcsb.mapviewer.converter.zip.ZipEntryFile; import lcsb.mapviewer.model.Project; import lcsb.mapviewer.model.ProjectStatus; @@ -557,22 +554,16 @@ public class ProjectService implements IProjectService { throw new InvalidInputDataExecption(e); } } else { - IConverter parser; - if (params.getParser() != null) { - parser = params.getParser(); - } else if (params.getProjectFile().endsWith("sbgn")) { - parser = new SbgnmlXmlConverter(); - } else { - parser = new CellDesignerXmlParser(); - } - try { - Model model = parser.createModel(new ConverterParams().filename(params.getProjectFile()) - .sizeAutoAdjust(params.isAutoResize()).sbgnFormat(params.isSbgnFormat())); - model.setName(params.getProjectName()); - project.addModel(model); - } catch (FileNotFoundException ex) { - throw new InvalidInputDataExecption(ex); + IConverter parser = params.getParser(); + if (parser == null) { + throw new InvalidArgumentException("Parser is undefined"); } + InputStream input = new ByteArrayInputStream(params.getProjectFile().getFileContent()); + Model model = parser + .createModel(new ConverterParams().inputStream(input, params.getProjectFile().getOriginalFileName()) + .sizeAutoAdjust(params.isAutoResize()).sbgnFormat(params.isSbgnFormat())); + model.setName(params.getProjectName()); + project.addModel(model); } Model topModel = project.getModels().iterator().next().getModel(); topModel.setZoomLevels(generator.computeZoomLevels(topModel)); @@ -736,16 +727,8 @@ public class ProjectService implements IProjectService { outOfMemoryBuffer[i] = Math.random() * OUT_OF_MEMORY_BACKUP_BUFFER_SIZE; } - File inputFile = new File(params.getProjectFile()); - if (inputFile.exists()) { - UploadedFileEntry file = new UploadedFileEntry(); - file.setFileContent(IOUtils.toByteArray(new FileInputStream(inputFile))); - file.setOriginalFileName(FilenameUtils.getName(params.getProjectFile())); - file.setLength(file.getFileContent().length); - User owner = userService.getUserByToken(params.getAuthenticationToken()); - file.setOwner(owner); - project.setInputData(file); - } + UploadedFileEntry file = params.getProjectFile(); + project.setInputData(file); createModel(params, project); Model originalModel = project.getModels().iterator().next().getModel(); diff --git a/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java b/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java index 569c725ca466034a3f075446f23ada949c6a2ef9..01c52b7743c3aee3f6d6e2dd6a5469f4eb1fd2fa 100644 --- a/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java +++ b/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java @@ -1,9 +1,6 @@ package lcsb.mapviewer.services.utils; -import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -13,11 +10,11 @@ import java.util.Map; import java.util.Queue; import java.util.Set; -import org.apache.commons.io.IOUtils; import org.primefaces.model.TreeNode; import lcsb.mapviewer.converter.IConverter; import lcsb.mapviewer.converter.zip.ZipEntryFile; +import lcsb.mapviewer.model.cache.UploadedFileEntry; import lcsb.mapviewer.model.graphics.MapCanvasType; import lcsb.mapviewer.model.map.BioEntity; import lcsb.mapviewer.model.map.MiriamType; @@ -55,7 +52,7 @@ public class CreateProjectParams { /** * Path to a file used as a model. */ - private String projectFile; + private UploadedFileEntry projectFile; private IConverter parser; @@ -191,17 +188,6 @@ public class CreateProjectParams { return this; } - /** - * @param projectFile - * the projectFile to set - * @return object with all parameters - * @see #projectFile - */ - public CreateProjectParams projectFile(String projectFile) { - this.projectFile = projectFile; - return this; - } - /** * @param autoResize * the autoResize to set @@ -220,28 +206,14 @@ public class CreateProjectParams { /** * Sets input stream from which projects should be generated. * - * @param is - * inputstream with the data of the project to be generated + * @param fileEntry + * uploaded file that should be used to create a project * @return object with all parameters * @throws IOException * thrown if there are some problem with the stream */ - public CreateProjectParams projectFile(InputStream is) throws IOException { - File temp = File.createTempFile("model", ".xml"); - IOUtils.copy(is, new FileOutputStream(temp)); - this.projectFile = temp.getAbsolutePath(); - return this; - } - - /** - * Sets file from which projects should be generated. - * - * @param file - * file with the data of the project to be generated - * @return object with all parameters - */ - public CreateProjectParams projectFile(File file) { - this.projectFile = file.getAbsolutePath(); + public CreateProjectParams projectFile(UploadedFileEntry fileEntry) throws IOException { + this.projectFile = fileEntry; return this; } @@ -379,7 +351,7 @@ public class CreateProjectParams { * @return the projectFile * @see #projectFile */ - public String getProjectFile() { + public UploadedFileEntry getProjectFile() { return projectFile; } diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java index 0a58875c94372072436b680d85def08a31f349b9..136ab291acb93a5d0d2e6c65f902d9d1a2a17802 100644 --- a/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java +++ b/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java @@ -7,6 +7,8 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.util.Enumeration; import java.util.HashSet; @@ -18,6 +20,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.apache.log4j.Logger; +import org.apache.poi.util.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -35,6 +38,7 @@ import lcsb.mapviewer.converter.zip.ZipEntryFile; import lcsb.mapviewer.converter.zip.ZipEntryFileFactory; import lcsb.mapviewer.model.Project; import lcsb.mapviewer.model.ProjectStatus; +import lcsb.mapviewer.model.cache.UploadedFileEntry; import lcsb.mapviewer.model.map.BioEntity; import lcsb.mapviewer.model.map.MiriamType; import lcsb.mapviewer.model.map.OverviewImage; @@ -134,11 +138,9 @@ public class ProjectServiceTest extends ServiceTestFunctions { @Test public void testUpdater() throws Exception { try { - String project_id = "test_id"; - projectService.createProject(new CreateProjectParams().authenticationToken(adminToken).projectId(project_id) - .version("").projectFile("testFiles/centeredAnchorInModifier.xml").annotations(true).images(true).async(false) - .projectDir(tmpResultDir).analyzeAnnotations(true)); - Project project = projectService.getProjectByProjectId(project_id, adminToken); + projectService.createProject(createProjectParams("testFiles/centeredAnchorInModifier.xml").analyzeAnnotations(true)); + Project project = projectService.getProjectByProjectId(projectId, adminToken); + assertNotNull(project); assertEquals(ProjectStatus.DONE, project.getStatus()); projectService.removeProject(project, null, false, adminToken); } catch (Exception e) { @@ -149,18 +151,20 @@ public class ProjectServiceTest extends ServiceTestFunctions { @Test public void testCreateComplex() throws Exception { - String projectId = "test_id"; try { ZipEntryFile entry1 = new ModelZipEntryFile("main.xml", "main", true, false, SubmodelType.UNKNOWN); ZipEntryFile entry2 = new ModelZipEntryFile("s1.xml", "s1", false, false, SubmodelType.UNKNOWN); ZipEntryFile entry3 = new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.UNKNOWN); ZipEntryFile entry4 = new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN); ZipEntryFile entry5 = new ModelZipEntryFile("mapping.xml", "mapping", false, true, SubmodelType.UNKNOWN); - projectService.createProject(new CreateProjectParams().authenticationToken(adminToken).projectId(projectId) - .version("").complex(true).projectFile("testFiles/complexModel/complex_model.zip").addZipEntry(entry1) - .addZipEntry(entry2).addZipEntry(entry3).addZipEntry(entry4).addZipEntry(entry5).annotations(true) - .semanticZoomContainsMultipleLayouts(true).images(true).async(false).projectDir(tmpResultDir) - .analyzeAnnotations(true)); + projectService.createProject(createProjectParams("testFiles/complexModel/complex_model.zip"). + addZipEntry(entry1). + addZipEntry(entry2). + addZipEntry(entry3). + addZipEntry(entry4). + addZipEntry(entry5). + semanticZoomContainsMultipleLayouts(true). + images(true)); Project project = projectService.getProjectByProjectId(projectId, adminToken); Model model = modelService.getLastModelByProjectId(projectId, adminToken); @@ -257,7 +261,7 @@ public class ProjectServiceTest extends ServiceTestFunctions { layout.addDataOverlayImageLayer(new DataOverlayImageLayer(model, path + "/nested")); project.addLayout(layout); - CreateProjectParams params = new CreateProjectParams().images(true).projectDir(tmpResultDir); + CreateProjectParams params = createProjectParams("testFiles/sample.xml").images(true).projectDir(tmpResultDir); ProjectService pService = new ProjectService(); pService.setProjectDao(Mockito.mock(ProjectDao.class)); @@ -301,7 +305,7 @@ public class ProjectServiceTest extends ServiceTestFunctions { model.addSubmodelConnection(new ModelSubmodelConnection(model2, SubmodelType.UNKNOWN, "name")); - CreateProjectParams params = new CreateProjectParams().images(true).projectDir(tmpResultDir); + CreateProjectParams params = createProjectParams("testFiles/sample.xml").images(true).projectDir(tmpResultDir); ProjectService pService = new ProjectService(); pService.setProjectDao(Mockito.mock(ProjectDao.class)); @@ -332,14 +336,16 @@ public class ProjectServiceTest extends ServiceTestFunctions { ZipEntryFile entry4 = new ModelZipEntryFile("s3.xml", "s3", false, false, SubmodelType.UNKNOWN); ZipEntryFile entry5 = new ModelZipEntryFile("mapping.xml", "mapping", false, true, SubmodelType.UNKNOWN); - CreateProjectParams params = new CreateProjectParams().projectId(projectId).version("").complex(true) - .projectFile("testFiles/complexModel/complex_model_with_compartment.zip").addZipEntry(entry1) - .addZipEntry(entry2).addZipEntry(entry3).addZipEntry(entry4).addZipEntry(entry5).annotations(false) - .images(false).async(false).projectDir(tmpResultDir).analyzeAnnotations(false); + CreateProjectParams params = createProjectParams("testFiles/complexModel/complex_model_with_compartment.zip"). + addZipEntry(entry1). + addZipEntry(entry2). + addZipEntry(entry3). + addZipEntry(entry4). + addZipEntry(entry5). + analyzeAnnotations(false); ComplexZipConverter parser = new ComplexZipConverter(CellDesignerXmlParser.class); - ComplexZipConverterParams complexParams; - complexParams = new ComplexZipConverterParams().zipFile(params.getProjectFile()); + ComplexZipConverterParams complexParams = new ComplexZipConverterParams().zipFile(params.getProjectFile()); for (ZipEntryFile entry : params.getZipEntries()) { complexParams.entry(entry); } @@ -558,7 +564,7 @@ public class ProjectServiceTest extends ServiceTestFunctions { } protected Project createComplexProject(String projectId, String filename) throws IOException, SecurityException { - CreateProjectParams params = new CreateProjectParams(); + CreateProjectParams params = createProjectParams(filename); ZipFile zipFile = new ZipFile(filename); Enumeration<? extends ZipEntry> entries = zipFile.entries(); @@ -569,9 +575,7 @@ public class ProjectServiceTest extends ServiceTestFunctions { } zipFile.close(); - projectService.createProject(params.authenticationToken(adminToken).projectId(projectId).version("").complex(true) - .projectFile(filename).annotations(true).images(false).async(false).projectDir(tmpResultDir) - .analyzeAnnotations(true)); + projectService.createProject(params); Project project = projectService.getProjectByProjectId(projectId, adminToken); return project; } @@ -601,7 +605,7 @@ public class ProjectServiceTest extends ServiceTestFunctions { public void testCreateComplexWithLayoutOrder() throws Exception { try { String filename = "testFiles/complexModel/complex_model_with_images.zip"; - CreateProjectParams params = new CreateProjectParams(); + CreateProjectParams params = createProjectParams(filename); ZipFile zipFile = new ZipFile(filename); Enumeration<? extends ZipEntry> entries = zipFile.entries(); @@ -611,9 +615,7 @@ public class ProjectServiceTest extends ServiceTestFunctions { } zipFile.close(); - projectService.createProject(params.authenticationToken(adminToken).projectId(projectId).version("").complex(true) - .projectFile(filename).annotations(true).images(false).async(false).networkLayoutAsDefault(true) - .projectDir(tmpResultDir).analyzeAnnotations(true)); + projectService.createProject(params.networkLayoutAsDefault(true)); Project project = projectService.getProjectByProjectId(projectId, adminToken); Model model = modelService.getLastModelByProjectId(projectId, adminToken); @@ -638,6 +640,19 @@ public class ProjectServiceTest extends ServiceTestFunctions { } } + private CreateProjectParams createProjectParams(String filename) throws FileNotFoundException, IOException { + logger.debug(filename); + UploadedFileEntry fileEntry = new UploadedFileEntry(); + fileEntry.setLocalPath(filename); + byte[] data = IOUtils.toByteArray(new FileInputStream(filename)); + fileEntry.setLength(data.length); + fileEntry.setFileContent(data); + + return new CreateProjectParams().authenticationToken(adminToken).projectId(projectId).version("").complex(filename.endsWith("zip")) + .projectFile(fileEntry).annotations(true).images(false).async(false).projectDir(tmpResultDir) + .analyzeAnnotations(true).parser(new CellDesignerXmlParser()); + } + @Test(timeout = 15000) public void testCreateComplexWithLayouts() throws Exception { try {