root / src / utils / FileController.java @ 1
History | View | Annotate | Download (6.95 KB)
1 |
package utils; |
---|---|
2 |
|
3 |
import java.io.*; |
4 |
import java.nio.charset.StandardCharsets; |
5 |
import java.nio.file.FileSystems; |
6 |
import java.nio.file.Files; |
7 |
import java.nio.file.Path; |
8 |
import java.nio.file.attribute.BasicFileAttributes; |
9 |
import java.security.MessageDigest; |
10 |
import java.security.NoSuchAlgorithmException; |
11 |
import java.util.Iterator; |
12 |
import java.util.Map; |
13 |
import java.util.Set; |
14 |
|
15 |
public class FileController implements Serializable { |
16 |
private String messageType; |
17 |
private String version; |
18 |
private int senderId; //id of the server that has sent the message |
19 |
private String fileId; //metadata of file |
20 |
private byte[] body; |
21 |
|
22 |
private String hashedFileId; //hashed string with SHA256 |
23 |
|
24 |
private String chunkNo; //together with the FileId specifies a chunk in the file. |
25 |
private String replicationDeg; //up to 9 |
26 |
private int fileSize; |
27 |
|
28 |
private File file; |
29 |
private FileInputStream fileStream; |
30 |
|
31 |
public FileController(String m, String v, int s, String f, String r) throws IOException { |
32 |
this.messageType = m;
|
33 |
this.version = v;
|
34 |
this.senderId = s;
|
35 |
this.fileId = f;
|
36 |
this.replicationDeg = r;
|
37 |
} |
38 |
|
39 |
public FileController(String[] receivedArray, byte[] bodyByteArray){ |
40 |
String headerMsg = receivedArray[0]; |
41 |
String[] headerTokens = headerMsg.split("\\s+"); |
42 |
|
43 |
this.messageType = headerTokens[0]; |
44 |
this.version = headerTokens[1]; |
45 |
this.chunkNo = headerTokens[4]; |
46 |
|
47 |
this.hashedFileId = headerTokens[3]; |
48 |
if(headerTokens.length >= 6) |
49 |
this.replicationDeg = headerTokens[5]; |
50 |
else
|
51 |
this.replicationDeg = ""; |
52 |
this.senderId = Integer.parseInt(headerTokens[2]); |
53 |
|
54 |
this.body = bodyByteArray;
|
55 |
this.fileId = null; |
56 |
} |
57 |
|
58 |
public String getFileMetadata(String f) throws IOException { |
59 |
Path file = FileSystems.getDefault().getPath("test", f);
|
60 |
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class); |
61 |
|
62 |
return f + "-" + attr.lastModifiedTime() + "-" + attr.creationTime(); |
63 |
} |
64 |
|
65 |
public String getFileName(){ |
66 |
return this.fileId; |
67 |
} |
68 |
|
69 |
public void saveToDisk(int senderId, String chunckNo) throws IOException { |
70 |
System.out.println("saving to disk... || Sender ID: " + senderId + " || ChunkNo: " + chunkNo); |
71 |
File storage = new File("storage"); |
72 |
|
73 |
// if the directory does not exist, create it
|
74 |
if (!storage.exists()) {
|
75 |
System.out.println("creating directory to store chunks: " + storage.getName()); |
76 |
boolean result = false; |
77 |
|
78 |
try{
|
79 |
storage.mkdir(); |
80 |
result = true;
|
81 |
} |
82 |
catch(SecurityException se){ |
83 |
//handle it
|
84 |
} |
85 |
if(result) {
|
86 |
System.out.println("Storage Directory created"); |
87 |
} |
88 |
} |
89 |
|
90 |
//directory for backup
|
91 |
File backup = new File ("storage/Backup"); |
92 |
|
93 |
// if the directory does not exist, create it
|
94 |
if (!backup.exists()) {
|
95 |
System.out.println("creating directory to store chunks: " + backup.getName()); |
96 |
boolean result = false; |
97 |
|
98 |
try{
|
99 |
backup.mkdir(); |
100 |
result = true;
|
101 |
} |
102 |
catch(SecurityException se){ |
103 |
//handle it
|
104 |
} |
105 |
if(result) {
|
106 |
System.out.println("Backup Directory created"); |
107 |
} |
108 |
} |
109 |
//directory for peerid
|
110 |
File peerId = new File ("storage/Backup/Peer" + senderId); |
111 |
|
112 |
// if the directory does not exist, create it
|
113 |
if (!peerId.exists()) {
|
114 |
System.out.println("creating directory to store chunks: " + peerId.getName()); |
115 |
boolean result = false; |
116 |
|
117 |
try{
|
118 |
peerId.mkdir(); |
119 |
result = true;
|
120 |
} |
121 |
catch(SecurityException se){ |
122 |
//handle it
|
123 |
} |
124 |
if(result) {
|
125 |
System.out.println("PeerId Directory created"); |
126 |
} |
127 |
} |
128 |
//directory for hashed file id
|
129 |
//System.out.println(this.hashedFileId);
|
130 |
File hashedDir = new File("storage/Backup/Peer" + senderId + "/"+ this.hashedFileId); |
131 |
// if the directory does not exist, create it
|
132 |
if (!hashedDir.exists()) {
|
133 |
System.out.println("creating directory to store chunks: " + hashedDir.getName()); |
134 |
boolean result = false; |
135 |
|
136 |
try{
|
137 |
hashedDir.mkdir(); |
138 |
result = true;
|
139 |
} |
140 |
catch(SecurityException se){ |
141 |
//handle it
|
142 |
} |
143 |
if(result) {
|
144 |
System.out.println("file Directory created"); |
145 |
} |
146 |
} |
147 |
|
148 |
//now store the chunck
|
149 |
File chunk = new File("storage/Backup/Peer" + senderId + "/"+ this.hashedFileId + "/" + chunckNo); |
150 |
|
151 |
FileOutputStream fos = new FileOutputStream(chunk); |
152 |
fos.write(this.body);
|
153 |
fos.close(); |
154 |
|
155 |
|
156 |
|
157 |
|
158 |
} |
159 |
|
160 |
public void hashFileId() throws NoSuchAlgorithmException, IOException { //reference https://www.baeldung.com/sha-256-hashing-java |
161 |
//add a little more info to hash this fileId;
|
162 |
String fileIdWithMetadata = getFileMetadata(this.fileId); |
163 |
|
164 |
|
165 |
if(!Utils.hashDatabase.containsKey(this.fileId)){ |
166 |
MessageDigest digest = MessageDigest.getInstance("SHA-256"); |
167 |
byte[] encodedhash = digest.digest( |
168 |
fileIdWithMetadata.getBytes(StandardCharsets.UTF_8)); |
169 |
String hexHash = Utils.encodeHexString(encodedhash);
|
170 |
this.hashedFileId = hexHash;
|
171 |
|
172 |
Utils.hashDatabase.put(this.fileId,hexHash);
|
173 |
} |
174 |
else this.hashedFileId = Utils.hashDatabase.get(this.fileId); |
175 |
} |
176 |
|
177 |
public void openStream() throws FileNotFoundException { |
178 |
this.file = new File("test/" + getFileName()); |
179 |
this.fileStream = new FileInputStream(this.file); |
180 |
this.fileSize = ((int) this.file.length()); |
181 |
} |
182 |
|
183 |
public byte[] header(int chunkNo){ |
184 |
String header = ""; |
185 |
switch(messageType){
|
186 |
case "BACKUP": |
187 |
header = messageType + " " + version + " " + senderId + " " + hashedFileId + " " + chunkNo + " " + replicationDeg + "\r\n\r\n"; |
188 |
break;
|
189 |
case "RESTORE": |
190 |
header = messageType + " " + version + " " + senderId + " " + hashedFileId + " " + chunkNo + "\r\n\r\n"; |
191 |
break;
|
192 |
|
193 |
} |
194 |
byte[] buffer = header.getBytes(); |
195 |
return buffer;
|
196 |
} |
197 |
|
198 |
public int getSenderId() { |
199 |
return senderId;
|
200 |
} |
201 |
|
202 |
public String getHashedFileId() { |
203 |
return hashedFileId;
|
204 |
} |
205 |
|
206 |
public int getSize() { |
207 |
return fileSize;
|
208 |
} |
209 |
|
210 |
public FileInputStream getFileStream(){ |
211 |
return fileStream;
|
212 |
} |
213 |
|
214 |
public String getReplicationDeg(){ |
215 |
return replicationDeg;
|
216 |
} |
217 |
|
218 |
public String getChunkNo() { |
219 |
return chunkNo;
|
220 |
} |
221 |
|
222 |
public String getVersion() { |
223 |
return this.version; |
224 |
} |
225 |
|
226 |
public byte[] getBody(){ |
227 |
return body;
|
228 |
} |
229 |
} |