From c580d706a02b64a63113deb6ce5151194ab7391e Mon Sep 17 00:00:00 2001 From: Costantino Perciante Date: Wed, 6 Dec 2017 20:48:39 +0000 Subject: [PATCH] Added catalogue publish example git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/data-catalogue/catalogue-ws@160141 82a268e6-3cf1-43bd-a215-b396298e98cf --- .settings/org.eclipse.wst.common.component | 3 + src/test/java/CataloguePublishExample.java | 231 +++++++++++++++++++++ 2 files changed, 234 insertions(+) create mode 100644 src/test/java/CataloguePublishExample.java diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index da1fa8a..6cfd3bb 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -4,6 +4,9 @@ + + uses + diff --git a/src/test/java/CataloguePublishExample.java b/src/test/java/CataloguePublishExample.java new file mode 100644 index 0000000..6ab2907 --- /dev/null +++ b/src/test/java/CataloguePublishExample.java @@ -0,0 +1,231 @@ + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; + +import eu.trentorise.opendata.jackan.internal.org.apache.http.HttpResponse; +import eu.trentorise.opendata.jackan.internal.org.apache.http.client.methods.HttpGet; +import eu.trentorise.opendata.jackan.internal.org.apache.http.client.methods.HttpPost; +import eu.trentorise.opendata.jackan.internal.org.apache.http.entity.ContentType; +import eu.trentorise.opendata.jackan.internal.org.apache.http.entity.StringEntity; +import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.CloseableHttpClient; +import eu.trentorise.opendata.jackan.internal.org.apache.http.impl.client.HttpClientBuilder; +import eu.trentorise.opendata.jackan.internal.org.apache.http.util.EntityUtils; + + + +/** + * An example of publishing in the data catalogue. + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + */ +public class CataloguePublishExample { + + private static final String LICENSE_LIST = "/api/licenses/list/"; + private static final String ORGANIZATIONS_LIST = "/api/organizations/list"; + private static final String ORGANIZATIONS_SHOW = "/api/organizations/show?id="; + private static final String GROUPS_LIST = "/api/groups/list"; + private static final String PROFILES_LIST = "/api/profiles/profile_names/"; + private static final String GET_SINGLE_PROFILE_XML = "/api/profiles/profile?name="; // GET IT'S XML + private static final String CREATE_ITEM = "/api/items/create"; + private static final String GET_BACK_ITEM = "/api/items/show?id="; + + public static void main(String[] args) throws Exception { + + // you should recover the address via IS... + String catalogueServiceEndpoint = "http://catalogue-ws-d-d4s.d4science.org/catalogue-ws/rest"; + + // token for the VRE in which the catalogue is present (and where I have at least catalogue-editor role, if + // I'm willing to publish). Note: a catalogue may host more than one VRE/Organization. I'm taking the token I need. + String myToken = ""; + + // fetch list of licenses and print it + JSONObject licenseBean = get(catalogueServiceEndpoint + LICENSE_LIST, myToken); + + if(licenseBean != null){ + + // get "real result" and print couple license id - license name + JSONArray licenses = (JSONArray)licenseBean.get("result"); + + for(int i = 0; i < licenses.size(); i++){ + + JSONObject license = (JSONObject)licenses.get(i); + System.out.println("License name is " + (String)license.get("id")); + System.out.println("License id is " + (String)license.get("title")); + + } + + } + + // do the same with organizations + JSONObject organizationsBean = get(catalogueServiceEndpoint + ORGANIZATIONS_LIST, myToken); + if(organizationsBean != null){ + + // get list of organizations (a list of names is returned) + JSONArray organizations = (JSONArray)organizationsBean.get("result"); + + for(int i = 0; i < organizations.size(); i++){ + String organization = (String)organizations.get(i); + System.out.println("Organization name is " + organization); + } + + } + + // take "nextnext" and show its details + JSONObject organizationBean = get(catalogueServiceEndpoint + ORGANIZATIONS_SHOW + "nextnext", myToken); + if(organizationBean != null){ + + // get list of organizations (a list of names is returned) + JSONObject organization = (JSONObject)organizationBean.get("result"); + System.out.println("Next Next looks like " + organization.toJSONString()); + + } + + // list groups + JSONObject groupsBean = get(catalogueServiceEndpoint + GROUPS_LIST, myToken); + if(groupsBean != null){ + + // get list of organizations (a list of names is returned) + JSONArray groups = (JSONArray)groupsBean.get("result"); + + for(int i = 0; i < groups.size(); i++){ + String group = (String)groups.get(i); + System.out.println("Group name is " + group); + } + + } + + // now, the interesting part for publishing: we need to check for "profiles" metadata, if any, in the context + // Currently, in dev, we have: + // Profile name is Test profile and Categories + // Profile name is Empty Profile + // Profile name is SoBigData.eu: Dataset Metadata NextNext + // Profile name is SoBigData.eu: Method Metadata NextNext + // Profile name is EOSCService + // Profile name is SoBigData.eu: Application Metadata NextNext + JSONObject profilesBean = get(catalogueServiceEndpoint + PROFILES_LIST, myToken); + if(profilesBean != null){ + + // get list of organizations (a list of names is returned) + JSONArray profiles = (JSONArray)profilesBean.get("result"); + + for(int i = 0; i < profiles.size(); i++){ + String profile = (String)profiles.get(i); + System.out.println("Profile name is " + profile); + } + } + + // let's check (because it sounds interesting) the "Empty" profile.. (NOTE: xml is returned here) + String emptyProfile = getXML(catalogueServiceEndpoint + GET_SINGLE_PROFILE_XML + "Empty%20Profile", myToken); + System.out.println("Empty profile looks like \n"); + System.out.println(emptyProfile); + + // result is: + // + + // great! Now let's create an item with such profile + JSONObject item = new JSONObject(); + item.put("name", "my_test_item"); // the name will be part of the uri.. it must be unique + item.put("title", "This is a WS test"); + item.put("license_id", "cc-by"); + JSONArray tags = new JSONArray(); + JSONObject myTag = new JSONObject(); + myTag.put("name", "my marvellous item"); + tags.add(myTag); + // Note: we have profiles, so we must set an extra with key system:type and a proper value(for instance, "EmptyType"). + JSONObject extras = new JSONObject(); + extras.put("system:type", "EmptyType"); + extras.put("Temporal Coverage", "whatever"); + item.put("extras", extras); + item.put("tags", tags); + + JSONObject created = post(catalogueServiceEndpoint + CREATE_ITEM, item, myToken); + System.out.println("Result is " + created.toJSONString()); + + } + + /** + * Executes an http get request + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + * @param request + * @return + * @throws Exception + */ + private static JSONObject get(String url, String token) throws Exception{ + try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { + + HttpGet req = new HttpGet(url); + req.setHeader("gcube-token", token); + HttpResponse response = httpClient.execute(req); + + if(response.getStatusLine().getStatusCode() != 200) + throw new Exception("There was an error while serving the request " + response.getStatusLine()); + + JSONParser parser = new JSONParser(); + JSONObject parsedObject = (JSONObject)parser.parse(EntityUtils.toString(response.getEntity())); + return parsedObject; + + }catch(Exception e){ + System.err.println("Error while serving request " + e); + throw e; + } + } + + /** + * Executes a post request + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + * @param url + * @param request + * @return + * @throws Exception + */ + private static JSONObject post(String url, JSONObject request, String token) throws Exception{ + + try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { + + HttpPost post = new HttpPost(url); + post.setHeader("gcube-token", token); + HttpResponse response = httpClient.execute(post); + + StringEntity params = new StringEntity(request.toJSONString(), ContentType.APPLICATION_JSON); + post.setEntity(params); + + if(response.getStatusLine().getStatusCode() != 200) + throw new Exception("There was an error while serving the request " + response.getStatusLine()); + + JSONParser parser = new JSONParser(); + JSONObject parsedObject = (JSONObject)parser.parse(EntityUtils.toString(response.getEntity())); + return parsedObject; + + }catch(Exception e){ + System.err.println("Error while serving request " + e); + throw e; + } + + } + + /** + * Executes an http get request to fetch an xml data + * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + * @param request + * @return + * @throws Exception + */ + private static String getXML(String url, String token) throws Exception{ + try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { + + HttpGet req = new HttpGet(url); + req.setHeader("gcube-token", token); + HttpResponse response = httpClient.execute(req); + + if(response.getStatusLine().getStatusCode() != 200) + throw new Exception("There was an error while serving the request " + response.getStatusLine()); + + return EntityUtils.toString(response.getEntity()); + + }catch(Exception e){ + System.err.println("Error while serving request " + e); + throw e; + } + } +}