--- a/.classpath Sat Jun 14 13:44:22 2014 +0200
+++ b/.classpath Wed Jun 25 15:37:02 2014 +0200
@@ -205,5 +205,6 @@
<classpathentry kind="var" path="M2_REPO/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.2.3/jackson-jaxrs-base-2.2.3.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-collections4/4.0/commons-collections4-4.0.jar"/>
<classpathentry kind="var" path="M2_REPO/com/google/guava/guava/17.0/guava-17.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-io/commons-io/2.4/commons-io-2.4.jar"/>
<classpathentry kind="output" path="server/target/classes"/>
</classpath>
--- 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 @@
<fasterxml-java-uuid-generator-version>3.1.3</fasterxml-java-uuid-generator-version>
<guava-version>17.0</guava-version>
<json-path-version>0.9.1</json-path-version>
+ <commons-collections-version>4.0</commons-collections-version>
+ <commons-io-version>2.4</commons-io-version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
@@ -427,7 +429,7 @@
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>${javax-validation-api-version}</version>
- </dependency>
+ </dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
@@ -441,7 +443,7 @@
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
- <version>4.0</version>
+ <version>${commons-collections-version}</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
@@ -454,6 +456,12 @@
<version>${json-path-version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>${commons-io-version}</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<organization>
<name>IRI</name>
--- 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<JsonNode> 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);
--- 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;
--- 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() {
--- 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<Project, String> {
- @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);
--- 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) {
--- 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());
}
-
+
}
--- 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("\\<space_id\\>", 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<JsonNode> 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<JsonNode> 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);
+
+ }
}
--- /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" : "<space_id>"
+}
\ No newline at end of file