/* * Copyright 2015 Trento Rise. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.gcube.datacatalogue.utillibrary.shared.jackan.model; import static org.gcube.datacatalogue.utillibrary.server.utils.GenericUtils.isNotEmpty; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Nullable; import org.gcube.com.fasterxml.jackson.annotation.JsonAnyGetter; 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 * creating * a dataset,, 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 * {@code name}. * * @author David Leoni * @since 0.4.1 */ public class CkanDatasetBase { private String author; private String authorEmail; private List extras; private List groups; private String id; private String licenseId; private String maintainer; private String maintainerEmail; private String name; private String notes; private String ownerOrg; private List relationshipsAsObject; private List relationshipsAsSubject; private List resources; private CkanState state; private List tags; private String title; private String type; private String url; private String version; 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 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 * * custom data schemas 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 getOthers() { return others; } /** * @see #getOthers() * @see #putOthers(java.lang.String, java.lang.Object) */ public void setOthers(@Nullable Map others) { this.others = 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); } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getAuthorEmail() { return authorEmail; } public void setAuthorEmail(String authorEmail) { this.authorEmail = 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 getGroups() { return groups; } public void setGroups(List groups) { this.groups = 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); } /** * Regular place where to put custom metadata. See also * {@link #getOthers()}. Note also extras can be in CkanDataset but not in * CkanResource. */ public List getExtras() { return extras; } /** * See {@link #getExtras()} */ public void setExtras(List extras) { this.extras = extras; } /** * Always returns a non-null map (which might be empty) */ @JsonIgnore public Map getExtrasAsHashMap() { HashMap hm = new HashMap<>(); if (extras != null) { for (CkanPair cp : extras) { hm.put(cp.getKey(), cp.getValue()); } } 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); } /** * Returns the alphanumerical id, i.e. * "c4577b8f-5603-4098-917e-da03e8ddf461" */ public String getId() { return id; } /** * Sets the alphanumerical id, i.e. "c4577b8f-5603-4098-917e-da03e8ddf461" */ public void setId(String id) { this.id = id; } /** * The license id (i.e. 'cc-zero') */ public String getLicenseId() { return licenseId; } /** * The license id (i.e. 'cc-zero') */ public void setLicenseId(String licenseId) { this.licenseId = licenseId; } public String getMaintainer() { return maintainer; } public void setMaintainer(String maintainer) { this.maintainer = maintainer; } public String getMaintainerEmail() { return maintainerEmail; } public void setMaintainerEmail(String maintainerEmail) { this.maintainerEmail = maintainerEmail; } /** * The dataset name (contains no spaces and has dashes as separators, i.e. * "limestone-pavement-orders") */ public String getName() { return name; } /** * 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; } /** * 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; } /** * 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 owner organization alphanunmerical id, like * "b112ed55-01b7-4ca4-8385-f66d6168efcc". */ public String getOwnerOrg() { return ownerOrg; } /** * The owner organization alphanunmerical id, like * "b112ed55-01b7-4ca4-8385-f66d6168efcc". */ public void setOwnerOrg(String ownerOrg) { this.ownerOrg = ownerOrg; } public List getRelationshipsAsObject() { return relationshipsAsObject; } public void setRelationshipsAsObject(List relationshipsAsObject) { this.relationshipsAsObject = relationshipsAsObject; } public List getRelationshipsAsSubject() { return relationshipsAsSubject; } public void setRelationshipsAsSubject(List relationshipsAsSubject) { this.relationshipsAsSubject = relationshipsAsSubject; } public List getResources() { return this.resources; } public void setResources(List resources) { this.resources = resources; } /** * 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); } /** * 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; } /** * 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 List getTags() { return tags; } public void setTags(List tags) { this.tags = tags; } /** * 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 title, like "Hospitals of Trento" */ public String getTitle() { return title; } /** * The title, like "Hospitals of Trento" */ public void setTitle(String title) { this.title = title; } /** * 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; } /** * 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; } /** * Should be the landing page on original data provider website describing * the dataset. */ public String getUrl() { return url; } /** * Should be the landing page on original data provider website describing * the dataset. */ public void setUrl(String url) { this.url = url; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } /** * 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() { StringBuilder builder = new StringBuilder(); builder.append("CkanDatasetBase [author="); builder.append(author); builder.append(", authorEmail="); builder.append(authorEmail); builder.append(", extras="); builder.append(extras); builder.append(", groups="); builder.append(groups); builder.append(", id="); builder.append(id); builder.append(", licenseId="); builder.append(licenseId); builder.append(", maintainer="); builder.append(maintainer); builder.append(", maintainerEmail="); builder.append(maintainerEmail); builder.append(", name="); builder.append(name); builder.append(", notes="); builder.append(notes); builder.append(", ownerOrg="); builder.append(ownerOrg); builder.append(", relationshipsAsObject="); builder.append(relationshipsAsObject); builder.append(", relationshipsAsSubject="); builder.append(relationshipsAsSubject); builder.append(", resources="); builder.append(resources); builder.append(", state="); builder.append(state); builder.append(", tags="); builder.append(tags); builder.append(", title="); builder.append(title); builder.append(", type="); builder.append(type); builder.append(", url="); builder.append(url); builder.append(", version="); builder.append(version); builder.append(", priv="); builder.append(priv); builder.append(", others="); builder.append(others); builder.append("]"); return builder.toString(); } }