Ensure that name is always != null.
[xudocci.git] / src / main / java / net / pterodactylus / xdcc / data / Network.java
1 /*
2  * XdccDownloader - Network.java - Copyright © 2013 David Roden
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 package net.pterodactylus.xdcc.data;
19
20 import static com.google.common.base.Preconditions.checkNotNull;
21
22 import java.util.Collection;
23
24 import com.beust.jcommander.internal.Sets;
25 import com.google.common.base.Objects;
26
27 /**
28  * Defines a network.
29  *
30  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
31  */
32 public class Network {
33
34         /** The name of the network. */
35         private final String name;
36
37         /** The servers of this network. */
38         private final Collection<Server> servers = Sets.newHashSet();
39
40         /**
41          * Creates a new network with the given name.
42          *
43          * @param name
44          *              The name of the network
45          * @throws NullPointerException
46          *              if {@code name} is {@code null}
47          */
48         private Network(String name) throws NullPointerException {
49                 this.name = checkNotNull(name, "name must not be null");
50         }
51
52         //
53         // ACCESSORS
54         //
55
56         /**
57          * Returns the name of this network.
58          *
59          * @return The name of this network
60          */
61         public String name() {
62                 return name;
63         }
64
65         /**
66          * Returns the servers of this network.
67          *
68          * @return The servers of this network
69          */
70         public Collection<Server> servers() {
71                 return servers;
72         }
73
74         //
75         // MUTATORS
76         //
77
78         private void addServer(Server server) {
79                 servers.add(server);
80         }
81
82         //
83         // OBJECT METHODS
84         //
85
86         @Override
87         public boolean equals(Object object) {
88                 if (!(object instanceof Network)) {
89                         return false;
90                 }
91                 Network network = (Network) object;
92                 if (!Objects.equal(name(), network.name())) {
93                         return false;
94                 }
95                 return true;
96         }
97
98         @Override
99         public int hashCode() {
100                 return name().hashCode();
101         }
102
103         @Override
104         public String toString() {
105                 return String.format("%s(%d servers)", name(), servers().size());
106         }
107
108         //
109         // STATIC METHODS
110         //
111
112         /**
113          * Returns a network builder.
114          *
115          * @param name
116          *              The name of the network to build
117          * @return A network builder
118          */
119         public static NetworkBuilder builder(String name) {
120                 return new NetworkBuilder(name);
121         }
122
123         /** {@link Network} builder. */
124         public static class NetworkBuilder {
125
126                 /** The network being built. */
127                 private final Network network;
128
129                 /**
130                  * Creates a new network builder.
131                  *
132                  * @param name
133                  *              The name of the network being built
134                  */
135                 private NetworkBuilder(String name) {
136                         network = new Network(name);
137                 }
138
139                 /**
140                  * Returns a server builder that will add the created server to this network.
141                  *
142                  * @return A server builder
143                  */
144                 public ServerBuilder addServer() {
145                         return new ServerBuilder(this);
146                 }
147
148                 /**
149                  * Adds the given server to this builder.
150                  *
151                  * @param server
152                  *              The server to add
153                  * @return This network builder
154                  */
155                 private NetworkBuilder addServer(Server server) {
156                         network.addServer(server);
157                         return this;
158                 }
159
160                 /**
161                  * Returns the built network.
162                  *
163                  * @return The built network
164                  */
165                 public Network build() {
166                         return network;
167                 }
168
169         }
170
171         /** {@link Server} builder. */
172         public static class ServerBuilder {
173
174                 /** The parent network builder. */
175                 private final NetworkBuilder networkBuilder;
176
177                 /** The hostname of the server. */
178                 private String hostname;
179
180                 /** The unencrypted port numbers. */
181                 private final Collection<Integer> unencryptedPorts = Sets.newHashSet();
182
183                 /** The encrypted port numbers. */
184                 private final Collection<Integer> encryptedPorts = Sets.newHashSet();
185
186                 /**
187                  * Creates a new server builder.
188                  *
189                  * @param networkBuilder
190                  *              The parent network builder
191                  */
192                 private ServerBuilder(NetworkBuilder networkBuilder) {
193                         this.networkBuilder = networkBuilder;
194                 }
195
196                 /**
197                  * Sets the hostname of the server to build.
198                  *
199                  * @param hostname
200                  *              The hostname of the server
201                  * @return This server builder
202                  */
203                 public ServerBuilder at(String hostname) {
204                         this.hostname = hostname;
205                         return this;
206                 }
207
208                 /**
209                  * Adds the given port number to the list of unencrypted port numbers.
210                  *
211                  * @param port
212                  *              The port number to add
213                  * @return This server builder
214                  */
215                 public ServerBuilder port(int port) {
216                         unencryptedPorts.add(port);
217                         return this;
218                 }
219
220                 /**
221                  * Adds the given port number to the list of encrypted port numbers.
222                  *
223                  * @param sslPort
224                  *              The port number to add
225                  * @return This server builder
226                  */
227                 public ServerBuilder sslPort(int sslPort) {
228                         encryptedPorts.add(sslPort);
229                         return this;
230                 }
231
232                 /**
233                  * Builds the server, adds it to the parent network builder and returns the
234                  * network builder.
235                  *
236                  * @return The network builder with the configured server added
237                  */
238                 public NetworkBuilder endServer() {
239                         return networkBuilder.addServer(build());
240                 }
241
242                 /**
243                  * Builds the server.
244                  *
245                  * @return The built server
246                  */
247                 private Server build() {
248                         return new Server(networkBuilder.network, hostname, unencryptedPorts, encryptedPorts);
249                 }
250
251         }
252
253 }