001 /*
002 * Copyright 2009-2015 UnboundID Corp.
003 * All Rights Reserved.
004 */
005 /*
006 * Copyright (C) 2015 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 */
021 package com.unboundid.ldap.sdk.unboundidds.extensions;
022
023
024
025 import java.io.Serializable;
026
027 import com.unboundid.asn1.ASN1Element;
028 import com.unboundid.asn1.ASN1Integer;
029 import com.unboundid.asn1.ASN1OctetString;
030 import com.unboundid.asn1.ASN1Sequence;
031 import com.unboundid.ldap.sdk.LDAPException;
032 import com.unboundid.ldap.sdk.ResultCode;
033 import com.unboundid.util.NotMutable;
034 import com.unboundid.util.ThreadSafety;
035 import com.unboundid.util.ThreadSafetyLevel;
036
037 import static com.unboundid.ldap.sdk.unboundidds.extensions.ExtOpMessages.*;
038 import static com.unboundid.util.Debug.*;
039 import static com.unboundid.util.StaticUtils.*;
040 import static com.unboundid.util.Validator.*;
041
042
043
044 /**
045 * <BLOCKQUOTE>
046 * <B>NOTE:</B> This class is part of the Commercial Edition of the UnboundID
047 * LDAP SDK for Java. It is not available for use in applications that
048 * include only the Standard Edition of the LDAP SDK, and is not supported for
049 * use in conjunction with non-UnboundID products.
050 * </BLOCKQUOTE>
051 * This class provides a data structure for holding information about the
052 * configuration of backend sets as used by the stream proxy values extended
053 * request.
054 */
055 @NotMutable()
056 @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
057 public final class StreamProxyValuesBackendSet
058 implements Serializable
059 {
060 /**
061 * The serial version UID for this serializable class.
062 */
063 private static final long serialVersionUID = -5437145469462592611L;
064
065
066
067 // The backend set ID for this backend set.
068 private final ASN1OctetString backendSetID;
069
070 // The ports of the directory servers in this backend set.
071 private final int[] ports;
072
073 // The addresses of the directory servers in this backend set.
074 private final String[] hosts;
075
076
077
078 /**
079 * Creates a new backend set with the provided information.
080 *
081 * @param backendSetID The backend set ID for this backend set. It must not
082 * be {@code null}.
083 * @param hosts The addresses of the servers for this backend set.
084 * It must not be {@code null} or empty, and it must
085 * have the same number of elements as the {@code ports}
086 * array.
087 * @param ports The ports of the servers for this backend set. It
088 * must not be {@code null} or empty, and it must have
089 * the same number of elements as the {@code hosts}
090 * array.
091 */
092 public StreamProxyValuesBackendSet(final ASN1OctetString backendSetID,
093 final String[] hosts, final int[] ports)
094 {
095 ensureNotNull(backendSetID, hosts, ports);
096 ensureTrue(hosts.length > 0);
097 ensureTrue(hosts.length == ports.length);
098
099 this.backendSetID = backendSetID;
100 this.hosts = hosts;
101 this.ports = ports;
102 }
103
104
105
106 /**
107 * Retrieves the backend set ID for this backend set.
108 *
109 * @return The backend set ID for this backend set.
110 */
111 public ASN1OctetString getBackendSetID()
112 {
113 return backendSetID;
114 }
115
116
117
118 /**
119 * Retrieves the addresses of the servers for this backend set.
120 *
121 * @return The addresses of the servers for this backend set.
122 */
123 public String[] getHosts()
124 {
125 return hosts;
126 }
127
128
129
130 /**
131 * Retrieves the ports of the servers for this backend set.
132 *
133 * @return The ports of the servers for this backend set.
134 */
135 public int[] getPorts()
136 {
137 return ports;
138 }
139
140
141
142 /**
143 * Encodes this backend set object in a form suitable for inclusion in the
144 * value of the stream proxy values extended request.
145 *
146 * @return The encoded representation of this backend set.
147 */
148 public ASN1Element encode()
149 {
150 final ASN1Element[] hostPortElements = new ASN1Element[hosts.length];
151 for (int i=0; i < hosts.length; i++)
152 {
153 hostPortElements[i] = new ASN1Sequence(
154 new ASN1OctetString(hosts[i]),
155 new ASN1Integer(ports[i]));
156 }
157
158 return new ASN1Sequence(
159 backendSetID,
160 new ASN1Sequence(hostPortElements));
161 }
162
163
164
165 /**
166 * Decodes the provided ASN.1 element as a backend set.
167 *
168 * @param element The element to be decoded as a backend set.
169 *
170 * @return The decoded backend set.
171 *
172 * @throws LDAPException If the provided ASN.1 element cannot be decoded as
173 * a backend set.
174 */
175 public static StreamProxyValuesBackendSet decode(final ASN1Element element)
176 throws LDAPException
177 {
178 try
179 {
180 final ASN1Element[] elements =
181 ASN1Sequence.decodeAsSequence(element).elements();
182 final ASN1OctetString backendSetID =
183 ASN1OctetString.decodeAsOctetString(elements[0]);
184
185 final ASN1Element[] hostPortElements =
186 ASN1Sequence.decodeAsSequence(elements[1]).elements();
187 final String[] hosts = new String[hostPortElements.length];
188 final int[] ports = new int[hostPortElements.length];
189 for (int i=0; i < hostPortElements.length; i++)
190 {
191 final ASN1Element[] hpElements =
192 ASN1Sequence.decodeAsSequence(hostPortElements[i]).elements();
193 hosts[i] =
194 ASN1OctetString.decodeAsOctetString(hpElements[0]).stringValue();
195 ports[i] = ASN1Integer.decodeAsInteger(hpElements[1]).intValue();
196 }
197
198 return new StreamProxyValuesBackendSet(backendSetID, hosts, ports);
199 }
200 catch (Exception e)
201 {
202 debugException(e);
203 throw new LDAPException(ResultCode.DECODING_ERROR,
204 ERR_STREAM_PROXY_VALUES_BACKEND_SET_CANNOT_DECODE.get(
205 getExceptionMessage(e)), e);
206 }
207 }
208
209
210
211 /**
212 * Retrieves a string representation of this stream proxy values backend set.
213 *
214 * @return A string representation of this stream proxy values backend set.
215 */
216 @Override()
217 public String toString()
218 {
219 final StringBuilder buffer = new StringBuilder();
220 toString(buffer);
221 return buffer.toString();
222 }
223
224
225
226 /**
227 * Appends a string representation of this stream proxy values backend set to
228 * the provided buffer.
229 *
230 * @param buffer The buffer to which the stream representation should be
231 * appended.
232 */
233 public void toString(final StringBuilder buffer)
234 {
235 buffer.append("StreamProxyValuesBackendSet(id=");
236 backendSetID.toString(buffer);
237 buffer.append(", servers={");
238
239 for (int i=0; i < hosts.length; i++)
240 {
241 if (i > 0)
242 {
243 buffer.append(", ");
244 }
245 buffer.append(hosts[i]);
246 buffer.append(':');
247 buffer.append(ports[i]);
248 }
249 buffer.append("})");
250 }
251 }