# HG changeset patch # User ymh # Date 1403703422 -7200 # Node ID 7fcb9d12e1819a5585bca0c6ab9994bd30459700 # Parent eaadfa988db418342ded52d76839efdfc9d18a14 Correct problem with project id and exported/imported project diff -r eaadfa988db4 -r 7fcb9d12e181 .classpath --- a/.classpath Sat Jun 14 13:44:22 2014 +0200 +++ b/.classpath Wed Jun 25 15:37:02 2014 +0200 @@ -205,5 +205,6 @@ + diff -r eaadfa988db4 -r 7fcb9d12e181 server/pom.xml --- a/server/pom.xml Sat Jun 14 13:44:22 2014 +0200 +++ b/server/pom.xml Wed Jun 25 15:37:02 2014 +0200 @@ -42,6 +42,8 @@ 3.1.3 17.0 0.9.1 + 4.0 + 2.4 UTF-8 @@ -427,7 +429,7 @@ javax.validation validation-api ${javax-validation-api-version} - + org.hibernate hibernate-validator @@ -441,7 +443,7 @@ org.apache.commons commons-collections4 - 4.0 + ${commons-collections-version} com.google.guava @@ -454,6 +456,12 @@ ${json-path-version} test + + commons-io + commons-io + ${commons-io-version} + test + IRI diff -r eaadfa988db4 -r 7fcb9d12e181 server/src/main/java/org/iri_research/renkan/controller/RenkanController.java --- a/server/src/main/java/org/iri_research/renkan/controller/RenkanController.java Sat Jun 14 13:44:22 2014 +0200 +++ b/server/src/main/java/org/iri_research/renkan/controller/RenkanController.java Wed Jun 25 15:37:02 2014 +0200 @@ -180,6 +180,7 @@ nodeIds.put(nodeId, atId); nodeNode.put("@id", atId); nodeNode.remove("id"); + nodeNode.remove("project_id"); } Iterator edges = jsonNode.get("edges").elements(); @@ -188,6 +189,7 @@ edgeNode.put("from", nodeIds.get(edgeNode.get("from").asText())); edgeNode.put("to", nodeIds.get(edgeNode.get("to").asText())); edgeNode.remove("id"); + edgeNode.remove("project_id"); } String res = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode); diff -r eaadfa988db4 -r 7fcb9d12e181 server/src/main/java/org/iri_research/renkan/models/Edge.java --- a/server/src/main/java/org/iri_research/renkan/models/Edge.java Sat Jun 14 13:44:22 2014 +0200 +++ b/server/src/main/java/org/iri_research/renkan/models/Edge.java Wed Jun 25 15:37:02 2014 +0200 @@ -62,6 +62,10 @@ public String getProjectId() { return projectId; } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } public String getCreatedBy() { return createdBy; diff -r eaadfa988db4 -r 7fcb9d12e181 server/src/main/java/org/iri_research/renkan/models/Node.java --- a/server/src/main/java/org/iri_research/renkan/models/Node.java Sat Jun 14 13:44:22 2014 +0200 +++ b/server/src/main/java/org/iri_research/renkan/models/Node.java Wed Jun 25 15:37:02 2014 +0200 @@ -69,6 +69,10 @@ public String getProjectId() { return projectId; } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } @JsonProperty("created_by") public String getCreatedBy() { diff -r eaadfa988db4 -r 7fcb9d12e181 server/src/main/java/org/iri_research/renkan/rest/ProjectsResource.java --- a/server/src/main/java/org/iri_research/renkan/rest/ProjectsResource.java Sat Jun 14 13:44:22 2014 +0200 +++ b/server/src/main/java/org/iri_research/renkan/rest/ProjectsResource.java Wed Jun 25 15:37:02 2014 +0200 @@ -7,6 +7,8 @@ import javax.ws.rs.Path; import org.iri_research.renkan.Constants; +import org.iri_research.renkan.models.Edge; +import org.iri_research.renkan.models.Node; import org.iri_research.renkan.models.Project; import org.iri_research.renkan.repositories.EdgesRepository; import org.iri_research.renkan.repositories.IRenkanRepository; @@ -25,7 +27,6 @@ @Component public class ProjectsResource extends RenkanResource { - @SuppressWarnings("unused") private Logger logger = LoggerFactory.getLogger(ProjectsResource.class); @Autowired @@ -51,6 +52,13 @@ obj.setCreated(new DateTime()); } obj.setUpdated(new DateTime()); + + for (Node node : obj.getNodes()) { + node.setProjectId(obj.getId()); + } + for (Edge edge : obj.getEdges()) { + edge.setProjectId(obj.getId()); + } } @Override @@ -66,6 +74,7 @@ @Override protected Project saveObjectPost(Project obj) { + logger.debug("Project Resource : Save object post " + obj.getTitle()); this.nodesRepository.save(obj.getNodes()); this.edgesRepository.save(obj.getEdges()); return super.saveObjectPost(obj); diff -r eaadfa988db4 -r 7fcb9d12e181 server/src/main/webapp/WEB-INF/templates/projectIndex.html --- a/server/src/main/webapp/WEB-INF/templates/projectIndex.html Sat Jun 14 13:44:22 2014 +0200 +++ b/server/src/main/webapp/WEB-INF/templates/projectIndex.html Wed Jun 25 15:37:02 2014 +0200 @@ -135,7 +135,7 @@ }); } else { - fr = new FileReader(); + var fr = new FileReader(); fr.onload = function() { var new_renkan = JSON.parse(fr.result); if(renkantitle.length > 0) { diff -r eaadfa988db4 -r 7fcb9d12e181 server/src/test/java/org/iri_research/renkan/test/controller/RenkanControllerTest.java --- a/server/src/test/java/org/iri_research/renkan/test/controller/RenkanControllerTest.java Sat Jun 14 13:44:22 2014 +0200 +++ b/server/src/test/java/org/iri_research/renkan/test/controller/RenkanControllerTest.java Wed Jun 25 15:37:02 2014 +0200 @@ -187,5 +187,5 @@ logger.debug("testExportProjectContentExclude resp : " + res.getResponse().getContentAsString()); } - + } diff -r eaadfa988db4 -r 7fcb9d12e181 server/src/test/java/org/iri_research/renkan/test/rest/ProjectRestTest.java --- a/server/src/test/java/org/iri_research/renkan/test/rest/ProjectRestTest.java Sat Jun 14 13:44:22 2014 +0200 +++ b/server/src/test/java/org/iri_research/renkan/test/rest/ProjectRestTest.java Wed Jun 25 15:37:02 2014 +0200 @@ -1,16 +1,23 @@ package org.iri_research.renkan.test.rest; +import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.PrintWriter; +import java.io.StringWriter; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.TimeZone; import java.util.UUID; +import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Application; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.apache.commons.io.IOUtils; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; import org.iri_research.renkan.models.Edge; @@ -41,6 +48,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.datatype.joda.JodaModule; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; @@ -82,6 +90,8 @@ private String spaceId = UUID.randomUUID().toString(); private String projectId = UUID.randomUUID().toString(); + private File tempFile = null; + private ObjectMapper getObjectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JodaModule()); @@ -145,6 +155,12 @@ } this.projectsRepository.save(testProject); + try { + this.tempFile = File.createTempFile("export_json", ".json"); + } + catch (IOException e) { + e.printStackTrace(); + } } @@ -156,6 +172,9 @@ projectRevisionsRepository.deleteAll(); projectsRepository.deleteAll(); spacesRepository.deleteAll(); + if(this.tempFile != null) { + this.tempFile.deleteOnExit(); + } } @Test @@ -166,7 +185,7 @@ Assert.assertNotNull("get resp String not empty", respString); Assert.assertFalse("get resp String non empty", respString.isEmpty()); - PrintWriter writer = new PrintWriter("/Users/ymh/tmp/export_json.json", "UTF-8"); + PrintWriter writer = new PrintWriter(this.tempFile, "UTF-8"); writer.write(respString); writer.close(); @@ -234,5 +253,65 @@ } } + + @Test + public void testPostProject() throws IOException { + InputStream in = this.getClass().getResourceAsStream("/org/iri_research/renkan/test/rest/test-project.json"); + StringWriter sw = new StringWriter(); + IOUtils.copy(in, sw, "utf-8"); + + String jsonStr = sw.toString().replaceAll("\\", this.spaceId); + + WebTarget webResource = this.target(); + Response resp = webResource.path("projects").request(MediaType.APPLICATION_JSON).post(Entity.entity(jsonStr, MediaType.APPLICATION_JSON), Response.class); + + Assert.assertEquals("Status must be OK", 201, resp.getStatus()); + + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = mapper.readTree(resp.readEntity(String.class)); + + Assert.assertNotNull("Must have a project in response", node); + + JsonNode idNode = node.findValue("id"); + Assert.assertNotNull("Project must have an id", idNode); + String id = idNode.asText(); + Assert.assertNotNull("Project must have an id not null", id); + Assert.assertNotEquals("Project must have an id not empty", "", id); + + Iterator edges = node.get("edges").elements(); + int totalEdges = 0; + while(edges.hasNext()) { + ObjectNode edgeNode = (ObjectNode) edges.next(); + totalEdges++; + JsonNode edgeIdNode = edgeNode.get("id"); + Assert.assertNotNull("Edge must have an id", edgeIdNode); + String edgeId = edgeIdNode.asText(); + Assert.assertNotNull("Edge must have an id not null",edgeId); + Assert.assertNotEquals("Edge must have an id not empty", "", edgeId); + JsonNode projIdNode = edgeNode.findValue("project_id"); + Assert.assertNotNull("Edge project id node not null",projIdNode); + Assert.assertNotNull("Edge project id not null",projIdNode.asText()); + Assert.assertEquals("Edge project id must be" + id, id, projIdNode.asText()); + } + Assert.assertEquals("Must have one edge", 1, totalEdges); + + Iterator nodes = node.get("nodes").elements(); + int totalNodes = 0; + while(nodes.hasNext()) { + ObjectNode nodeNode = (ObjectNode) nodes.next(); + totalNodes++; + JsonNode nodeIdNode = nodeNode.get("id"); + Assert.assertNotNull("Edge must have an id", nodeIdNode); + String nodeId = nodeIdNode.asText(); + Assert.assertNotNull("Edge must have an id not null",nodeId); + Assert.assertNotEquals("Edge must have an id not empty", "", nodeId); + JsonNode projIdNode = nodeNode.findValue("project_id"); + Assert.assertNotNull("Edge project id node not null",projIdNode); + Assert.assertNotNull("Edge project id not null",projIdNode.asText()); + Assert.assertEquals("Edge project id must be" + id, id, projIdNode.asText()); + } + Assert.assertEquals("Must have 2 nodes", 2, totalNodes); + + } } diff -r eaadfa988db4 -r 7fcb9d12e181 server/src/test/resources/org/iri_research/renkan/test/rest/test-project.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/test/resources/org/iri_research/renkan/test/rest/test-project.json Wed Jun 25 15:37:02 2014 +0200 @@ -0,0 +1,47 @@ +{ + "title" : "Project Rest Post Test", + "description" : "", + "uri" : null, + "color" : null, + "revCounter" : 6, + "nodes" : [ { + "@id" : "f286bae5-4303-49c1-8534-43520e117940", + "title" : "storytelling", + "description" : "Tag 'storytelling'", + "uri" : "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/search/?search=storytelling&field=all", + "color" : null, + "position" : { + "x" : 7.5, + "y" : -76.0 + }, + "image" : "http://localhost:8080/renkan/static/img/ldt-tag.png", + "size" : 0, + "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503" + }, { + "@id" : "b49ee549-d98a-4b54-b6f0-73ef84a2eccb", + "title" : "Introduction générale par Hidetaka Ishida", + "description" : "石田英敬によるイントロダクション (langue française フランス語)", + "uri" : "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/player/e328e188-ff2f-11e0-b9e1-00145ea49a02/#id=s_A91AB45B-AB6B-EFCA-4A08-40B2F74F294F", + "color" : null, + "position" : { + "x" : -283.5, + "y" : 39.0 + }, + "image" : "http://localhost:8080/renkan/static/img/ldt-segment.png", + "size" : 0, + "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503" + } ], + "edges" : [ { + "@id" : "15cedd4c-99be-4d83-b849-3ee7d9d26a2c", + "title" : "", + "description" : "", + "uri" : "", + "color" : null, + "from" : "b49ee549-d98a-4b54-b6f0-73ef84a2eccb", + "to" : "f286bae5-4303-49c1-8534-43520e117940", + "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503" + } ], + "views" : [ ], + "users" : [ ], + "space_id" : "" +} \ No newline at end of file