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}