Revision 5245
branches/MULTITHREADING_DEVELOPMENT/libraries/libRemoteServices/test/org/gvsig/remoteClient/taskplanning/retrieving/URLRetrieveTest.java | ||
---|---|---|
43 | 43 |
* |
44 | 44 |
* $Id$ |
45 | 45 |
* $Log$ |
46 |
* Revision 1.3 2006-05-16 17:10:27 jaume
|
|
46 |
* Revision 1.3.2.1 2006-05-17 09:21:49 jaume
|
|
47 | 47 |
* *** empty log message *** |
48 | 48 |
* |
49 |
* Revision 1.3 2006/05/16 17:10:27 jaume |
|
50 |
* *** empty log message *** |
|
51 |
* |
|
49 | 52 |
* Revision 1.2 2006/05/15 09:39:52 jaume |
50 | 53 |
* *** empty log message *** |
51 | 54 |
* |
... | ... | |
161 | 164 |
request1.setFile(page1); |
162 | 165 |
request1.setFileName(tempDirectoryPath+File.separator+"task1"); |
163 | 166 |
request1.setRequestType(URLRequest.GET); |
164 |
task1 = new URLRetrieveTask(request1, listener1);
|
|
167 |
task1 = new URLRetrieveTask(request1); |
|
165 | 168 |
|
166 | 169 |
request2 = new URLRequest(); |
167 | 170 |
// http://localhost/aegCapabilities1.3.xml |
... | ... | |
170 | 173 |
request2.setFile(page2); |
171 | 174 |
request2.setFileName(tempDirectoryPath+File.separator+"task2"); |
172 | 175 |
request2.setRequestType(URLRequest.GET); |
173 |
task2 = new URLRetrieveTask(request2, listener2);
|
|
176 |
task2 = new URLRetrieveTask(request2); |
|
174 | 177 |
|
175 | 178 |
request3 = new URLRequest(); |
176 | 179 |
// http://localhost/avalencia.ecw |
... | ... | |
179 | 182 |
request3.setFile(page3); |
180 | 183 |
request3.setFileName(tempDirectoryPath+File.separator+"task3"); |
181 | 184 |
request3.setRequestType(URLRequest.GET); |
182 |
task3 = new URLRetrieveTask(request3, listener3);
|
|
185 |
task3 = new URLRetrieveTask(request3); |
|
183 | 186 |
|
184 | 187 |
request4 = new URLRequest(); |
185 | 188 |
// http://192.168.0.223/prueba.rar |
... | ... | |
189 | 192 |
request4.setFileName(tempDirectoryPath+File.separator+"task4"); |
190 | 193 |
request4.setRequestType(URLRequest.GET); |
191 | 194 |
|
192 |
task4 = new URLRetrieveTask(request4, listener4);
|
|
195 |
task4 = new URLRetrieveTask(request4); |
|
193 | 196 |
|
194 | 197 |
} |
195 | 198 |
|
... | ... | |
235 | 238 |
finished1 = finished2 = finished3 = finished4 = false; |
236 | 239 |
System.out.println("tests to merge two or more equivalent transfers into one"); |
237 | 240 |
RequestManager manager = RequestManager.getInstance(); |
238 |
//manager.removeURLRequest(request3);
|
|
241 |
manager.removeURLRequest(request3); |
|
239 | 242 |
request3.setFileName("task3"); |
240 | 243 |
|
241 | 244 |
manager.addURLRequest(request3, listener1); |
branches/MULTITHREADING_DEVELOPMENT/libraries/libRemoteServices/src/org/gvsig/remoteClient/taskplanning/retrieving/RequestManager.java | ||
---|---|---|
5 | 5 |
|
6 | 6 |
import java.io.File; |
7 | 7 |
import java.net.MalformedURLException; |
8 |
import java.util.Hashtable;
|
|
8 |
import java.util.ArrayList;
|
|
9 | 9 |
import java.util.TreeMap; |
10 |
import java.util.Vector; |
|
10 | 11 |
|
11 | 12 |
import org.gvsig.remoteClient.taskplanning.IQueue; |
12 |
import org.gvsig.remoteClient.taskplanning.IRunnableTask; |
|
13 | 13 |
|
14 | 14 |
/** |
15 | 15 |
* pa administrar les tasques (la hist?ria aquella |
... | ... | |
33 | 33 |
public URLRetrieveTask addURLRequest(URLRequest request, RetrieveListener listener) { |
34 | 34 |
try { |
35 | 35 |
|
36 |
// TODO canviar per a quetorne el Request antic, que la request guarde el |
|
37 |
// seu estat aix? com la llista de listeners |
|
38 |
File f = getPreviousDownloadedURLRequest(request); |
|
39 | 36 |
|
40 |
if (f!=null) { |
|
41 |
// The file was already requested and it is in the cache or |
|
42 |
// the download is in process |
|
37 |
if (downloadedFiles.contains(request)) { |
|
38 |
for (int i = 0; i < downloadedFiles.size(); i++) { |
|
39 |
URLRequest r = (URLRequest) downloadedFiles.get(i); |
|
40 |
if (r.equals(request)) { |
|
41 |
request = r; |
|
42 |
break; |
|
43 |
} |
|
44 |
} |
|
43 | 45 |
|
44 |
// Overwrite the file name with the file in the cache's one. |
|
45 |
request.setFileName(f.getAbsolutePath()); |
|
46 |
System.out.println(request.getUrl()+" is cached at '"+f.getAbsolutePath()+"'"); |
|
46 |
System.out.println(request.getUrl()+" is cached at '"+request.getFileName()+"'"); |
|
47 | 47 |
|
48 |
|
|
49 |
// get this server's task queue |
|
50 |
RetrieveQueue serverQueue = (RetrieveQueue) getQueue(request.getHost()); |
|
51 |
|
|
52 |
// Look up the previous cached jobs |
|
53 |
|
|
54 |
URLRetrieveTask workingTask = serverQueue.getURLPreviousRequest(request); |
|
55 |
if (workingTask == null) { |
|
56 |
// Task already done. Notify listener |
|
57 |
if (debug) |
|
58 |
System.err.println("done job found: "+request.getUrl()); |
|
59 |
RetrieveEvent event = new RetrieveEvent(); |
|
60 |
event.setType(RetrieveEvent.REQUEST_FINISHED); |
|
61 |
listener.transferEventReceived(event); |
|
48 |
synchronized (this) { |
|
49 |
if (request.getStatus() == RetrieveEvent.REQUEST_FINISHED) { |
|
50 |
if (debug) |
|
51 |
System.err.println("done job found: "+request.getUrl()); |
|
52 |
RetrieveEvent event = new RetrieveEvent(); |
|
53 |
event.setType(RetrieveEvent.REQUEST_FINISHED); |
|
54 |
listener.transferEventReceived(event); |
|
55 |
} else if (request.getStatus() == RetrieveEvent.REQUEST_CANCELLED) { |
|
56 |
removeURLRequest(request); |
|
57 |
return addURLRequest(request, listener); |
|
58 |
} else { |
|
59 |
if (debug) |
|
60 |
System.err.println("working job found: "+request.getUrl()); |
|
61 |
request.lock(); |
|
62 |
request.addRetrieveListener(listener); |
|
63 |
request.unlock(); |
|
64 |
} |
|
62 | 65 |
|
63 |
} else { |
|
64 |
// The task is working yet, will register the listener |
|
65 |
|
|
66 |
// TODO no va b?... perqu? la cola va buidant-se molt r?pidament |
|
67 |
// per a fer que vaja tamb? hi hauria que registrar en cache |
|
68 |
// lo que s'est? baixant al principi de l'execute(); |
|
69 |
if (debug) |
|
70 |
System.err.println("working job found: "+request.getUrl()); |
|
71 |
workingTask.addRetrieveListener(listener); |
|
72 |
|
|
73 | 66 |
} |
74 | 67 |
} else { |
75 | 68 |
// Pick an unrepeatable fileName |
... | ... | |
84 | 77 |
if (fileName.startsWith(fileNamePrefix)) |
85 | 78 |
fileName = fileName.substring(fileNamePrefix.length(), fileName.length()); |
86 | 79 |
|
80 |
|
|
81 |
|
|
82 |
|
|
87 | 83 |
// get this server's task queue |
88 | 84 |
RetrieveQueue serverQueue = (RetrieveQueue) getQueue(request.getHost()); |
89 | 85 |
|
... | ... | |
91 | 87 |
fileName = fileNamePrefix + fileName; |
92 | 88 |
|
93 | 89 |
request.setFileName(fileName); |
94 |
|
|
90 |
synchronized (this) { |
|
91 |
addDownloadedURLRequest(request); |
|
92 |
} |
|
95 | 93 |
// TODO |
96 | 94 |
// jo ac? comprovaria quin protocol, m?tode, host, etc... i crearia un |
97 | 95 |
// objecte que tractara la desc?rrega segons el m?tode que li toca. |
... | ... | |
112 | 110 |
// serverQueue.put(new SMBRetrieveTask(request, listener)); |
113 | 111 |
|
114 | 112 |
// Enqueue the request and the listener will be notified when done. |
115 |
URLRetrieveTask task = new URLRetrieveTask(request, listener); |
|
113 |
request.addRetrieveListener(listener); |
|
114 |
URLRetrieveTask task = new URLRetrieveTask(request); |
|
116 | 115 |
return (URLRetrieveTask) serverQueue.put(task); |
117 | 116 |
} |
117 |
|
|
118 |
// // TODO canviar per a quetorne el Request antic, que la request guarde el |
|
119 |
// // seu estat aix? com la llista de listeners |
|
120 |
// File f = getPreviousDownloadedURLRequest(request); |
|
121 |
// |
|
122 |
// if (f!=null) { |
|
123 |
// // The file was already requested and it is in the cache or |
|
124 |
// // the download is in process |
|
125 |
// |
|
126 |
// // Overwrite the file name with the file in the cache's one. |
|
127 |
// request.setFileName(f.getAbsolutePath()); |
|
128 |
// System.out.println(request.getUrl()+" is cached at '"+f.getAbsolutePath()+"'"); |
|
129 |
// |
|
130 |
// |
|
131 |
// // get this server's task queue |
|
132 |
// RetrieveQueue serverQueue = (RetrieveQueue) getQueue(request.getHost()); |
|
133 |
// |
|
134 |
// // Look up the previous cached jobs |
|
135 |
// |
|
136 |
// URLRetrieveTask workingTask = serverQueue.getURLPreviousRequest(request); |
|
137 |
// if (workingTask == null) { |
|
138 |
// // Task already done. Notify listener |
|
139 |
// if (debug) |
|
140 |
// System.err.println("done job found: "+request.getUrl()); |
|
141 |
// RetrieveEvent event = new RetrieveEvent(); |
|
142 |
// event.setType(RetrieveEvent.REQUEST_FINISHED); |
|
143 |
// listener.transferEventReceived(event); |
|
144 |
// |
|
145 |
// } else { |
|
146 |
// // The task is working yet, will register the listener |
|
147 |
// |
|
148 |
// // TODO no va b?... perqu? la cola va buidant-se molt r?pidament |
|
149 |
// // per a fer que vaja tamb? hi hauria que registrar en cache |
|
150 |
// // lo que s'est? baixant al principi de l'execute(); |
|
151 |
// if (debug) |
|
152 |
// System.err.println("working job found: "+request.getUrl()); |
|
153 |
// workingTask.addRetrieveListener(listener); |
|
154 |
// |
|
155 |
// } |
|
156 |
// } else { |
|
157 |
// // Pick an unrepeatable fileName |
|
158 |
// String host = request.getHost(); |
|
159 |
// String fileName = request.getFileName(); |
|
160 |
// File tempDir = new File(tempDirectoryPath); |
|
161 |
// if (!tempDir.exists()) |
|
162 |
// tempDir.mkdir(); |
|
163 |
// String fileNamePrefix = tempDirectoryPath + |
|
164 |
// File.separator + host + |
|
165 |
// "-" ; |
|
166 |
// if (fileName.startsWith(fileNamePrefix)) |
|
167 |
// fileName = fileName.substring(fileNamePrefix.length(), fileName.length()); |
|
168 |
// |
|
169 |
// // get this server's task queue |
|
170 |
// RetrieveQueue serverQueue = (RetrieveQueue) getQueue(request.getHost()); |
|
171 |
// |
|
172 |
// |
|
173 |
// fileName = fileNamePrefix + fileName; |
|
174 |
// |
|
175 |
// request.setFileName(fileName); |
|
176 |
// |
|
177 |
// // TODO |
|
178 |
// // jo ac? comprovaria quin protocol, m?tode, host, etc... i crearia un |
|
179 |
// // objecte que tractara la desc?rrega segons el m?tode que li toca. |
|
180 |
// // algo en plan Strategy's |
|
181 |
// // |
|
182 |
// // per exemple si fem URLRetrieveTask una abstracta i tenim |
|
183 |
// // |
|
184 |
// // GET de tota la vida |
|
185 |
// // serverQueue.put(new HTTPGetRetrieveTask(request, listener)); |
|
186 |
// // |
|
187 |
// // POST |
|
188 |
// // serverQueue.put(new HTTPPostRetrieveTask(request, listener)); |
|
189 |
// // |
|
190 |
// // FTP |
|
191 |
// // serverQueue.put(new FTPRetrieveTask(request, listener)); |
|
192 |
// // |
|
193 |
// // ????Xarxa local????? |
|
194 |
// // serverQueue.put(new SMBRetrieveTask(request, listener)); |
|
195 |
// |
|
196 |
// // Enqueue the request and the listener will be notified when done. |
|
197 |
// URLRetrieveTask task = new URLRetrieveTask(request, listener); |
|
198 |
// return (URLRetrieveTask) serverQueue.put(task); |
|
199 |
// } |
|
118 | 200 |
} catch (MalformedURLException e) { |
119 | 201 |
e.printStackTrace(); |
120 | 202 |
} |
... | ... | |
134 | 216 |
} |
135 | 217 |
|
136 | 218 |
|
137 |
private Hashtable downloadedFiles;
|
|
219 |
private Vector downloadedFiles = new Vector();
|
|
138 | 220 |
private final String tempDirectoryPath = System.getProperty("java.io.tmpdir")+"tmp-andami"; |
139 | 221 |
/** |
140 | 222 |
* Remove an URL from the system cache. The file will remain in the file |
... | ... | |
142 | 224 |
* @param request |
143 | 225 |
*/ |
144 | 226 |
public void removeURLRequest(URLRequest request) { |
145 |
if (downloadedFiles != null && downloadedFiles.containsKey(request))
|
|
227 |
if (downloadedFiles != null && downloadedFiles.contains(request)) |
|
146 | 228 |
downloadedFiles.remove(request); |
147 | 229 |
} |
148 | 230 |
/** |
... | ... | |
153 | 235 |
* @param url |
154 | 236 |
* @param filePath |
155 | 237 |
*/ |
156 |
protected void addDownloadedURLRequest(URLRequest request, String filePath){ |
|
157 |
if (downloadedFiles==null) |
|
158 |
downloadedFiles = new Hashtable(); |
|
159 |
String fileName = (String) downloadedFiles.put(request, filePath); |
|
160 |
if (fileName!=null){ |
|
161 |
File f = new File(fileName); |
|
162 |
if (f.exists()) |
|
163 |
f.delete(); |
|
238 |
protected void addDownloadedURLRequest(URLRequest request){ |
|
239 |
if (!downloadedFiles.contains(request)) { |
|
240 |
downloadedFiles.add(request); |
|
241 |
} else { |
|
242 |
System.out.println("NOT ADDED"); |
|
164 | 243 |
} |
244 |
|
|
245 |
|
|
246 |
// |
|
247 |
// String fileName = request.getFileName(); |
|
248 |
// if (fileName!=null){ |
|
249 |
// File f = new File(fileName); |
|
250 |
// if (f.exists()) |
|
251 |
// f.delete(); |
|
252 |
// } |
|
165 | 253 |
} |
166 |
/** |
|
167 |
* Returns the content of this URL as a file from the file system.<br> |
|
168 |
* <p> |
|
169 |
* If the URL has been already downloaded in this session and notified |
|
170 |
* to the system using the static <b>Utilities.addDownloadedURL(URL)</b> |
|
171 |
* method, it can be restored faster from the file system avoiding to |
|
172 |
* download it again. |
|
173 |
* </p> |
|
174 |
* @param url |
|
175 |
* @return File containing this URL's content or null if no file was found. |
|
176 |
*/ |
|
177 |
private File getPreviousDownloadedURLRequest(URLRequest request){ |
|
178 |
File f = null; |
|
179 |
if (downloadedFiles!=null && downloadedFiles.containsKey(request)){ |
|
180 |
String filePath = (String) downloadedFiles.get(request); |
|
181 |
f = new File(filePath); |
|
182 |
} |
|
183 |
return f; |
|
184 |
} |
|
185 |
|
|
254 |
|
|
186 | 255 |
} |
branches/MULTITHREADING_DEVELOPMENT/libraries/libRemoteServices/src/org/gvsig/remoteClient/taskplanning/retrieving/URLRequest.java | ||
---|---|---|
5 | 5 |
|
6 | 6 |
import java.net.MalformedURLException; |
7 | 7 |
import java.net.URL; |
8 |
import java.util.Iterator; |
|
9 |
import java.util.Vector; |
|
8 | 10 |
|
9 | 11 |
/** |
10 | 12 |
* @author Luis W. Sevilla (sevilla_lui@gva.es) |
... | ... | |
21 | 23 |
private int port = -1; |
22 | 24 |
private String file; |
23 | 25 |
private String fileName; |
26 |
private boolean locked; |
|
27 |
private int status; |
|
28 |
private Vector listeners = new Vector(); |
|
29 |
private RetrieveEvent event = new RetrieveEvent(); |
|
24 | 30 |
|
25 | 31 |
public URL getUrl() throws MalformedURLException { |
26 | 32 |
String u = protocol; |
... | ... | |
155 | 161 |
if (this.requestType != other.requestType) return false; |
156 | 162 |
return true; |
157 | 163 |
} |
158 |
} |
|
164 |
|
|
165 |
protected void lock() { |
|
166 |
locked = true; |
|
167 |
} |
|
168 |
|
|
169 |
protected void unlock() { |
|
170 |
locked = false; |
|
171 |
} |
|
172 |
|
|
173 |
protected synchronized void setStatus(int status) { |
|
174 |
event.setType(status); |
|
175 |
fireEvent(); |
|
176 |
} |
|
177 |
|
|
178 |
protected synchronized int getStatus() { |
|
179 |
return event.getType(); |
|
180 |
} |
|
181 |
|
|
182 |
public void addRetrieveListener(RetrieveListener l) { |
|
183 |
if (l!=null) |
|
184 |
listeners.add(l); |
|
185 |
} |
|
186 |
|
|
187 |
private void fireEvent() { |
|
188 |
while (locked) { /* wait*/System.out.println("I'm locked"); } |
|
189 |
|
|
190 |
Iterator it = listeners.iterator(); |
|
191 |
while (it.hasNext()) { |
|
192 |
RetrieveListener listener = (RetrieveListener) it.next(); |
|
193 |
listener.transferEventReceived(event); |
|
194 |
} |
|
195 |
} |
|
196 |
} |
branches/MULTITHREADING_DEVELOPMENT/libraries/libRemoteServices/src/org/gvsig/remoteClient/taskplanning/retrieving/URLRetrieveTask.java | ||
---|---|---|
26 | 26 |
|
27 | 27 |
private boolean running, cancelled; |
28 | 28 |
private URLRequest request; |
29 |
private Vector listeners = new Vector(); |
|
30 |
private RetrieveEvent event = new RetrieveEvent(); |
|
31 | 29 |
private InputStream is; |
32 | 30 |
|
33 | 31 |
/** |
34 | 32 |
* |
35 | 33 |
*/ |
36 |
public URLRetrieveTask(URLRequest request, RetrieveListener listener) {
|
|
34 |
public URLRetrieveTask(URLRequest request) { |
|
37 | 35 |
this.request = request; |
38 |
addRetrieveListener(listener); |
|
39 | 36 |
running = cancelled = false; |
40 | 37 |
} |
41 | 38 |
|
42 | 39 |
|
43 | 40 |
public void execute() { |
44 |
event.setType(RetrieveEvent.NOT_STARTED); |
|
45 |
fireEvent(); |
|
41 |
request.setStatus(RetrieveEvent.NOT_STARTED); |
|
46 | 42 |
cancelled = false; |
47 | 43 |
running= true; |
48 | 44 |
|
... | ... | |
54 | 50 |
} |
55 | 51 |
URL url; |
56 | 52 |
try { |
57 |
event.setType(RetrieveEvent.CONNECTING);
|
|
58 |
fireEvent(); |
|
53 |
request.setStatus(RetrieveEvent.CONNECTING);
|
|
54 |
|
|
59 | 55 |
url = request.getUrl(); |
60 | 56 |
request.setFileName(f.getAbsolutePath()); |
61 | 57 |
System.out.println("downloading '"+url+"' to: "+f.getAbsolutePath()); |
62 | 58 |
|
63 | 59 |
DataOutputStream dos = new DataOutputStream( new BufferedOutputStream(new FileOutputStream(f))); |
64 | 60 |
byte[] buffer = new byte[1024*256]; |
65 |
fireEvent(); |
|
66 | 61 |
is = url.openStream(); |
67 |
event.setType(RetrieveEvent.TRANSFERRING); |
|
68 |
fireEvent(); |
|
62 |
request.setStatus(RetrieveEvent.TRANSFERRING); |
|
69 | 63 |
if (!cancelled) { |
70 | 64 |
long readed = 0; |
71 | 65 |
for (int i = is.read(buffer); !cancelled && i>0; i = is.read(buffer)){ |
... | ... | |
84 | 78 |
// register job in the cache |
85 | 79 |
// TODO aix? deuria d'estar al principi per a poder capturar |
86 | 80 |
// treballs que s'estan fent per? que encara no s'han acabat |
87 |
synchronized (this) { |
|
88 |
RequestManager.getInstance().addDownloadedURLRequest(request, f.getAbsolutePath());
|
|
89 |
} |
|
81 |
// synchronized (this) {
|
|
82 |
// RequestManager.getInstance().addDownloadedURLRequest(request);
|
|
83 |
// }
|
|
90 | 84 |
} |
91 | 85 |
|
92 | 86 |
running = false; |
93 | 87 |
if (cancelled) |
94 |
event.setType(RetrieveEvent.REQUEST_CANCELLED);
|
|
88 |
request.setStatus(RetrieveEvent.REQUEST_CANCELLED);
|
|
95 | 89 |
else |
96 |
event.setType(RetrieveEvent.REQUEST_FINISHED);
|
|
90 |
request.setStatus(RetrieveEvent.REQUEST_FINISHED);
|
|
97 | 91 |
|
98 | 92 |
} catch (MalformedURLException e) { |
99 | 93 |
e.printStackTrace(); |
100 |
event.setType(RetrieveEvent.REQUEST_FAILED);
|
|
94 |
request.setStatus(RetrieveEvent.REQUEST_FAILED);
|
|
101 | 95 |
} catch (IOException e) { |
102 | 96 |
e.printStackTrace(); |
103 |
event.setType(RetrieveEvent.REQUEST_FAILED);
|
|
97 |
request.setStatus(RetrieveEvent.REQUEST_FAILED);
|
|
104 | 98 |
} |
105 |
fireEvent(); |
|
106 | 99 |
} |
107 | 100 |
|
108 |
private void fireEvent() { |
|
109 |
Iterator it = listeners.iterator(); |
|
110 |
while (it.hasNext()) { |
|
111 |
RetrieveListener listener = (RetrieveListener) it.next(); |
|
112 |
listener.transferEventReceived(event); |
|
113 |
} |
|
114 |
} |
|
101 |
// private void fireEvent() {
|
|
102 |
// Iterator it = listeners.iterator();
|
|
103 |
// while (it.hasNext()) {
|
|
104 |
// RetrieveListener listener = (RetrieveListener) it.next();
|
|
105 |
// listener.transferEventReceived(event);
|
|
106 |
// }
|
|
107 |
// }
|
|
115 | 108 |
|
116 |
public void addRetrieveListener(RetrieveListener l) { |
|
117 |
if (l!=null) |
|
118 |
listeners.add(l); |
|
119 |
} |
|
120 |
|
|
121 | 109 |
public void cancel() { |
122 | 110 |
cancelled = true; |
123 | 111 |
try { |
... | ... | |
138 | 126 |
public URLRequest getRequest() { |
139 | 127 |
return request; |
140 | 128 |
} |
141 |
|
|
142 |
|
|
143 |
public Vector getListeners() { |
|
144 |
return listeners; |
|
145 |
} |
|
146 | 129 |
} |
147 | 130 |
|
148 | 131 |
|
Also available in: Unified diff