root / DistributedBackupService / src / server / Peer.java
History | View | Annotate | Download (4.46 KB)
1 | 1 | up20130859 | 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 | } |