001/* 002 * Copyright 2007-2017 UnboundID Corp. 003 * All Rights Reserved. 004 */ 005/* 006 * Copyright (C) 2008-2017 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.controls; 022 023 024 025import java.util.Collection; 026import java.util.EnumSet; 027import java.util.Set; 028 029import com.unboundid.util.ThreadSafety; 030import com.unboundid.util.ThreadSafetyLevel; 031 032 033 034/** 035 * This enum defines a set of change types that can be associated with 036 * persistent search operations. Change types may be used in the 037 * {@link PersistentSearchRequestControl}, as well as in 038 * {@link EntryChangeNotificationControl}s returned in search result entries 039 * as part of a persistent search. 040 */ 041@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) 042public enum PersistentSearchChangeType 043{ 044 /** 045 * Indicates that the change type is for an add operation. 046 */ 047 ADD("add", 1), 048 049 050 051 /** 052 * Indicates that the change type is for a delete operation. 053 */ 054 DELETE("delete", 2), 055 056 057 058 /** 059 * Indicates that the change type is for a modify operation. 060 */ 061 MODIFY("modify", 4), 062 063 064 065 /** 066 * Indicates that the change type is for a modify DN operation. 067 */ 068 MODIFY_DN("moddn", 8); 069 070 071 072 // The numeric value associated with this change type. 073 private final int value; 074 075 // The human-readable name for this change type. 076 private final String name; 077 078 079 080 /** 081 * Creates a new persistent search change type with the provided information. 082 * 083 * @param name The human-readable name for this change type. 084 * @param value The numeric value associated with this change type. 085 */ 086 private PersistentSearchChangeType(final String name, final int value) 087 { 088 this.name = name; 089 this.value = value; 090 } 091 092 093 094 /** 095 * Retrieves the human-readable name for this change type. 096 * 097 * @return The human-readable name for this change type. 098 */ 099 public String getName() 100 { 101 return name; 102 } 103 104 105 106 /** 107 * Retrieves the integer value for this change type. 108 * 109 * @return The integer value for this change type. 110 */ 111 public int intValue() 112 { 113 return value; 114 } 115 116 117 118 /** 119 * Retrieves the persistent search change type with the specified int value. 120 * 121 * @param intValue the numeric value associated with the change type. 122 * 123 * @return The associated change type, or {@code null} if there is no 124 * persistent search change type with the specified set of values. 125 */ 126 public static PersistentSearchChangeType valueOf(final int intValue) 127 { 128 switch (intValue) 129 { 130 case 1: 131 return ADD; 132 133 case 2: 134 return DELETE; 135 136 case 4: 137 return MODIFY; 138 139 case 8: 140 return MODIFY_DN; 141 142 default: 143 return null; 144 } 145 } 146 147 148 149 /** 150 * Retrieves a set containing all defined change types. 151 * 152 * @return A set containing all defined change types. 153 */ 154 public static Set<PersistentSearchChangeType> allChangeTypes() 155 { 156 return EnumSet.allOf(PersistentSearchChangeType.class); 157 } 158 159 160 161 /** 162 * Encodes the provided set of change types into an integer value suitable for 163 * use as the change types for the persistent search request control. 164 * 165 * @param changeTypes The set of change types to be encoded. 166 * 167 * @return An integer value containing the encoded representation of the 168 * change types. 169 */ 170 public static int encodeChangeTypes( 171 final PersistentSearchChangeType... changeTypes) 172 { 173 int changeTypesValue = 0; 174 175 for (final PersistentSearchChangeType changeType : changeTypes) 176 { 177 changeTypesValue |= changeType.intValue(); 178 } 179 180 return changeTypesValue; 181 } 182 183 184 185 /** 186 * Encodes the provided set of change types into an integer value suitable for 187 * use as the change types for the persistent search request control. 188 * 189 * @param changeTypes The set of change types to be encoded. 190 * 191 * @return An integer value containing the encoded representation of the 192 * change types. 193 */ 194 public static int encodeChangeTypes( 195 final Collection<PersistentSearchChangeType> changeTypes) 196 { 197 int changeTypesValue = 0; 198 199 for (final PersistentSearchChangeType changeType : changeTypes) 200 { 201 changeTypesValue |= changeType.intValue(); 202 } 203 204 return changeTypesValue; 205 } 206 207 208 209 /** 210 * Decodes the provided set of change types from the provided value. 211 * 212 * @param changeTypes The int value representing the encoded set of change 213 * types. 214 * 215 * @return A list of the change types encoded in the provided value. 216 */ 217 public static Set<PersistentSearchChangeType> decodeChangeTypes( 218 final int changeTypes) 219 { 220 final EnumSet<PersistentSearchChangeType> ctSet = 221 EnumSet.noneOf(PersistentSearchChangeType.class); 222 223 if ((changeTypes & ADD.intValue()) == ADD.intValue()) 224 { 225 ctSet.add(ADD); 226 } 227 228 if ((changeTypes & DELETE.intValue()) == DELETE.intValue()) 229 { 230 ctSet.add(DELETE); 231 } 232 233 if ((changeTypes & MODIFY.intValue()) == MODIFY.intValue()) 234 { 235 ctSet.add(MODIFY); 236 } 237 238 if ((changeTypes & MODIFY_DN.intValue()) == MODIFY_DN.intValue()) 239 { 240 ctSet.add(MODIFY_DN); 241 } 242 243 return ctSet; 244 } 245 246 247 248 /** 249 * Retrieves a string representation for this persistent search change type. 250 * 251 * @return A string representation for this persistent search change type. 252 */ 253 @Override() 254 public String toString() 255 { 256 return name; 257 } 258}