Added method getListExtrasAsHashMap - D4Science model compliant

This commit is contained in:
Francesco Mangiacrapa 2024-02-08 17:53:31 +01:00
parent c4629e78be
commit 3d9080ed81
2 changed files with 393 additions and 375 deletions

View File

@ -9,6 +9,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
**Enhancements**
- Added method update item [#26640]
- Added method getListExtrasAsHashMap - D4Science model compliant
## [v1.3.0] - 2023-02-06

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.JsonProperty;
/**
* A Ckan Dataset, which in turn holds Ckan Resources.
*
* In Ckan terminology it is also known as 'package'.
*
* {@link CkanDatasetBase} holds fields that can be sent when
* <a href="http://docs.ckan.org/en/latest/api/index.html?#ckan.logic.action.create.package_create" target="_blank">creating
* a dataset,</a>, while {@link CkanDataset} holds more fields that can be
* returned with searches.
* {@link CkanDatasetBase} holds fields that can be sent when <a href=
* "http://docs.ckan.org/en/latest/api/index.html?#ckan.logic.action.create.package_create"
* target="_blank">creating a dataset,</a>, while {@link CkanDataset} holds more
* fields that can be returned with searches.
*
* This class initializes nothing to fully preserve all we get from ckan. In
* 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 {
private String author;
private String authorEmail;
private List<CkanPair> extras;
private List<CkanGroup> groups;
private String id;
private String licenseId;
private String maintainer;
private String maintainerEmail;
private String name;
private String notes;
private String ownerOrg;
private List<CkanDatasetRelationship> relationshipsAsObject;
private List<CkanDatasetRelationship> relationshipsAsSubject;
private List<CkanResource> resources;
private CkanState state;
private List<CkanTag> tags;
private String title;
private String type;
private String url;
private String version;
private Boolean priv;
private String author;
private String authorEmail;
private List<CkanPair> extras;
private List<CkanGroup> groups;
private String id;
private String licenseId;
private String maintainer;
private String maintainerEmail;
private String name;
private String notes;
private String ownerOrg;
private List<CkanDatasetRelationship> relationshipsAsObject;
private List<CkanDatasetRelationship> relationshipsAsSubject;
private List<CkanResource> resources;
private CkanState state;
private List<CkanTag> tags;
private String title;
private String type;
private String url;
private String version;
/**
* 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;
private Boolean priv;
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;
/**
* 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;
}
public CkanDatasetBase() {
}
/**
* CKAN instances might have
* <a href="http://docs.ckan.org/en/latest/extensions/adding-custom-fields.html">
* custom data schemas</a> that force presence of custom properties among
* 'regular' ones. In this case, they go to 'others' field. Note that to
* further 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;
}
/**
* 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;
}
/**
* @see #getOthers()
* @see #putOthers(java.lang.String, java.lang.Object)
*/
public void setOthers(@Nullable Map<String, Object> others) {
this.others = others;
}
/**
* CKAN instances might have <a href=
* "http://docs.ckan.org/en/latest/extensions/adding-custom-fields.html"> custom
* data schemas</a> that force presence of custom properties among 'regular'
* ones. In this case, they go to 'others' field. Note that to further
* 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 #setOthers(java.util.Map)
*/
@JsonAnySetter
public void putOthers(String name, Object value) {
if (others == null) {
others = new HashMap<>();
}
others.put(name, value);
}
/**
* @see #getOthers()
* @see #putOthers(java.lang.String, java.lang.Object)
*/
public void setOthers(@Nullable Map<String, Object> others) {
this.others = others;
}
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) {
this.author = author;
}
public String getAuthor() {
return author;
}
public String getAuthorEmail() {
return authorEmail;
}
public void setAuthor(String author) {
this.author = author;
}
public void setAuthorEmail(String authorEmail) {
this.authorEmail = authorEmail;
}
public String getAuthorEmail() {
return authorEmail;
}
/**
* 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 setAuthorEmail(String authorEmail) {
this.authorEmail = authorEmail;
}
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;
}
/**
* Adds CkanGroups
*
* @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);
}
public void setGroups(List<CkanGroup> groups) {
this.groups = groups;
}
/**
* Regular place where to put custom metadata. See also
* {@link #getOthers()}. Note also extras can be in CkanDataset but not in
* CkanResource.
*/
public List<CkanPair> getExtras() {
return extras;
}
/**
* Adds CkanGroups
*
* @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);
}
/**
* See {@link #getExtras()}
*/
public void setExtras(List<CkanPair> extras) {
this.extras = extras;
}
/**
* Regular place where to put custom metadata. See also {@link #getOthers()}.
* Note also extras can be in CkanDataset but not in CkanResource.
*/
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)
*/
@ -207,285 +205,306 @@ public class CkanDatasetBase {
return hm;
}
/**
* Adds CkanExtras
*
* @param extras The CkanExtra elements
*
* @since 0.4.3
*/
public void addExtras(CkanPair... extras) {
if (this.extras == null) {
this.extras = new ArrayList<>(extras.length);
}
Collections.addAll(this.extras, extras);
}
/**
* Always returns a non-null map (which might be empty)
*
* updated by Francesco Mangiacrapa at ISTI-CNR
*
* The D4Science model accepts extra fields with multiple keys
*/
@JsonIgnore
public Map<String, List<String>> getListExtrasAsHashMap() {
HashMap<String, List<String>> hm = new HashMap<>();
if (extras != null) {
for (CkanPair cp : extras) {
/**
* Returns the alphanumerical id, i.e.
* "c4577b8f-5603-4098-917e-da03e8ddf461"
*/
public String getId() {
return id;
}
List<String> list = hm.get(cp.getKey());
if (list == null)
list = new ArrayList<String>();
/**
* Sets the alphanumerical id, i.e. "c4577b8f-5603-4098-917e-da03e8ddf461"
*/
public void setId(String id) {
this.id = id;
}
list.add(cp.getValue());
hm.put(cp.getKey(), list);
}
}
return hm;
}
/**
* The license id (i.e. 'cc-zero')
*/
public String getLicenseId() {
return licenseId;
}
/**
* Adds CkanExtras
*
* @param extras The CkanExtra elements
*
* @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')
*/
public void setLicenseId(String licenseId) {
this.licenseId = licenseId;
}
/**
* Returns the alphanumerical id, i.e. "c4577b8f-5603-4098-917e-da03e8ddf461"
*/
public String getId() {
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) {
this.maintainerEmail = maintainerEmail;
}
public String getMaintainer() {
return maintainer;
}
/**
* The dataset name (contains no spaces and has dashes as separators, i.e.
* "limestone-pavement-orders")
*/
public String getName() {
return name;
}
public void setMaintainer(String maintainer) {
this.maintainer = maintainer;
}
/**
* The dataset name. Name must not contain spaces and have dashes as
* separators, i.e. "limestone-pavement-orders"
*
*/
public void setName(String name) {
this.name = name;
}
public String getMaintainerEmail() {
return maintainerEmail;
}
/**
* A description of the dataset. See also
* {@link CkanDataset#getNotesRendered()} Note CkanResource has instead a
* field called {@link CkanResourceBase#getDescription() description}.
*/
public String getNotes() {
return notes;
}
public void setMaintainerEmail(String maintainerEmail) {
this.maintainerEmail = maintainerEmail;
}
/**
* 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;
}
/**
* The dataset name (contains no spaces and has dashes as separators, i.e.
* "limestone-pavement-orders")
*/
public String getName() {
return name;
}
/**
* The owner organization alphanunmerical id, like
* "b112ed55-01b7-4ca4-8385-f66d6168efcc".
*/
public String getOwnerOrg() {
return ownerOrg;
}
/**
* The dataset name. Name must not contain spaces and have dashes as separators,
* i.e. "limestone-pavement-orders"
*
*/
public void setName(String name) {
this.name = name;
}
/**
* The owner organization alphanunmerical id, like
* "b112ed55-01b7-4ca4-8385-f66d6168efcc".
*/
public void setOwnerOrg(String ownerOrg) {
this.ownerOrg = ownerOrg;
}
/**
* A description of the dataset. See also {@link CkanDataset#getNotesRendered()}
* Note CkanResource has instead a field called
* {@link CkanResourceBase#getDescription() description}.
*/
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) {
this.relationshipsAsSubject = relationshipsAsSubject;
}
public List<CkanDatasetRelationship> getRelationshipsAsObject() {
return relationshipsAsObject;
}
public List<CkanResource> getResources() {
return this.resources;
}
public void setRelationshipsAsObject(List<CkanDatasetRelationship> relationshipsAsObject) {
this.relationshipsAsObject = relationshipsAsObject;
}
public void setResources(List<CkanResource> resources) {
this.resources = resources;
}
public List<CkanDatasetRelationship> getRelationshipsAsSubject() {
return relationshipsAsSubject;
}
/**
* 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 setRelationshipsAsSubject(List<CkanDatasetRelationship> relationshipsAsSubject) {
this.relationshipsAsSubject = relationshipsAsSubject;
}
/**
* 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;
}
public List<CkanResource> getResources() {
return this.resources;
}
/**
* 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 void setState(CkanState state) {
this.state = state;
}
public void setResources(List<CkanResource> resources) {
this.resources = resources;
}
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
*
* @param tags The CkanTags elements
*
* @since 0.4.3
*/
public void addTags(CkanTag... tags) {
if (this.tags == null) {
this.tags = new ArrayList<>(tags.length);
}
Collections.addAll(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 void setState(CkanState state) {
this.state = state;
}
/**
* The title, like "Hospitals of Trento"
*/
public String getTitle() {
return title;
}
public List<CkanTag> getTags() {
return tags;
}
/**
* The title, like "Hospitals of Trento"
*/
public void setTitle(String title) {
this.title = title;
}
public void setTags(List<CkanTag> tags) {
this.tags = tags;
}
/**
* The type of the dataset (optional), IDatasetForm plugins associate
* themselves with different dataset types and provide custom dataset
* handling behaviour for these types
*/
public String getType() {
return type;
}
/**
* Adds CkanTag
*
* @param tags The CkanTags elements
*
* @since 0.4.3
*/
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
* themselves with different dataset types and provide custom dataset
* handling behaviour for these types
*/
public void setType(String type) {
this.type = type;
}
/**
* The title, like "Hospitals of Trento"
*/
public String getTitle() {
return title;
}
/**
* Should be the landing page on original data provider website describing
* the dataset.
*/
public String getUrl() {
return url;
}
/**
* The title, like "Hospitals of Trento"
*/
public void setTitle(String title) {
this.title = title;
}
/**
* Should be the landing page on original data provider website describing
* the dataset.
*/
public void setUrl(String url) {
this.url = url;
}
/**
* The type of the dataset (optional), IDatasetForm plugins associate themselves
* with different dataset types and provide custom dataset handling behaviour
* for these types
*/
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
*/
@Nullable
public String idOrName() {
return isNotEmpty(getId()) ? getId() : getName();
}
/**
* Should be the landing page on original data provider website describing the
* dataset.
*/
public void setUrl(String url) {
this.url = url;
}
/**
* Returns the name if non-empty, the id otherwise
*/
@Nullable
public String nameOrId() {
public String getVersion() {
return version;
}
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;
}
public void setVersion(String version) {
this.version = version;
}
/**
* Actually it is named "private" in the CKAN API. Appears in dataset
* searches.
*/
public void setPriv(Boolean priv) {
this.priv = priv;
}
/**
* Returns the id if non-empty, the name otherwise
*/
@Nullable
public String idOrName() {
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
public String toString() {
@ -537,7 +556,5 @@ public class CkanDatasetBase {
builder.append("]");
return builder.toString();
}
}