2 * XdccDownloader - Network.java - Copyright © 2013 David Roden
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.
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.
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/>.
18 package net.pterodactylus.xdcc.data;
20 import java.util.Collection;
22 import com.beust.jcommander.internal.Sets;
27 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
29 public class Network {
31 /** The name of the network. */
32 private final String name;
34 /** The servers of this network. */
35 private final Collection<Server> servers = Sets.newHashSet();
38 * Creates a new network with the given name.
41 * The name of the network
43 private Network(String name) {
52 * Returns the name of this network.
54 * @return The name of this network
56 public String name() {
61 * Returns the servers of this network.
63 * @return The servers of this network
65 public Collection<Server> servers() {
73 private void addServer(Server server) {
82 public String toString() {
83 return String.format("%s(%d servers)", name(), servers().size());
91 * Returns a network builder.
94 * The name of the network to build
95 * @return A network builder
97 public static NetworkBuilder builder(String name) {
98 return new NetworkBuilder(name);
101 /** {@link Network} builder. */
102 public static class NetworkBuilder {
104 /** The network being built. */
105 private final Network network;
108 * Creates a new network builder.
111 * The name of the network being built
113 private NetworkBuilder(String name) {
114 network = new Network(name);
118 * Returns a server builder that will add the created server to this network.
120 * @return A server builder
122 public ServerBuilder addServer() {
123 return new ServerBuilder(this);
127 * Adds the given server to this builder.
131 * @return This network builder
133 private NetworkBuilder addServer(Server server) {
134 network.addServer(server);
139 * Returns the built network.
141 * @return The built network
143 public Network build() {
149 /** {@link Server} builder. */
150 public static class ServerBuilder {
152 /** The parent network builder. */
153 private final NetworkBuilder networkBuilder;
155 /** The hostname of the server. */
156 private String hostname;
158 /** The unencrypted port numbers. */
159 private final Collection<Integer> unencryptedPorts = Sets.newHashSet();
161 /** The encrypted port numbers. */
162 private final Collection<Integer> encryptedPorts = Sets.newHashSet();
165 * Creates a new server builder.
167 * @param networkBuilder
168 * The parent network builder
170 private ServerBuilder(NetworkBuilder networkBuilder) {
171 this.networkBuilder = networkBuilder;
175 * Sets the hostname of the server to build.
178 * The hostname of the server
179 * @return This server builder
181 public ServerBuilder at(String hostname) {
182 this.hostname = hostname;
187 * Adds the given port number to the list of unencrypted port numbers.
190 * The port number to add
191 * @return This server builder
193 public ServerBuilder port(int port) {
194 unencryptedPorts.add(port);
199 * Adds the given port number to the list of encrypted port numbers.
202 * The port number to add
203 * @return This server builder
205 public ServerBuilder sslPort(int sslPort) {
206 encryptedPorts.add(sslPort);
211 * Builds the server, adds it to the parent network builder and returns the
214 * @return The network builder with the configured server added
216 public NetworkBuilder endServer() {
217 return networkBuilder.addServer(build());
223 * @return The built server
225 private Server build() {
226 return new Server(networkBuilder.network, hostname, unencryptedPorts, encryptedPorts);