Merge remote-tracking branch 'upstream/main' into #2956

This commit is contained in:
Mark H. Wood
2020-12-01 16:25:24 -05:00
7 changed files with 289 additions and 129 deletions

View File

@@ -460,7 +460,7 @@ public class AuthorizeServiceImpl implements AuthorizeService {
groupService.allMemberGroups(c, e), groupService.allMemberGroups(c, e),
Constants.ADMIN, Constants.COLLECTION); Constants.ADMIN, Constants.COLLECTION);
if (CollectionUtils.isNotEmpty(policies)) { if (CollectionUtils.isNotEmpty(policies) || isCommunityAdmin(c, e)) {
return true; return true;
} }
} }

View File

@@ -1333,7 +1333,7 @@ prevent the generation of resource policy entry values with null dspace_object a
if (StringUtils.equals(schema, MetadataSchemaEnum.RELATION.getName()) && !StringUtils.equals(element, "type")) { if (StringUtils.equals(schema, MetadataSchemaEnum.RELATION.getName()) && !StringUtils.equals(element, "type")) {
List<RelationshipMetadataValue> relationMetadata = relationshipMetadataService List<RelationshipMetadataValue> relationMetadata = relationshipMetadataService
.getRelationshipMetadata(item, false); .getRelationshipMetadata(item, enableVirtualMetadata);
List<MetadataValue> listToReturn = new LinkedList<>(); List<MetadataValue> listToReturn = new LinkedList<>();
for (MetadataValue metadataValue : relationMetadata) { for (MetadataValue metadataValue : relationMetadata) {
if (StringUtils.equals(metadataValue.getMetadataField().getElement(), element)) { if (StringUtils.equals(metadataValue.getMetadataField().getElement(), element)) {

View File

@@ -147,8 +147,8 @@ public class Related implements VirtualMetadataConfiguration {
* and pass this along to the next VirtualBean that's stored in this class. * and pass this along to the next VirtualBean that's stored in this class.
* @param context The relevant DSpace context * @param context The relevant DSpace context
* @param item The item that will be used to find the related item through its relationships * @param item The item that will be used to find the related item through its relationships
* @return The String value of the metadata fields concatened with a seperator as defined * @return The String value of the metadata fields concatenated with a separator as defined
* in the deepest Concatened bean in the chain * in the deepest Concatenated bean in the chain
* Will return an empty list if no relationships are found * Will return an empty list if no relationships are found
* @throws SQLException If something goes wrong * @throws SQLException If something goes wrong
*/ */
@@ -173,12 +173,12 @@ public class Related implements VirtualMetadataConfiguration {
for (Relationship relationship : relationships) { for (Relationship relationship : relationships) {
if (relationship.getRelationshipType().getLeftType() == entityType) { if (relationship.getRelationshipType().getLeftType() == entityType) {
if (relationship.getLeftPlace() == place) { if (place == null || relationship.getLeftPlace() == place) {
Item otherItem = relationship.getRightItem(); Item otherItem = relationship.getRightItem();
return virtualMetadataConfiguration.getValues(context, otherItem); return virtualMetadataConfiguration.getValues(context, otherItem);
} }
} else if (relationship.getRelationshipType().getRightType() == entityType) { } else if (relationship.getRelationshipType().getRightType() == entityType) {
if (relationship.getRightPlace() == place) { if (place == null || relationship.getRightPlace() == place) {
Item otherItem = relationship.getLeftItem(); Item otherItem = relationship.getLeftItem();
return virtualMetadataConfiguration.getValues(context, otherItem); return virtualMetadataConfiguration.getValues(context, otherItem);
} }

View File

@@ -8,13 +8,16 @@
package org.dspace.authorize; package org.dspace.authorize;
import java.io.IOException;
import java.sql.SQLException; import java.sql.SQLException;
import org.dspace.AbstractUnitTest; import org.dspace.AbstractUnitTest;
import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.ResourcePolicyService; import org.dspace.authorize.service.ResourcePolicyService;
import org.dspace.content.Collection;
import org.dspace.content.Community; import org.dspace.content.Community;
import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CollectionService;
import org.dspace.content.service.CommunityService; import org.dspace.content.service.CommunityService;
import org.dspace.core.Constants; import org.dspace.core.Constants;
import org.dspace.eperson.EPerson; import org.dspace.eperson.EPerson;
@@ -36,6 +39,7 @@ public class AuthorizeServiceTest extends AbstractUnitTest {
protected ResourcePolicyService resourcePolicyService = AuthorizeServiceFactory.getInstance() protected ResourcePolicyService resourcePolicyService = AuthorizeServiceFactory.getInstance()
.getResourcePolicyService(); .getResourcePolicyService();
protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService();
protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService();
public AuthorizeServiceTest() { public AuthorizeServiceTest() {
} }
@@ -125,4 +129,70 @@ public class AuthorizeServiceTest extends AbstractUnitTest {
throw new AssertionError(ex); throw new AssertionError(ex);
} }
} }
@Test
public void testIsCollectionAdmin() throws SQLException, AuthorizeException, IOException {
Community community = null;
EPerson eperson = null;
try {
context.turnOffAuthorisationSystem();
community = communityService.create(null, context);
Collection collection = collectionService.create(context, community);
eperson = ePersonService.create(context);
Group administrators = collectionService.createAdministrators(context, collection);
groupService.addMember(context, administrators, eperson);
context.commit();
Assert.assertTrue(authorizeService.isCollectionAdmin(context, eperson));
} finally {
if (community != null) {
communityService.delete(context, context.reloadEntity(community));
}
if (eperson != null) {
ePersonService.delete(context, context.reloadEntity(eperson));
}
context.restoreAuthSystemState();
}
}
@Test
public void testIsCollectionAdminReturnsTrueIfTheUserIsCommunityAdmin()
throws SQLException, AuthorizeException, IOException {
Community community = null;
EPerson eperson = null;
try {
context.turnOffAuthorisationSystem();
community = communityService.create(null, context);
eperson = ePersonService.create(context);
Group administrators = communityService.createAdministrators(context, community);
groupService.addMember(context, administrators, eperson);
context.commit();
Assert.assertTrue(authorizeService.isCollectionAdmin(context, eperson));
} finally {
if (community != null) {
communityService.delete(context, context.reloadEntity(community));
}
if (eperson != null) {
ePersonService.delete(context, context.reloadEntity(eperson));
}
context.restoreAuthSystemState();
}
}
} }

View File

@@ -106,6 +106,11 @@ public class ItemBuilder extends AbstractDSpaceObjectBuilder<Item> {
return addMetadataValue(item, MetadataSchemaEnum.DC.getName(), "description", "provenance", provenanceData); return addMetadataValue(item, MetadataSchemaEnum.DC.getName(), "description", "provenance", provenanceData);
} }
public ItemBuilder withMetadata(final String schema, final String element, final String qualifier,
final String value) {
return addMetadataValue(item, schema, element, qualifier, value);
}
public ItemBuilder makeUnDiscoverable() { public ItemBuilder makeUnDiscoverable() {
item.setDiscoverable(false); item.setDiscoverable(false);
return this; return this;

View File

@@ -10,14 +10,19 @@ package org.dspace.content;
import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail; import static org.junit.Assert.assertTrue;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List; import java.util.List;
import org.apache.logging.log4j.Logger; import org.dspace.AbstractIntegrationTestWithDatabase;
import org.dspace.AbstractUnitTest;
import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeException;
import org.dspace.builder.CollectionBuilder;
import org.dspace.builder.CommunityBuilder;
import org.dspace.builder.EntityTypeBuilder;
import org.dspace.builder.ItemBuilder;
import org.dspace.builder.RelationshipBuilder;
import org.dspace.builder.RelationshipTypeBuilder;
import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CollectionService; import org.dspace.content.service.CollectionService;
import org.dspace.content.service.CommunityService; import org.dspace.content.service.CommunityService;
@@ -28,17 +33,13 @@ import org.dspace.content.service.ItemService;
import org.dspace.content.service.RelationshipService; import org.dspace.content.service.RelationshipService;
import org.dspace.content.service.RelationshipTypeService; import org.dspace.content.service.RelationshipTypeService;
import org.dspace.content.service.WorkspaceItemService; import org.dspace.content.service.WorkspaceItemService;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
public class RelationshipMetadataServiceTest extends AbstractUnitTest { public class RelationshipMetadataServiceIT extends AbstractIntegrationTestWithDatabase {
private static final Logger log = org.apache.logging.log4j.LogManager
.getLogger(RelationshipMetadataServiceTest.class);
protected RelationshipMetadataService relationshipMetadataService = ContentServiceFactory protected RelationshipMetadataService relationshipMetadataService = ContentServiceFactory
.getInstance().getRelationshipMetadataService(); .getInstance().getRelationshipMetadataService();
protected RelationshipService relationshipService = ContentServiceFactory.getInstance().getRelationshipService(); protected RelationshipService relationshipService = ContentServiceFactory.getInstance().getRelationshipService();
protected RelationshipTypeService relationshipTypeService = ContentServiceFactory.getInstance() protected RelationshipTypeService relationshipTypeService = ContentServiceFactory.getInstance()
.getRelationshipTypeService(); .getRelationshipTypeService();
@@ -52,6 +53,7 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
Item leftItem; Item leftItem;
Item rightItem; Item rightItem;
Collection col;
Relationship relationship; Relationship relationship;
RelationshipType isAuthorOfPublicationRelationshipType; RelationshipType isAuthorOfPublicationRelationshipType;
@@ -60,65 +62,44 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
* initialize resources required for the tests. * initialize resources required for the tests.
* *
* Other methods can be annotated with @Before here or in subclasses * Other methods can be annotated with @Before here or in subclasses
* but no execution order is guaranteed * but no execution order is guaranteed.
*
* @throws Exception passed through.
*/ */
@Before @Before
@Override @Override
public void init() { public void setUp() throws Exception {
super.init(); super.setUp();
try { context.turnOffAuthorisationSystem();
context.turnOffAuthorisationSystem(); Community community = CommunityBuilder.createCommunity(context).build();
Community community = communityService.create(null, context);
Collection col = collectionService.create(context, community); col = CollectionBuilder.createCollection(context, community).build();
WorkspaceItem leftIs = workspaceItemService.create(context, col, false);
WorkspaceItem rightIs = workspaceItemService.create(context, col, false);
leftItem = installItemService.installItem(context, leftIs); leftItem = ItemBuilder.createItem(context, col).build();
rightItem = installItemService.installItem(context, rightIs); rightItem = ItemBuilder.createItem(context, col).build();
context.restoreAuthSystemState(); context.restoreAuthSystemState();
} catch (AuthorizeException ex) {
log.error("Authorization Error in init", ex);
fail("Authorization Error in init: " + ex.getMessage());
} catch (SQLException ex) {
log.error("SQL Error in init", ex);
fail("SQL Error in init: " + ex.getMessage());
}
}
/**
* This method will be run after every test as per @After. It will
* clean resources initialized by the @Before methods.
*
* Other methods can be annotated with @After here or in subclasses
* but no execution order is guaranteed
*/
@After
@Override
public void destroy() {
context.abort();
super.destroy();
} }
/** /**
* Common function to convert leftItem to a publication item, convert rightItem to an author item, * Common function to convert leftItem to a publication item, convert rightItem to an author item,
* and relating them to each other stored in the relationship field * and relating them to each other stored in the relationship field
*/ */
private void initPublicationAuthor() throws SQLException, AuthorizeException { private void initPublicationAuthor() {
context.turnOffAuthorisationSystem(); context.turnOffAuthorisationSystem();
itemService.addMetadata(context, leftItem, "relationship", "type", null, null, "Publication"); EntityType publicationEntityType = EntityTypeBuilder.createEntityTypeBuilder(context, "Publication").build();
itemService.addMetadata(context, rightItem, "relationship", "type", null, null, "Author"); EntityType authorEntityType = EntityTypeBuilder.createEntityTypeBuilder(context, "Author").build();
itemService.addMetadata(context, rightItem, "person", "familyName", null, null, "familyName"); leftItem = ItemBuilder.createItem(context, col).withRelationshipType("Publication").build();
itemService.addMetadata(context, rightItem, "person", "givenName", null, null, "firstName"); rightItem = ItemBuilder.createItem(context, col).withRelationshipType("Author")
EntityType publicationEntityType = entityTypeService.create(context, "Publication"); .withPersonIdentifierLastName("familyName")
EntityType authorEntityType = entityTypeService.create(context, "Author"); .withPersonIdentifierFirstName("firstName").build();
isAuthorOfPublicationRelationshipType = relationshipTypeService isAuthorOfPublicationRelationshipType =
.create(context, publicationEntityType, authorEntityType, RelationshipTypeBuilder.createRelationshipTypeBuilder(context, publicationEntityType, authorEntityType,
"isAuthorOfPublication", "isPublicationOfAuthor", "isAuthorOfPublication", "isPublicationOfAuthor",
null, null, null, null); null, null, null, null).build();
relationship = relationshipService.create(context, leftItem, rightItem, relationship =
isAuthorOfPublicationRelationshipType, 0, 0); RelationshipBuilder.createRelationshipBuilder(context, leftItem, rightItem,
isAuthorOfPublicationRelationshipType).build();
context.restoreAuthSystemState(); context.restoreAuthSystemState();
} }
@@ -127,20 +108,22 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
* and relating them to each other stored in the relationship field * and relating them to each other stored in the relationship field
*/ */
private void initPublicationAuthorWithCopyParams(boolean copyToLeft, boolean copyToRight) private void initPublicationAuthorWithCopyParams(boolean copyToLeft, boolean copyToRight)
throws SQLException, AuthorizeException { throws SQLException {
context.turnOffAuthorisationSystem(); context.turnOffAuthorisationSystem();
itemService.addMetadata(context, leftItem, "relationship", "type", null, null, "Publication"); EntityType publicationEntityType = EntityTypeBuilder.createEntityTypeBuilder(context, "Publication").build();
itemService.addMetadata(context, rightItem, "relationship", "type", null, null, "Author"); EntityType authorEntityType = EntityTypeBuilder.createEntityTypeBuilder(context, "Author").build();
itemService.addMetadata(context, rightItem, "person", "familyName", null, null, "familyName"); leftItem = ItemBuilder.createItem(context, col).withRelationshipType("Publication").build();
itemService.addMetadata(context, rightItem, "person", "givenName", null, null, "firstName"); rightItem = ItemBuilder.createItem(context, col).withRelationshipType("Author")
EntityType publicationEntityType = entityTypeService.create(context, "Publication"); .withPersonIdentifierLastName("familyName")
EntityType authorEntityType = entityTypeService.create(context, "Author"); .withPersonIdentifierFirstName("firstName").build();
RelationshipType isAuthorOfPublication = relationshipTypeService RelationshipType isAuthorOfPublication =
.create(context, publicationEntityType, authorEntityType, RelationshipTypeBuilder.createRelationshipTypeBuilder(context, publicationEntityType, authorEntityType,
"isAuthorOfPublication", "isPublicationOfAuthor", "isAuthorOfPublication", "isPublicationOfAuthor",
null, null, null, null, copyToLeft, copyToRight); null, null, null, null)
.withCopyToLeft(copyToLeft).withCopyToRight(copyToRight).build();
relationship = relationshipService.create(context, leftItem, rightItem, isAuthorOfPublication, 0, 0); relationship =
RelationshipBuilder.createRelationshipBuilder(context, leftItem, rightItem, isAuthorOfPublication).build();
context.restoreAuthSystemState(); context.restoreAuthSystemState();
} }
@@ -148,25 +131,28 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
* Common function to convert leftItem to a journal issue item, convert rightItem to a journal volume item, * Common function to convert leftItem to a journal issue item, convert rightItem to a journal volume item,
* and relating them to each other stored in the relationship field * and relating them to each other stored in the relationship field
*/ */
private void initJournalVolumeIssue() throws SQLException, AuthorizeException { private void initJournalVolumeIssue() {
context.turnOffAuthorisationSystem(); context.turnOffAuthorisationSystem();
itemService.addMetadata(context, leftItem, "relationship", "type", null, null, "JournalIssue"); EntityType journalIssueEntityType = EntityTypeBuilder.createEntityTypeBuilder(context, "JournalIssue").build();
itemService.addMetadata(context, rightItem, "relationship", "type", null, null, "JournalVolume"); EntityType publicationVolumeEntityType =
itemService.addMetadata(context, leftItem, "publicationissue", "issueNumber", null, null, "2"); EntityTypeBuilder.createEntityTypeBuilder(context, "JournalVolume").build();
itemService.addMetadata(context, rightItem, "publicationvolume", "volumeNumber", null, null, "30"); leftItem = ItemBuilder.createItem(context, col).withRelationshipType("JournalIssue")
EntityType journalIssueEntityType = entityTypeService.create(context, "JournalIssue"); .withPublicationIssueNumber("2").build();
EntityType publicationVolumeEntityType = entityTypeService.create(context, "JournalVolume"); rightItem = ItemBuilder.createItem(context, col).withRelationshipType("JournalVolume")
RelationshipType isIssueOfVolume = relationshipTypeService .withPublicationVolumeNumber("30").build();
.create(context, journalIssueEntityType, publicationVolumeEntityType, RelationshipType isIssueOfVolume =
"isJournalVolumeOfIssue", "isIssueOfJournalVolume", RelationshipTypeBuilder
null, null, null, null); .createRelationshipTypeBuilder(context, journalIssueEntityType, publicationVolumeEntityType,
"isJournalVolumeOfIssue", "isIssueOfJournalVolume",
null, null, null, null).build();
relationship = relationshipService.create(context, leftItem, rightItem, isIssueOfVolume, 0, 0); relationship =
RelationshipBuilder.createRelationshipBuilder(context, leftItem, rightItem, isIssueOfVolume).build();
context.restoreAuthSystemState(); context.restoreAuthSystemState();
} }
@Test @Test
public void testGetAuthorRelationshipMetadata() throws SQLException, AuthorizeException { public void testGetAuthorRelationshipMetadata() {
initPublicationAuthor(); initPublicationAuthor();
//leftItem is the publication //leftItem is the publication
//verify the dc.contributor.author virtual metadata //verify the dc.contributor.author virtual metadata
@@ -191,7 +177,7 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
assertThat(list.get(1).getValue(), equalTo(String.valueOf(rightItem.getID()))); assertThat(list.get(1).getValue(), equalTo(String.valueOf(rightItem.getID())));
assertThat(list.get(1).getMetadataField().getMetadataSchema().getName(), assertThat(list.get(1).getMetadataField().getMetadataSchema().getName(),
equalTo(MetadataSchemaEnum.RELATION.getName())); equalTo(MetadataSchemaEnum.RELATION.getName()));
assertThat(list.get(1).getMetadataField().getElement(), equalTo("isAuthorOfPublication")); assertThat(list.get(1).getMetadataField().getElement(), equalTo("isAuthorOfPublication"));
assertThat(list.get(1).getAuthority(), equalTo("virtual::" + relationship.getID())); assertThat(list.get(1).getAuthority(), equalTo("virtual::" + relationship.getID()));
} }
@@ -216,7 +202,7 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
//verify there's no relation.isAuthorOfPublication actual metadata //verify there's no relation.isAuthorOfPublication actual metadata
List<MetadataValue> relationshipMetadataList = itemService List<MetadataValue> relationshipMetadataList = itemService
.getMetadata(leftItem, MetadataSchemaEnum.RELATION.getName(), "isAuthorOfPublication", null, Item.ANY); .getMetadata(leftItem, MetadataSchemaEnum.RELATION.getName(), "isAuthorOfPublication", null, Item.ANY);
assertThat(relationshipMetadataList.size(), equalTo(0)); assertThat(relationshipMetadataList.size(), equalTo(0));
//request the virtual metadata of the publication only //request the virtual metadata of the publication only
@@ -239,7 +225,7 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
//verify there's no relation.isAuthorOfPublication actual metadata on the publication //verify there's no relation.isAuthorOfPublication actual metadata on the publication
List<MetadataValue> relationshipMetadataList = itemService List<MetadataValue> relationshipMetadataList = itemService
.getMetadata(leftItem, MetadataSchemaEnum.RELATION.getName(), "isAuthorOfPublication", null, Item.ANY); .getMetadata(leftItem, MetadataSchemaEnum.RELATION.getName(), "isAuthorOfPublication", null, Item.ANY);
assertThat(relationshipMetadataList.size(), equalTo(0)); assertThat(relationshipMetadataList.size(), equalTo(0));
} }
@@ -262,31 +248,31 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
//verify there's no relation.isAuthorOfPublication actual metadata //verify there's no relation.isAuthorOfPublication actual metadata
List<MetadataValue> relationshipMetadataList = itemService List<MetadataValue> relationshipMetadataList = itemService
.getMetadata(leftItem, MetadataSchemaEnum.RELATION.getName(), "isAuthorOfPublication", null, Item.ANY); .getMetadata(leftItem, MetadataSchemaEnum.RELATION.getName(), "isAuthorOfPublication", null, Item.ANY);
assertThat(relationshipMetadataList.size(), equalTo(0)); assertThat(relationshipMetadataList.size(), equalTo(0));
} }
@Test @Test
public void testGetJournalRelationshipMetadata() throws SQLException, AuthorizeException { public void testGetJournalRelationshipMetadata() {
initJournalVolumeIssue(); initJournalVolumeIssue();
//leftItem is the journal issue item //leftItem is the journal issue item
//verify the publicationvolume.volumeNumber virtual metadata //verify the publicationvolume.volumeNumber virtual metadata
List<MetadataValue> volumeList = List<MetadataValue> volumeList =
itemService.getMetadata(leftItem, "publicationvolume", "volumeNumber", null, Item.ANY); itemService.getMetadata(leftItem, "publicationvolume", "volumeNumber", null, Item.ANY);
assertThat(volumeList.size(), equalTo(1)); assertThat(volumeList.size(), equalTo(1));
assertThat(volumeList.get(0).getValue(), equalTo("30")); assertThat(volumeList.get(0).getValue(), equalTo("30"));
//rightItem is the journal volume item //rightItem is the journal volume item
//verify the publicationissue.issueNumber virtual metadata //verify the publicationissue.issueNumber virtual metadata
List<MetadataValue> issueList = List<MetadataValue> issueList =
itemService.getMetadata(rightItem, "publicationissue", "issueNumber", null, Item.ANY); itemService.getMetadata(rightItem, "publicationissue", "issueNumber", null, Item.ANY);
assertThat(issueList.size(), equalTo(1)); assertThat(issueList.size(), equalTo(1));
assertThat(issueList.get(0).getValue(), equalTo("2")); assertThat(issueList.get(0).getValue(), equalTo("2"));
//request the virtual metadata of the journal issue //request the virtual metadata of the journal issue
List<RelationshipMetadataValue> issueRelList = List<RelationshipMetadataValue> issueRelList =
relationshipMetadataService.getRelationshipMetadata(leftItem, true); relationshipMetadataService.getRelationshipMetadata(leftItem, true);
assertThat(issueRelList.size(), equalTo(2)); assertThat(issueRelList.size(), equalTo(2));
assertThat(issueRelList.get(0).getValue(), equalTo("30")); assertThat(issueRelList.get(0).getValue(), equalTo("30"));
assertThat(issueRelList.get(0).getMetadataField().getMetadataSchema().getName(), equalTo("publicationvolume")); assertThat(issueRelList.get(0).getMetadataField().getMetadataSchema().getName(), equalTo("publicationvolume"));
@@ -296,13 +282,13 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
assertThat(issueRelList.get(1).getValue(), equalTo(String.valueOf(rightItem.getID()))); assertThat(issueRelList.get(1).getValue(), equalTo(String.valueOf(rightItem.getID())));
assertThat(issueRelList.get(1).getMetadataField().getMetadataSchema().getName(), assertThat(issueRelList.get(1).getMetadataField().getMetadataSchema().getName(),
equalTo(MetadataSchemaEnum.RELATION.getName())); equalTo(MetadataSchemaEnum.RELATION.getName()));
assertThat(issueRelList.get(1).getMetadataField().getElement(), equalTo("isJournalVolumeOfIssue")); assertThat(issueRelList.get(1).getMetadataField().getElement(), equalTo("isJournalVolumeOfIssue"));
assertThat(issueRelList.get(1).getAuthority(), equalTo("virtual::" + relationship.getID())); assertThat(issueRelList.get(1).getAuthority(), equalTo("virtual::" + relationship.getID()));
//request the virtual metadata of the journal volume //request the virtual metadata of the journal volume
List<RelationshipMetadataValue> volumeRelList = List<RelationshipMetadataValue> volumeRelList =
relationshipMetadataService.getRelationshipMetadata(rightItem, true); relationshipMetadataService.getRelationshipMetadata(rightItem, true);
assertThat(volumeRelList.size(), equalTo(2)); assertThat(volumeRelList.size(), equalTo(2));
assertThat(volumeRelList.get(0).getValue(), equalTo("2")); assertThat(volumeRelList.get(0).getValue(), equalTo("2"));
assertThat(volumeRelList.get(0).getMetadataField().getMetadataSchema().getName(), equalTo("publicationissue")); assertThat(volumeRelList.get(0).getMetadataField().getMetadataSchema().getName(), equalTo("publicationissue"));
@@ -312,7 +298,7 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
assertThat(volumeRelList.get(1).getValue(), equalTo(String.valueOf(leftItem.getID()))); assertThat(volumeRelList.get(1).getValue(), equalTo(String.valueOf(leftItem.getID())));
assertThat(volumeRelList.get(1).getMetadataField().getMetadataSchema().getName(), assertThat(volumeRelList.get(1).getMetadataField().getMetadataSchema().getName(),
equalTo(MetadataSchemaEnum.RELATION.getName())); equalTo(MetadataSchemaEnum.RELATION.getName()));
assertThat(volumeRelList.get(1).getMetadataField().getElement(), equalTo("isIssueOfJournalVolume")); assertThat(volumeRelList.get(1).getMetadataField().getElement(), equalTo("isIssueOfJournalVolume"));
assertThat(volumeRelList.get(1).getAuthority(), equalTo("virtual::" + relationship.getID())); assertThat(volumeRelList.get(1).getAuthority(), equalTo("virtual::" + relationship.getID()));
} }
@@ -327,13 +313,13 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
//verify the left item's publicationvolume.volumeNumber actual metadata //verify the left item's publicationvolume.volumeNumber actual metadata
List<MetadataValue> volumeList = List<MetadataValue> volumeList =
itemService.getMetadata(leftItem, "publicationvolume", "volumeNumber", null, Item.ANY); itemService.getMetadata(leftItem, "publicationvolume", "volumeNumber", null, Item.ANY);
assertThat(volumeList.size(), equalTo(1)); assertThat(volumeList.size(), equalTo(1));
assertThat(volumeList.get(0).getValue(), equalTo("30")); assertThat(volumeList.get(0).getValue(), equalTo("30"));
//verify the right item doesn't contain the actual metadata //verify the right item doesn't contain the actual metadata
List<MetadataValue> issueList = List<MetadataValue> issueList =
itemService.getMetadata(rightItem, "publicationissue", "issueNumber", null, Item.ANY); itemService.getMetadata(rightItem, "publicationissue", "issueNumber", null, Item.ANY);
assertThat(issueList.size(), equalTo(0)); assertThat(issueList.size(), equalTo(0));
} }
@@ -347,12 +333,12 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
//verify the left item doesn't contain the publicationvolume.volumeNumber actual metadata //verify the left item doesn't contain the publicationvolume.volumeNumber actual metadata
List<MetadataValue> volumeList = List<MetadataValue> volumeList =
itemService.getMetadata(leftItem, "publicationvolume", "volumeNumber", null, Item.ANY); itemService.getMetadata(leftItem, "publicationvolume", "volumeNumber", null, Item.ANY);
assertThat(volumeList.size(), equalTo(0)); assertThat(volumeList.size(), equalTo(0));
//verify the right item's publicationissue.issueNumber actual metadata //verify the right item's publicationissue.issueNumber actual metadata
List<MetadataValue> issueList = List<MetadataValue> issueList =
itemService.getMetadata(rightItem, "publicationissue", "issueNumber", null, Item.ANY); itemService.getMetadata(rightItem, "publicationissue", "issueNumber", null, Item.ANY);
assertThat(issueList.size(), equalTo(1)); assertThat(issueList.size(), equalTo(1));
assertThat(issueList.get(0).getValue(), equalTo("2")); assertThat(issueList.get(0).getValue(), equalTo("2"));
} }
@@ -368,13 +354,13 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
//verify the left item's publicationvolume.volumeNumber actual metadata //verify the left item's publicationvolume.volumeNumber actual metadata
List<MetadataValue> volumeList = List<MetadataValue> volumeList =
itemService.getMetadata(leftItem, "publicationvolume", "volumeNumber", null, Item.ANY); itemService.getMetadata(leftItem, "publicationvolume", "volumeNumber", null, Item.ANY);
assertThat(volumeList.size(), equalTo(1)); assertThat(volumeList.size(), equalTo(1));
assertThat(volumeList.get(0).getValue(), equalTo("30")); assertThat(volumeList.get(0).getValue(), equalTo("30"));
//verify the right item's publicationissue.issueNumber actual metadata //verify the right item's publicationissue.issueNumber actual metadata
List<MetadataValue> issueList = List<MetadataValue> issueList =
itemService.getMetadata(rightItem, "publicationissue", "issueNumber", null, Item.ANY); itemService.getMetadata(rightItem, "publicationissue", "issueNumber", null, Item.ANY);
assertThat(issueList.size(), equalTo(1)); assertThat(issueList.size(), equalTo(1));
assertThat(issueList.get(0).getValue(), equalTo("2")); assertThat(issueList.get(0).getValue(), equalTo("2"));
} }
@@ -457,20 +443,15 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
assertThat(relationshipService.findNextRightPlaceByRightItem(context, rightItem), equalTo(1)); assertThat(relationshipService.findNextRightPlaceByRightItem(context, rightItem), equalTo(1));
context.turnOffAuthorisationSystem(); context.turnOffAuthorisationSystem();
Community community = communityService.create(null, context); Community community = CommunityBuilder.createCommunity(context).build();
Collection col = collectionService.create(context, community); Collection col = CollectionBuilder.createCollection(context, community).build();
WorkspaceItem is = workspaceItemService.create(context, col, false); Item secondItem = ItemBuilder.createItem(context, col).withRelationshipType("Publication").build();
Item secondItem = installItemService.installItem(context, is); RelationshipBuilder.createRelationshipBuilder(context, secondItem, rightItem,
itemService.addMetadata(context, secondItem, "relationship", "type", null, null, "Publication"); isAuthorOfPublicationRelationshipType).build();
relationshipService.create(context, secondItem, rightItem,
isAuthorOfPublicationRelationshipType, 0, 0);
context.restoreAuthSystemState(); context.restoreAuthSystemState();
assertThat(relationshipService.findNextRightPlaceByRightItem(context, rightItem), equalTo(2)); assertThat(relationshipService.findNextRightPlaceByRightItem(context, rightItem), equalTo(2));
} }
@Test @Test
@@ -481,21 +462,132 @@ public class RelationshipMetadataServiceTest extends AbstractUnitTest {
assertThat(relationshipService.findNextLeftPlaceByLeftItem(context, leftItem), equalTo(1)); assertThat(relationshipService.findNextLeftPlaceByLeftItem(context, leftItem), equalTo(1));
context.turnOffAuthorisationSystem(); context.turnOffAuthorisationSystem();
Community community = communityService.create(null, context); Community community = CommunityBuilder.createCommunity(context).build();
Collection col = CollectionBuilder.createCollection(context, community).build();
Collection col = collectionService.create(context, community); Item secondAuthor = ItemBuilder.createItem(context, col).withRelationshipType("Author")
WorkspaceItem is = workspaceItemService.create(context, col, false); .withPersonIdentifierFirstName("firstName")
Item secondAuthor = installItemService.installItem(context, is); .withPersonIdentifierLastName("familyName").build();
itemService.addMetadata(context, secondAuthor, "relationship", "type", null, null, "Author");
itemService.addMetadata(context, secondAuthor, "person", "familyName", null, null, "familyName"); RelationshipBuilder.createRelationshipBuilder(context, leftItem, secondAuthor,
itemService.addMetadata(context, secondAuthor, "person", "givenName", null, null, "firstName"); isAuthorOfPublicationRelationshipType).build();
relationshipService.create(context, leftItem, secondAuthor,
isAuthorOfPublicationRelationshipType, 0, 0);
context.restoreAuthSystemState(); context.restoreAuthSystemState();
assertThat(relationshipService.findNextLeftPlaceByLeftItem(context, leftItem), equalTo(2)); assertThat(relationshipService.findNextLeftPlaceByLeftItem(context, leftItem), equalTo(2));
}
@Test
public void testGetVirtualMetadata() throws SQLException, AuthorizeException {
// Journal, JournalVolume, JournalIssue, Publication items, related to each other using the relationship types
// isJournalOfVolume, isJournalVolumeOfIssue, isJournalIssueOfPublication.
context.turnOffAuthorisationSystem();
EntityType publicationEntityType = EntityTypeBuilder.createEntityTypeBuilder(context, "Publication").build();
EntityType journalIssueEntityType = EntityTypeBuilder.createEntityTypeBuilder(context, "JournalIssue").build();
EntityType journalVolumeEntityType =
EntityTypeBuilder.createEntityTypeBuilder(context, "JournalVolume").build();
EntityType journalEntityType = EntityTypeBuilder.createEntityTypeBuilder(context, "Journal").build();
RelationshipType isJournalVolumeOfIssueRelationshipType =
RelationshipTypeBuilder.createRelationshipTypeBuilder(context, journalIssueEntityType,
journalVolumeEntityType, "isIssueOfJournalVolume", "isJournalVolumeOfIssue", null, null, null, null)
.build();
RelationshipType isJournalVolumeOfJournalRelationshipType =
RelationshipTypeBuilder.createRelationshipTypeBuilder(context, journalVolumeEntityType,
journalEntityType, "isJournalOfVolume", "isVolumeOfJournal", null, null, null, null)
.build();
RelationshipType isJournalIssueOfPublicationRelationshipType =
RelationshipTypeBuilder.createRelationshipTypeBuilder(context, publicationEntityType,
journalIssueEntityType, "isJournalIssueOfPublication", "isPublicationOfJournalIssue", null, null, null,
null)
.build();
Community community = CommunityBuilder.createCommunity(context).build();
Collection collection = CollectionBuilder.createCollection(context, community).build();
Item journalIssue = ItemBuilder.createItem(context, collection).withRelationshipType("JournalIssue").build();
Item journalVolume = ItemBuilder.createItem(context, collection)
.withPublicationVolumeNumber("30")
.withRelationshipType("JournalVolume").build();
Item journal = ItemBuilder.createItem(context, collection)
.withMetadata("creativeworkseries", "issn", null, "issn journal")
.withRelationshipType("Journal").build();
RelationshipBuilder.createRelationshipBuilder(context, journalIssue, journalVolume,
isJournalVolumeOfIssueRelationshipType).build();
RelationshipBuilder.createRelationshipBuilder(context, journalVolume, journal,
isJournalVolumeOfJournalRelationshipType).build();
Item publication = ItemBuilder.createItem(context, collection)
.withTitle("Pub 1")
.withRelationshipType("Publication").build();
RelationshipBuilder.createRelationshipBuilder(context, publication, journalIssue,
isJournalIssueOfPublicationRelationshipType).build();
context.restoreAuthSystemState();
// Query for the publication itemService.getMetadata(publication, Item.ANY, Item.ANY, null, Item.ANY, true);
// and verify it contains a relation.isJournalOfPublication metadata value with the value being the journals
// UUID
List<MetadataValue> mdPublication =
itemService.getMetadata(publication, Item.ANY, Item.ANY, Item.ANY, Item.ANY, true);
boolean foundVirtualMdIsJournalOfPublicationInAllMD = false;
for (MetadataValue metadataValue : mdPublication) {
String schema = metadataValue.getMetadataField().getMetadataSchema().getName();
String element = metadataValue.getMetadataField().getElement();
String qualifier = metadataValue.getMetadataField().getQualifier();
if (schema.equals("relation") && element.equals("isJournalOfPublication") && qualifier == null &&
metadataValue.getValue().equals(journal.getID().toString())) {
foundVirtualMdIsJournalOfPublicationInAllMD = true;
}
}
assertTrue(foundVirtualMdIsJournalOfPublicationInAllMD);
// Query for the publication itemService.getMetadata(publication, "relation", "isJournalOfPublication", null,
// Item.ANY, true); and verify it contains a relation.isJournalOfPublication metadata value with the value
// being the journals UUID
List<MetadataValue> mdPublicationRelationIsJournalOfPublication =
itemService.getMetadata(publication, "relation", "isJournalOfPublication", Item.ANY, Item.ANY, true);
boolean foundVirtualMdIsJournalOfPublicationInSpecificQuery = false;
for (MetadataValue metadataValue : mdPublicationRelationIsJournalOfPublication) {
String schema = metadataValue.getMetadataField().getMetadataSchema().getName();
String element = metadataValue.getMetadataField().getElement();
String qualifier = metadataValue.getMetadataField().getQualifier();
if (schema.equals("relation") && element.equals("isJournalOfPublication") && qualifier == null &&
metadataValue.getValue().equals(journal.getID().toString())) {
foundVirtualMdIsJournalOfPublicationInSpecificQuery = true;
}
}
assertTrue(foundVirtualMdIsJournalOfPublicationInSpecificQuery);
// Query for the publication itemService.getMetadata(publication, Item.ANY, Item.ANY, null, Item.ANY, true);
// and verify it contains a creativeworkseries.issn metadata value with the value being the journals issn
boolean foundVirtualMdCreativeWorksISSNInAllMD = false;
for (MetadataValue metadataValue : mdPublication) {
String schema = metadataValue.getMetadataField().getMetadataSchema().getName();
String element = metadataValue.getMetadataField().getElement();
String qualifier = metadataValue.getMetadataField().getQualifier();
if (schema.equals("creativeworkseries") && element.equals("issn") && qualifier == null &&
metadataValue.getValue().equals("issn journal")) {
foundVirtualMdCreativeWorksISSNInAllMD = true;
}
}
assertTrue(foundVirtualMdCreativeWorksISSNInAllMD);
// Query for the publication itemService.getMetadata(publication, "creativeworkseries", "issn", null, Item
// .ANY, true); and verify it contains a creativeworkseries.issn metadata value with the value being the
// journals issn
List<MetadataValue> mdPublicationVirtualMdCreativeWorksISSN = itemService.getMetadata(publication,
"creativeworkseries", "issn", Item.ANY, Item.ANY, true);
boolean foundCreativeWorksISSNInSpecificQuery = false;
for (MetadataValue metadataValue : mdPublicationVirtualMdCreativeWorksISSN) {
String schema = metadataValue.getMetadataField().getMetadataSchema().getName();
String element = metadataValue.getMetadataField().getElement();
String qualifier = metadataValue.getMetadataField().getQualifier();
if (schema.equals("creativeworkseries") && element.equals("issn") && qualifier == null &&
metadataValue.getValue().equals("issn journal")) {
foundCreativeWorksISSNInSpecificQuery = true;
}
}
assertTrue(foundCreativeWorksISSNInSpecificQuery);
} }
} }

