svn-gvsig-desktop / branches / MULTITHREADING_DEVELOPMENT / libraries / libRemoteServices / src / org / gvsig / remoteClient / taskplanning / retrieving / RequestManager.java @ 5246
History | View | Annotate | Download (4.7 KB)
1 | 5156 | jaume | /*
|
---|---|---|---|
2 | * Created on 01-oct-2005
|
||
3 | */
|
||
4 | package org.gvsig.remoteClient.taskplanning.retrieving; |
||
5 | |||
6 | 5180 | jaume | import java.io.File; |
7 | import java.net.MalformedURLException; |
||
8 | 5245 | jaume | import java.util.ArrayList; |
9 | 5156 | jaume | import java.util.TreeMap; |
10 | 5245 | jaume | import java.util.Vector; |
11 | 5156 | jaume | |
12 | import org.gvsig.remoteClient.taskplanning.IQueue; |
||
13 | |||
14 | /**
|
||
15 | * pa administrar les tasques (la hist?ria aquella
|
||
16 | * de que hi haja una cola per a cada servidor)
|
||
17 | * @author Luis W. Sevilla (sevilla_lui@gva.es)
|
||
18 | */
|
||
19 | public class RequestManager { |
||
20 | 5230 | jaume | private boolean debug = true; |
21 | 5180 | jaume | |
22 | private static RequestManager instance; |
||
23 | 5156 | jaume | private TreeMap serversTable = new TreeMap(); |
24 | 5180 | jaume | private RequestManager() {} // Avoid public instantiation |
25 | |||
26 | public static RequestManager getInstance() { |
||
27 | if (instance == null) |
||
28 | instance = new RequestManager();
|
||
29 | return instance;
|
||
30 | 5156 | jaume | } |
31 | 5180 | jaume | |
32 | |||
33 | 5230 | jaume | public URLRetrieveTask addURLRequest(URLRequest request, RetrieveListener listener) {
|
34 | 5180 | jaume | try {
|
35 | 5230 | jaume | |
36 | |||
37 | 5245 | jaume | 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 | } |
||
45 | 5180 | jaume | |
46 | 5245 | jaume | System.out.println(request.getUrl()+" is cached at '"+request.getFileName()+"'"); |
47 | 5230 | jaume | |
48 | 5245 | jaume | 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 | } |
||
65 | 5230 | jaume | |
66 | } |
||
67 | 5180 | jaume | } else {
|
68 | // Pick an unrepeatable fileName
|
||
69 | String host = request.getHost();
|
||
70 | String fileName = request.getFileName();
|
||
71 | 5230 | jaume | File tempDir = new File(tempDirectoryPath); |
72 | if (!tempDir.exists())
|
||
73 | tempDir.mkdir(); |
||
74 | 5180 | jaume | String fileNamePrefix = tempDirectoryPath +
|
75 | File.separator + host +
|
||
76 | "-" ;
|
||
77 | if (fileName.startsWith(fileNamePrefix))
|
||
78 | fileName = fileName.substring(fileNamePrefix.length(), fileName.length()); |
||
79 | |||
80 | 5245 | jaume | |
81 | |||
82 | |||
83 | 5230 | jaume | // get this server's task queue
|
84 | RetrieveQueue serverQueue = (RetrieveQueue) getQueue(request.getHost()); |
||
85 | 5180 | jaume | |
86 | 5230 | jaume | |
87 | 5180 | jaume | fileName = fileNamePrefix + fileName; |
88 | |||
89 | request.setFileName(fileName); |
||
90 | 5245 | jaume | synchronized (this) { |
91 | addDownloadedURLRequest(request); |
||
92 | } |
||
93 | 5180 | jaume | // TODO
|
94 | // jo ac? comprovaria quin protocol, m?tode, host, etc... i crearia un
|
||
95 | // objecte que tractara la desc?rrega segons el m?tode que li toca.
|
||
96 | // algo en plan Strategy's
|
||
97 | //
|
||
98 | // per exemple si fem URLRetrieveTask una abstracta i tenim
|
||
99 | //
|
||
100 | // GET de tota la vida
|
||
101 | // serverQueue.put(new HTTPGetRetrieveTask(request, listener));
|
||
102 | //
|
||
103 | // POST
|
||
104 | // serverQueue.put(new HTTPPostRetrieveTask(request, listener));
|
||
105 | //
|
||
106 | // FTP
|
||
107 | // serverQueue.put(new FTPRetrieveTask(request, listener));
|
||
108 | //
|
||
109 | // ????Xarxa local?????
|
||
110 | // serverQueue.put(new SMBRetrieveTask(request, listener));
|
||
111 | |||
112 | // Enqueue the request and the listener will be notified when done.
|
||
113 | 5245 | jaume | request.addRetrieveListener(listener); |
114 | URLRetrieveTask task = new URLRetrieveTask(request);
|
||
115 | 5230 | jaume | return (URLRetrieveTask) serverQueue.put(task);
|
116 | 5180 | jaume | } |
117 | } catch (MalformedURLException e) { |
||
118 | e.printStackTrace(); |
||
119 | } |
||
120 | 5230 | jaume | return null; |
121 | 5156 | jaume | } |
122 | |||
123 | private IQueue getQueue(String hostName) { |
||
124 | RetrieveQueue queue = null;
|
||
125 | if (serversTable.containsKey(hostName))
|
||
126 | queue = (RetrieveQueue) serversTable.get(hostName); |
||
127 | else {
|
||
128 | // crea la cola
|
||
129 | queue = new RetrieveQueue(hostName);
|
||
130 | // pone la cola del server en marcha.
|
||
131 | } |
||
132 | return queue;
|
||
133 | } |
||
134 | 5180 | jaume | |
135 | |||
136 | 5245 | jaume | private Vector downloadedFiles = new Vector(); |
137 | 5180 | jaume | private final String tempDirectoryPath = System.getProperty("java.io.tmpdir")+"tmp-andami"; |
138 | /**
|
||
139 | * Remove an URL from the system cache. The file will remain in the file
|
||
140 | * system for further eventual uses.
|
||
141 | * @param request
|
||
142 | */
|
||
143 | public void removeURLRequest(URLRequest request) { |
||
144 | 5245 | jaume | if (downloadedFiles != null && downloadedFiles.contains(request)) |
145 | 5180 | jaume | downloadedFiles.remove(request); |
146 | } |
||
147 | /**
|
||
148 | * Adds an URL to the table of downloaded files for further uses. If the URL
|
||
149 | * already exists in the table its filePath value is updated to the new one and
|
||
150 | * the old file itself is removed from the file system.
|
||
151 | *
|
||
152 | * @param url
|
||
153 | * @param filePath
|
||
154 | */
|
||
155 | 5246 | jaume | private void addDownloadedURLRequest(URLRequest request){ |
156 | 5245 | jaume | if (!downloadedFiles.contains(request)) {
|
157 | downloadedFiles.add(request); |
||
158 | 5180 | jaume | } |
159 | } |
||
160 | 5245 | jaume | |
161 | 5156 | jaume | } |