001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020 021 package org.apache.directory.shared.ldap.message; 022 023 import org.apache.directory.shared.ldap.message.internal.InternalLdapResult; 024 import org.apache.directory.shared.ldap.message.internal.InternalReferral; 025 import org.apache.directory.shared.ldap.name.DN; 026 027 028 /** 029 * LdapResult implementation. 030 * 031 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 032 * @version $Revision: 918756 $ 033 */ 034 public class LdapResultImpl implements InternalLdapResult 035 { 036 static final long serialVersionUID = -1446626887394613213L; 037 038 /** Lowest matched entry Dn - defaults to empty string */ 039 private DN matchedDn; 040 041 /** Referral associated with this LdapResult if the errorCode is REFERRAL */ 042 private InternalReferral referral; 043 044 /** Decriptive error message - defaults to empty string */ 045 private String errorMessage; 046 047 /** Resultant operation error code - defaults to SUCCESS */ 048 private ResultCodeEnum resultCode = ResultCodeEnum.SUCCESS; 049 050 051 // ------------------------------------------------------------------------ 052 // LdapResult Interface Method Implementations 053 // ------------------------------------------------------------------------ 054 055 /** 056 * Gets the descriptive error message associated with the error code. May be 057 * null for SUCCESS, COMPARETRUE, COMPAREFALSE and REFERRAL operations. 058 * 059 * @return the descriptive error message. 060 */ 061 public String getErrorMessage() 062 { 063 return errorMessage; 064 } 065 066 067 /** 068 * Sets the descriptive error message associated with the error code. May be 069 * null for SUCCESS, COMPARETRUE, and COMPAREFALSE operations. 070 * 071 * @param errorMessage 072 * the descriptive error message. 073 */ 074 public void setErrorMessage( String errorMessage ) 075 { 076 this.errorMessage = errorMessage; 077 } 078 079 080 /** 081 * Gets the lowest entry in the directory that was matched. For result codes 082 * of noSuchObject, aliasProblem, invalidDNSyntax and 083 * aliasDereferencingProblem, the matchedDN field is set to the name of the 084 * lowest entry (object or alias) in the directory that was matched. If no 085 * aliases were dereferenced while attempting to locate the entry, this will 086 * be a truncated form of the name provided, or if aliases were 087 * dereferenced, of the resulting name, as defined in section 12.5 of X.511 088 * [8]. The matchedDN field is to be set to a zero length string with all 089 * other result codes. 090 * 091 * @return the Dn of the lowest matched entry. 092 */ 093 public DN getMatchedDn() 094 { 095 return matchedDn; 096 } 097 098 099 /** 100 * Sets the lowest entry in the directory that was matched. 101 * 102 * @see #getMatchedDn() 103 * @param matchedDn 104 * the Dn of the lowest matched entry. 105 */ 106 public void setMatchedDn( DN matchedDn ) 107 { 108 this.matchedDn = matchedDn; 109 } 110 111 112 /** 113 * Gets the result code enumeration associated with the response. 114 * Corresponds to the <b> resultCode </b> field within the LDAPResult ASN.1 115 * structure. 116 * 117 * @return the result code enum value. 118 */ 119 public ResultCodeEnum getResultCode() 120 { 121 return resultCode; 122 } 123 124 125 /** 126 * Sets the result code enumeration associated with the response. 127 * Corresponds to the <b> resultCode </b> field within the LDAPResult ASN.1 128 * structure. 129 * 130 * @param resultCode 131 * the result code enum value. 132 */ 133 public void setResultCode( ResultCodeEnum resultCode ) 134 { 135 this.resultCode = resultCode; 136 } 137 138 139 /** 140 * Gets the Referral associated with this LdapResult if the resultCode 141 * property is set to the REFERRAL ResultCodeEnum. 142 * 143 * @return the referral on REFERRAL errors, null on all others. 144 */ 145 public InternalReferral getReferral() 146 { 147 return referral; 148 } 149 150 151 /** 152 * Gets whether or not this result represents a Referral. For referrals the 153 * error code is set to REFERRAL and the referral property is not null. 154 * 155 * @return true if this result represents a referral. 156 */ 157 public boolean isReferral() 158 { 159 return referral != null; 160 } 161 162 163 /** 164 * Sets the Referral associated with this LdapResult if the resultCode 165 * property is set to the REFERRAL ResultCodeEnum. Setting this property 166 * will result in a true return from isReferral and the resultCode should be 167 * set to REFERRAL. 168 * 169 * @param referral 170 * optional referral on REFERRAL errors. 171 */ 172 public void setReferral( InternalReferral referral ) 173 { 174 this.referral = referral; 175 } 176 177 178 /** 179 * @param obj The object to compare with 180 * @return <code>true</code> if both objects are equals 181 */ 182 public boolean equals( Object obj ) 183 { 184 // quickly return true if this is the obj 185 if ( obj == this ) 186 { 187 return true; 188 } 189 190 // return false if object does not implement interface 191 if ( !( obj instanceof InternalLdapResult ) ) 192 { 193 return false; 194 } 195 196 // compare all the like elements of the two LdapResult objects 197 InternalLdapResult result = ( InternalLdapResult ) obj; 198 199 if ( referral == null && result.getReferral() != null ) 200 { 201 return false; 202 } 203 204 if ( result.getReferral() == null && referral != null ) 205 { 206 return false; 207 } 208 209 if ( referral != null && result.getReferral() != null ) 210 { 211 if ( !referral.equals( result.getReferral() ) ) 212 { 213 return false; 214 } 215 } 216 217 if ( !resultCode.equals( result.getResultCode() ) ) 218 { 219 return false; 220 } 221 222 // Handle Error Messages where "" is considered equivalent to null 223 String errMsg0 = errorMessage; 224 String errMsg1 = result.getErrorMessage(); 225 226 if ( errMsg0 == null ) 227 { 228 errMsg0 = ""; 229 } 230 231 if ( errMsg1 == null ) 232 { 233 errMsg1 = ""; 234 } 235 236 if ( !errMsg0.equals( errMsg1 ) ) 237 { 238 return false; 239 } 240 241 if ( matchedDn != null ) 242 { 243 if ( !matchedDn.equals( result.getMatchedDn() ) ) 244 { 245 return false; 246 } 247 } 248 else if ( result.getMatchedDn() != null ) // one is null other is not 249 { 250 return false; 251 } 252 253 return true; 254 } 255 256 257 /** 258 * Get a String representation of a LdapResult 259 * 260 * @return A LdapResult String 261 */ 262 public String toString() 263 { 264 265 StringBuffer sb = new StringBuffer(); 266 267 sb.append( " Ldap Result\n" ); 268 sb.append( " Result code : (" ).append( resultCode ).append( ')' ); 269 270 switch ( resultCode ) 271 { 272 273 case SUCCESS : 274 sb.append( " success\n" ); 275 break; 276 277 case OPERATIONS_ERROR : 278 sb.append( " operationsError\n" ); 279 break; 280 281 case PROTOCOL_ERROR : 282 sb.append( " protocolError\n" ); 283 break; 284 285 case TIME_LIMIT_EXCEEDED : 286 sb.append( " timeLimitExceeded\n" ); 287 break; 288 289 case SIZE_LIMIT_EXCEEDED : 290 sb.append( " sizeLimitExceeded\n" ); 291 break; 292 293 case COMPARE_FALSE : 294 sb.append( " compareFalse\n" ); 295 break; 296 297 case COMPARE_TRUE : 298 sb.append( " compareTrue\n" ); 299 break; 300 301 case AUTH_METHOD_NOT_SUPPORTED : 302 sb.append( " authMethodNotSupported\n" ); 303 break; 304 305 case STRONG_AUTH_REQUIRED : 306 sb.append( " strongAuthRequired\n" ); 307 break; 308 309 case REFERRAL : 310 sb.append( " referral -- new\n" ); 311 break; 312 313 case ADMIN_LIMIT_EXCEEDED : 314 sb.append( " adminLimitExceeded -- new\n" ); 315 break; 316 317 case UNAVAILABLE_CRITICAL_EXTENSION : 318 sb.append( " unavailableCriticalExtension -- new\n" ); 319 break; 320 321 case CONFIDENTIALITY_REQUIRED : 322 sb.append( " confidentialityRequired -- new\n" ); 323 break; 324 325 case SASL_BIND_IN_PROGRESS : 326 sb.append( " saslBindInProgress -- new\n" ); 327 break; 328 329 case NO_SUCH_ATTRIBUTE : 330 sb.append( " noSuchAttribute\n" ); 331 break; 332 333 case UNDEFINED_ATTRIBUTE_TYPE : 334 sb.append( " undefinedAttributeType\n" ); 335 break; 336 337 case INAPPROPRIATE_MATCHING : 338 sb.append( " inappropriateMatching\n" ); 339 break; 340 341 case CONSTRAINT_VIOLATION : 342 sb.append( " constraintViolation\n" ); 343 break; 344 345 case ATTRIBUTE_OR_VALUE_EXISTS : 346 sb.append( " attributeOrValueExists\n" ); 347 break; 348 349 case INVALID_ATTRIBUTE_SYNTAX : 350 sb.append( " invalidAttributeSyntax\n" ); 351 break; 352 353 case NO_SUCH_OBJECT : 354 sb.append( " noSuchObject\n" ); 355 break; 356 357 case ALIAS_PROBLEM : 358 sb.append( " aliasProblem\n" ); 359 break; 360 361 case INVALID_DN_SYNTAX : 362 sb.append( " invalidDNSyntax\n" ); 363 break; 364 365 case ALIAS_DEREFERENCING_PROBLEM : 366 sb.append( " aliasDereferencingProblem\n" ); 367 break; 368 369 case INAPPROPRIATE_AUTHENTICATION : 370 sb.append( " inappropriateAuthentication\n" ); 371 break; 372 373 case INVALID_CREDENTIALS : 374 sb.append( " invalidCredentials\n" ); 375 break; 376 377 case INSUFFICIENT_ACCESS_RIGHTS : 378 sb.append( " insufficientAccessRights\n" ); 379 break; 380 381 case BUSY : 382 sb.append( " busy\n" ); 383 break; 384 385 case UNAVAILABLE : 386 sb.append( " unavailable\n" ); 387 break; 388 389 case UNWILLING_TO_PERFORM : 390 sb.append( " unwillingToPerform\n" ); 391 break; 392 393 case LOOP_DETECT : 394 sb.append( " loopDetect\n" ); 395 break; 396 397 case NAMING_VIOLATION : 398 sb.append( " namingViolation\n" ); 399 break; 400 401 case OBJECT_CLASS_VIOLATION : 402 sb.append( " objectClassViolation\n" ); 403 break; 404 405 case NOT_ALLOWED_ON_NON_LEAF : 406 sb.append( " notAllowedOnNonLeaf\n" ); 407 break; 408 409 case NOT_ALLOWED_ON_RDN : 410 sb.append( " notAllowedOnRDN\n" ); 411 break; 412 413 case ENTRY_ALREADY_EXISTS : 414 sb.append( " entryAlreadyExists\n" ); 415 break; 416 417 case OBJECT_CLASS_MODS_PROHIBITED : 418 sb.append( " objectClassModsProhibited\n" ); 419 break; 420 421 case AFFECTS_MULTIPLE_DSAS : 422 sb.append( " affectsMultipleDSAs -- new\n" ); 423 break; 424 425 case OTHER : 426 sb.append( " other\n" ); 427 break; 428 429 default : 430 switch ( resultCode.getResultCode() ) 431 { 432 case 9 : 433 sb.append( " -- 9 reserved --\n" ); 434 break; 435 436 case 22 : 437 case 23: 438 case 24 : 439 case 25 : 440 case 26 : 441 case 27 : 442 case 28 : 443 case 29 : 444 case 30 : 445 case 31 : 446 sb.append( " -- 22-31 unused --\n" ); 447 break; 448 449 case 35 : 450 sb.append( " -- 35 reserved for undefined isLeaf --\n" ); 451 break; 452 453 case 37 : 454 case 38 : 455 case 39 : 456 case 40 : 457 case 41 : 458 case 42 : 459 case 43 : 460 case 44 : 461 case 45 : 462 case 46 : 463 case 47 : 464 sb.append( " -- 37-47 unused --\n" ); 465 break; 466 467 case 55 : 468 case 56 : 469 case 57 : 470 case 58 : 471 case 59 : 472 case 60 : 473 case 61 : 474 case 62 : 475 case 63 : 476 sb.append( " -- 55-63 unused --\n" ); 477 break; 478 479 case 70 : 480 sb.append( " -- 70 reserved for CLDAP --\n" ); 481 break; 482 483 case 72 : 484 case 73 : 485 case 74 : 486 case 75 : 487 case 76 : 488 case 77 : 489 case 78 : 490 case 79 : 491 sb.append( " -- 72-79 unused --\n" ); 492 break; 493 494 case 81 : 495 case 82 : 496 case 83 : 497 case 84 : 498 case 85 : 499 case 86 : 500 case 87 : 501 case 88 : 502 case 89 : 503 case 90 : 504 sb.append( " -- 81-90 reserved for APIs --" ); 505 break; 506 507 default : 508 sb.append( "Unknown error code : " ).append( resultCode ); 509 break; 510 } 511 } 512 513 sb.append( " Matched DN : '" ).append( matchedDn ).append( "'\n" ); 514 sb.append( " Error message : '" ).append( errorMessage ).append( "'\n" ); 515 516 if ( referral != null ) 517 { 518 sb.append( " Referrals :\n" ); 519 520 sb.append( " Referral :" ).append( referral.toString() ).append( '\n' ); 521 } 522 523 return sb.toString(); 524 } 525 }