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
This commit is contained in:
Luca Frosini 2019-02-08 11:04:20 +00:00
parent e1e7a413ba
commit 6f2e32337f
3 changed files with 42 additions and 16 deletions

View File

@ -78,7 +78,7 @@ public class Validator {
*/ */
public static void validateAgainstProfile(JSONObject obj) throws Exception { 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 groupsArrayOriginal = (JSONArray) obj.get(CKANPackage.GROUPS_KEY);
JSONArray tagsArrayOriginal = (JSONArray) obj.get(CKANPackage.TAGS_KEY); JSONArray tagsArrayOriginal = (JSONArray) obj.get(CKANPackage.TAGS_KEY);
@ -101,7 +101,7 @@ public class Validator {
while(iterator.hasNext()) { while(iterator.hasNext()) {
JSONObject object = (JSONObject) iterator.next(); JSONObject object = (JSONObject) iterator.next();
CustomField cf = new CustomField(object); 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; metadataTypeCF = cf;
} else if(cf.getKey().equals(SocialService.ITEM_URL)) { } else if(cf.getKey().equals(SocialService.ITEM_URL)) {
continue; continue;
@ -111,7 +111,7 @@ public class Validator {
} }
if(metadataTypeCF == null) { 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!"); + "' extra field is missing in context where metadata profile(s) are defined!");
} }
@ -120,7 +120,7 @@ public class Validator {
MetadataUtility metadataUtility = MetadataUtility.getInstance(); MetadataUtility metadataUtility = MetadataUtility.getInstance();
MetadataFormat profile = metadataUtility.getMetadataFormat(profileName); MetadataFormat profile = metadataUtility.getMetadataFormat(profileName);
if(profile == null) { 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 + profileName
+ "') specified as custom field doesn't match any of the profiles defined in this context!"); + "') specified as custom field doesn't match any of the profiles defined in this context!");
} else { } else {
@ -207,15 +207,15 @@ public class Validator {
// convert back to json // convert back to json
for(CustomField customField : validatedCustomFields) { for(CustomField customField : validatedCustomFields) {
JSONObject jsonObj = new JSONObject(); JSONObject jsonObj = new JSONObject();
jsonObj.put(CKANPackage.EXTRA_TYPES_KEY_KEY, customField.getQualifiedKey()); jsonObj.put(CKANPackage.EXTRAS_KEY_KEY, customField.getQualifiedKey());
jsonObj.put(CKANPackage.EXTRA_TYPES_VALUE_KEY, customField.getValue()); jsonObj.put(CKANPackage.EXTRAS_VALUE_KEY, customField.getValue());
extrasArrayUpdated.add(jsonObj); extrasArrayUpdated.add(jsonObj);
} }
// add metadata type field as last element // add metadata type field as last element
JSONObject metadataTypeJSON = new JSONObject(); JSONObject metadataTypeJSON = new JSONObject();
metadataTypeJSON.put(CKANPackage.EXTRA_TYPES_KEY_KEY, metadataTypeCF.getKey()); metadataTypeJSON.put(CKANPackage.EXTRAS_KEY_KEY, metadataTypeCF.getKey());
metadataTypeJSON.put(CKANPackage.EXTRA_TYPES_VALUE_KEY, metadataTypeCF.getValue()); metadataTypeJSON.put(CKANPackage.EXTRAS_VALUE_KEY, metadataTypeCF.getValue());
extrasArrayUpdated.add(metadataTypeJSON); extrasArrayUpdated.add(metadataTypeJSON);
// create groups // create groups
@ -230,7 +230,7 @@ public class Validator {
obj.put(CKANPackage.TAGS_KEY, tagsArrayOriginal); obj.put(CKANPackage.TAGS_KEY, tagsArrayOriginal);
obj.put(CKANPackage.GROUPS_KEY, groupsArrayOriginal); obj.put(CKANPackage.GROUPS_KEY, groupsArrayOriginal);
obj.put(CKANPackage.EXTRA_TYPES_KEY, extrasArrayUpdated); obj.put(CKANPackage.EXTRAS_KEY, extrasArrayUpdated);
} }

View File

@ -62,10 +62,12 @@ public class CKANPackage extends CKAN {
protected static final String RESOURCES_KEY = "resources"; protected static final String RESOURCES_KEY = "resources";
protected static final String TITLE_KEY = "title"; protected static final String TITLE_KEY = "title";
public static final String EXTRA_TYPES_KEY = "extras"; public static final String EXTRAS_KEY = "extras";
public static final String EXTRA_TYPES_KEY_KEY = "key"; public static final String EXTRAS_KEY_KEY = "key";
public static final String EXTRA_TYPES_KEY_VALUE_SYSTEM_TYPE = "system:type"; public static final String EXTRAS_KEY_VALUE_SYSTEM_TYPE = "system:type";
public static final String EXTRA_TYPES_VALUE_KEY = "value"; 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 GROUPS_KEY = "groups";
public static final String TAGS_KEY = "tags"; 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; return objectNode;
} }

View File

@ -102,10 +102,10 @@ public class CKANPackageTest extends ContextTest {
resourceNode.put(CKANResource.URL_KEY, "https://goo.gl/J8AwQW"); resourceNode.put(CKANResource.URL_KEY, "https://goo.gl/J8AwQW");
resourceArrayNode.add(resourceNode); resourceArrayNode.add(resourceNode);
ArrayNode extraArrayNode = itemObjectNode.putArray(CKANPackage.EXTRA_TYPES_KEY); ArrayNode extraArrayNode = itemObjectNode.putArray(CKANPackage.EXTRAS_KEY);
ObjectNode extraNode = mapper.createObjectNode(); ObjectNode extraNode = mapper.createObjectNode();
extraNode.put(CKANPackage.EXTRA_TYPES_KEY_KEY, CKANPackage.EXTRA_TYPES_KEY_VALUE_SYSTEM_TYPE); extraNode.put(CKANPackage.EXTRAS_KEY_KEY, CKANPackage.EXTRAS_KEY_VALUE_SYSTEM_TYPE);
extraNode.put(CKANPackage.EXTRA_TYPES_VALUE_KEY, EXTRAS_TYPE_VALUE_VALUE); extraNode.put(CKANPackage.EXTRAS_VALUE_KEY, EXTRAS_TYPE_VALUE_VALUE);
extraArrayNode.add(extraNode); extraArrayNode.add(extraNode);
CKANPackage ckanPackage = new CKANPackage(); CKANPackage ckanPackage = new CKANPackage();