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 {
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);
}

View File

@ -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;
}

View File

@ -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();