Project

General

Profile

Statistics
| Revision:

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

History | View | Annotate | Download (2.96 KB)

1 1 up20120064
package main.java.protocols;
2
3
import main.java.file.*;
4
import main.java.peer.Peer;
5
6
7
import java.io.*;
8
import java.util.Arrays;
9
10
import static main.java.utils.Constants.*;
11
import static main.java.utils.Utilities.*;
12
13
public class Backup implements Runnable{
14
15
    private File file;
16
    private int repDeg;
17
    private String encryptedID;
18
    private FileID fileID;
19
    private int fileParts;
20
    //private static Message message;
21
22
23
    public Backup(File file, int replicationDegree) {
24
25
        this.file = file;
26
        this.repDeg = replicationDegree;
27
28
    }
29
30
    /**
31
     * @param file File to split into chunks and later backed up
32
     * @return Number of chunks that the file was split into
33
     * @throws IOException exception to be thrown in case of an invalid file.
34
     */
35
    public int createChunks(File file) throws IOException {
36
37
38
        byte[] fileData = loadFileData(file);
39
40
        fileParts = fileData.length / CHUNK_MAX_SIZE;
41
42
43
        String fileName = file.getName();
44
45
        ByteArrayInputStream streamBuffer = new ByteArrayInputStream(fileData);
46
        byte[] data = new byte[CHUNK_MAX_SIZE];
47
48
49
        for(int i = 0; i <= fileParts; i++) {
50
            FileChunkID id = new FileChunkID(file.getName(), i);
51
52
53
            byte[] chunkData;
54
55
            /*
56
                Size of last chunk is always shorter than CHUNK_MAX_SIZE
57
                If the file size is a multiple of CHUNK_MAX_SIZE, the last chunk has size 0.
58
             */
59
60
            if(i == fileParts - 1 && file.length() % CHUNK_MAX_SIZE == 0) {
61
                chunkData = new byte[0];
62
            } else {
63
                int bytesRead = streamBuffer.read(data, 0, data.length);
64
                chunkData = Arrays.copyOfRange(data, 0, bytesRead);
65
            }
66
67
68
69
            fileID = new FileID(sha256(file.getName()), repDeg);
70
71
            fileID.setNumChunks(fileParts + 1);
72
73
74
            FileChunk chunk = new FileChunk(repDeg, i, fileID, chunkData);
75
76
            Thread t = new Thread(new BackupChunk(chunk));
77
            t.start();
78
79
            try {
80
                t.join();
81
            } catch (InterruptedException e) {
82
                e.printStackTrace();
83
            }
84
        }
85
        Peer.saveDBToDisk();
86
87
88
        return fileParts;
89
90
    }
91
92
93
    @Override
94
    public void run() {
95
        //String fileIDString;
96
        //fileIDString = file.getName() + file.getPath() + file.lastModified();
97
        //encryptedID = sha256(fileIDString);
98
        try {
99
            createChunks(file);
100
        } catch (IOException e) {
101
            e.printStackTrace();
102
        }
103
104
105
106
        Peer.getDb().insertFile(fileID);
107
108
109
110
111
112
113
    }
114
115
    public static byte[] loadFileData(File file) throws FileNotFoundException {
116
        FileInputStream inputStream = new FileInputStream(file);
117
        byte[] fileData = new byte[(int) file.length()];
118
119
        try {
120
            inputStream.read(fileData);
121
            inputStream.close();
122
123
        } catch (IOException e) {
124
            e.printStackTrace();
125
        }
126
127
128
129
        return fileData;
130
    }
131
132
133
134
135
136
137
}