Project

General

Profile

Statistics
| Revision:

sdis1819-t7g02 / channels / ControlChannel.java @ 1

History | View | Annotate | Download (3.5 KB)

1
/**
2
 * 
3
 */
4
package channels;
5

    
6
import java.io.IOException;
7
import protocols.recoverChunkRepDegreeProtocol;
8
import service.Chunk;
9
import service.Cloud;
10
import service.Constants;
11

    
12
/**
13
 * @author dnc18
14
 *
15
 */
16
public class ControlChannel extends Channel {
17
        private Message receivedMessage;
18
        
19
        public ControlChannel(String addr, String p, Cloud servicePeerRef) throws IOException {
20
                super(addr, p, servicePeerRef.getID(), servicePeerRef);
21
        }
22
        
23
        public void printLog(String msg) {
24
                System.out.println("MC " + serverId + msg);
25
        }
26
        
27
        @Override
28
        public void run() {
29
                recoverChunkRepDegreeProtocol rcrdp = null;
30
                Message m;
31
                
32
                printLog(": UP");
33
                
34
                try {
35
                        joinChannelGroup();
36
                } catch (IOException e1) {
37
                        // TODO Auto-generated catch block
38
                        e1.printStackTrace();
39
                }
40
                
41
                do {
42
                        try {
43
                                
44
                                
45
                                receivedMessage = captureData();
46
                                
47
                                if(receivedMessage == null) {
48
                                        continue;
49
                                }
50
                                
51
                                if(getServerId() != Integer.parseInt(receivedMessage.getHeader().getSenderId())) {
52
//                                        printLog(" received: " + receivedMessage.getHeader().toString());
53
                                        switch(receivedMessage.getHeader().getMessageType()) {
54
                                                case Constants.STORED:
55
                                                        father.intrepertStoredMessage(receivedMessage.getHeader());
56
                                                        break;
57
                                                case Constants.GETCHUNK:
58
                                                        father.intrepertGetChunkMessage(receivedMessage.getHeader());
59
                                                        break;
60
                                                case Constants.DELETE:
61
//                                                        printLog(" before delete: " + father.getAvailableSpace() + " avaliable bytes and " + father.getNumberOfStoredChunks() + " stored chunks.");
62
                                                        father.deleteFile(receivedMessage.getHeader());
63
//                                                        printLog(" adter delete: " + father.getAvailableSpace() + " avaliable bytes and " + father.getNumberOfStoredChunks() + " stored chunks.");
64
                                                        break;
65
                                                case Constants.REMOVED:
66
                                                        if(father.intrepertStoredMessage(receivedMessage.getHeader())) {
67
                                                                printLog(": chunk replication degree disrespected, sending again.");
68
                                                                m = buildReplicationRestoreMessage(receivedMessage.getHeader().getFileId(), receivedMessage.getHeader().getChunkNumber());
69
                                                                if(m != null) {
70
                                                                        rcrdp = new recoverChunkRepDegreeProtocol(father, m);
71
                                                                        System.out.println("Calling");
72
                                                                        rcrdp.run();
73
                                                                }
74
                                                                else {
75
                                                                        System.out.println("couldn t create backup protocol thread");
76
                                                                }
77
                                                        }
78
                                                        break;
79
                                                default: // MC, MDB, MDR
80
                                                        //printLog(" ERROR: Invalid message header received -> " + receivedMessage.getHeader().getMessageType());
81
                                                        continue;
82
                                        }
83
                                }
84
                                
85
//                                leaveGroupChannel();
86
                        }
87
                        catch (Exception e) {
88
                                printLog(" ERROR: " + e.getMessage());
89
                                e.printStackTrace();
90
                                break;
91
                        }
92
                } while(true);
93
        }
94
        
95
        private Message buildReplicationRestoreMessage(String fileId, String chunkNo) {
96
                Message m = null;
97
                MessageHeader h = null;
98
                String[] headerElements = new String[Constants.PUTCHUNK_N_ARGS];
99
                Chunk toSave = father.getFileChunkRepDegree(fileId, chunkNo);
100
                
101
                
102
                if(toSave == null) {
103
                        return null;
104
                }
105
                
106
                try {
107
                        headerElements[0] = Constants.PUTCHUNK;
108
                    headerElements[1] = father.getProtocolVersion();
109
                    headerElements[2] = Integer.toString(father.getID());
110
                    headerElements[3] = fileId;
111
                             headerElements[4] = chunkNo;
112
                             headerElements[5] = Integer.toString(toSave.getReplicationDegree());
113
                             
114
                             h = new MessageHeader(headerElements.clone());
115
                             m = new Message(h, toSave.getChunkContent());
116
                }
117
                   catch(IllegalArgumentException e) {
118
                           System.out.println("Error creating backup protocol -> " + e.getMessage());
119
                           return null;
120
                   }
121
                
122
                return m;
123
        }
124
}