Revision 6068
Added by rnahf over 13 years ago
src/edu/ucsb/nceas/metacat/dataone/CrudService.java | ||
---|---|---|
255 | 255 |
* @param token an authtoken with appropriate permissions to read all |
256 | 256 |
* documents in the object store. To work correctly, this should probably |
257 | 257 |
* be an adminstrative credential. |
258 |
* @throws SQLException |
|
259 |
* @throws AccessionNumberException |
|
260 |
* @throws NoSuchAlgorithmException |
|
261 |
* @throws InvalidRequest |
|
262 |
* @throws NotImplemented |
|
263 |
* @throws NotFound |
|
264 |
* @throws NotAuthorized |
|
265 |
* @throws InvalidToken |
|
266 |
* @throws PropertyNotFoundException |
|
267 |
* @throws McdbDocNotFoundException |
|
268 |
* @throws ServiceFailure |
|
258 | 269 |
*/ |
259 |
public void generateMissingSystemMetadata(AuthToken token) { |
|
270 |
public void generateMissingSystemMetadata(AuthToken token) |
|
271 |
throws ServiceFailure, McdbDocNotFoundException, PropertyNotFoundException, InvalidToken, NotAuthorized, |
|
272 |
NotFound, NotImplemented, InvalidRequest, NoSuchAlgorithmException, AccessionNumberException, SQLException |
|
273 |
{ |
|
260 | 274 |
IdentifierManager im = IdentifierManager.getInstance(); |
261 | 275 |
//get the list of ids with no SM |
262 | 276 |
List<String> idList = im.getLocalIdsWithNoSystemMetadata(); |
... | ... | |
276 | 290 |
* documents in the object store. To work correctly, this should |
277 | 291 |
* be an adminstrative credential. |
278 | 292 |
* @param localId the identifier of the object to be processed |
293 |
* @throws ServiceFailure |
|
294 |
* @throws SQLException |
|
295 |
* @throws AccessionNumberException |
|
296 |
* @throws NoSuchAlgorithmException |
|
297 |
* @throws InvalidRequest |
|
298 |
* @throws NotImplemented |
|
299 |
* @throws NotFound |
|
300 |
* @throws NotAuthorized |
|
301 |
* @throws InvalidToken |
|
302 |
* @throws PropertyNotFoundException |
|
303 |
* @throws McdbDocNotFoundException |
|
279 | 304 |
*/ |
280 |
public void generateMissingSystemMetadata(AuthToken token, String localId) { |
|
281 |
|
|
282 |
logCrud.debug("CrudService.generateMissingSystemMetadata() called."); |
|
283 |
|
|
305 |
public void generateMissingSystemMetadata(AuthToken token, String localId) |
|
306 |
throws ServiceFailure, McdbDocNotFoundException, PropertyNotFoundException, InvalidToken, NotAuthorized, |
|
307 |
NotFound, NotImplemented, InvalidRequest, NoSuchAlgorithmException, AccessionNumberException, SQLException |
|
308 |
{ |
|
309 |
logCrud.debug("CrudService.generateMissingSystemMetadata() called."); |
|
284 | 310 |
logCrud.debug("Creating SystemMetadata for localId " + localId); |
311 |
SystemMetadata sm = null; |
|
312 |
|
|
313 |
//generate required system metadata fields from the document |
|
285 | 314 |
try { |
286 |
//generate required system metadata fields from the document |
|
287 |
SystemMetadata sm = createSystemMetadata(localId, token); |
|
288 |
|
|
289 |
//insert the systemmetadata object |
|
290 |
SessionData sessionData = getSessionData(token); |
|
291 |
String smlocalid = insertSystemMetadata(sm, sessionData); |
|
292 |
logCrud.debug("setting access on SM doc with localid " + smlocalid); |
|
293 |
handler.setAccess(metacatUrl, sessionData.getUserName(), smlocalid, "public", "4", "allow", "allowFirst"); |
|
315 |
sm = createSystemMetadata(localId, token); |
|
316 |
} catch (IOException e1) { |
|
317 |
e1.printStackTrace(); |
|
318 |
ServiceFailure sf = new ServiceFailure("00","IOException in generateMissingSystemMetadata: " + |
|
319 |
e1.getMessage()); |
|
320 |
sf.setStackTrace(e1.getStackTrace()); |
|
321 |
throw sf; |
|
322 |
} |
|
323 |
|
|
324 |
//insert the systemmetadata object |
|
325 |
SessionData sessionData = getSessionData(token); |
|
326 |
String smlocalid = insertSystemMetadata(sm, sessionData); |
|
327 |
logCrud.debug("setting access on SM doc with localid " + smlocalid); |
|
328 |
try { |
|
329 |
handler.setAccess(metacatUrl, sessionData.getUserName(), smlocalid, "public", "4", "allow", "allowFirst"); |
|
330 |
} catch (Exception e) { |
|
331 |
logCrud.debug("Unspecified exception thrown by MetacatHandler.setAccess(): " + e.getMessage()); |
|
332 |
logMetacat.error("Could not generate missing systemMetadata: " + e.getMessage()); |
|
333 |
logMetacat.error(e.getStackTrace()); |
|
334 |
ServiceFailure sf = new ServiceFailure("0","Unspecified exception thrown by MetacatHandler.setAccess(): " + e.getMessage()); |
|
335 |
sf.setStackTrace(e.getStackTrace()); |
|
336 |
throw sf; |
|
337 |
} |
|
294 | 338 |
|
295 |
String username = "public"; |
|
296 |
if (sessionData != null) { |
|
297 |
username = sessionData.getUserName(); |
|
298 |
} |
|
299 |
EventLog.getInstance().log(metacatUrl, username, localId, "generateMissingSystemMetadata"); |
|
300 |
} catch (Exception e) { // TODO: Please don't catch Exception -- it masks bad things |
|
301 |
e.printStackTrace(); |
|
302 |
logCrud.debug("Exception generating missing system metadata: " + e.getMessage()); |
|
303 |
logMetacat.error("Could not generate missing system metadata: " + e.getMessage()); |
|
339 |
String username = "public"; |
|
340 |
if (sessionData != null) { |
|
341 |
username = sessionData.getUserName(); |
|
304 | 342 |
} |
343 |
EventLog.getInstance().log(metacatUrl, username, localId, "generateMissingSystemMetadata"); |
|
344 |
|
|
345 |
// catch (Exception e) { // TODO: Please don't catch Exception -- it masks bad things |
|
346 |
// e.printStackTrace(); |
|
347 |
// logCrud.debug("Exception generating missing system metadata: " + e.getMessage()); |
|
348 |
// logMetacat.error("Could not generate missing system metadata: " + e.getMessage()); |
|
349 |
// } |
|
305 | 350 |
logCrud.info("generateMissingSystemMetadata(token, localId)"); |
306 | 351 |
} |
307 | 352 |
|
... | ... | |
426 | 471 |
throws InvalidToken, ServiceFailure, NotAuthorized, IdentifierNotUnique, |
427 | 472 |
UnsupportedType, InsufficientResources, NotFound, InvalidSystemMetadata, |
428 | 473 |
NotImplemented { |
429 |
try
|
|
430 |
{
|
|
431 |
SessionData sessionData = getSessionData(token);
|
|
474 |
try
|
|
475 |
{
|
|
476 |
SessionData sessionData = getSessionData(token);
|
|
432 | 477 |
|
433 | 478 |
//find the old systemmetadata (sm.old) document id (the one linked to obsoletedGuid) |
434 | 479 |
SystemMetadata sm = getSystemMetadata(token, obsoletedGuid); |
... | ... | |
469 | 514 |
":D1SYSMETADATA:"+ sysMetaLocalId + ":"); |
470 | 515 |
return guid; |
471 | 516 |
} |
472 |
catch(Exception e) |
|
473 |
{
|
|
517 |
|
|
518 |
catch(IOException e) {
|
|
474 | 519 |
throw new ServiceFailure("1310", "Error updating document in CrudService: " + e.getMessage()); |
475 | 520 |
} |
521 |
catch( McdbDocNotFoundException e) { |
|
522 |
throw new ServiceFailure("1310", "Error updating document in CrudService: " + e.getMessage()); |
|
523 |
} |
|
524 |
catch( InvalidRequest e) { |
|
525 |
throw new ServiceFailure("1310", "Error updating document in CrudService: " + e.getMessage()); |
|
526 |
} |
|
476 | 527 |
} |
477 | 528 |
|
478 | 529 |
/** |
... | ... | |
1650 | 1701 |
} |
1651 | 1702 |
catch(Exception e) |
1652 | 1703 |
{ |
1653 |
throw new ServiceFailure("1030", "Error updating system metadata: " + e.getMessage()); |
|
1704 |
throw new ServiceFailure("1030", "Error updating system metadata: " + e.getClass() + ": " + e.getMessage());
|
|
1654 | 1705 |
} |
1655 | 1706 |
} |
1656 | 1707 |
|
... | ... | |
1976 | 2027 |
* @throws IOException |
1977 | 2028 |
* @throws NoSuchAlgorithmException |
1978 | 2029 |
* @throws PropertyNotFoundException |
2030 |
* @throws NotImplemented |
|
2031 |
* @throws NotFound |
|
2032 |
* @throws NotAuthorized |
|
2033 |
* @throws InvalidToken |
|
2034 |
* @throws InvalidRequest |
|
2035 |
* @throws NoSuchAlgorithmException |
|
1979 | 2036 |
*/ |
1980 | 2037 |
private SystemMetadata createSystemMetadata(String localId, AuthToken token) |
1981 |
throws McdbDocNotFoundException, NumberFormatException, AccessionNumberException, |
|
1982 |
SQLException, NoSuchAlgorithmException, IOException, PropertyNotFoundException, BaseException { |
|
1983 |
|
|
1984 |
logCrud.debug("CrudService.createSystemMetadata() called."); |
|
1985 |
|
|
1986 |
IdentifierManager im = IdentifierManager.getInstance(); |
|
1987 |
Hashtable<String, Object> docInfo = im.getDocumentInfo(localId); |
|
2038 |
throws McdbDocNotFoundException, PropertyNotFoundException, AccessionNumberException, SQLException, |
|
2039 |
ServiceFailure, InvalidToken, NotAuthorized, NotFound, NotImplemented, InvalidRequest, |
|
2040 |
IOException, NoSuchAlgorithmException |
|
2041 |
{ |
|
2042 |
logCrud.debug("CrudService.createSystemMetadata() called."); |
|
1988 | 2043 |
|
1989 |
//get the document text |
|
1990 |
int rev = im.getLatestRevForLocalId(localId); |
|
1991 |
Identifier identifier = new Identifier(); |
|
1992 |
try { |
|
1993 |
identifier.setValue(im.getGUID(localId, rev)); |
|
1994 |
|
|
1995 |
} catch (McdbDocNotFoundException mcdbe) { |
|
1996 |
//we're creating a new SM doc for a doc that is not in the identifier table |
|
1997 |
//so we need to add it to |
|
1998 |
logCrud.debug("No guid in the identifier table. adding it for " + localId); |
|
1999 |
im.createMapping(localId, localId); |
|
2000 |
logCrud.debug("Mapping created for " + localId); |
|
2001 |
AccessionNumber accNum = new AccessionNumber(localId, "NONE"); |
|
2002 |
identifier.setValue(im.getGUID(accNum.getDocid(), rev)); |
|
2003 |
} |
|
2044 |
IdentifierManager im = IdentifierManager.getInstance(); |
|
2045 |
Hashtable<String, Object> docInfo = im.getDocumentInfo(localId); |
|
2004 | 2046 |
|
2005 |
logCrud.debug("Creating system metadata for guid " + identifier.getValue()); |
|
2006 |
InputStream is = this.get(token, identifier); |
|
2007 |
SystemMetadata sm = new SystemMetadata(); |
|
2008 |
|
|
2009 |
//set the id |
|
2010 |
sm.setIdentifier(identifier); |
|
2047 |
//get the document text |
|
2048 |
int rev = im.getLatestRevForLocalId(localId); |
|
2049 |
Identifier identifier = new Identifier(); |
|
2050 |
try { |
|
2051 |
identifier.setValue(im.getGUID(localId, rev)); |
|
2011 | 2052 |
|
2012 |
//set the default object format |
|
2013 |
String doctype = (String) docInfo.get("doctype"); |
|
2014 |
ObjectFormat format = ObjectFormat.convert(doctype); |
|
2015 |
if (format == null) { |
|
2016 |
if (doctype.trim().equals("BIN")) { |
|
2017 |
format = ObjectFormat.OCTET_STREAM; |
|
2018 |
} else { |
|
2019 |
format = ObjectFormat.convert("text/plain"); |
|
2020 |
} |
|
2021 |
} |
|
2022 |
sm.setObjectFormat(format); |
|
2023 |
logCrud.debug("The ObjectFormat for " + localId + " is " + format.toString()); |
|
2024 |
|
|
2025 |
// further parse EML documents to get data object format, |
|
2026 |
// describes and describedBy information |
|
2027 |
if ( format == ObjectFormat.EML_2_0_0 || |
|
2028 |
format == ObjectFormat.EML_2_0_1 || |
|
2029 |
format == ObjectFormat.EML_2_1_0 ) { |
|
2030 |
|
|
2031 |
try { |
|
2032 |
DataoneEMLParser emlParser = DataoneEMLParser.getInstance(); |
|
2033 |
EMLDocument emlDocument = emlParser.parseDocument(is); |
|
2034 |
|
|
2035 |
// iterate through the data objects in the EML doc and add sysmeta |
|
2036 |
logCrud.debug("The number of data entities is: " + |
|
2037 |
emlDocument.distributionMetadata.size()); |
|
2038 |
|
|
2039 |
for( int j = 0; j < emlDocument.distributionMetadata.size(); j++ ) { |
|
2040 |
|
|
2041 |
DistributionMetadata distMetadata = |
|
2042 |
emlDocument.distributionMetadata.elementAt(j); |
|
2043 |
String dataDocUrl = distMetadata.url; |
|
2044 |
String dataDocMimeType = distMetadata.mimeType; |
|
2045 |
String dataDocLocalId = ""; |
|
2046 |
logCrud.debug("\tData local ID: " + dataDocLocalId); |
|
2047 |
logCrud.debug("\tData URL: " + dataDocUrl); |
|
2048 |
logCrud.debug("\tData mime: " + dataDocMimeType); |
|
2049 |
|
|
2050 |
//we only handle ecogrid urls right now |
|
2051 |
if ( dataDocUrl.trim().startsWith("ecogrid://knb/") ) { |
|
2052 |
dataDocLocalId = |
|
2053 |
dataDocUrl.substring(dataDocUrl.indexOf("ecogrid://knb/") + |
|
2054 |
"ecogrid://knb/".length(), dataDocUrl.length()); |
|
2055 |
|
|
2056 |
//set the id |
|
2057 |
Identifier dataDocId = new Identifier(); |
|
2058 |
dataDocId.setValue(dataDocLocalId); |
|
2059 |
|
|
2060 |
// add describes into EML system metadata |
|
2061 |
sm.addDescribe(dataDocId); |
|
2062 |
|
|
2063 |
SystemMetadata dataSysMeta = new SystemMetadata(); |
|
2064 |
// check if data system metadata exists |
|
2065 |
try { |
|
2066 |
logCrud.debug("Checking for existing system metadata for " + dataDocId.getValue()); |
|
2067 |
dataSysMeta = this.getSystemMetadata(token, dataDocId); |
|
2068 |
// add describedBy sysmeta |
|
2069 |
logCrud.debug("Setting describedBy for " + dataDocId.getValue() + |
|
2070 |
" to " + identifier.getValue()); |
|
2071 |
dataSysMeta.addDescribedBy(identifier); |
|
2072 |
dataSysMeta.setObjectFormat(ObjectFormat.convert(dataDocMimeType)); |
|
2073 |
this.updateSystemMetadata(dataSysMeta, getSessionData(token)); |
|
2074 |
|
|
2075 |
} catch ( NotFound nf ) { |
|
2076 |
// System metadata for data doesn't exist |
|
2077 |
logCrud.debug("There was not an existing system metadata " + "document for " + dataDocId.getValue()); |
|
2078 |
try { |
|
2079 |
logCrud.debug("Creating a system metadata " + "document for " + dataDocId.getValue()); |
|
2080 |
dataSysMeta = this.createSystemMetadata(dataDocLocalId, token); |
|
2081 |
|
|
2082 |
logCrud.debug("Setting describedBy for " + dataDocId.getValue() + " to " + identifier.getValue()); |
|
2083 |
dataSysMeta.addDescribedBy(identifier); |
|
2084 |
|
|
2085 |
logCrud.debug("Setting mimeType for " + dataDocId.getValue() + " to " + dataDocMimeType); |
|
2086 |
dataSysMeta.setObjectFormat(ObjectFormat.convert(dataDocMimeType)); |
|
2087 |
|
|
2088 |
logCrud.debug("Updating system metadata for " + dataDocId.getValue() + " to " + dataDocMimeType); |
|
2089 |
this.updateSystemMetadata(dataSysMeta, getSessionData(token)); |
|
2090 |
|
|
2091 |
} catch ( McdbDocNotFoundException mdnf) { |
|
2092 |
mdnf.printStackTrace(); |
|
2093 |
throw mdnf; |
|
2094 |
} catch ( NumberFormatException nfe) { |
|
2095 |
nfe.printStackTrace(); |
|
2096 |
throw nfe; |
|
2097 |
} catch ( AccessionNumberException ane) { |
|
2098 |
ane.printStackTrace(); |
|
2099 |
throw ane; |
|
2100 |
} catch ( SQLException sqle) { |
|
2101 |
sqle.printStackTrace(); |
|
2102 |
throw sqle; |
|
2103 |
} catch ( NoSuchAlgorithmException nsae) { |
|
2104 |
nsae.printStackTrace(); |
|
2105 |
throw nsae; |
|
2106 |
} catch ( IOException ioe) { |
|
2107 |
ioe.printStackTrace(); |
|
2108 |
throw ioe; |
|
2109 |
} catch ( PropertyNotFoundException pnfe) { |
|
2110 |
pnfe.printStackTrace(); |
|
2111 |
throw pnfe; |
|
2112 |
} catch ( BaseException be) { |
|
2113 |
be.printStackTrace(); |
|
2114 |
throw be; |
|
2115 |
|
|
2116 |
} |
|
2117 |
|
|
2118 |
} |
|
2119 |
|
|
2120 |
} // end if() |
|
2121 |
|
|
2122 |
} // end for() |
|
2123 |
|
|
2124 |
} catch ( ParserConfigurationException pce ) { |
|
2125 |
logCrud.debug("There was a problem parsing the EML document. " + |
|
2126 |
"The error message was: " + pce.getMessage()); |
|
2127 |
|
|
2128 |
} catch ( SAXException saxe ) { |
|
2129 |
logCrud.debug("There was a problem traversing the EML document. " + |
|
2130 |
"The error message was: " + saxe.getMessage()); |
|
2131 |
|
|
2132 |
} catch ( XPathExpressionException xpee ) { |
|
2133 |
logCrud.debug("There was a problem searching the EML document. " + |
|
2134 |
"The error message was: " + xpee.getMessage()); |
|
2135 |
} // end try |
|
2136 |
|
|
2137 |
} // end if() |
|
2138 |
|
|
2139 |
//create the checksum |
|
2140 |
is = this.get(token, identifier); |
|
2141 |
String checksumS = checksum(is); |
|
2142 |
ChecksumAlgorithm ca = ChecksumAlgorithm.convert("MD5"); |
|
2143 |
Checksum checksum = new Checksum(); |
|
2144 |
checksum.setValue(checksumS); |
|
2145 |
checksum.setAlgorithm(ca); |
|
2146 |
sm.setChecksum(checksum); |
|
2053 |
} catch (McdbDocNotFoundException mcdbe) { |
|
2054 |
//we're creating a new SM doc for a doc that is not in the identifier table |
|
2055 |
//so we need to add it to |
|
2056 |
logCrud.debug("No guid in the identifier table. adding it for " + localId); |
|
2057 |
im.createMapping(localId, localId); |
|
2058 |
logCrud.debug("Mapping created for " + localId); |
|
2059 |
AccessionNumber accNum = new AccessionNumber(localId, "NONE"); |
|
2060 |
identifier.setValue(im.getGUID(accNum.getDocid(), rev)); |
|
2061 |
} |
|
2147 | 2062 |
|
2148 |
//set the size
|
|
2149 |
is = this.get(token, identifier);
|
|
2150 |
sm.setSize(sizeOfStream(is));
|
|
2063 |
logCrud.debug("Creating system metadata for guid " + identifier.getValue());
|
|
2064 |
InputStream is = this.get(token, identifier);
|
|
2065 |
SystemMetadata sm = new SystemMetadata();
|
|
2151 | 2066 |
|
2152 |
//submitter |
|
2153 |
Principal p = new Principal(); |
|
2154 |
p.setValue((String) docInfo.get("user_owner")); |
|
2155 |
sm.setSubmitter(p); |
|
2156 |
sm.setRightsHolder(p); |
|
2157 |
try { |
|
2158 |
Date dateCreated = parseMetacatDate((String) docInfo.get("date_created")); |
|
2159 |
sm.setDateUploaded(dateCreated); |
|
2160 |
Date dateUpdated = parseMetacatDate((String) docInfo.get("date_updated")); |
|
2161 |
sm.setDateSysMetadataModified(dateUpdated); |
|
2162 |
} catch (Exception e) { |
|
2163 |
logCrud.debug("POSSIBLE ERROR: couldn't parse a date: " + e.getMessage()); |
|
2164 |
Date dateCreated = new Date(); |
|
2165 |
sm.setDateUploaded(dateCreated); |
|
2166 |
Date dateUpdated = new Date(); |
|
2167 |
sm.setDateSysMetadataModified(dateUpdated); |
|
2168 |
} |
|
2169 |
NodeReference nr = new NodeReference(); |
|
2170 |
nr.setValue(PropertyService.getProperty("dataone.memberNodeId")); |
|
2171 |
sm.setOriginMemberNode(nr); |
|
2172 |
sm.setAuthoritativeMemberNode(nr); |
|
2173 |
|
|
2174 |
// TODO: Need to set describes/describedBy |
|
2175 |
|
|
2176 |
return sm; |
|
2067 |
//set the id |
|
2068 |
sm.setIdentifier(identifier); |
|
2069 |
|
|
2070 |
//set the default object format |
|
2071 |
String doctype = (String) docInfo.get("doctype"); |
|
2072 |
ObjectFormat format = ObjectFormat.convert(doctype); |
|
2073 |
if (format == null) { |
|
2074 |
if (doctype.trim().equals("BIN")) { |
|
2075 |
format = ObjectFormat.OCTET_STREAM; |
|
2076 |
} else { |
|
2077 |
format = ObjectFormat.convert("text/plain"); |
|
2078 |
} |
|
2079 |
} |
|
2080 |
sm.setObjectFormat(format); |
|
2081 |
logCrud.debug("The ObjectFormat for " + localId + " is " + format.toString()); |
|
2082 |
|
|
2083 |
// further parse EML documents to get data object format, |
|
2084 |
// describes and describedBy information |
|
2085 |
if ( format == ObjectFormat.EML_2_0_0 || |
|
2086 |
format == ObjectFormat.EML_2_0_1 || |
|
2087 |
format == ObjectFormat.EML_2_1_0 ) { |
|
2088 |
|
|
2089 |
try { |
|
2090 |
DataoneEMLParser emlParser = DataoneEMLParser.getInstance(); |
|
2091 |
EMLDocument emlDocument = emlParser.parseDocument(is); |
|
2092 |
|
|
2093 |
// iterate through the data objects in the EML doc and add sysmeta |
|
2094 |
logCrud.debug("The number of data entities is: " + |
|
2095 |
emlDocument.distributionMetadata.size()); |
|
2096 |
|
|
2097 |
for( int j = 0; j < emlDocument.distributionMetadata.size(); j++ ) { |
|
2098 |
|
|
2099 |
DistributionMetadata distMetadata = |
|
2100 |
emlDocument.distributionMetadata.elementAt(j); |
|
2101 |
String dataDocUrl = distMetadata.url; |
|
2102 |
String dataDocMimeType = distMetadata.mimeType; |
|
2103 |
String dataDocLocalId = ""; |
|
2104 |
logCrud.debug("\tData local ID: " + dataDocLocalId); |
|
2105 |
logCrud.debug("\tData URL: " + dataDocUrl); |
|
2106 |
logCrud.debug("\tData mime: " + dataDocMimeType); |
|
2107 |
|
|
2108 |
//we only handle ecogrid urls right now |
|
2109 |
if ( dataDocUrl.trim().startsWith("ecogrid://knb/") ) { |
|
2110 |
dataDocLocalId = |
|
2111 |
dataDocUrl.substring(dataDocUrl.indexOf("ecogrid://knb/") + |
|
2112 |
"ecogrid://knb/".length(), dataDocUrl.length()); |
|
2113 |
|
|
2114 |
//set the id |
|
2115 |
Identifier dataDocId = new Identifier(); |
|
2116 |
dataDocId.setValue(dataDocLocalId); |
|
2117 |
|
|
2118 |
// add describes into EML system metadata |
|
2119 |
sm.addDescribe(dataDocId); |
|
2120 |
|
|
2121 |
SystemMetadata dataSysMeta = new SystemMetadata(); |
|
2122 |
// check if data system metadata exists |
|
2123 |
try { |
|
2124 |
logCrud.debug("Checking for existing system metadata for " + dataDocId.getValue()); |
|
2125 |
dataSysMeta = this.getSystemMetadata(token, dataDocId); |
|
2126 |
// add describedBy sysmeta |
|
2127 |
logCrud.debug("Setting describedBy for " + dataDocId.getValue() + |
|
2128 |
" to " + identifier.getValue()); |
|
2129 |
dataSysMeta.addDescribedBy(identifier); |
|
2130 |
dataSysMeta.setObjectFormat(ObjectFormat.convert(dataDocMimeType)); |
|
2131 |
this.updateSystemMetadata(dataSysMeta, getSessionData(token)); |
|
2132 |
|
|
2133 |
} catch ( NotFound nf ) { |
|
2134 |
// System metadata for data doesn't exist |
|
2135 |
logCrud.debug("There was not an existing system metadata " + "document for " + dataDocId.getValue()); |
|
2136 |
logCrud.debug("Creating a system metadata " + "document for " + dataDocId.getValue()); |
|
2137 |
dataSysMeta = this.createSystemMetadata(dataDocLocalId, token); |
|
2138 |
|
|
2139 |
logCrud.debug("Setting describedBy for " + dataDocId.getValue() + " to " + identifier.getValue()); |
|
2140 |
dataSysMeta.addDescribedBy(identifier); |
|
2141 |
|
|
2142 |
logCrud.debug("Setting mimeType for " + dataDocId.getValue() + " to " + dataDocMimeType); |
|
2143 |
dataSysMeta.setObjectFormat(ObjectFormat.convert(dataDocMimeType)); |
|
2144 |
|
|
2145 |
logCrud.debug("Updating system metadata for " + dataDocId.getValue() + " to " + dataDocMimeType); |
|
2146 |
this.updateSystemMetadata(dataSysMeta, getSessionData(token)); |
|
2147 |
} |
|
2148 |
} // end if() |
|
2149 |
} // end for() |
|
2150 |
|
|
2151 |
} catch ( ParserConfigurationException pce ) { |
|
2152 |
logCrud.debug("There was a problem parsing the EML document. " + |
|
2153 |
"The error message was: " + pce.getMessage()); |
|
2154 |
|
|
2155 |
} catch ( SAXException saxe ) { |
|
2156 |
logCrud.debug("There was a problem traversing the EML document. " + |
|
2157 |
"The error message was: " + saxe.getMessage()); |
|
2158 |
|
|
2159 |
} catch ( XPathExpressionException xpee ) { |
|
2160 |
logCrud.debug("There was a problem searching the EML document. " + |
|
2161 |
"The error message was: " + xpee.getMessage()); |
|
2162 |
} // end try |
|
2163 |
|
|
2164 |
} // end if() |
|
2165 |
|
|
2166 |
//create the checksum |
|
2167 |
is = this.get(token, identifier); |
|
2168 |
String checksumS = checksum(is); |
|
2169 |
ChecksumAlgorithm ca = ChecksumAlgorithm.convert("MD5"); |
|
2170 |
Checksum checksum = new Checksum(); |
|
2171 |
checksum.setValue(checksumS); |
|
2172 |
checksum.setAlgorithm(ca); |
|
2173 |
sm.setChecksum(checksum); |
|
2174 |
|
|
2175 |
//set the size |
|
2176 |
is = this.get(token, identifier); |
|
2177 |
sm.setSize(sizeOfStream(is)); |
|
2178 |
|
|
2179 |
//submitter |
|
2180 |
Principal p = new Principal(); |
|
2181 |
p.setValue((String) docInfo.get("user_owner")); |
|
2182 |
sm.setSubmitter(p); |
|
2183 |
sm.setRightsHolder(p); |
|
2184 |
try { |
|
2185 |
Date dateCreated = parseMetacatDate((String) docInfo.get("date_created")); |
|
2186 |
sm.setDateUploaded(dateCreated); |
|
2187 |
Date dateUpdated = parseMetacatDate((String) docInfo.get("date_updated")); |
|
2188 |
sm.setDateSysMetadataModified(dateUpdated); |
|
2189 |
} catch (Exception e) { |
|
2190 |
logCrud.debug("POSSIBLE ERROR: couldn't parse a date: " + e.getMessage()); |
|
2191 |
Date dateCreated = new Date(); |
|
2192 |
sm.setDateUploaded(dateCreated); |
|
2193 |
Date dateUpdated = new Date(); |
|
2194 |
sm.setDateSysMetadataModified(dateUpdated); |
|
2195 |
} |
|
2196 |
NodeReference nr = new NodeReference(); |
|
2197 |
nr.setValue(PropertyService.getProperty("dataone.memberNodeId")); |
|
2198 |
sm.setOriginMemberNode(nr); |
|
2199 |
sm.setAuthoritativeMemberNode(nr); |
|
2200 |
|
|
2201 |
// TODO: Need to set describes/describedBy |
|
2202 |
|
|
2203 |
return sm; |
|
2177 | 2204 |
} |
2178 | 2205 |
|
2179 | 2206 |
/** |
Also available in: Unified diff
generateMissingSystemMetadata was swallowing Exceptions instead of throwing. Refactored so that specific exceptions are thrown, affecting [create/update]SystemMetadata methods, too.