root / DistributedBackupService / src / server / Peer.java
History | View | Annotate | Download (4.46 KB)
1 |
package server; |
---|---|
2 |
|
3 |
import protocols.BackupChunk; |
4 |
import protocols.DeleteChunk; |
5 |
import sockets.Socket; |
6 |
import sockets.MultiCastSocket; |
7 |
import sockets.MDBSocket; |
8 |
import sockets.MDRSocket; |
9 |
import sockets.Socket.SocketType; |
10 |
import utils.Utils; |
11 |
|
12 |
import java.io.File; |
13 |
import java.io.FileNotFoundException; |
14 |
import java.io.IOException; |
15 |
import java.rmi.registry.LocateRegistry; |
16 |
import java.rmi.registry.Registry; |
17 |
import java.rmi.server.UnicastRemoteObject; |
18 |
import java.util.HashMap; |
19 |
import java.util.Map; |
20 |
import java.util.concurrent.*; |
21 |
|
22 |
import chunk.*; |
23 |
import handlers.Handler; |
24 |
import handlers.Message; |
25 |
|
26 |
|
27 |
public class Peer implements InitiatorPeer { |
28 |
|
29 |
private int id; |
30 |
private Handler handler; |
31 |
private ScheduledExecutorService agent; |
32 |
private Map<SocketType, Socket> sockets; |
33 |
private FolderManager folderManager;
|
34 |
private FileManager fileManager;
|
35 |
|
36 |
private Chunk peerInformation;
|
37 |
|
38 |
private MultiCastSocket mc;
|
39 |
private MDRSocket mdr;
|
40 |
private MDBSocket mdb;
|
41 |
|
42 |
public Peer(int id, String[] MC, String[] MDB, String[] MDR) throws IOException, ClassNotFoundException { |
43 |
this.id = id;
|
44 |
folderManager = new FolderManager(this, 8000000); //8000000 = size of maximum memory (8MB) |
45 |
fileManager = folderManager.getDatabase(); |
46 |
|
47 |
String mcAddr = MC[0]; |
48 |
String mcPort = MC[1]; |
49 |
|
50 |
String mdbAddr = MDB[0]; |
51 |
String mdbPort = MDB[1]; |
52 |
|
53 |
String mdrAddr = MDR[0]; |
54 |
String mdrPort = MDR[1]; |
55 |
|
56 |
mc= new MultiCastSocket(this, mcAddr, mcPort); |
57 |
mdb= new MDBSocket(this, mdbAddr, mdbPort); |
58 |
mdr= new MDRSocket(this, mdrAddr, mdrPort); |
59 |
|
60 |
new Thread(mc).start(); |
61 |
new Thread(mdb).start(); |
62 |
new Thread(mdr).start(); |
63 |
|
64 |
sockets = new HashMap<>(); |
65 |
sockets.put(SocketType.MC, mc); |
66 |
sockets.put(SocketType.MDB, mdb); |
67 |
sockets.put(SocketType.MDR, mdr); |
68 |
|
69 |
peerInformation = new Chunk();
|
70 |
handler = new Handler(this); |
71 |
new Thread(handler).start(); |
72 |
|
73 |
agent = new ScheduledThreadPoolExecutor(10); |
74 |
|
75 |
System.out.println("Peer " + id + " is alive!"); |
76 |
} |
77 |
|
78 |
public static void main(String args[]) { |
79 |
|
80 |
String[] mc = args[1].split(":"); |
81 |
String[] mdb = args[2].split(":"); |
82 |
String[] mdr = args[3].split(":"); |
83 |
|
84 |
System.setProperty("java.net.preferIPv4Stack", "true"); // Flag needed for systems that use IPv6 by default |
85 |
|
86 |
try {
|
87 |
Peer peer = new Peer(Integer.parseInt(args[0]), mc, mdb, mdr); |
88 |
InitiatorPeer initiatorPeer = (InitiatorPeer) UnicastRemoteObject.exportObject(peer, 0); |
89 |
|
90 |
Registry registry = LocateRegistry.getRegistry(); |
91 |
registry.rebind(args[0], initiatorPeer);
|
92 |
|
93 |
System.out.println("Peer ready!"); |
94 |
} catch (Exception e) { |
95 |
e.printStackTrace(); |
96 |
} |
97 |
} |
98 |
|
99 |
public int getID() { |
100 |
return id;
|
101 |
} |
102 |
|
103 |
public Socket getSocket(SocketType socketType) { |
104 |
return sockets.get(socketType);
|
105 |
} |
106 |
|
107 |
public String getPath(String path) { |
108 |
String pathname;
|
109 |
if(path == "chunks") |
110 |
pathname = folderManager.getChunksPath(); |
111 |
else
|
112 |
pathname = "";
|
113 |
return pathname;
|
114 |
} |
115 |
|
116 |
public void sendLateMsg(SocketType type, Message msg, long delay, TimeUnit unit) { |
117 |
agent.schedule(() -> { |
118 |
try {
|
119 |
sendMsg(type, msg); |
120 |
} catch (IOException e) { |
121 |
e.printStackTrace(); |
122 |
} |
123 |
}, delay, unit); |
124 |
} |
125 |
|
126 |
public void sendMsg(SocketType socketType, Message msg) throws IOException { |
127 |
System.out.println("S: " + msg.toString()); |
128 |
sockets.get(socketType).sendMsg(msg.getBytes()); |
129 |
} |
130 |
|
131 |
public void pushMsgHandler(byte[] data, int length) throws IOException { |
132 |
handler.pushMessage(data, length); |
133 |
} |
134 |
|
135 |
public void addFileToFileManager(String pathName, FileManager fileInfo) { |
136 |
fileManager.addFile(pathName, fileInfo); |
137 |
} |
138 |
|
139 |
public void addChunkToFileManager(Chunk chunkInfo) { |
140 |
fileManager.addChunk(chunkInfo); |
141 |
} |
142 |
|
143 |
public void deleteFileFromFileManager(String pathName) { |
144 |
fileManager.removeFile(pathName); |
145 |
} |
146 |
|
147 |
public FileManager getFile(String pathName) { |
148 |
return fileManager.getFileInformation(pathName);
|
149 |
} |
150 |
|
151 |
public byte [] loadChunk(String fileID, int chunkNo) { |
152 |
return folderManager.loadChunk(fileID, chunkNo);
|
153 |
} |
154 |
|
155 |
public Chunk getPeerInformation() {
|
156 |
return peerInformation;
|
157 |
} |
158 |
|
159 |
public FileManager getDatabase() {
|
160 |
return fileManager;
|
161 |
} |
162 |
|
163 |
public FolderManager getSystemManager() {
|
164 |
return folderManager;
|
165 |
} |
166 |
|
167 |
|
168 |
@Override
|
169 |
public String backup(File file, int replicationDegree) { |
170 |
agent.execute(new BackupChunk(Utils.VERSION, file, replicationDegree, this)); |
171 |
return "backup command ok"; |
172 |
} |
173 |
|
174 |
@Override
|
175 |
public void restore(String pathname) { |
176 |
return;
|
177 |
} |
178 |
|
179 |
@Override
|
180 |
public void delete(String pathname) { |
181 |
agent.execute(new DeleteChunk("1.0", pathname, this)); |
182 |
} |
183 |
|
184 |
@Override
|
185 |
public void reclaim(int space) { |
186 |
|
187 |
} |
188 |
|
189 |
@Override
|
190 |
public void state() { |
191 |
|
192 |
} |
193 |
|
194 |
} |