From b81593c41c2c033743e5b712e28b2a5b9a8e651d Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Mon, 5 Nov 2018 11:43:46 +0100 Subject: [PATCH 1/2] [Task 57104] added support for multiple relation import --- .../dspace/app/bulkedit/MetadataImport.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java index 20b8c4fa39..e11b4e728c 100644 --- a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java +++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java @@ -647,23 +647,25 @@ public class MetadataImport { handleRelationTypeMetadata(c, item, schema, element, qualifier, language, values, authorities, confidences); } else { - handleRelationOtherMetadata(c, item, element, values); + for (String value : values) { + handleRelationOtherMetadata(c, item, element, value); + } } } - private void handleRelationOtherMetadata(Context c, Item item, String element, List values) + private void handleRelationOtherMetadata(Context c, Item item, String element, String value) throws SQLException, AuthorizeException { Entity entity = entityService.findByItemId(c, item.getID()); boolean left = false; List acceptableRelationshipTypes = new LinkedList<>(); - String[] components = values.get(0).split("-"); - String url = handleService.resolveToURL(c, values.get(0)); + String[] components = value.split("-"); + String url = handleService.resolveToURL(c, value); if (components.length != 5 && StringUtils.isNotBlank(url)) { return; } - Entity relationEntity = entityService.findByItemId(c, UUID.fromString(values.get(0))); + Entity relationEntity = entityService.findByItemId(c, UUID.fromString(value)); List leftRelationshipTypesForEntity = entityService.getLeftRelationshipTypes(c, entity); @@ -694,20 +696,20 @@ public class MetadataImport { return; } - buildRelationObject(c, item, values, left, acceptableRelationshipTypes); + buildRelationObject(c, item, value, left, acceptableRelationshipTypes); } - private void buildRelationObject(Context c, Item item, List values, boolean left, + private void buildRelationObject(Context c, Item item, String value, boolean left, List acceptableRelationshipTypes) throws SQLException, AuthorizeException { Relationship relationship = new Relationship(); RelationshipType acceptedRelationshipType = acceptableRelationshipTypes.get(0); if (left) { relationship.setLeftItem(item); - relationship.setRightItem(itemService.findByIdOrLegacyId(c, values.get(0))); + relationship.setRightItem(itemService.findByIdOrLegacyId(c, value)); } else { relationship.setRightItem(item); - relationship.setLeftItem(itemService.findByIdOrLegacyId(c, values.get(0))); + relationship.setLeftItem(itemService.findByIdOrLegacyId(c, value)); } relationship.setRelationshipType(acceptedRelationshipType); relationship.setLeftPlace(relationshipService.findLeftPlaceByLeftItem(c, relationship.getLeftItem()) + 1); From bfd0bd7362416bb90494d01d4c8f67cd4e14041b Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Tue, 6 Nov 2018 15:30:13 +0100 Subject: [PATCH 2/2] [Task 57104] adding delete functionality for the csv import --- .../dspace/app/bulkedit/MetadataImport.java | 7 ++++ .../org/dspace/content/ItemServiceImpl.java | 38 ++++++++++++------- .../content/RelationshipServiceImpl.java | 13 +++++++ .../content/RelationshipTypeServiceImpl.java | 4 ++ .../content/dao/RelationshipTypeDAO.java | 2 + .../dao/impl/RelationshipTypeDAOImpl.java | 15 ++++++++ .../dspace/content/service/ItemService.java | 2 +- .../content/service/RelationshipService.java | 5 +++ .../service/RelationshipTypeService.java | 11 ++++++ .../app/rest/converter/ItemConverter.java | 2 +- 10 files changed, 84 insertions(+), 15 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java index 20b8c4fa39..b368d9a3b0 100644 --- a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java +++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java @@ -629,6 +629,13 @@ public class MetadataImport { if (StringUtils.equals(schema, "relation")) { + List relationshipTypeList = relationshipTypeService.findByLeftOrRightLabel(c, element); + for (RelationshipType relationshipType : relationshipTypeList) { + for (Relationship relationship : relationshipService.findByItemAndRelationshipType(c, item, relationshipType)) { + relationshipService.delete(c, relationship); + relationshipService.update(c, relationship); + } + } handleRelationMetadata(c, item, schema, element, qualifier, language, values, authorities, confidences); } else { itemService.clearMetadata(c, item, schema, element, qualifier, language); diff --git a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java index 9bed048031..9ff8d08dc8 100644 --- a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java @@ -1291,21 +1291,33 @@ prevent the generation of resource policy entry values with null dspace_object a */ @Override public List getMetadata(Item item, String schema, String element, String qualifier, String lang) { - List dbMetadataValues = super.getMetadata(item, schema, element, qualifier, lang); + if (StringUtils.equals(schema, "relation") && !StringUtils.equals(element, "type")) { - if (!(StringUtils.equals(schema, "*") && StringUtils.equals(element, "*") && - StringUtils.equals(qualifier, "*") && StringUtils.equals(lang, "*"))) { - return dbMetadataValues; + List relationMetadata = getRelationshipMetadata(item, false); + List listToReturn = new LinkedList<>(); + for (MetadataValue metadataValue : relationMetadata) { + if (StringUtils.equals(metadataValue.getMetadataField().getElement(), element)) { + listToReturn.add(metadataValue); + } + } + return listToReturn; + + } else { + List dbMetadataValues = super.getMetadata(item, schema, element, qualifier, lang); + + if (!(StringUtils.equals(schema, "*") && StringUtils.equals(element, "*") && + StringUtils.equals(qualifier, "*") && StringUtils.equals(lang, "*"))) { + return dbMetadataValues; + } + List fullMetadataValueList = getRelationshipMetadata(item, true); + fullMetadataValueList.addAll(dbMetadataValues); + + return fullMetadataValueList; } - List fullMetadataValueList = getRelationshipMetadata(item); - fullMetadataValueList.addAll(dbMetadataValues); - - return fullMetadataValueList; } - @Override - public List getRelationshipMetadata(Item item) { + public List getRelationshipMetadata(Item item, boolean extra) { Context context = new Context(); List fullMetadataValueList = new LinkedList<>(); try { @@ -1314,7 +1326,7 @@ prevent the generation of resource policy entry values with null dspace_object a if (StringUtils.isNotBlank(entityType)) { List relationships = relationshipService.findByItem(context, item); for (Relationship relationship : relationships) { - fullMetadataValueList.addAll(handleItemRelationship(item, entityType, relationship)); + fullMetadataValueList.addAll(handleItemRelationship(item, entityType, relationship, extra)); } } @@ -1325,7 +1337,7 @@ prevent the generation of resource policy entry values with null dspace_object a } private List handleItemRelationship(Item item, String entityType, - Relationship relationship) { + Relationship relationship, boolean extra) { List resultingMetadataValueList = new LinkedList<>(); RelationshipType relationshipType = relationship.getRelationshipType(); HashMap> hashMaps = new HashMap<>(); @@ -1343,7 +1355,7 @@ prevent the generation of resource policy entry values with null dspace_object a relationName = relationship.getRelationshipType().getRightLabel(); } - if (hashMaps != null) { + if (hashMaps != null && extra) { resultingMetadataValueList.addAll(handleRelationshipTypeMetadataMappping(item, hashMaps, otherItem, relationName)); } diff --git a/dspace-api/src/main/java/org/dspace/content/RelationshipServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/RelationshipServiceImpl.java index 6b563564d3..dc66c2fce9 100644 --- a/dspace-api/src/main/java/org/dspace/content/RelationshipServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/RelationshipServiceImpl.java @@ -286,4 +286,17 @@ public class RelationshipServiceImpl implements RelationshipService { } return listToReturn; } + + public List findByItemAndRelationshipType(Context context, Item item, + RelationshipType relationshipType) + throws SQLException { + List list = this.findByItem(context, item); + List listToReturn = new LinkedList<>(); + for (Relationship relationship : list) { + if (relationship.getRelationshipType().equals(relationshipType)) { + listToReturn.add(relationship); + } + } + return listToReturn; + } } diff --git a/dspace-api/src/main/java/org/dspace/content/RelationshipTypeServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/RelationshipTypeServiceImpl.java index a03eb02677..299d44447d 100644 --- a/dspace-api/src/main/java/org/dspace/content/RelationshipTypeServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/RelationshipTypeServiceImpl.java @@ -84,4 +84,8 @@ public class RelationshipTypeServiceImpl implements RelationshipTypeService { } relationshipTypeDAO.delete(context, relationshipType); } + + public List findByLeftOrRightLabel(Context context, String label) throws SQLException { + return relationshipTypeDAO.findByLeftOrRightLabel(context, label); + } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/RelationshipTypeDAO.java b/dspace-api/src/main/java/org/dspace/content/dao/RelationshipTypeDAO.java index 50dc422032..44c47f6e86 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/RelationshipTypeDAO.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/RelationshipTypeDAO.java @@ -8,6 +8,7 @@ package org.dspace.content.dao; import java.sql.SQLException; +import java.util.List; import org.dspace.content.EntityType; import org.dspace.content.RelationshipType; @@ -25,5 +26,6 @@ public interface RelationshipTypeDAO extends GenericDAO { RelationshipType findbyTypesAndLabels(Context context, EntityType leftType,EntityType rightType,String leftLabel,String rightLabel) throws SQLException; + List findByLeftOrRightLabel(Context context, String label) throws SQLException; } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/RelationshipTypeDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/RelationshipTypeDAOImpl.java index acf11bf743..8fe5d18c56 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/RelationshipTypeDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/RelationshipTypeDAOImpl.java @@ -8,6 +8,7 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; +import java.util.List; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; @@ -37,4 +38,18 @@ public class RelationshipTypeDAOImpl extends AbstractHibernateDAO findByLeftOrRightLabel(Context context, String label) throws SQLException { + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, RelationshipType.class); + Root relationshipTypeRoot = criteriaQuery.from(RelationshipType.class); + criteriaQuery.select(relationshipTypeRoot); + criteriaQuery.where( + criteriaBuilder.or( + criteriaBuilder.equal(relationshipTypeRoot.get(RelationshipType_.leftLabel), label), + criteriaBuilder.equal(relationshipTypeRoot.get(RelationshipType_.rightLabel), label) + ) + ); + return list(context, criteriaQuery, true, RelationshipType.class, -1, -1); + } + } diff --git a/dspace-api/src/main/java/org/dspace/content/service/ItemService.java b/dspace-api/src/main/java/org/dspace/content/service/ItemService.java index d3d36ff0f8..e9aee14eaa 100644 --- a/dspace-api/src/main/java/org/dspace/content/service/ItemService.java +++ b/dspace-api/src/main/java/org/dspace/content/service/ItemService.java @@ -648,6 +648,6 @@ public interface ItemService extends DSpaceObjectService, DSpaceObjectLega * @param item The Item that will be processed through it's Relationships * @return The list of MetadataValue objects constructed through the Relationships */ - public List getRelationshipMetadata(Item item); + public List getRelationshipMetadata(Item item, boolean extra); } diff --git a/dspace-api/src/main/java/org/dspace/content/service/RelationshipService.java b/dspace-api/src/main/java/org/dspace/content/service/RelationshipService.java index 643a914f09..a8052e1e6f 100644 --- a/dspace-api/src/main/java/org/dspace/content/service/RelationshipService.java +++ b/dspace-api/src/main/java/org/dspace/content/service/RelationshipService.java @@ -13,6 +13,7 @@ import java.util.List; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Item; import org.dspace.content.Relationship; +import org.dspace.content.RelationshipType; import org.dspace.core.Context; import org.dspace.service.DSpaceCRUDService; @@ -71,4 +72,8 @@ public interface RelationshipService extends DSpaceCRUDService { * @throws SQLException If something goes wrong */ int findRightPlaceByRightItem(Context context, Item item) throws SQLException; + + public List findByItemAndRelationshipType(Context context, Item item, + RelationshipType relationshipType) + throws SQLException; } \ No newline at end of file diff --git a/dspace-api/src/main/java/org/dspace/content/service/RelationshipTypeService.java b/dspace-api/src/main/java/org/dspace/content/service/RelationshipTypeService.java index a336878874..88ba200176 100644 --- a/dspace-api/src/main/java/org/dspace/content/service/RelationshipTypeService.java +++ b/dspace-api/src/main/java/org/dspace/content/service/RelationshipTypeService.java @@ -52,4 +52,15 @@ public interface RelationshipTypeService extends DSpaceCRUDService findAll(Context context) throws SQLException; + + /** + * Retrieves all RelationshipType objects that have a left or right label that is + * equal to the given String + * @param context The relevant DSpace context + * @param label The label that has to match + * @return The list of all RelationshipType objects that have a left or right label + * that is equal to the given label param + * @throws SQLException If something goes wrong + */ + List findByLeftOrRightLabel(Context context, String label) throws SQLException; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java index fbc97af5fc..4dcd745d02 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java @@ -96,7 +96,7 @@ public class ItemConverter extends DSpaceObjectConverter fullList = new LinkedList<>(); fullList.addAll(obj.getMetadata()); - fullList.addAll(itemService.getRelationshipMetadata(obj)); + fullList.addAll(itemService.getRelationshipMetadata(obj, true)); List metadata = super.convertMetadataToRest(fullList); item.setMetadata(metadata);