From 6f2e32337f9400c5d71dd51047b4ec06aa3b7822 Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Fri, 8 Feb 2019 11:04:20 +0000 Subject: [PATCH] Refs #13306: gCat MUST enforce extra field "searchable" in published Items Task-Url: https://support.d4science.org/issues/13306 git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/data-publishing/gcat@177044 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../org/gcube/gcat/oldutils/Validator.java | 18 +++++----- .../gcat/persistence/ckan/CKANPackage.java | 34 ++++++++++++++++--- .../persistence/ckan/CKANPackageTest.java | 6 ++-- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/gcube/gcat/oldutils/Validator.java b/src/main/java/org/gcube/gcat/oldutils/Validator.java index f992930..7f941cd 100644 --- a/src/main/java/org/gcube/gcat/oldutils/Validator.java +++ b/src/main/java/org/gcube/gcat/oldutils/Validator.java @@ -78,7 +78,7 @@ public class Validator { */ public static void validateAgainstProfile(JSONObject obj) throws Exception { - JSONArray extrasArrayOriginal = (JSONArray) obj.get(CKANPackage.EXTRA_TYPES_KEY); + JSONArray extrasArrayOriginal = (JSONArray) obj.get(CKANPackage.EXTRAS_KEY); JSONArray groupsArrayOriginal = (JSONArray) obj.get(CKANPackage.GROUPS_KEY); JSONArray tagsArrayOriginal = (JSONArray) obj.get(CKANPackage.TAGS_KEY); @@ -101,7 +101,7 @@ public class Validator { while(iterator.hasNext()) { JSONObject object = (JSONObject) iterator.next(); CustomField cf = new CustomField(object); - if(cf.getKey().equals(CKANPackage.EXTRA_TYPES_KEY_VALUE_SYSTEM_TYPE)) { + if(cf.getKey().equals(CKANPackage.EXTRAS_KEY_VALUE_SYSTEM_TYPE)) { metadataTypeCF = cf; } else if(cf.getKey().equals(SocialService.ITEM_URL)) { continue; @@ -111,7 +111,7 @@ public class Validator { } if(metadataTypeCF == null) { - throw new BadRequestException("'" + CKANPackage.EXTRA_TYPES_KEY_VALUE_SYSTEM_TYPE + throw new BadRequestException("'" + CKANPackage.EXTRAS_KEY_VALUE_SYSTEM_TYPE + "' extra field is missing in context where metadata profile(s) are defined!"); } @@ -120,7 +120,7 @@ public class Validator { MetadataUtility metadataUtility = MetadataUtility.getInstance(); MetadataFormat profile = metadataUtility.getMetadataFormat(profileName); if(profile == null) { - throw new BadRequestException("'" + CKANPackage.EXTRA_TYPES_KEY_VALUE_SYSTEM_TYPE + "' extra field's value ('" + throw new BadRequestException("'" + CKANPackage.EXTRAS_KEY_VALUE_SYSTEM_TYPE + "' extra field's value ('" + profileName + "') specified as custom field doesn't match any of the profiles defined in this context!"); } else { @@ -207,15 +207,15 @@ public class Validator { // convert back to json for(CustomField customField : validatedCustomFields) { JSONObject jsonObj = new JSONObject(); - jsonObj.put(CKANPackage.EXTRA_TYPES_KEY_KEY, customField.getQualifiedKey()); - jsonObj.put(CKANPackage.EXTRA_TYPES_VALUE_KEY, customField.getValue()); + jsonObj.put(CKANPackage.EXTRAS_KEY_KEY, customField.getQualifiedKey()); + jsonObj.put(CKANPackage.EXTRAS_VALUE_KEY, customField.getValue()); extrasArrayUpdated.add(jsonObj); } // add metadata type field as last element JSONObject metadataTypeJSON = new JSONObject(); - metadataTypeJSON.put(CKANPackage.EXTRA_TYPES_KEY_KEY, metadataTypeCF.getKey()); - metadataTypeJSON.put(CKANPackage.EXTRA_TYPES_VALUE_KEY, metadataTypeCF.getValue()); + metadataTypeJSON.put(CKANPackage.EXTRAS_KEY_KEY, metadataTypeCF.getKey()); + metadataTypeJSON.put(CKANPackage.EXTRAS_VALUE_KEY, metadataTypeCF.getValue()); extrasArrayUpdated.add(metadataTypeJSON); // create groups @@ -230,7 +230,7 @@ public class Validator { obj.put(CKANPackage.TAGS_KEY, tagsArrayOriginal); obj.put(CKANPackage.GROUPS_KEY, groupsArrayOriginal); - obj.put(CKANPackage.EXTRA_TYPES_KEY, extrasArrayUpdated); + obj.put(CKANPackage.EXTRAS_KEY, extrasArrayUpdated); } diff --git a/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java b/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java index 5397de7..d52b31f 100644 --- a/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java +++ b/src/main/java/org/gcube/gcat/persistence/ckan/CKANPackage.java @@ -62,10 +62,12 @@ public class CKANPackage extends CKAN { protected static final String RESOURCES_KEY = "resources"; protected static final String TITLE_KEY = "title"; - public static final String EXTRA_TYPES_KEY = "extras"; - public static final String EXTRA_TYPES_KEY_KEY = "key"; - public static final String EXTRA_TYPES_KEY_VALUE_SYSTEM_TYPE = "system:type"; - public static final String EXTRA_TYPES_VALUE_KEY = "value"; + public static final String EXTRAS_KEY = "extras"; + public static final String EXTRAS_KEY_KEY = "key"; + public static final String EXTRAS_KEY_VALUE_SYSTEM_TYPE = "system:type"; + public static final String EXTRAS_VALUE_KEY = "value"; + + public static final String SEARCHABLE_KEY = "searchable"; public static final String GROUPS_KEY = "groups"; public static final String TAGS_KEY = "tags"; @@ -146,6 +148,30 @@ public class CKANPackage extends CKAN { } } + + if(objectNode.has(EXTRAS_KEY)) { + try { + ArrayNode extrasObjectNode = (ArrayNode) objectNode.get(EXTRAS_KEY); + for(JsonNode jsonNode : extrasObjectNode) { + String key = jsonNode.get(EXTRAS_KEY_KEY).asText(); + if(key.compareTo(SEARCHABLE_KEY)==0) { + ObjectNode searchableObjectNode = (ObjectNode) jsonNode; + searchableObjectNode.put(EXTRAS_VALUE_KEY, true); + break; + } + } + }catch (Exception e) { + throw new BadRequestException("Invalid '"+EXTRAS_KEY+"' field", e); + } + }else { + ArrayNode extrasObjectNode = mapper.createArrayNode(); + ObjectNode searchableObjectNode = mapper.createObjectNode(); + searchableObjectNode.put(EXTRAS_KEY_KEY, SEARCHABLE_KEY); + searchableObjectNode.put(EXTRAS_VALUE_KEY, true); + extrasObjectNode.add(searchableObjectNode); + objectNode.set(EXTRAS_KEY, extrasObjectNode); + } + return objectNode; } diff --git a/src/test/java/org/gcube/gcat/persistence/ckan/CKANPackageTest.java b/src/test/java/org/gcube/gcat/persistence/ckan/CKANPackageTest.java index f6a8737..82aaf62 100644 --- a/src/test/java/org/gcube/gcat/persistence/ckan/CKANPackageTest.java +++ b/src/test/java/org/gcube/gcat/persistence/ckan/CKANPackageTest.java @@ -102,10 +102,10 @@ public class CKANPackageTest extends ContextTest { resourceNode.put(CKANResource.URL_KEY, "https://goo.gl/J8AwQW"); resourceArrayNode.add(resourceNode); - ArrayNode extraArrayNode = itemObjectNode.putArray(CKANPackage.EXTRA_TYPES_KEY); + ArrayNode extraArrayNode = itemObjectNode.putArray(CKANPackage.EXTRAS_KEY); ObjectNode extraNode = mapper.createObjectNode(); - extraNode.put(CKANPackage.EXTRA_TYPES_KEY_KEY, CKANPackage.EXTRA_TYPES_KEY_VALUE_SYSTEM_TYPE); - extraNode.put(CKANPackage.EXTRA_TYPES_VALUE_KEY, EXTRAS_TYPE_VALUE_VALUE); + extraNode.put(CKANPackage.EXTRAS_KEY_KEY, CKANPackage.EXTRAS_KEY_VALUE_SYSTEM_TYPE); + extraNode.put(CKANPackage.EXTRAS_VALUE_KEY, EXTRAS_TYPE_VALUE_VALUE); extraArrayNode.add(extraNode); CKANPackage ckanPackage = new CKANPackage();