View Javadoc
1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *  
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *  
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License. 
18   *  
19   */
20  package org.apache.directory.api.ldap.model.message;
21  
22  
23  import org.apache.directory.api.ldap.model.entry.Attribute;
24  import org.apache.directory.api.ldap.model.entry.DefaultAttribute;
25  import org.apache.directory.api.ldap.model.entry.DefaultEntry;
26  import org.apache.directory.api.ldap.model.entry.Entry;
27  import org.apache.directory.api.ldap.model.entry.Value;
28  import org.apache.directory.api.ldap.model.exception.LdapException;
29  import org.apache.directory.api.ldap.model.name.Dn;
30  
31  
32  /**
33   * Lockable add request implementation.
34   * 
35   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
36   */
37  public class AddRequestImpl extends AbstractAbandonableRequest implements AddRequest
38  {
39      static final long serialVersionUID = 7534132448349520346L;
40  
41      /** A MultiMap of the new entry's attributes and their values */
42      private Entry entry;
43  
44      private AddResponse response;
45  
46      /** The current attribute being decoded */
47      private Attribute currentAttribute;
48  
49  
50      // ------------------------------------------------------------------------
51      // Constructors
52      // ------------------------------------------------------------------------
53  
54      /**
55       * Creates an AddRequest implementation to create a new entry.
56       */
57      public AddRequestImpl()
58      {
59          super( -1, MessageTypeEnum.ADD_REQUEST );
60          entry = new DefaultEntry();
61      }
62  
63  
64      /**
65       * Create a new attributeValue
66       * 
67       * @param type The attribute's name (called 'type' in the grammar)
68       */
69      public void addAttributeType( String type ) throws LdapException
70      {
71          // do not create a new attribute if we have seen this attributeType before
72          if ( entry.get( type ) != null )
73          {
74              currentAttribute = entry.get( type );
75              return;
76          }
77  
78          // fix this to use AttributeImpl(type.getString().toLowerCase())
79          currentAttribute = new DefaultAttribute( type );
80          entry.put( currentAttribute );
81      }
82  
83  
84      /**
85       * @return Returns the currentAttribute type.
86       */
87      public String getCurrentAttributeType()
88      {
89          return currentAttribute.getId();
90      }
91  
92  
93      /**
94       * Add a new value to the current attribute
95       * 
96       * @param value The value to add
97       */
98      public void addAttributeValue( String value ) throws LdapException
99      {
100         currentAttribute.add( value );
101     }
102 
103 
104     /**
105      * Add a new value to the current attribute
106      * 
107      * @param value The value to add
108      */
109     public void addAttributeValue( Value<?> value ) throws LdapException
110     {
111         currentAttribute.add( value );
112     }
113 
114 
115     /**
116      * Add a new value to the current attribute
117      * 
118      * @param value The value to add
119      */
120     public void addAttributeValue( byte[] value ) throws LdapException
121     {
122         currentAttribute.add( value );
123     }
124 
125 
126     // ------------------------------------------------------------------------
127     // AddRequest Interface Method Implementations
128     // ------------------------------------------------------------------------
129 
130     /**
131      * Gets the distinguished name of the entry to add.
132      * 
133      * @return the Dn of the added entry.
134      */
135     public Dn getEntryDn()
136     {
137         return entry.getDn();
138     }
139 
140 
141     /**
142      * {@inheritDoc}
143      */
144     public AddRequest setEntryDn( Dn dn )
145     {
146         entry.setDn( dn );
147 
148         return this;
149     }
150 
151 
152     /**
153      * {@inheritDoc}
154      */
155     public Entry getEntry()
156     {
157         return entry;
158     }
159 
160 
161     /**
162      * {@inheritDoc}
163      */
164     public AddRequest setEntry( Entry entry )
165     {
166         this.entry = entry;
167 
168         return this;
169     }
170 
171 
172     /**
173      * {@inheritDoc}
174      */
175     public AddRequest setMessageId( int messageId )
176     {
177         super.setMessageId( messageId );
178 
179         return this;
180     }
181 
182 
183     /**
184      * {@inheritDoc}
185      */
186     public AddRequest addControl( Control control )
187     {
188         return ( AddRequest ) super.addControl( control );
189     }
190 
191 
192     /**
193      * {@inheritDoc}
194      */
195     public AddRequest addAllControls( Control[] controls )
196     {
197         return ( AddRequest ) super.addAllControls( controls );
198     }
199 
200 
201     /**
202      * {@inheritDoc}
203      */
204     public AddRequest removeControl( Control control )
205     {
206         return ( AddRequest ) super.removeControl( control );
207     }
208 
209 
210     // ------------------------------------------------------------------------
211     // SingleReplyRequest Interface Method Implementations
212     // ------------------------------------------------------------------------
213 
214     /**
215      * Gets the protocol response message type for this request which produces
216      * at least one response.
217      * 
218      * @return the message type of the response.
219      */
220     public MessageTypeEnum getResponseType()
221     {
222         return MessageTypeEnum.ADD_RESPONSE;
223     }
224 
225 
226     /**
227      * The result containing response for this request.
228      * 
229      * @return the result containing response for this request
230      */
231     public AddResponse getResultResponse()
232     {
233         if ( response == null )
234         {
235             response = new AddResponseImpl( getMessageId() );
236         }
237 
238         return response;
239     }
240 
241 
242     /**
243      * Checks to see if an object is equivalent to this AddRequest. First
244      * there's a quick test to see if the obj is the same object as this one -
245      * if so true is returned. Next if the super method fails false is returned.
246      * Then the name of the entry is compared - if not the same false is
247      * returned. Lastly the attributes of the entry are compared. If they are
248      * not the same false is returned otherwise the method exists returning
249      * true.
250      * 
251      * @param obj the object to test for equality to this
252      * @return true if the obj is equal to this AddRequest, false otherwise
253      */
254     public boolean equals( Object obj )
255     {
256         // Short circuit
257         if ( this == obj )
258         {
259             return true;
260         }
261 
262         // Check the object class. If null, it will exit.
263         if ( !( obj instanceof AddRequest ) )
264         {
265             return false;
266         }
267 
268         if ( !super.equals( obj ) )
269         {
270             return false;
271         }
272 
273         AddRequest req = ( AddRequest ) obj;
274 
275         // Check the entry
276         if ( entry == null )
277         {
278             return ( req.getEntry() == null );
279         }
280         else
281         {
282             return ( entry.equals( req.getEntry() ) );
283         }
284     }
285 
286 
287     /**
288      * @see Object#hashCode()
289      * @return the instance's hash code 
290      */
291     public int hashCode()
292     {
293         int hash = 37;
294         hash = hash * 17 + ( entry == null ? 0 : entry.hashCode() );
295         hash = hash * 17 + ( response == null ? 0 : response.hashCode() );
296         hash = hash * 17 + super.hashCode();
297 
298         return hash;
299     }
300 
301 
302     /**
303      * @see Object#toString()
304      */
305     public String toString()
306     {
307         StringBuilder sb = new StringBuilder();
308 
309         sb.append( "    Add Request :\n" );
310 
311         if ( entry == null )
312         {
313             sb.append( "            No entry\n" );
314         }
315         else
316         {
317             sb.append( entry.toString() );
318         }
319 
320         return super.toString( sb.toString() );
321     }
322 }