001 package org.nanocontainer.deployer; 002 003 import org.apache.commons.vfs.FileObject; 004 import org.apache.commons.vfs.FileSystemException; 005 import org.picocontainer.Startable; 006 007 /** 008 * Component that polls a folder for children at regular intervals. 009 * @author Aslak Hellesøy 010 * @version $Revision: 2343 $ 011 */ 012 public class FolderContentPoller implements Startable { 013 private FolderContentHandler folderContentHandler; 014 private FileObject folder; 015 016 private Runnable poller = new Runnable() { 017 public void run() { 018 while (!Thread.interrupted()) { 019 try { 020 // Have to "close" the folder to invalidate child cache 021 folder.close(); 022 FileObject[] currentChildren = folder.getChildren(); 023 folderContentHandler.setCurrentChildren(currentChildren); 024 synchronized(FolderContentPoller.this) { 025 FolderContentPoller.this.notify(); 026 FolderContentPoller.this.wait(2000); 027 } 028 } catch (FileSystemException e) { 029 e.printStackTrace(); 030 } catch (InterruptedException e) { 031 thread.interrupt(); 032 } 033 } 034 } 035 }; 036 private Thread thread; 037 private boolean started = false; 038 039 040 public FolderContentPoller(FolderContentHandler folderChangeNotifier) { 041 this.folderContentHandler = folderChangeNotifier; 042 folder = folderChangeNotifier.getFolder(); 043 } 044 045 public void start() { 046 if(started) throw new IllegalStateException("Already started"); 047 thread = new Thread(poller); 048 thread.start(); 049 started = true; 050 } 051 052 public void stop() { 053 if(!started) throw new IllegalStateException("Already stopped"); 054 thread.interrupt(); 055 started = true; 056 } 057 058 }