Statistics
| Revision:

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
/*
2
 * Created on 01-oct-2005
3
 */
4
package org.gvsig.remoteClient.taskplanning.retrieving;
5

    
6
import java.io.File;
7
import java.net.MalformedURLException;
8
import java.util.ArrayList;
9
import java.util.TreeMap;
10
import java.util.Vector;
11

    
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
        private boolean debug = true;
21
    
22
        private static RequestManager instance;
23
        private TreeMap serversTable = new TreeMap();
24
        private RequestManager() {} // Avoid public instantiation
25
         
26
        public static RequestManager getInstance() {
27
                if (instance == null)
28
                        instance = new RequestManager();
29
                return instance;
30
        }
31
        
32
        
33
        public URLRetrieveTask addURLRequest(URLRequest request, RetrieveListener listener) {
34
                try {
35
                        
36
                        
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
                                }
45
                                
46
                                System.out.println(request.getUrl()+" is cached at '"+request.getFileName()+"'");
47
                                
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
                                        }
65
                                        
66
                                }
67
                        } else {
68
                                // Pick an unrepeatable fileName
69
                                String host = request.getHost();
70
                                String fileName = request.getFileName();
71
                                File tempDir = new File(tempDirectoryPath);
72
                                if (!tempDir.exists())
73
                                        tempDir.mkdir();
74
                                String fileNamePrefix = tempDirectoryPath + 
75
                                                                                        File.separator + host + 
76
                                                                                        "-" ;
77
                                if (fileName.startsWith(fileNamePrefix))
78
                                        fileName = fileName.substring(fileNamePrefix.length(), fileName.length());
79
                                
80
                                
81
                                
82
                                
83
                                // get this server's task queue
84
                                RetrieveQueue serverQueue = (RetrieveQueue) getQueue(request.getHost());
85
                                
86
                                
87
                                fileName = fileNamePrefix + fileName;
88
                                
89
                                request.setFileName(fileName);
90
                                synchronized (this) {
91
                                        addDownloadedURLRequest(request);
92
                                }
93
                                // 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
                                request.addRetrieveListener(listener);
114
                                URLRetrieveTask task = new URLRetrieveTask(request);
115
                                return (URLRetrieveTask) serverQueue.put(task);
116
                        }
117
                } catch (MalformedURLException e) {
118
                        e.printStackTrace();
119
                }
120
                return null;
121
        }
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

    
135

    
136
        private Vector downloadedFiles = new Vector();
137
        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
                if (downloadedFiles != null && downloadedFiles.contains(request))
145
                        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
    private void addDownloadedURLRequest(URLRequest request){
156
        if (!downloadedFiles.contains(request)) {
157
                downloadedFiles.add(request);
158
        }
159
    }
160

    
161
}