001 /* 002 * Copyright 2014-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.util.ArrayList; 026 import java.util.Collection; 027 import java.util.Collections; 028 import java.util.Iterator; 029 import java.util.LinkedHashSet; 030 import java.util.Set; 031 032 import com.unboundid.asn1.ASN1Element; 033 import com.unboundid.asn1.ASN1OctetString; 034 import com.unboundid.asn1.ASN1Sequence; 035 import com.unboundid.asn1.ASN1Set; 036 import com.unboundid.ldap.sdk.Control; 037 import com.unboundid.ldap.sdk.ExtendedRequest; 038 import com.unboundid.ldap.sdk.ExtendedResult; 039 import com.unboundid.ldap.sdk.LDAPConnection; 040 import com.unboundid.ldap.sdk.LDAPException; 041 import com.unboundid.ldap.sdk.ResultCode; 042 import com.unboundid.util.Debug; 043 import com.unboundid.util.NotMutable; 044 import com.unboundid.util.StaticUtils; 045 import com.unboundid.util.ThreadSafety; 046 import com.unboundid.util.ThreadSafetyLevel; 047 import com.unboundid.util.Validator; 048 049 import static com.unboundid.ldap.sdk.unboundidds.extensions.ExtOpMessages.*; 050 051 052 053 /** 054 * <BLOCKQUOTE> 055 * <B>NOTE:</B> This class is part of the Commercial Edition of the UnboundID 056 * LDAP SDK for Java. It is not available for use in applications that 057 * include only the Standard Edition of the LDAP SDK, and is not supported for 058 * use in conjunction with non-UnboundID products. 059 * </BLOCKQUOTE> 060 * This class provides an extended request that may be used to retrieve a list 061 * of the subscriptions associated with a specified notification manager, 062 * optionally restricted to a specified set of destinations. The request has an 063 * OID of 1.3.6.1.4.1.30221.2.6.40 and a value with the following encoding: 064 * <BR><BR> 065 * <PRE> 066 * ListNotificationSubscriptionsRequest ::= SEQUENCE { 067 * notificationManagerID OCTET STRING, 068 * notificationDestinationIDs SET OF OCTET STRING OPTIONAL } 069 * </PRE> 070 */ 071 @NotMutable() 072 @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) 073 public final class ListNotificationSubscriptionsExtendedRequest 074 extends ExtendedRequest 075 { 076 /** 077 * The OID (1.3.6.1.4.1.30221.2.6.40) for the list notification subscriptions 078 * extended request. 079 */ 080 public static final String LIST_NOTIFICATION_SUBSCRIPTIONS_REQUEST_OID = 081 "1.3.6.1.4.1.30221.2.6.40"; 082 083 084 085 /** 086 * The serial version UID for this serializable class. 087 */ 088 private static final long serialVersionUID = -8124073083247944273L; 089 090 091 092 // The notification destination IDs. 093 private final Set<String> destinationIDs; 094 095 // The notification manager ID. 096 private final String managerID; 097 098 099 100 /** 101 * Creates a new list notification subscriptions extended request with the 102 * provided information. 103 * 104 * @param managerID The notification manager ID. It must not be 105 * {@code null}. 106 * @param destinationIDs The set of notification destination IDs for 107 * which to retrieve the subscription information. 108 * It may be {@code null} or empty if subscription 109 * information for all destinations should be 110 * returned. 111 */ 112 public ListNotificationSubscriptionsExtendedRequest(final String managerID, 113 final String... destinationIDs) 114 { 115 this(managerID, StaticUtils.toList(destinationIDs)); 116 } 117 118 119 120 /** 121 * Creates a new list notification subscriptions extended request with the 122 * provided information. 123 * 124 * @param managerID The notification manager ID. It must not be 125 * {@code null}. 126 * @param destinationIDs The set of notification destination IDs for 127 * which to retrieve the subscription information. 128 * It may be {@code null} or empty if subscription 129 * information for all destinations should be 130 * returned. 131 * @param controls The set of controls to include in the request. 132 * It may be {@code null} or empty if no controls 133 * are needed. 134 */ 135 public ListNotificationSubscriptionsExtendedRequest(final String managerID, 136 final Collection<String> destinationIDs, 137 final Control... controls) 138 { 139 super(LIST_NOTIFICATION_SUBSCRIPTIONS_REQUEST_OID, 140 encodeValue(managerID, destinationIDs), controls); 141 142 this.managerID = managerID; 143 144 if (destinationIDs == null) 145 { 146 this.destinationIDs = Collections.emptySet(); 147 } 148 else 149 { 150 this.destinationIDs = Collections.unmodifiableSet( 151 new LinkedHashSet<String>(destinationIDs)); 152 } 153 } 154 155 156 157 /** 158 * Creates a new list notification subscriptions extended request from the 159 * provided generic extended request. 160 * 161 * @param extendedRequest The generic extended request to use to create this 162 * list notification subscriptions extended request. 163 * 164 * @throws LDAPException If a problem occurs while decoding the request. 165 */ 166 public ListNotificationSubscriptionsExtendedRequest( 167 final ExtendedRequest extendedRequest) 168 throws LDAPException 169 { 170 super(extendedRequest); 171 172 final ASN1OctetString value = extendedRequest.getValue(); 173 if (value == null) 174 { 175 throw new LDAPException(ResultCode.DECODING_ERROR, 176 ERR_LIST_NOTIFICATION_SUBS_REQ_DECODE_NO_VALUE.get()); 177 } 178 179 try 180 { 181 final ASN1Element[] elements = 182 ASN1Sequence.decodeAsSequence(value.getValue()).elements(); 183 managerID = 184 ASN1OctetString.decodeAsOctetString(elements[0]).stringValue(); 185 186 if (elements.length > 1) 187 { 188 final ASN1Element[] destIDElements = 189 ASN1Sequence.decodeAsSequence(elements[1]).elements(); 190 191 final LinkedHashSet<String> destIDs = 192 new LinkedHashSet<String>(destIDElements.length); 193 for (final ASN1Element e : destIDElements) 194 { 195 destIDs.add(ASN1OctetString.decodeAsOctetString(e).stringValue()); 196 } 197 destinationIDs = Collections.unmodifiableSet(destIDs); 198 } 199 else 200 { 201 destinationIDs = Collections.emptySet(); 202 } 203 } 204 catch (final Exception e) 205 { 206 Debug.debugException(e); 207 throw new LDAPException(ResultCode.DECODING_ERROR, 208 ERR_LIST_NOTIFICATION_SUBS_REQ_ERROR_DECODING_VALUE.get( 209 StaticUtils.getExceptionMessage(e)), 210 e); 211 } 212 } 213 214 215 216 /** 217 * Encodes the provided information into an ASN.1 octet string suitable for 218 * use as the value of this extended request. 219 * 220 * @param managerID The notification manager ID. It must not be 221 * {@code null}. 222 * @param destinationIDs The set of notification destination IDs for 223 * which to retrieve the subscription information. 224 * It may be {@code null} or empty if subscription 225 * information for all destinations should be 226 * returned. 227 * 228 * @return The ASN.1 octet string containing the encoded value. 229 */ 230 private static ASN1OctetString encodeValue(final String managerID, 231 final Collection<String> destinationIDs) 232 { 233 Validator.ensureNotNull(managerID); 234 235 final ArrayList<ASN1Element> elements = new ArrayList<ASN1Element>(2); 236 elements.add(new ASN1OctetString(managerID)); 237 238 if ((destinationIDs != null) && (! destinationIDs.isEmpty())) 239 { 240 final LinkedHashSet<ASN1Element> destIDElements = 241 new LinkedHashSet<ASN1Element>(destinationIDs.size()); 242 for (final String destinationID : destinationIDs) 243 { 244 destIDElements.add(new ASN1OctetString(destinationID)); 245 } 246 elements.add(new ASN1Set(destIDElements)); 247 } 248 249 return new ASN1OctetString(new ASN1Sequence(elements).encode()); 250 } 251 252 253 254 /** 255 * {@inheritDoc} 256 */ 257 @Override() 258 public ListNotificationSubscriptionsExtendedResult 259 process(final LDAPConnection connection, final int depth) 260 throws LDAPException 261 { 262 final ExtendedResult extendedResponse = super.process(connection, depth); 263 return new ListNotificationSubscriptionsExtendedResult(extendedResponse); 264 } 265 266 267 268 /** 269 * Retrieves the notification manager ID. 270 * 271 * @return The notification manager ID. 272 */ 273 public String getManagerID() 274 { 275 return managerID; 276 } 277 278 279 280 /** 281 * Retrieves the notification destination IDs, if any were provided. 282 * 283 * @return The notification destination IDs, or an empty set if none were 284 * provided. 285 */ 286 public Set<String> getDestinationIDs() 287 { 288 return destinationIDs; 289 } 290 291 292 293 /** 294 * {@inheritDoc} 295 */ 296 @Override() 297 public ListNotificationSubscriptionsExtendedRequest duplicate() 298 { 299 return duplicate(getControls()); 300 } 301 302 303 304 /** 305 * {@inheritDoc} 306 */ 307 @Override() 308 public ListNotificationSubscriptionsExtendedRequest 309 duplicate(final Control[] controls) 310 { 311 final ListNotificationSubscriptionsExtendedRequest r = 312 new ListNotificationSubscriptionsExtendedRequest(managerID, 313 destinationIDs, controls); 314 r.setResponseTimeoutMillis(getResponseTimeoutMillis(null)); 315 return r; 316 } 317 318 319 320 /** 321 * {@inheritDoc} 322 */ 323 @Override() 324 public String getExtendedRequestName() 325 { 326 return INFO_EXTENDED_REQUEST_NAME_LIST_NOTIFICATION_SUBS.get(); 327 } 328 329 330 331 /** 332 * {@inheritDoc} 333 */ 334 @Override() 335 public void toString(final StringBuilder buffer) 336 { 337 buffer.append("ListNotificationSubscriptionsExtendedRequest(managerID='"); 338 buffer.append(managerID); 339 buffer.append('\''); 340 341 if (! destinationIDs.isEmpty()) 342 { 343 buffer.append(", destinationIDs={"); 344 345 final Iterator<String> iterator = destinationIDs.iterator(); 346 while (iterator.hasNext()) 347 { 348 buffer.append('\''); 349 buffer.append(iterator.next()); 350 buffer.append('\''); 351 352 if (iterator.hasNext()) 353 { 354 buffer.append(", "); 355 } 356 } 357 358 buffer.append('}'); 359 } 360 361 final Control[] controls = getControls(); 362 if (controls.length > 0) 363 { 364 buffer.append(", controls={"); 365 for (int i=0; i < controls.length; i++) 366 { 367 if (i > 0) 368 { 369 buffer.append(", "); 370 } 371 372 buffer.append(controls[i]); 373 } 374 buffer.append('}'); 375 } 376 377 buffer.append(')'); 378 } 379 }