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 package org.apache.directory.shared.ldap.message;
021
022 import org.apache.directory.shared.ldap.codec.MessageTypeEnum;
023 import org.apache.directory.shared.ldap.message.internal.InternalModifyDnRequest;
024 import org.apache.directory.shared.ldap.message.internal.InternalModifyDnResponse;
025 import org.apache.directory.shared.ldap.message.internal.InternalResultResponse;
026 import org.apache.directory.shared.ldap.name.DN;
027 import org.apache.directory.shared.ldap.name.RDN;
028
029
030 /**
031 * Lockable ModifyDNRequest implementation.
032 *
033 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
034 * @version $Rev: 918756 $
035 */
036 public class ModifyDnRequestImpl extends AbstractAbandonableRequest implements InternalModifyDnRequest
037 {
038 static final long serialVersionUID = 1233507339633051696L;
039
040 /** PDU's modify Dn candidate <b>entry</b> distinguished name property */
041 private DN name;
042
043 /** PDU's <b>newrdn</b> relative distinguished name property */
044 private RDN newRdn;
045
046 /** PDU's <b>newSuperior</b> distinguished name property */
047 private DN newSuperior;
048
049 /** PDU's <b>deleteOldRdn</b> flag */
050 private boolean deleteOldRdn = false;
051
052 private InternalModifyDnResponse response;
053
054
055 // -----------------------------------------------------------------------
056 // Constructors
057 // -----------------------------------------------------------------------
058
059 /**
060 * Creates a Lockable ModifyDnRequest implementing object used to perform a
061 * dn change on an entry potentially resulting in an entry move.
062 *
063 * @param id
064 * the seq id of this message
065 */
066 public ModifyDnRequestImpl(final int id)
067 {
068 super( id, TYPE );
069 }
070
071
072 // -----------------------------------------------------------------------
073 // ModifyDnRequest Interface Method Implementations
074 // -----------------------------------------------------------------------
075
076 /**
077 * Gets the flag which determines if the old Rdn attribute is to be removed
078 * from the entry when the new Rdn is used in its stead. This property
079 * corresponds to the <b>deleteoldrdn
080 * </p>
081 * PDU field.
082 *
083 * @return true if the old rdn is to be deleted, false if it is not
084 */
085 public boolean getDeleteOldRdn()
086 {
087 return deleteOldRdn;
088 }
089
090
091 /**
092 * Sets the flag which determines if the old Rdn attribute is to be removed
093 * from the entry when the new Rdn is used in its stead. This property
094 * corresponds to the <b>deleteoldrdn
095 * </p>
096 * PDU field.
097 *
098 * @param deleteOldRdn
099 * true if the old rdn is to be deleted, false if it is not
100 */
101 public void setDeleteOldRdn( boolean deleteOldRdn )
102 {
103 this.deleteOldRdn = deleteOldRdn;
104 }
105
106
107 /**
108 * Gets whether or not this request is a DN change resulting in a move
109 * operation. Setting the newSuperior property to a non-null name, toggles
110 * this flag.
111 *
112 * @return true if the newSuperior property is <b>NOT</b> null, false
113 * otherwise.
114 */
115 public boolean isMove()
116 {
117 return newSuperior != null;
118 }
119
120
121 /**
122 * Gets the entry's distinguished name representing the <b>entry</b> PDU
123 * field.
124 *
125 * @return the distinguished name of the entry.
126 */
127 public DN getName()
128 {
129 return name;
130 }
131
132
133 /**
134 * Sets the entry's distinguished name representing the <b>entry</b> PDU
135 * field.
136 *
137 * @param name
138 * the distinguished name of the entry.
139 */
140 public void setName( DN name )
141 {
142 this.name = name;
143 }
144
145
146 /**
147 * Gets the new relative distinguished name for the entry which represents
148 * the PDU's <b>newrdn</b> field.
149 *
150 * @return the relative dn with one component
151 */
152 public RDN getNewRdn()
153 {
154 return newRdn;
155 }
156
157
158 /**
159 * Sets the new relative distinguished name for the entry which represents
160 * the PDU's <b>newrdn</b> field.
161 *
162 * @param newRdn
163 * the relative dn with one component
164 */
165 public void setNewRdn( RDN newRdn )
166 {
167 this.newRdn = newRdn;
168 }
169
170
171 /**
172 * Gets the optional distinguished name of the new superior entry where the
173 * candidate entry is to be moved. This property corresponds to the PDU's
174 * <b>newSuperior</b> field. May be null representing a simple Rdn change
175 * rather than a move operation.
176 *
177 * @return the dn of the superior entry the candidate entry is moved under.
178 */
179 public DN getNewSuperior()
180 {
181 return newSuperior;
182 }
183
184
185 /**
186 * Sets the optional distinguished name of the new superior entry where the
187 * candidate entry is to be moved. This property corresponds to the PDU's
188 * <b>newSuperior</b> field. May be null representing a simple Rdn change
189 * rather than a move operation. Setting this property to a non-null value
190 * toggles the move flag obtained via the <code>isMove</code> method.
191 *
192 * @param newSuperior
193 * the dn of the superior entry the candidate entry for DN
194 * modification is moved under.
195 */
196 public void setNewSuperior( DN newSuperior )
197 {
198 this.newSuperior = newSuperior;
199 }
200
201
202 // ------------------------------------------------------------------------
203 // SingleReplyRequest Interface Method Implementations
204 // ------------------------------------------------------------------------
205
206 /**
207 * Gets the protocol response message type for this request which produces
208 * at least one response.
209 *
210 * @return the message type of the response.
211 */
212 public MessageTypeEnum getResponseType()
213 {
214 return RESP_TYPE;
215 }
216
217
218 /**
219 * The result containing response for this request.
220 *
221 * @return the result containing response for this request
222 */
223 public InternalResultResponse getResultResponse()
224 {
225 if ( response == null )
226 {
227 response = new ModifyDnResponseImpl( getMessageId() );
228 }
229
230 return response;
231 }
232
233
234 /**
235 * Checks to see of an object equals this ModifyDnRequest stub. The equality
236 * presumes all ModifyDnRequest specific properties are the same.
237 *
238 * @param obj
239 * the object to compare with this stub
240 * @return true if the obj is equal to this stub, false otherwise
241 */
242 public boolean equals( Object obj )
243 {
244 if ( obj == this )
245 {
246 return true;
247 }
248
249 if ( !super.equals( obj ) )
250 {
251 return false;
252 }
253
254 InternalModifyDnRequest req = ( InternalModifyDnRequest ) obj;
255
256 if ( name != null && req.getName() == null )
257 {
258 return false;
259 }
260
261 if ( name == null && req.getName() != null )
262 {
263 return false;
264 }
265
266 if ( name != null && req.getName() != null )
267 {
268 if ( !name.equals( req.getName() ) )
269 {
270 return false;
271 }
272 }
273
274 if ( deleteOldRdn != req.getDeleteOldRdn() )
275 {
276 return false;
277 }
278
279 if ( newRdn != null && req.getNewRdn() == null )
280 {
281 return false;
282 }
283
284 if ( newRdn == null && req.getNewRdn() != null )
285 {
286 return false;
287 }
288
289 if ( newRdn != null && req.getNewRdn() != null )
290 {
291 if ( !newRdn.equals( req.getNewRdn() ) )
292 {
293 return false;
294 }
295 }
296
297 if ( newSuperior != null && req.getNewSuperior() == null )
298 {
299 return false;
300 }
301
302 if ( newSuperior == null && req.getNewSuperior() != null )
303 {
304 return false;
305 }
306
307 if ( newSuperior != null && req.getNewSuperior() != null )
308 {
309 if ( !newSuperior.equals( req.getNewSuperior() ) )
310 {
311 return false;
312 }
313 }
314
315 return true;
316 }
317
318
319 /**
320 * Get a String representation of a ModifyDNRequest
321 *
322 * @return A ModifyDNRequest String
323 */
324 public String toString()
325 {
326
327 StringBuffer sb = new StringBuffer();
328
329 sb.append( " ModifyDN Response\n" );
330 sb.append( " Entry : '" ).append( name ).append( "'\n" );
331 if( newRdn != null )
332 {
333 sb.append( " New RDN : '" ).append( newRdn.toString() ).append( "'\n" );
334 }
335 sb.append( " Delete old RDN : " ).append( deleteOldRdn ).append( "\n" );
336
337 if ( newSuperior != null )
338 {
339 sb.append( " New superior : '" ).append( newSuperior.toString() ).append( "'\n" );
340 }
341
342 return sb.toString();
343 }
344 }