diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/WelcomeService.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/WelcomeService.java
new file mode 100644
index 0000000..7fb6c4d
--- /dev/null
+++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/WelcomeService.java
@@ -0,0 +1,19 @@
+package org.gcube.data_catalogue.grsf_publish_ws;
+
+import javax.inject.Singleton;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("/")
+@Singleton
+public class WelcomeService {
+
+ @GET
+ @Produces(MediaType.TEXT_HTML)
+ public Response sayHtmlHello() {
+ return Response.ok("
The grsf publisher web service is up and running!
").build();
+ }
+}
diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/filters/RequestsAuthAccountingFilter.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/filters/RequestsAuthAccountingFilter.java
index 9c60139..81249e4 100644
--- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/filters/RequestsAuthAccountingFilter.java
+++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/filters/RequestsAuthAccountingFilter.java
@@ -3,6 +3,7 @@ package org.gcube.data_catalogue.grsf_publish_ws.filters;
import static org.gcube.common.authorization.client.Constants.authorizationService;
import java.io.IOException;
+import java.io.InputStream;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
@@ -21,6 +22,10 @@ import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.data_catalogue.grsf_publish_ws.json.output.ResponseBean;
import org.slf4j.LoggerFactory;
+import com.google.common.base.Charsets;
+
+import eu.trentorise.opendata.traceprov.internal.org.apache.commons.io.IOUtils;
+
/**
* Requests filter: is invoked before any request reaches a service method
@@ -31,7 +36,7 @@ public class RequestsAuthAccountingFilter implements ContainerRequestFilter{
private static final org.slf4j.Logger logger = LoggerFactory.getLogger(RequestsAuthAccountingFilter.class);
private static final String AUTH_TOKEN = "gcube-token";
-
+
@Context UriInfo info;
@Override
@@ -40,10 +45,25 @@ public class RequestsAuthAccountingFilter implements ContainerRequestFilter{
logger.info("Intercepted request, checking if it contains authorization token");
String pathRequest = info.getAbsolutePath().toString();
-
+
if(pathRequest.contains("hello") || pathRequest.endsWith("rest/"))
return;
+
+ try {
+ if (isJson(requestContext)) {
+ String json = IOUtils.toString(requestContext.getEntityStream(), Charsets.UTF_8);
+ // do whatever you need with json
+
+ // replace input stream for Jersey as we've already read it
+ InputStream in = IOUtils.toInputStream(json);
+ logger.debug("JSON REQUEST IS " + json);
+ requestContext.setEntityStream(in);
+ }
+ } catch (Exception ex) {
+ logger.error("JSON IS MISSING", ex);
+ }
+
// check if the request contains gcube-token
String tokenInHeader = null, tokenAsQueryParameter = null;
MultivaluedMap headers = requestContext.getHeaders();
@@ -109,4 +129,10 @@ public class RequestsAuthAccountingFilter implements ContainerRequestFilter{
return res;
}
+
+ boolean isJson(ContainerRequestContext request) {
+ // define rules when to read body
+ return request.getMediaType().toString().contains("application/json");
+ }
+
}
diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/Common.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/Common.java
index 2673594..511372b 100644
--- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/Common.java
+++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/Common.java
@@ -71,7 +71,22 @@ public class Common {
@Group
@CustomField(key="Type")
private Type type;
-
+
+ @JsonProperty("short_title")
+ @CustomField(key="Short Title")
+ @NotNull
+ private String shortTitle;
+
+ @JsonProperty("uuid_knowledge_base")
+ @CustomField(key="UUID Knowledge Base")
+ @NotNull
+ private String uuid;
+
+ @JsonProperty("traceability_flag")
+ @CustomField(key="Traceability Flag")
+ @NotNull
+ private boolean traceabilityFlag;
+
@JsonProperty("extras")
private Map extras = new HashMap<>();
@@ -92,13 +107,18 @@ public class Common {
* @param sourceOfInformation
* @param dataOwner
* @param type
+ * @param shortTitle
+ * @param uuid
+ * @param traceabilityFlag
* @param extras
*/
public Common(String description, String license, String author,
Long version, String authorContact, String maintainer,
String maintainerContact, String catchesOrLandings,
- List databaseSources, List sourceOfInformation,
- String dataOwner, Type type, Map extras) {
+ List databaseSources,
+ List sourceOfInformation, String dataOwner, Type type,
+ String shortTitle, String uuid, boolean traceabilityFlag,
+ Map extras) {
super();
this.description = description;
this.license = license;
@@ -112,6 +132,9 @@ public class Common {
this.sourceOfInformation = sourceOfInformation;
this.dataOwner = dataOwner;
this.type = type;
+ this.shortTitle = shortTitle;
+ this.uuid = uuid;
+ this.traceabilityFlag = traceabilityFlag;
this.extras = extras;
}
@@ -219,6 +242,30 @@ public class Common {
return extras;
}
+ public String getShortTitle() {
+ return shortTitle;
+ }
+
+ public void setShortTitle(String shortTitle) {
+ this.shortTitle = shortTitle;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+
+ public boolean isTraceabilityFlag() {
+ return traceabilityFlag;
+ }
+
+ public void setTraceabilityFlag(boolean traceabilityFlag) {
+ this.traceabilityFlag = traceabilityFlag;
+ }
+
@Override
public String toString() {
return "Common [description=" + description + ", license=" + license
@@ -228,8 +275,9 @@ public class Common {
+ ", catchesOrLandings=" + catchesOrLandings
+ ", databaseSources=" + databaseSources
+ ", sourceOfInformation=" + sourceOfInformation
- + ", dataOwner=" + dataOwner + ", type=" + type + ", extras="
+ + ", dataOwner=" + dataOwner + ", type=" + type
+ + ", shortTitle=" + shortTitle + ", uuid=" + uuid
+ + ", traceabilityFlag=" + traceabilityFlag + ", extras="
+ extras + "]";
}
-
}
diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/FisheryRecord.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/FisheryRecord.java
index dd83944..9413a7d 100644
--- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/FisheryRecord.java
+++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/FisheryRecord.java
@@ -9,12 +9,14 @@ import org.gcube.data_catalogue.grsf_publish_ws.custom_annotations.Tag;
import org.gcube.data_catalogue.grsf_publish_ws.utils.groups.Production_System_Type;
import org.gcube.data_catalogue.grsf_publish_ws.utils.groups.Status;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* A fishery record bean
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
*/
+@JsonIgnoreProperties(ignoreUnknown = true)
public class FisheryRecord extends Common{
@JsonProperty("fishery_name")
diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/StockRecord.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/StockRecord.java
index 0a48273..11f47c4 100644
--- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/StockRecord.java
+++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/StockRecord.java
@@ -1,5 +1,7 @@
package org.gcube.data_catalogue.grsf_publish_ws.json.input;
+import java.util.List;
+
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@@ -10,12 +12,14 @@ import org.gcube.data_catalogue.grsf_publish_ws.utils.groups.Abundance_Level;
import org.gcube.data_catalogue.grsf_publish_ws.utils.groups.Exploitation_Rate;
import org.gcube.data_catalogue.grsf_publish_ws.utils.groups.Status;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* A stock record bean
* @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it)
*/
+@JsonIgnoreProperties(ignoreUnknown = true)
public class StockRecord extends Common{
@JsonProperty("stock_name")
@@ -37,8 +41,8 @@ public class StockRecord extends Common{
@JsonProperty("assessment_distribution_area")
@CustomField(key="Assessment distribution area")
- @NotNull(message="area cannot be null")
- @Size(min=1, message="area cannot be empty")
+ @NotNull(message="assessment distribution cannot be null")
+ @Size(min=1, message="assessment distribution area cannot be empty")
private String area;
@JsonProperty("exploiting_fishery")
@@ -84,7 +88,7 @@ public class StockRecord extends Common{
@JsonProperty("reporting_year")
@CustomField(key="Reporting year")
private Long reportingYear;
-
+
@JsonProperty("status")
@Tag
@Group
@@ -92,6 +96,16 @@ public class StockRecord extends Common{
@CustomField(key="Status")
private Status status;
+ @JsonProperty("stock_uri")
+ @NotNull(message="stock_uri cannot be null")
+ @CustomField(key="Stock Uri")
+ private String stockUri;
+
+ @JsonProperty("water_area")
+ @NotNull(message="water_area cannot be null")
+ @CustomField(key="Water Area")
+ private List waterArea;// TODO check that multiple values are mapped to ckan
+
/**
*
*/
@@ -114,6 +128,9 @@ public class StockRecord extends Common{
* @param scientificAdvice
* @param reportingEntity
* @param reportingYear
+ * @param status
+ * @param stockUri
+ * @param waterArea
*/
public StockRecord(String stockName, String stockID,
String speciesScientificName, String area,
@@ -121,7 +138,8 @@ public class StockRecord extends Common{
String assessmentMethods, String stateOfMarineResource,
Exploitation_Rate exploitationRate, Abundance_Level abundanceLevel,
String narrativeStateAndTrend, String scientificAdvice,
- String reportingEntity, Long reportingYear) {
+ String reportingEntity, Long reportingYear, Status status,
+ String stockUri, List waterArea) {
super();
this.stockName = stockName;
this.stockID = stockID;
@@ -137,6 +155,25 @@ public class StockRecord extends Common{
this.scientificAdvice = scientificAdvice;
this.reportingEntity = reportingEntity;
this.reportingYear = reportingYear;
+ this.status = status;
+ this.stockUri = stockUri;
+ this.waterArea = waterArea;
+ }
+
+ public String getStockUri() {
+ return stockUri;
+ }
+
+ public void setStockUri(String stockUri) {
+ this.stockUri = stockUri;
+ }
+
+ public List getWaterArea() {
+ return waterArea;
+ }
+
+ public void setWaterArea(List waterArea) {
+ this.waterArea = waterArea;
}
public String getStockName() {
@@ -250,7 +287,7 @@ public class StockRecord extends Common{
public void setReportingYear(Long reportingYear) {
this.reportingYear = reportingYear;
}
-
+
public Status getStatus() {
return status;
}
@@ -261,7 +298,7 @@ public class StockRecord extends Common{
@Override
public String toString() {
- return "StockRecord [" + super.toString() + ", stockName=" + stockName + ", stockID=" + stockID
+ return "StockRecord [" + super.toString() + ",stockName=" + stockName + ", stockID=" + stockID
+ ", speciesScientificName=" + speciesScientificName
+ ", area=" + area + ", exploitingFishery=" + exploitingFishery
+ ", managementEntity=" + managementEntity
@@ -272,7 +309,7 @@ public class StockRecord extends Common{
+ ", narrativeStateAndTrend=" + narrativeStateAndTrend
+ ", scientificAdvice=" + scientificAdvice
+ ", reportingEntity=" + reportingEntity + ", reportingYear="
- + reportingYear + ", status=" + status + "]";
+ + reportingYear + ", status=" + status + ", stockUri="
+ + stockUri + ", waterArea=" + waterArea + "]";
}
-
}
diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherFisheryService.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherFisheryService.java
index e5623a4..547a23f 100644
--- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherFisheryService.java
+++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherFisheryService.java
@@ -124,7 +124,7 @@ public class GrsfPublisherFisheryService {
// check the user has editor/admin role into the org
String organization = HelperMethods.retrieveOrgNameFromScope(contextInWhichPublish);
- if(!catalogue.getRoleOfUserInOrganization(username, organization, catalogue.getApiKeyFromUsername(username)).equals(RolesCkanGroupOrOrg.ADMIN)){
+ if(!catalogue.getRoleOfUserInOrganization(username, organization, catalogue.getApiKeyFromUsername(username)).equalsIgnoreCase(RolesCkanGroupOrOrg.ADMIN.toString())){
status = Status.FORBIDDEN;
responseBean.setId(null);
diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherStockService.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherStockService.java
index 8745563..d66d08d 100644
--- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherStockService.java
+++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/services/GrsfPublisherStockService.java
@@ -124,7 +124,7 @@ public class GrsfPublisherStockService {
// check the user has editor/admin role into the org
String organization = HelperMethods.retrieveOrgNameFromScope(contextInWhichPublish);
- if(!catalogue.getRoleOfUserInOrganization(username, organization, catalogue.getApiKeyFromUsername(username)).equals(RolesCkanGroupOrOrg.ADMIN)){
+ if(!catalogue.getRoleOfUserInOrganization(username, organization, catalogue.getApiKeyFromUsername(username)).equalsIgnoreCase(RolesCkanGroupOrOrg.ADMIN.toString())){
status = Status.FORBIDDEN;
responseBean.setId(null);
diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/HelperMethods.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/HelperMethods.java
index 5cb918c..54ad4b0 100644
--- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/HelperMethods.java
+++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/HelperMethods.java
@@ -249,10 +249,9 @@ public abstract class HelperMethods {
try(CloseableHttpClient client = HttpClientBuilder.create().build();){
- String baseUrl = GcoreEndpointReaderSocialWS.getUrlSocialWS(context);
- logger.debug("Base url is " + baseUrl);
- String url = baseUrl.replace("80", "") + "/users/getUserEmail?gcube-token=" + token; // TODO move to version 2
- logger.debug("Request url is " + url);
+ String baseUrl = new ServiceEndPointReaderSocial(context).getBasePath();
+ String url = baseUrl.replace("http", "https") + "/users/getUserEmail?gcube-token=" + token;
+ logger.debug("Request url is " + baseUrl);
HttpGet getRequest = new HttpGet(url);
HttpResponse response = client.execute(getRequest);
@@ -291,9 +290,8 @@ public abstract class HelperMethods {
try(CloseableHttpClient client = HttpClientBuilder.create().build();){
- String baseUrl = GcoreEndpointReaderSocialWS.getUrlSocialWS(context);
- logger.debug("Base url is " + baseUrl);
- String url = baseUrl.replace("80", "") + "/users/getUserFullname?gcube-token=" + token; // TODO move to version 2
+ String baseUrl = new ServiceEndPointReaderSocial(context).getBasePath();
+ String url = baseUrl.replace("http", "https") + "/users/getUserEmail?gcube-token=" + token;
logger.debug("Request url is " + url);
HttpGet getRequest = new HttpGet(url);
HttpResponse response = client.execute(getRequest);
diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/ServiceEndPointReaderSocial.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/ServiceEndPointReaderSocial.java
new file mode 100644
index 0000000..efea091
--- /dev/null
+++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/ServiceEndPointReaderSocial.java
@@ -0,0 +1,104 @@
+package org.gcube.data_catalogue.grsf_publish_ws.utils;
+
+import static org.gcube.resources.discovery.icclient.ICFactory.clientFor;
+import static org.gcube.resources.discovery.icclient.ICFactory.queryFor;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.gcube.common.resources.gcore.ServiceEndpoint;
+import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint;
+import org.gcube.common.scope.api.ScopeProvider;
+import org.gcube.resources.discovery.client.api.DiscoveryClient;
+import org.gcube.resources.discovery.client.queries.api.SimpleQuery;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Retrieves the base url of the social-networking service in the scope provided
+ * @author Costantino Perciante at ISTI-CNR
+ * (costantino.perciante@isti.cnr.it)
+ */
+public class ServiceEndPointReaderSocial {
+
+ private String basePath = null;
+
+ private static Logger logger = LoggerFactory.getLogger(ServiceEndPointReaderSocial.class);
+ private final static String RUNTIME_RESOURCE_NAME = "SocialNetworking";
+ private final static String CATEGORY = "Portal";
+
+ public ServiceEndPointReaderSocial(String context){
+
+ if(context == null || context.isEmpty())
+ throw new IllegalArgumentException("A valid context is needed to discover the service");
+
+
+ String oldContext = ScopeProvider.instance.get();
+ ScopeProvider.instance.set(context);
+
+ try{
+
+ List resources = getConfigurationFromIS();
+ if (resources.size() == 0){
+ logger.error("There is no Runtime Resource having name " + RUNTIME_RESOURCE_NAME +" and Category " + CATEGORY + " in this scope.");
+ throw new Exception("There is no Runtime Resource having name " + RUNTIME_RESOURCE_NAME +" and Category " + CATEGORY + " in this scope.");
+ }
+ else {
+
+ for (ServiceEndpoint res : resources) {
+
+ Iterator accessPointIterator = res.profile().accessPoints().iterator();
+
+ while (accessPointIterator.hasNext()) {
+ ServiceEndpoint.AccessPoint accessPoint = (ServiceEndpoint.AccessPoint) accessPointIterator
+ .next();
+
+ // get base path
+ basePath = accessPoint.address();
+
+ // break
+ break;
+ }
+ }
+
+ }
+
+ }catch(Exception e){
+
+ logger.error("Unable to retrieve such service endpoint information!", e);
+
+ }finally{
+
+ if(oldContext != null && !oldContext.equals(context))
+ ScopeProvider.instance.set(oldContext);
+
+ }
+
+ logger.info("Found base path " + basePath + " for the service");
+
+ }
+
+ /**
+ * Retrieve endpoints information from IS for DB
+ * @return list of endpoints for ckan database
+ * @throws Exception
+ */
+ private List getConfigurationFromIS() throws Exception{
+
+ SimpleQuery query = queryFor(ServiceEndpoint.class);
+ query.addCondition("$resource/Profile/Name/text() eq '"+ RUNTIME_RESOURCE_NAME +"'");
+ query.addCondition("$resource/Profile/Category/text() eq '"+ CATEGORY +"'");
+ DiscoveryClient client = clientFor(ServiceEndpoint.class);
+ List toReturn = client.submit(query);
+ return toReturn;
+
+ }
+
+ /**
+ * Get the base path of the social networking service
+ * @return
+ */
+ public String getBasePath() {
+ return basePath;
+ }
+}
diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/groups/Status.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/groups/Status.java
index e824c90..a1c4c6c 100644
--- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/groups/Status.java
+++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/groups/Status.java
@@ -1,5 +1,8 @@
package org.gcube.data_catalogue.grsf_publish_ws.utils.groups;
+import org.gcube.data_catalogue.grsf_publish_ws.filters.RequestsAuthAccountingFilter;
+import org.slf4j.LoggerFactory;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
@@ -42,6 +45,7 @@ public enum Status {
*/
@JsonCreator
public static Status onDeserialize(String statusString) {
+ System.out.println("STATUS IS " + statusString);
if(statusString != null) {
for(Status status : Status.values()) {
if (status.toString().equalsIgnoreCase(statusString.trim()))