1 /*
2 * $HeadURL: $
3 * $Date: $
4 * $Revision: $
5 * $Author: $
6 *
7 * Copyright (c) 2005 MindTree Consulting Ltd.
8 *
9 * This file is part of Insight.
10 *
11 * Insight is free software: you can redistribute it and/or modify it under the
12 * terms of the GNU General Public License as published by the Free Software
13 * Foundation, either version 3 of the License, or (at your option) any later
14 * version.
15 *
16 * Insight is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
19 * Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along with
22 * Insight. If not, see <http://www.gnu.org/licenses/>.
23 */
24
25 package com.mindtree.techworks.insight.download;
26
27 import java.io.File;
28 import java.io.IOException;
29 import java.util.ArrayList;
30 import java.util.Iterator;
31 import java.util.List;
32
33 import com.mindtree.techworks.insight.InsightConstants;
34 import com.mindtree.techworks.insight.gui.Insight;
35 import com.mindtree.techworks.insight.gui.widgets.StatusBar;
36
37
38 /**
39 * TODO
40 *
41 * @author Bindul Bhowmik
42 * @version $Revision: 27 $ $Date: 2007-12-16 04:58:03 -0700 (Sun, 16 Dec 2007) $
43 */
44 public abstract class RemoteClient {
45
46 //
47 // Constants
48 //
49
50 /**
51 *
52 */
53 private static final String DOWNLOADED_FILE_EXTENSION = ".log";
54
55 //
56 // Instance variables
57 //
58
59 /**
60 * The base directory to which files are downloaded
61 */
62 protected File baseDownloadDirectory;
63
64 /**
65 * Is the instance of the client busy on an operation
66 */
67 protected boolean isBusy = false;
68
69 /**
70 * The instance of status bar used for notifications.
71 */
72 protected StatusBar statusBar;
73
74 /**
75 * The insight instance used for this class.
76 */
77 protected Insight insight;
78
79 //
80 // Constructor(s)
81 //
82
83 /**
84 * Creates an instance of the RemoteClient
85 */
86 public RemoteClient () {
87
88 statusBar = StatusBar.getInstance();
89 }
90
91 //
92 // Public methods
93 //
94
95 /**
96 * Sets the insight instance calling this class.
97 * @param insight The insight instance
98 */
99 public void setInsight(Insight insight) {
100 this.insight = insight;
101 }
102
103 /**
104 * Set the base directory to which files are downloaded.
105 *
106 * @param directoryName The name of the directory. It is created, if not
107 * present.
108 * @throws IOException If the directory cannot be created, or the path does
109 * not denote a directory or the application cannot write in
110 * this directory.
111 */
112 public void setBaseDownloadDirectory (String directoryName)
113 throws IOException {
114
115 String baseDirectoryName = directoryName;
116 if (baseDirectoryName.charAt(baseDirectoryName.length() - 1) != File.separatorChar) {
117 baseDirectoryName = baseDirectoryName + File.separator;
118 }
119 baseDownloadDirectory = new File(baseDirectoryName);
120 if (!baseDownloadDirectory.exists()) {
121 if (!baseDownloadDirectory.mkdirs()) {
122 throw new IOException(
123 "The directory does not exist and cannot be created");
124 }
125 }
126
127 if (!baseDownloadDirectory.isDirectory()
128 || !baseDownloadDirectory.canWrite()) {
129 throw new IOException(
130 "The path is not a file or the application cannot write in it");
131 }
132 }
133
134 /**
135 * Downloads a single file to the directory mentioned. Returns the name of
136 * the file downloaded.
137 *
138 * @param fileset The fileset to get host information from.
139 * @param file The file to download on the host. The actual format is client
140 * dependent.
141 * @return The Complete path to the downloaded file.
142 * @throws RemoteClientException Remote exception if the client is busy or
143 * download fails.
144 */
145 public String[] downloadFile (Fileset fileset, String file)
146 throws RemoteClientException {
147
148 if (!isBusy) {
149 setFileset(fileset);
150 statusBar.setDisplayText(1, InsightConstants.getLiteral("DOWNLOADING_FILE") + file, true);
151 String[] downloadedFile = downloadFile(file);
152 statusBar.clearDisplay(1);
153 return downloadedFile;
154 } else {
155 throw new RemoteClientException(
156 "Client busy with previous operation");
157 }
158 }
159
160 /**
161 * Downloads a list of files from the remote host. Returns the names of the
162 * files downloaded.
163 *
164 * @param fileset The fileset to get host information from.
165 * @param files The list of files to download on the host. The actual format
166 * is client dependent.
167 * @return The list of complete path to the downloaded file.
168 * @throws RemoteClientException Remote exception if the client is busy or
169 * download fails.
170 */
171 public List downloadFiles (Fileset fileset, List files)
172 throws RemoteClientException {
173
174 if (!isBusy) {
175 setFileset(fileset);
176 List downloadedFiles = new ArrayList(files.size());
177 for (Iterator iter = files.iterator(); iter.hasNext();) {
178 String file = (String) iter.next();
179 statusBar.setDisplayText(1, InsightConstants.getLiteral("DOWNLOADING_FILE") + file, true);
180 downloadedFiles = addDownloadedFiles(downloadedFiles, downloadFile(file));
181 statusBar.clearDisplay(1);
182 }
183 return downloadedFiles;
184 } else {
185 throw new RemoteClientException(
186 "Client busy with previous operation");
187 }
188
189 }
190
191 private List addDownloadedFiles(List downloadedFiles, String[] files){
192 for(int i = 0; i < files.length; i++){
193 downloadedFiles.add(files[i]);
194 }
195 return downloadedFiles;
196 }
197
198 //
199 // Abstract methods.
200 //
201
202 /**
203 * Sets the fileset. The actual implementation is client dependent, clients
204 * may extract information from the fileset. Most clients would check if the
205 * client instance created is compatible for the type of file being
206 * downloaded.
207 *
208 * @param fileset The fileset being set
209 * @throws RemoteClientException If the information is not correct or the
210 * client is incompatible for the fileset.
211 */
212 protected abstract void setFileset (Fileset fileset)
213 throws RemoteClientException;
214
215 /**
216 * Downloads a single file to the default download directory, and returns
217 * the {@link File#getAbsolutePath() complete path}of the file.
218 *
219 * @param fileName The file path and name on the remote system to download.
220 * The actual format is client dependent.
221 * @return The array of complete paths to the downloaded files.
222 * @throws RemoteClientException If the download fails.
223 */
224 /*
225 * The return type of this method is modified from String to String[]
226 * in support of wild cards.
227 */
228 protected abstract String[] downloadFile (String fileName)
229 throws RemoteClientException;
230
231 /**
232 * This method is to be called at the end of a transaction to complete any
233 * clean up operations on the connections, etc.
234 *
235 * @throws RemoteClientException If there is any exception during the
236 * cleanup.
237 */
238 protected abstract void closeConnection () throws RemoteClientException;
239
240
241 //
242 // Utility methods
243 //
244
245 /**
246 * This method creates a destination temporary file and returns it to the
247 * calling method.
248 *
249 * @see File#createTempFile(java.lang.String, java.lang.String,
250 * java.io.File) Temporary File creation
251 * @param fileName The filename which is being downloaded, part of the
252 * destination filename is generated from this.
253 * @param seperatorChar The seperator character in the path specified in the
254 * fileName passed.
255 * @return A handle to the file where the source file is to be downloaded.
256 * @throws IOException If the file cannot be downloaded.
257 */
258 protected File getDestinationFile (String fileName, char seperatorChar)
259 throws IOException {
260
261 // Get the file name only other than the directories
262 String completeFileName = fileName;
263 if (completeFileName.indexOf(seperatorChar) > -1) {
264 completeFileName = completeFileName.substring(completeFileName
265 .lastIndexOf(seperatorChar));
266 }
267
268 // Check if the file exists... or else append a number to the end.
269 File destinationFile = File.createTempFile(completeFileName,
270 DOWNLOADED_FILE_EXTENSION, baseDownloadDirectory);
271 destinationFile.deleteOnExit();
272
273 return destinationFile;
274 }
275 }