Project

General

Profile

Statistics
| Revision:

root / src / Peers / Peer.java @ 2

History | View | Annotate | Download (5.75 KB)

1
package Peers;
2

    
3

    
4
import java.io.*;
5
import java.rmi.RemoteException;
6
import java.rmi.registry.LocateRegistry;
7
import java.rmi.registry.Registry;
8
import java.rmi.server.UnicastRemoteObject;
9
import java.util.concurrent.ConcurrentHashMap;
10
import java.util.concurrent.ScheduledThreadPoolExecutor;
11
import java.util.concurrent.TimeUnit;
12
import java.nio.file.Paths;
13

    
14
import java.nio.file.Paths;
15

    
16
import Channel.Channel;
17

    
18
import Protocols.BackUpProtocol;
19
import Protocols.DeleteProtocol;
20
import Protocols.RestoreProtocol;
21
import RMI.Service;
22
import Storage.FileSystem;
23

    
24
import static Global.Globals.MAX_SIZE_STORAGE;
25

    
26
public class Peer implements Service, Serializable {
27

    
28
    private int id;
29

    
30
    private String versionProtocol;
31

    
32
    private String remoteObjName;
33

    
34
    private Channel mc_channel;
35

    
36
    private Channel mdb_channel;
37

    
38
    private Channel mdr_channel;
39

    
40
    ScheduledThreadPoolExecutor threadPool = new ScheduledThreadPoolExecutor(200);
41

    
42
    FileSystem storage;
43

    
44
    Control control;
45

    
46

    
47
    public Peer(String version, String peerId, String remoteName, String mcAddr, int mcPort, String mdbAddr, int mdbPort, String mdrAddr, int mdrPort) {
48

    
49

    
50
        this.versionProtocol = version;
51
        this.remoteObjName = remoteName;
52
        this.id = Integer.parseInt(peerId);
53

    
54
        this.storage = new FileSystem(MAX_SIZE_STORAGE, Paths.get(System.getProperty("user.dir")).toString() + "/sdis/", this.id, this);
55
        try {
56
            mc_channel = new Channel(mcAddr, mcPort, this);
57
            mdb_channel = new Channel(mdbAddr, mdbPort, this);
58
            mdr_channel = new Channel(mdrAddr, mdrPort, this);
59

    
60
            if(!loadStatus())
61
                this.control = new Control(this);
62

    
63
            // save data every 2 seconds
64
            threadPool.scheduleAtFixedRate(() -> {
65
                this.saveState();
66
            }, 0, 2, TimeUnit.SECONDS);
67

    
68
        } catch (IOException e) {
69
           // e.printStackTrace();
70
        }
71

    
72

    
73
        /*new Thread(mdb_channel).start();
74
        new Thread(mdr_channel).start();
75
        new Thread(mc_channel).start();
76
        */
77
        threadPool.execute(mc_channel);
78
        threadPool.execute(mdb_channel);
79
        threadPool.execute(mdr_channel);
80

    
81
    }
82

    
83
    @Override
84
    public void backup(String filepath, int replicationDegree) throws IOException {
85

    
86
        BackUpProtocol backup = new BackUpProtocol(this, replicationDegree, filepath);
87
        threadPool.execute(backup);
88
    }
89

    
90
    @Override
91
    public void restore(String filepath) throws RemoteException {
92
        RestoreProtocol restore = new RestoreProtocol(this, filepath);
93
        threadPool.execute(restore);
94

    
95
    }
96

    
97
    @Override
98
    public void delete(String filepath) throws RemoteException {
99
        DeleteProtocol delete = new DeleteProtocol(this, filepath);
100
        threadPool.execute(delete);
101
    }
102

    
103
    @Override
104
    public void manage(int space) throws RemoteException {
105

    
106
    }
107

    
108
    @Override
109
    public void state() throws RemoteException {
110

    
111
    }
112

    
113

    
114
    public static void main(String args[]) throws RemoteException {
115
        if (args.length != 9) {
116
            System.out.println("Usage: java Peers.Peer <version> <peer id> <access_point> <MC_IP_address>" +
117
                    " <MC_port> <MDB_IP_address> <MDB_port> <MDR_IP_address> <MDR_port>");
118
            return;
119
        }
120

    
121
        Peer peer = null;
122

    
123
        try {
124

    
125
            peer = new Peer(args[0], args[1], args[2], args[3], Integer.parseInt(args[4]), args[5], Integer.parseInt(args[6]), args[7], Integer.parseInt(args[8]));
126
            Service serv = (Service) UnicastRemoteObject.exportObject(peer, 0);
127
            Registry registry = LocateRegistry.getRegistry();
128
            registry.bind(args[2], serv);
129
        } catch (Exception e) {
130
            System.out.println("Server Exception: " + e.getMessage());
131
            e.printStackTrace();
132
        }
133

    
134
        try {
135
            peer.threadPool.awaitTermination(1, TimeUnit.DAYS);
136
        } catch (Exception e) {
137
          //  e.printStackTrace();
138
        }
139
    }
140

    
141
    public FileSystem getStorage() {
142
        return storage;
143
    }
144

    
145
    public String getVersionProtocol() {
146
        return versionProtocol;
147
    }
148

    
149
    public Channel getMc_channel() {
150
        return mc_channel;
151
    }
152

    
153
    public Channel getMdb_channel() {
154
        return mdb_channel;
155
    }
156

    
157
    public Channel getMdr_channel() {
158
        return mdr_channel;
159
    }
160

    
161
    public int getId() {
162
        return id;
163
    }
164

    
165
    public ScheduledThreadPoolExecutor getThreadPool() {
166
        return threadPool;
167
    }
168

    
169
    public Control getControl() {
170
        return control;
171
    }
172

    
173

    
174
    private void saveState() {
175
        try {
176

    
177
            FileOutputStream fileCtrl = new FileOutputStream(Paths.get(System.getProperty("user.dir")).toString() + "/objs/" + id + "Ctrl.ser");
178

    
179
            ObjectOutputStream out2 = new ObjectOutputStream(fileCtrl);
180

    
181
            out2.writeObject(this.control);
182

    
183
            out2.close();
184
            fileCtrl.close();
185
        } catch (IOException e) {
186
            new File(Paths.get(System.getProperty("user.dir")).toString() + "/objs").mkdir();
187
            try {
188
                new File(Paths.get(System.getProperty("user.dir")).toString() + "/objs/" + id + "Ctrl.ser").createNewFile();
189
            } catch (IOException e1) {
190
               // e1.printStackTrace();
191
            }
192

    
193
            //e.printStackTrace();
194
        }
195
    }
196

    
197
    private boolean loadStatus() {
198

    
199
        try {
200
            FileInputStream fileCtrl = new FileInputStream(Paths.get(System.getProperty("user.dir")).toString() + "/objs/" + id + "Ctrl.ser");
201

    
202
            ObjectInputStream obj2 = new ObjectInputStream(fileCtrl);
203
            this.control = (Control) obj2.readObject();
204

    
205
            obj2.close();
206
            fileCtrl.close();
207
            return true;
208
        } catch (Exception e) {
209
            System.out.println("no files found");
210
        }
211

    
212
        return false;
213
    }
214

    
215
}
216

    
217