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 static com.google.common.base.Preconditions.checkNotNull;
22 import java.util.Collection;
24 import com.beust.jcommander.internal.Sets;
25 import com.google.common.base.Objects;
30 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
32 public class Network {
34 /** The name of the network. */
35 private final String name;
37 /** The servers of this network. */
38 private final Collection<Server> servers = Sets.newHashSet();
41 * Creates a new network with the given name.
44 * The name of the network
45 * @throws NullPointerException
46 * if {@code name} is {@code null}
48 private Network(String name) throws NullPointerException {
49 this.name = checkNotNull(name, "name must not be null");
57 * Returns the name of this network.
59 * @return The name of this network
61 public String name() {
66 * Returns the servers of this network.
68 * @return The servers of this network
70 public Collection<Server> servers() {
78 private void addServer(Server server) {
87 public boolean equals(Object object) {
88 if (!(object instanceof Network)) {
91 Network network = (Network) object;
92 if (!Objects.equal(name(), network.name())) {
99 public int hashCode() {
100 return name().hashCode();
104 public String toString() {
105 return String.format("%s(%d servers)", name(), servers().size());
113 * Returns a network builder.
116 * The name of the network to build
117 * @return A network builder
119 public static NetworkBuilder builder(String name) {
120 return new NetworkBuilder(name);
123 /** {@link Network} builder. */
124 public static class NetworkBuilder {
126 /** The network being built. */
127 private final Network network;
130 * Creates a new network builder.
133 * The name of the network being built
135 private NetworkBuilder(String name) {
136 network = new Network(name);
140 * Returns a server builder that will add the created server to this network.
142 * @return A server builder
144 public ServerBuilder addServer() {
145 return new ServerBuilder(this);
149 * Adds the given server to this builder.
153 * @return This network builder
155 private NetworkBuilder addServer(Server server) {
156 network.addServer(server);
161 * Returns the built network.
163 * @return The built network
165 public Network build() {
171 /** {@link Server} builder. */
172 public static class ServerBuilder {
174 /** The parent network builder. */
175 private final NetworkBuilder networkBuilder;
177 /** The hostname of the server. */
178 private String hostname;
180 /** The unencrypted port numbers. */
181 private final Collection<Integer> unencryptedPorts = Sets.newHashSet();
183 /** The encrypted port numbers. */
184 private final Collection<Integer> encryptedPorts = Sets.newHashSet();
187 * Creates a new server builder.
189 * @param networkBuilder
190 * The parent network builder
192 private ServerBuilder(NetworkBuilder networkBuilder) {
193 this.networkBuilder = networkBuilder;
197 * Sets the hostname of the server to build.
200 * The hostname of the server
201 * @return This server builder
203 public ServerBuilder at(String hostname) {
204 this.hostname = hostname;
209 * Adds the given port number to the list of unencrypted port numbers.
212 * The port number to add
213 * @return This server builder
215 public ServerBuilder port(int port) {
216 unencryptedPorts.add(port);
221 * Adds the given port number to the list of encrypted port numbers.
224 * The port number to add
225 * @return This server builder
227 public ServerBuilder sslPort(int sslPort) {
228 encryptedPorts.add(sslPort);
233 * Builds the server, adds it to the parent network builder and returns the
236 * @return The network builder with the configured server added
238 public NetworkBuilder endServer() {
239 return networkBuilder.addServer(build());
245 * @return The built server
247 private Server build() {
248 return new Server(networkBuilder.network, hostname, unencryptedPorts, encryptedPorts);