--- /dev/null
+/*
+ * XdccDownloader - Network.java - Copyright © 2013 David Roden
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.pterodactylus.xdcc.data;
+
+import java.util.Collection;
+
+import com.beust.jcommander.internal.Sets;
+
+/**
+ * Defines a network.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class Network {
+
+ /** The name of the network. */
+ private final String name;
+
+ /** The servers of this network. */
+ private final Collection<Server> servers = Sets.newHashSet();
+
+ /**
+ * Creates a new network with the given name.
+ *
+ * @param name
+ * The name of the network
+ */
+ private Network(String name) {
+ this.name = name;
+ }
+
+ //
+ // ACCESSORS
+ //
+
+ /**
+ * Returns the name of this network.
+ *
+ * @return The name of this network
+ */
+ public String name() {
+ return name;
+ }
+
+ /**
+ * Returns the servers of this network.
+ *
+ * @return The servers of this network
+ */
+ public Collection<Server> servers() {
+ return servers;
+ }
+
+ //
+ // MUTATORS
+ //
+
+ private void addServer(Server server) {
+ servers.add(server);
+ }
+
+ //
+ // OBJECT METHODS
+ //
+
+ @Override
+ public String toString() {
+ return String.format("%s(%d servers)", name(), servers().size());
+ }
+
+ //
+ // STATIC METHODS
+ //
+
+ /**
+ * Returns a network builder.
+ *
+ * @param name
+ * The name of the network to build
+ * @return A network builder
+ */
+ public static NetworkBuilder builder(String name) {
+ return new NetworkBuilder(name);
+ }
+
+ /** {@link Network} builder. */
+ public static class NetworkBuilder {
+
+ /** The network being built. */
+ private final Network network;
+
+ /**
+ * Creates a new network builder.
+ *
+ * @param name
+ * The name of the network being built
+ */
+ private NetworkBuilder(String name) {
+ network = new Network(name);
+ }
+
+ /**
+ * Returns a server builder that will add the created server to this network.
+ *
+ * @return A server builder
+ */
+ public ServerBuilder addServer() {
+ return new ServerBuilder(this);
+ }
+
+ /**
+ * Adds the given server to this builder.
+ *
+ * @param server
+ * The server to add
+ * @return This network builder
+ */
+ private NetworkBuilder addServer(Server server) {
+ network.addServer(server);
+ return this;
+ }
+
+ /**
+ * Returns the built network.
+ *
+ * @return The built network
+ */
+ public Network build() {
+ return network;
+ }
+
+ }
+
+ /** {@link Server} builder. */
+ public static class ServerBuilder {
+
+ /** The parent network builder. */
+ private final NetworkBuilder networkBuilder;
+
+ /** The hostname of the server. */
+ private String hostname;
+
+ /** The unencrypted port numbers. */
+ private final Collection<Integer> unencryptedPorts = Sets.newHashSet();
+
+ /** The encrypted port numbers. */
+ private final Collection<Integer> encryptedPorts = Sets.newHashSet();
+
+ /**
+ * Creates a new server builder.
+ *
+ * @param networkBuilder
+ * The parent network builder
+ */
+ private ServerBuilder(NetworkBuilder networkBuilder) {
+ this.networkBuilder = networkBuilder;
+ }
+
+ /**
+ * Sets the hostname of the server to build.
+ *
+ * @param hostname
+ * The hostname of the server
+ * @return This server builder
+ */
+ public ServerBuilder at(String hostname) {
+ this.hostname = hostname;
+ return this;
+ }
+
+ /**
+ * Adds the given port number to the list of unencrypted port numbers.
+ *
+ * @param port
+ * The port number to add
+ * @return This server builder
+ */
+ public ServerBuilder port(int port) {
+ unencryptedPorts.add(port);
+ return this;
+ }
+
+ /**
+ * Adds the given port number to the list of encrypted port numbers.
+ *
+ * @param sslPort
+ * The port number to add
+ * @return This server builder
+ */
+ public ServerBuilder sslPort(int sslPort) {
+ encryptedPorts.add(sslPort);
+ return this;
+ }
+
+ /**
+ * Builds the server, adds it to the parent network builder and returns the
+ * network builder.
+ *
+ * @return The network builder with the configured server added
+ */
+ public NetworkBuilder endServer() {
+ return networkBuilder.addServer(build());
+ }
+
+ /**
+ * Builds the server.
+ *
+ * @return The built server
+ */
+ private Server build() {
+ return new Server(networkBuilder.network, hostname, unencryptedPorts, encryptedPorts);
+ }
+
+ }
+
+}
--- /dev/null
+/*
+ * XdccDownloader - Server.java - Copyright © 2013 David Roden
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.pterodactylus.xdcc.data;
+
+import java.util.Collection;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Defines a server in a {@link Network}.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class Server {
+
+ /** The network this server belongs to. */
+ private final Network network;
+
+ /** The hostname of this server. */
+ private final String hostname;
+
+ /** The unencrypted port numbers. */
+ private final Collection<Integer> unencryptedPorts;
+
+ /** The encrypted port numbers. */
+ private final Collection<Integer> encryptedPorts;
+
+ /**
+ * Creates a new server.
+ *
+ * @param network
+ * The network this server belongs to
+ * @param hostname
+ * The hostname of the server
+ * @param unencryptedPorts
+ * The unencrypted port numbers
+ * @param encryptedPorts
+ * The encrypted port numbers
+ */
+ public Server(Network network, String hostname, Collection<Integer> unencryptedPorts, Collection<Integer> encryptedPorts) {
+ this.network = network;
+ this.hostname = hostname;
+ this.unencryptedPorts = ImmutableSet.copyOf(unencryptedPorts);
+ this.encryptedPorts = ImmutableSet.copyOf(encryptedPorts);
+ }
+
+ //
+ // ACCESSORS
+ //
+
+ /**
+ * Returns the network this server belongs to.
+ *
+ * @return The network this server belongs to
+ */
+ public Network network() {
+ return network;
+ }
+
+ /**
+ * Returns the hostname of this server.
+ *
+ * @return The hostname of this server
+ */
+ public String hostname() {
+ return hostname;
+ }
+
+ /**
+ * Returns the unencrypted port numbers.
+ *
+ * @return The unencrypted port numbers
+ */
+ public Collection<Integer> unencryptedPorts() {
+ return unencryptedPorts;
+ }
+
+ /**
+ * Returns the encrypted port numbers.
+ *
+ * @return The encrypted port numbers
+ */
+ public Collection<Integer> encryptedPorts() {
+ return encryptedPorts;
+ }
+
+}