Add network and server container.
[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 java.util.Collection;
21
22 import com.beust.jcommander.internal.Sets;
23
24 /**
25  * Defines a network.
26  *
27  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
28  */
29 public class Network {
30
31         /** The name of the network. */
32         private final String name;
33
34         /** The servers of this network. */
35         private final Collection<Server> servers = Sets.newHashSet();
36
37         /**
38          * Creates a new network with the given name.
39          *
40          * @param name
41          *              The name of the network
42          */
43         private Network(String name) {
44                 this.name = name;
45         }
46
47         //
48         // ACCESSORS
49         //
50
51         /**
52          * Returns the name of this network.
53          *
54          * @return The name of this network
55          */
56         public String name() {
57                 return name;
58         }
59
60         /**
61          * Returns the servers of this network.
62          *
63          * @return The servers of this network
64          */
65         public Collection<Server> servers() {
66                 return servers;
67         }
68
69         //
70         // MUTATORS
71         //
72
73         private void addServer(Server server) {
74                 servers.add(server);
75         }
76
77         //
78         // OBJECT METHODS
79         //
80
81         @Override
82         public String toString() {
83                 return String.format("%s(%d servers)", name(), servers().size());
84         }
85
86         //
87         // STATIC METHODS
88         //
89
90         /**
91          * Returns a network builder.
92          *
93          * @param name
94          *              The name of the network to build
95          * @return A network builder
96          */
97         public static NetworkBuilder builder(String name) {
98                 return new NetworkBuilder(name);
99         }
100
101         /** {@link Network} builder. */
102         public static class NetworkBuilder {
103
104                 /** The network being built. */
105                 private final Network network;
106
107                 /**
108                  * Creates a new network builder.
109                  *
110                  * @param name
111                  *              The name of the network being built
112                  */
113                 private NetworkBuilder(String name) {
114                         network = new Network(name);
115                 }
116
117                 /**
118                  * Returns a server builder that will add the created server to this network.
119                  *
120                  * @return A server builder
121                  */
122                 public ServerBuilder addServer() {
123                         return new ServerBuilder(this);
124                 }
125
126                 /**
127                  * Adds the given server to this builder.
128                  *
129                  * @param server
130                  *              The server to add
131                  * @return This network builder
132                  */
133                 private NetworkBuilder addServer(Server server) {
134                         network.addServer(server);
135                         return this;
136                 }
137
138                 /**
139                  * Returns the built network.
140                  *
141                  * @return The built network
142                  */
143                 public Network build() {
144                         return network;
145                 }
146
147         }
148
149         /** {@link Server} builder. */
150         public static class ServerBuilder {
151
152                 /** The parent network builder. */
153                 private final NetworkBuilder networkBuilder;
154
155                 /** The hostname of the server. */
156                 private String hostname;
157
158                 /** The unencrypted port numbers. */
159                 private final Collection<Integer> unencryptedPorts = Sets.newHashSet();
160
161                 /** The encrypted port numbers. */
162                 private final Collection<Integer> encryptedPorts = Sets.newHashSet();
163
164                 /**
165                  * Creates a new server builder.
166                  *
167                  * @param networkBuilder
168                  *              The parent network builder
169                  */
170                 private ServerBuilder(NetworkBuilder networkBuilder) {
171                         this.networkBuilder = networkBuilder;
172                 }
173
174                 /**
175                  * Sets the hostname of the server to build.
176                  *
177                  * @param hostname
178                  *              The hostname of the server
179                  * @return This server builder
180                  */
181                 public ServerBuilder at(String hostname) {
182                         this.hostname = hostname;
183                         return this;
184                 }
185
186                 /**
187                  * Adds the given port number to the list of unencrypted port numbers.
188                  *
189                  * @param port
190                  *              The port number to add
191                  * @return This server builder
192                  */
193                 public ServerBuilder port(int port) {
194                         unencryptedPorts.add(port);
195                         return this;
196                 }
197
198                 /**
199                  * Adds the given port number to the list of encrypted port numbers.
200                  *
201                  * @param sslPort
202                  *              The port number to add
203                  * @return This server builder
204                  */
205                 public ServerBuilder sslPort(int sslPort) {
206                         encryptedPorts.add(sslPort);
207                         return this;
208                 }
209
210                 /**
211                  * Builds the server, adds it to the parent network builder and returns the
212                  * network builder.
213                  *
214                  * @return The network builder with the configured server added
215                  */
216                 public NetworkBuilder endServer() {
217                         return networkBuilder.addServer(build());
218                 }
219
220                 /**
221                  * Builds the server.
222                  *
223                  * @return The built server
224                  */
225                 private Server build() {
226                         return new Server(networkBuilder.network, hostname, unencryptedPorts, encryptedPorts);
227                 }
228
229         }
230
231 }