1 18 package org.drftpd.mirroring; 19 import java.io.FileNotFoundException ; 20 import java.io.IOException ; 21 import java.util.ArrayList ; 22 import java.util.Collection ; 23 import java.util.HashSet ; 24 import java.util.Iterator ; 25 import java.util.Properties ; 26 import java.util.Set ; 27 28 import org.apache.log4j.Logger; 29 import org.drftpd.mirroring.archivetypes.IncompleteDirectoryException; 30 import org.drftpd.mirroring.archivetypes.OfflineSlaveException; 31 import org.drftpd.sections.SectionInterface; 32 33 34 import net.sf.drftpd.NoAvailableSlaveException; 35 import net.sf.drftpd.event.listeners.Archive; 36 import net.sf.drftpd.master.RemoteSlave; 37 import net.sf.drftpd.master.config.FtpConfig; 38 import net.sf.drftpd.mirroring.Job; 39 import net.sf.drftpd.mirroring.JobManager; 40 import net.sf.drftpd.remotefile.LinkedRemoteFileInterface; 41 42 46 public abstract class ArchiveType { 47 private long _archiveAfter; 48 private static final Logger logger = Logger.getLogger(ArchiveType.class); 49 private LinkedRemoteFileInterface _lrf; 50 protected Archive _parent; 51 protected SectionInterface _section; 52 private Set _slaveList; 53 54 public ArchiveType(Archive archive, SectionInterface section) { 55 _parent = archive; 56 _section = section; 57 setProperties(_parent.getProperties()); 58 } 59 63 64 public abstract void cleanup(ArrayList jobList); 65 public abstract HashSet findDestinationSlaves(); 66 67 public final LinkedRemoteFileInterface getDirectory() { 68 return _lrf; 69 } 70 74 public final LinkedRemoteFileInterface getOldestNonArchivedDir() { 75 if (_parent.checkExclude(getSection())) { 76 return null; 77 } 78 ArrayList oldDirs = new ArrayList (); 79 for (Iterator iter = getSection().getFile().getFiles().iterator(); 80 iter.hasNext(); 81 ) { 82 LinkedRemoteFileInterface lrf = 83 (LinkedRemoteFileInterface) iter.next(); 84 try { 85 if(!isArchivedDir(lrf)) { 86 if (System.currentTimeMillis() - lrf.lastModified() 87 > getArchiveAfter()) { 88 oldDirs.add(lrf); 89 } 90 } 91 } catch (IncompleteDirectoryException e) { 92 continue; 93 } catch (OfflineSlaveException e) { 94 continue; 95 } 96 } 97 LinkedRemoteFileInterface oldestDir = null; 98 for (Iterator iter = oldDirs.iterator(); iter.hasNext();) { 99 LinkedRemoteFileInterface temp = 100 (LinkedRemoteFileInterface) iter.next(); 101 if (oldestDir == null) { 102 oldestDir = temp; 103 continue; 104 } 105 if (oldestDir.lastModified() > temp.lastModified()) { 106 oldestDir = temp; 107 } 108 } 109 if (oldestDir != null) 110 logger.debug(getClass().toString() + " - Returning the oldest directory " + oldestDir); 111 else logger.debug(getClass().toString() + " - Returning a null directory"); 112 return oldestDir; 113 } 114 117 protected abstract boolean isArchivedDir(LinkedRemoteFileInterface lrf) throws IncompleteDirectoryException, OfflineSlaveException; 118 119 public final Set getRSlaves() { 120 return _slaveList; 121 } 122 125 public ArrayList send() { 126 return recursiveSend(getDirectory()); 127 } 128 129 private ArrayList recursiveSend(LinkedRemoteFileInterface lrf) { 130 ArrayList jobQueue = new ArrayList (); 131 JobManager jm = _parent.getConnectionManager().getJobManager(); 132 for (Iterator iter = lrf.getFiles().iterator(); 133 iter.hasNext(); 134 ) { 135 LinkedRemoteFileInterface src = 136 (LinkedRemoteFileInterface) iter.next(); 137 if (src.isFile()) { 138 logger.info("Adding " + src.getPath() + " to the job queue"); 139 Job job = new Job(src, getRSlaves(), this, null, 3, getRSlaves().size()); 140 jm.addJob(job); 141 jobQueue.add(job); 142 } 143 else { 144 jobQueue.addAll(recursiveSend(src)); 145 } 146 } 147 return jobQueue; 148 } 149 150 public final boolean isArchivedToXSlaves(LinkedRemoteFileInterface lrf, int x) throws IncompleteDirectoryException, OfflineSlaveException { 151 HashSet slaveSet = null; 152 if (lrf.getFiles().isEmpty()) 153 return true; 154 for (Iterator iter = lrf.getFiles().iterator(); iter.hasNext();) { 155 LinkedRemoteFileInterface file = (LinkedRemoteFileInterface) iter.next(); 156 if (file.isDirectory()) { 157 if (!isArchivedToXSlaves(file,x)) 158 return false; 159 try { 160 if (!file.lookupSFVFile().getStatus().isFinished()) { 161 logger.debug(file.getPath() + " is not complete"); 162 throw new IncompleteDirectoryException(file.getPath() + " is not complete"); 163 } 164 } catch (FileNotFoundException e) { 165 } catch (IOException e) { 166 } catch (NoAvailableSlaveException e) { 167 } 168 } 169 else { Collection availableSlaves = file.getSlaves(); 171 if (slaveSet == null) { 172 slaveSet = new HashSet (availableSlaves); 173 } 174 else { 175 if (!(slaveSet.containsAll(availableSlaves) && availableSlaves.containsAll(slaveSet))) { 176 return false; 177 } 178 } 179 } 180 } 181 if (slaveSet == null) { return true; 183 } 184 for (Iterator iter = slaveSet.iterator(); iter.hasNext();) { 185 RemoteSlave rslave = (RemoteSlave) iter.next(); 186 if (!rslave.isAvailable()) { 187 throw new OfflineSlaveException(rslave.getName() + " is offline"); 188 } 189 } 190 return (slaveSet.size() == x); 191 } 192 193 public final boolean isBusy() { 194 return (getDirectory() != null); 195 } 196 197 protected final long getArchiveAfter() { 198 return _archiveAfter; 199 } 200 201 public final SectionInterface getSection() { 202 return _section; 203 } 204 205 private void setProperties(Properties properties) { 206 try { 207 _archiveAfter = 208 60000 * Long.parseLong(FtpConfig.getProperty(properties, getSection().getName() + ".archiveAfter")); 209 } catch (NullPointerException e) { 210 _archiveAfter = 211 60000 * Long.parseLong(FtpConfig.getProperty(properties, "default.archiveAfter")); 212 } 213 } 214 215 public final void setDirectory(LinkedRemoteFileInterface lrf) { 216 _lrf = lrf; 217 } 218 219 public final void setRSlaves(Set slaveList) { 220 _slaveList = slaveList; 221 } 222 223 public abstract void waitForSendOfFiles(ArrayList jobQueue); 224 225 public abstract String toString(); 226 227 protected String outputSlaves(Collection slaveList) { 228 String toReturn = new String (); 229 for (Iterator iter = slaveList.iterator(); iter.hasNext();) { 230 RemoteSlave rslave = (RemoteSlave) iter.next(); 231 toReturn = toReturn + rslave.getName(); 232 if (iter.hasNext()) 233 toReturn = toReturn + ","; 234 else return toReturn; 235 } 236 return "Empty"; 237 } 238 } | Popular Tags |