From cbe45073d26f8cd6f064e17aa52b217b535435ed Mon Sep 17 00:00:00 2001
From: Mirco Nasuti <mirco.nasuti@chuv.ch>
Date: Wed, 3 Feb 2016 11:07:02 +0100
Subject: [PATCH] add copy Model

---
 README.md                                     |   1 -
 .../org/hbp/mip/controllers/ModelsApi.java    | 131 +++++++++++-------
 2 files changed, 84 insertions(+), 48 deletions(-)

diff --git a/README.md b/README.md
index b2a40b34b..b439ebacb 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,6 @@ The API documentation is available at `<BASE URL>/swagger-ui.html`. A JSON versi
 
 ## BUGS
 
-* Copy a model;
 * When updating an article from the 'recent articles' list, bug with 'publish' state;
 * When updating a model the SVG is not updated (SVG updates when opening article editor);
 * Dynamic stats (users, articles, ...);
diff --git a/src/main/java/org/hbp/mip/controllers/ModelsApi.java b/src/main/java/org/hbp/mip/controllers/ModelsApi.java
index 38c6cf100..e03651309 100644
--- a/src/main/java/org/hbp/mip/controllers/ModelsApi.java
+++ b/src/main/java/org/hbp/mip/controllers/ModelsApi.java
@@ -21,6 +21,7 @@ import java.security.Principal;
 import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Random;
 
 import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
 
@@ -144,59 +145,57 @@ public class ModelsApi {
         Model model = (Model) query.uniqueResult();
         session.getTransaction().commit();
 
-        session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        query = session.createQuery("from Query where id= :id");
-        query.setLong("id", model.getQuery().getId());
-        org.hbp.mip.model.Query q = (org.hbp.mip.model.Query) query.uniqueResult();
-        session.getTransaction().commit();
-
-        List<Variable> vars = new LinkedList<>();
-        for(Variable var : q.getVariables())
-        {
-            Variable v = new Variable();
-            v.setCode(var.getCode());
-            vars.add(v);
-        }
+        if(model != null) {
+            session = HibernateUtil.getSessionFactory().getCurrentSession();
+            session.beginTransaction();
+            query = session.createQuery("from Query where id= :id");
+            query.setLong("id", model.getQuery().getId());
+            org.hbp.mip.model.Query q = (org.hbp.mip.model.Query) query.uniqueResult();
+            session.getTransaction().commit();
+
+            List<Variable> vars = new LinkedList<>();
+            for (Variable var : q.getVariables()) {
+                Variable v = new Variable();
+                v.setCode(var.getCode());
+                vars.add(v);
+            }
 
-        List<Variable> covs = new LinkedList<>();
-        for(Variable cov : q.getCovariables())
-        {
-            Variable v = new Variable();
-            v.setCode(cov.getCode());
-            covs.add(v);
-        }
+            List<Variable> covs = new LinkedList<>();
+            for (Variable cov : q.getCovariables()) {
+                Variable v = new Variable();
+                v.setCode(cov.getCode());
+                covs.add(v);
+            }
 
-        List<Variable> grps = new LinkedList<>();
-        for(Variable grp : q.getGrouping())
-        {
-            Variable v = new Variable();
-            v.setCode(grp.getCode());
-            grps.add(v);
-        }
+            List<Variable> grps = new LinkedList<>();
+            for (Variable grp : q.getGrouping()) {
+                Variable v = new Variable();
+                v.setCode(grp.getCode());
+                grps.add(v);
+            }
 
-        List<Filter> fltrs = new LinkedList<>();
-        for(Filter fltr : q.getFilters())
-        {
-            Filter f = new Filter();
-            f.setId(fltr.getId());
-            f.setOperator(fltr.getOperator());
-            f.setValues(fltr.getValues());
-            f.setVariable(fltr.getVariable());
-            fltrs.add(f);
-        }
+            List<Filter> fltrs = new LinkedList<>();
+            for (Filter fltr : q.getFilters()) {
+                Filter f = new Filter();
+                f.setId(fltr.getId());
+                f.setOperator(fltr.getOperator());
+                f.setValues(fltr.getValues());
+                f.setVariable(fltr.getVariable());
+                fltrs.add(f);
+            }
 
-        org.hbp.mip.model.Query myQuery = new org.hbp.mip.model.Query();
-        myQuery.setId(q.getId());
-        myQuery.setVariables(vars);
-        myQuery.setCovariables(covs);
-        myQuery.setGrouping(grps);
-        myQuery.setFilters(fltrs);
+            org.hbp.mip.model.Query myQuery = new org.hbp.mip.model.Query();
+            myQuery.setId(q.getId());
+            myQuery.setVariables(vars);
+            myQuery.setCovariables(covs);
+            myQuery.setGrouping(grps);
+            myQuery.setFilters(fltrs);
 
-        model.setQuery(myQuery);
+            model.setQuery(myQuery);
 
-        Dataset ds = CSVUtil.parseValues(DATA_FILE, model.getQuery());
-        model.setDataset(ds);
+            Dataset ds = CSVUtil.parseValues(DATA_FILE, model.getQuery());
+            model.setDataset(ds);
+        }
 
         return new ResponseEntity<Model>(HttpStatus.OK).ok(model);
     }
@@ -223,6 +222,44 @@ public class ModelsApi {
         return new ResponseEntity<Void>(HttpStatus.OK);
     }
 
+    @ApiOperation(value = "Copy a model", response = Model.class)
+    @ApiResponses(value = { @ApiResponse(code = 200, message = "Model copied"), @ApiResponse(code = 404, message = "Not found") })
+    @RequestMapping(value = "/{slug}/copies", method = RequestMethod.POST)
+    public ResponseEntity<Model> copyAModel(
+            @ApiParam(value = "slug", required = true) @PathVariable("slug") String slug,
+            @RequestBody @ApiParam(value = "Model to update", required = true) Model model,
+            Principal principal
+    ) throws NotFoundException {
+        // Get current user
+        User user = MIPApplication.getUser(principal);
+
+        // Set slug
+        String originalSlug = model.getSlug();
+        String copySlug;
+        do {
+            copySlug = originalSlug+" copy_"+randomStr(20);
+        } while (getAModel(copySlug) == null);
+        model.setSlug(copySlug);
+
+        // Save model into DB
+        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+        session.beginTransaction();
+        session.save(model);
+        session.getTransaction().commit();
+
+        return new ResponseEntity<Model>(HttpStatus.OK).ok(model);
+    }
+
+    private String randomStr(int length) {
+        char[] chars = "abcdefghijklmnopqrstuvwxyz0123456789".toCharArray();
+        StringBuilder sb = new StringBuilder();
+        Random random = new Random();
+        for (int i = 0; i < length; i++) {
+            char c = chars[random.nextInt(chars.length)];
+            sb.append(c);
+        }
+        return sb.toString();
+    }
 
     @ApiOperation(value = "Delete a model", response = Void.class)
     @ApiResponses(value = { @ApiResponse(code = 200, message = "Model deleted") })
-- 
GitLab