View Javadoc

1   package org.bitrepository.audittrails.store;
2   
3   import java.math.BigInteger;
4   import java.sql.Connection;
5   import java.sql.PreparedStatement;
6   import java.sql.ResultSet;
7   import java.sql.SQLException;
8   
9   import org.bitrepository.bitrepositoryelements.AuditTrailEvent;
10  import org.bitrepository.bitrepositoryelements.FileAction;
11  import org.bitrepository.common.utils.CalendarUtils;
12  import org.slf4j.Logger;
13  import org.slf4j.LoggerFactory;
14  
15  import static org.bitrepository.audittrails.store.AuditDatabaseExtractor.*;
16  
17  /**
18   * Class to iterate over the set of AuditTrailEvents produced by a resultset.  
19   */
20  public class AuditEventIterator {
21  
22      /** The log.*/
23      private Logger log = LoggerFactory.getLogger(getClass());
24      private ResultSet auditResultSet = null;
25      private Connection conn = null;
26      private final PreparedStatement ps;
27      
28      /**
29       * @param ps The prepare statement to execute and iterate over.
30       */
31      public AuditEventIterator(PreparedStatement ps) {
32          this.ps = ps;
33      }
34      
35      /**
36       * Method to explicitly close the ResultSet in the AuditEventIterator 
37       * @throws SQLException in case of a sql error
38       */
39      public void close() throws SQLException {
40          if(auditResultSet != null) {
41              auditResultSet.close();
42          }
43          
44          if(ps != null) {
45              ps.close();
46          }
47          
48          if(conn != null) {
49              conn.setAutoCommit(true);
50              conn.close();
51              conn = null;
52          }
53      }
54      
55      /**
56       * Method to return the next AuditTrailEvent in the ResultSet
57       * When no more AuditTrailEvents are available, null is returned and the internal ResultSet closed. 
58       * @return The next AuditTrailEvent available in the ResultSet, or null if no more events are available. 
59       * @throws SQLException In case of a sql error. 
60       */
61      public AuditTrailEvent getNextAuditTrailEvent() {
62          try {
63              AuditTrailEvent event = null;
64              if(auditResultSet == null) {
65                  conn = ps.getConnection();
66                  conn.setAutoCommit(false);
67                  ps.setFetchSize(100);
68                  long tStart = System.currentTimeMillis();
69                  log.debug("Executing query to get AuditTrailEvents resultset");
70                  auditResultSet = ps.executeQuery();
71                  log.debug("Finished executing AuditTrailEvents query, it took: " + (System.currentTimeMillis() - tStart) + "ms");
72              }
73              if(auditResultSet.next()) {
74                  event = new AuditTrailEvent();
75                  event.setActionDateTime(CalendarUtils.getFromMillis(auditResultSet.getTimestamp(POSITION_OPERATION_DATE).getTime()));
76                  event.setActionOnFile(FileAction.fromValue(auditResultSet.getString(POSITION_OPERATION)));
77                  event.setAuditTrailInformation(auditResultSet.getString(POSITION_AUDIT_TRAIL));
78                  event.setActorOnFile(auditResultSet.getString(POSITION_ACTOR_NAME));
79                  event.setFileID(auditResultSet.getString(POSITION_FILE_ID));
80                  event.setInfo(auditResultSet.getString(POSITION_INFORMATION));
81                  event.setReportingComponent(auditResultSet.getString(POSITION_CONTRIBUTOR_ID));
82                  event.setSequenceNumber(BigInteger.valueOf(auditResultSet.getLong(POSITION_SEQUENCE_NUMBER)));
83                  event.setOperationID(auditResultSet.getString(POSITION_OPERATION_ID));
84                  event.setCertificateID(auditResultSet.getString(POSITION_FINGERPRINT));
85              } else {
86                  close();
87              }
88      
89              return event;
90          } catch (Exception e) {
91              try {
92                  close();
93              } catch (SQLException e1) {
94                  throw new RuntimeException("Failed to close ResultSet or PreparedStatement", e1);
95              }
96              throw new IllegalStateException("Could not extract the wanted audittrails", e);
97          } 
98      }
99  
100 }