From cf00b74ad6557112025a771bf40fd0ed9d4dd1cc Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Fri, 14 Jun 2019 15:01:57 +0000 Subject: [PATCH] Updated pom version at 2.10.0 Task #16895 see https://support.d4science.org/issues/16895#note-9 git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/data-catalogue/ckan-util-library@179846 82a268e6-3cf1-43bd-a215-b396298e98cf --- distro/changelog.xml | 8 +- pom.xml | 2 +- .../server/ExtendCkanClient.java | 129 ++++++++++++++++- .../server/SimpleExtendCkanClient.java | 132 +++++------------- .../server/patch/PatchedCkan.java | 113 +++++++++++++++ .../server/TestDataCatalogueLib.java | 20 ++- 6 files changed, 300 insertions(+), 104 deletions(-) create mode 100644 src/main/java/org/gcube/datacatalogue/ckanutillibrary/server/patch/PatchedCkan.java diff --git a/distro/changelog.xml b/distro/changelog.xml index f14926d..3efff5d 100644 --- a/distro/changelog.xml +++ b/distro/changelog.xml @@ -1,6 +1,11 @@ + + [Task #16895] Try to patch some methods of the jackan library + @@ -49,7 +54,8 @@ Minor fix for delegates Added support for statistics (requires solrj) Added method for retrieving main landing pages - Added title on updated of records refs #16395 + + Added title on updated of records refs #16395 diff --git a/pom.xml b/pom.xml index fd34e62..66ac251 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.gcube.data-catalogue ckan-util-library - 2.9.1-SNAPSHOT + 2.10.0-SNAPSHOT jar CKan utility library diff --git a/src/main/java/org/gcube/datacatalogue/ckanutillibrary/server/ExtendCkanClient.java b/src/main/java/org/gcube/datacatalogue/ckanutillibrary/server/ExtendCkanClient.java index 80ce1cc..41f09f9 100644 --- a/src/main/java/org/gcube/datacatalogue/ckanutillibrary/server/ExtendCkanClient.java +++ b/src/main/java/org/gcube/datacatalogue/ckanutillibrary/server/ExtendCkanClient.java @@ -3,24 +3,46 @@ */ package org.gcube.datacatalogue.ckanutillibrary.server; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URLEncoder; +import java.util.Arrays; + import javax.annotation.Nullable; +import org.gcube.datacatalogue.ckanutillibrary.server.patch.PatchedCkan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Charsets; +import com.google.common.io.CharStreams; + import eu.trentorise.opendata.jackan.CheckedCkanClient; +import eu.trentorise.opendata.jackan.exceptions.CkanException; +import eu.trentorise.opendata.jackan.exceptions.JackanException; import eu.trentorise.opendata.jackan.internal.org.apache.http.client.fluent.Request; +import eu.trentorise.opendata.jackan.internal.org.apache.http.client.fluent.Response; +import eu.trentorise.opendata.jackan.model.CkanGroup; +import eu.trentorise.opendata.jackan.model.CkanOrganization; +import eu.trentorise.opendata.jackan.model.CkanResponse; /** * The Class ExtendCkanClient. * * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) - * Jun 27, 2018 + * + * Jun 14, 2019 */ -public class ExtendCkanClient extends CheckedCkanClient{ +public class ExtendCkanClient extends CheckedCkanClient implements PatchedCkan{ private static final Logger logger = LoggerFactory.getLogger(ExtendCkanClient.class); + + @Nullable + private static ObjectMapper objectMapper; private String catalogueURL; private String ckanToken; @@ -113,8 +135,107 @@ public class ExtendCkanClient extends CheckedCkanClient{ public int getTimeout() { return extendTimeout; } - - + /* (non-Javadoc) + * @see eu.trentorise.opendata.jackan.CkanClient#getOrganization(java.lang.String) + */ + public synchronized CkanOrganization getOrganization(String idOrName) { + checkNotNull(idOrName, "Need a valid id or name!"); + logger.info("Patched read organization for id/name: {}", idOrName); + return getHttp(OrganizationResponse.class, "/api/3/action/organization_show", "id", idOrName, + "include_datasets", "false", "include_users", "true").result; + + } + + + /* (non-Javadoc) + * @see eu.trentorise.opendata.jackan.CkanClient#getGroup(java.lang.String) + */ + public synchronized CkanGroup getGroup(String idOrName) { + checkNotNull(idOrName, "Need a valid id or name!"); + logger.info("Patched read group for id/name: {}", idOrName); + return getHttp(GroupResponse.class, "/api/3/action/group_show", "id", idOrName, "include_datasets", + "false", "include_users", "true").result; + } + + + /** + * Retrieves the Jackson object mapper for reading operations. Internally, + * Object mapper is initialized at first call. + * + * @return the object mapper + */ + static ObjectMapper getObjectMapper() { + if (objectMapper == null) { + objectMapper = new ObjectMapper(); + configureObjectMapper(objectMapper); + } + return objectMapper; + } + + /* (non-Javadoc) + * @see org.gcube.datacatalogue.ckanutillibrary.server.patch.PatchedCkan#getHttp(java.lang.Class, java.lang.String, java.lang.Object[]) + */ + public T getHttp(Class responseType, String path, Object... params) { + + checkNotNull(responseType); + checkNotNull(path); + String fullUrl = calcFullUrl(path, params); + T ckanResponse; + String returnedText; + + try { + + logger.debug("getting {}", fullUrl); + Request request = Request.Get(fullUrl); + configureRequest(request); + Response response = request.execute(); + InputStream stream = response.returnResponse() + .getEntity() + .getContent(); + + try (InputStreamReader reader = new InputStreamReader(stream, Charsets.UTF_8)) { + returnedText = CharStreams.toString(reader); + } + + logger.trace("returnedText {}", returnedText); + } catch (Exception ex) { + throw new CkanException("Error while performing GET. Request url was: " + fullUrl, this, ex); + } + try { + ckanResponse = getObjectMapper().readValue(returnedText, responseType); + } catch (Exception ex) { + throw new CkanException( + "Couldn't interpret json returned by the server! Returned text was: " + returnedText, this, ex); + } + + if (!ckanResponse.isSuccess()) { + throwCkanException("Error while performing GET. Request url was: " + fullUrl, ckanResponse); + } + return ckanResponse; + } + + + /* (non-Javadoc) + * @see org.gcube.datacatalogue.ckanutillibrary.server.patch.PatchedCkan#calcFullUrl(java.lang.String, java.lang.Object[]) + */ + public String calcFullUrl(String path, Object[] params) { + checkNotNull(path); + + try { + StringBuilder sb = new StringBuilder().append(catalogueURL) + .append(path); + for (int i = 0; i < params.length; i += 2) { + sb.append(i == 0 ? "?" : "&") + .append(URLEncoder.encode(params[i].toString(), "UTF-8")) + .append("=") + .append(URLEncoder.encode(params[i + 1].toString(), "UTF-8")); + } + return sb.toString(); + } catch (Exception ex) { + throw new JackanException("Error while building url to perform GET! \n path: " + path + " \n params: " + + Arrays.toString(params), ex); + } + } } diff --git a/src/main/java/org/gcube/datacatalogue/ckanutillibrary/server/SimpleExtendCkanClient.java b/src/main/java/org/gcube/datacatalogue/ckanutillibrary/server/SimpleExtendCkanClient.java index b96466e..75d1ad3 100644 --- a/src/main/java/org/gcube/datacatalogue/ckanutillibrary/server/SimpleExtendCkanClient.java +++ b/src/main/java/org/gcube/datacatalogue/ckanutillibrary/server/SimpleExtendCkanClient.java @@ -9,6 +9,7 @@ import java.util.Arrays; import javax.annotation.Nullable; +import org.gcube.datacatalogue.ckanutillibrary.server.patch.PatchedCkan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +34,7 @@ import eu.trentorise.opendata.jackan.model.CkanResponse; * * Jun 7, 2019 */ -public class SimpleExtendCkanClient extends CkanClient{ +public class SimpleExtendCkanClient extends CkanClient implements PatchedCkan{ private String catalogueURL; @@ -52,26 +53,9 @@ public class SimpleExtendCkanClient extends CkanClient{ super(catalogueURL); this.catalogueURL = catalogueURL; } - - /** - * Gets the catalogue url. - * - * @return the catalogueURL - */ - public String getCatalogueURL() { - return catalogueURL; - } - - /** - * Returns a Ckan organization. - * - * @param idOrName either the name of organization (i.e. culture-and-education) - * or the alphanumerical id (i.e. - * 232cad97-ecf2-447d-9656-63899023887f). Do not pass it a group - * id. - * @return the organization - * @throws JackanException on error + /* (non-Javadoc) + * @see eu.trentorise.opendata.jackan.CkanClient#getOrganization(java.lang.String) */ public synchronized CkanOrganization getOrganization(String idOrName) { checkNotNull(idOrName, "Need a valid id or name!"); @@ -81,15 +65,9 @@ public class SimpleExtendCkanClient extends CkanClient{ } - /** - * Returns a Ckan group. Do not pass an organization id, to get organization - * use {@link #getOrganization(java.lang.String) } instead. - * - * @param idOrName either the group name (i.e. hospitals-in-trento-district) or - * the group alphanumerical id (i.e. - * 55bb5fbd-7a7c-4eb8-8b1a-1192a5504421) - * @return the group - * @throws JackanException on error + + /* (non-Javadoc) + * @see eu.trentorise.opendata.jackan.CkanClient#getGroup(java.lang.String) */ public synchronized CkanGroup getGroup(String idOrName) { checkNotNull(idOrName, "Need a valid id or name!"); @@ -100,67 +78,36 @@ public class SimpleExtendCkanClient extends CkanClient{ /** - * The Class OrganizationResponse. + * Retrieves the Jackson object mapper for reading operations. Internally, + * Object mapper is initialized at first call. * - * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) - * - * Jun 7, 2019 + * @return the object mapper */ - static class OrganizationResponse extends CkanResponse { - - public CkanOrganization result; - - } - - /** - * The Class GroupResponse. - * - * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) - * - * Jun 7, 2019 - */ - static class GroupResponse extends CkanResponse { - - public CkanGroup result; - - /** - * Instantiates a new group response. - */ - public GroupResponse(){ - - } + static ObjectMapper getObjectMapper() { + if (objectMapper == null) { + objectMapper = new ObjectMapper(); + configureObjectMapper(objectMapper); + } + return objectMapper; } - /** - * Performs HTTP GET on server. If {@link CkanResponse#isSuccess()} is false - * throws {@link CkanException}. - * - * @param the generic type - * @param responseType a descendant of CkanResponse - * @param path something like /api/3/package_show - * @param params list of key, value parameters. They must be not be url - * encoded. i.e. "id","laghi-monitorati-trento" - * @return the http - * @throws CkanException on error + /* (non-Javadoc) + * @see org.gcube.datacatalogue.ckanutillibrary.server.patch.PatchedCkan#getHttp(java.lang.Class, java.lang.String, java.lang.Object[]) */ - private T getHttp(Class responseType, String path, Object... params) { + public T getHttp(Class responseType, String path, Object... params) { checkNotNull(responseType); checkNotNull(path); - String fullUrl = calcFullUrl(path, params); - T ckanResponse; String returnedText; try { + logger.debug("getting {}", fullUrl); Request request = Request.Get(fullUrl); - configureRequest(request); - Response response = request.execute(); - InputStream stream = response.returnResponse() .getEntity() .getContent(); @@ -185,31 +132,12 @@ public class SimpleExtendCkanClient extends CkanClient{ } return ckanResponse; } - - /** - * Retrieves the Jackson object mapper for reading operations. Internally, - * Object mapper is initialized at first call. - * - * @return the object mapper + + + /* (non-Javadoc) + * @see org.gcube.datacatalogue.ckanutillibrary.server.patch.PatchedCkan#calcFullUrl(java.lang.String, java.lang.Object[]) */ - static ObjectMapper getObjectMapper() { - if (objectMapper == null) { - objectMapper = new ObjectMapper(); - configureObjectMapper(objectMapper); - } - return objectMapper; - } - - /** - * Calculates a full url out of the provided params. - * - * @param path something like /api/3/package_show - * @param params list of key, value parameters. They must be not be url - * encoded. i.e. "id","laghi-monitorati-trento" - * @return the full url to be called. - * @throws JackanException if there is any error building the url - */ - private String calcFullUrl(String path, Object[] params) { + public String calcFullUrl(String path, Object[] params) { checkNotNull(path); try { @@ -227,5 +155,15 @@ public class SimpleExtendCkanClient extends CkanClient{ + Arrays.toString(params), ex); } } + + /** + * Gets the catalogue url. + * + * @return the catalogueURL + */ + public String getCatalogueURL() { + return catalogueURL; + } + } diff --git a/src/main/java/org/gcube/datacatalogue/ckanutillibrary/server/patch/PatchedCkan.java b/src/main/java/org/gcube/datacatalogue/ckanutillibrary/server/patch/PatchedCkan.java new file mode 100644 index 0000000..0d4dc72 --- /dev/null +++ b/src/main/java/org/gcube/datacatalogue/ckanutillibrary/server/patch/PatchedCkan.java @@ -0,0 +1,113 @@ +package org.gcube.datacatalogue.ckanutillibrary.server.patch; + +import eu.trentorise.opendata.jackan.CkanClient; +import eu.trentorise.opendata.jackan.exceptions.CkanException; +import eu.trentorise.opendata.jackan.exceptions.JackanException; +import eu.trentorise.opendata.jackan.model.CkanGroup; +import eu.trentorise.opendata.jackan.model.CkanOrganization; +import eu.trentorise.opendata.jackan.model.CkanResponse; + +/** + * The Interface PatchedCkan. + * + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * + * Jun 14, 2019 + */ +public interface PatchedCkan { + + /** + * + * This Class is private in {@link CkanClient} so I need to rewrite it + * + * The Class OrganizationResponse. + * + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * + * Jun 7, 2019 + */ + static class OrganizationResponse extends CkanResponse { + + public CkanOrganization result; + + } + + /** + * + * + * This Class is private in {@link CkanClient} so I need to rewrite it + * + * + * The Class GroupResponse. + * + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * + * Jun 7, 2019 + */ + static class GroupResponse extends CkanResponse { + + public CkanGroup result; + + /** + * Instantiates a new group response. + */ + public GroupResponse() { + + } + } + + /** + * + * This method is private in {@link CkanClient} so I need to rewrite it + * + * + * + * Performs HTTP GET on server. If {@link CkanResponse#isSuccess()} is false + * throws {@link CkanException}. + * + * @param the generic type + * @param responseType a descendant of CkanResponse + * @param path something like /api/3/package_show + * @param params list of key, value parameters. They must be not be url + * encoded. i.e. "id","laghi-monitorati-trento" + * @return the http + * @throws CkanException on error + */ + public T getHttp(Class responseType, String path, Object... params); + + /** + * + * This method is private in {@link CkanClient} so I need to rewrite it + * + * + * Calculates a full url out of the provided params. + * + * @param path something like /api/3/package_show + * @param params list of key, value parameters. They must be not be url encoded. + * i.e. "id","laghi-monitorati-trento" + * @return the full url to be called. + * @throws JackanException if there is any error building the url + */ + public String calcFullUrl(String path, Object[] params); + + + + // WE NEED TO OVERRIDE THE FOLLOWING METHODS + + /** + * Gets the organization. + * + * @param idOrName the id or name + * @return the organization + */ + public CkanOrganization getOrganization(String idOrName); + + /** + * Gets the group. + * + * @param idOrName the id or name + * @return the group + */ + public CkanGroup getGroup(String idOrName); + +} diff --git a/src/test/java/org/gcube/datacatalogue/ckanutillibrary/server/TestDataCatalogueLib.java b/src/test/java/org/gcube/datacatalogue/ckanutillibrary/server/TestDataCatalogueLib.java index f4861f3..79cd927 100644 --- a/src/test/java/org/gcube/datacatalogue/ckanutillibrary/server/TestDataCatalogueLib.java +++ b/src/test/java/org/gcube/datacatalogue/ckanutillibrary/server/TestDataCatalogueLib.java @@ -36,7 +36,8 @@ public class TestDataCatalogueLib { private DataCatalogueFactory factory; private String scope = "/gcube/devNext/NextNext"; - private String testUser = "costantino_perciante"; + //private String testUser = "costantino_perciante"; + private String testUser = "francesco_mangiacrapa"; String subjectId = "aa_father4"; String objectId = "bb_son4"; @@ -86,6 +87,23 @@ public class TestDataCatalogueLib { } } + + //@Test + public void getRoleOfUserInOrganization() throws Exception{ + + String orgName = "nextnext"; + + DataCatalogueImpl utils = factory.getUtilsPerScope(scope); + + CkanOrganization org = utils.getOrganizationByName(orgName); + + String apiKey = utils.getApiKeyFromUsername(testUser); + + String role = utils.getRoleOfUserInOrganization(testUser, org.getName(), apiKey); + + logger.debug("The user "+testUser+" in the org "+org.getName() + " has the role "+role); + } + //@Test public void getGroupForName() throws Exception{