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