Project

General

Profile

« Previous | Next » 

Revision 6097

do not use XML files for storing SystemMetadata - use DB tables only.

View differences:

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