Project

General

Profile

Statistics
| Revision:

sdis1819-t7g02 / service / Cloud.java

History | View | Annotate | Download (20.8 KB)

1
package service;
2

    
3
import channels.BackupChannel;
4
import channels.ControlChannel;
5
import channels.Message;
6
import channels.MessageHeader;
7
import channels.RestoreChannel;
8
import protocols.SendChunkMessageProtocol;
9

    
10
import java.io.*;
11
import java.nio.file.Files;
12
import java.nio.file.Path;
13
import java.nio.file.Paths;
14
import java.util.*;
15
import java.util.concurrent.ConcurrentHashMap;
16
import java.util.concurrent.ConcurrentHashMap.KeySetView;
17
import java.util.concurrent.ConcurrentLinkedQueue;
18

    
19
//https://www.geeksforgeeks.org/serialization-in-java/
20

    
21
public class Cloud implements java.io.Serializable
22
{
23
        private static final long serialVersionUID = 1L;
24

    
25
        /**
26
         * stores received V and backedUp chunks
27
         * key = <fileID>
28
         */
29
        private ConcurrentHashMap<String, Chunk> storedChunks;
30

    
31
        /**
32
         * stores the number of chunks taht a file that was backed up in peer was splited into
33
         * key = <fileID>
34
         */
35
        private ConcurrentHashMap<String, Integer> numberOfFileChunks;
36

    
37
        /**
38
         * registers the peers that have stored chunks sent by this peer
39
         * key = <fileID>:<ChunkNo>
40
         */
41
        private ConcurrentHashMap<String, HashSet<Integer>> colaborativePeers;
42

    
43
        /**
44
         * stores the number of times a chunk was stored
45
         * key = <fileID>:<ChunkNo>
46
         */
47
        private ConcurrentHashMap<String, Integer> numberOfChunksConfirmations;
48

    
49
        /**
50
         * key = <fileID>:<ChunkNo>
51
         */
52
        private ConcurrentHashMap<String, Integer> chunksToRestore;
53

    
54
        /**
55
         * Holds chucks restored by restore protocol
56
         * key = <fileID>:<ChunkNo>
57
         */
58
        private ConcurrentHashMap<String, Chunk> recoveredChunks;
59

    
60
        /**
61
         * stores the number of chunks a file was splited into
62
         * key = <fileID>
63
         */
64
        private ConcurrentLinkedQueue<String> numberOfFileChunksToBeRestored;
65

    
66
        private ArrayList<FileChunker> data;
67
        private int serverID;
68
        private String protocol_version;
69
        public ControlChannel controlRoom;
70
        public BackupChannel backupCh;
71
        public RestoreChannel restoreCh;
72

    
73
        long spaceRemaining;
74

    
75

    
76
        public Cloud(String id, String version)
77
        {
78
                numberOfFileChunks = new ConcurrentHashMap<String, Integer>();
79
                storedChunks = new ConcurrentHashMap<String, Chunk>();
80
                colaborativePeers = new ConcurrentHashMap<String, HashSet<Integer>>();
81
                numberOfChunksConfirmations = new ConcurrentHashMap<String, Integer>();
82
                this.data = new ArrayList<>();
83

    
84
                this.numberOfFileChunksToBeRestored = new ConcurrentLinkedQueue<String>();
85
                this.recoveredChunks = new  ConcurrentHashMap<String, Chunk>();
86

    
87
                this.spaceRemaining = 1073741824; //1GB
88

    
89
                serverID = Integer.parseInt(id);
90
                protocol_version = version;
91
        }
92

    
93
        public synchronized boolean sendBackupMessage(Message m) {
94
                return backupCh.sendMessage(m);
95
        }
96

    
97
        public synchronized boolean sendRestoreMessage(Message m) {
98
                return restoreCh.sendMessage(m);
99
        }
100

    
101
        public Cloud getPeerTools(String id, String version) {
102
                return new Cloud(id, version);
103
        }
104

    
105
        public int getChunkCurrentRepDegree(String fileId, String chunkNo) {
106
                String key = fileId + ':' + chunkNo;
107

    
108
                if(numberOfChunksConfirmations.containsKey(key)) {
109
                        return numberOfChunksConfirmations.get(key);
110
                }
111

    
112
                return -1;
113
        }
114

    
115
        public byte[] reverseList(byte[] a) {
116
                ArrayList<Byte> aux = new ArrayList<Byte>(a.length);
117

    
118
                for(byte b : a) {
119
                        aux.add(0, b);
120
                }
121

    
122
                byte[] toReturn = new byte[a.length];
123

    
124
                int i = 0;
125

    
126
                for(byte b : aux) {
127
                        toReturn[i] = b;
128
                        i++;
129
                }
130

    
131
                return toReturn;
132
        }
133

    
134
        public boolean buildFile(String file_id, int maxchunks, String fileName) throws IOException
135
        {
136
                String restore_path = Constants.CHUNKS_DIR + this.serverID + "/restored/";
137
                String key;
138
                Chunk aux;
139
                int total = 0;
140

    
141
                checkOrCreateDirectory(restore_path);
142

    
143
                File restoredFile = new File(restore_path + fileName);
144

    
145
                restoredFile.createNewFile();
146

    
147
                FileOutputStream fos =  new FileOutputStream(restoredFile);
148

    
149
                for(int i = 0; i < maxchunks; i++)
150
                {
151
                        key = file_id + ':' + Integer.toString(i);
152
                        if(recoveredChunks.containsKey(key)) {
153
                                aux = recoveredChunks.get(key);
154

    
155
                                if(aux != null) {
156
                                        fos.write(reverseList(aux.getChunkContent()));
157
                                        total += aux.getChunkContent().length;
158
                                }
159
                                else {
160
                                        System.out.println("NULL chunk file might be corrupted");
161
                                }        
162
                        }
163
                }
164

    
165
                try
166
                {
167
                        fos.close();
168
                }
169
                catch(IOException e) {
170
                        recoveredChunks.clear();
171
                        System.out.println(e.getMessage());
172
                }
173
                
174
                recoveredChunks.clear();
175

    
176
                System.out.println("Restored file " + fileName + " with " + total + " bytes.");
177

    
178
                return false;
179
        }
180

    
181
        public ArrayList<FileChunker> getData()
182
        {
183
                return this.data;
184
        }
185

    
186
        public ConcurrentHashMap<String, Integer> getChunksToRestore()
187
        {
188
                return this.chunksToRestore;
189
        }
190

    
191
        void addFile(FileChunker fc)
192
        {
193
                this.data.add(fc);
194
        }
195

    
196

    
197
        public void addChunk(Chunk c) {
198
                String key = c.getChunkId() + ":" + c.getChunkNumber();
199
                storedChunks.put(key, c);
200
        }
201

    
202

    
203
        public void deleteChunks(FileChunker fc, ArrayList<FileChunker> fcs) 
204
        {
205

    
206
                String file_id = fc.getFileID();
207

    
208
                String path = Constants.CHUNKS_DIR + this.serverID + "/backup/" + file_id + '/';
209

    
210
                File f = new File(path);
211

    
212
                String[] entries = f.list();
213

    
214
                for(String s: entries)
215
                {
216
                        File currentFile = new File(f.getPath(), s);
217
                        currentFile.delete();
218
                }
219

    
220
                f = new File(path);
221
                f.delete();
222
        }
223

    
224
        public boolean storeRestoreChunk(Message m) {
225
                Chunk toStore = null;
226
                byte[] chunkData;
227

    
228
                try {
229
                        chunkData = m.getChunkContent();
230
                        toStore = new Chunk(Integer.parseInt(m.getHeader().getChunkNumber()), chunkData, m.getHeader().getFileId(), Integer.parseInt(m.getHeader().getDegree()));
231
                } catch (Exception e) {
232
                        System.out.println("Error in chunk: " + e.getMessage());
233
                        return false;
234
                }
235

    
236
                addToRecoveredChunks(toStore);
237

    
238
                return true;
239
        }
240

    
241
        public boolean storeChunk(Message m) {
242

    
243
                Chunk toStore = null;
244
                String filename, path;
245
                FileOutputStream out = null;
246
                File dir = null;
247
                byte[] chunkData;
248

    
249
                try {
250
                        chunkData = m.getChunkContent();
251
                        toStore = new Chunk(Integer.parseInt(m.getHeader().getChunkNumber()), chunkData, m.getHeader().getFileId(), Integer.parseInt(m.getHeader().getDegree()));
252
                } catch (Exception e) {
253
                        System.out.println("Error in chunk: " + e.getMessage());
254
                        return false;
255
                }
256

    
257
                if(toStore.getChunkContent().length > spaceRemaining) {
258
                        System.out.println("There is no available space");
259
                        return false;
260
                }
261

    
262
                this.addChunk(toStore);
263
                spaceRemaining -= toStore.getChunkSize();
264

    
265
                path = Constants.CHUNKS_DIR + this.serverID + "/backup/" + toStore.getChunkId() + "/";
266
                filename = getFileName(Integer.parseInt(toStore.getChunkNumber()));
267

    
268
                if(!doesDirExists(path)) {        
269
                        dir = new File(path);
270
                        if(!dir.mkdirs()) {
271
                                return false;
272
                        }
273
                }
274

    
275
                try {
276
                        dir = new File(path + filename);
277
                        dir.createNewFile();
278
                        out = new FileOutputStream(dir);
279
                        out.write(toStore.getChunkContent());
280
                        out.close();
281
                } catch (IOException e) {
282
                        System.out.println("Error writing file to disk: " + e.getMessage());
283
                        return false;
284
                }
285

    
286
                return true;
287
        }
288

    
289
        public boolean checkIfChunkWasRestored(String fileid, String chunknr)
290
        {
291
                return this.recoveredChunks.containsKey(fileid + ':' + chunknr);        
292
        }
293

    
294
        public void addToRecoveredChunks(Chunk c) {
295
                String key = c.getChunkId() + ":" + c.getChunkNumber();
296
                if(!recoveredChunks.containsKey(key)) {
297
                        recoveredChunks.put(key, c);
298
                }
299
        }
300

    
301
        public void registerFileChunkToRestore(String file_id, String chunknr)
302
        {
303

    
304
                if(!this.numberOfFileChunksToBeRestored.contains(file_id + ':' + chunknr))
305
                {
306
                        this.numberOfFileChunksToBeRestored.add(file_id + ':' + chunknr);
307
                }
308
        }
309

    
310
        public boolean isFileChunkRegistered(String fileId, String chunknr) {
311
                return this.numberOfFileChunksToBeRestored.contains(fileId + ':' + chunknr);
312
        }
313

    
314
        public void createDirectoryFile(FileChunker fc) throws IOException
315
        {
316
                String file_id = fc.getFileID();
317

    
318
                String path = Constants.CHUNKS_DIR + this.serverID + "/backup/" + file_id + '/';
319

    
320
                if(checkOrCreateDirectory(path) == -1)
321
                {
322
                        System.out.println("Couldn't create peer backup chunks dir for that file!");
323
                }
324

    
325
                for(int i = 0; i < fc.getChunks().size(); i++)
326
                {
327
                        int nr = i + 1;
328
                        String filename = "chk" + Integer.toString(nr);
329
                        File dir = new File(path + filename);        
330

    
331

    
332
                        dir.createNewFile();
333

    
334
                        try(FileOutputStream out = new FileOutputStream(dir))
335
                        {
336
                                out.write(fc.getChunks().get(i).getChunkContent());
337
                        }
338
                }
339
        }
340

    
341
        private static String getFileName(int chunkNumber) {
342
                return "chk" + Integer.toString(chunkNumber);
343
        }
344

    
345
        private static boolean doesDirExists(String path) {
346
                File f = new File(path);
347

    
348
                return f.exists();
349
        }
350

    
351
        public boolean checkIfPeerStoredFile(String filename) {
352
                return numberOfFileChunks.containsKey(filename);
353
        }
354

    
355
        public static int checkOrCreateDirectory(String dirName) 
356
        {
357

    
358
                File f = new File(dirName);
359

    
360
                int result = -1;
361

    
362
                if(!f.exists())
363
                {
364
                        //                        System.out.println("Creating directory " + f.getName());
365

    
366
                        try
367
                        {
368
                                f.mkdirs();
369
                                result = 1;
370
                        }
371
                        catch(SecurityException se)
372
                        {
373
                                //                                 System.err.println("Dir exception: " + se.toString());
374
                                se.printStackTrace(); 
375
                                result = -1;
376
                        }
377

    
378
                        if(result == 1)
379
                        {
380
                                //                                System.out.println("DIR " + f.getName() + " created");
381
                        }
382
                }
383
                else if(f.exists())
384
                {
385
                        //                        System.out.println("Directory already exists, proceeding");
386
                        result = 2;
387
                }
388
                else
389
                {
390
                        result = -1;
391
                }
392

    
393
                return result;
394
        }
395

    
396
        public void createControlRoom(String ip, String port) throws IOException {
397
                controlRoom = new ControlChannel(ip, port, this);
398
        }
399

    
400
        public void createBackupChannel(String ip, String port) throws IOException {
401
                backupCh = new BackupChannel(ip, port, this);
402
        }
403

    
404
        public void createRestoreChannel(String ip, String port) throws IOException {
405
                restoreCh = new RestoreChannel(ip, port, this);
406
        }
407

    
408
        public void activateChannels() {
409
                controlRoom.start();
410
                backupCh.start();
411
                restoreCh.start();
412
        }
413

    
414

    
415
        public int getID() {
416
                return serverID;
417
        }
418

    
419
        public boolean storeChunk(Chunk c)
420
        {
421
                if(!this.storedChunks.containsKey(c.getChunkId() + ":" + c.getChunkNumber())) {
422
                        addChunk(c);
423
                        spaceRemaining -= c.getChunkSize();
424
                }
425

    
426
                return true;
427
        }
428

    
429
        public String getProtocolVersion() {
430
                return protocol_version;
431
        }
432

    
433
        public ConcurrentHashMap<String, Chunk> getStoredChunks()
434
        {
435
                return this.storedChunks;
436
        }
437

    
438

    
439
        public synchronized void registerNumberOfFileChunks(String fileID, Integer NFileChunks) {
440
                System.out.println(fileID + " registered.");
441
                numberOfFileChunks.put(fileID, NFileChunks);
442
        }
443

    
444
        public synchronized boolean insertAwaitingStoreFile(MessageHeader h) {
445

    
446
                String key = h.getFileId() + ':' + h.getChunkNumber();
447
                if(numberOfFileChunks.containsKey(h.getFileId())) {
448
                        colaborativePeers.put(key, new HashSet<Integer>());
449
                        numberOfChunksConfirmations.put(key, 0);
450
                        return true;
451
                }
452
                else {
453
                        System.out.println("Cloud hasn't got " + h.getFileId() + " registered.");
454
                        return false;
455
                }
456
        }
457

    
458
        public boolean wasTheRepDegreeMatched(Chunk c) {        
459
                return c.getReplicationDegree() <= numberOfChunksConfirmations.get(c.getChunkId() + ':' + c.getChunkNumber());
460
        }
461

    
462

    
463

    
464
        public synchronized boolean intrepertStoredMessage(MessageHeader h) {
465
                String key = h.getFileId() + ':' + h.getChunkNumber();
466

    
467
                if(numberOfFileChunks.containsKey(h.getFileId())) {
468
                        if(colaborativePeers.get(key).add(Integer.parseInt(h.getSenderId()))) {
469
                                numberOfChunksConfirmations.put(key, numberOfChunksConfirmations.get(key) + 1);
470
                        }
471
                        return true;
472
                }
473
                else {
474
                        if(storedChunks.containsKey(key)) {
475
                                if(!colaborativePeers.containsKey(key)) {
476
                                        colaborativePeers.put(key, new HashSet<Integer>());
477
                                        colaborativePeers.get(key).add(getID());
478
                                }                        
479
                                colaborativePeers.get(key).add(Integer.parseInt(h.getSenderId()));
480
                                storedChunks.get(key).setActualReplicationDegree(colaborativePeers.get(key).size());
481

    
482
                                return true;
483
                        }
484
                        return false;
485
                }
486
        }
487

    
488
        public synchronized boolean deleteFile(MessageHeader h) {
489
                String fileId = h.getFileId();
490
                String path = Constants.CHUNKS_DIR + this.serverID + "/backup/" + fileId + "/";
491
                File dir = new File(path);
492
                boolean somethingDeleted = false;
493

    
494
                if(dir.isDirectory()) {
495
                        for(File f : dir.listFiles()) {
496
                                f.delete();
497
                                somethingDeleted = true;
498
                        }
499

    
500
                        if(!dir.delete()) {
501
                                System.out.println("Couldn't erase " + h.getFileId() + " from file system");
502
                                return false;
503
                        }
504
                }
505

    
506
                for(String key : storedChunks.keySet()) {
507
                        Chunk c = storedChunks.get(key);
508
                        if(c.getChunkId().equals(fileId)) {
509
                                storedChunks.remove(key);
510
                                spaceRemaining += c.getChunkSize();
511
                                somethingDeleted = true;
512
                        }
513
                }
514

    
515
                if(somethingDeleted) {
516
                        System.out.println(h.getFileId() + " erased from file system.");
517
                }
518

    
519
                return true;
520
        }
521

    
522
        public KeySetView<String, Integer> getBackedUpFileNames() {
523
                return numberOfFileChunks.keySet();
524
        }
525

    
526
        public String getPathNameFromFileId(String fileId) {
527
                if(storedChunks.containsKey(fileId + ":" + "0")) {
528
                        return storedChunks.get(fileId + ":" + "0").getFilePathName();
529
                }
530

    
531
                return null;
532
        }
533

    
534
        public int getBackedUpChunkNecessaryRepDegree(String fileId) {
535
                if(storedChunks.containsKey(fileId + ":" + "0")) {
536
                        return storedChunks.get(fileId + ":" + "0").getReplicationDegree();
537
                }
538

    
539
                return -1;
540
        }
541

    
542
        public int getBackepUpChunkPerceivedRepDegree(String fileId, int id) {
543
                if(colaborativePeers.containsKey(fileId + ":" + Integer.toString(id))) {
544
                        return colaborativePeers.get(fileId + ":" + Integer.toString(id)).size();
545
                }
546

    
547
                return 0;
548
        }
549

    
550
        public long getAvailableSpace() {
551
                return this.spaceRemaining;
552
        }
553

    
554
        public int getNumberOfStoredChunks() {
555
                return storedChunks.size();
556
        }
557

    
558
        public long getChunkSpace() {
559
                long total = 0;
560

    
561
                for(String key : storedChunks.keySet()) {
562
                        Chunk c = storedChunks.get(key);
563
                        total += c.getChunkSize();
564
                }
565

    
566
                return total;
567
        }
568

    
569
        public long getTotalSpace() {                
570
                return this.spaceRemaining + getChunkSpace();
571
        }
572

    
573
        public void setAvailableSpace(long s) {
574
                this.spaceRemaining = s-getChunkSpace();
575
        }
576

    
577
        public void sendRemovedMessage(String fileId, String chunkNumber) {
578
                String[] headerElements = new String[Constants.REMOVED_N_ARGS];
579
                MessageHeader h;
580
                headerElements[0] = Constants.REMOVED;
581
                headerElements[1] = getProtocolVersion();
582
                headerElements[2] = Integer.toString(getID());
583
                headerElements[3] = fileId;
584
                headerElements[4] = chunkNumber; 
585

    
586
                h = new MessageHeader(headerElements);
587

    
588
                controlRoom.sendHeader(h);
589
        }
590

    
591
        public void sendHeader(MessageHeader mh)
592
        {
593
                controlRoom.sendHeader(mh);
594
        }
595

    
596
        public boolean freeUpSpace(long desiredSpace) {
597

    
598
                String fileId, chunkNo, path;
599
                File file;
600

    
601
                for(String key : storedChunks.keySet()) {
602
                        Chunk c = storedChunks.get(key);
603
                        if(getChunkSpace() <= desiredSpace) {
604
                                break;
605
                        }
606

    
607
                        fileId = c.getChunkId();
608
                        chunkNo = c.getChunkNumber();
609

    
610
                        path = Constants.CHUNKS_DIR + this.serverID + "/backup/" + fileId + "/chk" + chunkNo;
611

    
612
                        file = new File(path);
613

    
614
                        if(file.delete()) {
615
                                sendRemovedMessage(fileId, chunkNo);
616
                                storedChunks.remove(key);
617
                        }
618
                }
619

    
620
                setAvailableSpace(desiredSpace);
621

    
622
                return true;
623
        }
624

    
625
        public boolean intrepertRemovedMessage(MessageHeader h) {
626
                String fileId, chunkNo, senderId, key;
627

    
628
                fileId = h.getFileId();
629
                chunkNo = h.getChunkNumber();
630
                senderId = h.getSenderId();
631
                key = fileId + ":" + chunkNo;
632

    
633
                if(checkIfPeerStoredFile(fileId)) {
634
                        if(numberOfChunksConfirmations.containsKey(key)) {
635
                                numberOfChunksConfirmations.put(key, numberOfChunksConfirmations.get(key) - 1);
636
                        }
637
                        if(this.colaborativePeers.containsKey(key)) {
638
                                this.colaborativePeers.get(key).remove(Integer.parseInt(senderId));
639
                        }                        
640
                        if(storedChunks.containsKey(key)) {
641
                                return storedChunks.get(key).getReplicationDegree() < numberOfChunksConfirmations.get(key);
642
                        }
643
                }
644

    
645
                return true;
646
        }
647

    
648
        public int getNumberOfChunks(String file_id)
649
        {
650
                if(numberOfFileChunks.containsKey(file_id)) {
651
                        return numberOfFileChunks.get(file_id);
652
                }
653

    
654
                return -1;
655
        }
656

    
657
        public Chunk getFileChunkRepDegree(String fileId, String chunkNo) {
658

    
659
                if(storedChunks.containsKey(fileId + ":" + chunkNo)) {
660
                        return storedChunks.get(fileId + ":" + chunkNo);
661
                }
662

    
663
                return null;
664
        }
665

    
666
        public void intrepertGetChunkMessage(MessageHeader header) {
667

    
668
                String key = header.getFileId() + ":" + header.getChunkNumber();
669
                Chunk toSend;
670
                SendChunkMessageProtocol p;
671

    
672
                if(storedChunks.containsKey(key)) {
673
                        System.out.println("Going to send chunk no " + header.getChunkNumber());
674
                        toSend = storedChunks.get(key);
675

    
676
                        p = new SendChunkMessageProtocol(toSend, this);
677

    
678
                        p.run();
679
                }
680
                else {
681
                        System.out.println("I dont have that chunk");
682
                }
683
        }
684

    
685

    
686
        @SuppressWarnings({ "unchecked" })
687
        public void loadFromDisk() throws IOException, Exception
688
        {        
689
                String path = Constants.DATABASE_DIR + "peer" + this.serverID + '/';
690

    
691

    
692
                String path1 = path + "storedChunks.ser";
693
                Path p = Paths.get(path1);
694
                if (Files.exists(p)) {
695
                        FileInputStream fis = new FileInputStream(path1);
696
                        ObjectInputStream ois = new ObjectInputStream(fis);
697
                        this.setStoredChunks( (ConcurrentHashMap<String, Chunk>)ois.readObject());
698
                        fis.close();
699
                        ois.close();
700
                }
701

    
702

    
703

    
704

    
705
                String path2 = path + "numberOfFileChunks.ser";
706
                Path p2 = Paths.get(path2);
707
                if (Files.exists(p2)) {
708
                        FileInputStream fis2 = new FileInputStream(path2);
709
                        ObjectInputStream ois2 = new ObjectInputStream(fis2);
710
                        this.setNumberOfFileChunks((ConcurrentHashMap<String, Integer>)ois2.readObject());
711
                        fis2.close();
712
                        ois2.close();
713
                }
714

    
715

    
716
                String path3 = path + "colaborativePeers.ser";
717
                Path p3 = Paths.get(path3);
718
                if (Files.exists(p3)) {
719
                        FileInputStream fis3 = new FileInputStream(path3);
720
                        ObjectInputStream ois3 = new ObjectInputStream(fis3);
721
                        this.setColaborativePeers((ConcurrentHashMap<String, HashSet<Integer>>)ois3.readObject());
722
                        fis3.close();
723
                        ois3.close();
724
                }
725

    
726

    
727
                String path4 = path + "numberOfChunksConfirmations.ser";
728
                Path p4 = Paths.get(path4);
729
                if (Files.exists(p4)) {
730
                        FileInputStream fis4 = new FileInputStream(path4);
731
                        ObjectInputStream ois4 = new ObjectInputStream(fis4);
732
                        this.setNumberOfChunksConfirmations((ConcurrentHashMap<String, Integer>)ois4.readObject());
733
                        fis4.close();
734
                        ois4.close();
735
                }
736

    
737

    
738
                String path5 = path + "chunksToRestore.ser";
739
                Path p5 = Paths.get(path5);
740
                if (Files.exists(p5)) {
741
                        FileInputStream fis5 = new FileInputStream(path5);
742
                        ObjectInputStream ois5 = new ObjectInputStream(fis5);
743
                        this.setChunksToRestore((ConcurrentHashMap<String, Integer>)ois5.readObject());
744
                        fis5.close();
745
                        ois5.close();
746
                }
747

    
748
                String path6 = path + "recoveredChunks.ser";
749
                Path p6 = Paths.get(path6);
750
                if (Files.exists(p6)) {
751
                        FileInputStream fis6 = new FileInputStream(path6);
752
                        ObjectInputStream ois6 = new ObjectInputStream(fis6);
753
                        this.setRecoveredChunks((ConcurrentHashMap<String, Chunk>)ois6.readObject());
754
                        fis6.close();
755
                        ois6.close();
756
                }
757

    
758
                String path7 = path + "numberOfFileChunksToBeRestored.ser";
759
                Path p7 = Paths.get(path7);
760
                if (Files.exists(p7)) {
761
                        FileInputStream fis7 = new FileInputStream(path7);
762
                        ObjectInputStream ois7 = new ObjectInputStream(fis7);
763
                        this.setNumberOfFileChunksToBeRestored((ConcurrentLinkedQueue<String>)ois7.readObject());
764
                        fis7.close();
765
                        ois7.close();
766
                }
767
        }
768

    
769
        @SuppressWarnings("resource")
770
        public synchronized void saveToDisk() throws IOException
771
        {
772
                String path = Constants.DATABASE_DIR + "peer" + this.serverID + '/';
773

    
774
                checkOrCreateDirectory(path);
775

    
776
                String path1 = path + "storedChunks.ser";
777
                FileOutputStream fos1 = new FileOutputStream(path1);
778
                ObjectOutputStream oos1 = new ObjectOutputStream(fos1);
779
                oos1.writeObject(storedChunks);
780

    
781
                String path2 = path + "numberOfFileChunks.ser";
782
                FileOutputStream fos2 = new FileOutputStream(path2);
783
                ObjectOutputStream oos2 = new ObjectOutputStream(fos2);
784
                oos2.writeObject(numberOfFileChunks);
785

    
786
                String path3 = path + "colaborativePeers.ser";
787
                FileOutputStream fos3 = new FileOutputStream(path3);
788
                ObjectOutputStream oos3 = new ObjectOutputStream(fos3);
789
                oos3.writeObject(colaborativePeers);
790

    
791
                String path4 = path + "numberOfChunksConfirmations.ser";
792
                FileOutputStream fos4 = new FileOutputStream(path4);
793
                ObjectOutputStream oos4 = new ObjectOutputStream(fos4);
794
                oos4.writeObject(numberOfChunksConfirmations);
795

    
796
                String path5 = path + "chunksToRestore.ser";
797
                FileOutputStream fos5 = new FileOutputStream(path5);
798
                ObjectOutputStream oos5 = new ObjectOutputStream(fos5);
799
                oos5.writeObject(chunksToRestore);
800

    
801
                String path6 = path + "recoveredChunks.ser";
802
                FileOutputStream fos6 = new FileOutputStream(path6);
803
                ObjectOutputStream oos6 = new ObjectOutputStream(fos6);
804
                oos6.writeObject(recoveredChunks);
805

    
806
                String path7 = path + "numberOfFileChunksToBeRestored.ser";
807
                FileOutputStream fos7 = new FileOutputStream(path7);
808
                ObjectOutputStream oos7 = new ObjectOutputStream(fos7);
809
                oos7.writeObject(numberOfFileChunksToBeRestored);
810
        }
811

    
812
        public void setStoredChunks(ConcurrentHashMap<String, Chunk> sc)
813
        {
814
                storedChunks = sc;
815
        }
816

    
817
        public void setNumberOfFileChunks(ConcurrentHashMap<String, Integer> si)
818
        {
819
                numberOfFileChunks = si;
820
        }
821

    
822
        public void setColaborativePeers(ConcurrentHashMap<String, HashSet<Integer>> sh)
823
        {
824
                colaborativePeers = sh;
825
        }
826

    
827
        public void setNumberOfChunksConfirmations(ConcurrentHashMap<String, Integer> si)
828
        {
829
                numberOfChunksConfirmations = si;
830
        }
831

    
832
        public void setChunksToRestore(ConcurrentHashMap<String, Integer> si)
833
        {
834
                chunksToRestore = si;
835
        }
836

    
837
        public void setRecoveredChunks(ConcurrentHashMap<String, Chunk> sc)
838
        {
839
                recoveredChunks = sc;
840
        }
841

    
842
        public void setNumberOfFileChunksToBeRestored(ConcurrentLinkedQueue<String> s)
843
        {
844
                numberOfFileChunksToBeRestored = s;
845
        }
846
}