1 18 package org.drftpd.mirroring; 19 20 import java.util.ArrayList ; 21 import java.util.Collection ; 22 import java.util.Collections ; 23 import java.util.Iterator ; 24 import java.util.Set ; 25 26 import net.sf.drftpd.event.listeners.Archive; 27 import net.sf.drftpd.remotefile.LinkedRemoteFileInterface; 28 29 import org.apache.log4j.Logger; 30 import org.drftpd.sections.SectionInterface; 31 32 36 public class ArchiveHandler extends Thread { 37 protected static Logger logger = Archive.getLogger(); 38 39 private ArchiveType _archiveType; 40 41 private static ArrayList _archiveHandlers = new ArrayList (); 42 43 public ArchiveHandler(ArchiveType archiveType) { 44 _archiveType = archiveType; 45 setName( 46 _archiveType.getClass().getName() 47 + " archiving " 48 + _archiveType.getSection().getName()); 49 } 50 51 public static ArchiveType getArchiveTypeForDirectory(LinkedRemoteFileInterface lrf) { 52 for (Iterator iter = _archiveHandlers.iterator(); iter.hasNext();) { 53 ArchiveHandler archiveHandler = (ArchiveHandler) iter.next(); 54 ArchiveType archiveType = archiveHandler.getArchiveType(); 55 if (lrf == archiveType.getDirectory()) { 56 return archiveType; 57 } 58 } 59 return null; 60 } 61 62 public ArchiveType getArchiveType() { 63 return _archiveType; 64 } 65 66 public SectionInterface getSection() { 67 return _archiveType.getSection(); 68 } 69 70 public void run() { 71 try { 72 synchronized (_archiveType) { 73 if (_archiveType.getDirectory() == null) { 74 _archiveType.setDirectory(_archiveType.getOldestNonArchivedDir()); 75 } 76 } 77 if (_archiveType.getDirectory() == null) 78 return; if (_archiveType.getRSlaves() == null) { 80 Set destSlaves = _archiveType.findDestinationSlaves(); 81 if ( destSlaves == null ) { 82 _archiveType.setDirectory(null); 83 return; } 85 _archiveType.setRSlaves(Collections.unmodifiableSet(destSlaves)); 86 } 87 ArchiveType dupeArchiveType; 88 synchronized(_archiveHandlers) { 89 dupeArchiveType = getArchiveTypeForDirectory(_archiveType.getDirectory()); 90 if (dupeArchiveType == null) { 91 addArchiveHandler(this); 92 } 93 } 94 if (dupeArchiveType != null) { 95 logger.info(_archiveType.getDirectory() + " is already being archived by " + dupeArchiveType); 96 return; 97 } 98 ArrayList jobs = _archiveType.send(); 99 _archiveType.waitForSendOfFiles(new ArrayList (jobs)); 100 _archiveType.cleanup(jobs); 101 logger.info( 102 "Done archiving " + getArchiveType().getDirectory().getPath()); 103 _archiveType.setDirectory(null); 104 _archiveType.setRSlaves(null); 105 } catch (Exception e) { 106 logger.debug("",e); 107 } 108 if(!removeArchiveHandler(this)) { 109 logger.debug("This is a serious bug, unable to remove the ArchiveHandler!"); 110 } 111 } 112 113 private static void addArchiveHandler(ArchiveHandler handler) { 114 _archiveHandlers.add(handler); 115 } 116 private static boolean removeArchiveHandler(ArchiveHandler handler) { 117 return _archiveHandlers.remove(handler); 118 } 119 120 public static Collection getArchiveHandlers() { 121 return Collections.unmodifiableCollection(_archiveHandlers); 122 } 123 } 124 | Popular Tags |