mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-18 15:33:09 +00:00
Add delete option. Delete DOI on command line
This commit is contained in:

committed by
Pascal-Nicolas Becker

parent
0251a02190
commit
7d68f9936a
@@ -73,7 +73,8 @@ public class DOIIdentifierProvider
|
|||||||
public static final Integer UPDATE_RESERVERED = 5;
|
public static final Integer UPDATE_RESERVERED = 5;
|
||||||
public static final Integer UPDATE_REGISTERED = 6;
|
public static final Integer UPDATE_REGISTERED = 6;
|
||||||
public static final Integer UPDATE_BEFORE_REGISTERATION = 7;
|
public static final Integer UPDATE_BEFORE_REGISTERATION = 7;
|
||||||
public static final Integer DELETED = 8;
|
public static final Integer TO_BE_DELETED = 8;
|
||||||
|
public static final Integer DELETED = 9;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prefix of DOI namespace. Set in dspace.cfg.
|
* Prefix of DOI namespace. Set in dspace.cfg.
|
||||||
@@ -197,6 +198,7 @@ public class DOIIdentifierProvider
|
|||||||
doiRow.setColumn("status", TO_BE_REGISTERED);
|
doiRow.setColumn("status", TO_BE_REGISTERED);
|
||||||
try {
|
try {
|
||||||
DatabaseManager.update(context, doiRow);
|
DatabaseManager.update(context, doiRow);
|
||||||
|
context.commit();
|
||||||
}
|
}
|
||||||
catch (SQLException sqle)
|
catch (SQLException sqle)
|
||||||
{
|
{
|
||||||
@@ -581,11 +583,11 @@ public class DOIIdentifierProvider
|
|||||||
{
|
{
|
||||||
String doi = DOI.formatIdentifier(identifier);
|
String doi = DOI.formatIdentifier(identifier);
|
||||||
TableRow doiRow = null;
|
TableRow doiRow = null;
|
||||||
String oldStatus = null;
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
doiRow = DatabaseManager.findByUnique(context, "Doi", "doi", doi.substring(DOI.SCHEME.length()));
|
doiRow = DatabaseManager.findByUnique(context, "Doi", "doi",
|
||||||
|
doi.substring(DOI.SCHEME.length()));
|
||||||
}
|
}
|
||||||
catch (SQLException sqle)
|
catch (SQLException sqle)
|
||||||
{
|
{
|
||||||
@@ -626,6 +628,51 @@ public class DOIIdentifierProvider
|
|||||||
// change doi status in db if necessary.
|
// change doi status in db if necessary.
|
||||||
if (null != doiRow)
|
if (null != doiRow)
|
||||||
{
|
{
|
||||||
|
doiRow.setColumn("status", TO_BE_DELETED);
|
||||||
|
try {
|
||||||
|
DatabaseManager.update(context, doiRow);
|
||||||
|
context.commit();
|
||||||
|
}
|
||||||
|
catch (SQLException sqle)
|
||||||
|
{
|
||||||
|
log.warn("SQLException while changing status of DOI {} to be deleted.", doi);
|
||||||
|
throw new RuntimeException(sqle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DOI is a permanent identifier. DataCite for example does not delete
|
||||||
|
// DOIS. But it is possible to mark a DOI as "inactive".
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteOnline(Context context, String identifier)
|
||||||
|
throws DOIIdentifierException
|
||||||
|
{
|
||||||
|
String doi = DOI.formatIdentifier(identifier);
|
||||||
|
TableRow doiRow = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
doiRow = DatabaseManager.findByUnique(context, "Doi", "doi",
|
||||||
|
doi.substring(DOI.SCHEME.length()));
|
||||||
|
}
|
||||||
|
catch (SQLException sqle)
|
||||||
|
{
|
||||||
|
throw new RuntimeException(sqle);
|
||||||
|
}
|
||||||
|
if(null == doiRow)
|
||||||
|
{
|
||||||
|
throw new DOIIdentifierException("This identifier: " + identifier
|
||||||
|
+ " isn't in our database",
|
||||||
|
DOIIdentifierException.DOI_DOES_NOT_EXIST);
|
||||||
|
}
|
||||||
|
if (TO_BE_DELETED != doiRow.getIntColumn("status"))
|
||||||
|
{
|
||||||
|
log.error("This identifier: {} couldn't be deleted",
|
||||||
|
DOI.SCHEME + doiRow.getStringColumn("doi"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
connector.deleteDOI(context, doi);
|
||||||
|
|
||||||
doiRow.setColumn("status", DELETED);
|
doiRow.setColumn("status", DELETED);
|
||||||
try {
|
try {
|
||||||
DatabaseManager.update(context, doiRow);
|
DatabaseManager.update(context, doiRow);
|
||||||
@@ -633,16 +680,10 @@ public class DOIIdentifierProvider
|
|||||||
}
|
}
|
||||||
catch (SQLException sqle)
|
catch (SQLException sqle)
|
||||||
{
|
{
|
||||||
log.warn("SQLException while changing status of DOI {} to be registered.", doi);
|
log.warn("SQLException while changing status of DOI {} deleted.", doi);
|
||||||
throw new RuntimeException(sqle);
|
throw new RuntimeException(sqle);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// DOI is a permanent identifier. DataCite for example does not delete
|
|
||||||
// DOIS. But it is possible to mark a DOI as "inactive".
|
|
||||||
connector.deleteDOI(context, doi);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a DSpaceObject depending on its DOI.
|
* Returns a DSpaceObject depending on its DOI.
|
||||||
@@ -684,7 +725,7 @@ public class DOIIdentifierProvider
|
|||||||
* Search the database for a DOI, using the type and id of an DSpaceObject.
|
* Search the database for a DOI, using the type and id of an DSpaceObject.
|
||||||
*
|
*
|
||||||
* @param context
|
* @param context
|
||||||
* @param dso DSpaceObject to find doi for. DOIs with status DELETED will be
|
* @param dso DSpaceObject to find doi for. DOIs with status TO_BE_DELETED will be
|
||||||
* ignored.
|
* ignored.
|
||||||
* @return The DOI as String or null if DOI was not found.
|
* @return The DOI as String or null if DOI was not found.
|
||||||
* @throws SQLException
|
* @throws SQLException
|
||||||
@@ -693,10 +734,11 @@ public class DOIIdentifierProvider
|
|||||||
throws SQLException
|
throws SQLException
|
||||||
{
|
{
|
||||||
String sql = "SELECT * FROM Doi WHERE resource_type_id = ? " +
|
String sql = "SELECT * FROM Doi WHERE resource_type_id = ? " +
|
||||||
"AND resource_id = ? AND status != ?";
|
"AND resource_id = ? AND (status != ? OR status != ?)";
|
||||||
|
|
||||||
TableRow doiRow = DatabaseManager.querySingleTable(context,
|
TableRow doiRow = DatabaseManager.querySingleTable(context, "Doi", sql,
|
||||||
"Doi", sql, dso.getType(), dso.getID(), DOIIdentifierProvider.DELETED);
|
dso.getType(), dso.getID(), DOIIdentifierProvider.TO_BE_DELETED,
|
||||||
|
DOIIdentifierProvider.DELETED);
|
||||||
if (null == doiRow)
|
if (null == doiRow)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
|
@@ -135,6 +135,14 @@ public class DOIOrganiser {
|
|||||||
|
|
||||||
options.addOption(update);
|
options.addOption(update);
|
||||||
|
|
||||||
|
Option delete = OptionBuilder.withArgName("DOI identifier")
|
||||||
|
.withLongOpt("delete")
|
||||||
|
.hasArgs(1)
|
||||||
|
.withDescription("Delete a specified identifier.")
|
||||||
|
.create('d');
|
||||||
|
|
||||||
|
options.addOption(delete);
|
||||||
|
|
||||||
|
|
||||||
// initialize parser
|
// initialize parser
|
||||||
CommandLineParser parser = new PosixParser();
|
CommandLineParser parser = new PosixParser();
|
||||||
@@ -337,6 +345,35 @@ public class DOIOrganiser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(line.hasOption('d'))
|
||||||
|
{
|
||||||
|
String identifier = line.getOptionValue('d');
|
||||||
|
|
||||||
|
if (null == identifier)
|
||||||
|
{
|
||||||
|
helpformater.printHelp("\nDOI organiser\n", options);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
try {
|
||||||
|
TableRow doiRow = organiser.findTableRow(identifier);
|
||||||
|
DSpaceObject dso = DSpaceObject.find(
|
||||||
|
context,
|
||||||
|
doiRow.getIntColumn("resource_type_id"),
|
||||||
|
doiRow.getIntColumn("resource_id"));
|
||||||
|
organiser.delete(doiRow, dso);
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
LOG.error(ex);
|
||||||
|
} catch (IllegalArgumentException ex) {
|
||||||
|
LOG.error(ex);
|
||||||
|
} catch (IllegalStateException ex) {
|
||||||
|
LOG.error(ex);
|
||||||
|
} catch (IdentifierException ex) {
|
||||||
|
LOG.error(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -608,6 +645,54 @@ public class DOIOrganiser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void delete(TableRow doiRow, DSpaceObject dso)
|
||||||
|
{
|
||||||
|
if(null == doiRow)
|
||||||
|
{
|
||||||
|
if (!quiet)
|
||||||
|
{
|
||||||
|
System.err.println("The DOI identifier that should be deleted doesn't exist.");
|
||||||
|
}
|
||||||
|
LOG.error("The DOI identifier that should be deleted doesn't exist.");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
provider.deleteOnline(context, doiRow.getStringColumn("doi"));
|
||||||
|
|
||||||
|
if(!quiet)
|
||||||
|
{
|
||||||
|
System.out.println("This identifier : "
|
||||||
|
+ DOI.SCHEME + doiRow.getStringColumn("doi")
|
||||||
|
+ " is successfully delete.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (DOIIdentifierException ex)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
sendAlertMail("Delete", dso,
|
||||||
|
DOI.SCHEME + doiRow.getStringColumn("doi"),
|
||||||
|
ex.codeToString(ex.getCode()));
|
||||||
|
}
|
||||||
|
catch (IOException ioe)
|
||||||
|
{
|
||||||
|
LOG.error("Couldn't send mail", ioe);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG.error("It wasn't possible to delete the identifier online. "
|
||||||
|
+ " Exceptions code: "
|
||||||
|
+ ex.codeToString(ex.getCode()), ex);
|
||||||
|
|
||||||
|
if(!quiet)
|
||||||
|
{
|
||||||
|
System.err.println("It wasn't possible to delete this identifier: "
|
||||||
|
+ DOI.SCHEME + doiRow.getStringColumn("doi"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds the TableRow in the Doi table that belongs to the specified
|
* Finds the TableRow in the Doi table that belongs to the specified
|
||||||
* DspaceObject.
|
* DspaceObject.
|
||||||
@@ -665,6 +750,29 @@ public class DOIOrganiser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// detect handle
|
||||||
|
DSpaceObject dso = HandleManager.resolveToObject(context, identifier);
|
||||||
|
|
||||||
|
if (null != dso)
|
||||||
|
{
|
||||||
|
if (dso.getType() != Constants.ITEM)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Currently DSpace supports DOIs for Items only. "
|
||||||
|
+ "Cannot process specified handle as it does not identify an Item.");
|
||||||
|
}
|
||||||
|
|
||||||
|
doiRow = DatabaseManager.querySingleTable(context, "Doi", sql,
|
||||||
|
Constants.ITEM, dso.getID());
|
||||||
|
|
||||||
|
if (null == doiRow)
|
||||||
|
{
|
||||||
|
doi = provider.mint(context, dso);
|
||||||
|
doiRow = DatabaseManager.findByUnique(context, "Doi", "doi",
|
||||||
|
doi.substring(DOI.SCHEME.length()));
|
||||||
|
}
|
||||||
|
return doiRow;
|
||||||
|
}
|
||||||
// detect DOI
|
// detect DOI
|
||||||
try {
|
try {
|
||||||
doi = DOI.formatIdentifier(identifier);
|
doi = DOI.formatIdentifier(identifier);
|
||||||
@@ -676,37 +784,25 @@ public class DOIOrganiser {
|
|||||||
throw new IllegalStateException("You specified a valid DOI,"
|
throw new IllegalStateException("You specified a valid DOI,"
|
||||||
+ " that is not stored in our database.");
|
+ " that is not stored in our database.");
|
||||||
}
|
}
|
||||||
return doiRow;
|
|
||||||
}
|
}
|
||||||
catch (DOIIdentifierException ex)
|
catch (DOIIdentifierException ex)
|
||||||
{
|
{
|
||||||
// Identifier was not recognized as DOI => must be a handle.
|
// Identifier was not recognized as DOI.
|
||||||
// Will check for handle outside try-catch-block...
|
LOG.error("It wasn't possible to detect this identifier: "
|
||||||
|
+ identifier
|
||||||
|
+ " Exceptions code: "
|
||||||
|
+ ex.codeToString(ex.getCode()), ex);
|
||||||
|
|
||||||
|
if(!quiet)
|
||||||
|
{
|
||||||
|
System.err.println("It wasn't possible to detect this identifier: "
|
||||||
|
+ DOI.SCHEME + doiRow.getStringColumn("doi"));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// detect handle
|
|
||||||
DSpaceObject dso = HandleManager.resolveToObject(context, identifier);
|
|
||||||
|
|
||||||
if (dso.getType() != Constants.ITEM)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Currently DSpace supports DOIs for Items only. "
|
|
||||||
+ "Cannot process specified handle as it does not identify an Item.");
|
|
||||||
}
|
|
||||||
doiRow = DatabaseManager.querySingleTable(context, "Doi", sql,
|
|
||||||
Constants.ITEM, dso.getID());
|
|
||||||
|
|
||||||
if (null == doiRow)
|
|
||||||
{
|
|
||||||
doi = provider.mint(context, dso);
|
|
||||||
doiRow = DatabaseManager.findByUnique(context, "Doi", "doi",
|
|
||||||
doi.substring(DOI.SCHEME.length()));
|
|
||||||
|
|
||||||
return doiRow;
|
|
||||||
}
|
|
||||||
return doiRow;
|
return doiRow;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendAlertMail(String action, DSpaceObject dso, String doi, String reason)
|
private void sendAlertMail(String action, DSpaceObject dso, String doi, String reason)
|
||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user