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 com.unboundid.asn1.ASN1Element;
026    import com.unboundid.asn1.ASN1OctetString;
027    import com.unboundid.asn1.ASN1Sequence;
028    import com.unboundid.ldap.sdk.Control;
029    import com.unboundid.ldap.sdk.ExtendedRequest;
030    import com.unboundid.ldap.sdk.LDAPException;
031    import com.unboundid.ldap.sdk.ResultCode;
032    import com.unboundid.util.Debug;
033    import com.unboundid.util.NotMutable;
034    import com.unboundid.util.StaticUtils;
035    import com.unboundid.util.ThreadSafety;
036    import com.unboundid.util.ThreadSafetyLevel;
037    import com.unboundid.util.Validator;
038    
039    import static com.unboundid.ldap.sdk.unboundidds.extensions.ExtOpMessages.*;
040    
041    
042    
043    /**
044     * <BLOCKQUOTE>
045     *   <B>NOTE:</B>  This class is part of the Commercial Edition of the UnboundID
046     *   LDAP SDK for Java.  It is not available for use in applications that
047     *   include only the Standard Edition of the LDAP SDK, and is not supported for
048     *   use in conjunction with non-UnboundID products.
049     * </BLOCKQUOTE>
050     * This class provides an extended request that may be used to clear a server
051     * alarm condition about missed change notifications.  The request has an OID of
052     * 1.3.6.1.4.1.30221.2.6.42 and a value with the following encoding:
053     * <BR><BR>
054     * <PRE>
055     *   ClearMissedNotificationChangesAlarmRequest ::= SEQUENCE {
056     *        notificationManagerID         OCTET STRING,
057     *        notificationDestinationID     OCTET STRING }
058     * </PRE>
059     */
060    @NotMutable()
061    @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
062    public final class ClearMissedNotificationChangesAlarmExtendedRequest
063           extends ExtendedRequest
064    {
065      /**
066       * The OID (1.3.6.1.4.1.30221.2.6.42) for the clear missed notification
067       * changes alarm extended request.
068       */
069      public static final String
070           CLEAR_MISSED_NOTIFICATION_CHANGES_ALARM_REQUEST_OID =
071                "1.3.6.1.4.1.30221.2.6.42";
072    
073    
074    
075      /**
076       * The serial version UID for this serializable class.
077       */
078      private static final long serialVersionUID = -5245417833641929585L;
079    
080    
081    
082      // The notification destination ID.
083      private final String destinationID;
084    
085      // The notification manager ID.
086      private final String managerID;
087    
088    
089    
090      /**
091       * Creates a new clear missed notification changes alarm extended request with
092       * the provided information.
093       *
094       * @param  managerID         The notification manager ID.  It must not be
095       *                           {@code null}.
096       * @param  destinationID     The notification destination ID.  It must not be
097       *                           {@code null}.
098       * @param  controls          The set of controls to include in the request.
099       *                           It may be {@code null} or empty if no controls
100       *                           are needed.
101       */
102      public ClearMissedNotificationChangesAlarmExtendedRequest(
103           final String managerID, final String destinationID,
104           final Control... controls)
105      {
106        super(CLEAR_MISSED_NOTIFICATION_CHANGES_ALARM_REQUEST_OID,
107             encodeValue(managerID, destinationID), controls);
108    
109        this.managerID = managerID;
110        this.destinationID = destinationID;
111      }
112    
113    
114    
115      /**
116       * Creates a new clear missed notification changes alarm extended request from
117       * the provided generic extended request.
118       *
119       * @param  extendedRequest  The generic extended request to use to create this
120       *                          clear missed notification changes alarm extended
121       *                          request.
122       *
123       * @throws LDAPException  If a problem occurs while decoding the request.
124       */
125      public ClearMissedNotificationChangesAlarmExtendedRequest(
126                  final ExtendedRequest extendedRequest)
127             throws LDAPException
128      {
129        super(extendedRequest);
130    
131        final ASN1OctetString value = extendedRequest.getValue();
132        if (value == null)
133        {
134          throw new LDAPException(ResultCode.DECODING_ERROR,
135               ERR_CLEAR_MISSED_NOTIFICATION_CHANGES_ALARM_REQ_DECODE_NO_VALUE.
136                    get());
137        }
138    
139        try
140        {
141          final ASN1Element[] elements =
142               ASN1Sequence.decodeAsSequence(value.getValue()).elements();
143          managerID =
144               ASN1OctetString.decodeAsOctetString(elements[0]).stringValue();
145          destinationID =
146               ASN1OctetString.decodeAsOctetString(elements[1]).stringValue();
147        }
148        catch (final Exception e)
149        {
150          Debug.debugException(e);
151          throw new LDAPException(ResultCode.DECODING_ERROR,
152               ERR_CLEAR_MISSED_NOTIFICATION_CHANGES_ALARM_REQ_ERROR_DECODING_VALUE.
153                    get(StaticUtils.getExceptionMessage(e)),
154               e);
155        }
156      }
157    
158    
159    
160      /**
161       * Encodes the provided information into an ASN.1 octet string suitable for
162       * use as the value of this extended request.
163       *
164       * @param  managerID         The notification manager ID.  It must not be
165       *                           {@code null}.
166       * @param  destinationID     The notification destination ID.  It must not be
167       *                           {@code null}.
168       *
169       * @return  The ASN.1 octet string containing the encoded value.
170       */
171      private static ASN1OctetString encodeValue(final String managerID,
172                          final String destinationID)
173      {
174        Validator.ensureNotNull(managerID);
175        Validator.ensureNotNull(destinationID);
176    
177        final ASN1Sequence valueSequence = new ASN1Sequence(
178             new ASN1OctetString(managerID),
179             new ASN1OctetString(destinationID));
180        return new ASN1OctetString(valueSequence.encode());
181      }
182    
183    
184    
185      /**
186       * Retrieves the notification manager ID.
187       *
188       * @return  The notification manager ID.
189       */
190      public String getManagerID()
191      {
192        return managerID;
193      }
194    
195    
196    
197      /**
198       * Retrieves the notification destination ID.
199       *
200       * @return  The notification destination ID.
201       */
202      public String getDestinationID()
203      {
204        return destinationID;
205      }
206    
207    
208    
209      /**
210       * {@inheritDoc}
211       */
212      @Override()
213      public ClearMissedNotificationChangesAlarmExtendedRequest duplicate()
214      {
215        return duplicate(getControls());
216      }
217    
218    
219    
220      /**
221       * {@inheritDoc}
222       */
223      @Override()
224      public ClearMissedNotificationChangesAlarmExtendedRequest
225                  duplicate(final Control[] controls)
226      {
227        final ClearMissedNotificationChangesAlarmExtendedRequest r =
228             new ClearMissedNotificationChangesAlarmExtendedRequest(managerID,
229                  destinationID, controls);
230        r.setResponseTimeoutMillis(getResponseTimeoutMillis(null));
231        return r;
232      }
233    
234    
235    
236      /**
237       * {@inheritDoc}
238       */
239      @Override()
240      public String getExtendedRequestName()
241      {
242        return INFO_EXTENDED_REQUEST_NAME_CLEAR_MISSED_NOTIFICATION_CHANGES_ALARM.
243             get();
244      }
245    
246    
247    
248      /**
249       * {@inheritDoc}
250       */
251      @Override()
252      public void toString(final StringBuilder buffer)
253      {
254        buffer.append("ClearMissedNotificationChangesAlarmExtendedRequest(" +
255             "managerID='");
256        buffer.append(managerID);
257        buffer.append("', destinationID='");
258        buffer.append(destinationID);
259        buffer.append('\'');
260    
261        final Control[] controls = getControls();
262        if (controls.length > 0)
263        {
264          buffer.append(", controls={");
265          for (int i=0; i < controls.length; i++)
266          {
267            if (i > 0)
268            {
269              buffer.append(", ");
270            }
271    
272            buffer.append(controls[i]);
273          }
274          buffer.append('}');
275        }
276    
277        buffer.append(')');
278      }
279    }