Skip to content

Instantly share code, notes, and snippets.

@IdanFridman
Created February 24, 2016 09:50
Show Gist options
  • Save IdanFridman/1989b600a0a032329a5e to your computer and use it in GitHub Desktop.
Save IdanFridman/1989b600a0a032329a5e to your computer and use it in GitHub Desktop.
package com.mycompany.wm.common.repo.neo4j;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.jose4j.base64url.Base64;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Repository
public class Neo4jCypherRestClient {
@Value("${neo4j.host:localhost}")
private String NEO4J_HOST;
@Value("${neo4j.protocol:http}")
private String NEO4J_PROTOCOL;
@Value("${neo4j.port:7474}")
private Integer NEO4J_PORT;
@Value("${neo4j.username:nouser}")
private String NEO4J_USERNAME;
@Value("${neo4j.password:nopass}")
private String NEO4J_PASSWORD;
private String neo4jUrl;
private String authorizationHeader;
HttpClient httpClient;
@PostConstruct
public void init() {
neo4jUrl = String.format("%s://%s:%d", NEO4J_PROTOCOL, NEO4J_HOST, NEO4J_PORT);
if (!"nouser".equalsIgnoreCase(NEO4J_USERNAME)) {
/*
http://neo4j.com/docs/stable/rest-api-security.html
Authenticate by sending a username and a password to Neo4j using HTTP Basic Auth.
Requests should include an Authorization header, with a value of Basic <payload>,
where "payload" is a base64 encoded string of "username:password".
*/
authorizationHeader = "Basic " + Base64.encode((NEO4J_USERNAME + ":" + NEO4J_PASSWORD).getBytes());
}
PoolingHttpClientConnectionManager cnnMgr = new PoolingHttpClientConnectionManager();
cnnMgr.setMaxTotal(200);
httpClient = HttpClients.custom().setConnectionManager(cnnMgr).build();
}
public Neo4jResultSet query(String cypherQuery, JsonObject params) {
String resource = "/db/data/transaction/commit";
JsonObject requestPayload = new JsonObject();
JsonObject statement = new JsonObject();
statement.put("statement", cypherQuery);
if (params != null) {
statement.put("parameters", params);
}
requestPayload.put("statements", new JsonArray().add(statement));
HttpPost request = new HttpPost(neo4jUrl + resource);
request.setEntity(new StringEntity(requestPayload.toString(), ContentType.APPLICATION_JSON));
request.setHeader("Accept", "application/json; charset=UTF-8");
request.setHeader("Content-Type", "application/json");
if (authorizationHeader != null) {
request.setHeader("Authorization", authorizationHeader);
}
try {
HttpResponse response = httpClient.execute(request);
return createResultSet(new JsonObject(IOUtils.toString(response.getEntity().getContent())));
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private Neo4jResultSet createResultSet(JsonObject result) {
JsonObject resultObject = result.getJsonArray("results").getJsonObject(0);
JsonArray columns = resultObject.getJsonArray("columns");
List<JsonArray> rows = (List<JsonArray>) resultObject.getJsonArray("data")
.getList()
.stream()
.map(o -> {
Map<String, Object> rowMap = (Map<String, Object>) o;
return new JsonArray((List) rowMap.get("row"));
})
.collect(Collectors.toList());
return new Neo4jResultSet(columns, rows);
}
public Neo4jResultSet query(String cypherQuery, Object... params) {
JsonObject paramsJson = null;
if (params.length > 0) {
paramsJson = new JsonObject();
for (int i = 0; i < params.length; i++) {
paramsJson.put(Integer.toString(i + 1), params[i]);
}
}
return query(cypherQuery, paramsJson);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment