Project

General

Profile

Statistics
| Revision:

root / src / Protocols / RestoreProtocol.java @ 2

History | View | Annotate | Download (2.75 KB)

1
package Protocols;
2

    
3
import Message.*;
4
import Peers.Peer;
5
import Storage.Chunk;
6

    
7
import java.io.ByteArrayOutputStream;
8
import java.io.IOException;
9
import java.nio.file.Files;
10
import java.nio.file.Paths;
11
import java.util.ArrayList;
12
import java.util.concurrent.TimeUnit;
13

    
14
import static Global.Globals.*;
15

    
16
public class RestoreProtocol implements Runnable {
17

    
18
    private final Peer peer;
19
    private final String file;
20

    
21

    
22
    public RestoreProtocol(Peer peer, String filepath) {
23
        this.peer = peer;
24
        this.file = filepath;
25
    }
26

    
27
    ArrayList<Message> createMessages(float size, String fileId) {
28
        ArrayList<Message> messages = new ArrayList<Message>();
29

    
30

    
31
        int chunks = (int) (size / MAX_CHUNK_SIZE);
32

    
33
        for (int i = 0; i <= chunks; i++) {
34
            Message mes = new GetChunkMsg(peer.getVersionProtocol(), peer.getId(), fileId, i);
35
            messages.add(mes);
36
        }
37

    
38
        return messages;
39
    }
40

    
41
    @Override
42
    public void run() {
43

    
44

    
45
        String[] name = file.split("/");
46

    
47
        if (!peer.getControl().getBackedUpFiles().containsKey(name[name.length - 1])) {
48
            System.out.println("wrong in ");
49
            return;
50
        }
51

    
52
        float size;
53
        try {
54
            size = Files.size(Paths.get(file));
55
        } catch (IOException e) {
56
            e.printStackTrace();
57
            System.out.println("Do not exists");
58
            return;
59
        }
60

    
61
        ArrayList<Message> messages = createMessages(size, peer.getControl().getBackedUpFiles().get(name[name.length - 1]));
62

    
63

    
64
        do {
65

    
66

    
67
            for (Message i : messages) {
68

    
69
              peer.getThreadPool().schedule(() -> {
70
                    peer.getMc_channel().send(i);
71
                }, 0, TimeUnit.MILLISECONDS);
72

    
73

    
74
            }
75

    
76
        } while (!allChanksreicived(messages));
77

    
78
        ByteArrayOutputStream my_stream = new ByteArrayOutputStream();
79
        byte[] fileInfo;
80

    
81
        try {
82
            for (Chunk i : peer.getControl().getRestoredChunks().get(messages.get(0).getFileID())) {
83
                my_stream.write(i.getInfo());
84
            }
85
            fileInfo = my_stream.toByteArray();
86
            peer.getStorage().saveFile(peer.getControl().getBackedUpFiles().get(name[name.length - 1]), fileInfo);
87
        } catch (Exception e) {
88
            e.printStackTrace();
89
        }
90

    
91
        System.out.println("Restored");
92

    
93
    }
94

    
95

    
96
    boolean allChanksreicived(ArrayList<Message> messages) {
97
        try {
98

    
99
            if (peer.getControl().getRestoredChunks().get(messages.get(0).getFileID()) == null) {
100
                return false;
101
            }
102

    
103
            return messages.size() == peer.getControl().getRestoredChunks().get(messages.get(0).getFileID()).size();
104

    
105

    
106
        } catch (Exception e) {
107
            e.printStackTrace();
108

    
109
        }
110
        return false;
111
    }
112
}