001package dk.netarkivet.common.distribute.bitrepository.action.getfileids; 002 003import java.util.ArrayList; 004import java.util.Date; 005import java.util.HashSet; 006import java.util.List; 007import java.util.Set; 008 009import org.bitrepository.access.ContributorQuery; 010import org.bitrepository.access.getfileids.GetFileIDsClient; 011import org.bitrepository.bitrepositoryelements.FileIDsData; 012import org.bitrepository.bitrepositoryelements.FileIDsDataItem; 013import org.bitrepository.common.utils.CalendarUtils; 014import org.slf4j.Logger; 015import org.slf4j.LoggerFactory; 016 017import dk.netarkivet.common.distribute.bitrepository.BitmagUtils; 018import dk.netarkivet.common.distribute.bitrepository.action.ClientAction; 019import dk.netarkivet.common.utils.Settings; 020 021/** 022 * Action class to get file IDs from Bitmag. 023 */ 024public class GetFileIDsAction implements ClientAction { 025 private final Logger log = LoggerFactory.getLogger(getClass()); 026 027 private final GetFileIDsClient client; 028 private final String collectionID; 029 private final String pillarID; 030 private final Date minDate; 031 private final Set<String> fileIDs = new HashSet<>(); 032 033 /** 034 * Constructor to instantiate the get-file-ids action 035 * @param client The client to perform the action on 036 * @param collectionID The ID of a known collection to operate on 037 * @param pillarID The ID of a known pillar to fetch the file IDs from 038 * @param minDate The date specifying how old file ids to fetch 039 */ 040 public GetFileIDsAction(GetFileIDsClient client, String collectionID, String pillarID, Date minDate) { 041 this.client = client; 042 this.collectionID = collectionID; 043 this.pillarID = pillarID; 044 this.minDate = minDate; 045 } 046 047 @Override 048 public void performAction() { 049 GetFileIDsEventHandler eventHandler = new GetFileIDsEventHandler(pillarID); 050 Date latestDate = minDate; 051 052 do { 053 client.getFileIDs(collectionID, getQuery(pillarID, latestDate, new Date(System.currentTimeMillis())), null, null, eventHandler); 054 055 try { 056 eventHandler.waitForFinish(); 057 if (eventHandler.hasFailed()) { 058 log.warn("Failed getting fileIDs from pillar '{}'.", pillarID); 059 return; 060 } 061 062 FileIDsData fileIDsData = eventHandler.getFileIDsData(); 063 for (FileIDsDataItem fileIDsDataItem : fileIDsData.getFileIDsDataItems().getFileIDsDataItem()) { 064 String fileID = fileIDsDataItem.getFileID(); 065 Date lastModificationDate = CalendarUtils.convertFromXMLGregorianCalendar(fileIDsDataItem.getLastModificationTime()); 066 if (lastModificationDate.after(latestDate)) { 067 latestDate = lastModificationDate; 068 } 069 fileIDs.add(fileID); 070 } 071 } catch (InterruptedException e) { 072 log.error("Got interrupted while waiting for operation to complete"); 073 } 074 } while (eventHandler.partialResults()); 075 } 076 077 private ContributorQuery[] getQuery(String pillarID, Date minDate, Date maxDate) { 078 List<ContributorQuery> res = new ArrayList<ContributorQuery>(); 079 int maxResults = Settings.getInt(BitmagUtils.BITREPOSITORY_GETFILEIDS_MAX_RESULTS); 080 res.add(new ContributorQuery(pillarID, minDate, maxDate, maxResults)); 081 return res.toArray(new ContributorQuery[1]); 082 } 083 084 public Set<String> getActionResult() { 085 return fileIDs; 086 } 087}