# HG changeset patch # User ymh # Date 1363354567 -3600 # Node ID b4b83e9b808d45d3860cc42e83ce0c330177aba2 # Parent 276514e62567a5a7c7e9b87478d6db5ef6dd373e Add copy for projects diff -r 276514e62567 -r b4b83e9b808d server/src/main/java/org/iri_research/renkan/controller/RenkanController.java --- a/server/src/main/java/org/iri_research/renkan/controller/RenkanController.java Fri Mar 15 13:36:48 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/controller/RenkanController.java Fri Mar 15 14:36:07 2013 +0100 @@ -97,6 +97,9 @@ } Project project = this.projectsRepository.findOne(project_id); + if(project == null) { + throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Project " + project_id + " not found."); + } this.checkCowebkey(cowebkey, project, EditMode.READ_ONLY); @@ -106,11 +109,20 @@ return "renkanProjectPublish"; } - /*@RequestMapping("/test") - public ModelAndView projectPrompt() { - String message = "Hello world, Spring"; + @RequestMapping(value="/copy", method = RequestMethod.POST, params="project_id={project_id}", produces={"application/json;charset=UTF-8"}) + public Project copyProject(@RequestParam(value="project_id") String projectId ) { + + if(projectId == null || projectId.length() == 0) { + throw new IllegalArgumentException("RenkanContoller.renkanProject: Project id is null or empty."); + } + Project project = this.projectsRepository.findOne(projectId); + if(project == null) { + throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Project " + projectId + " not found."); + } + + Project newProject = this.projectsRepository.copy(project, project.getTitle() + " (copy)"); - return new ModelAndView("projectPrompt", "message", message); - }*/ + return newProject; + } } diff -r 276514e62567 -r b4b83e9b808d server/src/main/java/org/iri_research/renkan/models/AbstractRenkanModel.java --- a/server/src/main/java/org/iri_research/renkan/models/AbstractRenkanModel.java Fri Mar 15 13:36:48 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/models/AbstractRenkanModel.java Fri Mar 15 14:36:07 2013 +0100 @@ -57,5 +57,5 @@ } this.id = id; } - + } diff -r 276514e62567 -r b4b83e9b808d server/src/main/java/org/iri_research/renkan/models/Edge.java --- a/server/src/main/java/org/iri_research/renkan/models/Edge.java Fri Mar 15 13:36:48 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/models/Edge.java Fri Mar 15 14:36:07 2013 +0100 @@ -1,5 +1,8 @@ package org.iri_research.renkan.models; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @@ -23,8 +26,20 @@ @Field("created_by") @JsonProperty("created_by") private String createdBy; + + @SuppressWarnings("unused") + private Edge() { + } + public Edge(Edge edge, Node from, Node to, String projectId) { + this(UUID.randomUUID().toString(), edge.title, edge.description, edge.uri, edge.color, edge.from, edge.to, edge.createdBy, projectId); + } + public Edge(Edge edge) { + this(edge, edge.from, edge.to, edge.projectId); + } + + @Autowired(required=true) public Edge(String id, String title, String description, String uri, String color, Node from, Node to, String createdBy, String projectId) { super(id,title, description, uri, color); this.from = from; @@ -61,5 +76,5 @@ return null; } } - + } diff -r 276514e62567 -r b4b83e9b808d server/src/main/java/org/iri_research/renkan/models/Node.java --- a/server/src/main/java/org/iri_research/renkan/models/Node.java Fri Mar 15 13:36:48 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/models/Node.java Fri Mar 15 14:36:07 2013 +0100 @@ -1,5 +1,8 @@ package org.iri_research.renkan.models; +import java.util.UUID; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.geo.Point; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @@ -9,7 +12,19 @@ @Document(collection="nodes") public class Node extends AbstractRenkanModel { + public Node(Node node, String projectId) { + this(UUID.randomUUID().toString(), node.title, node.description, node.uri, node.color, node.createdBy, node.position, node.image, node.size, projectId); + } + + public Node(Node node) { + this(node, node.projectId); + } + + @SuppressWarnings("unused") + private Node() { + } + @Autowired(required=true) public Node(String id, String title, String description, String uri, String color, String createdBy, Point position, String image, Integer size, String projectId) { super(id, title, description, uri, color); @@ -56,5 +71,4 @@ return size; } - } diff -r 276514e62567 -r b4b83e9b808d server/src/main/java/org/iri_research/renkan/models/Project.java --- a/server/src/main/java/org/iri_research/renkan/models/Project.java Fri Mar 15 13:36:48 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/models/Project.java Fri Mar 15 14:36:07 2013 +0100 @@ -6,7 +6,10 @@ import java.security.SecureRandom; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.UUID; import org.apache.commons.codec.binary.Hex; import org.iri_research.renkan.Constants; @@ -14,6 +17,7 @@ import org.iri_research.renkan.RenkanException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @@ -49,6 +53,24 @@ private List users = new ArrayList(); + public Project(Project project) { + this(project.spaceId, UUID.randomUUID().toString(), project.title, project.description, project.uri, new Date()); + + Map nodeCloneMap = new HashMap(project.nodes.size()); + for (Node node : project.nodes) { + Node newNode = new Node(node,this.id); + this.nodes.add(newNode); + nodeCloneMap.put(node.id, newNode); + } + + for (Edge edge : project.edges) { + this.edges.add(new Edge(edge, nodeCloneMap.get(edge.getFrom()), nodeCloneMap.get(edge.getTo()), this.id)); + } + for(User user : project.users) { + this.users.add(user); + } + } + public Project(String spaceId, String id, String title, String description, String uri, Date created, int revCounter) { super(id,title, description, uri, null); @@ -60,6 +82,7 @@ } } + @Autowired(required=true) public Project(String spaceId, String id, String title, String description, String uri, Date created) { this(spaceId, id,title, description, uri, created, 1); } @@ -67,7 +90,7 @@ @SuppressWarnings("unused") private Project() { } - + public int getRevCounter() { return this.revCounter; } @@ -170,5 +193,9 @@ return new_key.equals(signature); } + public void setTitle(String title) { + this.title = title; + } + } diff -r 276514e62567 -r b4b83e9b808d server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryCustom.java --- a/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryCustom.java Fri Mar 15 13:36:48 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryCustom.java Fri Mar 15 14:36:07 2013 +0100 @@ -2,10 +2,12 @@ import java.util.Map; +import org.iri_research.renkan.models.Project; + public interface ProjectsRepositoryCustom { public int getRevCounter(String projectId); - public Map getCountBySpace(); + public Project copy(Project p, String newTitle); } diff -r 276514e62567 -r b4b83e9b808d server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryImpl.java --- a/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryImpl.java Fri Mar 15 13:36:48 2013 +0100 +++ b/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryImpl.java Fri Mar 15 14:36:07 2013 +0100 @@ -17,6 +17,16 @@ @Component public class ProjectsRepositoryImpl implements ProjectsRepositoryCustom { + @Autowired + private ProjectsRepository projectsRepository; + + @Autowired + private NodesRepository nodesRepository; + + @Autowired + private EdgesRepository edgesRepository; + + private class GroupResult { public String space_id; public int count; @@ -52,4 +62,15 @@ } + @Override + public Project copy(Project p, String newTitle) { + + Project res = new Project(p); + res.setTitle(newTitle); + this.nodesRepository.save(p.getNodes()); + this.edgesRepository.save(p.getEdges()); + this.projectsRepository.save(p); + return res; + } + }