KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > drftpd > mirroring > ArchiveType


1 /*
2  * This file is part of DrFTPD, Distributed FTP Daemon.
3  *
4  * DrFTPD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * DrFTPD is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with DrFTPD; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  */

18 package org.drftpd.mirroring;
19 import java.io.FileNotFoundException JavaDoc;
20 import java.io.IOException JavaDoc;
21 import java.util.ArrayList JavaDoc;
22 import java.util.Collection JavaDoc;
23 import java.util.HashSet JavaDoc;
24 import java.util.Iterator JavaDoc;
25 import java.util.Properties JavaDoc;
26 import java.util.Set JavaDoc;
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 /**
43  * @author zubov
44  * @version $Id: ArchiveType.java,v 1.7.2.1 2004/06/24 20:59:54 zubov Exp $
45  */

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 JavaDoc _slaveList;
53     
54     public ArchiveType(Archive archive, SectionInterface section) {
55         _parent = archive;
56         _section = section;
57         setProperties(_parent.getProperties());
58     }
59     /**
60      * Once the Jobs in the jobList have been sent, this method is called
61      * This is where files are possibly deleted from slaves
62      */

63     
64     public abstract void cleanup(ArrayList JavaDoc jobList);
65     public abstract HashSet JavaDoc findDestinationSlaves();
66
67     public final LinkedRemoteFileInterface getDirectory() {
68         return _lrf;
69     }
70     /**
71      * Returns the oldest LinkedRemoteFile(directory) that needs to be archived by this type's definition
72      * If no such directory exists, it returns null
73      */

74     public final LinkedRemoteFileInterface getOldestNonArchivedDir() {
75         if (_parent.checkExclude(getSection())) {
76             return null;
77         }
78         ArrayList JavaDoc oldDirs = new ArrayList JavaDoc();
79         for (Iterator JavaDoc 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 JavaDoc 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     /**
115      * if the file needs to be archived by this type's definition, this method returns true
116      */

117     protected abstract boolean isArchivedDir(LinkedRemoteFileInterface lrf) throws IncompleteDirectoryException, OfflineSlaveException;
118
119     public final Set JavaDoc getRSlaves() {
120         return _slaveList;
121     }
122     /**
123      * Adds relevant Jobs to the JobManager and returns an ArrayList of those Job's
124      */

125     public ArrayList JavaDoc send() {
126         return recursiveSend(getDirectory());
127     }
128
129     private ArrayList JavaDoc recursiveSend(LinkedRemoteFileInterface lrf) {
130         ArrayList JavaDoc jobQueue = new ArrayList JavaDoc();
131         JobManager jm = _parent.getConnectionManager().getJobManager();
132         for (Iterator JavaDoc 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 JavaDoc slaveSet = null;
152         if (lrf.getFiles().isEmpty())
153             return true;
154         for (Iterator JavaDoc 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 JavaDoc e) {
165                 } catch (IOException JavaDoc e) {
166                 } catch (NoAvailableSlaveException e) {
167                 }
168             }
169             else {// if (file.isFile())
170
Collection JavaDoc availableSlaves = file.getSlaves();
171                 if (slaveSet == null) {
172                     slaveSet = new HashSet JavaDoc(availableSlaves);
173                 }
174                 else {
175                     if (!(slaveSet.containsAll(availableSlaves) && availableSlaves.containsAll(slaveSet))) {
176                         return false;
177                     }
178                 }
179             }
180         }
181         if (slaveSet == null) { // no files found in directory
182
return true;
183         }
184         for (Iterator JavaDoc 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 JavaDoc properties) {
206         try {
207             _archiveAfter =
208                 60000 * Long.parseLong(FtpConfig.getProperty(properties, getSection().getName() + ".archiveAfter"));
209         } catch (NullPointerException JavaDoc 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 JavaDoc slaveList) {
220         _slaveList = slaveList;
221     }
222
223     public abstract void waitForSendOfFiles(ArrayList JavaDoc jobQueue);
224     
225     public abstract String JavaDoc toString();
226
227     protected String JavaDoc outputSlaves(Collection JavaDoc slaveList) {
228         String JavaDoc toReturn = new String JavaDoc();
229         for (Iterator JavaDoc 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