/**
 * Main.java 13 avr. 2009
 * 
 * Copyright (c) 2009 windu.2b <windu.2b@gmail.com>. All Rights Reserved.
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 3 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA
 */
package org.windu2b.touchdirs;

import java.io.File;
import java.io.FileNotFoundException;

/**
 * Permet de mmodifier la date de dernière modification d'un répertoire, donné
 * en paramètre, à partir des dossiers/fichiers qu'il contient.
 * 
 * TODO : rendre optionnelle la modification récursive
 * 
 * @author windu.2b
 * 
 */
public final class Main {

    /**
     * @param args
     *            <p>
     *            args[0] : contient le nom du répertoire concerné. Ne peut être
     *            <code>null</code>
     *            </p>
     * @throws FileNotFoundException
     *             Si le nom du répertoire donné en paramètre n'existe pas ou si
     *             ce n'est pas un répertoire
     * @throws IllegalArgumentException
     *             Si aucun nom de dossier n'a été donné en paramètre.
     */
    public static void main(String[] args) throws FileNotFoundException {
	if (args == null || args.length == 0)
	    throw new IllegalArgumentException(
		    "Vous devez préciser le nom du répertoire à traiter !");

	// Nom du répertoire à traiter
	File mainDir = new File(args[0]);

	/*
	 * On vérifie que c'est bien un répertoire et qu'il existe
	 */
	if (!mainDir.exists())
	    throw new FileNotFoundException("Le répertoire '" + args[0]
		    + "' n'existe pas !");
	if (!mainDir.isDirectory())
	    throw new IllegalArgumentException("'" + args[0]
		    + "' n'est pas un répertoire !");

	/*
	 * Récupération des dossiers contenus dans 'mainDir', Et pour chacun
	 * d'eux, modification de la date de dernière modification à partir des
	 * dossiers/fichiers qu'il contient
	 */
	long l = getLastModificationDate(mainDir);

	// Modification de la date de dernière modification
	mainDir.setLastModified(l);
    }

    /**
     * Permet de récupérer la date de dernière modification du fichier passé en
     * paramètre
     * 
     * @param file
     *            Le fichier dont on veut obtenir la date de dernière
     *            modification. S'il s'agit d'un répertoire, la valeur renvoyée
     *            correspond à la date de dernière modification des fichiers
     *            qu'il contient (appel récursif).
     * @return le timestamp de dernière modification.
     */
    private static long getLastModificationDate(File file) {
	if (file == null)
	    throw new IllegalArgumentException("'file' cannot be 'null' !");

	long lastModified = 0;
	long l = 0;

	/*
	 * Pour chaque fichier contenu dans <code>file</code>, on recherche la
	 * date de dernière modification
	 */
	for (File f : file.listFiles()) {
	    // Si c'est un répertoire, on applique la récursivité
	    if (f.isDirectory())
		l = getLastModificationDate(f);

	    /*
	     * Si c'est un fichier et qu'il n'est pas caché
	     * TODO : inclure un filtrage sur certains types de fichiers
	     */
	    else if (f.isFile() && !f.isHidden())
		l = f.lastModified();

	    if (l > lastModified)
		lastModified = l;
	}

	return lastModified;
    }
}