Statistics
| Revision:

svn-gvsig-desktop / branches / MULTITHREADING_DEVELOPMENT / libraries / libRemoteServices / src / org / gvsig / remoteClient / taskplanning / retrieving / RequestManager.java @ 5292

History | View | Annotate | Download (5.2 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 5262 jaume
        public URLRequest addURLRequest(URLRequest request, RetrieveListener listener) {
34 5180 jaume
                try {
35 5245 jaume
                        if (downloadedFiles.contains(request)) {
36
                                for (int i = 0; i < downloadedFiles.size(); i++) {
37
                                        URLRequest r = (URLRequest) downloadedFiles.get(i);
38
                                        if (r.equals(request)) {
39 5262 jaume
                                                System.out.println(request.getUrl()+" is cached at '"+r.getFileName()+"'");
40
                                                request.setFileName(r.getFileName()); /* Uaaah!
41
                                                                                                                           * Si no pose a?? l'event es
42
                                                                                                                           * dispara abans que haja
43
                                                                                                                           * retornat el request
44
                                                                                                                           * reasignat i confon el
45
                                                                                                                           * sufixe.
46
                                                                                                                           */
47 5245 jaume
                                                request = r;
48
                                                break;
49
                                        }
50
                                }
51 5180 jaume
52 5230 jaume
53 5245 jaume
                                synchronized (this) {
54 5262 jaume
                                        if (request.getStatus() == RetrieveEvent.REQUEST_CANCELLED ||
55
                                                request.getStatus() == RetrieveEvent.REQUEST_FAILED) {
56
                                                // The last requested URL was cancelled or it failed but now it is required again
57
                                                // so, I have to remove it and add again.
58
                                                removeURLRequest(request);
59
                                                return addURLRequest(request, listener);
60
                                        } else if (request.getStatus() == RetrieveEvent.REQUEST_FINISHED) {
61 5245 jaume
                                                if (debug)
62 5262 jaume
                                                        System.err.println("done job found ("+request.getFileName()+")");
63 5245 jaume
                                                RetrieveEvent event = new RetrieveEvent();
64 5292 jaume
                                                event.setFileName(request.getFileName());
65 5245 jaume
                                                event.setType(RetrieveEvent.REQUEST_FINISHED);
66
                                                listener.transferEventReceived(event);
67
                                        } else {
68
                                                if (debug)
69 5262 jaume
                                                        System.err.println("working job found ("+request.getFileName()+")");
70 5245 jaume
                                                request.lock();
71
                                                request.addRetrieveListener(listener);
72
                                                request.unlock();
73
                                        }
74 5230 jaume
75
                                }
76 5180 jaume
                        } else {
77
                                // Pick an unrepeatable fileName
78
                                String host = request.getHost();
79
                                String fileName = request.getFileName();
80 5230 jaume
                                File tempDir = new File(tempDirectoryPath);
81
                                if (!tempDir.exists())
82
                                        tempDir.mkdir();
83 5180 jaume
                                String fileNamePrefix = tempDirectoryPath +
84
                                                                                        File.separator + host +
85
                                                                                        "-" ;
86
                                if (fileName.startsWith(fileNamePrefix))
87
                                        fileName = fileName.substring(fileNamePrefix.length(), fileName.length());
88
89 5245 jaume
90
91
92 5230 jaume
                                // get this server's task queue
93
                                RetrieveQueue serverQueue = (RetrieveQueue) getQueue(request.getHost());
94 5180 jaume
95 5230 jaume
96 5180 jaume
                                fileName = fileNamePrefix + fileName;
97
98
                                request.setFileName(fileName);
99 5245 jaume
                                synchronized (this) {
100
                                        addDownloadedURLRequest(request);
101
                                }
102 5180 jaume
                                // TODO
103
                                // jo ac? comprovaria quin protocol, m?tode, host, etc... i crearia un
104
                                // objecte que tractara la desc?rrega segons el m?tode que li toca.
105
                                // algo en plan Strategy's
106
                                //
107
                                // per exemple si fem URLRetrieveTask una abstracta i tenim
108
                                //
109
                                // GET de tota la vida
110
                                // serverQueue.put(new HTTPGetRetrieveTask(request, listener));
111
                                //
112
                                // POST
113
                                // serverQueue.put(new HTTPPostRetrieveTask(request, listener));
114
                                //
115
                                // FTP
116
                                // serverQueue.put(new FTPRetrieveTask(request, listener));
117
                                //
118
                                // ????Xarxa local?????
119
                                // serverQueue.put(new SMBRetrieveTask(request, listener));
120
121
                                // Enqueue the request and the listener will be notified when done.
122 5245 jaume
                                request.addRetrieveListener(listener);
123
                                URLRetrieveTask task = new URLRetrieveTask(request);
124 5262 jaume
                                serverQueue.put(task);
125 5180 jaume
                        }
126
                } catch (MalformedURLException e) {
127
                        e.printStackTrace();
128
                }
129 5262 jaume
                return request;
130 5156 jaume
        }
131
132
        private IQueue getQueue(String hostName) {
133
                RetrieveQueue queue = null;
134
                if (serversTable.containsKey(hostName))
135
                        queue = (RetrieveQueue) serversTable.get(hostName);
136
                else {
137
                        // crea la cola
138
                        queue = new RetrieveQueue(hostName);
139
                        // pone la cola del server en marcha.
140
                }
141
                return queue;
142
        }
143 5180 jaume
144
145 5245 jaume
        private Vector downloadedFiles = new Vector();
146 5180 jaume
        private final String tempDirectoryPath = System.getProperty("java.io.tmpdir")+"tmp-andami";
147
        /**
148
     * Remove an URL from the system cache. The file will remain in the file
149
     * system for further eventual uses.
150
     * @param request
151
     */
152
        public void removeURLRequest(URLRequest request) {
153 5245 jaume
                if (downloadedFiles != null && downloadedFiles.contains(request))
154 5180 jaume
                        downloadedFiles.remove(request);
155
        }
156
        /**
157
     * Adds an URL to the table of downloaded files for further uses. If the URL
158
     * already exists in the table its filePath value is updated to the new one and
159
     * the old file itself is removed from the file system.
160
     *
161
     * @param url
162
     * @param filePath
163
     */
164 5246 jaume
    private void addDownloadedURLRequest(URLRequest request){
165 5245 jaume
        if (!downloadedFiles.contains(request)) {
166
                downloadedFiles.add(request);
167 5180 jaume
        }
168
    }
169 5245 jaume
170 5156 jaume
}