Statistics
| Revision:

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

History | View | Annotate | Download (2.65 KB)

1
/*
2
 * Created on 01-oct-2005
3
 */
4
package org.gvsig.remoteClient.taskplanning.retrieving;
5

    
6
import java.io.BufferedOutputStream;
7
import java.io.DataOutputStream;
8
import java.io.File;
9
import java.io.FileOutputStream;
10
import java.io.IOException;
11
import java.io.InputStream;
12
import java.net.MalformedURLException;
13
import java.net.URL;
14
import java.util.Iterator;
15
import java.util.Vector;
16

    
17
import org.gvsig.remoteClient.taskplanning.IRunnableTask;
18

    
19
/**
20
 * Clase para bajar ficheros en un thread independiente.
21
 * La idea (y parte del c?digo) est? tomada de EarthFlicks
22
 * @author Luis W. Sevilla (sevilla_lui@gva.es)
23
 * @see http://today.java.net/lpt/a/212
24
 */
25
public class URLRetrieveTask  implements IRunnableTask {
26
        
27
        private boolean running, cancelled;
28
        private URLRequest request;
29
        private InputStream is;
30
        
31
        /**
32
         * 
33
         */
34
        public URLRetrieveTask(URLRequest request) {
35
                this.request = request;
36
                request.setWorker(this);
37
                running = cancelled = false;
38
        }
39
        
40

    
41
        public void execute() {
42
                request.setStatus(RetrieveEvent.NOT_STARTED);
43
                cancelled = false;
44
                running= true;
45
                
46
                long t = System.currentTimeMillis();
47
                File f = new File(request.getFileName()+System.currentTimeMillis());
48
                while (f.exists()) {
49
                        t++;
50
                        f = new File(request.getFileName()+t);
51
                }
52
                URL url;
53
                try {
54
                        request.setStatus(RetrieveEvent.CONNECTING);
55
                        
56
                        url = request.getUrl();
57
                        request.setFileName(f.getAbsolutePath());
58
                        System.out.println("downloading '"+url+"' to: "+f.getAbsolutePath());
59
                        
60
                        DataOutputStream dos = new DataOutputStream( new BufferedOutputStream(new FileOutputStream(f)));
61
                        byte[] buffer = new byte[1024*256];
62
                        is = url.openStream();
63
                        request.setStatus(RetrieveEvent.TRANSFERRING);
64
                        if (!cancelled) {
65
                                long readed = 0;
66
                                for (int i = is.read(buffer); !cancelled && i>0; i = is.read(buffer)){
67
                                        dos.write(buffer, 0, i);
68
                                        readed += i;
69
                                }
70
                                
71
                                dos.close();
72
                        }
73
                        
74
                        if (cancelled) {
75
                                // Bad incomplete file, delete it.
76
                                System.out.println("download cancelled ("+url+")");
77
                                f.delete();
78
                        }
79
                        
80
                        running = false;
81
                        if (cancelled)
82
                                request.setStatus(RetrieveEvent.REQUEST_CANCELLED);
83
                        else
84
                                request.setStatus(RetrieveEvent.REQUEST_FINISHED);
85
                        
86
                } catch (MalformedURLException e) {
87
                        e.printStackTrace();
88
                        request.setStatus(RetrieveEvent.REQUEST_FAILED);
89
                } catch (IOException e) {
90
                        e.printStackTrace();
91
                        request.setStatus(RetrieveEvent.REQUEST_FAILED);
92
                }
93
        }
94

    
95
        public void cancel() {
96
                cancelled = true;
97
                try {
98
                        if (is != null) {
99
                                is.close();
100
                                is = null;
101
                        }
102
                } catch (IOException e) {
103
                        e.printStackTrace();
104
                }
105
        }
106

    
107
        public boolean isRunning() {
108
                return running && !cancelled;
109
        }
110

    
111

    
112
        public URLRequest getRequest() {
113
                return request;
114
        }
115
}