1 18 package org.drftpd.mirroring.archivetypes; 19 20 import java.io.FileInputStream ; 21 import java.io.IOException ; 22 import java.util.ArrayList ; 23 import java.util.Collection ; 24 import java.util.Collections ; 25 import java.util.HashMap ; 26 import java.util.HashSet ; 27 import java.util.Iterator ; 28 import java.util.ListIterator ; 29 import java.util.Properties ; 30 31 import net.sf.drftpd.event.listeners.Archive; 32 import net.sf.drftpd.master.RemoteSlave; 33 import net.sf.drftpd.master.config.FtpConfig; 34 import net.sf.drftpd.mirroring.Job; 35 import net.sf.drftpd.remotefile.LinkedRemoteFileInterface; 36 37 import org.apache.log4j.Logger; 38 import org.drftpd.mirroring.ArchiveType; 39 import org.drftpd.sections.SectionInterface; 40 41 45 public class FinishReleaseOnSlaves extends ArchiveType { 46 private static final Logger logger = Logger.getLogger(FinishReleaseOnSlaves.class); 47 private int _numOfSlaves = 1; 48 49 public FinishReleaseOnSlaves(Archive archive, SectionInterface section) { 50 super(archive,section); 51 Properties props = new Properties (); 52 try { 53 props.load(new FileInputStream ("conf/archive.conf")); 54 } catch (IOException e) { 55 throw new RuntimeException (e); 56 } 57 try { 58 _numOfSlaves = Integer.parseInt(FtpConfig.getProperty(props,getSection().getName() + ".numOfSlaves")); 59 } catch (NullPointerException e) { 60 _numOfSlaves = 1; 61 } 62 } 63 64 public class SlaveCount implements Comparable { 65 public int compareTo(Object o) { 66 SlaveCount count = (SlaveCount) o; 67 return getValue() - count.getValue(); 68 } 69 public SlaveCount() { 70 } 71 private int _value = 1; 72 public void addOne() { 73 _value++; 74 } 75 public int getValue() { 76 return _value; 77 } 78 79 } 80 public void findDestinationSlavesRecursive(LinkedRemoteFileInterface lrf,HashMap slaveMap) { 81 for (Iterator iter = lrf.getFiles().iterator(); iter.hasNext();) { 82 LinkedRemoteFileInterface file = null; 83 file = (LinkedRemoteFileInterface) iter.next(); 84 if (file.isDirectory()) { 85 findDestinationSlavesRecursive(file,slaveMap); 86 continue; 87 } 88 Collection tempSlaveList =file.getSlaves(); 89 for (Iterator iter2 = tempSlaveList.iterator(); iter2.hasNext();) { 90 RemoteSlave rslave = (RemoteSlave) iter2.next(); 91 if (rslave.isAvailable()) { 92 SlaveCount i = (SlaveCount) slaveMap.get(rslave); 93 if (i == null) { 94 slaveMap.put(new SlaveCount(),rslave); 95 } 96 else i.addOne(); 97 } 98 } 99 } 100 101 } 102 103 public HashSet findDestinationSlaves() { 104 HashMap slaveMap = new HashMap (); 105 findDestinationSlavesRecursive(getDirectory(),slaveMap); 106 ArrayList sorted = new ArrayList (slaveMap.keySet()); 107 Collections.sort(sorted); 108 HashSet returnMe = new HashSet (); 109 for (ListIterator iter = sorted.listIterator(); iter.hasNext();) { 110 if (iter.nextIndex()==_numOfSlaves) 111 break; 112 RemoteSlave rslave = (RemoteSlave) slaveMap.get(iter.next()); 113 returnMe.add(rslave); 114 } 115 return returnMe; 116 } 117 public void cleanup(ArrayList jobList) { 118 for (Iterator iter = jobList.iterator(); iter.hasNext();) { 119 Job job = (Job) iter.next(); 120 job.getFile().deleteOthers(getRSlaves()); 121 } 122 } 123 124 protected boolean isArchivedDir(LinkedRemoteFileInterface lrf) 125 throws IncompleteDirectoryException, OfflineSlaveException { 126 return isArchivedToXSlaves(lrf,_numOfSlaves); 127 } 128 129 public void waitForSendOfFiles(ArrayList jobQueue) { 130 while (true) { 131 for (Iterator iter = jobQueue.iterator(); iter.hasNext();) { 132 Job job = (Job) iter.next(); 133 if (job.isDone()) { 134 logger.debug( 135 "File " 136 + job.getFile().getPath() 137 + " is done being sent"); 138 iter.remove(); 139 } 140 } 141 try { 142 Thread.sleep(10000); 143 } catch (InterruptedException e) { 144 } 145 if (jobQueue.isEmpty()) { 146 break; 147 } 148 } 149 } 150 151 public String toString() { 152 return "FinishReleaseOnSlaves=[directory=[" + getDirectory().getPath() + "]dest=[" + outputSlaves(getRSlaves()) + "]]"; 153 } 154 } 155 | Popular Tags |