/*
* 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 eu.trentorise.opendata.jackan.model;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
/**
*
* A Ckan Resource describes with metadata a physical file, which may reside
* outside ckan. Resources are part of {@link CkanDataset}. In DCAT terminology,
* a Ckan Resource is a DCAT Distribution.
*
* {@link CkanResourceBase} holds fields that can be sent when
* <a href="http://docs.ckan.org/en/latest/api/index.html?#ckan.logic.action.create.resource_create" target="_blank">creating
* a resource,</a>, while {@link CkanResource} 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 url}.
*
* @author David Leoni
* @since 0.4.1
*/
public class CkanResourceBase {
private String cacheLastUpdated;
private String cacheUrl;
private Timestamp created;
private String description;
private String format;
private String hash;
private String id;
private String lastModified;
private String mimetype;
private String mimetypeInner;
private String name;
private String resourceType;
private String revisionId;
private String size;
private String url;
private Timestamp webstoreLastUpdated;
private String webstoreUrl;
/**
* The dataset this resource belongs to. Not present when getting resources
* but needed when uploading them.
*/
private String packageId;
/**
* See {@link #getOthers()}
*/
private Map<String, Object> others;
/**
* The dataset this resource belongs to. Not present when getting resources
* but needed when creating them.
*/
@Nullable
public String getPackageId() {
return packageId;
}
/**
* The dataset id the resource belongs to. Not present when getting
* resources but needed when creating them.
*
* @param packageId the dataset this resource belongs to.
*/
public void setPackageId(@Nullable String packageId) {
this.packageId = packageId;
}
public CkanResourceBase() {
}
/**
* Constructor with the minimal list of required items to successfully
* create a resource on the server.
*
* @param url the Url to the pyhsical file i.e.
* http://dati.trentino.it/storage/f/2013-05-09T140831/TRENTO_Laghi_monitorati_UTM.csv
* (could also be a file outside ckan server)
* @param packageId id of the dataset that contains the resource
*/
public CkanResourceBase(String url,
String packageId) {
this();
this.url = url;
this.packageId = packageId;
}
/**
* 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. Notice that
* differently from dataset a resource down't have 'extras' field.
*
* @see #putOthers(java.lang.String, java.lang.Object)
*/
@JsonAnyGetter
@Nullable
public Map<String, Object> getOthers() {
return others;
}
/**
* @param others
* @see #getOthers()
* @see #putOthers(java.lang.String, java.lang.Object)
*/
public void setOthers(@Nullable Map<String, Object> 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);
}
/**
* Should be a Timestamp
*/
public String getCacheLastUpdated() {
return cacheLastUpdated;
}
/**
* Should be a Timestamp
*/
public void setCacheLastUpdated(@Nullable String cacheLastUpdated) {
this.cacheLastUpdated = cacheLastUpdated;
}
/**
* God only knows what this is
*/
@Nullable
public String getCacheUrl() {
return cacheUrl;
}
/**
* God only knows what this is
*/
public void setCacheUrl(String cacheUrl) {
this.cacheUrl = cacheUrl;
}
/**
* In JSON is something like this: i.e. "2013-05-09T14:08:32.666477" . Ckan
* always refers to UTC timezone
*/
public Timestamp getCreated() {
return created;
}
/**
* Ckan always refers to UTC timezone
*/
public void setCreated(Timestamp created) {
this.created = created;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
/**
* In Ckan 1.8 was lowercase, 2.2a seems capitalcase.
*/
public String getFormat() {
return format;
}
/**
* In Ckan 1.8 was lowercase, 2.2a seems capitalcase.
*/
public void setFormat(String format) {
this.format = format;
}
/**
* Sometimes for dati.trentino.it can be the empty string
*/
public String getHash() {
return hash;
}
/**
* Sometimes for dati.trentino.it can be the empty string
*/
public void setHash(String hash) {
this.hash = hash;
}
/**
* Returns the alphanumerical id, i.e.
* "c4577b8f-5603-4098-917e-da03e8ddf461"
*/
public String getId() {
return id;
}
/**
* @param id alphanumerical id, i.e. "c4577b8f-5603-4098-917e-da03e8ddf461"
*/
public void setId(String id) {
this.id = id;
}
/**
* Jackan note: this field should represent the timestamp of the last update
* of the resource *data*, not metadata. I think it's set by extensions and
* harvesters. Notice Ckan always refers to UTC timezone in
* {@link eu.trentorise.opendata.jackan.CkanClient#CKAN_TIMESTAMP_PATTERN} format, so this field probably
* should follow the same format.
*/
public String getLastModified() {
return lastModified;
}
/**
* Jackan note: this field should represent the timestamp of the last update
* of the resource *data*, not metadata. I think it's set by extensions and
* harvesters. Notice Ckan always refers to UTC timezone in
* {@link eu.trentorise.opendata.jackan.CkanClient#CKAN_TIMESTAMP_PATTERN} format, so this field probably
* should follow the same format.
*/
public void setLastModified(String lastModified) {
this.lastModified = lastModified;
}
/**
* i.e. text/csv
*/
public String getMimetype() {
return mimetype;
}
/**
* i.e. text/csv
*/
public void setMimetype(String mimetype) {
this.mimetype = mimetype;
}
/**
* Unknown meaning, as usual. Can be the empty string or null
*/
public String getMimetypeInner() {
return mimetypeInner;
}
/**
* Unknown meaning, as usual. Can be the empty string or null
*/
public void setMimetypeInner(@Nullable String mimetypeInner) {
this.mimetypeInner = mimetypeInner;
}
/**
*
* Human readable name, i.e. "Apple Production 2013 in CSV format". Not to
* be confused with {@link CkanDataset#name} which instead is lowercased and
* intended to be part of the url.
*
*
* Notice we found name null in data.gov.uk datasets... i.e.
* <a href="http://data.gov.uk/api/3/action/resource_show?id=77d2dba8-d0d9-49ef-9fd2-37a4a8bc5a17" target="_blank">
* unclaimed-estates-list </a>, taken
* <a href="http://data.gov.uk/api/3/action/package_search?rows=20&start=0" target="_blank">from
* this dataset search</a> (They use description field instead)
*/
@Nullable
public String getName() {
return name;
}
/**
* Human readable name, i.e. "Apple Production 2013 in CSV format". Not to
* be confused with {@link CkanDataset#name} which instead is lowercased and
* intended to be part of the url. For Nullable explanation see
* {@link #getName()}
*/
public void setName(@Nullable String name) {
this.name = name;
}
/**
* So far, found: "api", "file", "file.upload"
*/
public String getResourceType() {
return resourceType;
}
/**
* So far, found: "api", "file", "file.upload"
*/
public void setResourceType(String resourceType) {
this.resourceType = resourceType;
}
/**
* alphanumerical id, i.e. 0c949f17-d123-4379-8536-cfcf25b3b0e9
*/
public String getRevisionId() {
return revisionId;
}
/**
* alphanumerical id, i.e. 0c949f17-d123-4379-8536-cfcf25b3b0e9
*/
public void setRevisionId(String revisionId) {
this.revisionId = revisionId;
}
/**
* File size in bytes, if calculated by ckan for files in storage, like i.e.
* "242344". Otherwise it can be anything a human can insert.
*/
public String getSize() {
return size;
}
/**
* File size in bytes, if calculated by ckan for files in storage, like i.e.
* "242344". Otherwise it can be anything a human can insert.
*/
public void setSize(@Nullable String size) {
this.size = size;
}
/**
* The Url to the pyhsical file i.e.
* http://dati.trentino.it/storage/f/2013-05-09T140831/TRENTO_Laghi_monitorati_UTM.csv
* (could also be a file outside ckan server)
*/
public String getUrl() {
return url;
}
/**
* The Url to the pyhsical file i.e.
* http://dati.trentino.it/storage/f/2013-05-09T140831/TRENTO_Laghi_monitorati_UTM.csv
* (could also be a file outside ckan server)
*/
public void setUrl(String url) {
this.url = url;
}
/**
* Ckan always refers to UTC timezone
*/
public Timestamp getWebstoreLastUpdated() {
return webstoreLastUpdated;
}
/**
* Ckan always refers to UTC timezone
*/
public void setWebstoreLastUpdated(Timestamp webstoreLastUpdated) {
this.webstoreLastUpdated = webstoreLastUpdated;
}
/**
* Found "active" as value. Maybe it is a CkanState?
*/
public String getWebstoreUrl() {
return webstoreUrl;
}
/**
* @param webstoreUrl Found "active" as value. Maybe it is a CkanState?
*/
public void setWebstoreUrl(String webstoreUrl) {
this.webstoreUrl = webstoreUrl;
}
}