Skip to content
This repository was archived by the owner on Nov 19, 2019. It is now read-only.

Commit cf3962a

Browse files
committed
initial commit jersey client
0 parents  commit cf3962a

File tree

6 files changed

+285
-0
lines changed

6 files changed

+285
-0
lines changed

.gitignore

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
*~
2+
_site/
3+
.DS_Store
4+
*.pgv.svg
5+
target/
6+
.idea
7+
.sonar
8+
*.iml
9+
.project
10+
.classpath
11+
.settings
12+
lib
13+
out
14+
.repo

pom.xml

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>org.neo4j</groupId>
8+
<artifactId>cypher-http-examples</artifactId>
9+
<version>1.0</version>
10+
11+
<packaging>jar</packaging>
12+
13+
<name>cypher-http-examples</name>
14+
15+
<properties>
16+
<maven.compiler.source>1.6</maven.compiler.source>
17+
<maven.compiler.target>1.6</maven.compiler.target>
18+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
19+
<neo4j.version>1.9.2</neo4j.version>
20+
</properties>
21+
22+
<dependencies>
23+
<dependency>
24+
<groupId>org.neo4j</groupId>
25+
<artifactId>neo4j</artifactId>
26+
<version>${neo4j.version}</version>
27+
<scope>test</scope>
28+
</dependency>
29+
<dependency>
30+
<artifactId>junit</artifactId>
31+
<groupId>junit</groupId>
32+
<version>4.11</version>
33+
<scope>test</scope>
34+
</dependency>
35+
<dependency>
36+
<groupId>org.neo4j</groupId>
37+
<artifactId>neo4j-kernel</artifactId>
38+
<version>${neo4j.version}</version>
39+
<type>test-jar</type>
40+
<scope>test</scope>
41+
</dependency>
42+
<dependency>
43+
<groupId>org.mockito</groupId>
44+
<artifactId>mockito-core</artifactId>
45+
<version>1.9.0</version>
46+
<scope>test</scope>
47+
</dependency>
48+
<dependency>
49+
<groupId>com.sun.jersey</groupId>
50+
<artifactId>jersey-client</artifactId>
51+
<version>1.9</version>
52+
</dependency>
53+
<dependency>
54+
<groupId>org.codehaus.jackson</groupId>
55+
<artifactId>jackson-mapper-asl</artifactId>
56+
<version>1.9.7</version>
57+
</dependency>
58+
<dependency>
59+
<groupId>org.javalite</groupId>
60+
<artifactId>javalite-common</artifactId>
61+
<version>1.4.8</version>
62+
</dependency>
63+
</dependencies>
64+
65+
<build>
66+
<plugins>
67+
<plugin>
68+
<groupId>org.apache.maven.plugins</groupId>
69+
<artifactId>maven-compiler-plugin</artifactId>
70+
<version>3.1</version>
71+
</plugin>
72+
</plugins>
73+
</build>
74+
75+
<repositories>
76+
<repository>
77+
<id>repository.java.net</id>
78+
<name>Java.net Repository for Maven</name>
79+
<url>https://maven.java.net/content/repositories/releases/</url>
80+
<layout>default</layout>
81+
</repository>
82+
</repositories>
83+
</project>
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package org.neo4j.example.rest;
2+
3+
import java.util.*;
4+
5+
/**
6+
* Created by mh on 26.07.13.
7+
*/
8+
public interface CypherClient {
9+
ExecutionResult query(String statement, Map<String,Object> params);
10+
11+
public class ExecutionResult implements Iterable<List<Object>> {
12+
private final List<String> columns = new ArrayList<String>();
13+
private final List<List<Object>> data = new ArrayList<List<Object>>();
14+
private int columnCount;
15+
16+
public ExecutionResult(List<String> columns) {
17+
this.columns.addAll(columns);
18+
this.columnCount = columns.size();
19+
}
20+
void addRow(List<Object> row) {
21+
data.add(row);
22+
}
23+
void addRows(List<List<Object>> rows) {
24+
this.data.addAll(rows);
25+
}
26+
27+
public List<String> getColumns() {
28+
return columns;
29+
}
30+
31+
@Override
32+
public Iterator<List<Object>> iterator() {
33+
return data.iterator();
34+
}
35+
36+
public Iterator<Map<String,Object>> rowIterator() {
37+
return new RowIterator();
38+
}
39+
40+
private class RowIterator implements Iterator<Map<String, Object>> {
41+
final Iterator<List<Object>> it;
42+
43+
private RowIterator() {
44+
it = iterator();
45+
}
46+
47+
@Override
48+
public boolean hasNext() {
49+
return it.hasNext();
50+
}
51+
52+
@Override
53+
public Map<String, Object> next() {
54+
List<Object> rowData = it.next();
55+
Map<String,Object> row = new LinkedHashMap<String, Object>(columnCount);
56+
for (int col = 0; col < columnCount; col++) {
57+
row.put(columns.get(col),rowData.get(col));
58+
}
59+
return row;
60+
}
61+
62+
@Override
63+
public void remove() {
64+
65+
}
66+
}
67+
}
68+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.neo4j.example.rest;
2+
3+
import com.sun.jersey.api.client.Client;
4+
import com.sun.jersey.api.client.ClientResponse;
5+
import com.sun.jersey.api.client.WebResource;
6+
7+
import javax.ws.rs.core.MediaType;
8+
import java.util.Map;
9+
10+
import static org.neo4j.example.rest.Util.*;
11+
12+
public class JerseyClient implements CypherClient {
13+
private final WebResource resource;
14+
15+
public JerseyClient(String baseUri) {
16+
resource = Client.create().resource(toCypherUri(baseUri));
17+
18+
}
19+
20+
public ExecutionResult query(String statement, Map<String, Object> params) {
21+
String json = toJson(createPostData(statement, params));
22+
ClientResponse response =
23+
resource.accept(MediaType.APPLICATION_JSON_TYPE)
24+
.type(MediaType.APPLICATION_JSON_TYPE)
25+
.post(ClientResponse.class, json);
26+
String result = response.getEntity(String.class);
27+
response.close();
28+
int status = response.getStatus();
29+
System.out.printf("POST %s %nstatus code [%d] %nresult %s%n", json, status, result);
30+
return toResult(status,result);
31+
}
32+
33+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.neo4j.example.rest;
2+
3+
import org.codehaus.jackson.map.ObjectMapper;
4+
5+
import java.io.IOException;
6+
import java.net.URL;
7+
import java.util.Collections;
8+
import java.util.HashMap;
9+
import java.util.List;
10+
import java.util.Map;
11+
12+
public class Util {
13+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
14+
15+
static String toCypherUri(String baseUri) {
16+
try {
17+
return new URL(new URL(baseUri), "/db/data/cypher").toString();
18+
} catch (Exception e) {
19+
throw new RuntimeException("Error constructing cypher uri from " + baseUri, e);
20+
}
21+
}
22+
23+
@SuppressWarnings("unchecked")
24+
static Map createPostData(String statement, Map<String, Object> params) {
25+
Map postData = new HashMap();
26+
postData.put("query", statement);
27+
postData.put("params", params == null ? Collections.EMPTY_MAP : params);
28+
return postData;
29+
}
30+
31+
static String toJson(Map postData) {
32+
try {
33+
return OBJECT_MAPPER.writeValueAsString(postData);
34+
} catch (IOException e) {
35+
throw new RuntimeException("Can't convert " + postData + " to json", e);
36+
}
37+
}
38+
39+
@SuppressWarnings("unchecked")
40+
public static CypherClient.ExecutionResult toResult(int status, String resultString) {
41+
if (status != 200) throw new IllegalStateException("Response status " + status + "\n" + resultString);
42+
Map map = toMap(resultString);
43+
CypherClient.ExecutionResult result = new CypherClient.ExecutionResult((List<String>) map.get("columns"));
44+
result.addRows((List<List<Object>>) map.get("data"));
45+
return result;
46+
}
47+
48+
private static Map toMap(String value) {
49+
try {
50+
return OBJECT_MAPPER.readValue(value, Map.class);
51+
} catch (IOException e) {
52+
throw new RuntimeException("Can't deserialize to Map:\n"+value,e);
53+
}
54+
}
55+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.neo4j.example.rest;
2+
3+
import org.junit.Test;
4+
5+
import java.util.Collections;
6+
import java.util.Iterator;
7+
import java.util.Map;
8+
9+
import static java.util.Arrays.asList;
10+
import static org.junit.Assert.assertEquals;
11+
12+
public class JerseyClientTest {
13+
14+
public static final int ID = 1;
15+
16+
@Test
17+
public void testQuery() throws Exception {
18+
JerseyClient client = new JerseyClient("http://localhost:7474/");
19+
CypherClient.ExecutionResult result = client.query("start n=node({id}) return id(n) as id", Collections.<String, Object>singletonMap("id", ID));
20+
21+
assertEquals(asList("id"),result.getColumns());
22+
23+
assertEquals(ID, result.iterator().next().get(0));
24+
25+
Iterator<Map<String,Object>> rowIterator = result.rowIterator();
26+
assertEquals(true, rowIterator.hasNext());
27+
Map<String, Object> row = rowIterator.next();
28+
assertEquals(1, row.size());
29+
assertEquals(true, row.containsKey("id"));
30+
assertEquals(ID, row.get("id"));
31+
}
32+
}

0 commit comments

Comments
 (0)