001/*
002 * #%L
003 * Netarchivesuite - wayback
004 * %%
005 * Copyright (C) 2005 - 2014 The Royal Danish Library, the Danish State and University Library,
006 *             the National Library of France and the Austrian National Library.
007 * %%
008 * This program is free software: you can redistribute it and/or modify
009 * it under the terms of the GNU Lesser General Public License as
010 * published by the Free Software Foundation, either version 2.1 of the
011 * License, or (at your option) any later version.
012 * 
013 * This program is distributed in the hope that it will be useful,
014 * but WITHOUT ANY WARRANTY; without even the implied warranty of
015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016 * GNU General Lesser Public License for more details.
017 * 
018 * You should have received a copy of the GNU General Lesser Public
019 * License along with this program.  If not, see
020 * <http://www.gnu.org/licenses/lgpl-2.1.html>.
021 * #L%
022 */
023package dk.netarkivet.wayback.indexer;
024
025import java.util.List;
026
027import org.hibernate.Session;
028
029import dk.netarkivet.common.utils.Settings;
030import dk.netarkivet.wayback.WaybackSettings;
031
032/**
033 * Data Access Object for ArchiveFile instances.
034 */
035@SuppressWarnings({"unchecked"})
036public class ArchiveFileDAO extends GenericHibernateDAO<ArchiveFile, String> {
037
038    /**
039     * Default constructor.
040     */
041    public ArchiveFileDAO() {
042        super(ArchiveFile.class);
043    }
044
045    /**
046     * Returns true iff this file is found in the object store.
047     *
048     * @param filename the name of the file.
049     * @return whether or not the file is already known.
050     */
051    public boolean exists(String filename) {
052        Session sess = getSession();
053        return !sess.createQuery("from ArchiveFile where filename='" + filename + "'").list().isEmpty();
054    }
055
056    /**
057     * Returns a list of all files awaiting indexing, ie all files not yet indexed and which have not failed indexing
058     * more than the maximum number of allowed times. The list is ordered such that previously failed files are returned
059     * last.
060     *
061     * @return the list of files awaiting indexing.
062     */
063    public List<ArchiveFile> getFilesAwaitingIndexing() {
064        int maxFailedAttempts = Settings.getInt(WaybackSettings.WAYBACK_INDEXER_MAXFAILEDATTEMPTS);
065        return getSession().createQuery(
066                "FROM ArchiveFile WHERE indexed=false" + " AND indexingFailedAttempts <  " + maxFailedAttempts
067                        + " ORDER BY indexingFailedAttempts ASC").list();
068    }
069
070}