Revision 7507
Added by ben leinfelder about 11 years ago
MNodeService.java | ||
---|---|---|
28 | 28 |
import java.io.InputStream; |
29 | 29 |
import java.math.BigInteger; |
30 | 30 |
import java.security.NoSuchAlgorithmException; |
31 |
import java.sql.SQLException; |
|
32 | 31 |
import java.util.ArrayList; |
33 | 32 |
import java.util.Calendar; |
34 | 33 |
import java.util.Date; |
... | ... | |
97 | 96 |
import org.dataone.service.types.v1_1.QueryEngineList; |
98 | 97 |
import org.dataone.service.types.v1_1.QueryField; |
99 | 98 |
import org.dataone.service.util.Constants; |
99 |
import org.dataone.service.util.DateTimeMarshaller; |
|
100 | 100 |
|
101 | 101 |
import edu.ucsb.nceas.ezid.EZIDException; |
102 | 102 |
import edu.ucsb.nceas.ezid.EZIDService; |
103 |
import edu.ucsb.nceas.ezid.profile.DataCiteProfile; |
|
104 |
import edu.ucsb.nceas.ezid.profile.InternalProfile; |
|
103 | 105 |
import edu.ucsb.nceas.metacat.DBQuery; |
104 |
import edu.ucsb.nceas.metacat.DBUtil; |
|
105 | 106 |
import edu.ucsb.nceas.metacat.EventLog; |
106 | 107 |
import edu.ucsb.nceas.metacat.IdentifierManager; |
107 | 108 |
import edu.ucsb.nceas.metacat.McdbDocNotFoundException; |
... | ... | |
354 | 355 |
|
355 | 356 |
// log the update event |
356 | 357 |
EventLog.getInstance().log(request.getRemoteAddr(), request.getHeader("User-Agent"), subject.getValue(), localId, Event.UPDATE.toString()); |
358 |
|
|
359 |
// attempt to register the identifier - it checks if it is a doi |
|
360 |
try { |
|
361 |
registerDOI(sysmeta); |
|
362 |
} catch (EZIDException e) { |
|
363 |
throw new ServiceFailure("1190", "Could not register DOI: " + e.getMessage()); |
|
364 |
} |
|
357 | 365 |
|
358 | 366 |
} else { |
359 | 367 |
throw new NotAuthorized("1200", "The provided identity does not have " + "permission to UPDATE the object identified by " + pid.getValue() |
... | ... | |
397 | 405 |
"The supplied system metadata is invalid. " + |
398 | 406 |
"The obsoletedBy field cannot have a value when creating entries."); |
399 | 407 |
} |
400 |
|
|
401 | 408 |
|
402 | 409 |
// call the shared impl |
403 |
return super.create(session, pid, object, sysmeta); |
|
410 |
Identifier resultPid = super.create(session, pid, object, sysmeta); |
|
411 |
|
|
412 |
// attempt to register the identifier - it checks if it is a doi |
|
413 |
try { |
|
414 |
registerDOI(sysmeta); |
|
415 |
} catch (EZIDException e) { |
|
416 |
throw new ServiceFailure("1190", "Could not register DOI: " + e.getMessage()); |
|
417 |
} |
|
418 |
|
|
419 |
// return |
|
420 |
return resultPid ; |
|
404 | 421 |
} |
405 | 422 |
|
406 | 423 |
/** |
... | ... | |
1238 | 1255 |
String ezidPassword = null; |
1239 | 1256 |
boolean doiEnabled = false; |
1240 | 1257 |
try { |
1241 |
doiEnabled = new Boolean(PropertyService.getProperty("guid.enabled")).booleanValue(); |
|
1258 |
doiEnabled = new Boolean(PropertyService.getProperty("guid.ezid.enabled")).booleanValue();
|
|
1242 | 1259 |
shoulder = PropertyService.getProperty("guid.ezid.doishoulder.1"); |
1243 | 1260 |
ezidUsername = PropertyService.getProperty("guid.ezid.username"); |
1244 | 1261 |
ezidPassword = PropertyService.getProperty("guid.ezid.password"); |
... | ... | |
1251 | 1268 |
throw new InvalidRequest("2193", "DOI scheme is not enabled at this node."); |
1252 | 1269 |
} |
1253 | 1270 |
|
1254 |
// TODO: enter metadata about this identifier?
|
|
1271 |
// do not enter metadata about this identifier since we do not know anything about it
|
|
1255 | 1272 |
HashMap<String, String> metadata = null; |
1256 | 1273 |
try { |
1257 | 1274 |
// call the EZID service |
1258 |
EZIDService ezid = new EZIDService(); |
|
1275 |
String ezidServiceBaseUrl = null; |
|
1276 |
try { |
|
1277 |
ezidServiceBaseUrl = PropertyService.getProperty("guid.ezid.baseurl"); |
|
1278 |
} catch (PropertyNotFoundException e) { |
|
1279 |
logMetacat.warn("Using default EZID baseUrl"); |
|
1280 |
} |
|
1281 |
EZIDService ezid = new EZIDService(ezidServiceBaseUrl); |
|
1259 | 1282 |
ezid.login(ezidUsername, ezidPassword); |
1260 | 1283 |
String doi = null; |
1261 | 1284 |
// TODO: perhaps we want to use the identifier as given |
... | ... | |
1263 | 1286 |
if (!mintDoi) { |
1264 | 1287 |
doi = shoulder + identifier.getValue(); |
1265 | 1288 |
identifier.setValue(doi); |
1266 |
ezid.createIdentifier(identifier.getValue(), metadata); |
|
1289 |
doi = ezid.createIdentifier(identifier.getValue(), metadata);
|
|
1267 | 1290 |
} else { |
1268 | 1291 |
doi = ezid.mintIdentifier(shoulder, metadata); |
1269 | 1292 |
} |
... | ... | |
1272 | 1295 |
} catch (EZIDException e) { |
1273 | 1296 |
throw new ServiceFailure("2191", "Error registering DOI identifier: " + e.getMessage()); |
1274 | 1297 |
} |
1275 |
// TODO: track this identifier so we can complete the metadata when we finally get the object |
|
1276 | 1298 |
} else { |
1277 | 1299 |
// default if we don't know the scheme |
1278 | 1300 |
if (fragment != null) { |
... | ... | |
1286 | 1308 |
} |
1287 | 1309 |
} |
1288 | 1310 |
|
1289 |
|
|
1290 | 1311 |
// TODO: reserve the identifier with the CN. We can only do this when |
1291 | 1312 |
// 1) the MN is part of a CN cluster |
1292 | 1313 |
// 2) the request is from an authenticated user |
... | ... | |
1486 | 1507 |
} |
1487 | 1508 |
return null; |
1488 | 1509 |
} |
1510 |
|
|
1511 |
/** |
|
1512 |
* submits DOI metadata information about the object to EZID |
|
1513 |
* @param sysMeta |
|
1514 |
* @return |
|
1515 |
* @throws EZIDException |
|
1516 |
* @throws ServiceFailure |
|
1517 |
* @throws NotImplemented |
|
1518 |
*/ |
|
1519 |
private boolean registerDOI(SystemMetadata sysMeta) throws EZIDException, NotImplemented, ServiceFailure { |
|
1520 |
|
|
1521 |
// for DOIs |
|
1522 |
String ezidUsername = null; |
|
1523 |
String ezidPassword = null; |
|
1524 |
String shoulder = null; |
|
1525 |
boolean doiEnabled = false; |
|
1526 |
try { |
|
1527 |
doiEnabled = new Boolean(PropertyService.getProperty("guid.ezid.enabled")).booleanValue(); |
|
1528 |
shoulder = PropertyService.getProperty("guid.ezid.doishoulder.1"); |
|
1529 |
ezidUsername = PropertyService.getProperty("guid.ezid.username"); |
|
1530 |
ezidPassword = PropertyService.getProperty("guid.ezid.password"); |
|
1531 |
} catch (PropertyNotFoundException e) { |
|
1532 |
logMetacat.warn("DOI support is not configured at this node.", e); |
|
1533 |
return false; |
|
1534 |
} |
|
1535 |
|
|
1536 |
// only continue if we have the feature turned on |
|
1537 |
if (doiEnabled) { |
|
1538 |
|
|
1539 |
String identifier = sysMeta.getIdentifier().getValue(); |
|
1540 |
|
|
1541 |
// only continue if this DOI is in our configured shoulder |
|
1542 |
if (identifier.startsWith(shoulder)) { |
|
1543 |
|
|
1544 |
// enter metadata about this identifier |
|
1545 |
HashMap<String, String> metadata = null; |
|
1546 |
|
|
1547 |
// login to EZID service |
|
1548 |
String ezidServiceBaseUrl = null; |
|
1549 |
try { |
|
1550 |
ezidServiceBaseUrl = PropertyService.getProperty("guid.ezid.baseurl"); |
|
1551 |
} catch (PropertyNotFoundException e) { |
|
1552 |
logMetacat.warn("Using default EZID baseUrl"); |
|
1553 |
} |
|
1554 |
EZIDService ezid = new EZIDService(ezidServiceBaseUrl); |
|
1555 |
ezid.login(ezidUsername, ezidPassword); |
|
1556 |
|
|
1557 |
// check for existing metadata |
|
1558 |
boolean create = false; |
|
1559 |
metadata = ezid.getMetadata(identifier); |
|
1560 |
if (metadata == null) { |
|
1561 |
create = true; |
|
1562 |
metadata = new HashMap<String, String>(); |
|
1563 |
} |
|
1564 |
|
|
1565 |
// TODO: set values in the metadata with better values |
|
1566 |
Node node = getCapabilities(); |
|
1567 |
metadata.put(DataCiteProfile.TITLE.toString(), "TBD"); |
|
1568 |
metadata.put(DataCiteProfile.CREATOR.toString(), sysMeta.getRightsHolder().getValue()); |
|
1569 |
metadata.put(DataCiteProfile.PUBLISHER.toString(), node.getName()); |
|
1570 |
metadata.put(DataCiteProfile.PUBLICATION_YEAR.toString(), DateTimeMarshaller.serializeDateToUTC(sysMeta.getDateUploaded())); |
|
1571 |
metadata.put(InternalProfile.TARGET.toString(), node.getBaseURL() + "/v1/object/" + identifier); |
|
1572 |
metadata.put(InternalProfile.PROFILE.toString(), "datacite"); |
|
1573 |
|
|
1574 |
// set using the API |
|
1575 |
if (create) { |
|
1576 |
ezid.createIdentifier(identifier, metadata); |
|
1577 |
} else { |
|
1578 |
ezid.setMetadata(identifier, metadata); |
|
1579 |
} |
|
1580 |
|
|
1581 |
ezid.logout(); |
|
1582 |
} |
|
1583 |
|
|
1584 |
} |
|
1585 |
|
|
1586 |
return true; |
|
1587 |
} |
|
1489 | 1588 |
|
1490 | 1589 |
} |
Also available in: Unified diff
register DOIs with minimal DataCite metadata. still need to determine which details to include and when, but the plumbing is in place as we refine those rules. http://bugzilla.ecoinformatics.org/show_bug.cgi?id=5513