All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.weaverplatform.sdk.Weaver Maven / Gradle / Ivy

package com.weaverplatform.sdk;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.weaverplatform.CliOptions;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;


/**
 * @author bastbijl, Sysunite 2017
 */
public class Weaver {
  public static int MAX_OPERATIONS = 5000;
  private static enum OP { get, post };
  private CliOptions options;

  public Weaver() {
    this.options = new CliOptions(new String[0]);
  }

  public Weaver(CliOptions options) {
    this.options = options;
  }

  public String getUri() {
    return uri;
  }

  public void setUri(String uri) {
    this.uri = uri;
  }

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public String getProject() {
    return project;
  }

  public void setProject(String project) {
    this.project = project;
  }

  private String uri = "http://localhost:9487";
  private String username = "admin";
  private String password = "admin";
  private String project = null;
  private String authToken = null;

  private Gson converter = new Gson();

  public String login() {
    if(authToken != null) {
      return authToken;
    } else {
      // Sign in
      JsonObject signIn = new JsonObject();
      signIn.addProperty("username", username);
      signIn.addProperty("password", password);

      ClientResponse response = send(signIn, "/user/signInUsername", OP.post);

      authToken = response.getEntity(String.class);
      return authToken;
    }
  }

  public ClientResponse sendProject(JsonObject payload, String target, OP op) {
    payload.addProperty("target", project);
    return sendAuthenticated(payload, target, op);
  }

  public ClientResponse sendAuthenticated(JsonObject payload, String target, OP op) {
    String authToken = login();
    payload.addProperty("authToken", authToken);
    return send(payload, target, op);
  }

  public ClientResponse send(JsonObject payload, String target, OP op) {
    Client client = Client.create();

    WebResource webResource = client.resource(uri + target);
    ClientResponse soapResponse;
    switch (op) {
      case get:
        try {
          String json = URLEncoder.encode(converter.toJson(payload), "UTF-8");
          webResource = webResource.queryParam("payload", json);
        } catch (UnsupportedEncodingException e) {
          throw new RuntimeException(e);
        }
        soapResponse = webResource.type("application/json; charset=utf-8").get(ClientResponse.class);
        break;
      case post:
      default:
        soapResponse = webResource.type("application/json; charset=utf-8").post(ClientResponse.class, converter.toJson(payload));
    }

    // Send response
    if (soapResponse.getStatus() != 200) {
      String response = soapResponse.getEntity(String.class);
      throw new RuntimeException("Message delivery failed on " + target + " response: " + response);
    }
    return soapResponse;
  }

  public void createProject(String id) {
    JsonObject payload = new JsonObject();
    payload.addProperty("id", id);
    payload.addProperty("name", id);
    sendAuthenticated(payload, "/project/create", OP.post);
  }

  public String projectReady(String id) {
    JsonObject payload = new JsonObject();
    payload.addProperty("id", id);
    return sendAuthenticated(payload, "/project/ready", OP.post).getEntity(String.class);
  }

  public String getVersion() {
    JsonObject payload = new JsonObject();
    return sendProject(payload, "/application/version", OP.get).getEntity(String.class);
  }

  public void wipe() {
    JsonObject payload = new JsonObject();
    sendProject(payload, "/project/wipe", OP.post);
  }

  public void sendCreate(JsonArray operations, boolean quick) {
    JsonArray array = new JsonArray();
    boolean stop = false;
    while(array.size() < MAX_OPERATIONS && operations.size() > 0 && !stop) {
      JsonObject peek = operations.get(0).getAsJsonObject();
      if(peek.get("action").getAsString().equals("increment-attribute")) {
        stop = true;
        if(array.size() == 0) {
          array.add(operations.remove(0));
        }
      } else {
        array.add(operations.remove(0));
      }
    }
    if(operations.size() > 0) {
      System.out.println("will send " + array.size() + " (" + operations.size() + " to go)");
    } else {
      System.out.println("will send " + array.size());
    }
    reallySendCreate(array, quick);
    if(operations.size() > 0) {
      sendCreate(operations, quick);
    }
  }

  public void reallySendCreate(JsonArray operations, boolean quick) {
    JsonObject payload = new JsonObject();
    payload.add("operations", operations);

    // Send the post
    String target = "/write";
    if(quick) {
      target = "/write/quick";
    }
    sendProject(payload, target, OP.post);
  }

  public JsonObject createNode(String id) {
    JsonObject payload = new JsonObject();
    payload.addProperty("timestamp", System.currentTimeMillis());
    payload.addProperty("action", "create-node");
    payload.addProperty("id", id);
    return payload;
  }

  public JsonObject createAttribute(String id, String key, String value) {

    JsonObject payload = new JsonObject();
    payload.addProperty("timestamp", System.currentTimeMillis());
    payload.addProperty("action", "create-attribute");
    payload.addProperty("id", id);
    payload.addProperty("key", key);
    payload.addProperty("value", value);
    return payload;
  }

  public JsonObject createRelation(String from, String key, String to, String id) {

    JsonObject payload = new JsonObject();
    payload.addProperty("timestamp", System.currentTimeMillis());
    payload.addProperty("action", "create-relation");
    payload.addProperty("from", from);
    payload.addProperty("key", key);
    payload.addProperty("to", to);
    payload.addProperty("id", id);
    return payload;
  }

  public Project[] getProjects() {
    ClientResponse res = sendAuthenticated(new JsonObject(), "/project", OP.get);
    String s = res.getEntity(String.class);
    JsonArray o = converter.fromJson(s, JsonArray.class);
    Project[] result = new Project[o.size()];
    for(int i = 0; i < o.size(); i++) {
      JsonObject jsonElement = o.get(i).getAsJsonObject();
      result[i] = new Project(jsonElement.get("id").getAsString(), jsonElement.get("name").getAsString());
    }
    return result;
  }

  public String getSnapshot(boolean zipped) {
    JsonObject payload = new JsonObject();
    payload.addProperty("zipped", zipped);
    ClientResponse soapResponse = sendProject(payload, "/snapshot", OP.get);
    return soapResponse.getEntity(String.class);
  }

  public String getSnapshotGraph(String graph, boolean zipped) {
    JsonObject payload = new JsonObject();
    if(graph != null) {
      payload.addProperty("graph", graph);
    }
    payload.addProperty("zipped", zipped);
    ClientResponse soapResponse = sendProject(payload, "/snapshotGraph", OP.get);
    return soapResponse.getEntity(String.class);
  }

  public String getHistory() {
    ClientResponse soapResponse = sendProject(new JsonObject(), "/history", OP.get);
    return soapResponse.getEntity(String.class);
  }

  public void restore(InputStream operationsStream) {
    JsonArray ops = converter.fromJson(new InputStreamReader(operationsStream), JsonArray.class);
    System.out.println("Going to write " + ops.size() + " operations.");
    sendCreate(ops, false);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy