Project

General

Profile

Statistics
| Revision:

root / src / Peers / Control.java @ 2

History | View | Annotate | Download (5.38 KB)

1
package Peers;
2

    
3
import Message.*;
4
import Storage.Chunk;
5

    
6
import java.io.Serializable;
7
import java.util.*;
8
import java.util.concurrent.ConcurrentHashMap;
9
import java.util.concurrent.ConcurrentSkipListSet;
10
import java.util.concurrent.TimeUnit;
11

    
12

    
13
public class Control implements Serializable {
14

    
15
    // chunkNo + fileid, nÂș of stored
16
    ConcurrentHashMap<String, Integer> storedMessages = new ConcurrentHashMap<>();
17

    
18
    //i have saved
19
    ConcurrentHashMap<String, Chunk> repDegrees = new ConcurrentHashMap<>();
20

    
21
    ConcurrentHashMap<String, ConcurrentSkipListSet<Chunk>> restoredChunks = new ConcurrentHashMap<>();
22

    
23

    
24
    ConcurrentHashMap<String, String> backedUpFiles = new ConcurrentHashMap<>();
25

    
26
    private Peer peer;
27

    
28
    Control(Peer peer) {
29
        this.peer = peer;
30
    }
31

    
32

    
33
    public void putchunkControl(Message message) {
34
        if (message.getSenderId() == peer.getId())
35
            return;
36

    
37
        try {
38

    
39
            Integer a = storedMessages.get(message.getChunkNo().toString() + ";" + message.getFileID());
40

    
41
            if (a == null)
42
                a = 0;
43

    
44
            if (a < message.getRepDegree()) {
45
                Chunk c = new Chunk(message.getChunkNo(), message.getBody(), message.getSenderId(), message.getFileID(),
46
                        message.getRepDegree());
47
                if (!peer.getStorage().saveChunk(new Chunk(message.getChunkNo(), message.getBody(),
48
                        message.getSenderId(), message.getFileID(), message.getRepDegree()), message.getFileID()))
49
                    return;
50
                repDegrees.put(message.getChunkNo().toString() + ";" + message.getFileID(), c);
51
                Message answer = new StoredMsg(message.getVersion(), peer.getId(), message.getFileID(), message.getChunkNo());
52
                peer.getMc_channel().send(answer);
53
            } else return;
54

    
55
        } catch (Exception e) {
56

    
57
         //   e.printStackTrace();
58
        }
59

    
60
    }
61

    
62
    public void getchunkControl(Message message) {
63

    
64
        if (message.getSenderId() == peer.getId()) {
65
            return;
66
        }
67

    
68

    
69
        HashMap<String, byte[]> chunksInfo = peer.getStorage().getChunks(message.getFileID());
70
        Set<String> key = chunksInfo.keySet();
71

    
72
        for (String i : key) {
73
            peer.getThreadPool().schedule(() -> {
74

    
75
                    Message ms = new ChunkMsg(message.getVersion(), peer.getId(), message.getFileID(),
76
                            Integer.parseInt(i), chunksInfo.get(i));
77

    
78
                    Chunk tmp = new Chunk(Integer.parseInt(i), chunksInfo.get(i), peer.getId(), message.getFileID());
79

    
80
                    if (!receivedChunk(message.getFileID(), tmp)) {
81
                        peer.getMdr_channel().send(ms);
82
                    }
83

    
84

    
85
            }, (long) (Math.random() * 400), TimeUnit.MILLISECONDS);
86

    
87

    
88
        }
89

    
90
    }
91

    
92
    public void chunkControl(Message message) {
93
        if (message.getSenderId() == peer.getId())
94
            return;
95

    
96
        try {
97
            Chunk c = new Chunk(message.getChunkNo(), message.getBody(), message.getSenderId(), message.getFileID());
98
            if (!receivedChunk(message.getFileID(), c)) {
99

    
100

    
101
                if (restoredChunks.get(message.getFileID()) != null) {
102
                    ConcurrentSkipListSet<Chunk> a = restoredChunks.get(message.getFileID());
103
                    a.add(c);
104
                    restoredChunks.put(message.getFileID(), a);
105

    
106
                } else {
107
                    ConcurrentSkipListSet<Chunk> b = new ConcurrentSkipListSet<Chunk>();
108
                    b.add(c);
109
                    restoredChunks.put(message.getFileID(), b);
110
                }
111
            }
112
        } catch (Exception e) {
113
            //e.printStackTrace();
114
        }
115
    }
116

    
117
    public void removedControl(Message message) {
118

    
119

    
120
    }
121

    
122
    public void deleteControl(Message message) {
123
        peer.getStorage().delete(message.getFileID());
124
        storedMessages.remove(message.getFileID());
125
        repDegrees.remove(message.getFileID());
126
    }
127

    
128

    
129
    public void storedControl(Message message) {
130
        if (message.getSenderId() == peer.getId()) {
131
            return;
132
        }
133

    
134
        String key = message.getChunkNo().toString() + ";" + message.getFileID();
135

    
136
        if (storedMessages.contains(key)) {
137
            Integer value = storedMessages.remove(key);
138
            storedMessages.put(message.getChunkNo().toString() + ";" + message.getFileID(), value + 1);
139
        } else {
140
            storedMessages.put(key, 1);
141
        }
142
    }
143

    
144
    public ConcurrentHashMap<String, Integer> getStoredMessages() {
145
        return storedMessages;
146
    }
147

    
148
    public ConcurrentHashMap<String, ConcurrentSkipListSet<Chunk>> getRestoredChunks() {
149
        return restoredChunks;
150
    }
151

    
152
    private boolean receivedChunk(String fileId, Chunk chunkNo) {
153
        if (restoredChunks.get(fileId) != null)
154
            return restoredChunks.get(fileId).contains(chunkNo);
155
        else
156
            return false;
157
    }
158

    
159
    public void reduceChunks(long reclaimed) {
160

    
161
        ArrayList<Chunk> tmpChunks = new ArrayList<>();
162
        Chunk tmpChunk;
163
        int lowestRep = 1;
164

    
165
        for (Chunk i : repDegrees.values()) {
166
            if (i.getRepDegree() >= lowestRep && i.getRepDegree() > 1) {
167
                lowestRep = i.getId();
168
                tmpChunk = i;
169
                if (i.getInfo().length >= reclaimed)
170
                    tmpChunks.add(i);
171
            }
172
        }
173

    
174

    
175
    }
176

    
177
    public ConcurrentHashMap<String, String> getBackedUpFiles() {
178
        return backedUpFiles;
179
    }
180

    
181
}