package net.aragorn.nio;
import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;
/**
*
* @author Aragorn
*/
public class DirectoryQueue
{
/* ========================================================================== *
* Konstanten
* ========================================================================== */
public static final File QUEUE_DELEMITER = new File ( "://queueeueuq\\:" );
/* ========================================================================== *
* Attribute
* ========================================================================== */
/**
* Enthält alle noch zu durchsuchenden Verzeichnisse
*/
private LinkedList<File> Queue;
/**
* Enthält alle mit dem Filter übereinstimmenden Dateien
*/
private ArrayList<File> Result;
/* ========================================================================== *
* Konstruktor
* ========================================================================== */
/**
* <u>Konstruktor</u>
* Erstellt und initialisiert eine DirectoryQueue
* @param ThreadCount Die Anzahl der Threads, welche die Queue bearbeiten
*/
public DirectoryQueue ()
{
Queue = new LinkedList<File> ();
Result = new ArrayList<File> ( 50 );
}
/* ========================================================================== *
* Worker/Schnittstellen
* ========================================================================== */
/**
* Hängt einen neuen Arbeitsauftrag an die Queue an. Es wird ein wartender
* Thread über "neue" Arbeit informiert.
* @param Directory Das hinzuzufügende Verzeichnis, welches durchsucht werden
* soll
*/
public synchronized void addDirectory (
File Directory )
{
/** Verzeichnis in die Queue eintragen */
Queue.add ( Directory );
/** Einen wartenden Thread benachrichtigen */
notify ();
}
/**
* Hängt das ENDE Flag an die Queue an. Es werden ALLE wartenden Threads
* informiert.
*/
public synchronized void terminateQueue ()
{
/** Ende Flag in die Queue eintragen */
Queue.add ( QUEUE_DELEMITER );
/** Alle wartenden Threads informieren */
notifyAll ();
}
/**
* Holt den nächsten Arbeitsauftrag aus der Queue. Falls die Queue leer
* sein sollte, wartet der Thread auf das "eintreffen" eines neuen Arbeits-
* auftrages
* @return Das zu durchsuchende Verzeichnis
*/
public synchronized File nextDirectory ()
throws InterruptedException
{
/** Falls die Queue leer ist, auf neue Aufgaben warten */
while( Queue.isEmpty () )
{
wait ();
}
/**
* Prüfen, ob das nächste Element das Ende Flag ist. Dieses darf NICHT
* entfernt werden.
*/
if( Queue.getFirst ().equals ( DirectoryQueue.QUEUE_DELEMITER ) )
return DirectoryQueue.QUEUE_DELEMITER;
else
return Queue.removeFirst ();
}
// /**
// * Hängt den übergebenen Parameter an die Ergebnisliste an
// * @param Name Der einzufügende Name
// */
// public synchronized void mergeResult (
// File Name )
// {
//
// getResult ().add ( Name );
//
// }
/**
* Hängt die übergebene Liste an die Ergebnisliste an.
* @param List Die anzuhängende Teilliste
*/
public synchronized void mergeResult (
ArrayList<File> List )
{
getResult ().addAll ( List );
}
/* ========================================================================== *
* Accessor/Modifier
* ========================================================================== */
public ArrayList<File> getResult ()
{
return Result;
}
}