Skip to content

Accessing Graphs with Java Applications¤

Introduction¤

This short recipe covers how to connect to Corporate Memory using a Java program. Such program can connect to Corporate Memory at any time autonomously, independently of whether a user is logged in or not.

Java Example¤

This example assumes that there is a Corporate Memory instance runnning at http://docker.localhost, and the programmer has access to its files. The process is very simple:

  1. Obtain a Bearer token.
    1. Go to the file cmem-orchestration/environments/config.env, and get the client secret from variable CMEM_SERVICE_ACCOUNT_CLIENT_SECRET.
    2. With the client secret, connect to to the OpenID endpoint to obtain the Bearer token.
  2. Use the Bearer token to connect to Corporate Memory, and, for example, execute a query.

The following code provides a simple implementation of the process:

JavaCMEMHTTPClient.java
package com.eccenca.cmem.client;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

public class HTTPClient {

  public static void main(String[] args) throws ClientProtocolException, IOException {

    // We assume that the Corporate Memory instance is running at docker.localhost
    String openidConnectEndpoint = "http://docker.localhost/auth/realms/cmem/protocol/openid-connect/token";

    // Get the client secret to obtain the bearer token from file cmem-orchestration/environments/config.env,
    // variable CMEM_SERVICE_ACCOUNT_CLIENT_SECRET
    String clientSecret = "...";

    // Create an HTTP Client
    CloseableHttpClient client = HttpClientBuilder.create().build();

    // POST request to obtain the bearer token for later authorization
    HttpPost httpPostToken = new HttpPost(openidConnectEndpoint);
    httpPostToken.setHeader("Content-type", "application/x-www-form-urlencoded");
    List < NameValuePair > params = new ArrayList < NameValuePair > ();
    params.add(new BasicNameValuePair("grant_type", "client_credentials"));
    params.add(new BasicNameValuePair("client_id", "cmem-service-account"));
    params.add(new BasicNameValuePair("client_secret", clientSecret));
    httpPostToken.setEntity(new UrlEncodedFormEntity(params));

    // Parse the JSON response to obtain the bearer token
    HttpResponse httpResponseToken = client.execute(httpPostToken);
    HttpEntity httpEntity = httpResponseToken.getEntity();
    String responseBody = EntityUtils.toString(httpEntity);
    JSONObject obj = new JSONObject(responseBody);
    String bearerToken = "Bearer " + obj.getString("access_token");

    // POST request to query the default SPARQL endpoint with the bearer token obtained above
    HttpPost httpPostQuery = new HttpPost("http://docker.localhost/dataplatform/proxy/default/sparql");
    httpPostQuery.setHeader("Accept", "application/sparql-results+json");
    httpPostQuery.setHeader("Content-type", "application/x-www-form-urlencoded");
    httpPostQuery.setHeader("Authorization", bearerToken);
    final ArrayList < NameValuePair > postParameters = new ArrayList < NameValuePair > ();
    postParameters.add(new BasicNameValuePair("query", "SELECT * WHERE {?s ?p ?o} LIMIT 10"));
    httpPostQuery.setEntity(new UrlEncodedFormEntity(postParameters));

    // The response (variable responseBodyQuery bellow) should have some bindings:
    //  {
    //     "head": {
    //       "vars": [ "s" , "p" , "o" ]
    //     } ,
    //     "results": {
    //       "bindings": [
    HttpResponse httpResponseQuery = client.execute(httpPostQuery);
    HttpEntity httpEntityQuery = httpResponseQuery.getEntity();
    String responseBodyQuery = EntityUtils.toString(httpEntityQuery);
  }
}

Comments