001/* 002 * Copyright 2007-2014 UnboundID Corp. 003 * All Rights Reserved. 004 */ 005/* 006 * Copyright (C) 2008-2014 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.extensions; 022 023 024import com.unboundid.asn1.ASN1OctetString; 025import com.unboundid.ldap.sdk.Control; 026import com.unboundid.ldap.sdk.ExtendedResult; 027import com.unboundid.ldap.sdk.ResultCode; 028import com.unboundid.util.NotMutable; 029import com.unboundid.util.ThreadSafety; 030import com.unboundid.util.ThreadSafetyLevel; 031 032import static com.unboundid.ldap.sdk.extensions.ExtOpMessages.*; 033 034 035 036/** 037 * This class implements a data structure for storing the information from an 038 * extended result for the "Who Am I?" extended request as defined in 039 * <A HREF="http://www.ietf.org/rfc/rfc4532.txt">RFC 4532</A>. It is able to 040 * decode a generic extended result to extract the returned authorization 041 * identify from it. 042 * <BR><BR> 043 * See the documentation for the {@link WhoAmIExtendedRequest} class for an 044 * example that demonstrates using the "Who Am I?" extended operation. 045 */ 046@NotMutable() 047@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) 048public final class WhoAmIExtendedResult 049 extends ExtendedResult 050{ 051 /** 052 * The serial version UID for this serializable class. 053 */ 054 private static final long serialVersionUID = 7466531316632846077L; 055 056 057 058 // The authorization identity string returned by the server. 059 private final String authorizationID; 060 061 062 063 /** 064 * Creates a new "Who Am I?" extended result from the provided extended 065 * result. 066 * 067 * @param extendedResult The extended result to be decoded as a "Who Am I?" 068 * extended result. 069 */ 070 public WhoAmIExtendedResult(final ExtendedResult extendedResult) 071 { 072 super(extendedResult); 073 074 final ASN1OctetString value = extendedResult.getValue(); 075 if (value == null) 076 { 077 authorizationID = null; 078 } 079 else 080 { 081 authorizationID = value.stringValue(); 082 } 083 } 084 085 086 087 /** 088 * Creates a new "Who Am I?" extended result with the provided information. 089 * 090 * @param messageID The message ID for the LDAP message that is 091 * associated with this LDAP result. 092 * @param resultCode The result code from the response. 093 * @param diagnosticMessage The diagnostic message from the response, if 094 * available. 095 * @param matchedDN The matched DN from the response, if available. 096 * @param referralURLs The set of referral URLs from the response, if 097 * available. 098 * @param authorizationID The authorization ID for this response, if 099 * available. 100 * @param responseControls The set of controls from the response, if 101 * available. 102 */ 103 public WhoAmIExtendedResult(final int messageID, final ResultCode resultCode, 104 final String diagnosticMessage, 105 final String matchedDN, 106 final String[] referralURLs, 107 final String authorizationID, 108 final Control[] responseControls) 109 { 110 super(messageID, resultCode, diagnosticMessage, matchedDN, referralURLs, 111 null, encodeValue(authorizationID), responseControls); 112 113 this.authorizationID = authorizationID; 114 } 115 116 117 118 /** 119 * Encodes the value for this extended result using the provided information. 120 * 121 * @param authorizationID The authorization ID for this response. 122 * 123 * @return An ASN.1 octet string containing the encoded value, or 124 * {@code null} if there should not be an encoded value. 125 */ 126 private static ASN1OctetString encodeValue(final String authorizationID) 127 { 128 if (authorizationID == null) 129 { 130 return null; 131 } 132 else 133 { 134 return new ASN1OctetString(authorizationID); 135 } 136 } 137 138 139 140 /** 141 * Retrieves the authorization ID for this "Who Am I?" extended result, if 142 * available. 143 * 144 * @return The authorization ID for this "Who Am I?" extended result, or 145 * {@code null} if none was provided. 146 */ 147 public String getAuthorizationID() 148 { 149 return authorizationID; 150 } 151 152 153 154 /** 155 * {@inheritDoc} 156 */ 157 @Override() 158 public String getExtendedResultName() 159 { 160 return INFO_EXTENDED_RESULT_NAME_WHO_AM_I.get(); 161 } 162 163 164 165 /** 166 * Appends a string representation of this extended result to the provided 167 * buffer. 168 * 169 * @param buffer The buffer to which a string representation of this 170 * extended result will be appended. 171 */ 172 @Override() 173 public void toString(final StringBuilder buffer) 174 { 175 buffer.append("WhoAmIExtendedResult(resultCode="); 176 buffer.append(getResultCode()); 177 178 final int messageID = getMessageID(); 179 if (messageID >= 0) 180 { 181 buffer.append(", messageID="); 182 buffer.append(messageID); 183 } 184 185 if (authorizationID != null) 186 { 187 buffer.append(", authorizationID='"); 188 buffer.append(authorizationID); 189 buffer.append('\''); 190 } 191 192 final String diagnosticMessage = getDiagnosticMessage(); 193 if (diagnosticMessage != null) 194 { 195 buffer.append(", diagnosticMessage='"); 196 buffer.append(diagnosticMessage); 197 buffer.append('\''); 198 } 199 200 final String matchedDN = getMatchedDN(); 201 if (matchedDN != null) 202 { 203 buffer.append(", matchedDN='"); 204 buffer.append(matchedDN); 205 buffer.append('\''); 206 } 207 208 final String[] referralURLs = getReferralURLs(); 209 if (referralURLs.length > 0) 210 { 211 buffer.append(", referralURLs={"); 212 for (int i=0; i < referralURLs.length; i++) 213 { 214 if (i > 0) 215 { 216 buffer.append(", "); 217 } 218 219 buffer.append('\''); 220 buffer.append(referralURLs[i]); 221 buffer.append('\''); 222 } 223 buffer.append('}'); 224 } 225 226 final Control[] responseControls = getResponseControls(); 227 if (responseControls.length > 0) 228 { 229 buffer.append(", responseControls={"); 230 for (int i=0; i < responseControls.length; i++) 231 { 232 if (i > 0) 233 { 234 buffer.append(", "); 235 } 236 237 buffer.append(responseControls[i]); 238 } 239 buffer.append('}'); 240 } 241 242 buffer.append(')'); 243 } 244}