1 // Copyright (C) 2018-2019 HuntLabs. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 module hunt.gossip.model.GossipMember;
16 
17 import hunt.io.Common;
18 import hunt.Integer;
19 import hunt.gossip.model.GossipState;
20 import std.conv;
21 import std.json;
22 
23 public class GossipMember : Serializable {
24     private string cluster;
25     private string ipAddress;
26     private Integer port;
27     private string id;
28     private GossipState state;
29 
30     public this() {
31     }
32 
33     public this(string cluster, string ipAddress, Integer port, string id, GossipState state) {
34         this.cluster = cluster;
35         this.ipAddress = ipAddress;
36         this.port = port;
37         this.id = id;
38         this.state = state;
39     }
40 
41     public GossipState getState() {
42         return state;
43     }
44 
45     public void setState(GossipState state) {
46         this.state = state;
47     }
48 
49     public string getCluster() {
50         return cluster;
51     }
52 
53     public void setCluster(string cluster) {
54         this.cluster = cluster;
55     }
56 
57     public string getIpAddress() {
58         return ipAddress;
59     }
60 
61     public void setIpAddress(string ipAddress) {
62         this.ipAddress = ipAddress;
63     }
64 
65     public Integer getPort() {
66         return port;
67     }
68 
69     public void setPort(Integer port) {
70         this.port = port;
71     }
72 
73     public string getId() {
74         if (id is null) {
75             setId(ipAndPort());
76         }
77         return id;
78     }
79 
80     public void setId(string id) {
81         this.id = id;
82     }
83 
84     override
85     public string toString() {
86         return "GossipMember{" ~
87                 "cluster='" ~ cluster ~ '\'' ~
88                 ", ipAddress='" ~ ipAddress ~ '\'' ~
89                 ", port=" ~ port.to!string ~
90                 ", id='" ~ id ~ '\'' ~
91                 ", state=" ~ state.state() ~
92                 '}';
93     }
94 
95     override
96     public bool opEquals(Object o) {
97         if (this is o) return true;
98         if (o is null) return false;
99 
100         GossipMember member = cast(GossipMember) o;
101         if(member is null) return false;
102         if (!(cluster == member.cluster)) return false;
103         if (!(ipAddress == member.ipAddress)) return false;
104         return port.intValue() == member.port.intValue();
105     }
106 
107     override
108     public  size_t toHash() @trusted nothrow {
109         size_t result = cluster.hashOf();
110         result = 31 * result + ipAddress.hashOf();
111         result = 31 * result + port.hashOf();
112         return result;
113     }
114 
115     public string ipAndPort() {
116         return ipAddress ~ (":") ~ (to!string(port));
117     }
118     
119     public string eigenvalue(){
120         return getCluster() ~ (":") ~ (getIpAddress()) ~ (":") ~ (getPort().toString());
121     }
122 
123     public JSONValue encode()
124     {
125         JSONValue data;
126         data["cluster"] = cluster;
127         data["ipAddress"] = ipAddress;
128         data["port"] = port.intValue();
129         data["id"] = id;
130         data["state"] = state.state();
131         return data;
132     }
133 
134     public static GossipMember decode(JSONValue data)
135     {
136         try
137         {
138             GossipMember gm = new GossipMember(data["cluster"].str,data["ipAddress"].str,new Integer(cast(int)(data["port"].integer)),data["id"].str,GossipState(data["state"].str));
139             return gm;
140         }catch(Exception e)
141         {}
142         return null;
143     }
144 }