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.server.core.api.entry;
21  
22  
23  import java.io.IOException;
24  import java.io.ObjectInput;
25  import java.io.ObjectOutput;
26  import java.util.Collection;
27  import java.util.Iterator;
28  import java.util.List;
29  
30  import org.apache.directory.api.ldap.model.entry.Attribute;
31  import org.apache.directory.api.ldap.model.entry.DefaultEntry;
32  import org.apache.directory.api.ldap.model.entry.Entry;
33  import org.apache.directory.api.ldap.model.entry.Value;
34  import org.apache.directory.api.ldap.model.exception.LdapException;
35  import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
36  import org.apache.directory.api.ldap.model.name.Dn;
37  import org.apache.directory.api.ldap.model.schema.AttributeType;
38  import org.apache.directory.server.i18n.I18n;
39  
40  
41  /**
42   * A ServerEntry refers to the original entry before being modified by
43   * EntryFilters or operations.
44   *
45   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
46   */
47  public class ClonedServerEntry implements Entry
48  {
49      /** The original entry as returned by the backend */
50      protected Entry originalEntry;
51  
52      /** The copied entry */
53      protected Entry clonedEntry;
54  
55  
56      /**
57       * Creates a new instance of ClonedServerEntry.
58       */
59      public ClonedServerEntry()
60      {
61      }
62  
63  
64      /**
65       * Creates a new instance of ClonedServerEntry.
66       *
67       * The original entry is cloned in order to protect its content.
68       *
69       * @param originalEntry The original entry
70       */
71      public ClonedServerEntry( Entry originalEntry )
72      {
73          this.originalEntry = originalEntry;
74          this.clonedEntry = originalEntry.clone();
75      }
76  
77  
78      /**
79       * @return the originalEntry
80       */
81      public Entry getOriginalEntry()
82      {
83          return originalEntry;
84      }
85  
86  
87      /**
88       * @return the cloned Entry
89       */
90      public Entry getClonedEntry()
91      {
92          return clonedEntry;
93      }
94  
95  
96      @Override
97      public Entry add( AttributeType attributeType, byte[]... values ) throws LdapException
98      {
99          return clonedEntry.add( attributeType, values );
100     }
101 
102 
103     @Override
104     public Entry add( AttributeType attributeType, String... values ) throws LdapException
105     {
106         return clonedEntry.add( attributeType, values );
107     }
108 
109 
110     @Override
111     public Entry add( AttributeType attributeType, Value... values ) throws LdapException
112     {
113         return clonedEntry.add( attributeType, values );
114     }
115 
116 
117     @Override
118     public Entry add( String upId, AttributeType attributeType, byte[]... values ) throws LdapException
119     {
120         return clonedEntry.add( attributeType, values );
121     }
122 
123 
124     @Override
125     public Entry add( String upId, AttributeType attributeType, String... values ) throws LdapException
126     {
127         return clonedEntry.add( attributeType, values );
128     }
129 
130 
131     @Override
132     public Entry add( String upId, AttributeType attributeType, Value... values ) throws LdapException
133     {
134         return clonedEntry.add( attributeType, values );
135     }
136 
137 
138     @Override
139     public boolean contains( AttributeType attributeType, byte[]... values )
140     {
141         return clonedEntry.contains( attributeType, values );
142     }
143 
144 
145     @Override
146     public boolean contains( AttributeType attributeType, String... values )
147     {
148         return clonedEntry.contains( attributeType, values );
149     }
150 
151 
152     @Override
153     public boolean contains( AttributeType attributeType, Value... values )
154     {
155         return clonedEntry.contains( attributeType, values );
156     }
157 
158 
159     @Override
160     public boolean containsAttribute( AttributeType attributeType )
161     {
162         return clonedEntry.containsAttribute( attributeType );
163     }
164 
165 
166     @Override
167     public Attribute get( AttributeType attributeType )
168     {
169         return clonedEntry.get( attributeType );
170     }
171 
172 
173     /**
174      * {@inheritDoc}
175      */
176     @Override
177     public Collection<Attribute> getAttributes()
178     {
179         return clonedEntry.getAttributes();
180     }
181 
182 
183     @Override
184     public boolean hasObjectClass( Attribute... objectClasses )
185     {
186         return clonedEntry.hasObjectClass( objectClasses );
187     }
188 
189 
190     @Override
191     public Attribute put( AttributeType attributeType, byte[]... values ) throws LdapException
192     {
193         return clonedEntry.put( attributeType, values );
194     }
195 
196 
197     @Override
198     public Attribute put( AttributeType attributeType, String... values ) throws LdapException
199     {
200         return clonedEntry.put( attributeType, values );
201     }
202 
203 
204     @Override
205     public Attribute put( AttributeType attributeType, Value... values ) throws LdapException
206     {
207         return clonedEntry.put( attributeType, values );
208     }
209 
210 
211     @Override
212     public Attribute put( String upId, AttributeType attributeType, byte[]... values ) throws LdapException
213     {
214         return clonedEntry.put( attributeType, values );
215     }
216 
217 
218     @Override
219     public Attribute put( String upId, AttributeType attributeType, String... values ) throws LdapException
220     {
221         return clonedEntry.put( upId, attributeType, values );
222     }
223 
224 
225     @Override
226     public Attribute put( String upId, AttributeType attributeType, Value... values ) throws LdapException
227     {
228         return clonedEntry.put( upId, attributeType, values );
229     }
230 
231 
232     @Override
233     public boolean remove( AttributeType attributeType, byte[]... values ) throws LdapException
234     {
235         return clonedEntry.remove( attributeType, values );
236     }
237 
238 
239     @Override
240     public boolean remove( AttributeType attributeType, String... values ) throws LdapException
241     {
242         return clonedEntry.remove( attributeType, values );
243     }
244 
245 
246     @Override
247     public boolean remove( AttributeType attributeType, Value... values ) throws LdapException
248     {
249         return clonedEntry.remove( attributeType, values );
250     }
251 
252 
253     @Override
254     public List<Attribute> remove( Attribute... attributes ) throws LdapException
255     {
256         return clonedEntry.remove( attributes );
257     }
258 
259 
260     @Override
261     public void removeAttributes( AttributeType... attributes )
262     {
263         clonedEntry.removeAttributes( attributes );
264     }
265 
266 
267     @Override
268     public Entry add( Attribute... attributes ) throws LdapException
269     {
270         return clonedEntry.add( attributes );
271     }
272 
273 
274     @Override
275     public Entry add( String upId, String... values ) throws LdapException
276     {
277         return clonedEntry.add( upId, values );
278     }
279 
280 
281     @Override
282     public Entry add( String upId, byte[]... values ) throws LdapException
283     {
284         return clonedEntry.add( upId, values );
285     }
286 
287 
288     @Override
289     public Entry add( String upId, Value... values ) throws LdapException
290     {
291         return clonedEntry.add( upId, values );
292     }
293 
294 
295     @Override
296     public void clear()
297     {
298         clonedEntry.clear();
299     }
300 
301 
302     @Override
303     public boolean contains( Attribute... attributes )
304     {
305         return clonedEntry.contains( attributes );
306     }
307 
308 
309     @Override
310     public boolean contains( String upId, byte[]... values )
311     {
312         return clonedEntry.contains( upId, values );
313     }
314 
315 
316     @Override
317     public boolean contains( String upId, String... values )
318     {
319         return clonedEntry.contains( upId, values );
320     }
321 
322 
323     @Override
324     public boolean contains( String upId, Value... values )
325     {
326         return clonedEntry.contains( upId, values );
327     }
328 
329 
330     @Override
331     public boolean containsAttribute( String... attributes )
332     {
333         return clonedEntry.containsAttribute( attributes );
334     }
335 
336 
337     @Override
338     public Attribute get( String alias )
339     {
340         return clonedEntry.get( alias );
341     }
342 
343 
344     @Override
345     public Dn getDn()
346     {
347         return clonedEntry.getDn();
348     }
349 
350 
351     @Override
352     public boolean hasObjectClass( String... objectClasses )
353     {
354         return clonedEntry.hasObjectClass( objectClasses );
355     }
356 
357 
358     /**
359      * {@inheritDoc}
360      */
361     @Override
362     public boolean isSchemaAware()
363     {
364         return clonedEntry.isSchemaAware();
365     }
366 
367 
368     @Override
369     public Iterator<Attribute> iterator()
370     {
371         return clonedEntry.iterator();
372     }
373 
374 
375     @Override
376     public List<Attribute> put( Attribute... attributes ) throws LdapException
377     {
378         return clonedEntry.put( attributes );
379     }
380 
381 
382     @Override
383     public Attribute put( String upId, byte[]... values )
384     {
385         return clonedEntry.put( upId, values );
386     }
387 
388 
389     @Override
390     public Attribute put( String upId, String... values )
391     {
392         return clonedEntry.put( upId, values );
393     }
394 
395 
396     @Override
397     public Attribute put( String upId, Value... values )
398     {
399         return clonedEntry.put( upId, values );
400     }
401 
402 
403     @Override
404     public boolean remove( String upId, byte[]... values ) throws LdapException
405     {
406         return clonedEntry.remove( upId, values );
407     }
408 
409 
410     @Override
411     public boolean remove( String upId, String... values ) throws LdapException
412     {
413         return clonedEntry.remove( upId, values );
414     }
415 
416 
417     @Override
418     public boolean remove( String upId, Value... values ) throws LdapException
419     {
420         return clonedEntry.remove( upId, values );
421     }
422 
423 
424     @Override
425     public void removeAttributes( String... attributes )
426     {
427         clonedEntry.removeAttributes( attributes );
428     }
429 
430 
431     @Override
432     public void setDn( Dn dn )
433     {
434         clonedEntry.setDn( dn );
435     }
436 
437 
438     @Override
439     public void setDn( String dn ) throws LdapInvalidDnException
440     {
441         clonedEntry.setDn( dn );
442     }
443 
444 
445     @Override
446     public int size()
447     {
448         return clonedEntry.size();
449     }
450 
451 
452     public Entry toClientEntry() throws LdapException
453     {
454         // Copy the Dn
455         Entry clientEntry = new DefaultEntry( clonedEntry.getDn() );
456 
457         // Convert each attribute
458         for ( Attribute clonedEntry : this )
459         {
460             Attribute clientAttribute = clonedEntry.clone();
461             clientEntry.add( clientAttribute );
462         }
463 
464         return clientEntry;
465     }
466 
467 
468     /**
469      * @see java.io.Externalizable#readExternal(ObjectInput)
470      *
471      * We can't use this method for a ServerEntry
472      */
473     @Override
474     public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException
475     {
476         throw new IllegalStateException( I18n.err( I18n.ERR_455 ) );
477     }
478 
479 
480     /**
481      * @see java.io.Externalizable#writeExternal(ObjectOutput)
482      *
483      * We can't use this method for a ServerEntry
484      */
485     @Override
486     public void writeExternal( ObjectOutput out ) throws IOException
487     {
488         throw new IllegalStateException( I18n.err( I18n.ERR_456 ) );
489     }
490 
491 
492     @Override
493     public Entry clone()
494     {
495         return clonedEntry.clone();
496     }
497 
498 
499     @Override
500     public Entry shallowClone()
501     {
502         return clonedEntry.shallowClone();
503     }
504 
505 
506     /**
507      * {@inheritDoc}
508      */
509     @Override
510     public int hashCode()
511     {
512         return 703;
513     }
514 
515 
516     /**
517      * {@inheritDoc}
518      */
519     @Override
520     public boolean equals( Object obj )
521     {
522         // Short circuit
523         if ( this == obj )
524         {
525             return true;
526         }
527 
528         Entry other;
529 
530         if ( obj instanceof ClonedServerEntry )
531         {
532             other = ( ( ClonedServerEntry ) obj ).getClonedEntry();
533         }
534         else if ( obj instanceof Entry )
535         {
536             other = ( Entry ) obj;
537         }
538         else
539         {
540             return false;
541         }
542         if ( clonedEntry == null )
543         {
544             return other == null;
545         }
546         else
547         {
548             return clonedEntry.equals( other );
549         }
550     }
551 
552 
553     /**
554      * @see Object#toString()
555      */
556     @Override
557     public String toString()
558     {
559         return toString( "" );
560     }
561 
562 
563     /**
564      * {@inheritDoc}
565      */
566     @Override
567     public String toString( String tabs )
568     {
569         return clonedEntry.toString( tabs );
570     }
571 }