From 33514c202a223643b62cc9df742fe4d9f1985535 Mon Sep 17 00:00:00 2001 From: Costantino Perciante Date: Wed, 26 Oct 2016 16:40:10 +0000 Subject: [PATCH] minor fixes and added some of the fields requested by forth (short_title, stock_uri, traceability_flag etc) git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/data-catalogue/grsf-publisher-ws@133611 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../grsf_publish_ws/WelcomeService.java | 19 ++++ .../filters/RequestsAuthAccountingFilter.java | 30 ++++- .../grsf_publish_ws/json/input/Common.java | 58 +++++++++- .../json/input/FisheryRecord.java | 2 + .../json/input/StockRecord.java | 53 +++++++-- .../services/GrsfPublisherFisheryService.java | 2 +- .../services/GrsfPublisherStockService.java | 2 +- .../grsf_publish_ws/utils/HelperMethods.java | 12 +- .../utils/ServiceEndPointReaderSocial.java | 104 ++++++++++++++++++ .../grsf_publish_ws/utils/groups/Status.java | 4 + 10 files changed, 262 insertions(+), 24 deletions(-) create mode 100644 src/main/java/org/gcube/data_catalogue/grsf_publish_ws/WelcomeService.java create mode 100644 src/main/java/org/gcube/data_catalogue/grsf_publish_ws/utils/ServiceEndPointReaderSocial.java 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()))