View File

@@ -160,13 +160,11 @@
of the values to the next bean in the chain --> of the values to the next bean in the chain -->
<bean class="org.dspace.content.virtual.Related" id="volumeJournal_issn_related"> <bean class="org.dspace.content.virtual.Related" id="volumeJournal_issn_related">
<property name="relationshipTypeString" value="isJournalOfVolume"/> <property name="relationshipTypeString" value="isJournalOfVolume"/>
<property name="place" value="1"/>
<property name="virtualMetadataConfiguration" ref="volumeJournal_issn"/> <property name="virtualMetadataConfiguration" ref="volumeJournal_issn"/>
</bean> </bean>
<bean class="org.dspace.content.virtual.Related" id="volumeJournal_title_related"> <bean class="org.dspace.content.virtual.Related" id="volumeJournal_title_related">
<property name="relationshipTypeString" value="isJournalOfVolume"/> <property name="relationshipTypeString" value="isJournalOfVolume"/>
<property name="place" value="1"/>
<property name="virtualMetadataConfiguration" ref="volumeJournal_title"/> <property name="virtualMetadataConfiguration" ref="volumeJournal_title"/>
</bean> </bean>
@@ -233,31 +231,26 @@
bean to retrieve the final value --> bean to retrieve the final value -->
<bean class="org.dspace.content.virtual.Related" id="issueVolumeJournal_issn_related"> <bean class="org.dspace.content.virtual.Related" id="issueVolumeJournal_issn_related">
<property name="relationshipTypeString" value="isJournalVolumeOfIssue"/> <property name="relationshipTypeString" value="isJournalVolumeOfIssue"/>
<property name="place" value="1"/>
<property name="virtualMetadataConfiguration" ref="volumeJournal_issn_related"/> <property name="virtualMetadataConfiguration" ref="volumeJournal_issn_related"/>
</bean> </bean>
<bean class="org.dspace.content.virtual.Related" id="issueVolumeJournal_title_related"> <bean class="org.dspace.content.virtual.Related" id="issueVolumeJournal_title_related">
<property name="relationshipTypeString" value="isJournalVolumeOfIssue"/> <property name="relationshipTypeString" value="isJournalVolumeOfIssue"/>
<property name="place" value="1"/>
<property name="virtualMetadataConfiguration" ref="volumeJournal_title_related"/> <property name="virtualMetadataConfiguration" ref="volumeJournal_title_related"/>
</bean> </bean>
<bean class="org.dspace.content.virtual.Related" id="issueVolume_title_related"> <bean class="org.dspace.content.virtual.Related" id="issueVolume_title_related">
<property name="relationshipTypeString" value="isJournalVolumeOfIssue"/> <property name="relationshipTypeString" value="isJournalVolumeOfIssue"/>
<property name="place" value="1"/>
<property name="virtualMetadataConfiguration" ref="issueVolume_title"/> <property name="virtualMetadataConfiguration" ref="issueVolume_title"/>
</bean> </bean>
<bean class="org.dspace.content.virtual.Related" id="issueVolumeJournal_uuid_related"> <bean class="org.dspace.content.virtual.Related" id="issueVolumeJournal_uuid_related">
<property name="relationshipTypeString" value="isJournalVolumeOfIssue"/> <property name="relationshipTypeString" value="isJournalVolumeOfIssue"/>
<property name="place" value="1"/>
<property name="virtualMetadataConfiguration" ref="volumeJournal_uuid_related"/> <property name="virtualMetadataConfiguration" ref="volumeJournal_uuid_related"/>
</bean> </bean>
<bean class="org.dspace.content.virtual.Related" id="volumeJournal_uuid_related"> <bean class="org.dspace.content.virtual.Related" id="volumeJournal_uuid_related">
<property name="relationshipTypeString" value="isJournalOfVolume"/> <property name="relationshipTypeString" value="isJournalOfVolume"/>
<property name="place" value="1"/>
<property name="virtualMetadataConfiguration" ref="volumeJournal_uuid"/> <property name="virtualMetadataConfiguration" ref="volumeJournal_uuid"/>
</bean> </bean>
<bean class="org.dspace.content.virtual.UUIDValue" id="volumeJournal_uuid"/> <bean class="org.dspace.content.virtual.UUIDValue" id="volumeJournal_uuid"/>