-
-
Save IdanFridman/1989b600a0a032329a5e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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