001 /*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License"). You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at
010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012 * See the License for the specific language governing permissions
013 * and limitations under the License.
014 *
015 * When distributing Covered Code, include this CDDL HEADER in each
016 * file and include the License file at
017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
018 * add the following below this CDDL HEADER, with the fields enclosed
019 * by brackets "[]" replaced with your own identifying information:
020 * Portions Copyright [yyyy] [name of copyright owner]
021 *
022 * CDDL HEADER END
023 *
024 *
025 * Copyright 2006-2008 Sun Microsystems, Inc.
026 */
027 package org.opends.server.protocols.ldap;
028 import org.opends.messages.Message;
029
030
031
032 import org.opends.server.protocols.asn1.ASN1Element;
033 import org.opends.server.types.LDAPException;
034
035 import static org.opends.messages.ProtocolMessages.*;
036 import static org.opends.server.protocols.ldap.LDAPConstants.*;
037 import static org.opends.server.protocols.ldap.LDAPResultCode.*;
038
039
040
041 /**
042 * This class defines the structures and methods for an LDAP protocol op, which
043 * is the core of an LDAP message.
044 */
045 public abstract class ProtocolOp
046 {
047 /**
048 * Retrieves the BER type for this protocol op.
049 *
050 * @return The BER type for this protocol op.
051 */
052 public abstract byte getType();
053
054
055
056 /**
057 * Retrieves the name for this protocol op type.
058 *
059 * @return The name for this protocol op type.
060 */
061 public abstract String getProtocolOpName();
062
063
064
065 /**
066 * Encodes this protocol op to an ASN.1 element suitable for including in an
067 * LDAP message.
068 *
069 * @return The ASN.1 element containing the encoded protocol op.
070 */
071 public abstract ASN1Element encode();
072
073
074
075 /**
076 * Decodes the provided ASN.1 element as an LDAP protocol op.
077 *
078 * @param element The ASN.1 element containing the encoded LDAP protocol op.
079 *
080 * @return The LDAP protocol op decoded from the provided ASN.1 element.
081 *
082 * @throws LDAPException If a problem occurs while trying to decode the
083 * provided ASN.1 element as an LDAP protocol op.
084 */
085 public static ProtocolOp decode(ASN1Element element)
086 throws LDAPException
087 {
088 if (element == null)
089 {
090 Message message = ERR_LDAP_PROTOCOL_OP_DECODE_NULL.get();
091 throw new LDAPException(PROTOCOL_ERROR, message);
092 }
093
094 switch (element.getType())
095 {
096 case OP_TYPE_UNBIND_REQUEST: // 0x42
097 return UnbindRequestProtocolOp.decodeUnbindRequest(element);
098 case 0x43: // 0x43
099 case 0x44: // 0x44
100 case 0x45: // 0x45
101 case 0x46: // 0x46
102 case 0x47: // 0x47
103 case 0x48: // 0x48
104 case 0x49: // 0x49
105 Message message =
106 ERR_LDAP_PROTOCOL_OP_DECODE_INVALID_TYPE.get(element.getType());
107 throw new LDAPException(PROTOCOL_ERROR, message);
108 case OP_TYPE_DELETE_REQUEST: // 0x4A
109 return DeleteRequestProtocolOp.decodeDeleteRequest(element);
110 case 0x4B: // 0x4B
111 case 0x4C: // 0x4C
112 case 0x4D: // 0x4D
113 case 0x4E: // 0x4E
114 case 0x4F: // 0x4F
115 message =
116 ERR_LDAP_PROTOCOL_OP_DECODE_INVALID_TYPE.get(element.getType());
117 throw new LDAPException(PROTOCOL_ERROR, message);
118 case OP_TYPE_ABANDON_REQUEST: // 0x50
119 return AbandonRequestProtocolOp.decodeAbandonRequest(element);
120 case 0x51: // 0x51
121 case 0x52: // 0x52
122 case 0x53: // 0x53
123 case 0x54: // 0x54
124 case 0x55: // 0x55
125 case 0x56: // 0x56
126 case 0x57: // 0x57
127 case 0x58: // 0x58
128 case 0x59: // 0x59
129 case 0x5A: // 0x5A
130 case 0x5B: // 0x5B
131 case 0x5C: // 0x5C
132 case 0x5D: // 0x5D
133 case 0x5E: // 0x5E
134 case 0x5F: // 0x5F
135 message =
136 ERR_LDAP_PROTOCOL_OP_DECODE_INVALID_TYPE.get(element.getType());
137 throw new LDAPException(PROTOCOL_ERROR, message);
138 case OP_TYPE_BIND_REQUEST: // 0x60
139 return BindRequestProtocolOp.decodeBindRequest(element);
140 case OP_TYPE_BIND_RESPONSE: // 0x61
141 return BindResponseProtocolOp.decodeBindResponse(element);
142 case 0x62: // 0x62
143 message =
144 ERR_LDAP_PROTOCOL_OP_DECODE_INVALID_TYPE.get(element.getType());
145 throw new LDAPException(PROTOCOL_ERROR, message);
146 case OP_TYPE_SEARCH_REQUEST: // 0x63
147 return SearchRequestProtocolOp.decodeSearchRequest(element);
148 case OP_TYPE_SEARCH_RESULT_ENTRY: // 0x64
149 return SearchResultEntryProtocolOp.decodeSearchEntry(element);
150 case OP_TYPE_SEARCH_RESULT_DONE: // 0x65
151 return SearchResultDoneProtocolOp.decodeSearchDone(element);
152 case OP_TYPE_MODIFY_REQUEST: // 0x66
153 return ModifyRequestProtocolOp.decodeModifyRequest(element);
154 case OP_TYPE_MODIFY_RESPONSE: // 0x67
155 return ModifyResponseProtocolOp.decodeModifyResponse(element);
156 case OP_TYPE_ADD_REQUEST: // 0x68
157 return AddRequestProtocolOp.decodeAddRequest(element);
158 case OP_TYPE_ADD_RESPONSE: // 0x69
159 return AddResponseProtocolOp.decodeAddResponse(element);
160 case 0x6A: // 0x6A
161 message =
162 ERR_LDAP_PROTOCOL_OP_DECODE_INVALID_TYPE.get(element.getType());
163 throw new LDAPException(PROTOCOL_ERROR, message);
164 case OP_TYPE_DELETE_RESPONSE: // 0x6B
165 return DeleteResponseProtocolOp.decodeDeleteResponse(element);
166 case OP_TYPE_MODIFY_DN_REQUEST: // 0x6C
167 return ModifyDNRequestProtocolOp.decodeModifyDNRequest(element);
168 case OP_TYPE_MODIFY_DN_RESPONSE: // 0x6D
169 return ModifyDNResponseProtocolOp.decodeModifyDNResponse(element);
170 case OP_TYPE_COMPARE_REQUEST: // 0x6E
171 return CompareRequestProtocolOp.decodeCompareRequest(element);
172 case OP_TYPE_COMPARE_RESPONSE: // 0x6F
173 return CompareResponseProtocolOp.decodeCompareResponse(element);
174 case 0x70: // 0x70
175 case 0x71: // 0x71
176 case 0x72: // 0x72
177 message =
178 ERR_LDAP_PROTOCOL_OP_DECODE_INVALID_TYPE.get(element.getType());
179 throw new LDAPException(PROTOCOL_ERROR, message);
180 case OP_TYPE_SEARCH_RESULT_REFERENCE: // 0x73
181 return SearchResultReferenceProtocolOp.decodeSearchReference(element);
182 case 0x74: // 0x74
183 case 0x75: // 0x75
184 case 0x76: // 0x76
185 message =
186 ERR_LDAP_PROTOCOL_OP_DECODE_INVALID_TYPE.get(element.getType());
187 throw new LDAPException(PROTOCOL_ERROR, message);
188 case OP_TYPE_EXTENDED_REQUEST: // 0x77
189 return ExtendedRequestProtocolOp.decodeExtendedRequest(element);
190 case OP_TYPE_EXTENDED_RESPONSE: // 0x78
191 return ExtendedResponseProtocolOp.decodeExtendedResponse(element);
192 case OP_TYPE_INTERMEDIATE_RESPONSE: // 0x79
193 return
194 IntermediateResponseProtocolOp.decodeIntermediateResponse(element);
195 default:
196 message =
197 ERR_LDAP_PROTOCOL_OP_DECODE_INVALID_TYPE.get(element.getType());
198 throw new LDAPException(PROTOCOL_ERROR, message);
199 }
200 }
201
202
203
204 /**
205 * Retrieves a string representation of this LDAP protocol op.
206 *
207 * @return A string representation of this LDAP protocol op.
208 */
209 public String toString()
210 {
211 StringBuilder buffer = new StringBuilder();
212 toString(buffer);
213 return buffer.toString();
214 }
215
216
217
218 /**
219 * Appends a string representation of this LDAP protocol op to the provided
220 * buffer.
221 *
222 * @param buffer The buffer to which the string should be appended.
223 */
224 public abstract void toString(StringBuilder buffer);
225
226
227
228 /**
229 * Appends a multi-line string representation of this LDAP protocol op to the
230 * provided buffer.
231 *
232 * @param buffer The buffer to which the information should be appended.
233 * @param indent The number of spaces from the margin that the lines should
234 * be indented.
235 */
236 public abstract void toString(StringBuilder buffer, int indent);
237 }
238