Skip to content

Commit 7ffaf9a

Browse files
Issue ufal#1266: dc.date.available and dc.relation.replaces metadata not cleared properly (ufal#1307)
* Issue ufal#1266: dc.date.available and dc.relation.replaces metadata not cleaned properly in new item version * added unit test * update comment * resolve Copilot comments * resolve MR comments - update ignoredMetadataFields in versioning-service.xml * update ClarinVersionedHandleIdentifierProviderIT test to check dc.identifier.uri metadata for new version
1 parent f1aa8f3 commit 7ffaf9a

3 files changed

Lines changed: 153 additions & 2 deletions

File tree

dspace-api/src/main/java/org/dspace/versioning/DefaultItemVersionProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ protected void copyRelationships(
200200
*/
201201
private void manageRelationMetadata(Context c, Item itemNew, Item previousItem) throws SQLException {
202202
// Remove copied `dc.relation.replaces` metadata for the new item.
203-
itemService.clearMetadata(c, itemNew, "dc", "relation", "replaces", null);
203+
itemService.clearMetadata(c, itemNew, "dc", "relation", "replaces", Item.ANY);
204204

205205
// Add metadata `dc.relation.replaces` to the new item.
206206
// The metadata value is: `dc.identifier.uri` from the previous item.
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
/**
2+
* The contents of this file are subject to the license and copyright
3+
* detailed in the LICENSE and NOTICE files at the root of the source
4+
* tree and available online at
5+
*
6+
* http://www.dspace.org/license/
7+
*/
8+
package org.dspace.identifier;
9+
10+
import static org.hamcrest.CoreMatchers.equalTo;
11+
import static org.hamcrest.CoreMatchers.not;
12+
import static org.hamcrest.CoreMatchers.startsWith;
13+
import static org.hamcrest.MatcherAssert.assertThat;
14+
15+
import java.text.SimpleDateFormat;
16+
import java.util.ArrayList;
17+
import java.util.Calendar;
18+
import java.util.List;
19+
import java.util.TimeZone;
20+
21+
import org.dspace.AbstractIntegrationTestWithDatabase;
22+
import org.dspace.builder.CollectionBuilder;
23+
import org.dspace.builder.CommunityBuilder;
24+
import org.dspace.builder.ItemBuilder;
25+
import org.dspace.builder.VersionBuilder;
26+
import org.dspace.content.Collection;
27+
import org.dspace.content.Item;
28+
import org.dspace.content.MetadataValue;
29+
import org.dspace.content.factory.ContentServiceFactory;
30+
import org.dspace.content.service.InstallItemService;
31+
import org.dspace.content.service.ItemService;
32+
import org.dspace.kernel.ServiceManager;
33+
import org.dspace.services.factory.DSpaceServicesFactory;
34+
import org.dspace.workflow.WorkflowItem;
35+
import org.dspace.workflow.WorkflowItemService;
36+
import org.dspace.workflow.factory.WorkflowServiceFactory;
37+
import org.junit.Before;
38+
import org.junit.Test;
39+
40+
/**
41+
* Unit Tests for ClarinVersionedHandleIdentifierProvider
42+
*
43+
* @authorMilan Kuchtiak
44+
*/
45+
public class ClarinVersionedHandleIdentifierProviderIT extends AbstractIntegrationTestWithDatabase {
46+
private IdentifierServiceImpl identifierService;
47+
private InstallItemService installItemService;
48+
private ItemService itemService;
49+
private WorkflowItemService workflowItemService;
50+
51+
private Collection collection;
52+
53+
@Before
54+
@Override
55+
public void setUp() throws Exception {
56+
super.setUp();
57+
context.turnOffAuthorisationSystem();
58+
59+
ServiceManager serviceManager = DSpaceServicesFactory.getInstance().getServiceManager();
60+
identifierService = serviceManager.getServicesByType(IdentifierServiceImpl.class).get(0);
61+
62+
itemService = ContentServiceFactory.getInstance().getItemService();
63+
installItemService = ContentServiceFactory.getInstance().getInstallItemService();
64+
workflowItemService = WorkflowServiceFactory.getInstance().getWorkflowItemService();
65+
66+
// Clean out providers to avoid any being used for creation of community and collection
67+
identifierService.setProviders(new ArrayList<>());
68+
69+
parentCommunity = CommunityBuilder.createCommunity(context)
70+
.withName("Parent Community")
71+
.build();
72+
collection = CollectionBuilder.createCollection(context, parentCommunity)
73+
.withName("Collection")
74+
.build();
75+
}
76+
77+
@Test
78+
public void testNewVersionMetadata() throws Exception {
79+
registerProvider(ClarinVersionedHandleIdentifierProvider.class);
80+
Item itemV1 = ItemBuilder.createItem(context, collection)
81+
.withTitle("First version")
82+
.build();
83+
84+
// new item "dc.relation.replaces" metadata has to be set to this value
85+
String itemV1HandleRef = itemService.getMetadataFirstValue(itemV1, "dc", "identifier", "uri", Item.ANY);
86+
87+
// set "dc.relation.replaces" metadata on itemV1
88+
itemService.addMetadata(context, itemV1, "dc", "relation", "replaces", null, "some_value");
89+
// replace "dc.date.available" metadata on itemV1 to some old value
90+
itemService.clearMetadata(context, itemV1, "dc", "date", "available", Item.ANY);
91+
itemService.addMetadata(context, itemV1, "dc", "date", "available", null, "2020-01-01");
92+
93+
Item itemV2 = VersionBuilder.createVersion(context, itemV1, "Second version").build().getItem();
94+
95+
// check that "dc.date.available", metadata is not copied to itemV2
96+
assertThat(itemService.getMetadata(itemV2, "dc", "date", "available", Item.ANY).size(), equalTo(0));
97+
98+
// check that "dc.identifier.uri", metadata is not copied to itemV2
99+
assertThat(itemService.getMetadata(itemV2, "dc", "identifier", "uri", Item.ANY).size(), equalTo(0));
100+
101+
// check that "dc.relation.replaces" points to itemV1
102+
List<MetadataValue> metadataValues = itemService.getMetadata(itemV2, "dc", "relation", "replaces", Item.ANY);
103+
assertThat(metadataValues.size(), equalTo(1));
104+
assertThat(metadataValues.get(0).getValue(), equalTo(itemV1HandleRef));
105+
106+
WorkflowItem workflowItem = workflowItemService.create(context, itemV2, collection);
107+
Item installedItem = installItemService.installItem(context, workflowItem);
108+
109+
// get current date
110+
Calendar calendar = Calendar.getInstance();
111+
calendar.setTimeInMillis(System.currentTimeMillis());
112+
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
113+
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
114+
String date = sdf.format(calendar.getTime());
115+
116+
// check that "dc.relation.replaces" points to itemV1
117+
metadataValues = itemService.getMetadata(installedItem, "dc", "relation", "replaces", Item.ANY);
118+
assertThat(metadataValues.size(), equalTo(1));
119+
assertThat(metadataValues.get(0).getValue(), equalTo(itemV1HandleRef));
120+
121+
// Check that itemV2 has the correct "dc.date.available" metadata set to current date
122+
metadataValues = itemService.getMetadata(installedItem, "dc", "date", "available", Item.ANY);
123+
assertThat(metadataValues.size(), equalTo(1));
124+
assertThat(metadataValues.get(0).getValue(), startsWith(date));
125+
126+
// check "dc.identifier.uri" metadata has new value different from itemV1
127+
metadataValues = itemService.getMetadata(installedItem, "dc", "identifier", "uri", Item.ANY);
128+
assertThat(metadataValues.size(), equalTo(1));
129+
assertThat(metadataValues.get(0).getValue(), not(itemV1HandleRef));
130+
}
131+
132+
private void registerProvider(Class type) {
133+
// Register our new provider
134+
IdentifierProvider identifierProvider =
135+
(IdentifierProvider) DSpaceServicesFactory.getInstance().getServiceManager()
136+
.getServiceByName(type.getName(), type);
137+
if (identifierProvider == null) {
138+
DSpaceServicesFactory.getInstance().getServiceManager().registerServiceClass(type.getName(), type);
139+
identifierProvider = (IdentifierProvider) DSpaceServicesFactory.getInstance().getServiceManager()
140+
.getServiceByName(type.getName(), type);
141+
}
142+
143+
// Overwrite the identifier-service's providers with the new one to ensure only this provider is used
144+
identifierService = DSpaceServicesFactory.getInstance().getServiceManager()
145+
.getServicesByType(IdentifierServiceImpl.class).get(0);
146+
identifierService.setProviders(new ArrayList<>());
147+
identifierService.setProviders(List.of(identifierProvider));
148+
}
149+
}

dspace/config/spring/api/versioning-service.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@
2121
<property name="ignoredMetadataFields">
2222
<set>
2323
<value>dc.date.accessioned</value>
24+
<value>dc.date.available</value>
2425
<value>dc.description.provenance</value>
2526
<value>dc.identifier.uri</value>
27+
<value>dc.relation.replaces</value>
2628
</set>
2729
</property>
28-
30+
2931
</bean>
3032
</property>
3133

0 commit comments

Comments
 (0)