001 /*
002
003 $Id: LocalFileManager.java,v 1.11 2003/04/30 20:49:46 culdesac Exp $
004
005 */
006
007 package sharpster.daemon.filemanagement;
008
009 import sharpster.daemon.SharpsterDaemon;
010 import sharpster.common.*;
011 import java.io.*;
012 import java.util.*;
013 import net.jxta.id.*;
014 /**
015 * Class responsible for the management of local files not stored in the CVS.
016 */
017
018 public class LocalFileManager {
019
020 private CVSManager cvsManager;
021
022 /**
023 * Creates an instance of the object.
024 */
025 public LocalFileManager(CVSManager cvsm) {
026 cvsManager = cvsm;
027 }
028
029 public boolean localClearDirectory(String workingDirectory) {
030 boolean res = true;
031
032 File root = new File(workingDirectory);
033 if(root == null || !root.isDirectory()) return false;
034
035 File[] fileList = root.listFiles();
036 for(int i=0;i<fileList.length;i++) {
037 if(fileList[i].isDirectory()) {
038 res = res & localClearDirectory(fileList[i].getAbsolutePath());
039 }
040 fileList[i].delete();
041 }
042
043
044 return res;
045 }
046
047 public ResponseCollection localLoadFiles(FileCollection files,
048 String workingDirectory,
049 boolean cvs) {
050 boolean binary = false;
051
052 for(int i=0;i<files.getFileCount();i++) {
053 SharedFile file = files.getFile(i);
054 try {
055 File ioFile = new File(workingDirectory,file.getFullPath());
056 if(ioFile == null || !ioFile.exists()) throw new Exception();
057
058 FileInputStream input = new FileInputStream(ioFile);
059 if(input == null) throw new Exception();
060
061 byte[] data = new byte[input.available()];
062 input.read(data,0,input.available());
063 input.close();
064
065 if(cvs) {
066 SharedFile localFile = cvsManager.translatePath(ioFile.getAbsolutePath());
067 file.setVersion(localFile.getVersion());
068 if(localFile != null) binary = localFile.getBody().isBinary();
069 }
070
071 Body body = new Body();
072 body.setData(data);
073 body.setBinary(binary);
074 file.setBody(body);
075 }
076 catch(Exception e) {
077 e.printStackTrace();
078 continue;
079 }
080 }
081
082 return new ResponseCollection();
083 }
084
085 /**
086 * Saves the specified files in the given working directory. This
087 * method stores additional information, like user and path in CVS,
088 * which exists in the <code>files</code> file collection, in a
089 * configuration file in each directory where files are saved.
090 */
091 public ResponseCollection localSaveFiles(FileCollection files,
092 String workingDirectory) {
093 for(int i=0;i<files.getFileCount();i++) {
094 try {
095 SharedFile file = files.getFile(i);
096
097 File dir = new File(workingDirectory,file.getPathInCVS());
098 if(!dir.exists()) dir.mkdirs();
099
100 File hddfile = new File(workingDirectory,file.getFullPath());
101 hddfile.createNewFile();
102
103 FileOutputStream out = new FileOutputStream(hddfile);
104 if(out != null) {
105 Body body = file.getBody();
106 byte[] data = body.getData();
107 out.write(data,0,data.length);
108 out.flush();
109 out.close();
110 }
111 else throw new Exception();
112
113 if(!ConfigManager.writeFileConfig(file,hddfile)) throw new Exception();
114 }
115 catch(Exception e) {
116 e.printStackTrace();
117 }
118 }
119
120 return new ResponseCollection();
121 }
122
123 /**
124 * Update the <code>files</code> object and inserts a file object with
125 * its filename and path in the local CVS for each file that is
126 * specified in the <code>files</code> object.
127 * This is done by reading the CVS configuration files that CVS
128 * stores in each checked out directory. The updated
129 * <code>files</code> object is returned by a
130 * <code>ResponseCollection</code>
131 */
132 public ResponseCollection translateLocalPaths(FileCollection files,
133 String workingDirectory,
134 boolean cvs) {
135 int count = files.getFileCount();
136 FileCollection newFiles = new FileCollection();
137 FileCollection missingFiles = new FileCollection();
138 FileCollection missingCVSFiles = new FileCollection();
139 ResponseCollection responseCollection = new ResponseCollection();
140
141 for(int i=0;i<count;i++) {
142 SharedFile sharpsterFile = files.getFile(i);
143 File filteredFile = new File(sharpsterFile.getFileName());
144
145 if(!filteredFile.isAbsolute()) {
146 filteredFile = new File(workingDirectory,
147 sharpsterFile.getFileName());
148 }
149
150 if(filteredFile.exists()) {
151 //the file is identified, locate it in the local hdd
152 try {
153 SharedFile file;
154 if(cvs) file = cvsManager.translatePath(filteredFile.getCanonicalPath());
155 else file = ConfigManager.translatePath(filteredFile.getCanonicalPath());
156 if(file == null) {
157 missingCVSFiles.addFile(sharpsterFile);
158 }
159 else {
160 sharpsterFile.setPathInCVS(file.getPathInCVS());
161 sharpsterFile.setFileName(file.getFileName());
162 sharpsterFile.setVersion(file.getVersion());
163 }
164 } catch(Exception e) {
165 e.printStackTrace();
166 }
167 }
168 else {
169 missingFiles.addFile(sharpsterFile);
170 continue;
171 }
172
173 /*else {
174 File parentFile = filteredFile.getParentFile();
175 File subFiles[] = parentFile.listFiles(new WildcardFilter(filteredFile.getName()));
176 if(subFiles != null) {
177 System.out.println("The file/s was located:");
178 for(int j=0;j<subFiles.length;j++) {
179 try {
180 System.out.println(subFiles[j].getCanonicalPath());
181 } catch(Exception e) {
182 }
183 }
184 }
185 }*/
186 }
187
188 if(missingFiles.getFileCount() != 0) {
189 MissingFilesResponse response = new MissingFilesResponse();
190 response.setUser("localhost"); //Should be replaced with the local users real username.
191 response.setOrigin("FileManager");
192 response.setError(true);
193 response.setLocation(FileLocation.LOCAL_HDD);
194 response.setFiles(missingFiles);
195 responseCollection.addResponse(response);
196 }
197
198 if(missingCVSFiles.getFileCount() != 0) {
199 MissingFilesResponse response = new MissingFilesResponse();
200 response.setUser("localhost"); //Should be replaces with the local users real username.
201 response.setOrigin("FileManager");
202 response.setError(true);
203 response.setLocation(FileLocation.LOCAL_CVS);
204 response.setFiles(missingCVSFiles);
205 responseCollection.addResponse(response);
206 }
207
208 return responseCollection;
209 }
210
211 /**
212 * Updates the <code>files</code> object and inserts a file object
213 * with its filename, remote owning user and path to the remote CVS
214 * for each file which is specified in the <code>files</code> object.
215 * This is done by reading the Sharpster configuration files
216 * which are stored in each directory where remote files are saved.
217 * These configuration files are saved by the
218 * <code>localSaveFiles</code> method.
219 */
220 public ResponseCollection translateRemotePaths(FileCollection files,
221 FileMap fileMap,
222 boolean recursive) {
223 ResponseCollection responses = new ResponseCollection();
224 FileCollection newFiles = new FileCollection();
225 FileCollection missingFiles = new FileCollection();
226
227 for(int i=0;i<files.getFileCount();i++) {
228 SharedFile file = files.getFile(i);
229 String filename = file.getFileName();
230 filename = filename.replaceAll("\\x2A",")[^(/)]*(");
231 filename = "(" + filename + ")";
232
233 LinkedList paths = fileMap.getAllPaths(filename);
234
235 if(paths.size() == 0) {
236 missingFiles.addFile(file);
237 continue;
238 }
239 else if(paths.size() == 1) {
240 String str = (String)paths.get(0);
241 ID id = fileMap.getID(str);
242 if(str.equals(file.getFileName())) {
243 if(fileMap.isDirectory(id)) {
244 LinkedList newPaths = fileMap.getAllPaths("("+str+"/).*");
245 paths.clear();
246 paths.addAll(newPaths);
247 }
248 }
249 }
250
251 ListIterator iter = paths.listIterator();
252 while(iter.hasNext()) {
253 String str = (String)iter.next();
254 ID id = fileMap.getID(str);
255
256 if(!fileMap.isDirectory(id)) {
257 SharedFile newFile = new SharedFile(file);
258 int index = str.lastIndexOf('/');
259 String fp = str.substring(0,index);
260 String fn = str.substring(index+1,str.length());
261 newFile.setFileName(fn);
262 newFile.setPathInCVS(fp);
263 newFiles.addFile(newFile);
264 }
265 }
266 }
267
268 if(missingFiles.getFileCount() > 0) {
269 MissingFilesResponse resp = new MissingFilesResponse();
270 resp.setOrigin("FileManagement");
271 resp.setUser(SharpsterDaemon.getPeerName());
272 resp.setError(true);
273 resp.setLocation(FileLocation.REMOTE_CVS);
274 resp.setFiles(missingFiles);
275 responses.addResponse(resp);
276 }
277
278 files.removeAllFiles();
279 files.appendCollection(newFiles);
280
281 return responses;
282 }
283
284 /**
285 * Verifies that the given <code>files</code> exists.
286 */
287 public ResponseCollection checkFilesExistence(FileCollection files) {
288 return new ResponseCollection();
289 }
290 }