001 /* 002 * Copyright 2010-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 import java.util.Date; 027 028 import com.unboundid.asn1.ASN1Element; 029 import com.unboundid.asn1.ASN1OctetString; 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.NotExtensible; 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 defines the API that should be implemented by classes which may 051 * represent a way to identify the start of a batch of changes to retrieve using 052 * the {@link GetChangelogBatchExtendedRequest}. 053 */ 054 @NotExtensible() 055 @ThreadSafety(level=ThreadSafetyLevel.INTERFACE_THREADSAFE) 056 public abstract class ChangelogBatchStartingPoint 057 implements Serializable 058 { 059 /** 060 * The serial version UID for this serializable class. 061 */ 062 private static final long serialVersionUID = -1580168275337643812L; 063 064 065 066 /** 067 * Encodes this starting point value to an ASN.1 element suitable for 068 * inclusion in a changelog batch extended request. 069 * 070 * @return The encoded representation of this starting point value. 071 */ 072 public abstract ASN1Element encode(); 073 074 075 076 /** 077 * Decodes the provided ASN.1 element as a changelog batch starting point. 078 * 079 * @param element The ASN.1 element to be decoded. It must not be 080 * {@code null}. 081 * 082 * @return The decoded changelog batch starting point. 083 * 084 * @throws LDAPException If the provided ASN.1 element cannot be decoded as 085 * a changelog batch starting point. 086 */ 087 public static ChangelogBatchStartingPoint decode(final ASN1Element element) 088 throws LDAPException 089 { 090 Validator.ensureNotNull(element); 091 092 switch (element.getType()) 093 { 094 case ResumeWithTokenStartingPoint.TYPE: 095 return new ResumeWithTokenStartingPoint( 096 ASN1OctetString.decodeAsOctetString(element)); 097 098 case ResumeWithCSNStartingPoint.TYPE: 099 return new ResumeWithCSNStartingPoint( 100 ASN1OctetString.decodeAsOctetString(element).stringValue()); 101 102 case BeginningOfChangelogStartingPoint.TYPE: 103 if (element.getValueLength() != 0) 104 { 105 throw new LDAPException(ResultCode.DECODING_ERROR, 106 ERR_BEGINNING_OF_CHANGELOG_STARTING_POINT_HAS_VALUE.get()); 107 } 108 return new BeginningOfChangelogStartingPoint(); 109 110 case EndOfChangelogStartingPoint.TYPE: 111 if (element.getValueLength() != 0) 112 { 113 throw new LDAPException(ResultCode.DECODING_ERROR, 114 ERR_END_OF_CHANGELOG_STARTING_POINT_HAS_VALUE.get()); 115 } 116 return new EndOfChangelogStartingPoint(); 117 118 case ChangeTimeStartingPoint.TYPE: 119 final Date time; 120 try 121 { 122 time = StaticUtils.decodeGeneralizedTime( 123 ASN1OctetString.decodeAsOctetString(element).stringValue()); 124 } 125 catch (final Exception e) 126 { 127 Debug.debugException(e); 128 throw new LDAPException(ResultCode.DECODING_ERROR, 129 ERR_CHANGE_TIME_STARTING_POINT_MALFORMED_VALUE.get( 130 StaticUtils.getExceptionMessage(e)), e); 131 } 132 return new ChangeTimeStartingPoint(time.getTime()); 133 134 default: 135 throw new LDAPException(ResultCode.DECODING_ERROR, 136 ERR_UNKNOWN_CHANGELOG_BATCH_STARTING_POINT_TYPE.get( 137 StaticUtils.toHex(element.getType()))); 138 } 139 } 140 141 142 143 /** 144 * Retrieves a string representation of this changelog batch starting point. 145 * 146 * @return A string representation of this changelog batch starting point. 147 */ 148 @Override() 149 public final String toString() 150 { 151 final StringBuilder buffer = new StringBuilder(); 152 toString(buffer); 153 return buffer.toString(); 154 } 155 156 157 158 /** 159 * Appends a string representation of this changelog batch starting point to 160 * the provided buffer. 161 * 162 * @param buffer The buffer to which the information should be appended. 163 */ 164 public abstract void toString(final StringBuilder buffer); 165 }