Revision 6097
Added by ben leinfelder almost 13 years ago
IdentifierManager.java | ||
---|---|---|
34 | 34 |
import org.apache.log4j.Logger; |
35 | 35 |
import org.dataone.service.types.Checksum; |
36 | 36 |
import org.dataone.service.types.ChecksumAlgorithm; |
37 |
import org.dataone.service.types.NodeReference; |
|
37 | 38 |
import org.dataone.service.types.ObjectFormat; |
38 | 39 |
import org.dataone.service.types.ObjectInfo; |
39 | 40 |
import org.dataone.service.types.ObjectList; |
41 |
import org.dataone.service.types.Subject; |
|
40 | 42 |
import org.dataone.service.types.SystemMetadata; |
41 | 43 |
import org.dataone.service.types.Identifier; |
42 | 44 |
|
... | ... | |
100 | 102 |
return self; |
101 | 103 |
} |
102 | 104 |
|
105 |
public SystemMetadata asSystemMetadata(Date dateUploaded, String rightsHolder, |
|
106 |
String checksum, String checksumAlgorithm, String originMemberNode, |
|
107 |
String authoritativeMemberNode, Date dateModified, String submitter, |
|
108 |
String guid, String objectFormat, long size) { |
|
109 |
SystemMetadata sysMeta = new SystemMetadata(); |
|
110 |
|
|
111 |
Identifier sysMetaId = new Identifier(); |
|
112 |
sysMetaId.setValue(guid); |
|
113 |
sysMeta.setIdentifier(sysMetaId); |
|
114 |
sysMeta.setDateUploaded(dateUploaded); |
|
115 |
Subject rightsHolderSubject = new Subject(); |
|
116 |
rightsHolderSubject.setValue(rightsHolder); |
|
117 |
sysMeta.setRightsHolder(rightsHolderSubject); |
|
118 |
Checksum checksumObject = new Checksum(); |
|
119 |
checksumObject.setValue(checksum); |
|
120 |
checksumObject.setAlgorithm(ChecksumAlgorithm.convert(checksumAlgorithm)); |
|
121 |
sysMeta.setChecksum(checksumObject); |
|
122 |
NodeReference omn = new NodeReference(); |
|
123 |
omn.setValue(originMemberNode); |
|
124 |
sysMeta.setOriginMemberNode(omn); |
|
125 |
NodeReference amn = new NodeReference(); |
|
126 |
amn.setValue(authoritativeMemberNode); |
|
127 |
sysMeta.setAuthoritativeMemberNode(amn); |
|
128 |
sysMeta.setDateSysMetadataModified(dateModified); |
|
129 |
Subject submitterSubject = new Subject(); |
|
130 |
submitterSubject.setValue(submitter); |
|
131 |
sysMeta.setSubmitter(submitterSubject); |
|
132 |
sysMeta.setObjectFormat(ObjectFormat.convert(objectFormat)); |
|
133 |
sysMeta.setSize(size); |
|
134 |
|
|
135 |
return sysMeta; |
|
136 |
} |
|
137 |
|
|
103 | 138 |
/** |
104 | 139 |
* return a hash of all of the info that is in the systemmetadata table |
105 | 140 |
* @param localId |
... | ... | |
184 | 219 |
} |
185 | 220 |
|
186 | 221 |
/** |
222 |
* return a hash of all of the info that is in the systemmetadata table |
|
223 |
* @param localId |
|
224 |
* @return |
|
225 |
*/ |
|
226 |
public SystemMetadata getSystemMetadata(String localId) |
|
227 |
throws McdbDocNotFoundException |
|
228 |
{ |
|
229 |
try |
|
230 |
{ |
|
231 |
AccessionNumber acc = new AccessionNumber(localId, "NONE"); |
|
232 |
localId = acc.getDocid(); |
|
233 |
} |
|
234 |
catch(Exception e) |
|
235 |
{ |
|
236 |
//do nothing. just try the localId as it is |
|
237 |
} |
|
238 |
SystemMetadata sysMeta = new SystemMetadata(); |
|
239 |
String sql = "select guid, date_uploaded, rights_holder, checksum, checksum_algorithm, " + |
|
240 |
"origin_member_node, authoritive_member_node, date_modified, submitter, object_format, size " + |
|
241 |
"from systemmetadata where docid = ?"; |
|
242 |
DBConnection dbConn = null; |
|
243 |
int serialNumber = -1; |
|
244 |
try |
|
245 |
{ |
|
246 |
// Get a database connection from the pool |
|
247 |
dbConn = DBConnectionPool.getDBConnection("IdentifierManager.getSystemMetadata"); |
|
248 |
serialNumber = dbConn.getCheckOutSerialNumber(); |
|
249 |
|
|
250 |
// Execute the statement |
|
251 |
PreparedStatement stmt = dbConn.prepareStatement(sql); |
|
252 |
stmt.setString(1, localId); |
|
253 |
ResultSet rs = stmt.executeQuery(); |
|
254 |
if (rs.next()) |
|
255 |
{ |
|
256 |
String guid = rs.getString(1); |
|
257 |
Timestamp dateUploaded = rs.getTimestamp(2); |
|
258 |
String rightsHolder = rs.getString(3); |
|
259 |
String checksum = rs.getString(4); |
|
260 |
String checksumAlgorithm = rs.getString(5); |
|
261 |
String originMemberNode = rs.getString(6); |
|
262 |
String authoritativeMemberNode = rs.getString(7); |
|
263 |
Timestamp dateModified = rs.getTimestamp(8); |
|
264 |
String submitter = rs.getString(9); |
|
265 |
String objectFormat = rs.getString(10); |
|
266 |
long size = new Long(rs.getString(11)).longValue(); |
|
267 |
|
|
268 |
Identifier sysMetaId = new Identifier(); |
|
269 |
sysMetaId.setValue(guid); |
|
270 |
sysMeta.setIdentifier(sysMetaId); |
|
271 |
sysMeta.setDateUploaded(dateUploaded); |
|
272 |
Subject rightsHolderSubject = new Subject(); |
|
273 |
rightsHolderSubject.setValue(rightsHolder); |
|
274 |
sysMeta.setRightsHolder(rightsHolderSubject); |
|
275 |
Checksum checksumObject = new Checksum(); |
|
276 |
checksumObject.setValue(checksum); |
|
277 |
checksumObject.setAlgorithm(ChecksumAlgorithm.convert(checksumAlgorithm)); |
|
278 |
sysMeta.setChecksum(checksumObject); |
|
279 |
NodeReference omn = new NodeReference(); |
|
280 |
omn.setValue(originMemberNode); |
|
281 |
sysMeta.setOriginMemberNode(omn); |
|
282 |
NodeReference amn = new NodeReference(); |
|
283 |
amn.setValue(authoritativeMemberNode); |
|
284 |
sysMeta.setAuthoritativeMemberNode(amn); |
|
285 |
sysMeta.setDateSysMetadataModified(dateModified); |
|
286 |
Subject submitterSubject = new Subject(); |
|
287 |
submitterSubject.setValue(submitter); |
|
288 |
sysMeta.setSubmitter(submitterSubject); |
|
289 |
sysMeta.setObjectFormat(ObjectFormat.convert(objectFormat)); |
|
290 |
sysMeta.setSize(size); |
|
291 |
|
|
292 |
stmt.close(); |
|
293 |
} |
|
294 |
else |
|
295 |
{ |
|
296 |
stmt.close(); |
|
297 |
DBConnectionPool.returnDBConnection(dbConn, serialNumber); |
|
298 |
throw new McdbDocNotFoundException("Could not find " + localId); |
|
299 |
} |
|
300 |
|
|
301 |
} |
|
302 |
catch (SQLException e) |
|
303 |
{ |
|
304 |
e.printStackTrace(); |
|
305 |
logMetacat.error("Error while getting system metadata for localid " + localId + " : " |
|
306 |
+ e.getMessage()); |
|
307 |
} |
|
308 |
finally |
|
309 |
{ |
|
310 |
// Return database connection to the pool |
|
311 |
DBConnectionPool.returnDBConnection(dbConn, serialNumber); |
|
312 |
} |
|
313 |
|
|
314 |
// look up provenance information |
|
315 |
sysMeta.setObsoleteList(getSystemMetadataProvenance(sysMeta.getIdentifier().getValue(), "obsoletes")); |
|
316 |
sysMeta.setObsoletedByList(getSystemMetadataProvenance(sysMeta.getIdentifier().getValue(), "obsoletedBy")); |
|
317 |
sysMeta.setDescribeList(getSystemMetadataProvenance(sysMeta.getIdentifier().getValue(), "describes")); |
|
318 |
sysMeta.setDescribedByList(getSystemMetadataProvenance(sysMeta.getIdentifier().getValue(), "describedBy")); |
|
319 |
sysMeta.setDerivedFromList(getSystemMetadataProvenance(sysMeta.getIdentifier().getValue(), "derivedFrom")); |
|
320 |
|
|
321 |
return sysMeta; |
|
322 |
} |
|
323 |
|
|
324 |
private List<Identifier> getSystemMetadataProvenance(String guid, String relationship) |
|
325 |
throws McdbDocNotFoundException { |
|
326 |
|
|
327 |
List<Identifier> identifiers = new ArrayList<Identifier>(); |
|
328 |
String sql = "select guid, relationship, target_guid " + |
|
329 |
"from systemMetadataProvenance where guid = ? and relationship = ?"; |
|
330 |
DBConnection dbConn = null; |
|
331 |
int serialNumber = -1; |
|
332 |
try |
|
333 |
{ |
|
334 |
// Get a database connection from the pool |
|
335 |
dbConn = DBConnectionPool.getDBConnection("IdentifierManager.getSystemMetadataProvenance"); |
|
336 |
serialNumber = dbConn.getCheckOutSerialNumber(); |
|
337 |
|
|
338 |
// Execute the statement |
|
339 |
PreparedStatement stmt = dbConn.prepareStatement(sql); |
|
340 |
stmt.setString(1, guid); |
|
341 |
stmt.setString(2, relationship); |
|
342 |
ResultSet rs = stmt.executeQuery(); |
|
343 |
while (rs.next()) |
|
344 |
{ |
|
345 |
String targetGuid = rs.getString(3); |
|
346 |
Identifier id = new Identifier(); |
|
347 |
id.setValue(targetGuid); |
|
348 |
identifiers.add(id); |
|
349 |
|
|
350 |
} |
|
351 |
stmt.close(); |
|
352 |
|
|
353 |
} |
|
354 |
catch (SQLException e) |
|
355 |
{ |
|
356 |
logMetacat.error("Error while getting system metadata provenance for guid " + guid, e); |
|
357 |
} |
|
358 |
finally |
|
359 |
{ |
|
360 |
// Return database connection to the pool |
|
361 |
DBConnectionPool.returnDBConnection(dbConn, serialNumber); |
|
362 |
} |
|
363 |
|
|
364 |
return identifiers; |
|
365 |
} |
|
366 |
|
|
367 |
/** |
|
187 | 368 |
* return information on the document with localId. These are the fields |
188 | 369 |
* from the xml_documents table. They can be used to contstruct metadata |
189 | 370 |
* about the object that is stored. |
... | ... | |
708 | 889 |
return this.getLocalId(guid, TYPE_SYSTEM_METADATA); |
709 | 890 |
} |
710 | 891 |
|
711 |
public void insertAdditionalSystemMetadataFields(long dateUploaded, String rightsHolder,
|
|
892 |
private void insertAdditionalSystemMetadataFields(long dateUploaded, String rightsHolder,
|
|
712 | 893 |
String checksum, String checksumAlgorithm, String originMemberNode, |
713 | 894 |
String authoritativeMemberNode, long modifiedDate, String submitter, |
714 | 895 |
String guid, String objectFormat, long size) |
... | ... | |
762 | 943 |
} |
763 | 944 |
} |
764 | 945 |
|
946 |
private void insertSystemMetadataProvenance(String guid, String relationship, List<String> targetGuids) |
|
947 |
{ |
|
948 |
DBConnection dbConn = null; |
|
949 |
int serialNumber = -1; |
|
950 |
|
|
951 |
try { |
|
952 |
// Get a database connection from the pool |
|
953 |
dbConn = |
|
954 |
DBConnectionPool.getDBConnection("IdentifierManager.createMapping"); |
|
955 |
serialNumber = dbConn.getCheckOutSerialNumber(); |
|
956 |
|
|
957 |
// remove existing values first |
|
958 |
String delete = "delete from systemMetadataProvenance " + |
|
959 |
"where guid = ? and relationship = ?"; |
|
960 |
PreparedStatement stmt = dbConn.prepareStatement(delete); |
|
961 |
//data values |
|
962 |
stmt.setString(1, guid); |
|
963 |
stmt.setString(2, relationship); |
|
964 |
//execute |
|
965 |
int deletedCount = stmt.executeUpdate(); |
|
966 |
stmt.close(); |
|
967 |
|
|
968 |
for (String targetGuid: targetGuids) { |
|
969 |
// Execute the insert statement |
|
970 |
String insert = "insert into systemMetadataProvenance " + |
|
971 |
"(guid, relationship, target_guid) " + |
|
972 |
"values (?, ?, ?)"; |
|
973 |
PreparedStatement insertStatement = dbConn.prepareStatement(insert); |
|
974 |
|
|
975 |
//data values |
|
976 |
insertStatement.setString(1, guid); |
|
977 |
insertStatement.setString(2, relationship); |
|
978 |
insertStatement.setString(3, targetGuid); |
|
979 |
//execute |
|
980 |
int rows = insertStatement.executeUpdate(); |
|
981 |
insertStatement.close(); |
|
982 |
} |
|
983 |
} catch (SQLException e) { |
|
984 |
logMetacat.error("SQL error while adding systemMetadataProvenance for: " + guid, e); |
|
985 |
} finally { |
|
986 |
// Return database connection to the pool |
|
987 |
DBConnectionPool.returnDBConnection(dbConn, serialNumber); |
|
988 |
} |
|
989 |
} |
|
990 |
|
|
765 | 991 |
/** |
766 | 992 |
* Insert the system metadata fields into the db |
767 | 993 |
* @param sm |
... | ... | |
780 | 1006 |
sm.getIdentifier().getValue(), |
781 | 1007 |
sm.getObjectFormat().toString(), |
782 | 1008 |
sm.getSize()); |
1009 |
|
|
1010 |
// add provenance information |
|
1011 |
String guid = sm.getIdentifier().getValue(); |
|
1012 |
List<String> targetGuids = null; |
|
1013 |
String relationship = null; |
|
1014 |
|
|
1015 |
relationship = "obsoletedBy"; |
|
1016 |
targetGuids = new ArrayList<String>(); |
|
1017 |
for (Identifier id: sm.getObsoletedByList()) { |
|
1018 |
targetGuids.add(id.getValue()); |
|
1019 |
} |
|
1020 |
this.insertSystemMetadataProvenance(guid, relationship, targetGuids); |
|
1021 |
|
|
1022 |
relationship = "obsoletes"; |
|
1023 |
targetGuids = new ArrayList<String>(); |
|
1024 |
for (Identifier id: sm.getObsoleteList()) { |
|
1025 |
targetGuids.add(id.getValue()); |
|
1026 |
} |
|
1027 |
this.insertSystemMetadataProvenance(guid, relationship, targetGuids); |
|
1028 |
|
|
1029 |
relationship = "describes"; |
|
1030 |
targetGuids = new ArrayList<String>(); |
|
1031 |
for (Identifier id: sm.getDescribeList()) { |
|
1032 |
targetGuids.add(id.getValue()); |
|
1033 |
} |
|
1034 |
this.insertSystemMetadataProvenance(guid, relationship, targetGuids); |
|
1035 |
|
|
1036 |
relationship = "describedBy"; |
|
1037 |
targetGuids = new ArrayList<String>(); |
|
1038 |
for (Identifier id: sm.getDescribedByList()) { |
|
1039 |
targetGuids.add(id.getValue()); |
|
1040 |
} |
|
1041 |
this.insertSystemMetadataProvenance(guid, relationship, targetGuids); |
|
1042 |
|
|
1043 |
relationship = "derivedFrom"; |
|
1044 |
targetGuids = new ArrayList<String>(); |
|
1045 |
for (Identifier id: sm.getDerivedFromList()) { |
|
1046 |
targetGuids.add(id.getValue()); |
|
1047 |
} |
|
1048 |
this.insertSystemMetadataProvenance(guid, relationship, targetGuids); |
|
1049 |
|
|
783 | 1050 |
} |
784 | 1051 |
|
785 | 1052 |
/** |
Also available in: Unified diff
do not use XML files for storing SystemMetadata - use DB tables only.