From 8e33399aa7c96e343642b3a474b7bdd2d60cce08 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Tue, 8 Aug 2017 13:50:22 +0200
Subject: [PATCH] info about models is returned when accessing models (not a
 project)

---
 .../java/lcsb/mapviewer/api/BaseRestImpl.java | 22 ++++++-
 .../api/projects/ProjectMetaData.java         | 39 -------------
 .../api/projects/ProjectRestImpl.java         | 11 +---
 .../api/projects/models/ModelController.java  | 40 +++++++++++++
 .../projects/{ => models}/ModelMetaData.java  |  2 +-
 .../api/projects/models/ModelRestImpl.java    | 58 +++++++++++++++++++
 .../publications/PublicationsRestImpl.java    |  3 +-
 .../api/projects/ModelMetaDataTest.java       |  2 +-
 8 files changed, 126 insertions(+), 51 deletions(-)
 create mode 100644 rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelController.java
 rename rest-api/src/main/java/lcsb/mapviewer/api/projects/{ => models}/ModelMetaData.java (94%)
 create mode 100644 rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java

diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java
index 56071ddde9..ac78d8b8d3 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java
@@ -26,6 +26,7 @@ import lcsb.mapviewer.model.map.reaction.Reaction;
 import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.services.SecurityException;
 import lcsb.mapviewer.services.interfaces.IModelService;
+import lcsb.mapviewer.services.interfaces.IProjectService;
 import lcsb.mapviewer.services.interfaces.IUserService;
 import lcsb.mapviewer.services.search.ElementMatcher;
 import lcsb.mapviewer.services.search.data.ElementIdentifier.ElementIdentifierType;
