001/* 002 * Copyright 2009-2017 UnboundID Corp. 003 * All Rights Reserved. 004 */ 005/* 006 * Copyright (C) 2009-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.migrate.ldapjdk; 022 023 024 025import java.io.Serializable; 026 027import com.unboundid.asn1.ASN1OctetString; 028import com.unboundid.ldap.sdk.Control; 029import com.unboundid.ldap.sdk.controls.ManageDsaITRequestControl; 030import com.unboundid.ldap.sdk.controls.PasswordExpiredControl; 031import com.unboundid.ldap.sdk.controls.PasswordExpiringControl; 032import com.unboundid.util.Extensible; 033import com.unboundid.util.NotMutable; 034import com.unboundid.util.ThreadSafety; 035import com.unboundid.util.ThreadSafetyLevel; 036 037 038 039/** 040 * This class provides a data structure that holds information about an LDAP 041 * control. 042 * <BR><BR> 043 * This class is primarily intended to be used in the process of updating 044 * applications which use the Netscape Directory SDK for Java to switch to or 045 * coexist with the UnboundID LDAP SDK for Java. For applications not written 046 * using the Netscape Directory SDK for Java, the {@link Control} class should 047 * be used instead. 048 */ 049@Extensible() 050@NotMutable() 051@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) 052public class LDAPControl 053 implements Serializable 054{ 055 /** 056 * The OID for the ManageDsaIT request control. 057 */ 058 public static final String MANAGEDSAIT = 059 ManageDsaITRequestControl.MANAGE_DSA_IT_REQUEST_OID; 060 061 062 063 /** 064 * The OID for the password expired control. 065 */ 066 public static final String PWEXPIRED = 067 PasswordExpiredControl.PASSWORD_EXPIRED_OID; 068 069 070 071 /** 072 * The OID for the password expiring control. 073 */ 074 public static final String PWEXPIRING = 075 PasswordExpiringControl.PASSWORD_EXPIRING_OID; 076 077 078 079 /** 080 * The serial version UID for this serializable class. 081 */ 082 private static final long serialVersionUID = 7828506470553016637L; 083 084 085 086 // Indicates whether this control is critical. 087 private final boolean isCritical; 088 089 // The value for this control. 090 private final byte[] value; 091 092 // The OID for this control. 093 private final String oid; 094 095 096 097 /** 098 * Creates a new LDAP control from the provided control. 099 * 100 * @param control The control to use to create this control. 101 */ 102 public LDAPControl(final Control control) 103 { 104 oid = control.getOID(); 105 isCritical = control.isCritical(); 106 107 if (control.hasValue()) 108 { 109 value = control.getValue().getValue(); 110 } 111 else 112 { 113 value = null; 114 } 115 } 116 117 118 119 /** 120 * Creates a new LDAP control with the specified information. 121 * 122 * @param id The OID for the control. 123 * @param critical Indicates whether the control should be marked critical. 124 * @param vals The encoded value for the control. 125 */ 126 public LDAPControl(final String id, final boolean critical, final byte[] vals) 127 { 128 oid = id; 129 isCritical = critical; 130 value = vals; 131 } 132 133 134 135 /** 136 * Retrieves the OID for this control. 137 * 138 * @return The OID for this control. 139 */ 140 public String getID() 141 { 142 return oid; 143 } 144 145 146 147 /** 148 * Indicates whether this control is marked critical. 149 * 150 * @return {@code true} if this control is marked critical, or {@code false} 151 * if not. 152 */ 153 public boolean isCritical() 154 { 155 return isCritical; 156 } 157 158 159 160 /** 161 * Retrieves the value for this control, if available. 162 * 163 * @return The value for this control, or {@code null} if there is none. 164 */ 165 public byte[] getValue() 166 { 167 return value; 168 } 169 170 171 172 /** 173 * Converts this LDAP control to a {@link Control} object. 174 * 175 * @return The {@code Control} object for this LDAP control. 176 */ 177 public final Control toControl() 178 { 179 if (value == null) 180 { 181 return new Control(oid, isCritical, null); 182 } 183 else 184 { 185 return new Control(oid, isCritical, new ASN1OctetString(value)); 186 } 187 } 188 189 190 191 /** 192 * Converts the provided array of controls to an array of LDAP controls. 193 * 194 * @param ldapControls The LDAP controls to be converted. 195 * 196 * @return The corresponding array of controls. 197 */ 198 public static Control[] toControls(final LDAPControl[] ldapControls) 199 { 200 if (ldapControls == null) 201 { 202 return null; 203 } 204 205 final Control[] controls = new Control[ldapControls.length]; 206 for (int i=0; i < ldapControls.length; i++) 207 { 208 controls[i] = ldapControls[i].toControl(); 209 } 210 211 return controls; 212 } 213 214 215 216 /** 217 * Converts the provided array of LDAP controls to an array of controls. 218 * 219 * @param controls The controls to be converted. 220 * 221 * @return The corresponding array of LDAP controls. 222 */ 223 public static LDAPControl[] toLDAPControls(final Control[] controls) 224 { 225 if (controls == null) 226 { 227 return null; 228 } 229 230 final LDAPControl[] ldapControls = new LDAPControl[controls.length]; 231 for (int i=0; i < controls.length; i++) 232 { 233 ldapControls[i] = new LDAPControl(controls[i]); 234 } 235 236 return ldapControls; 237 } 238 239 240 241 /** 242 * Creates a duplicate of this control. 243 * 244 * @return A duplicate of this control. 245 */ 246 public LDAPControl duplicate() 247 { 248 return new LDAPControl(oid, isCritical, value); 249 } 250 251 252 253 /** 254 * Retrieves a string representation of this control. 255 * 256 * @return A string representation of this control. 257 */ 258 @Override() 259 public String toString() 260 { 261 return toControl().toString(); 262 } 263}