001/* 002 * Copyright 2012-2024 Ping Identity Corporation 003 * All Rights Reserved. 004 */ 005/* 006 * Copyright 2012-2024 Ping Identity Corporation 007 * 008 * Licensed under the Apache License, Version 2.0 (the "License"); 009 * you may not use this file except in compliance with the License. 010 * You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, software 015 * distributed under the License is distributed on an "AS IS" BASIS, 016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 017 * See the License for the specific language governing permissions and 018 * limitations under the License. 019 */ 020/* 021 * Copyright (C) 2012-2024 Ping Identity Corporation 022 * 023 * This program is free software; you can redistribute it and/or modify 024 * it under the terms of the GNU General Public License (GPLv2 only) 025 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only) 026 * as published by the Free Software Foundation. 027 * 028 * This program is distributed in the hope that it will be useful, 029 * but WITHOUT ANY WARRANTY; without even the implied warranty of 030 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 031 * GNU General Public License for more details. 032 * 033 * You should have received a copy of the GNU General Public License 034 * along with this program; if not, see <http://www.gnu.org/licenses>. 035 */ 036package com.unboundid.ldap.sdk.unboundidds; 037 038 039 040import java.io.Serializable; 041 042import com.unboundid.ldap.sdk.ResultCode; 043import com.unboundid.util.NotMutable; 044import com.unboundid.util.NotNull; 045import com.unboundid.util.Nullable; 046import com.unboundid.util.ThreadSafety; 047import com.unboundid.util.ThreadSafetyLevel; 048 049 050 051/** 052 * This class provides a data structure that holds information about the result 053 * of a move subtree operation. 054 * <BR> 055 * <BLOCKQUOTE> 056 * <B>NOTE:</B> This class, and other classes within the 057 * {@code com.unboundid.ldap.sdk.unboundidds} package structure, are only 058 * supported for use against Ping Identity, UnboundID, and 059 * Nokia/Alcatel-Lucent 8661 server products. These classes provide support 060 * for proprietary functionality or for external specifications that are not 061 * considered stable or mature enough to be guaranteed to work in an 062 * interoperable way with other types of LDAP servers. 063 * </BLOCKQUOTE> 064 */ 065@NotMutable() 066@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) 067public final class MoveSubtreeResult 068 implements Serializable 069{ 070 /** 071 * The serial version UID for this serializable class. 072 */ 073 private static final long serialVersionUID = 2881207705643180021L; 074 075 076 077 // Indicates whether any changes were made to the data in the source server. 078 private final boolean sourceServerAltered; 079 080 // Indicates whether any changes were made to the data in the target server. 081 private final boolean targetServerAltered; 082 083 // The number of entries added to the target server. 084 private final int entriesAddedToTarget; 085 086 // The number of entries deleted from the source server. 087 private final int entriesDeletedFromSource; 088 089 // The number of entries read from the source server. 090 private final int entriesReadFromSource; 091 092 // The result code resulting from processing. 093 @NotNull private final ResultCode resultCode; 094 095 // A string providing details of any administrative processing that may be 096 // required to either complete the move or restore servers to their original 097 // state. 098 @Nullable private final String adminActionRequired; 099 100 // A message with information about any error that may have occurred. 101 @Nullable private final String errorMessage; 102 103 104 105 /** 106 * Creates a new move subtree result object with the provided information. 107 * 108 * @param resultCode A result code indicating the ultimate 109 * state of the move subtree processing. 110 * @param errorMessage A message with information about any 111 * error that occurred. 112 * @param adminActionRequired A message with information about any 113 * administrative action that may be 114 * required to bring the servers back to a 115 * consistent state. 116 * @param sourceServerAltered Indicates whether any changes were made 117 * to data in the source server. 118 * @param targetServerAltered Indicates whether any changes were made 119 * to data in the target server. 120 * @param entriesReadFromSource The number of entries that were read from 121 * the source server. 122 * @param entriesAddedToTarget The number of entries that were 123 * successfully added to the target server. 124 * @param entriesDeletedFromSource The number of entries that were 125 * successfully removed from the source 126 * server. 127 */ 128 MoveSubtreeResult(@NotNull final ResultCode resultCode, 129 @Nullable final String errorMessage, 130 @Nullable final String adminActionRequired, 131 final boolean sourceServerAltered, 132 final boolean targetServerAltered, 133 final int entriesReadFromSource, 134 final int entriesAddedToTarget, 135 final int entriesDeletedFromSource) 136 { 137 this.resultCode = resultCode; 138 this.errorMessage = errorMessage; 139 this.adminActionRequired = adminActionRequired; 140 this.sourceServerAltered = sourceServerAltered; 141 this.targetServerAltered = targetServerAltered; 142 this.entriesReadFromSource = entriesReadFromSource; 143 this.entriesAddedToTarget = entriesAddedToTarget; 144 this.entriesDeletedFromSource = entriesDeletedFromSource; 145 } 146 147 148 149 /** 150 * Retrieves a result code which indicates the ultimate state of the move 151 * subtree processing. A result of {@code SUCCESS} indicates that all 152 * processing was successful and the subtree was moved from one server to 153 * another. Any other result indicates that some kind of error occurred. 154 * 155 * @return A result code which indicates the ultimate state of the move 156 * subtree processing. 157 */ 158 @NotNull() 159 public ResultCode getResultCode() 160 { 161 return resultCode; 162 } 163 164 165 166 /** 167 * Retrieves an error message with information about a problem that occurred 168 * during processing, if any. 169 * 170 * @return An error message with information about a problem that occurred 171 * during processing, or {@code null} if no errors were encountered. 172 */ 173 @Nullable() 174 public String getErrorMessage() 175 { 176 return errorMessage; 177 } 178 179 180 181 /** 182 * Retrieves a message with information about any administrative action which 183 * may be required to bring data in the servers back into a consistent state 184 * so that the entries in the target subtree will only exist in one of the 185 * two servers. 186 * 187 * @return A message with information about any administrative action which 188 * may be required to bring the data in the servers back into a 189 * consistent state, or {@code null} if no administrative action is 190 * necessary. 191 */ 192 @Nullable() 193 public String getAdminActionRequired() 194 { 195 return adminActionRequired; 196 } 197 198 199 200 /** 201 * Indicates whether any data in the source server has been altered as a 202 * result of the processing performed during the subtree move. A successful 203 * subtree move will cause entries to be removed from the source server, but 204 * there may be error conditions which also result in source server changes. 205 * 206 * @return {@code true} if any data in the source server has been altered as 207 * a result of the processing performed, or {@code false} if not. 208 */ 209 public boolean sourceServerAltered() 210 { 211 return sourceServerAltered; 212 } 213 214 215 216 /** 217 * Indicates whether any data in the target server has been altered as a 218 * result of the processing performed during the subtree move. A successful 219 * subtree move will cause entries to be added to the target server, but 220 * there may be error conditions which also result in target server changes. 221 * 222 * @return {@code true} if any data in the target server has been altered as 223 * a result of the processing performed, or {@code false} if not. 224 */ 225 public boolean targetServerAltered() 226 { 227 return targetServerAltered; 228 } 229 230 231 232 /** 233 * Retrieves the number of entries within the specified subtree read from the 234 * source server. 235 * 236 * @return The number of entries within the specified subtree read from the 237 * source server. 238 */ 239 public int getEntriesReadFromSource() 240 { 241 return entriesReadFromSource; 242 } 243 244 245 246 /** 247 * Retrieves the number of entries added to the target server as a result of 248 * the subtree move. Note that even in a completely successful subtree move, 249 * it is possible for this number to be less than the number of entries read 250 * from the source server if a {@link MoveSubtreeListener} is in use and its 251 * {@code doPreAddProcessing} method returns null for one or more entries to 252 * indicate that those entries should not be added to the target. 253 * 254 * @return The number of entries added to the target server as a result of 255 * the subtree move. 256 */ 257 public int getEntriesAddedToTarget() 258 { 259 return entriesAddedToTarget; 260 } 261 262 263 264 /** 265 * Retrieves the number of entries deleted from the source server as a result 266 * of the subtree move. If all processing is successful, then this value 267 * should match the number of entries read from the source server. 268 * 269 * @return The number of entries deleted from the target server as a result 270 * of the subtree move. 271 */ 272 public int getEntriesDeletedFromSource() 273 { 274 return entriesDeletedFromSource; 275 } 276 277 278 279 /** 280 * Retrieves a string representation of this move subtree result object. 281 * 282 * @return A string representation of this move subtree result object. 283 */ 284 @Override() 285 @NotNull() 286 public String toString() 287 { 288 final StringBuilder buffer = new StringBuilder(); 289 toString(buffer); 290 return buffer.toString(); 291 } 292 293 294 295 /** 296 * Appends a string representation of this move subtree result object to the 297 * provided buffer. 298 * 299 * @param buffer The buffer to which the information should be appended. 300 */ 301 public void toString(@NotNull final StringBuilder buffer) 302 { 303 buffer.append("MoveSubtreeResult(resultCode="); 304 buffer.append(resultCode.getName()); 305 306 if (errorMessage != null) 307 { 308 buffer.append(", errorMessage='"); 309 buffer.append(errorMessage); 310 buffer.append('\''); 311 } 312 313 if (adminActionRequired != null) 314 { 315 buffer.append(", adminActionRequired='"); 316 buffer.append(adminActionRequired); 317 buffer.append('\''); 318 } 319 320 buffer.append(", sourceServerAltered="); 321 buffer.append(sourceServerAltered); 322 buffer.append(", targetServerAltered="); 323 buffer.append(targetServerAltered); 324 buffer.append(", entriesReadFromSource="); 325 buffer.append(entriesReadFromSource); 326 buffer.append(", entriesAddedToTarget="); 327 buffer.append(entriesAddedToTarget); 328 buffer.append(", entriesDeletedFromSource="); 329 buffer.append(entriesDeletedFromSource); 330 buffer.append(')'); 331 } 332}