Project

General

Profile

Statistics
| Revision:

root / project / src / main / java / database / Database.java @ 1

History | View | Annotate | Download (8.47 KB)

1
package main.java.database;
2

    
3

    
4
import main.java.file.FileChunkID;
5
import main.java.file.FileID;
6
import main.java.peer.Peer;
7

    
8
import java.io.File;
9
import java.io.Serializable;
10
import java.util.ArrayList;
11
import java.util.Iterator;
12
import java.util.List;
13
import java.util.Map;
14
import java.util.concurrent.ConcurrentHashMap;
15

    
16
public class Database implements Serializable {
17

    
18
    private static final long serialVersionUID = 1L;
19

    
20

    
21

    
22
    private ConcurrentHashMap<FileChunkID, ArrayList<Integer>> perceivedRepDeg;
23
    private ConcurrentHashMap<FileChunkID, Integer> desiredRepDeg;
24
    private List<FileID> storedFiles;
25

    
26

    
27
    public Database() {
28

    
29
        storedFiles = new ArrayList<>();
30
        perceivedRepDeg = new ConcurrentHashMap<FileChunkID, ArrayList<Integer>>();
31
        desiredRepDeg = new ConcurrentHashMap<FileChunkID, Integer>();
32
    }
33

    
34

    
35

    
36

    
37
    public synchronized void insertChunkInfo(FileID fileID, int replicationDegree, int chunkNo, int peerID) {
38
        FileChunkID id = new FileChunkID(fileID.toString(), chunkNo);
39

    
40
        perceivedRepDeg.put(id, new ArrayList<>());
41
        perceivedRepDeg.get(id).add(peerID);
42
        desiredRepDeg.put(id, replicationDegree);
43

    
44
        Peer.saveDBToDisk();
45

    
46
    }
47

    
48
    public synchronized void removeChunkInfo(FileChunkID chunkID){
49
        desiredRepDeg.remove(chunkID);
50
        perceivedRepDeg.remove(chunkID);
51
        Peer.saveDBToDisk();
52

    
53
    }
54

    
55
    public void printDatabase() {
56
        /*
57
        For each file whose backup it has initiated:
58
                The file pathname
59
                The backup service id of the file
60
                The desired replication degree
61
                    For each chunk of the file:
62
                        Its id
63
                        Its perceived replication degree
64
         */
65

    
66

    
67

    
68
        System.out.println("----------------------------------------------------");
69

    
70
        System.out.println("Printing Database Info...\n\n");
71

    
72
        if(!storedFiles.isEmpty()){
73
            System.out.println("Files I have backed up: ");
74

    
75

    
76

    
77
            for (FileID fid: storedFiles){
78

    
79
                if(fid.getNumChunks()!=-1){
80
                    System.out.println("\t id: " + fid.toString());
81
                    System.out.println("\t Desired rep degree: " + fid.getDesiredRepDeg());
82
                    System.out.println("\t Chunks: ");
83

    
84
                    Iterator<Map.Entry<FileChunkID, ArrayList<Integer>>> it = perceivedRepDeg.entrySet().iterator();
85
                    while (it.hasNext()) {
86
                        Map.Entry<FileChunkID, ArrayList<Integer>> pair = it.next();
87

    
88
                        FileChunkID cID = pair.getKey();
89

    
90
                        if(cID.getFileID().equals(fid.toString())){
91

    
92
                            ArrayList<Integer> replications = pair.getValue();
93

    
94
                            System.out.println("\t\t ChunkNo:" + cID.getChunkNumber()+ " Perceived Replication Degree:"
95
                            + replications.size());
96
                        }
97

    
98

    
99
                        it.remove(); // avoids a ConcurrentModificationException
100
                    }
101

    
102
                }
103

    
104
            }
105

    
106
            System.out.println("----------------------------------------------------");
107
            System.out.println("Chunks on my system: ");
108
            for (FileID fid: storedFiles){
109

    
110
                if(fid.getNumChunks()==-1){
111

    
112
                    Iterator<Map.Entry<FileChunkID, ArrayList<Integer>>> it = perceivedRepDeg.entrySet().iterator();
113
                    while (it.hasNext()) {
114
                        Map.Entry<FileChunkID, ArrayList<Integer>> pair = it.next();
115

    
116
                        FileChunkID cID = pair.getKey();
117

    
118
                        if(cID.getFileID().equals(fid.toString())){
119

    
120
                            ArrayList<Integer> replications = pair.getValue();
121

    
122
                            File f = new File("peer"+Peer.getID()+"/Backup/"+fid.toString().split("\\.")[0]+
123
                                    "/"+cID.toString());
124

    
125
                            System.out.println("\t\t ChunkNo:" + cID.getChunkNumber()+ " Perceived Replication Degree:"
126
                                    + replications.size() + " Size:"+ f.length());
127
                        }
128

    
129

    
130
                        it.remove(); // avoids a ConcurrentModificationException
131
                    }
132

    
133
                }
134

    
135
            }
136

    
137
            System.out.println("----------------------------------------------------");
138

    
139

    
140

    
141
        }
142

    
143
    }
144

    
145
    public synchronized void insertFile(FileID fileID) {
146

    
147
        if(!storedFiles.contains(fileID)){
148
            storedFiles.add(fileID);
149
            Peer.saveDBToDisk();
150
        }
151
        else {
152
            int i = storedFiles.indexOf(fileID);
153
            storedFiles.get(i).setNumChunks(fileID.getNumChunks());
154
        }
155

    
156
    }
157

    
158
    public synchronized void removeFile(FileID fileID){
159
        storedFiles.remove(fileID);
160

    
161
        Peer.saveDBToDisk();
162

    
163

    
164
    }
165

    
166
    public synchronized int getNumChunksOfFile(FileID fID){
167
        int index = storedFiles.indexOf(fID);
168
        if(index!=-1)
169
            return storedFiles.get(index).getNumChunks();
170
        else
171
            return -1;
172

    
173
    }
174

    
175
    public String printStoredFiles() {
176
        return "\t Stored Files: \n " +
177
                storedFiles.toString() + "\n";
178
    }
179

    
180
    public boolean isFileStored(FileID fID) {
181

    
182

    
183
        return storedFiles.contains(fID);
184
    }
185

    
186

    
187

    
188
    public List<String> getFileChunksofFileID(FileID fileID) {
189

    
190

    
191
        List<String> chunksOfFile = new ArrayList<>();
192

    
193
        printDatabase();
194
        for(FileID fid : storedFiles) {
195
            if(fid.equals(fileID)) {
196

    
197
                for (int i = 0; i < fid.getNumChunks(); i++){
198
                    chunksOfFile.add(fid + "-" + i);
199
                }
200
            }
201

    
202
        }
203

    
204
        return chunksOfFile;
205
    }
206

    
207

    
208
    public synchronized void addNewRepDegCounter(FileChunkID chunkID, Integer repDeg){
209

    
210
        if (!perceivedRepDeg.containsKey(chunkID)) {
211
            perceivedRepDeg.put(chunkID, new ArrayList<>());
212
        }
213

    
214

    
215
        if (!desiredRepDeg.containsKey(chunkID)) {
216
            desiredRepDeg.put(chunkID, repDeg);
217
        }
218

    
219
        System.out.println("SAVING DB");
220
        Peer.saveDBToDisk();
221
    }
222

    
223
    public void removeRepDegCounter(FileChunkID chunkID){
224
        perceivedRepDeg.remove(chunkID);
225
        desiredRepDeg.remove(chunkID);
226
    }
227

    
228
    public synchronized void increasePerceivedRepDeg(FileChunkID chunkID, int senderID){
229

    
230
        if(perceivedRepDeg.containsKey(chunkID)) {
231

    
232
            if (!perceivedRepDeg.get(chunkID).contains(senderID)) {
233
                perceivedRepDeg.get(chunkID).add(senderID);
234
                System.out.println("SAVING DB");
235
                //dumpPerceived();
236
                Peer.saveDBToDisk();
237
            }
238

    
239
        }
240
        else {
241
            perceivedRepDeg.put(chunkID, new ArrayList<>());
242
            perceivedRepDeg.get(chunkID).add(senderID);
243
        }
244

    
245

    
246
    }
247

    
248
    public void dumpPerceived() {
249
        System.out.println("DUMPING PERCEIVED!");
250
        for (FileChunkID name: perceivedRepDeg.keySet()){
251

    
252
            String key =name.toString();
253
            String value = perceivedRepDeg.get(name).toString();
254
            System.out.println(key + " " + value);
255

    
256
        }
257

    
258
    }
259

    
260
    public void decreasePerceivedRepDeg(FileChunkID chunkID, int senderID){
261

    
262

    
263

    
264

    
265

    
266
        if(perceivedRepDeg.containsKey(chunkID)) {
267

    
268
            if (perceivedRepDeg.get(chunkID).contains(senderID)) {
269
                System.out.println("DECRESING FROM: " + perceivedRepDeg.get(chunkID).size());
270
                perceivedRepDeg.get(chunkID).remove(senderID);
271
                if(perceivedRepDeg.get(chunkID).size()==0)
272
                    perceivedRepDeg.remove(chunkID);
273

    
274
                System.out.println("DECRESING TO: " + perceivedRepDeg.get(chunkID).size());
275
                System.out.println("SAVING DB");
276
                Peer.saveDBToDisk();
277
            }
278

    
279
        }
280
    }
281

    
282
    public int getPerceivedRepDeg(FileChunkID chunkID){
283

    
284
        //dumpPerceived();
285

    
286
        if(perceivedRepDeg.containsKey(chunkID))
287
            return perceivedRepDeg.get(chunkID).size();
288
        else
289
            return -1;
290
    }
291

    
292
    public Integer getDesiredRepDeg(FileChunkID chunkID){
293
        if(desiredRepDeg.containsKey(chunkID))
294
            return desiredRepDeg.get(chunkID);
295
        else
296
            return -1;
297
    }
298

    
299

    
300
    public synchronized FileChunkID getHighestPerceivedRepDegChunk() {
301
        FileChunkID best = null;
302
        for (FileChunkID chunkID : perceivedRepDeg.keySet()) {
303
            if (best == null || perceivedRepDeg.get(chunkID).size() > perceivedRepDeg.get(best).size())
304
                best = chunkID;
305

    
306
        }
307

    
308
        return best;
309
    }
310

    
311

    
312
}