@@ -33,7 +34,7 @@ import lcsb.mapviewer.services.view.AnnotationView;
 
 @Transactional(value = "txManager")
 public abstract class BaseRestImpl {
-	
+
 	/**
 	 * Default class logger.
 	 */
@@ -42,6 +43,9 @@ public abstract class BaseRestImpl {
 	@Autowired
 	private IModelService		modelService;
 
+	@Autowired
+	private IProjectService	projectService;
+
 	@Autowired
 	private IUserService		userService;
 
@@ -262,4 +266,20 @@ public abstract class BaseRestImpl {
 		}
 	}
 
+	/**
+	 * @return the projectService
+	 * @see #projectService
+	 */
+	public IProjectService getProjectService() {
+		return projectService;
+	}
+
+	/**
+	 * @param projectService the projectService to set
+	 * @see #projectService
+	 */
+	public void setProjectService(IProjectService projectService) {
+		this.projectService = projectService;
+	}
+
 }
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectMetaData.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectMetaData.java
index 8b4e0560e0..58365826a5 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectMetaData.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectMetaData.java
@@ -47,10 +47,6 @@ public class ProjectMetaData implements Serializable {
 	 */
 	private String									description;
 
-	private ModelMetaData						map;
-
-	private Integer									publicationCount;
-
 	/**
 	 * List of overview images attached to this model.
 	 */
@@ -169,23 +165,6 @@ public class ProjectMetaData implements Serializable {
 		this.projectId = projectId;
 	}
 
-	/**
-	 * @return the map
-	 * @see #map
-	 */
-	public ModelMetaData getMap() {
-		return map;
-	}
-
-	/**
-	 * @param map
-	 *          the map to set
-	 * @see #map
-	 */
-	public void setMap(ModelMetaData map) {
-		this.map = map;
-	}
-
 	/**
 	 * @return the idObject
 	 * @see #idObject
@@ -236,22 +215,4 @@ public class ProjectMetaData implements Serializable {
 	public void setOrganism(Map<String, Object> organism) {
 		this.organism = organism;
 	}
-
-	/**
-	 * @return the publicationCount
-	 * @see #publicationCount
-	 */
-	public Integer getPublicationCount() {
-		return publicationCount;
-	}
-
-	/**
-	 * @param publicationCount
-	 *          the publicationCount to set
-	 * @see #publicationCount
-	 */
-	public void setPublicationCount(Integer publicationCount) {
-		this.publicationCount = publicationCount;
-	}
-
 }
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 a64ef7f781..6f4f9a1d17 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
@@ -129,7 +129,7 @@ public class ProjectRestImpl extends BaseRestImpl {
 			result.setVersion(model.getMapVersion());
 			result.setDescription(model.getNotes());
 
-			Set<OverviewImage> set = new HashSet<OverviewImage>();
+			Set<OverviewImage> set = new HashSet<>();
 			set.addAll(model.getOverviewImages());
 			for (OverviewImage image : model.getOverviewImages()) {
 				for (OverviewLink ol : image.getLinks()) {
@@ -144,13 +144,6 @@ public class ProjectRestImpl extends BaseRestImpl {
 				logger.warn("Cannot determine top level image. Taking first one. " + model.getOverviewImages().get(0).getFilename());
 				result.setTopOverviewImage(factory.create(model.getOverviewImages().get(0)));
 			}
-			result.setMap(new ModelMetaData(model));
-
-			List<Model> models = new ArrayList<>();
-			models.add(model);
-			models.addAll(model.getSubmodels());
-			result.setPublicationCount(publicationsRestImpl.getPublications(models).size());
-
 		}
 
 		return result;
@@ -434,6 +427,8 @@ public class ProjectRestImpl extends BaseRestImpl {
 		}
 
 		result.put("reactionAnnotations", reactionAnnotations);
+		
+		result.put("publications", publicationsRestImpl.getPublications(models).size());
 
 		return result;
 	}
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelController.java
new file mode 100644
index 0000000000..26d0fb353b
--- /dev/null
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelController.java
@@ -0,0 +1,40 @@
+package lcsb.mapviewer.api.projects.models;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.CookieValue;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import lcsb.mapviewer.api.BaseController;
+import lcsb.mapviewer.api.ObjectNotFoundException;
+import lcsb.mapviewer.common.Configuration;
+import lcsb.mapviewer.services.SecurityException;
+
+@RestController
+public class ModelController extends BaseController {
+	@Autowired
+	private ModelRestImpl modelController;
+
+	@RequestMapping(value = "/projects/{projectId:.+}/models/", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE })
+	public List<ModelMetaData> getModels(//
+			@PathVariable(value = "projectId") String projectId, //
+			@CookieValue(value = Configuration.AUTH_TOKEN) String token //
+	) throws SecurityException, ObjectNotFoundException {
+		return modelController.getModels(projectId, token);
+	}
+
+	@RequestMapping(value = "/projects/{projectId:.+}/models/{modelId:.+}", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE })
+	public ModelMetaData getModel(//
+			@PathVariable(value = "modelId") String modelId, //
+			@PathVariable(value = "projectId") String projectId, //
+			@CookieValue(value = Configuration.AUTH_TOKEN) String token //
+	) throws SecurityException, ObjectNotFoundException {
+		return modelController.getModel(projectId, modelId, token);
+	}
+
+}
\ No newline at end of file
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ModelMetaData.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelMetaData.java
similarity index 94%
rename from rest-api/src/main/java/lcsb/mapviewer/api/projects/ModelMetaData.java
rename to rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelMetaData.java
index 273364a57e..62181d0b37 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ModelMetaData.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelMetaData.java
@@ -1,4 +1,4 @@
-package lcsb.mapviewer.api.projects;
+package lcsb.mapviewer.api.projects.models;
 
 import java.awt.geom.Point2D;
 import java.io.Serializable;
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java
new file mode 100644
index 0000000000..e2a747e997
--- /dev/null
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java
@@ -0,0 +1,58 @@
+package lcsb.mapviewer.api.projects.models;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.springframework.transaction.annotation.Transactional;
+
+import lcsb.mapviewer.api.BaseRestImpl;
+import lcsb.mapviewer.api.ObjectNotFoundException;
+import lcsb.mapviewer.model.Project;
+import lcsb.mapviewer.model.map.model.Model;
+import lcsb.mapviewer.services.SecurityException;
+import lcsb.mapviewer.services.view.AuthenticationToken;
+
+@Transactional(value = "txManager")
+public class ModelRestImpl extends BaseRestImpl {
+
+	/**
+	 * Default class logger.
+	 */
+	@SuppressWarnings("unused")
+	private Logger logger = Logger.getLogger(ModelRestImpl.class);
+
+	public List<ModelMetaData> getModels(String projectId, String token) throws SecurityException, ObjectNotFoundException {
+		AuthenticationToken authenticationToken = getUserService().getToken(token);
+		Project project = getProjectService().getProjectByProjectId(projectId, authenticationToken);
+		if (project == null) {
+			throw new ObjectNotFoundException("Project with given id doesn't exist");
+		}
+		List<ModelMetaData> result = createData(project, authenticationToken);
+		return result;
+	}
+
+	public ModelMetaData getModel(String projectId, String modelId, String token) throws SecurityException, ObjectNotFoundException {
+		AuthenticationToken authenticationToken = getUserService().getToken(token);
+		Model model = getModelService().getLastModelByProjectId(projectId, authenticationToken);
+		Model submodel = model.getSubmodelById(modelId);
+		if (submodel == null) {
+			return null;
+		} else {
+			return new ModelMetaData(submodel);
+		}
+	}
+
+	private List<ModelMetaData> createData(Project project, AuthenticationToken token) {
+		List<ModelMetaData> result = new ArrayList<>();
+		Model model = getModelService().getLastModelByProjectId(project.getProjectId(), token);
+
+		List<Model> models = new ArrayList<>();
+		models.add(model);
+		models.addAll(model.getSubmodels());
+		for (Model model2 : models) {
+			result.add(new ModelMetaData(model2));
+		}
+		return result;
+	}
+}
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java
index ace3974815..0d3e034912 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java
@@ -1,6 +1,7 @@
 package lcsb.mapviewer.api.projects.models.publications;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -56,7 +57,7 @@ public class PublicationsRestImpl extends BaseRestImpl {
 	@Autowired
 	private OverviewImageViewFactory factory;
 
-	public SortedMap<MiriamData, List<BioEntity>> getPublications(List<Model> models) {
+	public SortedMap<MiriamData, List<BioEntity>> getPublications(Collection<Model> models) {
 		SortedMap<MiriamData, List<BioEntity>> publications = new TreeMap<>();
 		for (Model modelData : models) {
 			for (Element element : modelData.getElements()) {
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/ModelMetaDataTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/ModelMetaDataTest.java
index 521d3701fe..243de1dad2 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/ModelMetaDataTest.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/ModelMetaDataTest.java
@@ -9,7 +9,7 @@ import org.junit.Test;
 
 import com.google.gson.Gson;
 
-import lcsb.mapviewer.api.projects.ModelMetaData;
+import lcsb.mapviewer.api.projects.models.ModelMetaData;
 import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.model.ModelFullIndexed;
 
-- 
GitLab