Revision 5245

View differences:

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