Project

General

Profile

Statistics
| Revision:

root / project / src / main / java / protocols / Restore.java @ 1

History | View | Annotate | Download (3.6 KB)

1 1 up20120064
package main.java.protocols;
2
3
import main.java.file.FileChunk;
4
import main.java.file.FileChunkID;
5
import main.java.file.FileID;
6
import main.java.listeners.Broker;
7
import main.java.peer.Peer;
8
9
import java.io.*;
10
import java.util.ArrayList;
11
12
import static main.java.utils.Constants.*;
13
import static main.java.utils.Utilities.*;
14
15
public class Restore implements Runnable {
16
17
    private File file;
18
19
20
    public Restore(File file) {
21
        this.file = file;
22
    }
23
24
    @Override
25
    public void run() {
26
        byte[] fileData = new byte[0];
27
28
29
        String finalName = file.getName();
30
31
        FileID fID = new FileID(sha256(file.getName()), -1);
32
        String filename = fID.toString();
33
34
35
        Peer.restoring = true;
36
37
38
39
        System.out.println("\t Restoring file: " + filename + "\n");
40
        Peer.getMDRListener().chunksReceived.put(filename, new ArrayList<>());
41
        ArrayList<FileChunk> chunks = new ArrayList<>();
42
43
        ArrayList<FileChunk> fileChunks;
44
45
        int fileParts = Peer.getDb().getNumChunksOfFile(fID);
46
47
48
49
50
        for (int i = 0; i < fileParts; i++) {
51
52
            FileChunkID chunkID = new FileChunkID(filename, i);
53
54
55
            //send get chunk
56
            Broker.sendGETCHUNK(chunkID);
57
58
            //receive chunk
59
            fileChunks = Peer.getMDRListener().chunksReceived.get(filename);
60
61
62
            FileChunk chunkAUX = fileChunks.isEmpty() ? null : Peer.getMDRListener().chunksReceived.get(filename).remove(0);
63
64
            while (chunkAUX == null) {
65
                try {
66
                    Thread.sleep(500);
67
                } catch (InterruptedException e) {
68
                    e.printStackTrace();
69
                }
70
71
                chunkAUX = fileChunks.isEmpty() ? null : Peer.getMDRListener().chunksReceived.get(filename).remove(0);
72
            }
73
74
            chunks.add(chunkAUX);
75
76
77
            //System.out.println("DATABASE : ");
78
            //Peer.getDb().printDatabase();
79
80
        }
81
82
83
84
85
        for (int i = 0; i < fileParts; i++) {
86
            FileChunk chunkTmp = null;
87
            ArrayList<FileChunk> chunkAUX = null;
88
            for(FileChunk chunk : chunks) {
89
                if(chunk.getChunkNo() == i) {
90
                    chunkTmp = chunk;
91
                    break;
92
                }
93
            }
94
95
            if(chunkTmp == null) {
96
                System.out.println("Missing chunk file!!");
97
            } else {
98
                try {
99
                    fileData = concatBytes(fileData, chunkTmp.getChunkData());
100
                } catch (IOException e) {
101
                    e.printStackTrace();
102
                    }
103
104
            }
105
106
            File dir = new File("peer"+Peer.getID()+"/restored/");
107
108
            if(!dir.exists()) {
109
                dir.mkdirs();
110
            }
111
112
            FileOutputStream out = null;
113
            try {
114
                out = new FileOutputStream("peer"+Peer.getID()+"/restored/" + finalName);
115
116
            } catch (FileNotFoundException e) {
117
                e.printStackTrace();
118
119
            }
120
            try {
121
                assert out != null;
122
                out.write(fileData);
123
124
            } catch (IOException e) {
125
                e.printStackTrace();
126
127
            }
128
            try {
129
                out.close();
130
131
            } catch (IOException e) {
132
                e.printStackTrace();
133
134
            }
135
136
137
        }
138
139
140
        Peer.restoring = false;
141
142
143
144
145
    }
146
147
    private static byte[] concatBytes(byte[] a, byte[] b) throws IOException {
148
149
150
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
151
        outputStream.write( a );
152
        outputStream.write( b );
153
154
        byte result[] = outputStream.toByteArray( );
155
156
        return result;
157
    }
158
}