001/*
002 * Copyright 2008-2017 UnboundID Corp.
003 * All Rights Reserved.
004 */
005/*
006 * Copyright (C) 2008-2017 UnboundID Corp.
007 *
008 * This program is free software; you can redistribute it and/or modify
009 * it under the terms of the GNU General Public License (GPLv2 only)
010 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
011 * as published by the Free Software Foundation.
012 *
013 * This program is distributed in the hope that it will be useful,
014 * but WITHOUT ANY WARRANTY; without even the implied warranty of
015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016 * GNU General Public License for more details.
017 *
018 * You should have received a copy of the GNU General Public License
019 * along with this program; if not, see <http://www.gnu.org/licenses>.
020 */
021package com.unboundid.ldap.sdk;
022
023
024
025import javax.net.SocketFactory;
026
027import com.unboundid.util.NotMutable;
028import com.unboundid.util.ThreadSafety;
029import com.unboundid.util.ThreadSafetyLevel;
030
031import static com.unboundid.util.Validator.*;
032
033
034
035/**
036 * This class provides a server set implementation that only provides the
037 * ability to connect to a single server.  It may be used in cases where a
038 * {@link ServerSet} is required but only a single server is needed.
039 */
040@NotMutable()
041@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
042public final class SingleServerSet
043       extends ServerSet
044{
045  // The port number of the target server.
046  private final int port;
047
048  // The set of connection options to use.
049  private final LDAPConnectionOptions connectionOptions;
050
051  // The socket factory to use to establish connections.
052  private final SocketFactory socketFactory;
053
054  // The address of the target server.
055  private final String address;
056
057
058
059  /**
060   * Creates a new single server set with the specified address and port.  It
061   * will use the default socket factory provided by the JVM to create the
062   * underlying socket.
063   *
064   * @param  address  The address of the directory server to which the
065   *                  connections should be established.  It must not be
066   *                  {@code null}.
067   * @param  port     The port of the directory server to which the connections
068   *                  should be established.  It must be between 1 and 65535,
069   *                  inclusive.
070   */
071  public SingleServerSet(final String address, final int port)
072  {
073    this(address, port, null, null);
074  }
075
076
077
078  /**
079   * Creates a new single server set with the specified address and port.  It
080   * will use the default socket factory provided by the JVM to create the
081   * underlying socket.
082   *
083   * @param  address            The address of the directory server to which the
084   *                            connections should be established.  It must not
085   *                            be {@code null}.
086   * @param  port               The port of the directory server to which the
087   *                            connections should be established.  It must be
088   *                            between 1 and 65535, inclusive.
089   * @param  connectionOptions  The set of connection options to use for the
090   *                            underlying connections.
091   */
092  public SingleServerSet(final String address, final int port,
093                         final LDAPConnectionOptions connectionOptions)
094  {
095    this(address, port, null, connectionOptions);
096  }
097
098
099
100  /**
101   * Creates a new single server set with the specified address and port, and
102   * using the provided socket factory.
103   *
104   * @param  address        The address of the directory server to which the
105   *                        connections should be established.  It must not be
106   *                        {@code null}.
107   * @param  port           The port of the directory server to which the
108   *                        connections should be established.  It must be
109   *                        between 1 and 65535, inclusive.
110   * @param  socketFactory  The socket factory to use to create the underlying
111   *                        connections.
112   */
113  public SingleServerSet(final String address, final int port,
114                         final SocketFactory socketFactory)
115  {
116    this(address, port, socketFactory, null);
117  }
118
119
120
121  /**
122   * Creates a new single server set with the specified address and port, and
123   * using the provided socket factory.
124   *
125   * @param  address            The address of the directory server to which the
126   *                            connections should be established.  It must not
127   *                            be {@code null}.
128   * @param  port               The port of the directory server to which the
129   *                            connections should be established.  It must be
130   *                            between 1 and 65535, inclusive.
131   * @param  socketFactory      The socket factory to use to create the
132   *                            underlying connections.
133   * @param  connectionOptions  The set of connection options to use for the
134   *                            underlying connections.
135   */
136  public SingleServerSet(final String address, final int port,
137                         final SocketFactory socketFactory,
138                         final LDAPConnectionOptions connectionOptions)
139  {
140    ensureNotNull(address);
141    ensureTrue((port > 0) && (port < 65536),
142               "SingleServerSet.port must be between 1 and 65535.");
143
144    this.address = address;
145    this.port    = port;
146
147    if (socketFactory == null)
148    {
149      this.socketFactory = SocketFactory.getDefault();
150    }
151    else
152    {
153      this.socketFactory = socketFactory;
154    }
155
156    if (connectionOptions == null)
157    {
158      this.connectionOptions = new LDAPConnectionOptions();
159    }
160    else
161    {
162      this.connectionOptions = connectionOptions;
163    }
164  }
165
166
167
168  /**
169   * Retrieves the address of the directory server to which the connections
170   * should be established.
171   *
172   * @return  The address of the directory server to which the connections
173   *          should be established.
174   */
175  public String getAddress()
176  {
177    return address;
178  }
179
180
181
182  /**
183   * Retrieves the port of the directory server to which the connections should
184   * be established.
185   *
186   * @return  The port of the directory server to which the connections should
187   *          be established.
188   */
189  public int getPort()
190  {
191    return port;
192  }
193
194
195
196  /**
197   * Retrieves the socket factory that will be used to establish connections.
198   *
199   * @return  The socket factory that will be used to establish connections.
200   */
201  public SocketFactory getSocketFactory()
202  {
203    return socketFactory;
204  }
205
206
207
208  /**
209   * Retrieves the set of connection options that will be used by the underlying
210   * connections.
211   *
212   * @return  The set of connection options that will be used by the underlying
213   *          connections.
214   */
215  public LDAPConnectionOptions getConnectionOptions()
216  {
217    return connectionOptions;
218  }
219
220
221
222  /**
223   * {@inheritDoc}
224   */
225  @Override()
226  public LDAPConnection getConnection()
227         throws LDAPException
228  {
229    return new LDAPConnection(socketFactory, connectionOptions, address, port);
230  }
231
232
233
234  /**
235   * {@inheritDoc}
236   */
237  @Override()
238  public void toString(final StringBuilder buffer)
239  {
240    buffer.append("SingleServerSet(server=");
241    buffer.append(address);
242    buffer.append(':');
243    buffer.append(port);
244    buffer.append(')');
245  }
246}