Project

General

Profile

Statistics
| Revision:

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
}