Project

General

Profile

Statistics
| Revision:

root / chunk / ChunkFile.java @ 10

History | View | Annotate | Download (3.73 KB)

1
package chunk;
2

    
3

    
4

    
5
import java.io.BufferedInputStream;
6
import java.io.File;
7
import java.io.FileInputStream;
8
import java.io.IOException;
9
import java.io.Serializable;
10
import java.security.MessageDigest;
11
import java.util.HashMap;
12
import java.util.Arrays;
13
import java.math.BigInteger; 
14
import java.security.NoSuchAlgorithmException; 
15
  
16

    
17

    
18
public class ChunkFile implements Serializable {
19
    private HashMap<Integer, Chunk> chunks;
20
    private String fileId;
21
    private String filePath;
22
    private File file;
23
    private int replicationDegree;
24

    
25
    public ChunkFile(String filePath, int replicationDegree) {
26
        this.chunks = new HashMap<>();
27
        this.file = new File(filePath);
28
        this.replicationDegree = replicationDegree;
29
        generateChunks();
30
        generateFileId();
31
        // create FILE AND STORE IT IN MEMORY;
32
    }
33

    
34
    public String getFileId() {
35
        return this.fileId;
36
    }
37
    
38
    public int getReplicationDegree() {
39
        return this.replicationDegree;
40
    }
41

    
42
    public String getPath() {
43
        return this.file.toPath().toString();
44
    }
45

    
46
    public Chunk getChunk(int position) {
47
        return chunks.get(position);
48
    }
49

    
50
    public void deleteChunk(int position) {
51
        chunks.remove(position);
52
    }
53
    
54
    public HashMap<Integer,Chunk> getChunks(){
55
                    return this.chunks;
56
    }
57
    
58
    public void generateFileId() {
59
        String filename = this.file.getName();
60
        String path = String.valueOf(this.file.toPath());
61
        String owner = this.file.getParent();
62
        String modifiedDate = String.valueOf(this.file.lastModified());
63
        String totalSize = String.valueOf(this.file.getTotalSpace());
64
        String fileID = filename + '-' + path + '-' + owner + '-' + modifiedDate + '-' + totalSize;
65
        this.fileId = hashSha256(fileID);
66
    }
67

    
68
    public void generateChunks() {
69
        int chunkNr = 0;
70

    
71
        int sizeOfChunks = Global.MAX_CHUNK_SIZE;
72
        byte[] buffer = new byte[sizeOfChunks];
73

    
74
        try (FileInputStream fis = new FileInputStream(this.file);
75
             BufferedInputStream bis = new BufferedInputStream(fis)) {
76

    
77
            int bytesAmount;
78
            while ((bytesAmount = bis.read(buffer)) > 0) {
79
                byte[] body = Arrays.copyOf(buffer, bytesAmount);
80
                Chunk chunk = new Chunk(chunkNr, body, bytesAmount);
81
                this.chunks.put(chunkNr,chunk);
82
                chunkNr++;
83
                buffer = new byte[sizeOfChunks];
84
            }
85

    
86
            if (this.file.length() % Global.MAX_CHUNK_SIZE == 0) {
87
                Chunk chunk = new Chunk(chunkNr, null, 0);
88
                this.chunks.put(chunkNr,chunk);
89
            }
90

    
91
        } catch (IOException e) {
92
            e.printStackTrace();
93
        }
94
    }
95
    public String hashSha256(String unHashed) {
96
        try { 
97
  
98
            // Static getInstance method is called with hashing SHA 
99
            MessageDigest md = MessageDigest.getInstance("SHA-256"); 
100
  
101
            // digest() method called 
102
            // to calculate message digest of an input 
103
            // and return array of byte 
104
            byte[] messageDigest = md.digest(unHashed.getBytes()); 
105
  
106
            // Convert byte array into signum representation 
107
            BigInteger no = new BigInteger(1, messageDigest); 
108
  
109
            // Convert message digest into hex value 
110
            String hashtext = no.toString(16); 
111
  
112
            while (hashtext.length() < 32) { 
113
                hashtext = "0" + hashtext; 
114
            } 
115
            return hashtext; 
116
        } 
117
  
118
        // For specifying wrong message digest algorithms 
119
        catch (NoSuchAlgorithmException e) { 
120
            System.out.println("Exception thrown"
121
                               + " for incorrect algorithm: " + e); 
122
  
123
            return null; 
124
        } 
125
    }
126
}