Project

General

Profile

Statistics
| Revision:

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

History | View | Annotate | Download (8.47 KB)

1 1 up20120064
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
}