Project

General

Profile

Statistics
| Revision:

root / src / Protocols / RestoreProtocol.java @ 2

History | View | Annotate | Download (2.75 KB)

1 2 up20160340
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
}