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.server.core.entry; 021 022 023 import java.io.IOException; 024 import java.io.ObjectInput; 025 import java.io.ObjectOutput; 026 import java.util.Collections; 027 import java.util.Iterator; 028 import java.util.List; 029 import java.util.Set; 030 031 import org.apache.directory.server.i18n.I18n; 032 import org.apache.directory.shared.ldap.entry.Entry; 033 import org.apache.directory.shared.ldap.entry.EntryAttribute; 034 import org.apache.directory.shared.ldap.entry.ServerEntry; 035 import org.apache.directory.shared.ldap.entry.Value; 036 import org.apache.directory.shared.ldap.entry.client.DefaultClientEntry; 037 import org.apache.directory.shared.ldap.exception.LdapException; 038 import org.apache.directory.shared.ldap.name.DN; 039 import org.apache.directory.shared.ldap.schema.AttributeType; 040 041 042 /** 043 * A ServerEntry refers to the original entry before being modified by 044 * EntryFilters or operations. 045 * 046 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 047 * @version $Rev$, $Date$ 048 */ 049 public class ClonedServerEntry implements ServerEntry 050 { 051 /** The original entry as returned by the backend */ 052 private final ServerEntry originalEntry; 053 054 /** The copied entry */ 055 private final ServerEntry clonedEntry; 056 057 058 /** 059 * Creates a new instance of ClonedServerEntry. 060 * 061 * The original entry is cloned in order to protect its content. 062 * 063 * @param originalEntry The original entry 064 */ 065 public ClonedServerEntry( ServerEntry originalEntry ) 066 { 067 this.originalEntry = ( ServerEntry )originalEntry.clone(); 068 this.clonedEntry = ( ServerEntry ) originalEntry.clone(); 069 } 070 071 072 /** 073 * @return the originalEntry 074 */ 075 public ServerEntry getOriginalEntry() 076 { 077 return originalEntry; 078 } 079 080 081 /** 082 * @return the cloned Entry 083 */ 084 public Entry getClonedEntry() 085 { 086 return clonedEntry; 087 } 088 089 090 public void add( AttributeType attributeType, byte[]... values ) throws LdapException 091 { 092 clonedEntry.add( attributeType, values ); 093 } 094 095 096 public void add( AttributeType attributeType, String... values ) throws LdapException 097 { 098 clonedEntry.add( attributeType, values ); 099 } 100 101 102 public void add( AttributeType attributeType, Value<?>... values ) throws LdapException 103 { 104 clonedEntry.add( attributeType, values ); 105 } 106 107 108 public void add( String upId, AttributeType attributeType, byte[]... values ) throws LdapException 109 { 110 clonedEntry.add( attributeType, values ); 111 } 112 113 114 public void add( String upId, AttributeType attributeType, String... values ) throws LdapException 115 { 116 clonedEntry.add( attributeType, values ); 117 } 118 119 120 public void add( String upId, AttributeType attributeType, Value<?>... values ) throws LdapException 121 { 122 clonedEntry.add( attributeType, values ); 123 } 124 125 126 public boolean contains( AttributeType attributeType, byte[]... values ) 127 { 128 return clonedEntry.contains( attributeType, values ); 129 } 130 131 132 public boolean contains( AttributeType attributeType, String... values ) 133 { 134 return clonedEntry.contains( attributeType, values ); 135 } 136 137 138 public boolean contains( AttributeType attributeType, Value<?>... values ) 139 { 140 return clonedEntry.contains( attributeType, values ); 141 } 142 143 144 public boolean containsAttribute( AttributeType attributeType ) 145 { 146 return clonedEntry.containsAttribute( attributeType ); 147 } 148 149 150 public EntryAttribute get( AttributeType attributeType ) 151 { 152 return clonedEntry.get( attributeType ); 153 } 154 155 156 public Set<AttributeType> getAttributeTypes() 157 { 158 return clonedEntry.getAttributeTypes(); 159 } 160 161 162 public boolean hasObjectClass( EntryAttribute objectClass ) 163 { 164 return clonedEntry.hasObjectClass( objectClass ); 165 } 166 167 168 public boolean isValid() 169 { 170 return clonedEntry.isValid(); 171 } 172 173 174 public boolean isValid( String objectClass ) 175 { 176 return clonedEntry.isValid( objectClass ); 177 } 178 179 180 public boolean isValid( EntryAttribute objectClass ) 181 { 182 return clonedEntry.isValid( objectClass ); 183 } 184 185 186 public EntryAttribute put( AttributeType attributeType, byte[]... values ) throws LdapException 187 { 188 return clonedEntry.put( attributeType, values ); 189 } 190 191 192 public EntryAttribute put( AttributeType attributeType, String... values ) throws LdapException 193 { 194 return clonedEntry.put( attributeType, values ); 195 } 196 197 198 public EntryAttribute put( AttributeType attributeType, Value<?>... values ) throws LdapException 199 { 200 return clonedEntry.put( attributeType, values ); 201 } 202 203 204 public EntryAttribute put( String upId, AttributeType attributeType, byte[]... values ) throws LdapException 205 { 206 return clonedEntry.put( attributeType, values ); 207 } 208 209 210 public EntryAttribute put( String upId, AttributeType attributeType, String... values ) throws LdapException 211 { 212 return clonedEntry.put( upId, attributeType, values ); 213 } 214 215 216 public EntryAttribute put( String upId, AttributeType attributeType, Value<?>... values ) throws LdapException 217 { 218 return clonedEntry.put( upId, attributeType, values ); 219 } 220 221 222 public boolean remove( AttributeType attributeType, byte[]... values ) throws LdapException 223 { 224 return clonedEntry.remove( attributeType, values ); 225 } 226 227 228 public boolean remove( AttributeType attributeType, String... values ) throws LdapException 229 { 230 return clonedEntry.remove( attributeType, values ); 231 } 232 233 234 public boolean remove( AttributeType attributeType, Value<?>... values ) throws LdapException 235 { 236 return clonedEntry.remove( attributeType, values ); 237 } 238 239 240 public List<EntryAttribute> remove( EntryAttribute... attributes ) throws LdapException 241 { 242 return clonedEntry.remove( attributes ); 243 } 244 245 246 public List<EntryAttribute> removeAttributes( AttributeType... attributes ) 247 { 248 return clonedEntry.removeAttributes( attributes ); 249 } 250 251 252 public List<EntryAttribute> set( AttributeType... attributeTypes ) 253 { 254 return clonedEntry.set( attributeTypes ); 255 } 256 257 258 public void add( EntryAttribute... attributes ) throws LdapException 259 { 260 clonedEntry.add( attributes ); 261 } 262 263 264 public void add( String upId, String... values ) throws LdapException 265 { 266 clonedEntry.add( upId, values ); 267 } 268 269 270 public void add( String upId, byte[]... values ) throws LdapException 271 { 272 clonedEntry.add( upId, values ); 273 } 274 275 276 public void add( String upId, Value<?>... values ) throws LdapException 277 { 278 clonedEntry.add( upId, values ); 279 } 280 281 282 public void clear() 283 { 284 clonedEntry.clear(); 285 } 286 287 288 public boolean contains( EntryAttribute... attributes ) throws LdapException 289 { 290 return clonedEntry.contains( attributes ); 291 } 292 293 294 public boolean contains( String upId, byte[]... values ) 295 { 296 return clonedEntry.contains( upId, values ); 297 } 298 299 300 public boolean contains( String upId, String... values ) 301 { 302 return clonedEntry.contains( upId, values ); 303 } 304 305 306 public boolean contains( String upId, Value<?>... values ) 307 { 308 return clonedEntry.contains( upId, values ); 309 } 310 311 312 public boolean containsAttribute( String... attributes ) 313 { 314 return clonedEntry.containsAttribute( attributes ); 315 } 316 317 318 public EntryAttribute get( String alias ) 319 { 320 return clonedEntry.get( alias ); 321 } 322 323 324 public DN getDn() 325 { 326 return clonedEntry.getDn(); 327 } 328 329 330 public boolean hasObjectClass( String objectClass ) 331 { 332 return clonedEntry.hasObjectClass( objectClass ); 333 } 334 335 336 public Iterator<EntryAttribute> iterator() 337 { 338 return clonedEntry.iterator(); 339 } 340 341 342 public List<EntryAttribute> put( EntryAttribute... attributes ) throws LdapException 343 { 344 return clonedEntry.put( attributes ); 345 } 346 347 348 public EntryAttribute put( String upId, byte[]... values ) 349 { 350 return clonedEntry.put( upId, values ); 351 } 352 353 354 public EntryAttribute put( String upId, String... values ) 355 { 356 return clonedEntry.put( upId, values ); 357 } 358 359 360 public EntryAttribute put( String upId, Value<?>... values ) 361 { 362 return clonedEntry.put( upId, values ); 363 } 364 365 366 public boolean remove( String upId, byte[]... values ) throws LdapException 367 { 368 return clonedEntry.remove( upId, values ); 369 } 370 371 372 public boolean remove( String upId, String... values ) throws LdapException 373 { 374 return clonedEntry.remove( upId, values ); 375 } 376 377 378 public boolean remove( String upId, Value<?>... values ) throws LdapException 379 { 380 return clonedEntry.remove( upId, values ); 381 } 382 383 384 public List<EntryAttribute> removeAttributes( String... attributes ) 385 { 386 return clonedEntry.removeAttributes( attributes ); 387 } 388 389 390 public List<EntryAttribute> set( String... upIds ) 391 { 392 return clonedEntry.set( upIds ); 393 } 394 395 396 public void setDn( DN dn ) 397 { 398 clonedEntry.setDn( dn ); 399 } 400 401 402 public int size() 403 { 404 return clonedEntry.size(); 405 } 406 407 408 public Entry toClientEntry() throws LdapException 409 { 410 // Copy the DN 411 Entry clientEntry = new DefaultClientEntry( clonedEntry.getDn() ); 412 413 // Convert each attribute 414 for ( EntryAttribute clonedEntry:this ) 415 { 416 EntryAttribute clientAttribute = clonedEntry.toClientAttribute(); 417 clientEntry.add( clientAttribute ); 418 } 419 420 return clientEntry; 421 } 422 423 424 /** 425 * @see java.io.Externalizable#readExternal(ObjectInput) 426 * 427 * We can't use this method for a ServerEntry 428 */ 429 public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException 430 { 431 throw new IllegalStateException( I18n.err( I18n.ERR_455 ) ); 432 } 433 434 435 /** 436 * @see java.io.Externalizable#writeExternal(ObjectOutput) 437 * 438 * We can't use this method for a ServerEntry 439 */ 440 public void writeExternal( ObjectOutput out ) throws IOException 441 { 442 throw new IllegalStateException( I18n.err( I18n.ERR_456 ) ); 443 } 444 445 446 public ServerEntry clone() 447 { 448 return ( ServerEntry ) clonedEntry.clone(); 449 } 450 451 452 /** 453 * @see Object#equals(Object); 454 */ 455 public boolean equals( Object obj ) 456 { 457 // Short circuit 458 if ( this == obj ) 459 { 460 return true; 461 } 462 463 Entry other; 464 465 if ( obj instanceof ClonedServerEntry ) 466 { 467 other = ((ClonedServerEntry)obj).getClonedEntry(); 468 } 469 else if ( obj instanceof ServerEntry ) 470 { 471 other = (ServerEntry)obj; 472 } 473 else 474 { 475 return false; 476 } 477 478 return clonedEntry.equals( other ); 479 } 480 481 482 public String toString() 483 { 484 return clonedEntry.toString(); 485 } 486 487 488 class EmptyEntry implements ServerEntry 489 { 490 DN dn; 491 492 EmptyEntry( DN dn ) 493 { 494 this.dn = dn; 495 } 496 497 public void add( AttributeType attributeType, byte[]... values ) throws LdapException 498 { 499 } 500 501 public void add( AttributeType attributeType, String... values ) throws LdapException 502 { 503 } 504 505 public void add( AttributeType attributeType, Value<?>... values ) throws LdapException 506 { 507 } 508 509 public void add( String upId, AttributeType attributeType, byte[]... values ) throws LdapException 510 { 511 } 512 513 public void add( String upId, AttributeType attributeType, String... values ) throws LdapException 514 { 515 } 516 517 public void add( String upId, AttributeType attributeType, Value<?>... values ) throws LdapException 518 { 519 } 520 521 public boolean contains( AttributeType attributeType, byte[]... values ) 522 { 523 return false; 524 } 525 526 public boolean contains( AttributeType attributeType, String... values ) 527 { 528 return false; 529 } 530 531 public boolean contains( AttributeType attributeType, Value<?>... values ) 532 { 533 return false; 534 } 535 536 public boolean containsAttribute( AttributeType attributeType ) 537 { 538 return false; 539 } 540 541 public EntryAttribute get( AttributeType attributeType ) 542 { 543 return null; 544 } 545 546 public Set<AttributeType> getAttributeTypes() 547 { 548 return null; 549 } 550 551 public boolean hasObjectClass( EntryAttribute objectClass ) 552 { 553 return false; 554 } 555 556 public boolean isValid() 557 { 558 return false; 559 } 560 561 public boolean isValid( String objectClass ) 562 { 563 return false; 564 } 565 566 public boolean isValid( EntryAttribute objectClass ) 567 { 568 return false; 569 } 570 571 public EntryAttribute put( AttributeType attributeType, byte[]... values ) throws LdapException 572 { 573 return null; 574 } 575 576 public EntryAttribute put( AttributeType attributeType, String... values ) throws LdapException 577 { 578 return null; 579 } 580 581 public EntryAttribute put( AttributeType attributeType, Value<?>... values ) throws LdapException 582 { 583 return null; 584 } 585 586 public EntryAttribute put( String upId, AttributeType attributeType, byte[]... values ) throws LdapException 587 { 588 return null; 589 } 590 591 public EntryAttribute put( String upId, AttributeType attributeType, String... values ) throws LdapException 592 { 593 return null; 594 } 595 596 public EntryAttribute put( String upId, AttributeType attributeType, Value<?>... values ) 597 throws LdapException 598 { 599 return null; 600 } 601 602 public boolean remove( AttributeType attributeType, byte[]... values ) throws LdapException 603 { 604 return false; 605 } 606 607 public boolean remove( AttributeType attributeType, String... values ) throws LdapException 608 { 609 return false; 610 } 611 612 public boolean remove( AttributeType attributeType, Value<?>... values ) throws LdapException 613 { 614 return false; 615 } 616 617 public List<EntryAttribute> remove( EntryAttribute... attributes ) throws LdapException 618 { 619 return Collections.emptyList(); 620 } 621 622 public List<EntryAttribute> removeAttributes( AttributeType... attributes ) 623 { 624 return Collections.emptyList(); 625 } 626 627 public List<EntryAttribute> set( AttributeType... attributeTypes ) 628 { 629 return Collections.emptyList(); 630 } 631 632 public void add( EntryAttribute... attributes ) throws LdapException 633 { 634 } 635 636 public void add( String upId, String... values ) throws LdapException 637 { 638 } 639 640 public void add( String upId, byte[]... values ) throws LdapException 641 { 642 } 643 644 public void add( String upId, Value<?>... values ) throws LdapException 645 { 646 } 647 648 public void clear() 649 { 650 } 651 652 public boolean contains( EntryAttribute... attributes ) throws LdapException 653 { 654 return false; 655 } 656 657 public boolean contains( String upId, byte[]... values ) 658 { 659 return false; 660 } 661 662 public boolean contains( String upId, String... values ) 663 { 664 return false; 665 } 666 667 public boolean contains( String upId, Value<?>... values ) 668 { 669 return false; 670 } 671 672 public boolean containsAttribute( String... attributes ) 673 { 674 return false; 675 } 676 677 public EntryAttribute get( String alias ) 678 { 679 return null; 680 } 681 682 public DN getDn() 683 { 684 return null; 685 } 686 687 public boolean hasObjectClass( String objectClass ) 688 { 689 return false; 690 } 691 692 @SuppressWarnings("unchecked") 693 public Iterator<EntryAttribute> iterator() 694 { 695 return ( ( List <EntryAttribute> ) Collections.EMPTY_LIST ).iterator(); 696 } 697 698 public List<EntryAttribute> put( EntryAttribute... attributes ) throws LdapException 699 { 700 return Collections.emptyList(); 701 } 702 703 public EntryAttribute put( String upId, byte[]... values ) 704 { 705 return null; 706 } 707 708 public EntryAttribute put( String upId, String... values ) 709 { 710 return null; 711 } 712 713 public EntryAttribute put( String upId, Value<?>... values ) 714 { 715 return null; 716 } 717 718 public boolean remove( String upId, byte[]... values ) throws LdapException 719 { 720 return false; 721 } 722 723 public boolean remove( String upId, String... values ) throws LdapException 724 { 725 return false; 726 } 727 728 public boolean remove( String upId, Value<?>... values ) throws LdapException 729 { 730 return false; 731 } 732 733 public List<EntryAttribute> removeAttributes( String... attributes ) 734 { 735 return Collections.emptyList(); 736 } 737 738 public List<EntryAttribute> set( String... upIds ) 739 { 740 return Collections.emptyList(); 741 } 742 743 public void setDn( DN dn ) 744 { 745 this.dn = dn; 746 } 747 748 public int size() 749 { 750 return 0; 751 } 752 753 754 public ServerEntry clone() 755 { 756 return new EmptyEntry( dn ); 757 } 758 759 760 public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException 761 { 762 } 763 764 765 public void writeExternal( ObjectOutput out ) throws IOException 766 { 767 } 768 769 770 public Entry toClientEntry() throws LdapException 771 { 772 // Copy the DN 773 Entry clientEntry = new DefaultClientEntry( dn ); 774 775 // Convert each attribute 776 for ( EntryAttribute serverAttribute:this ) 777 { 778 EntryAttribute clientAttribute = serverAttribute.toClientAttribute(); 779 clientEntry.add( clientAttribute ); 780 } 781 782 return clientEntry; 783 } 784 } 785 }