diff --git a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/record/Common.java b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/record/Common.java index 2a8a159..a6bfe7b 100644 --- a/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/record/Common.java +++ b/src/main/java/org/gcube/data_catalogue/grsf_publish_ws/json/input/record/Common.java @@ -24,7 +24,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; /** * Information that both Stock and Fishery records must contain. - * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + * @author Costantino Perciante (ISTI - CNR) + * @author Luca Frosini (ISTI - CNR) */ public abstract class Common extends Base{ @@ -118,7 +119,12 @@ public abstract class Common extends Base{ @JsonProperty(Constants.ANNOTATION_PUBLISHER_JSON_KEY) @CustomField(key=Constants.ANNOTATION_PUBLISHER_CUSTOM_KEY) private List annotations; - + + @JsonProperty(Constants.SIMILARITIES_INDICATOR) + @Tag + private String similaritiesIndicator; + + public Common() { super(); } @@ -342,6 +348,14 @@ public abstract class Common extends Base{ this.sdgFlag = sdgFlag; } + public String getSimilaritiesIndicator() { + return similaritiesIndicator; + } + + public void setSimilaritiesIndicator(String similaritiesIndicator) { + this.similaritiesIndicator = similaritiesIndicator; + } + @Override public String toString() { return "Common [dataOwner=" + dataOwner + ", databaseSources=" 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 354fe43..fd80d2d 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 @@ -48,289 +48,271 @@ import eu.trentorise.opendata.jackan.model.CkanDataset; /** * Fishery web service methods. - * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + * @author Costantino Perciante (ISTI - CNR) + * @author Luca Frosini (ISTI - CNR) */ @Path("{source:firms|FIRMS|grsf|GRSF|FishSource|fishsource}/fishery/") public class GrsfPublisherFisheryService { - + // the context - @Context ServletContext contextServlet; - + @Context + ServletContext contextServlet; + // Logger private static final org.slf4j.Logger logger = LoggerFactory.getLogger(GrsfPublisherFisheryService.class); - + @GET @Path("hello") @Produces(MediaType.TEXT_PLAIN) - public Response hello(){ + public Response hello() { return Response.ok("Hello.. Fishery service is here").build(); } - + @GET @Path("get-licenses") @Produces(MediaType.APPLICATION_JSON) - public Response getLicenses(){ + public Response getLicenses() { Status status = Status.OK; String context = ScopeProvider.instance.get(); DataCatalogue catalogue; try { catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - Map licenses = CommonServiceUtils.getLicenses(catalogue); + Map licenses = CommonServiceUtils.getLicenses(catalogue); if(licenses == null) status = Status.INTERNAL_SERVER_ERROR; return Response.status(status).entity(licenses).build(); - } catch (Exception e) { + } catch(Exception e) { status = Status.INTERNAL_SERVER_ERROR; - return Response.status(status).entity(new ResponseBean(false, - "Unable to retrieve license list " + e.getLocalizedMessage(), null)).build(); + return Response.status(status) + .entity(new ResponseBean(false, "Unable to retrieve license list " + e.getLocalizedMessage(), null)) + .build(); } } - + @POST @Path("publish-product") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Response publishFishery( - @NotNull(message="record cannot be null") - @Valid FisheryRecord record, - @PathParam("source") String source) - throws ValidationException{ - + public Response publishFishery(@NotNull(message = "record cannot be null") @Valid FisheryRecord record, + @PathParam("source") String source) throws ValidationException { + Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); String context = ScopeProvider.instance.get(); String token = SecurityTokenProvider.instance.get(); - - logger.info("Incoming request for creating a fishery record = " + record + ".\nRequest comes from user " + username + " in context " + context); - + + logger.info("Incoming request for creating a fishery record = " + record + ".\nRequest comes from user " + + username + " in context " + context); + ResponseCreationBean responseBean = new ResponseCreationBean(); Status status = Status.INTERNAL_SERVER_ERROR; String id = ""; // id of the created record, if everything went ok - - try{ - + + try { + // Cast the source to the accepted ones Sources sourceInPath = Sources.onDeserialize(source); - + DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - if(catalogue == null){ + if(catalogue == null) { throw new Exception("There was a problem while serving your request. No catalogue instance was found!"); - }else{ - + } else { + String apiKey = catalogue.getApiKeyFromUsername(username); - String organization = HelperMethods.retrieveOrgNameFromScope(context); + String organization = HelperMethods.retrieveOrgNameFromScope(context); CommonServiceUtils.hasAdminRole(username, catalogue, apiKey, organization); - + // extend this role to the other organizations in this context - CommonServiceUtils.extendRoleToOtherOrganizations(username, catalogue, organization, RolesCkanGroupOrOrg.ADMIN); - + CommonServiceUtils.extendRoleToOtherOrganizations(username, catalogue, organization, + RolesCkanGroupOrOrg.ADMIN); + // retrieve the user's email and fullname String authorMail = HelperMethods.getUserEmail(context, token); String authorFullname = HelperMethods.getUserFullname(context, token); - - if(authorMail == null || authorFullname == null){ + + if(authorMail == null || authorFullname == null) { throw new Exception("Sorry but it was not possible to retrieve your fullname/email!"); } - + // The name of the product will be the uuid of the kb. The title will be the fishery's fishery_name. Fishery has also the constraint that // fishing area and jurisdiction area cannot be empty at the same time String futureName = record.getUuid(); String futureTitle = record.getFisheryName(); - + // check name CommonServiceUtils.checkName(futureName, catalogue); - - Map> customFields = record.getExtrasFields(); - Set tags = new HashSet(); + + Map> customFields = record.getExtrasFields(); + Set tags = new HashSet(); Set groups = new HashSet(); List resources = record.getExtrasResources(); - + // validate end set sources - CommonServiceUtils.validateRecordAndMapFields( - apiKey, - context, - contextServlet, - sourceInPath, - record, - Product_Type.FISHERY, - tags, - customFields, - groups, - resources, - username, - futureTitle); - + CommonServiceUtils.validateRecordAndMapFields(apiKey, context, contextServlet, sourceInPath, record, + Product_Type.FISHERY, tags, customFields, groups, resources, username, futureTitle); + // check the license id String license = null; if(record.getLicense() == null || record.getLicense().isEmpty()) license = Constants.DEFAULT_LICENSE; + else if(HelperMethods.existsLicenseId(record.getLicense(), catalogue)) + license = record.getLicense(); else - if(HelperMethods.existsLicenseId(record.getLicense(), catalogue)) - license = record.getLicense(); - else - throw new Exception("Please check the license id!"); - + throw new Exception("Please check the license id!"); + long version = record.getVersion() == null ? 1 : record.getVersion(); - + // set the visibility of the datatest according the context - boolean publicDataset = context.equals((String)contextServlet.getInitParameter(HelperMethods.PUBLIC_CONTEX_KEY)); - + boolean publicDataset = context + .equals((String) contextServlet.getInitParameter(HelperMethods.PUBLIC_CONTEX_KEY)); + // convert extras' keys to keys with namespace - Map namespaces = HelperMethods.getFieldToFieldNameSpaceMapping(Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_FISHERY); - + Map namespaces = HelperMethods + .getFieldToFieldNameSpaceMapping(Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_FISHERY); + if(namespaces == null) throw new Exception("Failed to retrieve the namespaces for the key fields!"); - - customFields = HelperMethods.replaceFieldsKey(customFields, namespaces, !sourceInPath.equals(Sources.GRSF)); - + + customFields = HelperMethods.replaceFieldsKey(customFields, namespaces, + !sourceInPath.equals(Sources.GRSF)); + String publishInOrganization = CommonServiceUtils.evaluateOrganization(organization, sourceInPath); - + logger.info("Invoking create method.."); - + // create the product - id = catalogue.createCKanDatasetMultipleCustomFields( - apiKey, - futureTitle, - futureName, - publishInOrganization, - authorFullname, - authorMail, - record.getMaintainer() == null? authorFullname : record.getMaintainer(), - record.getMaintainerContact() == null? authorMail : record.getMaintainerContact(), - version, - null, - license, - new ArrayList(tags), - customFields, - resources, - publicDataset); - + id = catalogue.createCKanDatasetMultipleCustomFields(apiKey, futureTitle, futureName, + publishInOrganization, authorFullname, authorMail, + record.getMaintainer() == null ? authorFullname : record.getMaintainer(), + record.getMaintainerContact() == null ? authorMail : record.getMaintainerContact(), version, + null, license, new ArrayList(tags), customFields, resources, publicDataset); + // post actions - if(id != null){ - + if(id != null) { + logger.info("Created record with identifier " + id); String description = Constants.SHORT_NAME_CUSTOM_KEY + ": " + record.getShortName() + "\n"; - + if(sourceInPath.equals(Sources.GRSF)) - description += Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + ": " + record.getFisheryId() + "\n"; - - CommonServiceUtils.actionsPostCreateOrUpdate( - id, futureName, record, apiKey, username, organization, - null, responseBean, catalogue, namespaces, groups, context, token, futureTitle, authorFullname, - contextServlet, false, description); - + description += Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + ": " + record.getFisheryId() + + "\n"; + + CommonServiceUtils.actionsPostCreateOrUpdate(id, futureName, record, apiKey, username, organization, + null, responseBean, catalogue, namespaces, groups, context, token, futureTitle, + authorFullname, contextServlet, false, description); + status = Status.CREATED; - - }else{ + + } else { throw new Exception("There was an error during the record generation, sorry"); } } - }catch(Exception e){ + } catch(Exception e) { logger.error("Failed to create fishery record" + e); status = Status.INTERNAL_SERVER_ERROR; responseBean.setError(e.getMessage()); } - + return Response.status(status).entity(responseBean).build(); - } - + } + @DELETE @Path("delete-product") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Response deleteFishery( - @NotNull(message="input value is missing") - @Valid DeleteRecord recordToDelete, - @PathParam("source") String source) throws ValidationException{ - + public Response deleteFishery(@NotNull(message = "input value is missing") @Valid DeleteRecord recordToDelete, + @PathParam("source") String source) throws ValidationException { + // retrieve context and username Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); String context = ScopeProvider.instance.get(); - + ResponseCreationBean responseBean = new ResponseCreationBean(); Status status = Status.INTERNAL_SERVER_ERROR; - + // check it is a fishery ... - logger.info("Received call to delete product with id " + recordToDelete.getId() + ", checking if it is a fishery"); - try{ - + logger.info( + "Received call to delete product with id " + recordToDelete.getId() + ", checking if it is a fishery"); + try { + DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - + // Cast the source to the accepted ones Sources sourceInPath = Sources.onDeserialize(source); logger.debug("The request is to delete a fishery object of source " + sourceInPath); - + // retrieve the catalogue instance String apiKey = catalogue.getApiKeyFromUsername(username); CkanDataset fisheryInCkan = catalogue.getDataset(recordToDelete.getId(), apiKey); - - if(fisheryInCkan == null){ + + if(fisheryInCkan == null) { status = Status.NOT_FOUND; throw new Exception("There was a problem while serving your request. This item was not found"); } - + // check it is in the right source and it is a fishery String type = fisheryInCkan.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY); - - if((fisheryInCkan.getOrganization().getName().equalsIgnoreCase(source) || fisheryInCkan.getOrganization().getName().toLowerCase().contains(source))&& - Product_Type.FISHERY.getOrigName().equals(type)){ - + + if((fisheryInCkan.getOrganization().getName().equalsIgnoreCase(source) + || fisheryInCkan.getOrganization().getName().toLowerCase().contains(source)) + && Product_Type.FISHERY.getOrigName().equals(type)) { + logger.debug("Ok, this is a fishery of the right source, removing it"); boolean deleted = catalogue.deleteProduct(fisheryInCkan.getId(), apiKey, true); - - if(deleted){ + + if(deleted) { logger.info("Fishery DELETED AND PURGED!"); status = Status.OK; responseBean.setId(fisheryInCkan.getId()); } - }else{ + } else { status = Status.BAD_REQUEST; - throw new Exception("The id you are using doesn't belong to a Fishery item having source " + source + "!"); + throw new Exception( + "The id you are using doesn't belong to a Fishery item having source " + source + "!"); } - }catch(Exception e){ + } catch(Exception e) { logger.error("Failed to delete this", e); responseBean.setError(e.getMessage()); } - + return Response.status(status).entity(responseBean).build(); } - + @GET @Path("get-fisheries-ids") @Produces(MediaType.APPLICATION_JSON) - public Response getFisheriesIds( - @PathParam("source") String source){ - + public Response getFisheriesIds(@PathParam("source") String source) { + logger.info("Received call to get fisheries with source " + source); - + Caller caller = AuthorizationProvider.instance.get(); String context = ScopeProvider.instance.get(); String username = caller.getClient().getId(); ResponseBean responseBean = new ResponseBean(); Status status = Status.INTERNAL_SERVER_ERROR; List datasetsIds = new ArrayList(); - - try{ - + + try { + // Cast the source to the accepted ones Sources sourceInPath = Sources.onDeserialize(source); - + DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - if(catalogue == null){ + if(catalogue == null) { throw new Exception("There was a problem while serving your request"); } - + // if it is a request for GRSF records, we have Fishery - Stock groups, so it is easy. // For other cases, records needs to be parsed if(sourceInPath.equals(Sources.GRSF)) datasetsIds = HelperMethods.getProductsInGroup(source + "-" + "fishery", catalogue); - else{ + else { List fullGroupListIds = HelperMethods.getProductsInOrganization(source, catalogue); String apiKey = catalogue.getApiKeyFromUsername(username); - for (String id : fullGroupListIds) { + for(String id : fullGroupListIds) { CkanDataset dataset = catalogue.getDataset(id, apiKey); - if(dataset != null){ + if(dataset != null) { String type = dataset.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY); if(Product_Type.FISHERY.getOrigName().equals(type)) datasetsIds.add(id); @@ -340,208 +322,185 @@ public class GrsfPublisherFisheryService { status = Status.OK; responseBean.setResult(datasetsIds); responseBean.setSuccess(true); - - }catch(Exception e){ + + } catch(Exception e) { logger.error("Failed to fetch this list of ids ", e); responseBean.setMessage(e.getMessage()); } - + return Response.status(status).entity(responseBean).build(); } - + @GET @Path("get-catalogue-id-and-url-from-name") @Produces(MediaType.APPLICATION_JSON) - public Response getCatalogueIdAndUrlFromKBID( - @QueryParam("name") String name){ - + public Response getCatalogueIdAndUrlFromKBID(@QueryParam("name") String name) { + String context = ScopeProvider.instance.get(); Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); ResponseBean responseBean = new ResponseBean(); Status status = Status.INTERNAL_SERVER_ERROR; - + logger.info("Received call to get the catalogue identifier for the product with name " + name); - - try{ + + try { DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - if(catalogue == null){ + if(catalogue == null) { throw new Exception("There was a problem while serving your request"); } CkanDataset dataset = catalogue.getDataset(name, catalogue.getApiKeyFromUsername(username)); - if(dataset != null){ - Map result = new HashMap(); + if(dataset != null) { + Map result = new HashMap(); result.put("id", dataset.getId()); result.put("url", catalogue.getUnencryptedUrlFromDatasetIdOrName(dataset.getId())); responseBean.setResult(result); responseBean.setSuccess(true); status = Status.OK; - }else{ + } else { responseBean.setMessage("Unable to retrieve a catalogue item with name " + name); } - }catch(Exception e){ + } catch(Exception e) { logger.error("Failed to retrieve this product", e); responseBean.setMessage(e.getMessage()); } return Response.status(status).entity(responseBean).build(); } - + @POST @Path("update-product") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Response updateFishery( - @NotNull(message="record cannot be null") - @Valid FisheryRecord record, - @PathParam("source") String source) - throws ValidationException{ - + public Response updateFishery(@NotNull(message = "record cannot be null") @Valid FisheryRecord record, + @PathParam("source") String source) throws ValidationException { + Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); String context = ScopeProvider.instance.get(); String token = SecurityTokenProvider.instance.get(); - - logger.info("Incoming request for updating a fishery record = " + record + ". Request comes from user " + username + " in context " + context); - + + logger.info("Incoming request for updating a fishery record = " + record + ". Request comes from user " + + username + " in context " + context); + ResponseCreationBean responseBean = new ResponseCreationBean(); Status status = Status.INTERNAL_SERVER_ERROR; - + // catalog id must be reported String catalogId = record.getCatalogId(); - - try{ - - if(catalogId == null || catalogId.isEmpty()){ + + try { + + if(catalogId == null || catalogId.isEmpty()) { status = Status.BAD_REQUEST; throw new Exception("Please specify the '" + Constants.CATALOG_ID + "' property"); } - + DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - - if(catalogue == null){ - throw new Exception("There was a problem while serving your request. No catalogue instance was found in this context!"); - }else{ - + + if(catalogue == null) { + throw new Exception( + "There was a problem while serving your request. No catalogue instance was found in this context!"); + } else { + // get already published record and modify it String apiKey = catalogue.getApiKeyFromUsername(username); CkanDataset recordPublished = catalogue.getDataset(catalogId, apiKey); - + if(recordPublished == null) throw new Exception("A record with catalogue id " + catalogId + " does not exist!"); - + // retrieve the user's email and fullname String authorMail = HelperMethods.getUserEmail(context, token); String authorFullname = HelperMethods.getUserFullname(context, token); - - if(authorMail == null || authorFullname == null){ + + if(authorMail == null || authorFullname == null) { logger.debug("Author fullname or mail missing, cannot continue"); throw new Exception("Sorry but there was not possible to retrieve your fullname/email!"); } - - String organization = HelperMethods.retrieveOrgNameFromScope(context); - + + String organization = HelperMethods.retrieveOrgNameFromScope(context); + // check he/she has admin role CommonServiceUtils.hasAdminRole(username, catalogue, apiKey, organization); - + // name, title, product url and are going to remain unchanged (so we keep them from the already published record); String name = recordPublished.getName(); String title = recordPublished.getTitle(); - + // Cast the source to the accepted ones Sources sourceInPath = Sources.onDeserialize(source); - + // load infos - Map> customFields = record.getExtrasFields(); - Set tags = new HashSet(); + Map> customFields = record.getExtrasFields(); + Set tags = new HashSet(); Set groups = new HashSet(); List resources = record.getExtrasResources(); - + // validate end set sources - CommonServiceUtils.validateRecordAndMapFields( - apiKey, - context, - contextServlet, - sourceInPath, - record, - Product_Type.FISHERY, - tags, - customFields, - groups, - resources, - username, - title); - + CommonServiceUtils.validateRecordAndMapFields(apiKey, context, contextServlet, sourceInPath, record, + Product_Type.FISHERY, tags, customFields, groups, resources, username, title); + // check the license id String license = null; if(record.getLicense() == null || record.getLicense().isEmpty()) license = Constants.DEFAULT_LICENSE; + else if(HelperMethods.existsLicenseId(record.getLicense(), catalogue)) + license = record.getLicense(); else - if(HelperMethods.existsLicenseId(record.getLicense(), catalogue)) - license = record.getLicense(); - else throw new Exception("Please check the license id!"); - + throw new Exception("Please check the license id!"); + long version = record.getVersion() == null ? 1 : record.getVersion(); - + // set the visibility of the datatest according the context - boolean publicDataset = context.equals((String)contextServlet.getInitParameter(HelperMethods.PUBLIC_CONTEX_KEY)); - + boolean publicDataset = context + .equals((String) contextServlet.getInitParameter(HelperMethods.PUBLIC_CONTEX_KEY)); + // convert extras' keys to keys with namespace - Map namespaces = HelperMethods.getFieldToFieldNameSpaceMapping(Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_FISHERY); - + Map namespaces = HelperMethods + .getFieldToFieldNameSpaceMapping(Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_FISHERY); + if(namespaces == null) throw new Exception("Failed to retrieve the namespaces for the key fields!"); - + // retrieve the already generated url - String modifiedUUIDKey = namespaces.containsKey(Constants.ITEM_URL_FIELD) ? - namespaces.get(Constants.ITEM_URL_FIELD) : - Constants.ITEM_URL_FIELD; - String itemUrl = recordPublished.getExtrasAsHashMap().get(modifiedUUIDKey); - customFields.put(Constants.ITEM_URL_FIELD, Arrays.asList(itemUrl)); - - // replace fields - customFields = HelperMethods.replaceFieldsKey(customFields, namespaces, !sourceInPath.equals(Sources.GRSF)); - - String publishInOrganization = CommonServiceUtils.evaluateOrganization(organization, sourceInPath); - - logger.info("Invoking update method.."); - - // update the product - String id = catalogue.updateCKanDataset( - apiKey, - catalogId, - title, name, - publishInOrganization, - authorFullname, - authorMail, - record.getMaintainer(), - record.getMaintainerContact(), - version, - HelperMethods.removeHTML(record.getDescription()), - license, - new ArrayList(tags), - null, // remove any previous group - customFields, - resources, - publicDataset); - - if(id != null){ - logger.info("Item updated!"); - - String description = Constants.SHORT_NAME_CUSTOM_KEY + ": " + record.getShortName() + "\n"; - - if(sourceInPath.equals(Sources.GRSF)) - description += Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + ": " + record.getFisheryId() + "\n"; - - CommonServiceUtils.actionsPostCreateOrUpdate( - id, name, record, apiKey, username, organization, - itemUrl, responseBean, catalogue, namespaces, groups, context, token, title, authorFullname, - contextServlet, true, description); - status = Status.OK; - }else{ - throw new Exception("There was an error during the item updated, sorry"); - } + String modifiedUUIDKey = namespaces.containsKey(Constants.ITEM_URL_FIELD) + ? namespaces.get(Constants.ITEM_URL_FIELD) + : Constants.ITEM_URL_FIELD; + String itemUrl = recordPublished.getExtrasAsHashMap().get(modifiedUUIDKey); + customFields.put(Constants.ITEM_URL_FIELD, Arrays.asList(itemUrl)); + + // replace fields + customFields = HelperMethods.replaceFieldsKey(customFields, namespaces, + !sourceInPath.equals(Sources.GRSF)); + + String publishInOrganization = CommonServiceUtils.evaluateOrganization(organization, sourceInPath); + + logger.info("Invoking update method.."); + + // update the product + String id = catalogue.updateCKanDataset(apiKey, catalogId, title, name, publishInOrganization, + authorFullname, authorMail, record.getMaintainer(), record.getMaintainerContact(), version, + HelperMethods.removeHTML(record.getDescription()), license, new ArrayList(tags), null, // remove any previous group + customFields, resources, publicDataset); + + if(id != null) { + logger.info("Item updated!"); + + String description = Constants.SHORT_NAME_CUSTOM_KEY + ": " + record.getShortName() + "\n"; + + if(sourceInPath.equals(Sources.GRSF)) + description += Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + ": " + record.getFisheryId() + + "\n"; + + CommonServiceUtils.actionsPostCreateOrUpdate(id, name, record, apiKey, username, organization, + itemUrl, responseBean, catalogue, namespaces, groups, context, token, title, authorFullname, + contextServlet, true, description); + status = Status.OK; + } else { + throw new Exception("There was an error during the item updated, sorry"); + } } - }catch(Exception e){ + } catch(Exception e) { logger.error("Failed to update fishery record" + e); responseBean.setError(e.getMessage()); } @@ -552,53 +511,54 @@ public class GrsfPublisherFisheryService { @Path("update-status") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Response updateStatusStock( - @Valid UpdateRecordStatus bean, - @PathParam("source") String source) - throws ValidationException{ - - + public Response updateStatusStock(@Valid UpdateRecordStatus bean, @PathParam("source") String source) + throws ValidationException { + Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); String context = ScopeProvider.instance.get(); - - logger.info("Incoming request for updating a status of record = " + bean + ". Request comes from user " + username + " in context " + context); - + + logger.info("Incoming request for updating a status of record = " + bean + ". Request comes from user " + + username + " in context " + context); + ResponseCreationBean responseBean = new ResponseCreationBean(); Status status = Status.INTERNAL_SERVER_ERROR; - - try{ - + + try { + DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - - if(catalogue == null){ - throw new Exception("There was a problem while serving your request. No catalogue instance was found in this context!"); - }else{ + + if(catalogue == null) { + throw new Exception( + "There was a problem while serving your request. No catalogue instance was found in this context!"); + } else { // catalog id must be reported String uuid = bean.getUuid(); String newStatus = bean.getNewStatus().getOrigName(); - + // get the dataset String apiKeyUser = catalogue.getApiKeyFromUsername(username); CkanDataset record = catalogue.getDataset(uuid, apiKeyUser); - + if(record == null) throw new Exception("A record with knowledge_base_id id " + uuid + " does not exist!"); - + // check system type - boolean isGRSF = !record.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY).equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE); - + boolean isGRSF = !record.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY) + .equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE); + if(!isGRSF) throw new Exception("You are trying to modify a Legacy record!"); - boolean rightDomain = record.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY).equalsIgnoreCase(Product_Type.FISHERY.getOrigName()); + boolean rightDomain = record.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY) + .equalsIgnoreCase(Product_Type.FISHERY.getOrigName()); if(!rightDomain) throw new Exception("This is not a Fishery record!"); // update it - Map> updateStatus = new HashMap>(1); + Map> updateStatus = new HashMap>(1); updateStatus.put(Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY, Arrays.asList(newStatus)); catalogue.patchProductCustomFields(uuid, apiKeyUser, updateStatus, true); status = Status.OK; @@ -606,14 +566,14 @@ public class GrsfPublisherFisheryService { responseBean.setKbUuid(uuid); responseBean.setId(record.getId()); responseBean.setItemUrl(record.getExtrasAsHashMap().get(Constants.ITEM_URL_FIELD)); - + } - }catch(Exception e){ - logger.error("Failed to update fishery record's status", e); + } catch(Exception e) { + logger.error("Failed to update fishery record's status", e); responseBean.setError(e.getMessage()); } - + return Response.status(status).entity(responseBean).build(); - + } } \ No newline at end of file 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 b6ba42b..1825084 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 @@ -48,291 +48,277 @@ import eu.trentorise.opendata.jackan.model.CkanDataset; /** * Stock web service methods. - * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) + * @author Costantino Perciante (ISTI - CNR) + * @author Luca Frosini (ISTI - CNR) */ @Path("{source:firms|FIRMS|ram|RAM|grsf|GRSF|FishSource|fishsource}/stock/") public class GrsfPublisherStockService { - + // the context - @Context ServletContext contextServlet; - + @Context + ServletContext contextServlet; + // Logger private static final org.slf4j.Logger logger = LoggerFactory.getLogger(GrsfPublisherStockService.class); - + @GET @Path("hello") @Produces(MediaType.TEXT_PLAIN) - public Response hello(){ + public Response hello() { return Response.ok("Hello.. Stock service is here").build(); } - + @GET @Path("get-licenses") @Produces(MediaType.APPLICATION_JSON) - public Response getLicenses(){ + public Response getLicenses() { Status status = Status.OK; String context = ScopeProvider.instance.get(); DataCatalogue catalogue; try { catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - Map licenses = CommonServiceUtils.getLicenses(catalogue); + Map licenses = CommonServiceUtils.getLicenses(catalogue); if(licenses == null) status = Status.INTERNAL_SERVER_ERROR; return Response.status(status).entity(licenses).build(); - } catch (Exception e) { + } catch(Exception e) { status = Status.INTERNAL_SERVER_ERROR; - return Response.status(status).entity(new ResponseBean(false, - "Unable to retrieve license list " + e.getLocalizedMessage(), null)).build(); + return Response.status(status) + .entity(new ResponseBean(false, "Unable to retrieve license list " + e.getLocalizedMessage(), null)) + .build(); } } - + @POST @Path("publish-product") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Response publishStock( - @NotNull(message="record cannot be null") @Valid StockRecord record, - @PathParam("source") String source) throws ValidationException{ - + public Response publishStock(@NotNull(message = "record cannot be null") @Valid StockRecord record, + @PathParam("source") String source) throws ValidationException { + Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); String context = ScopeProvider.instance.get(); String token = SecurityTokenProvider.instance.get(); - - logger.info("Incoming request for creating a stock record = " + record + ".\nRequest coming from user " + username + " in context " + context); - + + logger.info("Incoming request for creating a stock record = " + record + ".\nRequest coming from user " + + username + " in context " + context); + ResponseCreationBean responseBean = new ResponseCreationBean(); Status status = Status.INTERNAL_SERVER_ERROR; String id = ""; // id of the created record, if everything went ok - - try{ - + + try { + // Cast the source to the accepted ones Sources sourceInPath = Sources.onDeserialize(source); - + DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - if(catalogue == null){ + if(catalogue == null) { throw new Exception("There was a problem while serving your request. No catalogue instance was found!"); - }else{ - + } else { + String apiKey = catalogue.getApiKeyFromUsername(username); - String organization = HelperMethods.retrieveOrgNameFromScope(context); //"grsf_admin"; - + String organization = HelperMethods.retrieveOrgNameFromScope(context); //"grsf_admin"; + // check it has admin role or throw exception CommonServiceUtils.hasAdminRole(username, catalogue, apiKey, organization); - + // extend this role to the other organizations in this context - CommonServiceUtils.extendRoleToOtherOrganizations(username, catalogue, organization, RolesCkanGroupOrOrg.ADMIN); - + CommonServiceUtils.extendRoleToOtherOrganizations(username, catalogue, organization, + RolesCkanGroupOrOrg.ADMIN); + // retrieve the user's email and fullname String authorMail = HelperMethods.getUserEmail(context, token); String authorFullname = HelperMethods.getUserFullname(context, token); - - if(authorMail == null || authorFullname == null){ + + if(authorMail == null || authorFullname == null) { throw new Exception("Sorry but it was not possible to retrieve your fullname/email!"); } - + // check the record has a name, at least String futureName = record.getUuid(); String futureTitle = record.getStockName(); - + // check name and throws exception CommonServiceUtils.checkName(futureName, catalogue); - + // load other information - Map> customFields = record.getExtrasFields(); - Set tags = new HashSet(); + Map> customFields = record.getExtrasFields(); + Set tags = new HashSet(); Set groups = new HashSet(); List resources = record.getExtrasResources(); - + // validate end set sources, tags, etc - CommonServiceUtils.validateRecordAndMapFields( - apiKey, - context, - contextServlet, - sourceInPath, - record, - Product_Type.STOCK, - tags, - customFields, - groups, - resources, - username, - futureTitle); - + CommonServiceUtils.validateRecordAndMapFields(apiKey, context, contextServlet, sourceInPath, record, + Product_Type.STOCK, tags, customFields, groups, resources, username, futureTitle); + // check the license id String license = null; if(record.getLicense() == null || record.getLicense().isEmpty()) license = Constants.DEFAULT_LICENSE; + else if(HelperMethods.existsLicenseId(record.getLicense(), catalogue)) + license = record.getLicense(); else - if(HelperMethods.existsLicenseId(record.getLicense(), catalogue)) - license = record.getLicense(); - else throw new Exception("Please check the license id!"); - + throw new Exception("Please check the license id!"); + // check the version long version = record.getVersion() == null ? 1 : record.getVersion(); - + // set the visibility of the datatest according the context - boolean publicDataset = context.equals((String)contextServlet.getInitParameter(HelperMethods.PUBLIC_CONTEX_KEY)); - + boolean publicDataset = context + .equals((String) contextServlet.getInitParameter(HelperMethods.PUBLIC_CONTEX_KEY)); + // convert extras' keys to keys with namespace - Map namespaces = HelperMethods.getFieldToFieldNameSpaceMapping(Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_STOCK); - + Map namespaces = HelperMethods + .getFieldToFieldNameSpaceMapping(Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_STOCK); + if(namespaces == null) throw new Exception("Failed to retrieve the namespaces for the key fields!"); - - customFields = HelperMethods.replaceFieldsKey(customFields, namespaces, !sourceInPath.equals(Sources.GRSF)); - + + customFields = HelperMethods.replaceFieldsKey(customFields, namespaces, + !sourceInPath.equals(Sources.GRSF)); + String publishInOrganization = CommonServiceUtils.evaluateOrganization(organization, sourceInPath); - + logger.info("Invoking create method.."); - + // create the product - id = catalogue.createCKanDatasetMultipleCustomFields( - apiKey, - futureTitle, - futureName, - publishInOrganization, - authorFullname, - authorMail, - record.getMaintainer() == null? authorFullname : record.getMaintainer(), - record.getMaintainerContact() == null? authorMail : record.getMaintainerContact(), - version, - HelperMethods.removeHTML(record.getDescription()), - license, - new ArrayList(tags), - customFields, - resources, - publicDataset); - - if(id != null){ - + id = catalogue.createCKanDatasetMultipleCustomFields(apiKey, futureTitle, futureName, + publishInOrganization, authorFullname, authorMail, + record.getMaintainer() == null ? authorFullname : record.getMaintainer(), + record.getMaintainerContact() == null ? authorMail : record.getMaintainerContact(), version, + HelperMethods.removeHTML(record.getDescription()), license, new ArrayList(tags), + customFields, resources, publicDataset); + + if(id != null) { + logger.info("Product created! Id is " + id); String description = Constants.SHORT_NAME_CUSTOM_KEY + ": " + record.getShortName() + "\n"; - + if(sourceInPath.equals(Sources.GRSF)) - description += Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + ": " + record.getStockId() + "\n"; - - CommonServiceUtils.actionsPostCreateOrUpdate( - id, futureName, record, apiKey, username, organization, null, - responseBean, catalogue, namespaces, groups, context, token, - futureTitle, authorFullname, contextServlet, false, description); - + description += Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + ": " + record.getStockId() + + "\n"; + + CommonServiceUtils.actionsPostCreateOrUpdate(id, futureName, record, apiKey, username, organization, + null, responseBean, catalogue, namespaces, groups, context, token, futureTitle, + authorFullname, contextServlet, false, description); + status = Status.CREATED; - - }else - throw new Exception("There was an error during the product generation, sorry! Unable to create the dataset"); + + } else + throw new Exception( + "There was an error during the product generation, sorry! Unable to create the dataset"); } - }catch(Exception e){ + } catch(Exception e) { logger.error("Failed to create stock record", e); status = Status.INTERNAL_SERVER_ERROR; responseBean.setError(e.getMessage()); } return Response.status(status).entity(responseBean).build(); } - + @DELETE @Path("delete-product") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Response deleteStock( - @NotNull(message="missing input value") - @Valid DeleteRecord recordToDelete, - @PathParam("source") String source) throws ValidationException{ - + public Response deleteStock(@NotNull(message = "missing input value") @Valid DeleteRecord recordToDelete, + @PathParam("source") String source) throws ValidationException { + // retrieve context and username Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); String context = ScopeProvider.instance.get(); - + ResponseCreationBean responseBean = new ResponseCreationBean(); Status status = Status.INTERNAL_SERVER_ERROR; - + // check it is a stock ... - logger.info("Received call to delete product with id " + recordToDelete.getId() + ", checking if it is a stock"); - try{ - + logger.info( + "Received call to delete product with id " + recordToDelete.getId() + ", checking if it is a stock"); + try { + DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - if(catalogue == null){ + if(catalogue == null) { status = Status.INTERNAL_SERVER_ERROR; throw new Exception("There was a problem while serving your request"); } - + // Cast the source to the accepted ones Sources sourceInPath = Sources.onDeserialize(source); String apiKey = catalogue.getApiKeyFromUsername(username); logger.info("The request is to delete a stock object of source " + sourceInPath); - + // retrieve the catalogue instance CkanDataset stockInCkan = catalogue.getDataset(recordToDelete.getId(), apiKey); - - if(stockInCkan == null){ + + if(stockInCkan == null) { status = Status.NOT_FOUND; throw new Exception("There was a problem while serving your request. This product was not found"); } - + // check it is in the right source and it is a stock String type = stockInCkan.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY); - if((stockInCkan.getOrganization().getName().equalsIgnoreCase(source) || stockInCkan.getOrganization().getName().toLowerCase().contains(source)) - && Product_Type.STOCK.getOrigName().equals(type)){ - + if((stockInCkan.getOrganization().getName().equalsIgnoreCase(source) + || stockInCkan.getOrganization().getName().toLowerCase().contains(source)) + && Product_Type.STOCK.getOrigName().equals(type)) { + logger.debug("Ok, this is a stock of the right type, removing it"); boolean deleted = catalogue.deleteProduct(stockInCkan.getId(), apiKey, true); - if(deleted){ + if(deleted) { logger.info("Stock DELETED AND PURGED!"); status = Status.OK; responseBean.setId(stockInCkan.getId()); - } - else{ + } else { status = Status.INTERNAL_SERVER_ERROR; throw new Exception("Request failed, sorry. Unable to delete/purge the stock"); } - }else{ + } else { status = Status.BAD_REQUEST; - throw new Exception("The id you are using doesn't belong to a Stock product having source " + source + "!"); + throw new Exception( + "The id you are using doesn't belong to a Stock product having source " + source + "!"); } - }catch(Exception e){ + } catch(Exception e) { logger.error("Failed to delete this ", e); responseBean.setError(e.getMessage()); } return Response.status(status).entity(responseBean).build(); } - + @GET @Path("get-stocks-ids") @Produces(MediaType.APPLICATION_JSON) - public Response getStocksIds( - @PathParam("source") String source){ - + public Response getStocksIds(@PathParam("source") String source) { + // retrieve context and username Caller caller = AuthorizationProvider.instance.get(); String context = ScopeProvider.instance.get(); String username = caller.getClient().getId(); Status status = Status.INTERNAL_SERVER_ERROR; ResponseBean responseBean = new ResponseBean(); - + // check it is a stock ... logger.info("Received call to get stocks with source " + source); List datasetsIds = new ArrayList(); - try{ - + try { + // Cast the source to the accepted ones Sources sourceInPath = Sources.onDeserialize(source); DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - if(catalogue == null){ + if(catalogue == null) { status = Status.INTERNAL_SERVER_ERROR; throw new Exception("There was a problem while serving your request"); } - + // if it is a request for GRSF records, we have Fishery - Stock groups, so it is easy. // For other cases, records needs to be parsed if(sourceInPath.equals(Sources.GRSF)) datasetsIds = HelperMethods.getProductsInGroup(source + "-" + "stock", catalogue); - else{ + else { List fullGroupListIds = HelperMethods.getProductsInOrganization(source, catalogue); - for (String id : fullGroupListIds) { + for(String id : fullGroupListIds) { CkanDataset dataset = catalogue.getDataset(id, catalogue.getApiKeyFromUsername(username)); - if(dataset != null){ + if(dataset != null) { String type = dataset.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY); if(Product_Type.STOCK.getOrigName().equals(type)) datasetsIds.add(id); @@ -342,19 +328,18 @@ public class GrsfPublisherStockService { responseBean.setResult(datasetsIds); responseBean.setSuccess(true); status = Status.OK; - }catch(Exception e){ + } catch(Exception e) { logger.error("Failed to fetch this list of ids " + source, e); responseBean.setMessage(e.getMessage()); } return Response.status(status).entity(responseBean).build(); } - + @GET @Path("get-catalogue-id-and-url-from-name") @Produces(MediaType.APPLICATION_JSON) - public Response getCatalogueIdAndUrlFromKBID( - @QueryParam("name") String name){ - + public Response getCatalogueIdAndUrlFromKBID(@QueryParam("name") String name) { + // retrieve context and username String context = ScopeProvider.instance.get(); Caller caller = AuthorizationProvider.instance.get(); @@ -362,241 +347,222 @@ public class GrsfPublisherStockService { ResponseBean responseBean = new ResponseBean(); Status status = Status.INTERNAL_SERVER_ERROR; logger.info("Received call to get the catalogue identifier for the product with name " + name); - try{ + try { DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - if(catalogue == null){ + if(catalogue == null) { throw new Exception("There was a problem while serving your request"); } CkanDataset dataset = catalogue.getDataset(name, catalogue.getApiKeyFromUsername(username)); - if(dataset != null){ - Map result = new HashMap(); + if(dataset != null) { + Map result = new HashMap(); result.put("id", dataset.getId()); result.put("url", catalogue.getUnencryptedUrlFromDatasetIdOrName(dataset.getId())); responseBean.setResult(result); responseBean.setSuccess(true); status = Status.OK; - }else{ + } else { responseBean.setMessage("Unable to retrieve a catalogue product with name " + name); } - }catch(Exception e){ + } catch(Exception e) { logger.error("Failed to retrieve this product", e); responseBean.setMessage(e.getMessage()); } return Response.status(status).entity(responseBean).build(); } - + @POST @Path("update-product") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Response updateStock( - @NotNull(message="record cannot be null") - @Valid StockRecord record, - @PathParam("source") String source) - throws ValidationException{ - + public Response updateStock(@NotNull(message = "record cannot be null") @Valid StockRecord record, + @PathParam("source") String source) throws ValidationException { + Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); String context = ScopeProvider.instance.get(); String token = SecurityTokenProvider.instance.get(); - - logger.info("Incoming request for updating a stock record = " + record + ". Request comes from user " + username + " in context " + context); - + + logger.info("Incoming request for updating a stock record = " + record + ". Request comes from user " + username + + " in context " + context); + ResponseCreationBean responseBean = new ResponseCreationBean(); Status status = Status.INTERNAL_SERVER_ERROR; - + // catalog id must be reported String catalogId = record.getCatalogId(); - - try{ - - if(catalogId == null || catalogId.isEmpty()){ + + try { + + if(catalogId == null || catalogId.isEmpty()) { status = Status.BAD_REQUEST; throw new Exception("Please specify the 'catalog_id' property"); } - + DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - - if(catalogue == null){ - throw new Exception("There was a problem while serving your request. No catalogue instance was found in this context!"); - }else{ - + + if(catalogue == null) { + throw new Exception( + "There was a problem while serving your request. No catalogue instance was found in this context!"); + } else { + // get already published record and modify it String apiKey = catalogue.getApiKeyFromUsername(username); CkanDataset recordPublished = catalogue.getDataset(catalogId, apiKey); - + if(recordPublished == null) throw new Exception("A record with id " + catalogId + " does not exist!"); - + // retrieve the user's email and fullname String authorMail = HelperMethods.getUserEmail(context, token); String authorFullname = HelperMethods.getUserFullname(context, token); - - if(authorMail == null || authorFullname == null){ + + if(authorMail == null || authorFullname == null) { logger.debug("Author fullname or mail missing, cannot continue"); throw new Exception("Sorry but there was not possible to retrieve your fullname/email!"); } String organization = HelperMethods.retrieveOrgNameFromScope(context); //"grsf_admin"; - + // check he/she has admin role CommonServiceUtils.hasAdminRole(username, catalogue, apiKey, organization); - + // name, title, product url and are going to remain unchanged (so we keep them from the publisher record); String name = recordPublished.getName(); String title = recordPublished.getTitle(); - + // Cast the source to the accepted ones Sources sourceInPath = Sources.onDeserialize(source); - + // load infos - Map> customFields = record.getExtrasFields(); - Set tags = new HashSet(); + Map> customFields = record.getExtrasFields(); + Set tags = new HashSet(); Set groups = new HashSet(); List resources = record.getExtrasResources(); - + // validate end set sources - CommonServiceUtils.validateRecordAndMapFields( - apiKey, - context, - contextServlet, - sourceInPath, - record, - Product_Type.STOCK, - tags, - customFields, - groups, - resources, - username, - title); - + CommonServiceUtils.validateRecordAndMapFields(apiKey, context, contextServlet, sourceInPath, record, + Product_Type.STOCK, tags, customFields, groups, resources, username, title); + // check the license id String license = null; if(record.getLicense() == null || record.getLicense().isEmpty()) license = Constants.DEFAULT_LICENSE; + else if(HelperMethods.existsLicenseId(record.getLicense(), catalogue)) + license = record.getLicense(); else - if(HelperMethods.existsLicenseId(record.getLicense(), catalogue)) - license = record.getLicense(); - else throw new Exception("Please check the license id!"); - + throw new Exception("Please check the license id!"); + long version = record.getVersion() == null ? 1 : record.getVersion(); - + // set the visibility of the datatest according the context - boolean publicDataset = context.equals((String)contextServlet.getInitParameter(HelperMethods.PUBLIC_CONTEX_KEY)); - + boolean publicDataset = context + .equals((String) contextServlet.getInitParameter(HelperMethods.PUBLIC_CONTEX_KEY)); + // convert extras' keys to keys with namespace - Map namespaces = HelperMethods.getFieldToFieldNameSpaceMapping(Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_STOCK); - + Map namespaces = HelperMethods + .getFieldToFieldNameSpaceMapping(Constants.GENERIC_RESOURCE_NAME_MAP_KEY_NAMESPACES_STOCK); + if(namespaces == null) throw new Exception("Failed to retrieve the namespaces for the key fields!"); - + // retrieve the url - String modifiedUUIDKey = namespaces.containsKey(Constants.ITEM_URL_FIELD) ? namespaces.get(Constants.ITEM_URL_FIELD) : Constants.ITEM_URL_FIELD; + String modifiedUUIDKey = namespaces.containsKey(Constants.ITEM_URL_FIELD) + ? namespaces.get(Constants.ITEM_URL_FIELD) + : Constants.ITEM_URL_FIELD; String itemUrl = recordPublished.getExtrasAsHashMap().get(modifiedUUIDKey); customFields.put(Constants.ITEM_URL_FIELD, Arrays.asList(itemUrl)); - + // replace fields - customFields = HelperMethods.replaceFieldsKey(customFields, namespaces,!sourceInPath.equals(Sources.GRSF)); - + customFields = HelperMethods.replaceFieldsKey(customFields, namespaces, + !sourceInPath.equals(Sources.GRSF)); + String publishInOrganization = CommonServiceUtils.evaluateOrganization(organization, sourceInPath); - + logger.info("Invoking update method.."); - + // update the product - String id = catalogue.updateCKanDataset( - apiKey, - catalogId, - title, name, - publishInOrganization, - authorFullname, - authorMail, - record.getMaintainer(), - record.getMaintainerContact(), - version, - HelperMethods.removeHTML(record.getDescription()), - license, - new ArrayList(tags), - null, // remove any previous group - customFields, - resources, - publicDataset); - - if(id != null){ - + String id = catalogue.updateCKanDataset(apiKey, catalogId, title, name, publishInOrganization, + authorFullname, authorMail, record.getMaintainer(), record.getMaintainerContact(), version, + HelperMethods.removeHTML(record.getDescription()), license, new ArrayList(tags), null, // remove any previous group + customFields, resources, publicDataset); + + if(id != null) { + logger.info("Item updated!"); - + String description = Constants.SHORT_NAME_CUSTOM_KEY + ": " + record.getShortName() + "\n"; - + if(sourceInPath.equals(Sources.GRSF)) - description += Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + ": " + record.getStockId() + "\n"; - CommonServiceUtils.actionsPostCreateOrUpdate( - recordPublished.getId(), name, record, apiKey, username, organization, itemUrl, - responseBean, catalogue, namespaces, groups, context, token, - title, authorFullname, contextServlet, true, description); + description += Constants.GRSF_SEMANTIC_IDENTIFIER_CUSTOM_KEY + ": " + record.getStockId() + + "\n"; + CommonServiceUtils.actionsPostCreateOrUpdate(recordPublished.getId(), name, record, apiKey, + username, organization, itemUrl, responseBean, catalogue, namespaces, groups, context, + token, title, authorFullname, contextServlet, true, description); status = Status.OK; - - }else{ + + } else { throw new Exception("There was an error during the item updated, sorry"); } } - }catch(Exception e){ - logger.error("Failed to update stock record", e); + } catch(Exception e) { + logger.error("Failed to update stock record", e); responseBean.setError(e.getMessage()); } return Response.status(status).entity(responseBean).build(); } - + @POST @Path("update-status") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Response updateStatusStock( - @Valid UpdateRecordStatus bean, - @PathParam("source") String source) - throws ValidationException{ - - + public Response updateStatusStock(@Valid UpdateRecordStatus bean, @PathParam("source") String source) + throws ValidationException { + Caller caller = AuthorizationProvider.instance.get(); String username = caller.getClient().getId(); String context = ScopeProvider.instance.get(); - - logger.info("Incoming request for updating a status of record = " + bean + ". Request comes from user " + username + " in context " + context); - + + logger.info("Incoming request for updating a status of record = " + bean + ". Request comes from user " + + username + " in context " + context); + Status status = Status.INTERNAL_SERVER_ERROR; ResponseCreationBean responseBean = new ResponseCreationBean(); - - try{ - + + try { + DataCatalogue catalogue = HelperMethods.getDataCatalogueRunningInstance(context); - - if(catalogue == null){ - throw new Exception("There was a problem while serving your request. No catalogue instance was found in this context!"); - }else{ + + if(catalogue == null) { + throw new Exception( + "There was a problem while serving your request. No catalogue instance was found in this context!"); + } else { // catalog id must be reported String uuid = bean.getUuid(); String newStatus = bean.getNewStatus().getOrigName(); - + // get the dataset String apiKeyUser = catalogue.getApiKeyFromUsername(username); CkanDataset record = catalogue.getDataset(uuid, apiKeyUser); - + if(record == null) throw new Exception("A record with knowledge_base_id id " + uuid + " does not exist!"); - + // check system type - boolean isGRSF = !record.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY).equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE); - + boolean isGRSF = !record.getExtrasAsHashMap().get(Constants.SYSTEM_TYPE_CUSTOM_KEY) + .equals(Constants.SYSTEM_TYPE_FOR_SOURCES_VALUE); + if(!isGRSF) throw new Exception("You are trying to modify a Legacy record!"); - boolean rightDomain = record.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY).equals(Product_Type.STOCK.getOrigName()); + boolean rightDomain = record.getExtrasAsHashMap().get(Constants.DOMAIN_CUSTOM_KEY) + .equals(Product_Type.STOCK.getOrigName()); if(!rightDomain) throw new Exception("This is not a Stock record!"); // update it - Map> updateStatus = new HashMap>(1); + Map> updateStatus = new HashMap>(1); updateStatus.put(Constants.STATUS_OF_THE_GRSF_RECORD_CUSTOM_KEY, Arrays.asList(newStatus)); catalogue.patchProductCustomFields(uuid, apiKeyUser, updateStatus, true); status = Status.OK; @@ -605,13 +571,13 @@ public class GrsfPublisherStockService { responseBean.setId(record.getId()); responseBean.setItemUrl(record.getExtrasAsHashMap().get(Constants.ITEM_URL_FIELD)); } - }catch(Exception e){ - logger.error("Failed to update stock record's status", e); + } catch(Exception e) { + logger.error("Failed to update stock record's status", e); responseBean.setError(e.getMessage()); } - + return Response.status(status).entity(responseBean).build(); - + } - + } \ No newline at end of file