Merge pull request 'edit_facility_26115' (!6) from edit_facility_26115 into master

Reviewed-on: #6
This commit is contained in:
Francesco Mangiacrapa 2024-03-19 10:13:13 +01:00
commit 82a3306369
9 changed files with 644 additions and 417 deletions

View File

@ -4,6 +4,15 @@
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.4.0-SNAPSHOT] - 2024-02-08
**Enhancements**
- Added method update item [#26640]
- Added method deleteDataset [#26793]
- Added method getListExtrasAsHashMap - D4Science model compliant
## [v1.3.0] - 2023-02-06 ## [v1.3.0] - 2023-02-06
**Enhancements** **Enhancements**

View File

@ -6,13 +6,13 @@
<parent> <parent>
<artifactId>maven-parent</artifactId> <artifactId>maven-parent</artifactId>
<groupId>org.gcube.tools</groupId> <groupId>org.gcube.tools</groupId>
<version>1.1.0</version> <version>1.2.0</version>
<relativePath /> <relativePath />
</parent> </parent>
<groupId>org.gcube.datacatalogue</groupId> <groupId>org.gcube.datacatalogue</groupId>
<artifactId>catalogue-util-library</artifactId> <artifactId>catalogue-util-library</artifactId>
<version>1.3.0</version> <version>1.4.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

View File

@ -10,6 +10,7 @@ import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanDataset;
import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanGroup; import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanGroup;
import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanLicense; import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanLicense;
import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanOrganization; import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanOrganization;
import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanResource;
/** /**
* The Interface DataCatalogue. * The Interface DataCatalogue.
@ -332,6 +333,35 @@ public interface DataCatalogue {
List<ResourceBean> resources, boolean setPublic, boolean setSearchable, boolean socialPost) List<ResourceBean> resources, boolean setPublic, boolean setSearchable, boolean socialPost)
throws Exception; throws Exception;
/**
* Update ckan dataset multiple custom fields.
*
* @param username the username
* @param title the title
* @param name the name
* @param organizationName the organization name
* @param author the author
* @param authorMail the author mail
* @param maintainer the maintainer
* @param maintainerMail the maintainer mail
* @param version the version
* @param description the description
* @param licenseId the license id
* @param tags the tags
* @param customFieldsMultiple the custom fields multiple
* @param resources the resources
* @param setPublic the set public
* @param setSearchable the set searchable
* @param socialPost the social post
* @return the string
* @throws Exception the exception
*/
String updateCkanDatasetMultipleCustomFields(String username, String title, String name, String organizationName,
String author, String authorMail, String maintainer, String maintainerMail, long version,
String description, String licenseId, List<String> tags, Map<String, List<String>> customFieldsMultiple,
List<ResourceBean> resources, boolean setPublic, boolean setSearchable, boolean socialPost)
throws Exception;
/** /**
* Add a resource described by the bean to the dataset id into * Add a resource described by the bean to the dataset id into
* resource.datasetId * resource.datasetId
@ -344,6 +374,19 @@ public interface DataCatalogue {
*/ */
String addResourceToDataset(ResourceBean resourceBean, String organizationName, String username) throws Exception; String addResourceToDataset(ResourceBean resourceBean, String organizationName, String username) throws Exception;
/**
* Adds the resource.
*
* @param resourceBean the resource bean
* @param datasetId the dataset id
* @param organizationName the organization name
* @param username the username
* @return the ckan resource
* @throws Exception the exception
*/
CkanResource addResource(ResourceBean resourceBean, String datasetId, String organizationName, String username)
throws Exception;
/** /**
* Remove the resource with id resourceId from dataset in which it is. * Remove the resource with id resourceId from dataset in which it is.
* *
@ -419,6 +462,15 @@ public interface DataCatalogue {
*/ */
String refreshDataset(String datasetName) throws Exception; String refreshDataset(String datasetName) throws Exception;
/**
* Delete dataset.
*
* @param datasetName the dataset name
* @return true, if successful
* @throws Exception the exception
*/
boolean deleteDataset(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.

View File

@ -866,7 +866,7 @@ public class DataCatalogueImpl implements DataCatalogue {
// in order to avoid errors, the username is always converted // in order to avoid errors, the username is always converted
String ckanUsername = CatalogueUtilMethods.fromUsernameToCKanUsername(username); String ckanUsername = CatalogueUtilMethods.fromUsernameToCKanUsername(username);
LOG.debug("username: "+username + " converted to ckanUsername: "+ckanUsername); LOG.debug("username: " + username + " converted to ckanUsername: " + ckanUsername);
// check in the hashmap first // check in the hashmap first
if (apiKeysMap.containsKey(ckanUsername)) { if (apiKeysMap.containsKey(ckanUsername)) {
@ -1305,7 +1305,7 @@ public class DataCatalogueImpl implements DataCatalogue {
if (jsonValueDataset != null) { if (jsonValueDataset != null) {
CkanDataset toCkanDataset = MarshUnmarshCkanObject.toCkanDataset(jsonValueDataset, METHOD.TO_READ); CkanDataset toCkanDataset = MarshUnmarshCkanObject.toCkanDataset(jsonValueDataset, METHOD.TO_READ);
LOG.info("Dataset with name " + toCkanDataset.getName() + " has been created correctly"); LOG.info("Dataset with name " + toCkanDataset.getName() + " has been correctly created");
return toCkanDataset.getId(); return toCkanDataset.getId();
} }
} catch (Exception e) { } catch (Exception e) {
@ -1320,6 +1320,80 @@ public class DataCatalogueImpl implements DataCatalogue {
return null; return null;
} }
/**
* Update ckan dataset multiple custom fields.
*
* @param username the username
* @param title the title
* @param name the name
* @param organizationName the organization name
* @param author the author
* @param authorMail the author mail
* @param maintainer the maintainer
* @param maintainerMail the maintainer mail
* @param version the version
* @param description the description
* @param licenseId the license id
* @param tags the tags
* @param customFieldsMultiple the custom fields multiple
* @param resources the resources
* @param setPublic the set public
* @param setSearchable the set searchable
* @param socialPost the social post
* @return the string
* @throws Exception the exception
*/
@Override
public String updateCkanDatasetMultipleCustomFields(String username, String title, String name,
String organizationName, String author, String authorMail, String maintainer, String maintainerMail,
long version, String description, String licenseId, List<String> tags,
Map<String, List<String>> customFieldsMultiple, List<ResourceBean> resources, boolean setPublic,
boolean setSearchable, boolean socialPost) throws Exception {
LOG.info("Called updateCkanDatasetMultipleCustomFields");
// checks (minimum)
checkNotNull(username);
// checkNotNull(organizationNameOrId);
// checkArgument(!organizationNameOrId.isEmpty());
checkArgument(!(title == null && name == null || title.isEmpty() && name.isEmpty()),
"Name and Title cannot be empty/null at the same time!");
GcubeContext gcubeContext = null;
try {
gcubeContext = GCubeUtils.detectAndSetTheOrgNameContext(organizationName, username, true);
String toPassOrganizationToGcat = null; // Not needed to pass this information to gCat, never.
// String ckanUsername = getUserFromApiKey(apiKey).getName();
LOG.debug("The visibility parameter passed is (isPublic): " + setPublic);
CkanDataset dataset = CKANConveter.toCkanDataset(ckanCaller, username, title, name,
toPassOrganizationToGcat, author, authorMail, maintainer, maintainerMail, version, description,
licenseId, tags, null, customFieldsMultiple, resources, setPublic, setSearchable);
LOG.debug("The isPriv property into dataset is: " + dataset.isPriv());
// trying to create by gCat
String jsonValueDataset = MarshUnmarshCkanObject.toJsonValueDataset(dataset, METHOD.TO_CREATE);
LOG.info("Serialized dataset to update is: " + jsonValueDataset);
jsonValueDataset = gCatCaller.updateDataset(name, jsonValueDataset);
LOG.debug("Updated dataset is: " + jsonValueDataset);
if (jsonValueDataset != null) {
CkanDataset toCkanDataset = MarshUnmarshCkanObject.toCkanDataset(jsonValueDataset, METHOD.TO_READ);
LOG.info("Dataset with name " + toCkanDataset.getName() + " has been correctly updated");
return toCkanDataset.getId();
}
} catch (Exception e) {
LOG.error("Error on updating the dataset: ", e);
throw e;
} finally {
if (gcubeContext != null)
GCubeUtils.revertToSourceContext(gcubeContext);
}
return null;
}
/** /**
* Refresh dataset. * Refresh dataset.
* *
@ -1360,6 +1434,32 @@ public class DataCatalogueImpl implements DataCatalogue {
return null; return null;
} }
/**
* Delete dataset.
*
* @param datasetName the dataset name
* @return true, if successful
* @throws Exception the exception
*/
@Override
public boolean deleteDataset(String datasetName) throws Exception {
LOG.info("Called deleteDataset");
checkNotNull(datasetName);
boolean deleted = false;
try {
gCatCaller.deleteItem(datasetName, true);
deleted = true;
LOG.info("Deleted the dataset: {} ", datasetName);
return deleted;
} catch (Exception e) {
LOG.error("Error on deleting the dataset: ", e);
throw e;
}
}
/** /**
* Patch fields for dataset. * Patch fields for dataset.
* *
@ -1462,22 +1562,47 @@ public class DataCatalogueImpl implements DataCatalogue {
throws Exception { throws Exception {
LOG.info("Called addResourceToDataset by this bean " + resourceBean); LOG.info("Called addResourceToDataset by this bean " + resourceBean);
CkanResource resource = createResource(resourceBean, organizationName, username);
if (resource != null)
return resource.getId();
return null;
}
/**
* Adds the resource to dataset.
*
* @param resourceBean the resource bean
* @param datasetId the dataset id
* @param organizationName the organization name
* @param username the username
* @return the string
* @throws Exception the exception
*/
@Override
public CkanResource addResource(ResourceBean resourceBean, String datasetId, String organizationName,
String username) throws Exception {
LOG.info("Called addResource by this bean " + resourceBean.getName() + ", datasetId: " + datasetId);
resourceBean.setDatasetId(datasetId);
return createResource(resourceBean, organizationName, username);
}
/**
* Creates the resource.
*
* @param resourceBean the resource bean
* @param organizationName the organization name
* @param username the username
* @return the ckan resource
* @throws Exception the exception
*/
private CkanResource createResource(ResourceBean resourceBean, String organizationName, String username)
throws Exception {
// checks // checks
checkNotNull(resourceBean); checkNotNull(resourceBean);
checkNotNull(resourceBean.getUrl()); checkNotNull(resourceBean.getUrl());
// Commented since #21259
/*
* boolean isAccessibleURL = false; try { isAccessibleURL =
* CatalogueUtilMethods.resourceExists(resourceBean.getUrl()); } catch
* (Exception e) { throw new Exception("It seems the resource at this url " +
* resourceBean.getUrl()+" is not reachable. Error: "+e.getMessage()); }
*
* if(!isAccessibleURL){ throw new
* Exception("It seems there is no resource at this url " +
* resourceBean.getUrl()); }
*/
GcubeContext gcubeContext = null; GcubeContext gcubeContext = null;
try { try {
@ -1496,7 +1621,7 @@ public class DataCatalogueImpl implements DataCatalogue {
if (createdRes != null) { if (createdRes != null) {
LOG.info("Resource with id: " + createdRes.getId() + ", name: " + createdRes.getName() LOG.info("Resource with id: " + createdRes.getId() + ", name: " + createdRes.getName()
+ " added correclty"); + " added correclty");
return createdRes.getId(); return createdRes;
} }
} catch (Exception e) { } catch (Exception e) {
LOG.error("Unable to add the resource " + resourceBean, e); LOG.error("Unable to add the resource " + resourceBean, e);
@ -1507,6 +1632,7 @@ public class DataCatalogueImpl implements DataCatalogue {
} }
return null; return null;
} }
/** /**
@ -1533,7 +1659,17 @@ public class DataCatalogueImpl implements DataCatalogue {
GcubeContext gcubeContext = null; GcubeContext gcubeContext = null;
try { try {
CkanResource theResource = ckanCaller.getResource(resourceId); CkanResource theResource = null;
// Using CKAN API KEY TO READ THE RESOURCE
if (username != null && !username.isEmpty()) {
LOG.info("username found. Calling the " + ExtendCkanClient.class.getSimpleName());
String apiKey = getApiKeyFromUsername(username);
ExtendCkanClient client = new ExtendCkanClient(CKAN_CATALOGUE_URL, apiKey);
theResource = client.getResource(resourceId);
} else {
// GUEST MODE - NO API
theResource = ckanCaller.getResource(resourceId);
}
CkanDataset theDataset = getDataset(theResource.getPackageId(), username); CkanDataset theDataset = getDataset(theResource.getPackageId(), username);

View File

@ -68,8 +68,10 @@ public class CKANConveter {
String ckanUsername = CatalogueUtilMethods.fromUsernameToCKanUsername(username); String ckanUsername = CatalogueUtilMethods.fromUsernameToCKanUsername(username);
String nameToUse = name; String nameToUse = name;
if(nameToUse == null) //Applying normalize function if and only if the paramenter 'name' is null
if(nameToUse == null) {
nameToUse = CatalogueUtilMethods.fromProductTitleToName(title); nameToUse = CatalogueUtilMethods.fromProductTitleToName(title);
}
LOG.debug("Name of the dataset is going to be " + nameToUse + ". Title is going to be " + title); LOG.debug("Name of the dataset is going to be " + nameToUse + ". Title is going to be " + title);

View File

@ -30,17 +30,15 @@ import org.gcube.com.fasterxml.jackson.annotation.JsonAnySetter;
import org.gcube.com.fasterxml.jackson.annotation.JsonIgnore; import org.gcube.com.fasterxml.jackson.annotation.JsonIgnore;
import org.gcube.com.fasterxml.jackson.annotation.JsonProperty; import org.gcube.com.fasterxml.jackson.annotation.JsonProperty;
/** /**
* A Ckan Dataset, which in turn holds Ckan Resources. * A Ckan Dataset, which in turn holds Ckan Resources.
* *
* In Ckan terminology it is also known as 'package'. * In Ckan terminology it is also known as 'package'.
* *
* {@link CkanDatasetBase} holds fields that can be sent when * {@link CkanDatasetBase} holds fields that can be sent when <a href=
* <a href="http://docs.ckan.org/en/latest/api/index.html?#ckan.logic.action.create.package_create" target="_blank">creating * "http://docs.ckan.org/en/latest/api/index.html?#ckan.logic.action.create.package_create"
* a dataset,</a>, while {@link CkanDataset} holds more fields that can be * target="_blank">creating a dataset,</a>, while {@link CkanDataset} holds more
* returned with searches. * fields that can be returned with searches.
* *
* This class initializes nothing to fully preserve all we get from ckan. In * This class initializes nothing to fully preserve all we get from ckan. In
* practice, all fields of retrieved resources can be null except maybe * practice, all fields of retrieved resources can be null except maybe
@ -51,148 +49,148 @@ import org.gcube.com.fasterxml.jackson.annotation.JsonProperty;
*/ */
public class CkanDatasetBase { public class CkanDatasetBase {
private String author; private String author;
private String authorEmail; private String authorEmail;
private List<CkanPair> extras; private List<CkanPair> extras;
private List<CkanGroup> groups; private List<CkanGroup> groups;
private String id; private String id;
private String licenseId; private String licenseId;
private String maintainer; private String maintainer;
private String maintainerEmail; private String maintainerEmail;
private String name; private String name;
private String notes; private String notes;
private String ownerOrg; private String ownerOrg;
private List<CkanDatasetRelationship> relationshipsAsObject; private List<CkanDatasetRelationship> relationshipsAsObject;
private List<CkanDatasetRelationship> relationshipsAsSubject; private List<CkanDatasetRelationship> relationshipsAsSubject;
private List<CkanResource> resources; private List<CkanResource> resources;
private CkanState state; private CkanState state;
private List<CkanTag> tags; private List<CkanTag> tags;
private String title; private String title;
private String type; private String type;
private String url; private String url;
private String version; private String version;
private Boolean priv;
/** private Boolean priv;
* Custom CKAN instances might sometimes gift us with properties that don't
* end up in extras. They will end up here.
*/
@Nullable
private Map<String, Object> others;
public CkanDatasetBase() { /**
} * Custom CKAN instances might sometimes gift us with properties that don't end
* up in extras. They will end up here.
*/
@Nullable
private Map<String, Object> others;
/** public CkanDatasetBase() {
* Constructor with the minimal set of attributes required to successfully }
* create a dataset on the server.
*
* @param name the dataset name (contains no spaces and has dashes as
* separators, i.e. "limestone-pavement-orders")
*/
public CkanDatasetBase(String name) {
this();
this.name = name;
}
/** /**
* CKAN instances might have * Constructor with the minimal set of attributes required to successfully
* <a href="http://docs.ckan.org/en/latest/extensions/adding-custom-fields.html"> * create a dataset on the server.
* custom data schemas</a> that force presence of custom properties among *
* 'regular' ones. In this case, they go to 'others' field. Note that to * @param name the dataset name (contains no spaces and has dashes as
* further complicate things there is also an {@link #getExtras() extras} * separators, i.e. "limestone-pavement-orders")
* field. */
* public CkanDatasetBase(String name) {
* @see #putOthers(java.lang.String, java.lang.Object) this();
*/ this.name = name;
@JsonAnyGetter }
@Nullable
public Map<String, Object> getOthers() {
return others;
}
/** /**
* @see #getOthers() * CKAN instances might have <a href=
* @see #putOthers(java.lang.String, java.lang.Object) * "http://docs.ckan.org/en/latest/extensions/adding-custom-fields.html"> custom
*/ * data schemas</a> that force presence of custom properties among 'regular'
public void setOthers(@Nullable Map<String, Object> others) { * ones. In this case, they go to 'others' field. Note that to further
this.others = others; * complicate things there is also an {@link #getExtras() extras} field.
} *
* @see #putOthers(java.lang.String, java.lang.Object)
*/
@JsonAnyGetter
@Nullable
public Map<String, Object> getOthers() {
return others;
}
/** /**
* See {@link #getOthers()} * @see #getOthers()
* * @see #putOthers(java.lang.String, java.lang.Object)
* @see #setOthers(java.util.Map) */
*/ public void setOthers(@Nullable Map<String, Object> others) {
@JsonAnySetter this.others = others;
public void putOthers(String name, Object value) { }
if (others == null) {
others = new HashMap<>();
}
others.put(name, value);
}
public String getAuthor() { /**
return author; * See {@link #getOthers()}
} *
* @see #setOthers(java.util.Map)
*/
@JsonAnySetter
public void putOthers(String name, Object value) {
if (others == null) {
others = new HashMap<>();
}
others.put(name, value);
}
public void setAuthor(String author) { public String getAuthor() {
this.author = author; return author;
} }
public String getAuthorEmail() { public void setAuthor(String author) {
return authorEmail; this.author = author;
} }
public void setAuthorEmail(String authorEmail) { public String getAuthorEmail() {
this.authorEmail = authorEmail; return authorEmail;
} }
/** public void setAuthorEmail(String authorEmail) {
* Notice that if the dataset was obtained with a this.authorEmail = authorEmail;
* {@link eu.trentorise.opendata.jackan.CkanClient#getDataset(java.lang.String)} call, the returned group }
* won't have all the params you would get with a
* {@link eu.trentorise.opendata.jackan.CkanClient#getGroup(java.lang.String)} call.
*/
public List<CkanGroup> getGroups() {
return groups;
}
public void setGroups(List<CkanGroup> groups) { /**
this.groups = groups; * Notice that if the dataset was obtained with a
} * {@link eu.trentorise.opendata.jackan.CkanClient#getDataset(java.lang.String)}
* call, the returned group won't have all the params you would get with a
* {@link eu.trentorise.opendata.jackan.CkanClient#getGroup(java.lang.String)}
* call.
*/
public List<CkanGroup> getGroups() {
return groups;
}
/** public void setGroups(List<CkanGroup> groups) {
* Adds CkanGroups this.groups = groups;
* }
* @param ckanGroups The CkanGroups elements
*
* @since 0.4.3
*/
public void addGroups(CkanGroup... ckanGroups) {
if (this.groups == null) {
this.groups = new ArrayList<>(ckanGroups.length);
}
Collections.addAll(this.groups, ckanGroups);
}
/** /**
* Regular place where to put custom metadata. See also * Adds CkanGroups
* {@link #getOthers()}. Note also extras can be in CkanDataset but not in *
* CkanResource. * @param ckanGroups The CkanGroups elements
*/ *
public List<CkanPair> getExtras() { * @since 0.4.3
return extras; */
} public void addGroups(CkanGroup... ckanGroups) {
if (this.groups == null) {
this.groups = new ArrayList<>(ckanGroups.length);
}
Collections.addAll(this.groups, ckanGroups);
}
/** /**
* See {@link #getExtras()} * Regular place where to put custom metadata. See also {@link #getOthers()}.
*/ * Note also extras can be in CkanDataset but not in CkanResource.
public void setExtras(List<CkanPair> extras) { */
this.extras = extras; public List<CkanPair> getExtras() {
} return extras;
}
/**
* See {@link #getExtras()}
*/
public void setExtras(List<CkanPair> extras) {
this.extras = extras;
}
/** /**
* Always returns a non-null map (which might be empty) * Always returns a non-null map (which might be empty)
*/ */
@ -207,285 +205,306 @@ public class CkanDatasetBase {
return hm; return hm;
} }
/** /**
* Adds CkanExtras * Always returns a non-null map (which might be empty)
* *
* @param extras The CkanExtra elements * added by Francesco Mangiacrapa at ISTI-CNR
* *
* @since 0.4.3 * The D4Science model accepts extra fields with multiple keys
*/ */
public void addExtras(CkanPair... extras) { @JsonIgnore
if (this.extras == null) { public Map<String, List<String>> getListExtrasAsHashMap() {
this.extras = new ArrayList<>(extras.length); HashMap<String, List<String>> hm = new HashMap<>();
} if (extras != null) {
Collections.addAll(this.extras, extras); for (CkanPair cp : extras) {
}
/** List<String> list = hm.get(cp.getKey());
* Returns the alphanumerical id, i.e. if (list == null)
* "c4577b8f-5603-4098-917e-da03e8ddf461" list = new ArrayList<String>();
*/
public String getId() {
return id;
}
/** list.add(cp.getValue());
* Sets the alphanumerical id, i.e. "c4577b8f-5603-4098-917e-da03e8ddf461" hm.put(cp.getKey(), list);
*/ }
public void setId(String id) { }
this.id = id; return hm;
} }
/** /**
* The license id (i.e. 'cc-zero') * Adds CkanExtras
*/ *
public String getLicenseId() { * @param extras The CkanExtra elements
return licenseId; *
} * @since 0.4.3
*/
public void addExtras(CkanPair... extras) {
if (this.extras == null) {
this.extras = new ArrayList<>(extras.length);
}
Collections.addAll(this.extras, extras);
}
/** /**
* The license id (i.e. 'cc-zero') * Returns the alphanumerical id, i.e. "c4577b8f-5603-4098-917e-da03e8ddf461"
*/ */
public void setLicenseId(String licenseId) { public String getId() {
this.licenseId = licenseId; return id;
} }
public String getMaintainer() { /**
return maintainer; * Sets the alphanumerical id, i.e. "c4577b8f-5603-4098-917e-da03e8ddf461"
} */
public void setId(String id) {
this.id = id;
}
public void setMaintainer(String maintainer) { /**
this.maintainer = maintainer; * The license id (i.e. 'cc-zero')
} */
public String getLicenseId() {
return licenseId;
}
public String getMaintainerEmail() { /**
return maintainerEmail; * The license id (i.e. 'cc-zero')
} */
public void setLicenseId(String licenseId) {
this.licenseId = licenseId;
}
public void setMaintainerEmail(String maintainerEmail) { public String getMaintainer() {
this.maintainerEmail = maintainerEmail; return maintainer;
} }
/** public void setMaintainer(String maintainer) {
* The dataset name (contains no spaces and has dashes as separators, i.e. this.maintainer = maintainer;
* "limestone-pavement-orders") }
*/
public String getName() {
return name;
}
/** public String getMaintainerEmail() {
* The dataset name. Name must not contain spaces and have dashes as return maintainerEmail;
* separators, i.e. "limestone-pavement-orders" }
*
*/
public void setName(String name) {
this.name = name;
}
/** public void setMaintainerEmail(String maintainerEmail) {
* A description of the dataset. See also this.maintainerEmail = maintainerEmail;
* {@link CkanDataset#getNotesRendered()} Note CkanResource has instead a }
* field called {@link CkanResourceBase#getDescription() description}.
*/
public String getNotes() {
return notes;
}
/** /**
* A description of the dataset. See also * The dataset name (contains no spaces and has dashes as separators, i.e.
* {@link CkanDataset#getNotesRendered()} Note CkanResource has instead a * "limestone-pavement-orders")
* field called {@link CkanResourceBase#getDescription() description}. */
*/ public String getName() {
public void setNotes(String notes) { return name;
this.notes = notes; }
}
/** /**
* The owner organization alphanunmerical id, like * The dataset name. Name must not contain spaces and have dashes as separators,
* "b112ed55-01b7-4ca4-8385-f66d6168efcc". * i.e. "limestone-pavement-orders"
*/ *
public String getOwnerOrg() { */
return ownerOrg; public void setName(String name) {
} this.name = name;
}
/** /**
* The owner organization alphanunmerical id, like * A description of the dataset. See also {@link CkanDataset#getNotesRendered()}
* "b112ed55-01b7-4ca4-8385-f66d6168efcc". * Note CkanResource has instead a field called
*/ * {@link CkanResourceBase#getDescription() description}.
public void setOwnerOrg(String ownerOrg) { */
this.ownerOrg = ownerOrg; public String getNotes() {
} return notes;
}
public List<CkanDatasetRelationship> getRelationshipsAsObject() { /**
return relationshipsAsObject; * A description of the dataset. See also {@link CkanDataset#getNotesRendered()}
} * Note CkanResource has instead a field called
* {@link CkanResourceBase#getDescription() description}.
*/
public void setNotes(String notes) {
this.notes = notes;
}
public void setRelationshipsAsObject(List<CkanDatasetRelationship> relationshipsAsObject) { /**
this.relationshipsAsObject = relationshipsAsObject; * The owner organization alphanunmerical id, like
} * "b112ed55-01b7-4ca4-8385-f66d6168efcc".
*/
public String getOwnerOrg() {
return ownerOrg;
}
public List<CkanDatasetRelationship> getRelationshipsAsSubject() { /**
return relationshipsAsSubject; * The owner organization alphanunmerical id, like
} * "b112ed55-01b7-4ca4-8385-f66d6168efcc".
*/
public void setOwnerOrg(String ownerOrg) {
this.ownerOrg = ownerOrg;
}
public void setRelationshipsAsSubject(List<CkanDatasetRelationship> relationshipsAsSubject) { public List<CkanDatasetRelationship> getRelationshipsAsObject() {
this.relationshipsAsSubject = relationshipsAsSubject; return relationshipsAsObject;
} }
public List<CkanResource> getResources() { public void setRelationshipsAsObject(List<CkanDatasetRelationship> relationshipsAsObject) {
return this.resources; this.relationshipsAsObject = relationshipsAsObject;
} }
public void setResources(List<CkanResource> resources) { public List<CkanDatasetRelationship> getRelationshipsAsSubject() {
this.resources = resources; return relationshipsAsSubject;
} }
/** public void setRelationshipsAsSubject(List<CkanDatasetRelationship> relationshipsAsSubject) {
* Adds CkanResources this.relationshipsAsSubject = relationshipsAsSubject;
* }
* @param resources The CkanResources elements
*
* @since 0.4.3
*/
public void addCkanResources(CkanResource... resources) {
if (this.resources == null) {
this.resources = new ArrayList<>(resources.length);
}
Collections.addAll(this.resources, resources);
}
/** public List<CkanResource> getResources() {
* The current state of the dataset, e.g. 'active' or 'deleted', only active return this.resources;
* datasets show up in search results and other lists of datasets, this }
* parameter will be ignored if you are not authorized to change the state
* of the dataset (optional, default: 'active')
*/
public CkanState getState() {
return state;
}
/** public void setResources(List<CkanResource> resources) {
* The current state of the dataset, e.g. 'active' or 'deleted', only active this.resources = resources;
* datasets show up in search results and other lists of datasets, this }
* parameter will be ignored if you are not authorized to change the state
* of the dataset (optional, default: 'active')
*/
public void setState(CkanState state) {
this.state = state;
}
public List<CkanTag> getTags() { /**
return tags; * Adds CkanResources
} *
* @param resources The CkanResources elements
*
* @since 0.4.3
*/
public void addCkanResources(CkanResource... resources) {
if (this.resources == null) {
this.resources = new ArrayList<>(resources.length);
}
Collections.addAll(this.resources, resources);
}
public void setTags(List<CkanTag> tags) { /**
this.tags = tags; * The current state of the dataset, e.g. 'active' or 'deleted', only active
} * datasets show up in search results and other lists of datasets, this
* parameter will be ignored if you are not authorized to change the state of
* the dataset (optional, default: 'active')
*/
public CkanState getState() {
return state;
}
/** /**
* Adds CkanTag * The current state of the dataset, e.g. 'active' or 'deleted', only active
* * datasets show up in search results and other lists of datasets, this
* @param tags The CkanTags elements * parameter will be ignored if you are not authorized to change the state of
* * the dataset (optional, default: 'active')
* @since 0.4.3 */
*/ public void setState(CkanState state) {
public void addTags(CkanTag... tags) { this.state = state;
if (this.tags == null) { }
this.tags = new ArrayList<>(tags.length);
}
Collections.addAll(this.tags, tags);
}
/** public List<CkanTag> getTags() {
* The title, like "Hospitals of Trento" return tags;
*/ }
public String getTitle() {
return title;
}
/** public void setTags(List<CkanTag> tags) {
* The title, like "Hospitals of Trento" this.tags = tags;
*/ }
public void setTitle(String title) {
this.title = title;
}
/** /**
* The type of the dataset (optional), IDatasetForm plugins associate * Adds CkanTag
* themselves with different dataset types and provide custom dataset *
* handling behaviour for these types * @param tags The CkanTags elements
*/ *
public String getType() { * @since 0.4.3
return type; */
} public void addTags(CkanTag... tags) {
if (this.tags == null) {
this.tags = new ArrayList<>(tags.length);
}
Collections.addAll(this.tags, tags);
}
/** /**
* The type of the dataset (optional), IDatasetForm plugins associate * The title, like "Hospitals of Trento"
* themselves with different dataset types and provide custom dataset */
* handling behaviour for these types public String getTitle() {
*/ return title;
public void setType(String type) { }
this.type = type;
}
/** /**
* Should be the landing page on original data provider website describing * The title, like "Hospitals of Trento"
* the dataset. */
*/ public void setTitle(String title) {
public String getUrl() { this.title = title;
return url; }
}
/** /**
* Should be the landing page on original data provider website describing * The type of the dataset (optional), IDatasetForm plugins associate themselves
* the dataset. * with different dataset types and provide custom dataset handling behaviour
*/ * for these types
public void setUrl(String url) { */
this.url = url; public String getType() {
} return type;
}
public String getVersion() { /**
return version; * The type of the dataset (optional), IDatasetForm plugins associate themselves
} * with different dataset types and provide custom dataset handling behaviour
* for these types
*/
public void setType(String type) {
this.type = type;
}
public void setVersion(String version) { /**
this.version = version; * Should be the landing page on original data provider website describing the
} * dataset.
*/
public String getUrl() {
return url;
}
/** /**
* Returns the id if non-empty, the name otherwise * Should be the landing page on original data provider website describing the
*/ * dataset.
@Nullable */
public String idOrName() { public void setUrl(String url) {
return isNotEmpty(getId()) ? getId() : getName(); this.url = url;
} }
/** public String getVersion() {
* Returns the name if non-empty, the id otherwise return version;
*/ }
@Nullable
public String nameOrId() {
return isNotEmpty(getName()) ? getName() : getId(); public void setVersion(String version) {
} this.version = version;
}
/**
* Actually it is named "private" in the CKAN API. Appears in dataset
* searches.
*/
@JsonProperty("private")
public Boolean isPriv() {
return priv;
}
/** /**
* Actually it is named "private" in the CKAN API. Appears in dataset * Returns the id if non-empty, the name otherwise
* searches. */
*/ @Nullable
public void setPriv(Boolean priv) { public String idOrName() {
this.priv = priv; return isNotEmpty(getId()) ? getId() : getName();
} }
/**
* Returns the name if non-empty, the id otherwise
*/
@Nullable
public String nameOrId() {
return isNotEmpty(getName()) ? getName() : getId();
}
/**
* Actually it is named "private" in the CKAN API. Appears in dataset searches.
*/
@JsonProperty("private")
public Boolean isPriv() {
return priv;
}
/**
* Actually it is named "private" in the CKAN API. Appears in dataset searches.
*/
public void setPriv(Boolean priv) {
this.priv = priv;
}
@Override @Override
public String toString() { public String toString() {
@ -537,7 +556,5 @@ public class CkanDatasetBase {
builder.append("]"); builder.append("]");
return builder.toString(); return builder.toString();
} }
} }

View File

@ -27,9 +27,16 @@ public class ContextTest {
protected static Properties properties; protected static Properties properties;
protected static final String PROPERTIES_FILENAME = "token.properties"; protected static final String PROPERTIES_FILENAME = "token.properties";
public static final String ROOT = "/gcube"; // public static final String ROOT = "/gcube";
public static final String VO = ROOT + "/devsec"; // public static final String VO = ROOT + "/devsec";
public static final String VRE = VO + "/devVRE"; // public static final String VRE = VO + "/devVRE";
public static final String ROOT = "/d4science.research-infrastructures.eu";
public static final String VO = ROOT + "/D4OS";
public static final String VRE = VO + "/Blue-Cloud2026Project";
public static final String scope = VRE;
static { static {
properties = new Properties(); properties = new Properties();

View File

@ -14,8 +14,6 @@ import org.gcube.datacatalogue.utillibrary.server.cms.CatalogueContentModeratorS
import org.gcube.datacatalogue.utillibrary.shared.ItemStatus; import org.gcube.datacatalogue.utillibrary.shared.ItemStatus;
import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanDataset; import org.gcube.datacatalogue.utillibrary.shared.jackan.model.CkanDataset;
import org.gcube.gcat.client.Item; import org.gcube.gcat.client.Item;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** /**

View File

@ -7,7 +7,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
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;
@ -28,12 +27,12 @@ import org.slf4j.LoggerFactory;
* *
* @author Francesco Mangiacrapa at ISTI-CNR Pisa (Italy) Jun 1, 2020 * @author Francesco Mangiacrapa at ISTI-CNR Pisa (Italy) Jun 1, 2020
*/ */
public class TestDataCatalogueLib { public class TestDataCatalogueLib extends ContextTest{
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(TestDataCatalogueLib.class); private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(TestDataCatalogueLib.class);
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 = // private String scope =
@ -42,7 +41,7 @@ public class TestDataCatalogueLib {
// "/d4science.research-infrastructures.eu/gCubeApps/BiodiversityLab"; // "/d4science.research-infrastructures.eu/gCubeApps/BiodiversityLab";
// private String testUser = "costantino_perciante"; // 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";
String objectId = "bb_son4"; String objectId = "bb_son4";
String productName = "adatasetcreatedbycatalogue-util-library-873805063"; String productName = "adatasetcreatedbycatalogue-util-library-873805063";
@ -52,7 +51,7 @@ 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();
} }
@ -124,10 +123,17 @@ public class TestDataCatalogueLib {
*/ */
//@Test //@Test
public void getDataset() throws Exception { public void getDataset() throws Exception {
String datasetname = "blue-cloud_2026_-_a_federated_european_fair_and_open_research_ecosystem_for_oceans_seas_coastal_and";
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(datasetname, username);
LOG.debug("Got dataset: " + dataset.getName() + ", with id: " + dataset.getId()); LOG.debug("Got dataset: " + dataset.getName() + ", with id: " + dataset.getId());
LOG.debug("Got getAuthor: " + dataset.getAuthor());
LOG.debug("Got getAuthorEmail: " + dataset.getAuthorEmail());
LOG.debug("Got getMantainer: " + dataset.getMaintainer());
LOG.debug("Got getMaintainerEmail: " + dataset.getMaintainerEmail());
} }
/** /**
@ -236,8 +242,8 @@ public class TestDataCatalogueLib {
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();
@ -282,8 +288,8 @@ public class TestDataCatalogueLib {
// @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();
@ -296,8 +302,8 @@ public class TestDataCatalogueLib {
// @Test // @Test
public void addResource() throws Exception { public void addResource() 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);
CkanDataset dataset = instance.getDataset(productName, testUser); CkanDataset dataset = instance.getDataset(productName, testUser);
@ -312,8 +318,8 @@ public class TestDataCatalogueLib {
// @Test // @Test
public void deleteResource() throws Exception { public void deleteResource() 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 resourceId = "ce7295cf-47db-4faf-901f-4fec2d3fae7a"; String resourceId = "ce7295cf-47db-4faf-901f-4fec2d3fae7a";
@ -325,8 +331,8 @@ public class TestDataCatalogueLib {
// @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>();
@ -337,8 +343,8 @@ public class TestDataCatalogueLib {
// @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;