mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-16 14:33:09 +00:00
DS-2940: fixing metadata problems with canonical versioned handles.
This commit is contained in:
@@ -37,8 +37,6 @@ public class HandleIdentifierProvider extends IdentifierProvider {
|
||||
/** Prefix registered to no one */
|
||||
protected static final String EXAMPLE_PREFIX = "123456789";
|
||||
|
||||
protected String[] supportedPrefixes = new String[]{"info:hdl", "hdl", "http://"};
|
||||
|
||||
@Autowired(required = true)
|
||||
protected HandleService handleService;
|
||||
@Autowired(required = true)
|
||||
@@ -52,22 +50,20 @@ public class HandleIdentifierProvider extends IdentifierProvider {
|
||||
@Override
|
||||
public boolean supports(String identifier)
|
||||
{
|
||||
for(String prefix : supportedPrefixes){
|
||||
if(identifier.startsWith(prefix))
|
||||
String prefix = handleService.getPrefix();
|
||||
String handleResolver = ConfigurationManager.getProperty("handle.canonical.prefix");
|
||||
if (identifier == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (identifier.startsWith(prefix)
|
||||
|| identifier.startsWith(handleResolver)
|
||||
|| identifier.startsWith("http://hdl.handle.net/")
|
||||
|| identifier.startsWith("hdl:")
|
||||
|| identifier.startsWith("info:hdl"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
String outOfUrl = retrieveHandleOutOfUrl(identifier);
|
||||
if(outOfUrl != null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@@ -48,8 +48,6 @@ public class VersionedHandleIdentifierProvider extends IdentifierProvider {
|
||||
|
||||
private static final char DOT = '.';
|
||||
|
||||
private String[] supportedPrefixes = new String[]{"info:hdl", "hdl", "http://"};
|
||||
|
||||
@Autowired(required = true)
|
||||
private VersioningService versionService;
|
||||
|
||||
@@ -71,23 +69,20 @@ public class VersionedHandleIdentifierProvider extends IdentifierProvider {
|
||||
@Override
|
||||
public boolean supports(String identifier)
|
||||
{
|
||||
for(String prefix : supportedPrefixes)
|
||||
String prefix = handleService.getPrefix();
|
||||
String handleResolver = ConfigurationManager.getProperty("handle.canonical.prefix");
|
||||
if (identifier == null)
|
||||
{
|
||||
if(identifier.startsWith(prefix))
|
||||
return false;
|
||||
}
|
||||
if (identifier.startsWith(prefix)
|
||||
|| identifier.startsWith(handleResolver)
|
||||
|| identifier.startsWith("http://hdl.handle.net/")
|
||||
|| identifier.startsWith("hdl:")
|
||||
|| identifier.startsWith("info:hdl"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
String outOfUrl = retrieveHandleOutOfUrl(identifier);
|
||||
if(outOfUrl != null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@@ -26,6 +26,7 @@ import java.io.IOException;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -44,8 +45,6 @@ public class VersionedHandleIdentifierProviderWithCanonicalHandles extends Ident
|
||||
|
||||
private static final char DOT = '.';
|
||||
|
||||
private String[] supportedPrefixes = new String[]{"info:hdl", "hdl", "http://"};
|
||||
|
||||
@Autowired(required = true)
|
||||
private VersioningService versionService;
|
||||
|
||||
@@ -67,23 +66,20 @@ public class VersionedHandleIdentifierProviderWithCanonicalHandles extends Ident
|
||||
@Override
|
||||
public boolean supports(String identifier)
|
||||
{
|
||||
for(String prefix : supportedPrefixes)
|
||||
String prefix = handleService.getPrefix();
|
||||
String handleResolver = ConfigurationManager.getProperty("handle.canonical.prefix");
|
||||
if (identifier == null)
|
||||
{
|
||||
if(identifier.startsWith(prefix))
|
||||
return false;
|
||||
}
|
||||
if (identifier.startsWith(prefix)
|
||||
|| identifier.startsWith(handleResolver)
|
||||
|| identifier.startsWith("http://hdl.handle.net/")
|
||||
|| identifier.startsWith("hdl:")
|
||||
|| identifier.startsWith("info:hdl"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
String outOfUrl = retrieveHandleOutOfUrl(identifier);
|
||||
if(outOfUrl != null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -106,18 +102,34 @@ public class VersionedHandleIdentifierProviderWithCanonicalHandles extends Ident
|
||||
// Modify Canonical: 12345/100 will point to the new item
|
||||
handleService.modifyHandleDSpaceObject(context, canonical, item);
|
||||
|
||||
// in case of first version we have to modify the previous metadata to be xxxx.1
|
||||
// we have to replace the canonical handle within the
|
||||
// metadata of the previous item
|
||||
|
||||
Version version = versionService.getVersion(context, item);
|
||||
Version previous;
|
||||
boolean isFirstVersion;
|
||||
String previousItemHandle = null;
|
||||
try {
|
||||
previous = versionHistoryService.getPrevious(context, history, version);
|
||||
isFirstVersion = versionHistoryService.isFirstVersion(context, history, previous);
|
||||
if (previous != null)
|
||||
{
|
||||
previousItemHandle = handleService.findHandle(context, previous.getItem());
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
throw new RuntimeException("A problem with the database connection occured.", ex);
|
||||
}
|
||||
if (isFirstVersion)
|
||||
if (previous != null)
|
||||
{
|
||||
// Check if our previous item doesn't have a handle anymore.
|
||||
// This occurs only when a switch has been made from
|
||||
// the standard handle identifier provider to the
|
||||
// versioned one, in this case no "versioned handle" is
|
||||
// reserved so we need to create one
|
||||
if (previousItemHandle == null)
|
||||
{
|
||||
previousItemHandle = makeIdentifierBasedOnHistory(context, previous.getItem(), canonical, history);
|
||||
}
|
||||
// remove the canonical handle from the metadata of the
|
||||
// previous item an add the versioned handle
|
||||
try{
|
||||
//If we have a reviewer he/she might not have the rights to edit the metadata of this item, so temporarly grant them.
|
||||
context.turnOffAuthorisationSystem();
|
||||
@@ -125,14 +137,6 @@ public class VersionedHandleIdentifierProviderWithCanonicalHandles extends Ident
|
||||
}finally {
|
||||
context.restoreAuthSystemState();
|
||||
}
|
||||
|
||||
}
|
||||
// Check if our previous item hasn't got a handle anymore.
|
||||
// This only occurs when a switch has been made from the standard handle identifier provider
|
||||
// to the versioned one, in this case no "versioned handle" is reserved so we need to create one
|
||||
if(previous != null && handleService.findHandle(context, previous.getItem()) == null){
|
||||
makeIdentifierBasedOnHistory(context, previous.getItem(), canonical, history);
|
||||
|
||||
}
|
||||
}
|
||||
populateHandleMetadata(context, item);
|
||||
@@ -351,7 +355,7 @@ public class VersionedHandleIdentifierProviderWithCanonicalHandles extends Ident
|
||||
|
||||
}
|
||||
|
||||
public static String retrieveHandleOutOfUrl(String url) throws SQLException
|
||||
public static String retrieveHandleOutOfUrl(String url)
|
||||
{
|
||||
// We can do nothing with this, return null
|
||||
if (!url.contains("/")) return null;
|
||||
@@ -489,9 +493,33 @@ public class VersionedHandleIdentifierProviderWithCanonicalHandles extends Ident
|
||||
protected void modifyHandleMetadata(Context context, Item item, String handle)
|
||||
throws SQLException, IOException, AuthorizeException
|
||||
{
|
||||
// we want to exchange the old handle against the new one. To do so, we
|
||||
// load all identifiers, clear the metadata field, re add all
|
||||
// identifiers which are not from type handle and add the new handle.
|
||||
String handleref = getCanonicalForm(handle);
|
||||
List<MetadataValue> identifiers = itemService.getMetadata(item, MetadataSchema.DC_SCHEMA, "identifier", "uri", Item.ANY);
|
||||
itemService.clearMetadata(context, item, MetadataSchema.DC_SCHEMA, "identifier", "uri", Item.ANY);
|
||||
for (MetadataValue identifier : identifiers)
|
||||
{
|
||||
if (this.supports(identifier.getValue()))
|
||||
{
|
||||
// ignore handles
|
||||
log.warn("Removing identifier " + identifier.getValue());
|
||||
continue;
|
||||
}
|
||||
log.warn("Preserving identifier " + identifier.getValue());
|
||||
itemService.addMetadata(context,
|
||||
item,
|
||||
identifier.getMetadataField(),
|
||||
identifier.getLanguage(),
|
||||
identifier.getValue(),
|
||||
identifier.getAuthority(),
|
||||
identifier.getConfidence());
|
||||
}
|
||||
if (!StringUtils.isEmpty(handleref))
|
||||
{
|
||||
itemService.addMetadata(context, item, MetadataSchema.DC_SCHEMA, "identifier", "uri", null, handleref);
|
||||
}
|
||||
itemService.update(context, item);
|
||||
}
|
||||
}
|
||||
|
@@ -118,7 +118,7 @@ public class InstallItemTest extends AbstractUnitTest
|
||||
public void testInstallItem_validHandle() throws Exception
|
||||
{
|
||||
context.turnOffAuthorisationSystem();
|
||||
String handle = "1345/567";
|
||||
String handle = "123456789/567";
|
||||
WorkspaceItem is = workspaceItemService.create(context, collection, false);
|
||||
|
||||
//Test assigning a specified handle to an item
|
||||
@@ -145,7 +145,7 @@ public class InstallItemTest extends AbstractUnitTest
|
||||
authorizeService.isAdmin((Context) any); result = true;
|
||||
}};
|
||||
|
||||
String handle = "1345/567";
|
||||
String handle = "123456789/567";
|
||||
WorkspaceItem is = workspaceItemService.create(context, collection, false);
|
||||
WorkspaceItem is2 = workspaceItemService.create(context, collection, false);
|
||||
|
||||
@@ -166,7 +166,7 @@ public class InstallItemTest extends AbstractUnitTest
|
||||
public void testRestoreItem() throws Exception
|
||||
{
|
||||
context.turnOffAuthorisationSystem();
|
||||
String handle = "1345/567";
|
||||
String handle = "123456789/567";
|
||||
WorkspaceItem is = workspaceItemService.create(context, collection, false);
|
||||
|
||||
//get current date
|
||||
@@ -236,7 +236,7 @@ public class InstallItemTest extends AbstractUnitTest
|
||||
{
|
||||
//create a dummy WorkspaceItem
|
||||
context.turnOffAuthorisationSystem();
|
||||
String handle = "1345/567";
|
||||
String handle = "123456789/567";
|
||||
WorkspaceItem is = workspaceItemService.create(context, collection, false);
|
||||
|
||||
// Set "today" as "dc.date.issued"
|
||||
@@ -267,7 +267,7 @@ public class InstallItemTest extends AbstractUnitTest
|
||||
{
|
||||
//create a dummy WorkspaceItem with no dc.date.issued
|
||||
context.turnOffAuthorisationSystem();
|
||||
String handle = "1345/567";
|
||||
String handle = "123456789/567";
|
||||
WorkspaceItem is = workspaceItemService.create(context, collection, false);
|
||||
|
||||
Item result = installItemService.installItem(context, is, handle);
|
||||
@@ -286,7 +286,7 @@ public class InstallItemTest extends AbstractUnitTest
|
||||
{
|
||||
//create a dummy WorkspaceItem
|
||||
context.turnOffAuthorisationSystem();
|
||||
String handle = "1345/567";
|
||||
String handle = "123456789/567";
|
||||
WorkspaceItem is = workspaceItemService.create(context, collection, false);
|
||||
|
||||
// Set "today" as "dc.date.issued"
|
||||
|
Reference in New Issue
Block a user