Francesco Mangiacrapa 2022-05-18 15:38:16 +02:00
parent 82d7323251
commit 7515bbeb36
17 changed files with 1984 additions and 555 deletions

View File

@ -13,11 +13,6 @@
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="src" path="src/main/resources"/> <classpathentry kind="src" path="src/main/resources"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes> <attributes>
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
@ -26,9 +21,14 @@
</classpathentry> </classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java"> <classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes> <attributes>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/> <attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/> </attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="output" path="target/classes"/> <classpathentry kind="output" path="target/classes"/>

View File

@ -10,6 +10,6 @@ org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.compiler.source=1.8

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<faceted-project> <faceted-project>
<installed facet="java" version="1.8"/>
<installed facet="jst.utility" version="1.0"/> <installed facet="jst.utility" version="1.0"/>
<installed facet="java" version="1.8"/>
</faceted-project> </faceted-project>

View File

@ -4,11 +4,21 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [v1.1.0-SNAPSHOT] - 2022-05-18
**New Features**
- [#21643] Integrated with the content-moderator-system facilities
- [#22838] Integrated the collection provided by gCat to read the service configurations
- [#23108] The Moderation facility accessible to Catalogue Editor/Admin in read only mode
- [#23197] Revised the query passed to gCat with the moderation states
## [v1.0.3] - 2022-01-21 ## [v1.0.3] - 2022-01-21
**Fixes** **Fixes**
- [#22691] Share Link on private items does not work - [#22691] Share Link on private items does not work
## [v1.0.2] - 2021-06-03 ## [v1.0.2] - 2021-06-03
**Fixes** **Fixes**

View File

@ -12,8 +12,8 @@
<groupId>org.gcube.datacatalogue</groupId> <groupId>org.gcube.datacatalogue</groupId>
<artifactId>catalogue-util-library</artifactId> <artifactId>catalogue-util-library</artifactId>
<version>1.0.3</version> <version>1.1.0-SNAPSHOT</version>
<name>Ckan utility library</name> <name>Ckan utility library</name>
<description> <description>
Utility library to retrieve users information, organizations information and so on from the ckan d4science datacatalogue Utility library to retrieve users information, organizations information and so on from the ckan d4science datacatalogue
@ -31,6 +31,8 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<gwtVersion>2.7.0</gwtVersion> <gwtVersion>2.7.0</gwtVersion>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<apache.http.version>4.4.1</apache.http.version> <apache.http.version>4.4.1</apache.http.version>
<gcube.jackson.version>2.8.11</gcube.jackson.version> <gcube.jackson.version>2.8.11</gcube.jackson.version>
</properties> </properties>
@ -40,7 +42,7 @@
<dependency> <dependency>
<groupId>org.gcube.distribution</groupId> <groupId>org.gcube.distribution</groupId>
<artifactId>maven-portal-bom</artifactId> <artifactId>maven-portal-bom</artifactId>
<version>3.6.2</version> <version>3.6.2-SNAPSHOT</version>
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>

View File

@ -249,8 +249,6 @@ public class DBCaller {
PreparedStatement preparedStatement = connection.prepareStatement(query); PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, username); preparedStatement.setString(1, username);
preparedStatement.setString(2, state); preparedStatement.setString(2, state);
LOG.debug("The query is: "+preparedStatement.toString());
ResultSet rs = preparedStatement.executeQuery(); ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) { while (rs.next()) {

View File

@ -4,28 +4,42 @@
package org.gcube.datacatalogue.utillibrary.gcat; package org.gcube.datacatalogue.utillibrary.gcat;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.util.Map;
import javax.ws.rs.WebApplicationException; import javax.ws.rs.WebApplicationException;
import javax.xml.ws.WebServiceException;
import org.gcube.datacatalogue.utillibrary.shared.GCatCatalogueConfiguration;
import org.gcube.gcat.api.configuration.CatalogueConfiguration;
import org.gcube.gcat.api.moderation.CMItemStatus;
import org.gcube.gcat.api.moderation.Moderated;
import org.gcube.gcat.client.Configuration;
import org.gcube.gcat.client.Group; import org.gcube.gcat.client.Group;
import org.gcube.gcat.client.Item; import org.gcube.gcat.client.Item;
import org.gcube.gcat.client.Resource; import org.gcube.gcat.client.Resource;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** /**
* The Class GCatCaller. * The Class GCatCaller.
* *
* @author Francesco Mangiacrapa at ISTI-CNR Pisa (Italy) * @author Francesco Mangiacrapa at ISTI-CNR Pisa (Italy) May 29, 2020
* May 29, 2020
*/ */
public class GCatCaller { public class GCatCaller {
private String catalogueURL; private String catalogueURL;
private GCatCatalogueConfiguration catalogueConfiguration;
private static final Logger LOG = LoggerFactory.getLogger(GCatCaller.class); private static final Logger LOG = LoggerFactory.getLogger(GCatCaller.class);
public final static String MODERATOR_ITEM_STATUS_PARAMETER = Moderated.CM_ITEM_STATUS_QUERY_PARAMETER;
public final static String MODERATOR_ITEM_ANY_STATUS_VALUE = CMItemStatus.ANY.getValue();
public final static String DEFAULT_SORT_VALUE = "name asc";
/** /**
* Instantiates a new g cat caller. * Instantiates a new g cat caller.
* *
@ -34,68 +48,7 @@ public class GCatCaller {
public GCatCaller(String catalogueURL) { public GCatCaller(String catalogueURL) {
this.catalogueURL = catalogueURL; this.catalogueURL = catalogueURL;
} }
/**
* Gets the dataset for name.
*
* @param datasetName the dataset name
* @return the jsonValue
* @throws WebApplicationException the web application exception
* @throws MalformedURLException the malformed URL exception
*/
public String getDatasetForName(String datasetName) throws WebApplicationException, MalformedURLException {
LOG.debug("GetDatasetForName called");
LOG.info("Get dataset for name "+datasetName+ "called");
return new Item().read(datasetName);
}
/**
* Creates the dataset.
*
* @param jsonDataset the json dataset
* @param socialPost if true sends the social post
* @return the jsonValue
* @throws WebApplicationException the web application exception
* @throws MalformedURLException the malformed URL exception
*/
public String createDataset(String jsonDataset, boolean socialPost) throws WebApplicationException, MalformedURLException {
LOG.debug("Create dataset called");
LOG.info("Calling create on: "+jsonDataset);
return new Item().create(jsonDataset,socialPost);
}
/**
* Adds the resource to dataset.
*
* @param datasetId the dataset id
* @param jsonValueResource the json value resource
* @return the string
* @throws MalformedURLException the malformed URL exception
*/
public String addResourceToDataset(String datasetId, String jsonValueResource) throws MalformedURLException {
LOG.debug("Create resource called");
LOG.info("Calling create resource: "+jsonValueResource+ " for dataset id: "+datasetId);
return new Resource().create(datasetId, jsonValueResource);
}
/**
* Delete resource.
*
* @param datasetId the dataset id
* @param resourceId the resource id
* @throws MalformedURLException the malformed URL exception
*/
public void deleteResource(String datasetId, String resourceId) throws MalformedURLException {
LOG.debug("Delete resource called");
LOG.info("Calling delete resource with: "+resourceId+ " for dataset id: "+datasetId);
new Resource().delete(datasetId, resourceId);
}
/** /**
* Gets the catalogue URL. * Gets the catalogue URL.
* *
@ -105,7 +58,79 @@ public class GCatCaller {
return catalogueURL; return catalogueURL;
} }
/**
* Gets the dataset for name.
*
* @param datasetName the dataset name
* @return the jsonValue
* @throws WebApplicationException the web application exception
* @throws MalformedURLException the malformed URL exception
*/
public String getDatasetForName(String datasetName) throws WebApplicationException, MalformedURLException {
LOG.debug("getDatasetForName called");
LOG.info("Get dataset for name '" + datasetName + "' called");
return new Item().read(datasetName);
}
/**
* Creates the dataset.
*
* @param jsonDataset the json dataset
* @param socialPost if true sends the social post
* @return the jsonValue
* @throws WebApplicationException the web application exception
* @throws MalformedURLException the malformed URL exception
*/
public String createDataset(String jsonDataset, boolean socialPost)
throws WebApplicationException, MalformedURLException {
LOG.trace("createDataset called");
LOG.info("Calling create on: " + jsonDataset);
return new Item().create(jsonDataset, socialPost);
}
/**
* Update dataset.
*
* @param datasetName the dataset name
* @param jsonDataset the json dataset
* @return the string
* @throws WebApplicationException the web application exception
* @throws MalformedURLException the malformed URL exception
*/
public String updateDataset(String datasetName, String jsonDataset)
throws WebApplicationException, MalformedURLException {
LOG.trace("updateDataset called");
LOG.info("Calling update item with name: " + datasetName + ", on: " + jsonDataset);
return new Item().update(datasetName, jsonDataset);
}
/**
* Adds the resource to dataset.
*
* @param datasetId the dataset id
* @param jsonValueResource the json value resource
* @return the string
* @throws MalformedURLException the malformed URL exception
*/
public String addResourceToDataset(String datasetId, String jsonValueResource) throws MalformedURLException {
LOG.trace("addResourceToDataset called");
LOG.info("Calling create resource: " + jsonValueResource + " for dataset id: " + datasetId);
return new Resource().create(datasetId, jsonValueResource);
}
/**
* Delete resource.
*
* @param datasetId the dataset id
* @param resourceId the resource id
* @throws MalformedURLException the malformed URL exception
*/
public void deleteResource(String datasetId, String resourceId) throws MalformedURLException {
LOG.trace("deleteResource called");
LOG.info("Calling delete resource with: " + resourceId + " for dataset id: " + datasetId);
new Resource().delete(datasetId, resourceId);
}
/** /**
* Creates the group. * Creates the group.
* *
@ -113,27 +138,214 @@ public class GCatCaller {
* @return the string * @return the string
* @throws MalformedURLException the malformed URL exception * @throws MalformedURLException the malformed URL exception
*/ */
public String createGroup(String jsonGroup) throws MalformedURLException { public String createGroup(String jsonGroup) throws MalformedURLException {
LOG.debug("Create group called"); LOG.trace("createGroup called");
LOG.info("Calling create group: "+jsonGroup); LOG.info("Calling create group: " + jsonGroup);
return new Group().create(jsonGroup); return new Group().create(jsonGroup);
} }
/** /**
* Patch dataset. * Patch dataset.
* *
* @param datasetName the dataset name * @param datasetName the dataset name
* @param jsonObj the json obj * @param jsonObj the json obj
* @return the string * @return the string
* @throws WebApplicationException the web application exception * @throws WebApplicationException the web application exception
* @throws MalformedURLException the malformed URL exception
*/
public String patchDataset(String datasetName, JSONObject jsonObj)
throws WebApplicationException, MalformedURLException {
LOG.trace("patchDataset called");
LOG.info("Calling patch dataset with name: " + datasetName);
return new Item().patch(datasetName, jsonObj.toJSONString());
}
/**
* Approve item.
*
* @param datasetName the dataset name
* @param moderatorMessage the moderator message
* @return the string
* @throws WebApplicationException the web application exception
* @throws MalformedURLException the malformed URL exception
*/
public String approveItem(String datasetName, String moderatorMessage)
throws WebApplicationException, MalformedURLException {
LOG.trace("approveItem called");
LOG.info("Calling approve item with name: " + datasetName + ", and msg: " + moderatorMessage);
return new Item().approve(datasetName, moderatorMessage);
}
/**
* Reject item.
*
* @param datasetName the dataset name
* @param permanentlyDelete the permanently delete
* @param moderatorMessage the moderator message
* @return the string
* @throws WebServiceException the web service exception
* @throws MalformedURLException the malformed URL exception * @throws MalformedURLException the malformed URL exception
*/ */
public String patchDataset(String datasetName, JSONObject jsonObj) throws WebApplicationException, MalformedURLException { public String rejectItem(String datasetName, boolean permanentlyDelete, String moderatorMessage)
LOG.debug("Patch dataset called"); throws WebServiceException, MalformedURLException {
LOG.info("Calling patch dataset with name: "+datasetName); LOG.trace("rejectItem called");
return new Item().patch(datasetName, jsonObj.toJSONString()); LOG.info("Calling reject item with name: " + datasetName + ", and msg: " + moderatorMessage);
String toReturnMsg = new Item().reject(datasetName, moderatorMessage);
if (permanentlyDelete) {
deleteItem(datasetName, true);
}
return toReturnMsg;
}
/**
* Delete item.
*
* @param datasetName the dataset name
* @param purge the purge
* @throws WebServiceException the web service exception
* @throws MalformedURLException the malformed URL exception
*/
public void deleteItem(String datasetName, boolean purge) throws WebServiceException, MalformedURLException {
LOG.trace("deleteItem called");
LOG.info("Calling delete item with name: " + datasetName + ", and purge: " + purge);
new Item().delete(datasetName, purge);
return;
}
/**
* Gets the list items for CM status.
*
* @param status the status
* @param limit the limit
* @param offset the offset
* @param filters the filters
* @param sortForField the sort for field
* @return the list items for CM status
* @throws WebServiceException the web service exception
* @throws MalformedURLException the malformed URL exception
*/
public String getListItemsForCMStatus(CMItemStatus status, int limit, int offset, Map<String, String> filters, String sortForField)
throws WebServiceException, MalformedURLException {
LOG.trace("getListItemsForCMStatus called");
LOG.info("called getListItemsForCMStatus called with [status: " + status + "], [limit: " + limit
+ "], [offset: " + offset + "], [filters: " + filters + "]");
Map<String, String> queryParams = GCatCallerUtil.genericQueryBuilderFor(status, limit, offset, false, filters, sortForField);
return getListItemsForQuery(queryParams);
}
/**
* Count list items for CM status.
*
* @param status the status
* @param filters
* @return the number of items
* @throws WebServiceException the web service exception
* @throws MalformedURLException the malformed URL exception
*/
public int countListItemsForCMStatus(CMItemStatus status, Map<String, String> filters)
throws WebServiceException, MalformedURLException {
LOG.trace("countListItemsForCMStatus called");
LOG.info("Calling count list items for [status: " + status + "], [filters: " + filters + "]");
Map<String, String> queryParams = GCatCallerUtil.genericQueryBuilderFor(status, null, null, true, filters, null);
String theCount = getListItemsForQuery(queryParams);
int count = 0;
try {
JSONParser parser = new JSONParser();
JSONObject jsonCount = (JSONObject) parser.parse(theCount);
Long total = (Long) jsonCount.get("count");
count = total.intValue();
} catch (Exception e) {
LOG.warn("Size retured by gCat is not an integer, returning: " + count, e);
}
return count;
}
/**
* Gets the list items.
*
* @param limit the limit
* @param offset the offset
* @return the list items
* @throws WebServiceException the web service exception
* @throws MalformedURLException the malformed URL exception
*/
public String getListItems(int limit, int offset) throws WebServiceException, MalformedURLException {
LOG.trace("getListItems called");
LOG.info("Calling list items with limit: " + limit + ", offset: " + offset);
return new Item().list(limit, offset);
}
/**
* Gets the list items for query.
*
* @param queryParams the query params
* @return the list items for query
* @throws WebServiceException the web service exception
* @throws MalformedURLException the malformed URL exception
*/
public String getListItemsForQuery(Map<String, String> queryParams)
throws WebServiceException, MalformedURLException {
LOG.trace("getListItemsForQuery called");
LOG.info("Calling list items for query: " + queryParams);
return new Item().list(queryParams);
}
/**
* Gets the configuration.
*
* @param reload the reload
* @return the configuration
* @throws MalformedURLException
*/
public GCatCatalogueConfiguration getConfiguration(boolean reload) throws MalformedURLException {
LOG.trace("getConfiguration called");
LOG.info("Calling get configuration with reload config: " + reload);
if (reload || catalogueConfiguration == null) {
catalogueConfiguration = new GCatCatalogueConfiguration();
Configuration gCatConfig = new Configuration();
CatalogueConfiguration gCG = gCatConfig.read();
catalogueConfiguration.setCkanURL(gCG.getCkanURL());
catalogueConfiguration.setContext(gCG.getContext());
catalogueConfiguration.setDefaultOrganization(gCG.getDefaultOrganization());
catalogueConfiguration.setModerationEnabled(gCG.isModerationEnabled());
catalogueConfiguration.setSocialPostEnabled(gCG.isSocialPostEnabled());
catalogueConfiguration.setNotificationToUsersEnabled(gCG.isNotificationToUsersEnabled());
catalogueConfiguration.setSolrURL(gCG.getSolrURL());
catalogueConfiguration.setSupportedOrganizations(gCG.getSupportedOrganizations());
}
LOG.info("returning gCatConfig: " + catalogueConfiguration);
return catalogueConfiguration;
}
private static int offsetToPageNumber(int limit, int offset) {
int pageNumber = offset;
try {
pageNumber = offset / limit;
} catch (Exception e) {
LOG.warn("Page number error: ", e);
}
return pageNumber;
} }
} }

View File

@ -0,0 +1,112 @@
package org.gcube.datacatalogue.utillibrary.gcat;
import java.io.InvalidObjectException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.gcube.gcat.api.moderation.CMItemStatus;
import org.json.simple.JSONArray;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The Class GCatCallerUtil.
*
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
*
* Apr 7, 2022
*/
public class GCatCallerUtil {
private static final Logger LOG = LoggerFactory.getLogger(GCatCallerUtil.class);
/**
* Generic query builder for.
*
* @param status the status
* @param limit the limit
* @param offset the offset
* @param count the count
* @param filters the filters
* @return the map
*/
public static Map<String, String> genericQueryBuilderFor(CMItemStatus status, Integer limit, Integer offset,
Boolean count, Map<String, String> filters, String sort) {
LOG.info("genericQueryBuilderFor called with [status: " + status + "], [limit: " + limit + "], [offset: "
+ offset + "], [count: " + count + "], [filters: " + filters + "]");
Map<String, String> queryParams = new HashMap<String, String>();
if (filters != null) {
StringBuilder queryBuilder = new StringBuilder();
List<String> keySet = new ArrayList<String>();
keySet.addAll(filters.keySet());
String firstKey = keySet.get(0);
queryBuilder.append(firstKey + ":" + filters.get(firstKey));
for (int i = 1; i < keySet.size(); i++) {
String key = keySet.get(i);
queryBuilder.append(" AND " + key + ":" + filters.get(key));
}
queryParams.put("q", queryBuilder.toString());
}
if (status != null) {
queryParams.put(GCatCaller.MODERATOR_ITEM_STATUS_PARAMETER, status.getValue());
}
if (limit != null) {
limit = limit < 0 ? 10 : limit;
queryParams.put("limit", limit + "");
}
if (offset != null) {
offset = offset < 0 ? 0 : offset;
queryParams.put("offset", offset + "");
}
if (sort != null) {
queryParams.put("sort", sort);
}else {
LOG.info("Adding defautl sort: "+GCatCaller.DEFAULT_SORT_VALUE);
queryParams.put("sort", GCatCaller.DEFAULT_SORT_VALUE);
}
if (count != null) {
if (count) {
queryParams.put("count", "true");
}
}
return queryParams;
}
public static List<String> toListString(String gcatListResponse) throws InvalidObjectException {
List<String> listData = new ArrayList<String>();
if (gcatListResponse != null) {
LOG.debug("converting list {}", gcatListResponse);
JSONParser parser = new JSONParser();
try {
JSONArray jsonArray = (JSONArray) parser.parse(gcatListResponse);
for (Object data : jsonArray) {
if (data instanceof String) {
listData.add((String) data);
}
}
} catch (ParseException e) {
LOG.error("error occurred reading " + gcatListResponse + " as JSONArray", e);
throw new InvalidObjectException(e.getMessage());
}
}
return listData;
}
}

View File

@ -77,12 +77,20 @@ public interface DataCatalogue {
String getUriResolverUrl(); String getUriResolverUrl();
/** /**
* Return the manage product property. * Return the manage product property (used in the GRSF[-ADMIN] contexts).
* *
* @return the manage product property * @return the manage product property
*/ */
boolean isManageProductEnabled(); boolean isManageProductEnabled();
/**
* Checks if is moderation enabled.
*
* @param reloadConfig the reload config from service
* @return true, if is moderation enabled
*/
boolean isModerationEnabled(boolean reloadConfig);
/** /**
* Return the catalogue portlet for this context(i.e. scope) * Return the catalogue portlet for this context(i.e. scope)
* *
@ -332,6 +340,7 @@ public interface DataCatalogue {
* @param organizationName the organization name * @param organizationName the organization name
* @param username the username * @param username the username
* @return String the id of the resource on success, null otherwise * @return String the id of the resource on success, null otherwise
* @throws Exception the exception
*/ */
String addResourceToDataset(ResourceBean resourceBean, String organizationName, String username) throws Exception; String addResourceToDataset(ResourceBean resourceBean, String organizationName, String username) throws Exception;
@ -339,7 +348,7 @@ public interface DataCatalogue {
* Remove the resource with id resourceId from dataset in which it is. * Remove the resource with id resourceId from dataset in which it is.
* *
* @param resourceId the resource id * @param resourceId the resource id
* @param username the username * @param username the username
* @return true on success, false otherwise. * @return true on success, false otherwise.
* @throws Exception the exception * @throws Exception the exception
*/ */
@ -401,6 +410,15 @@ public interface DataCatalogue {
boolean patchProductCustomFields(String productId, String username, Map<String, List<String>> customFieldsToChange, boolean patchProductCustomFields(String productId, String username, Map<String, List<String>> customFieldsToChange,
boolean removeOld); boolean removeOld);
/**
* Refresh dataset.
*
* @param datasetName the dataset name
* @return the string
* @throws Exception the exception
*/
String refreshDataset(String datasetName) throws Exception;
/** /**
* Patch a product with product id productId by using the couples in * Patch a product with product id productId by using the couples in
* customFieldsToChange. NOTE: only the specified custom fields will be changed. * customFieldsToChange. NOTE: only the specified custom fields will be changed.
@ -408,9 +426,9 @@ public interface DataCatalogue {
* false, the new values are added at the end of the list. Otherwise they are * false, the new values are added at the end of the list. Otherwise they are
* lost. * lost.
* *
* @param productId the product id * @param username the username
* @param customFieldsToChange the custom fields to change * @param sourceOrganization the source organization
* @param removeOld the remove old * @param currentRole the current role
* @return true, if successful * @return true, if successful
*/ */
// boolean patchProductCustomFields(String productId, Map<String, List<String>> customFieldsToChange, // boolean patchProductCustomFields(String productId, Map<String, List<String>> customFieldsToChange,

View File

@ -0,0 +1,88 @@
package org.gcube.datacatalogue.utillibrary.server.cms;
import java.io.InvalidObjectException;
import java.net.MalformedURLException;
import java.util.List;
import java.util.Map;
import javax.ws.rs.WebApplicationException;
import javax.xml.ws.WebServiceException;
import org.gcube.datacatalogue.utillibrary.shared.ItemStatus;
import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanDataset;
/**
* The Interface CatalogueContentModeratorSystem.
*
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
*
* Jan 10, 2022
*/
public interface CatalogueContentModeratorSystem {
/**
* Checks if is moderation enabled.
*
* @param reloadConfig the reload config
* @return true, if is moderation enabled
* @throws MalformedURLException
*/
boolean isModerationEnabled(boolean reloadConfig) throws MalformedURLException;
/**
* Gets the list items for status.
*
* @param theStatus the the status
* @param limit the limit
* @param offset the offset
* @param filters add the input filters to query on CKAN
* @param sortForField the sort for field
* @return the list items for status
* @throws WebApplicationException the web application exception
* @throws MalformedURLException the malformed URL exception
* @throws InvalidObjectException the invalid object exception
*/
public List<CkanDataset> getListItemsForStatus(ItemStatus theStatus, int limit, int offset,
Map<String, String> filters, String sortForField) throws WebApplicationException, MalformedURLException, InvalidObjectException;
/**
* Reject item.
*
* @param itemName the item name
* @param permanentlyDelete the permanently delete
* @param reasonMsg the reason msg
* @throws WebServiceException the web service exception
* @throws MalformedURLException the malformed URL exception
*/
void rejectItem(String itemName, boolean permanentlyDelete, String reasonMsg)
throws WebServiceException, MalformedURLException;
/**
* Permanently delete.
*
* @param itemName the item name
* @throws WebServiceException the web service exception
* @throws MalformedURLException the malformed URL exception
*/
void permanentlyDelete(String itemName) throws WebServiceException, MalformedURLException;
/**
* Count list items for status.
*
* @param theStatus the the status
* @param filters add the input filters to query on CKAN
* @return the long
*/
long countListItemsForStatus(ItemStatus theStatus, Map<String, String> filters);
/**
* Approve item.
*
* @param itemName the item name
* @param moderatorMessage the moderator message
* @throws WebApplicationException the web application exception
* @throws MalformedURLException the malformed URL exception
*/
void approveItem(String itemName, String moderatorMessage) throws WebApplicationException, MalformedURLException;
}

View File

@ -0,0 +1,252 @@
package org.gcube.datacatalogue.utillibrary.server.cms;
import static com.google.common.base.Preconditions.checkNotNull;
import java.io.IOException;
import java.io.InvalidObjectException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.ws.rs.WebApplicationException;
import javax.xml.ws.WebServiceException;
import org.gcube.datacatalogue.utillibrary.ckan.MarshUnmarshCkanObject;
import org.gcube.datacatalogue.utillibrary.ckan.MarshUnmarshCkanObject.METHOD;
import org.gcube.datacatalogue.utillibrary.gcat.GCatCaller;
import org.gcube.datacatalogue.utillibrary.shared.ItemStatus;
import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanDataset;
import org.gcube.gcat.api.moderation.CMItemStatus;
import org.json.simple.JSONArray;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The Class DataCatalogueCMSImpl.
*
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
*
* Jun 14, 2021
*/
public class DataCatalogueCMSImpl implements CatalogueContentModeratorSystem {
private static final Logger LOG = LoggerFactory.getLogger(DataCatalogueCMSImpl.class);
private String runningScope;
private GCatCaller gCatCaller;
/**
* Instantiates a new data catalogue CMS impl.
*
* @param runningScope the running scope
* @param gCatCaller the g cat caller
*/
public DataCatalogueCMSImpl(String runningScope, GCatCaller gCatCaller) {
this.runningScope = runningScope;
this.gCatCaller = gCatCaller;
}
/**
* Checks if is Moderation is enabled in the working scope
*
* @return true, if is content moderator enabled
* @throws MalformedURLException
*/
@Override
public boolean isModerationEnabled(boolean reloadConfig) throws MalformedURLException {
return gCatCaller.getConfiguration(reloadConfig).isModerationEnabled();
}
/**
* Approve item.
*
* @param datasetName the dataset name
* @param moderatorMessage the moderator message
* @throws WebApplicationException the web application exception
* @throws MalformedURLException the malformed URL exception
*/
@Override
public void approveItem(String datasetName, String moderatorMessage)
throws WebApplicationException, MalformedURLException {
gCatCaller.approveItem(datasetName, moderatorMessage);
}
/**
* Reject item.
*
* @param datasetName the dataset name
* @param permanentlyDelete the permanently delete
* @param moderatorMessage the moderator message
* @throws WebServiceException the web service exception
* @throws MalformedURLException the malformed URL exception
*/
@Override
public void rejectItem(String datasetName, boolean permanentlyDelete, String moderatorMessage)
throws WebServiceException, MalformedURLException {
gCatCaller.rejectItem(datasetName, permanentlyDelete, moderatorMessage);
}
/**
* Permanently delete.
*
* @param datasetName the dataset name
* @throws WebServiceException the web service exception
* @throws MalformedURLException the malformed URL exception
*/
@Override
public void permanentlyDelete(String datasetName) throws WebServiceException, MalformedURLException {
gCatCaller.deleteItem(datasetName, true);
}
/**
* Gets the running scope.
*
* @return the running scope
*/
public String getRunningScope() {
return runningScope;
}
/**
* Gets the list items for status.
*
* @param theStatus the the status
* @param limit the limit
* @param offset the offset
* @param filters add the input filters to query on CKAN
* @param sortForField the sort for field
* @return the list items for status
* @throws WebApplicationException the web application exception
* @throws MalformedURLException the malformed URL exception
* @throws InvalidObjectException the invalid object exception
*/
@Override
public List<CkanDataset> getListItemsForStatus(ItemStatus theStatus, int limit, int offset,
Map<String, String> filters, String sortForField) throws WebApplicationException, MalformedURLException, InvalidObjectException {
LOG.info("called getListItemsForStatus with [status: " + theStatus + "], [limit: " + limit + "], [offset: "
+ offset + "], [filters: " + filters + "]");
List<CkanDataset> listDataset = null;
checkNotNull(theStatus);
JSONArray jsonArray = getSourceArrayOfItemsForStatus(theStatus, limit, offset, filters, sortForField);
if (jsonArray != null) {
int size = jsonArray.size();
listDataset = new ArrayList<CkanDataset>(size);
LOG.info("reading and converting " + size + " dataset...");
for (int i = 0; i < size; i++) {
String datasetName = null;
try {
datasetName = (String) jsonArray.get(i);
LOG.debug("reading dataset: " + datasetName);
String jsonValueDataset = gCatCaller.getDatasetForName(datasetName);
LOG.trace("the JSON dataset is: " + jsonValueDataset);
CkanDataset toCkanDataset = MarshUnmarshCkanObject.toCkanDataset(jsonValueDataset, METHOD.TO_READ);
LOG.debug("converted as dataset: " + toCkanDataset);
listDataset.add(toCkanDataset);
} catch (IOException e) {
LOG.warn("Error on reading/converting the dataset name: " + datasetName, e);
}
}
}
if (listDataset == null) {
LOG.info("no dataset returned with status: " + theStatus);
return listDataset;
}
LOG.info("returning listDataset with size: " + listDataset.size());
return listDataset;
}
/**
* Count list items for status.
*
* @param theStatus the the status
* @param filters add the input filters to query on CKAN
* @return the number of items with the input status
*/
@Override
public long countListItemsForStatus(ItemStatus theStatus, Map<String, String> filters) {
LOG.info("called countListItemsForStatus with [status: " + theStatus + "]");
checkNotNull(theStatus);
int count = 0;
try {
CMItemStatus cmStatus = toCMStatus(theStatus);
count = gCatCaller.countListItemsForCMStatus(cmStatus, filters);
} catch (Exception e) {
LOG.error("Error on counting the items for status " + theStatus, e);
return -1;
}
return count;
}
/**
* Gets the source array of items for status read by gCatClient.
*
* @param theStatus the the status
* @param limit the limit
* @param offset the offset
* @param filters the filters
* @param sortForField the sort for field
* @return the source array of items for status
* @throws WebApplicationException the web application exception
* @throws MalformedURLException the malformed URL exception
* @throws InvalidObjectException the invalid object exception
*/
protected org.json.simple.JSONArray getSourceArrayOfItemsForStatus(ItemStatus theStatus, int limit, int offset,
Map<String, String> filters, String sortForField) throws WebApplicationException, MalformedURLException, InvalidObjectException {
LOG.info("called getSourceArrayOfItemsForStatus with [status: " + theStatus + "], [limit: " + limit
+ "], [offset: " + offset + "], [filters: " + filters + "]");
checkNotNull(theStatus);
// TODO MUST BE CHANGED FOR THE STATUS
org.json.simple.JSONArray jsonArray = null;
/*
* String datasetNames = null; if(theStatus.equals(ItemStatus.PUBLISHED)) {
* datasetNames = gCatCaller.getListItems(limit, offset); }else { CMItemStatus
* cmiStatus = toCMStatus(theStatus); datasetNames =
* gCatCaller.getListItemsForCMStatus(cmiStatus, limit, offset); }
*/
CMItemStatus cmiStatus = toCMStatus(theStatus);
String datasetNames = gCatCaller.getListItemsForCMStatus(cmiStatus, limit, offset, filters, sortForField);
if (datasetNames != null) {
LOG.debug("for status " + theStatus + " found dataset: " + datasetNames);
JSONParser parser = new JSONParser();
try {
jsonArray = (JSONArray) parser.parse(datasetNames);
} catch (ParseException e) {
LOG.error("error occurred reading " + datasetNames + " as JSONArray", e);
throw new InvalidObjectException(e.getMessage());
}
}
return jsonArray;
}
/**
* To CM status.
*
* @param theStatus the the status
* @return the CM item status
* @throws WebApplicationException the web application exception
*/
private CMItemStatus toCMStatus(ItemStatus theStatus) throws WebApplicationException {
try {
return CMItemStatus.valueOf(theStatus.name());
} catch (Exception e) {
throw new WebApplicationException(
"No value of " + theStatus.name() + " into enumerator: " + CMItemStatus.values());
}
}
}

View File

@ -96,15 +96,16 @@ public class GCubeUtils {
/** /**
* Detect the OrgName contexts (token and scope) if the working context (in the thread) is a root VO or VO and switch to it according to setInThread parameters * Detect the organizationName context (token and scope of VRE).
* If the working context (in the thread) is a root VO or VO and setInThread is true then switch to VRE context (setting ScopeProvider and SecurityTokenProvider)
* *
* @param organizationName the organization name to switch to * @param organizationName the organization name to switch to
* @param username the username * @param username the username
* @param setInThread set in the target token (in the {@link SecurityTokenProvider}) and the scope (in the {@link ScopeProvider}) detected for the OrgName * @param setInThread if true set the target token (in the {@link SecurityTokenProvider}) and the scope (in the {@link ScopeProvider}) detected for the OrgName
* @return the gcube context * @return the gcube context with source scope/token and target (detected for organizationName) scope/token
* @throws Exception the exception * @throws Exception the exception
*/ */
public static GcubeContext detectTheOrgNameContexts(String organizationName, String username, boolean setInThread) throws Exception { public static GcubeContext detectAndSetTheOrgNameContext(String organizationName, String username, boolean setInThread) throws Exception {
String scope = ScopeProvider.instance.get(); String scope = ScopeProvider.instance.get();
String token = SecurityTokenProvider.instance.get(); String token = SecurityTokenProvider.instance.get();

View File

@ -0,0 +1,113 @@
package org.gcube.datacatalogue.utillibrary.shared;
import java.io.Serializable;
import java.util.Set;
public class GCatCatalogueConfiguration implements Serializable {
/**
*
*/
private static final long serialVersionUID = -1250433017161647236L;
private String context;
private String defaultOrganization;
private Set<String> supportedOrganizations;
private String ckanURL;
private String solrURL;
private boolean socialPostEnabled;
private boolean notificationToUsersEnabled;
private boolean moderationEnabled;
public GCatCatalogueConfiguration() {
}
public String getContext() {
return context;
}
public String getDefaultOrganization() {
return defaultOrganization;
}
public Set<String> getSupportedOrganizations() {
return supportedOrganizations;
}
public String getCkanURL() {
return ckanURL;
}
public String getSolrURL() {
return solrURL;
}
public boolean isSocialPostEnabled() {
return socialPostEnabled;
}
public boolean isNotificationToUsersEnabled() {
return notificationToUsersEnabled;
}
public boolean isModerationEnabled() {
return moderationEnabled;
}
public void setContext(String context) {
this.context = context;
}
public void setDefaultOrganization(String defaultOrganization) {
this.defaultOrganization = defaultOrganization;
}
public void setSupportedOrganizations(Set<String> supportedOrganizations) {
this.supportedOrganizations = supportedOrganizations;
}
public void setCkanURL(String ckanURL) {
this.ckanURL = ckanURL;
}
public void setSolrURL(String solrURL) {
this.solrURL = solrURL;
}
public void setSocialPostEnabled(boolean socialPostEnabled) {
this.socialPostEnabled = socialPostEnabled;
}
public void setNotificationToUsersEnabled(boolean notificationToUsersEnabled) {
this.notificationToUsersEnabled = notificationToUsersEnabled;
}
public void setModerationEnabled(boolean moderationEnabled) {
this.moderationEnabled = moderationEnabled;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("GCatCatalogueConfiguration [context=");
builder.append(context);
builder.append(", defaultOrganization=");
builder.append(defaultOrganization);
builder.append(", supportedOrganizations=");
builder.append(supportedOrganizations);
builder.append(", ckanURL=");
builder.append(ckanURL);
builder.append(", solrURL=");
builder.append(solrURL);
builder.append(", socialPostEnabled=");
builder.append(socialPostEnabled);
builder.append(", notificationToUsersEnabled=");
builder.append(notificationToUsersEnabled);
builder.append(", moderationEnabled=");
builder.append(moderationEnabled);
builder.append("]");
return builder.toString();
}
}

View File

@ -0,0 +1,48 @@
package org.gcube.datacatalogue.utillibrary.shared;
/**
* The Enum ItemStatus.
*
* @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it
*
* Feb 17, 2022
*/
public enum ItemStatus {
PENDING("pending", "Pending"), APPROVED("approved", "Approved"), REJECTED("rejected", "Rejected");
// Published means that the item is published in the Catalogue, no status is checked,
// the "simple" get list of items is called
//PUBLISHED("published", "Published");
private String id;
private String label;
/**
* Instantiates a new item status.
*
* @param id the id
* @param label the label
*/
private ItemStatus(String id, String label) {
this.id = id;
this.label = label;
}
/**
* Gets the id.
*
* @return the id
*/
public String getId() {
return id;
}
/**
* Gets the label.
*
* @return the label
*/
public String getLabel() {
return label;
}
}

View File

@ -0,0 +1,160 @@
package org.gcube.datacatalogue.utillibrary.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.datacatalogue.utillibrary.gcat.GCatCaller;
import org.gcube.datacatalogue.utillibrary.server.DataCatalogueFactory;
import org.gcube.datacatalogue.utillibrary.server.DataCatalogueImpl;
import org.gcube.datacatalogue.utillibrary.server.cms.CatalogueContentModeratorSystem;
import org.gcube.datacatalogue.utillibrary.shared.ItemStatus;
import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanDataset;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.LoggerFactory;
/**
* The Class TestDataCatalogueLib.
*
* @author Francesco Mangiacrapa at ISTI-CNR Pisa (Italy) Jun 1, 2020
*/
public class TestDataCatalogueCMS {
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(TestDataCatalogueCMS.class);
private DataCatalogueFactory factory;
private String scope = "/gcube/devsec/devVRE";
private String testUser = "francesco.mangiacrapa";
private String authorizationToken = "";
/**
* Before.
*
* @throws Exception the exception
*/
@Before
public void before() throws Exception {
factory = DataCatalogueFactory.getFactory();
}
/**
* Factory test.
*
* @throws Exception the exception
*/
// @Test
public void contentModeratorTest() throws Exception {
ScopeProvider.instance.set(scope);
SecurityTokenProvider.instance.set(authorizationToken);
DataCatalogueFactory factory = DataCatalogueFactory.getFactory();
DataCatalogueImpl dImpl = factory.getUtilsPerScope(scope);
CatalogueContentModeratorSystem cCMS = dImpl.getCatalogueContentModerator();
LOG.debug(CatalogueContentModeratorSystem.class.getName() + " instancied correclty");
}
// @Test
public void listItemsForCMStatus() throws Exception {
ItemStatus theStatus = ItemStatus.PENDING;
ScopeProvider.instance.set(scope);
SecurityTokenProvider.instance.set(authorizationToken);
DataCatalogueImpl dImpl = factory.getUtilsPerScope(scope);
CatalogueContentModeratorSystem cCMS = dImpl.getCatalogueContentModerator();
LOG.debug(CatalogueContentModeratorSystem.class.getName() + " instancied correclty");
List<String> emailsAddresses = new ArrayList<String>();
// emailsAddresses.add("luca.frosini@isti.cnr.it");
emailsAddresses.add("francesco.mangiacrapa@isti.cnr.it");
// emailsAddresses.add("pagano@cnr.it");
String theQuery = mockQueryForEmails(emailsAddresses, "OR");
Map<String, String> filters = new HashMap<String, String>();
filters.put("author_email", theQuery);
List<CkanDataset> listItems = cCMS.getListItemsForStatus(theStatus, 10, 0, filters, GCatCaller.DEFAULT_SORT_VALUE);
int i = 0;
for (CkanDataset ckanDataset : listItems) {
System.out.println(++i + ") item returned: " + ckanDataset);
}
}
/**
* Gets the scope per url.
*
* @return the scope per url
* @throws Exception
*/
@Test
public void countListItemsForStatus() throws Exception {
try {
ItemStatus theStatus = ItemStatus.APPROVED;
ScopeProvider.instance.set(scope);
SecurityTokenProvider.instance.set(authorizationToken);
DataCatalogueImpl dImpl = factory.getUtilsPerScope(scope);
CatalogueContentModeratorSystem cCMS = dImpl.getCatalogueContentModerator();
LOG.debug(CatalogueContentModeratorSystem.class.getName() + " instancied correclty");
List<String> emailsAddresses = new ArrayList<String>();
//emailsAddresses.add("luca.frosini@isti.cnr.it");
//emailsAddresses.add("francesco.mangiacrapa@isti.cnr.it");
//emailsAddresses.add("pagano@cnr.it");
String theQuery = mockQueryForEmails(emailsAddresses, "OR");
Map<String, String> filters = new HashMap<String, String>();
filters.put("author_email", theQuery);
long size = cCMS.countListItemsForStatus(theStatus, filters);
LOG.debug("Size of list of items for status " + theStatus + " is: " + size);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String mockQueryForEmails(List<String> emailsAddresses, String queryOperator) throws Exception {
StringBuilder queryMails = new StringBuilder();
if (queryOperator == null)
queryOperator = "OR";
// BUILDING EMAILS QUERY
int numberOfEmails = emailsAddresses.size();
String theQuery = "";
// case 1 email address
if (numberOfEmails == 1) {
theQuery = "'" + emailsAddresses.get(0) + "'";
} else {
// case N > 1 email addresses
for (int i = 0; i < emailsAddresses.size() - 1; i++) {
String email = emailsAddresses.get(i);
if (i == 0) {
// opening the query and adding first email address
queryMails.append("('" + email + "'");
} else {
// adding the operator and the email address
queryMails.append(" " + queryOperator + " '" + email + "'");
}
}
theQuery = queryMails.toString();
// to be sure that endsWith Operator
if (!theQuery.endsWith(queryOperator)) {
theQuery += " " + queryOperator + " ";
}
// adding last email address and closing the query
theQuery += "'" + emailsAddresses.get(numberOfEmails - 1) + "')";
}
return theQuery;
}
}

View File

@ -1,6 +1,5 @@
package org.gcube.datacatalogue.utillibrary.test; package org.gcube.datacatalogue.utillibrary.test;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
@ -12,6 +11,7 @@ import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.datacatalogue.utillibrary.ckan.MarshUnmarshCkanObject; import org.gcube.datacatalogue.utillibrary.ckan.MarshUnmarshCkanObject;
import org.gcube.datacatalogue.utillibrary.ckan.MarshUnmarshCkanObject.METHOD; import org.gcube.datacatalogue.utillibrary.ckan.MarshUnmarshCkanObject.METHOD;
import org.gcube.datacatalogue.utillibrary.gcat.GCatCaller;
import org.gcube.datacatalogue.utillibrary.server.ApplicationProfileScopePerUrlReader; import org.gcube.datacatalogue.utillibrary.server.ApplicationProfileScopePerUrlReader;
import org.gcube.datacatalogue.utillibrary.server.DataCatalogueFactory; import org.gcube.datacatalogue.utillibrary.server.DataCatalogueFactory;
import org.gcube.datacatalogue.utillibrary.server.DataCatalogueImpl; import org.gcube.datacatalogue.utillibrary.server.DataCatalogueImpl;
@ -24,13 +24,10 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** /**
* The Class TestDataCatalogueLib. * The Class TestDataCatalogueLib.
* *
* @author Francesco Mangiacrapa at ISTI-CNR Pisa (Italy) * @author Francesco Mangiacrapa at ISTI-CNR Pisa (Italy) Jun 1, 2020
* Jun 1, 2020
*/ */
public class TestDataCatalogueLib { public class TestDataCatalogueLib {
@ -38,11 +35,13 @@ public class TestDataCatalogueLib {
private DataCatalogueFactory factory; private DataCatalogueFactory factory;
private String scope = "/gcube/devsec/devVRE"; private String scope = "/gcube/devsec/devVRE";
//private String scope = "/gcube"; // private String scope = "/gcube";
//private String scope = "/pred4s/preprod/preVRE"; // private String scope = "/pred4s/preprod/preVRE";
//private String scope = "/d4science.research-infrastructures.eu/SoBigData/Catalogue-TerritoriAperti"; // private String scope =
//private String scope = "/d4science.research-infrastructures.eu/gCubeApps/BiodiversityLab"; // "/d4science.research-infrastructures.eu/SoBigData/Catalogue-TerritoriAperti";
//private String testUser = "costantino_perciante"; // private String scope =
// "/d4science.research-infrastructures.eu/gCubeApps/BiodiversityLab";
// private String testUser = "costantino_perciante";
private String testUser = "francesco.mangiacrapa"; private String testUser = "francesco.mangiacrapa";
private String authorizationToken = ""; private String authorizationToken = "";
String subjectId = "aa_father4"; String subjectId = "aa_father4";
@ -54,24 +53,24 @@ public class TestDataCatalogueLib {
* *
* @throws Exception the exception * @throws Exception the exception
*/ */
//@Before // @Before
public void before() throws Exception{ public void before() throws Exception {
factory = DataCatalogueFactory.getFactory(); factory = DataCatalogueFactory.getFactory();
} }
/** /**
* Factory test. * Factory test.
* *
* @throws Exception the exception * @throws Exception the exception
*/ */
//@Test // @Test
public void factoryTest() throws Exception{ public void factoryTest() throws Exception {
DataCatalogueFactory factory = DataCatalogueFactory.getFactory(); DataCatalogueFactory factory = DataCatalogueFactory.getFactory();
while(true){ while (true) {
factory.getUtilsPerScope(scope); factory.getUtilsPerScope(scope);
Thread.sleep(60* 1000 * 3); Thread.sleep(60 * 1000 * 3);
factory.getUtilsPerScope(scope); factory.getUtilsPerScope(scope);
break; break;
} }
@ -82,14 +81,14 @@ public class TestDataCatalogueLib {
} }
} }
/** /**
* Gets the scope per url. * Gets the scope per url.
* *
* @return the scope per url * @return the scope per url
*/ */
//@Test // @Test
public void getScopePerUrl(){ public void getScopePerUrl() {
ScopeProvider.instance.set(scope); ScopeProvider.instance.set(scope);
String url = "https://dev2.d4science.org/group/devvre/ckan"; String url = "https://dev2.d4science.org/group/devvre/ckan";
@ -101,16 +100,15 @@ public class TestDataCatalogueLib {
String scopeToUse2 = ApplicationProfileScopePerUrlReader.getScopePerUrl(url2); String scopeToUse2 = ApplicationProfileScopePerUrlReader.getScopePerUrl(url2);
LOG.debug("Retrieved scope is " + scopeToUse2); LOG.debug("Retrieved scope is " + scopeToUse2);
} }
/** /**
* Gets the user role by group. * Gets the user role by group.
* *
* @return the user role by group * @return the user role by group
* @throws Exception the exception * @throws Exception the exception
*/ */
//@Test // @Test
public void getUserRoleByGroup() throws Exception{ public void getUserRoleByGroup() throws Exception {
DataCatalogueImpl instance = factory.getUtilsPerScope(scope); DataCatalogueImpl instance = factory.getUtilsPerScope(scope);
String username = testUser; String username = testUser;
long init = System.currentTimeMillis(); long init = System.currentTimeMillis();
@ -118,30 +116,29 @@ public class TestDataCatalogueLib {
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
LOG.debug("Time taken " + (end - init)); LOG.debug("Time taken " + (end - init));
} }
/** /**
* Gets the user role by group. * Gets the user role by group.
* *
* @return the user role by group * @return the user role by group
* @throws Exception the exception * @throws Exception the exception
*/ */
//@Test // @Test
public void getDataset() throws Exception{ public void getDataset() throws Exception {
DataCatalogueImpl instance = factory.getUtilsPerScope(scope); DataCatalogueImpl instance = factory.getUtilsPerScope(scope);
String username = testUser; String username = testUser;
CkanDataset dataset = instance.getDataset("my_first_restful_transaction_model_private", username); CkanDataset dataset = instance.getDataset("my_first_restful_transaction_model_private", username);
LOG.debug("Got dataset: " +dataset.getName() + ", with id: "+dataset.getId()); LOG.debug("Got dataset: " + dataset.getName() + ", with id: " + dataset.getId());
} }
/** /**
* Gets the user role by organization. * Gets the user role by organization.
* *
* @return the user role by organization * @return the user role by organization
* @throws Exception the exception * @throws Exception the exception
*/ */
//@Test // @Test
public void getUserRoleByOrganization() throws Exception{ public void getUserRoleByOrganization() throws Exception {
DataCatalogueImpl instance = factory.getUtilsPerScope(scope); DataCatalogueImpl instance = factory.getUtilsPerScope(scope);
String username = testUser; String username = testUser;
long init = System.currentTimeMillis(); long init = System.currentTimeMillis();
@ -149,169 +146,155 @@ public class TestDataCatalogueLib {
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
LOG.debug("Time taken " + (end - init)); LOG.debug("Time taken " + (end - init));
} }
//@Test // @Test
public void getRoleOfUserInOrganization() throws Exception{ public void getRoleOfUserInOrganization() throws Exception {
String orgName = "devvre"; String orgName = "devvre";
DataCatalogueImpl utils = factory.getUtilsPerScope(scope); DataCatalogueImpl utils = factory.getUtilsPerScope(scope);
CkanOrganization org = utils.getOrganizationByIdOrName(orgName); CkanOrganization org = utils.getOrganizationByIdOrName(orgName);
String role = utils.getRoleOfUserInOrganization(testUser, org.getName()); String role = utils.getRoleOfUserInOrganization(testUser, org.getName());
LOG.debug("The user "+testUser+" in the org "+org.getName() + " has the role "+role); LOG.debug("The user " + testUser + " in the org " + org.getName() + " has the role " + role);
} }
//@Test // @Test
public void getOrganizationForName() throws Exception{ public void getOrganizationForName() throws Exception {
String orgName = "devvre"; String orgName = "devvre";
DataCatalogueImpl utils = factory.getUtilsPerScope(scope); DataCatalogueImpl utils = factory.getUtilsPerScope(scope);
CkanOrganization org = utils.getOrganizationByIdOrName(orgName); CkanOrganization org = utils.getOrganizationByIdOrName(orgName);
LOG.debug("The "+CkanOrganization.class.getSimpleName()+" is: "+org.getName()); LOG.debug("The " + CkanOrganization.class.getSimpleName() + " is: " + org.getName());
LOG.debug("LandingPages of "+CkanOrganization.class.getSimpleName()+" for name " + utils.getLandingPages()); LOG.debug("LandingPages of " + CkanOrganization.class.getSimpleName() + " for name " + utils.getLandingPages());
if(org.getUsers()!=null) { if (org.getUsers() != null) {
for (CkanUser user : org.getUsers()) { for (CkanUser user : org.getUsers()) {
LOG.debug("User: "+user.getName()); LOG.debug("User: " + user.getName());
} }
} }
} }
//@Test // @Test
public void getOrganizationsNamesByUser() throws Exception{ public void getOrganizationsNamesByUser() throws Exception {
DataCatalogueImpl utils = factory.getUtilsPerScope(scope); DataCatalogueImpl utils = factory.getUtilsPerScope(scope);
List<CkanOrganization> listOrgs = utils.getOrganizationsByUser(testUser); List<CkanOrganization> listOrgs = utils.getOrganizationsByUser(testUser);
LOG.debug("User :"+testUser+" found in the Organization/s:"); LOG.debug("User :" + testUser + " found in the Organization/s:");
for (CkanOrganization ckanOrganization : listOrgs) { for (CkanOrganization ckanOrganization : listOrgs) {
LOG.debug("Org: "+ckanOrganization.getName()); LOG.debug("Org: " + ckanOrganization.getName());
} }
}
//@Test
public void getGroupsNamesByUser() throws Exception{
DataCatalogueImpl utils = factory.getUtilsPerScope(scope);
List<CkanGroup> listGroups = utils.getGroupsByUser(testUser);
LOG.debug("User :"+testUser+" found in the Group/s:");
for (CkanGroup ckanGroup : listGroups) {
LOG.debug("Group: "+ckanGroup.getName());
}
} }
//@Test // @Test
public void getLandingPages() throws Exception{ public void getGroupsNamesByUser() throws Exception {
DataCatalogueImpl utils = factory.getUtilsPerScope(scope);
List<CkanGroup> listGroups = utils.getGroupsByUser(testUser);
LOG.debug("User :" + testUser + " found in the Group/s:");
for (CkanGroup ckanGroup : listGroups) {
LOG.debug("Group: " + ckanGroup.getName());
}
}
// @Test
public void getLandingPages() throws Exception {
DataCatalogueImpl utils = factory.getUtilsPerScope(scope); DataCatalogueImpl utils = factory.getUtilsPerScope(scope);
LOG.debug("Landing pages " + utils.getLandingPages()); LOG.debug("Landing pages " + utils.getLandingPages());
} }
//@Test // @Test
public void countDatasetForOganization() throws Exception{ public void countDatasetForOganization() throws Exception {
DataCatalogueImpl utils = new DataCatalogueImpl(scope,true); DataCatalogueImpl utils = new DataCatalogueImpl(scope, true);
List<String> listOrgIds = utils.getOrganizationsIds(); List<String> listOrgIds = utils.getOrganizationsIds();
System.out.println("'ORGANIZATION NAME': 'NUMBER OF PACKAGE'"); System.out.println("'ORGANIZATION NAME': 'NUMBER OF PACKAGE'");
for (String orgID : listOrgIds) { for (String orgID : listOrgIds) {
CkanOrganization org = utils.getOrganizationByIdOrName(orgID); CkanOrganization org = utils.getOrganizationByIdOrName(orgID);
int packageCount = org.getPackageCount(); int packageCount = org.getPackageCount();
//logger.info("ORG: "+org.getName() + " has "+packageCount+ " package/s"); // logger.info("ORG: "+org.getName() + " has "+packageCount+ " package/s");
System.out.println(org.getName()+": "+packageCount); System.out.println(org.getName() + ": " + packageCount);
} }
} }
//@Test // @Test
public void createDataset() throws Exception{ public void createDataset() throws Exception {
try { try {
ScopeProvider.instance.set(scope); ScopeProvider.instance.set(scope);
SecurityTokenProvider.instance.set(authorizationToken); SecurityTokenProvider.instance.set(authorizationToken);
DataCatalogueImpl instance = factory.getUtilsPerScope(scope); DataCatalogueImpl instance = factory.getUtilsPerScope(scope);
String licenseId = instance.getLicenses().get(0).getId(); String licenseId = instance.getLicenses().get(0).getId();
Map<String, List<String>> customFieldsMultiple = new HashMap<String, List<String>>(); Map<String, List<String>> customFieldsMultiple = new HashMap<String, List<String>>();
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
List<String> values = new ArrayList<String>(); List<String> values = new ArrayList<String>();
for (int j = 0; j < new Random().nextInt(3); j++) { for (int j = 0; j < new Random().nextInt(3); j++) {
values.add("value-random-"+ new Random().nextInt(10)); values.add("value-random-" + new Random().nextInt(10));
} }
customFieldsMultiple.put("key-random-"+new Random().nextInt(10), values); customFieldsMultiple.put("key-random-" + new Random().nextInt(10), values);
} }
customFieldsMultiple.put("empty-key", Arrays.asList("")); customFieldsMultiple.put("empty-key", Arrays.asList(""));
customFieldsMultiple.put("system:type", Arrays.asList("EmptyProfile")); customFieldsMultiple.put("system:type", Arrays.asList("EmptyProfile"));
boolean setSearchable = true; boolean setSearchable = true;
boolean setPublic = true; boolean setPublic = true;
List<ResourceBean> resources = null; List<ResourceBean> resources = null;
String orgName = scope.split("/")[3].toLowerCase(); String orgName = scope.split("/")[3].toLowerCase();
//System.out.println("Org name by VRE: "+orgName); // System.out.println("Org name by VRE: "+orgName);
LOG.debug("Org name by VRE: "+orgName); LOG.debug("Org name by VRE: " + orgName);
int random = new Random().nextInt(); int random = new Random().nextInt();
String datasetTitle = "a dataset created by catalogue-util-library "+random; String datasetTitle = "a dataset created by catalogue-util-library " + random;
String datasetName = datasetTitle.replace(" ", ""); String datasetName = datasetTitle.replace(" ", "");
String createdDataset = instance.createCkanDatasetMultipleCustomFields( String createdDataset = instance.createCkanDatasetMultipleCustomFields(testUser,
testUser, "a dataset created by catalogue-util-library " + random, datasetName, orgName, testUser, null, null,
"a dataset created by catalogue-util-library "+random, null, 1, "the description", licenseId, Arrays.asList("tag 1", "tag 2", "tag 3"),
datasetName, customFieldsMultiple, resources, setPublic, setSearchable, true);
orgName,
testUser, LOG.info("Created the dataset with id: " + createdDataset);
null, } catch (Exception e) {
null,
null,
1,
"the description",
licenseId,
Arrays.asList("tag 1","tag 2","tag 3"),
customFieldsMultiple,
resources,
setPublic,
setSearchable,
true);
LOG.info("Created the dataset with id: " +createdDataset);
}catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
//@Test // @Test
public void createGroup() throws Exception{ public void createGroup() throws Exception {
ScopeProvider.instance.set(scope); ScopeProvider.instance.set(scope);
SecurityTokenProvider.instance.set(authorizationToken); SecurityTokenProvider.instance.set(authorizationToken);
DataCatalogueImpl instance = factory.getUtilsPerScope(scope); DataCatalogueImpl instance = factory.getUtilsPerScope(scope);
int random = new Random().nextInt(); int random = new Random().nextInt();
String groupTitle = "a grop created by catalogue-util-library "+random; String groupTitle = "a grop created by catalogue-util-library " + random;
String groupName = groupTitle.replace(" ", ""); String groupName = groupTitle.replace(" ", "");
CkanGroup ckanGroup = instance.createGroup(groupName, groupTitle, "description"); CkanGroup ckanGroup = instance.createGroup(groupName, groupTitle, "description");
LOG.info("Created the group: "+ckanGroup); LOG.info("Created the group: " + ckanGroup);
} }
//@Test // @Test
public void addResource() throws Exception { public void addResource() throws Exception {
ScopeProvider.instance.set(scope); ScopeProvider.instance.set(scope);
@ -323,11 +306,11 @@ public class TestDataCatalogueLib {
for (int i = 1; i < 3; i++) { for (int i = 1; i < 3; i++) {
ResourceBean resourceBean = new ResourceBean("https://data-dev.d4science.net/ie8Y", "resouce " + i, ResourceBean resourceBean = new ResourceBean("https://data-dev.d4science.net/ie8Y", "resouce " + i,
"description " + i, null, testUser, dataset.getId(), null); "description " + i, null, testUser, dataset.getId(), null);
instance.addResourceToDataset(resourceBean,testUser,dataset.getOrganization().getName()); instance.addResourceToDataset(resourceBean, testUser, dataset.getOrganization().getName());
} }
} }
//@Test // @Test
public void deleteResource() throws Exception { public void deleteResource() throws Exception {
ScopeProvider.instance.set(scope); ScopeProvider.instance.set(scope);
@ -337,43 +320,46 @@ public class TestDataCatalogueLib {
String resourceId = "ce7295cf-47db-4faf-901f-4fec2d3fae7a"; String resourceId = "ce7295cf-47db-4faf-901f-4fec2d3fae7a";
boolean deleted = instance.deleteResourceFromDataset(resourceId, testUser); boolean deleted = instance.deleteResourceFromDataset(resourceId, testUser);
LOG.info("Deleted the resource? "+deleted); LOG.info("Deleted the resource? " + deleted);
} }
//@Test // @Test
public void patchFieldsForDataset() throws Exception{ public void patchFieldsForDataset() throws Exception {
ScopeProvider.instance.set(scope); ScopeProvider.instance.set(scope);
SecurityTokenProvider.instance.set(authorizationToken); SecurityTokenProvider.instance.set(authorizationToken);
DataCatalogueImpl instance = factory.getUtilsPerScope(scope); DataCatalogueImpl instance = factory.getUtilsPerScope(scope);
Map<String, String> customFieldsToChange = new HashMap<String, String>(); Map<String, String> customFieldsToChange = new HashMap<String, String>();
customFieldsToChange.put("key-random-0", "patched"); customFieldsToChange.put("key-random-0", "patched");
instance.patchFieldsForDataset(productName, customFieldsToChange); instance.patchFieldsForDataset(productName, customFieldsToChange);
} }
//@Test // @Test
public void getUrlProduct() throws Exception{ public void getUrlProduct() throws Exception {
ScopeProvider.instance.set(scope); ScopeProvider.instance.set(scope);
SecurityTokenProvider.instance.set(authorizationToken); SecurityTokenProvider.instance.set(authorizationToken);
DataCatalogueImpl instance = factory.getUtilsPerScope(scope); DataCatalogueImpl instance = factory.getUtilsPerScope(scope);
String datasetName = productName; String datasetName = productName;
String url = instance.getUnencryptedUrlFromDatasetIdOrName(datasetName); String url = instance.getUnencryptedUrlFromDatasetIdOrName(datasetName);
LOG.debug("url is " + url); LOG.debug("url is " + url);
} }
//@Test // @Test
public void marshallingDataset() throws Exception{ public void marshallingDataset() throws Exception {
DataCatalogueImpl instance = factory.getUtilsPerScope(scope); DataCatalogueImpl instance = factory.getUtilsPerScope(scope);
String username = testUser; String username = testUser;
CkanDataset dataset = instance.getDataset("sarda-sarda", username); CkanDataset dataset = instance.getDataset("sarda-sarda", username);
LOG.debug("Got dataset: " +dataset.getName() + ", with id: "+dataset.getId() +" is private: "+dataset.isPriv()); LOG.debug("Got dataset: " + dataset.getName() + ", with id: " + dataset.getId() + " is private: "
String jsonValueDataset = MarshUnmarshCkanObject.toJsonValueDataset(dataset,METHOD.TO_CREATE); + dataset.isPriv());
String jsonValueDataset = MarshUnmarshCkanObject.toJsonValueDataset(dataset, METHOD.TO_CREATE);
System.out.println(jsonValueDataset); System.out.println(jsonValueDataset);
dataset = MarshUnmarshCkanObject.toCkanDataset(jsonValueDataset, METHOD.TO_READ); dataset = MarshUnmarshCkanObject.toCkanDataset(jsonValueDataset, METHOD.TO_READ);
System.out.println(dataset); System.out.println(dataset);
} }
} }