From 2a937cc4aed8cefe09bc5207e9dd42fc337ca184 Mon Sep 17 00:00:00 2001 From: "miriam.baglioni" Date: Tue, 27 Sep 2022 16:06:31 +0200 Subject: [PATCH] [CommunityAPIExtention] added bulk deletion and addition for datasouces. Added the possibility to insert a pram in the cntext if it is not already present. Useful not to be forced to modify all the profiles by hand to insert new params for fos, sdg and advancedContraints --- .../eu/dnetlib/openaire/common/ISClient.java | 4 +- .../dnetlib/openaire/common/ISClientImpl.java | 79 +++++++++++++------ .../community/CommunityApiController.java | 38 +++++++++ .../openaire/community/CommunityApiCore.java | 77 +++++++++++++----- .../openaire/community/CommunityCommon.java | 21 +++++ 5 files changed, 172 insertions(+), 47 deletions(-) diff --git a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/common/ISClient.java b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/common/ISClient.java index 6a048867..d4ed2f32 100644 --- a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/common/ISClient.java +++ b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/common/ISClient.java @@ -20,9 +20,7 @@ public interface ISClient { Map getContextMap(final List type) throws IOException; - void updateContextParam(String id, String name, String value); - - void updateContextParamNoEscape(String id, String name, String value); + void updateContextParam(String id, String name, String value, boolean toEscape); void updateContextAttribute(String id, String name, String value); diff --git a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/common/ISClientImpl.java b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/common/ISClientImpl.java index 960d437d..67397331 100644 --- a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/common/ISClientImpl.java +++ b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/common/ISClientImpl.java @@ -105,28 +105,38 @@ public class ISClientImpl implements ISClient { } } + @Override @CacheEvict(value = { "context-cache", "context-cache-funder" }, allEntries = true) - public void updateContextParam(final String id, final String name, final String value) { - try { - _quickSeachProfile(getXQuery(id, name, value)); - } catch (final ISLookUpException e) { - throw new DsmRuntimeException(String.format("unable update context param [id: %s, name: %s, value: %s]", id, name, value), e); + public void updateContextParam(final String id, final String name, final String value, boolean toEscape) { + if(getSize(id, name) > 0){ + try { + _quickSeachProfile(getXQuery(id, name, value, toEscape)); + } catch (final ISLookUpException e) { + throw new DsmRuntimeException(String.format("unable to update context param [id: %s, name: %s, value: %s]", id, name, value), e); + } } + else{ + try { + _quickSeachProfile(getInsertXQuery(id, name, value,toEscape)); + } catch (final ISLookUpException e) { + throw new DsmRuntimeException(String.format("unable to insert context param [id: %s, name: %s, value: %s]", id, name, value), e); + } + } + + } - @Override - @CacheEvict(value = { - "context-cache", "context-cache-funder" - }, allEntries = true) - public void updateContextParamNoEscape(final String id, final String name, final String value) { + private int getSize(String id, String name) { + int size = 0; try { - _quickSeachProfile(getXQueryNoEscape(id, name, value)); - } catch (final ISLookUpException e) { - throw new DsmRuntimeException(String.format("unable update context param [id: %s, name: %s, value: %s]", id, name, value), e); + size = _quickSeachProfile(String.format("for $x in collection('/db/DRIVER/ContextDSResources/ContextDSResourceType') where $x//context[@id='%s']/param[@name='%s'] return $x", id, name)).size(); + } catch (ISLookUpException e) { + throw new DsmRuntimeException("unable to execute search query", e); } + return size; } @Override @@ -212,26 +222,45 @@ public class ISClientImpl implements ISClient { /// HELPERS - private String getXQuery(final String id, final String name, final String value) { - final Escaper esc = XmlEscapers.xmlContentEscaper(); + + private String getInsertXQuery(final String id, final String paramName, final String paramValue, final boolean toEscape) { + String value; + if(toEscape) + value = escape(XmlEscapers.xmlContentEscaper(), paramValue); + else + value = paramValue; + if (StringUtils.isNotBlank(value)) { + return String.format("update insert %s into collection('/db/DRIVER/ContextDSResources/ContextDSResourceType')" + + "/RESOURCE_PROFILE/BODY/CONFIGURATION/context[./@id = '%s']", paramName, value, id); + } else { + return String.format("update insert into collection('/db/DRIVER/ContextDSResources/ContextDSResourceType')" + + "/RESOURCE_PROFILE/BODY/CONFIGURATION/context[./@id = '%s']", paramName, id); + } + } + + private String getXQuery(final String id, final String name, final String paramValue, final boolean toEscape) { + String value = paramValue; + if (toEscape) + value = escape(XmlEscapers.xmlContentEscaper(), paramValue); + if (StringUtils.isNotBlank(value)) { return String.format("update replace collection('/db/DRIVER/ContextDSResources/ContextDSResourceType')" + - "/RESOURCE_PROFILE/BODY/CONFIGURATION/context[./@id = '%s']/param[./@name = '%s'] with %s", id, name, name, escape(esc, value)); + "/RESOURCE_PROFILE/BODY/CONFIGURATION/context[./@id = '%s']/param[./@name = '%s'] with %s", id, name, name, value); } else { return String.format("update replace collection('/db/DRIVER/ContextDSResources/ContextDSResourceType')" + "/RESOURCE_PROFILE/BODY/CONFIGURATION/context[./@id = '%s']/param[./@name = '%s'] with ", id, name, name); } } - private String getXQueryNoEscape(final String id, final String name, final String value) { - if (StringUtils.isNotBlank(value)) { - return String.format("update replace collection('/db/DRIVER/ContextDSResources/ContextDSResourceType')" + - "/RESOURCE_PROFILE/BODY/CONFIGURATION/context[./@id = '%s']/param[./@name = '%s'] with %s", id, name, name, value); - } else { - return String.format("update replace collection('/db/DRIVER/ContextDSResources/ContextDSResourceType')" + - "/RESOURCE_PROFILE/BODY/CONFIGURATION/context[./@id = '%s']/param[./@name = '%s'] with ", id, name, name); - } - } +// private String getXQueryNoEscape(final String id, final String name, final String value) { +// if (StringUtils.isNotBlank(value)) { +// return String.format("update replace collection('/db/DRIVER/ContextDSResources/ContextDSResourceType')" + +// "/RESOURCE_PROFILE/BODY/CONFIGURATION/context[./@id = '%s']/param[./@name = '%s'] with %s", id, name, name, value); +// } else { +// return String.format("update replace collection('/db/DRIVER/ContextDSResources/ContextDSResourceType')" + +// "/RESOURCE_PROFILE/BODY/CONFIGURATION/context[./@id = '%s']/param[./@name = '%s'] with ", id, name, name); +// } +// } private String getConceptXQuery(final String id, final String name, final String value) { final Escaper esc = XmlEscapers.xmlContentEscaper(); diff --git a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityApiController.java b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityApiController.java index bde3672d..6bc357eb 100644 --- a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityApiController.java +++ b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityApiController.java @@ -223,6 +223,44 @@ public class CommunityApiController { communityApiCore.removeCommunityContentProvider(id, contentproviderId); } + @RequestMapping(value = "/community/{id}/contentprovidersList", produces = { + "application/json" + }, method = RequestMethod.POST) + @Operation(summary = "associate a list of content providers to the community", + description = "associate a list of content providers to the community", tags = { + C_PJ, W + }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "not found"), + @ApiResponse(responseCode = "500", description = "unexpected error") + }) + public List addCommunityContentProvidersList( + @PathVariable final String id, + @RequestBody final List contentprovidersList) throws CommunityException, CommunityNotFoundException { + + return communityApiCore.addCommunityContentProvidersList(id, contentprovidersList); + } + + @RequestMapping(value = "/community/{id}/projectList", produces = { + "application/json" + }, method = RequestMethod.DELETE) + @Operation(summary = "remove a list of content providers from the community", + description = "remove a list of content providers from the community", tags = { + C_PJ, W + }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "not found"), + @ApiResponse(responseCode = "500", description = "unexpected error") + }) + public void deleteCommunityContentProvidersList( + @PathVariable final String id, + @RequestBody final List contentProviderIdList) throws CommunityException, CommunityNotFoundException { + + communityApiCore.removeCommunityContentProviderList(id, contentProviderIdList); + } + // ADDING CODE FOR COMMUNITY ORGANIZATIONS @RequestMapping(value = "/community/{id}/organizations", produces = { diff --git a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityApiCore.java b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityApiCore.java index 473b84a1..09cb2a28 100644 --- a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityApiCore.java +++ b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityApiCore.java @@ -47,6 +47,13 @@ public class CommunityApiCore {// implements CommunityClient{ } + private void removeAdvancedConstraint(String id) throws CommunityNotFoundException, CommunityException { + cc.getCommunity(id); + isClient.updateContextParam(id, CPROFILE_ADVANCED_CONSTRAINT, "", false); + cc.removeAdvancedConstraint(id); + + } + public void setCommunity(final String id, final CommunityWritableProperties details) throws CommunityException, CommunityNotFoundException { cc.getCommunity(id); // ensure the community exists. @@ -56,39 +63,39 @@ public class CommunityApiCore {// implements CommunityClient{ } if (details.getName() != null) { - isClient.updateContextParam(id, CSUMMARY_NAME, details.getName()); + isClient.updateContextParam(id, CSUMMARY_NAME, details.getName(), true); } if (details.getDescription() != null) { - isClient.updateContextParam(id, CSUMMARY_DESCRIPTION, details.getDescription()); + isClient.updateContextParam(id, CSUMMARY_DESCRIPTION, details.getDescription(), true); } if (details.getLogoUrl() != null) { - isClient.updateContextParam(id, CSUMMARY_LOGOURL, details.getLogoUrl()); + isClient.updateContextParam(id, CSUMMARY_LOGOURL, details.getLogoUrl(), true); } if (details.getStatus() != null) { - isClient.updateContextParam(id, CSUMMARY_STATUS, details.getStatus().name()); + isClient.updateContextParam(id, CSUMMARY_STATUS, details.getStatus().name(), true); } if (details.getSubjects() != null) { - isClient.updateContextParam(id, CPROFILE_SUBJECT, Joiner.on(CSV_DELIMITER).join(details.getSubjects())); + isClient.updateContextParam(id, CPROFILE_SUBJECT, Joiner.on(CSV_DELIMITER).join(details.getSubjects()), true); } if (details.getFos() != null) { - isClient.updateContextParam(id, CPROFILE_FOS, Joiner.on(CSV_DELIMITER).join(details.getFos())); + isClient.updateContextParam(id, CPROFILE_FOS, Joiner.on(CSV_DELIMITER).join(details.getFos()), true); } if (details.getSdg() != null) { - isClient.updateContextParam(id, CPROFILE_SDG, Joiner.on(CSV_DELIMITER).join(details.getSdg())); + isClient.updateContextParam(id, CPROFILE_SDG, Joiner.on(CSV_DELIMITER).join(details.getSdg()), true); } if (details.getAdvancedConstraint() != null) { - isClient.updateContextParamNoEscape(id, CPROFILE_ADVANCED_CONSTRAINT, ""); + isClient.updateContextParam(id, CPROFILE_ADVANCED_CONSTRAINT, "", false); } if (details.getMainZenodoCommunity() != null) { - isClient.updateContextParam(id, CSUMMARY_ZENODOC, details.getMainZenodoCommunity()); + isClient.updateContextParam(id, CSUMMARY_ZENODOC, details.getMainZenodoCommunity(), true); } cc.updateCommunity(id, details); @@ -190,6 +197,10 @@ public class CommunityApiCore {// implements CommunityClient{ log.info("content provider to add " + cp.toString()); if (!StringUtils.equalsIgnoreCase(id, cp.getCommunityId())) { throw new CommunityException("parameters 'id' and cp.communityId must be coherent"); } + return updateContentprovider(id, cp); + } + + private CommunityContentprovider updateContentprovider(String id, CommunityContentprovider cp) throws CommunityException, CommunityNotFoundException { final TreeMap cps = getCommunityContentproviderMap(id); final String concept_id = cp.getId(); if (concept_id != null && cps.keySet().contains(Integer.valueOf(concept_id))) { @@ -225,6 +236,30 @@ public class CommunityApiCore {// implements CommunityClient{ cc.removeFromCategory(id, CONTENTPROVIDERS_ID_SUFFIX, String.valueOf(contentproviderId)); } + public List addCommunityContentProvidersList(String id, List contentprovidersList) throws CommunityException, CommunityNotFoundException { + if(contentprovidersList == null || contentprovidersList.size() == 0){ + throw new CommunityException("parameter 'contentprovidersList' must be present and should contain at least one content provider"); + } + if (!StringUtils.equalsIgnoreCase(id, contentprovidersList.get(0).getCommunityId())) { + throw new CommunityException("parameters 'id' and contentprovider.communityId must be coherent"); + } + + List contentproviders = new ArrayList(); + + for(CommunityContentprovider contentProvider : contentprovidersList){ + contentproviders.add(updateContentprovider(id, contentProvider)); + } + + + return contentproviders; + } + + public void removeCommunityContentProviderList(final String id, final List contentProviderIdList) throws CommunityException, CommunityNotFoundException { + for(Integer contentProviderId: contentProviderIdList){ + removeCommunityContentProvider(id, contentProviderId); + } + } + public void removeCommunityOrganization(final String id, final Integer organizationId) throws CommunityException, CommunityNotFoundException { final Map organizations = getCommunityOrganizationMap(id); if (!organizations.containsKey(organizationId)) { @@ -278,7 +313,10 @@ public class CommunityApiCore {// implements CommunityClient{ final CommunityDetails cd = new CommunityDetails(); - final Set current = Sets.newHashSet(cc.getCommunity(id).getFos()); + final Set current = Sets.newHashSet(); + if(Optional.ofNullable(cc.getCommunity(id).getFos()).isPresent()){ + current.addAll(cc.getCommunity(id).getFos()); + } current.addAll(foss); @@ -307,8 +345,10 @@ public class CommunityApiCore {// implements CommunityClient{ public CommunityDetails addCommunitySDG(final String id, final List sdgs) throws CommunityException, CommunityNotFoundException { final CommunityDetails cd = new CommunityDetails(); - - final Set current = Sets.newHashSet(cc.getCommunity(id).getSdg()); + final Set current = Sets.newHashSet(); + if(Optional.ofNullable(cc.getCommunity(id).getSdg()).isPresent()){ + current.addAll(cc.getCommunity(id).getSdg()); + } current.addAll(sdgs); @@ -345,17 +385,15 @@ public class CommunityApiCore {// implements CommunityClient{ return cd; } - public CommunityDetails removeCommunityAdvancedConstraint(final String id) throws CommunityException, CommunityNotFoundException { + public CommunityDetails removeCommunityAdvancedConstraint(final String id) throws CommunityNotFoundException, CommunityException { - final CommunityDetails cd = new CommunityDetails(); - SelectionCriteria sl = new SelectionCriteria(); - cd.setAdvancedConstraint(sl); + removeAdvancedConstraint(id); - setCommunity(id, CommunityWritableProperties.fromDetails(cd)); - - return cd; + return new CommunityDetails(); } + + @CacheEvict(value = "community-cache", allEntries = true) public void removeCommunityZenodoCommunity(final String id, final Integer zenodoCommId) throws CommunityException, CommunityNotFoundException { @@ -463,4 +501,5 @@ public class CommunityApiCore {// implements CommunityClient{ return organization; } + } diff --git a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityCommon.java b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityCommon.java index 52d4dd40..d23bc881 100644 --- a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityCommon.java +++ b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityCommon.java @@ -168,6 +168,13 @@ public class CommunityCommon { } + public void removeAdvancedConstraint(String id) throws CommunityException { + final Context context = getContextMap().get(id); + context.getParams() + .replace(CPROFILE_ADVANCED_CONSTRAINT, Arrays.asList(new Param() + .setName(CPROFILE_ADVANCED_CONSTRAINT).setValue(null))); + } + public void updateCommunity(String id, CommunityWritableProperties community) throws CommunityException { final Context context = getContextMap().get(id); @@ -202,21 +209,35 @@ public class CommunityCommon { .join(community.getSubjects())))); } if(community.getFos() != null){ + if (context.getParams().containsKey(CPROFILE_FOS)) context.getParams() .replace(CPROFILE_FOS, Arrays.asList(new Param().setName(CPROFILE_FOS) .setValue(Joiner.on(CSV_DELIMITER) .join(community.getFos())))); + else + context.getParams().put(CPROFILE_FOS, Arrays.asList(new Param().setName(CPROFILE_FOS) + .setValue(Joiner.on(CSV_DELIMITER) + .join(community.getFos())))); } if(community.getSdg() != null){ + if(context.getParams().containsKey(CPROFILE_SDG)) context.getParams() .replace(CPROFILE_SDG, Arrays.asList(new Param().setName(CPROFILE_SDG) .setValue(Joiner.on(CSV_DELIMITER) .join(community.getSdg())))); + else + context.getParams().put(CPROFILE_SDG, Arrays.asList(new Param().setName(CPROFILE_SDG) + .setValue(Joiner.on(CSV_DELIMITER) + .join(community.getSdg())))); } if (community.getAdvancedConstraint() != null) { + if(context.getParams().containsKey(CPROFILE_ADVANCED_CONSTRAINT)) context.getParams() .replace(CPROFILE_ADVANCED_CONSTRAINT, Arrays.asList(new Param() .setName(CPROFILE_ADVANCED_CONSTRAINT).setValue(new Gson().toJson(community.getAdvancedConstraint())))); + else + context.getParams().put(CPROFILE_ADVANCED_CONSTRAINT, Arrays.asList(new Param() + .setName(CPROFILE_ADVANCED_CONSTRAINT).setValue(new Gson().toJson(community.getAdvancedConstraint())))); } if(community.getMainZenodoCommunity() != null){ context.getParams()