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.interceptor.context; 021 022 023 import org.apache.directory.server.core.CoreSession; 024 import org.apache.directory.server.i18n.I18n; 025 import org.apache.directory.shared.ldap.codec.controls.ManageDsaITControl; 026 import org.apache.directory.shared.ldap.message.internal.InternalModifyDnRequest; 027 import org.apache.directory.shared.ldap.name.DN; 028 import org.apache.directory.shared.ldap.name.RDN; 029 030 031 /** 032 * A Move And Rename context used for Interceptors. It contains all the informations 033 * needed for the modify DN operation, and used by all the interceptors 034 * 035 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 036 * @version $Rev$, $Date$ 037 */ 038 public class MoveAndRenameOperationContext extends RenameOperationContext 039 { 040 /** The parent DN */ 041 private DN parent; 042 043 /** Cached calculated new DN after move and rename */ 044 private DN newDn; 045 046 /** 047 * Creates a new instance of MoveAndRenameOperationContext. 048 */ 049 public MoveAndRenameOperationContext( CoreSession session ) 050 { 051 super( session ); 052 } 053 054 055 /** 056 * Creates a new instance of MoveAndRenameOperationContext. 057 * 058 * @param oldDn the original source entry DN to be moved and renamed 059 * @param parent the new entry superior of the target after the move 060 * @param newRdn the new rdn to use for the target once renamed 061 * @param delOldRdn true if the old rdn value is deleted, false otherwise 062 */ 063 public MoveAndRenameOperationContext( CoreSession session, DN oldDn, DN parent, RDN newRdn, boolean delOldRdn ) 064 { 065 super( session, oldDn, newRdn, delOldRdn ); 066 this.parent = parent; 067 } 068 069 070 public MoveAndRenameOperationContext( CoreSession session, InternalModifyDnRequest modifyDnRequest ) 071 { 072 // super sets the newRdn and the delOldRdn members and tests 073 super( session, modifyDnRequest ); 074 this.parent = modifyDnRequest.getNewSuperior(); 075 076 if ( parent == null ) 077 { 078 throw new IllegalStateException( I18n.err( I18n.ERR_325, modifyDnRequest ) ); 079 } 080 081 if ( requestControls.containsKey( ManageDsaITControl.CONTROL_OID ) ) 082 { 083 ignoreReferral(); 084 } 085 else 086 { 087 throwReferral(); 088 } 089 } 090 091 092 /** 093 * @return The parent DN 094 */ 095 public DN getParent() 096 { 097 return parent; 098 } 099 100 101 /** 102 * Set the parent DN 103 * 104 * @param parent The parent 105 */ 106 public void setParent( DN parent ) 107 { 108 this.parent = parent; 109 } 110 111 112 /** 113 * Gets cached copy of already computed new name or creates it if not 114 * 115 * @return the normalized new name after move and rename 116 * @throws Exception if the name cannot be normalized 117 */ 118 public DN getNewDn() throws Exception 119 { 120 if ( newDn == null ) 121 { 122 newDn = new DN( getParent().getName() ); 123 newDn.add( getNewRdn().getName() ); 124 newDn.normalize( session.getDirectoryService() 125 .getSchemaManager().getNormalizerMapping() ); 126 } 127 128 return newDn; 129 } 130 131 132 /** 133 * @see Object#toString() 134 */ 135 public String toString() 136 { 137 return "ReplaceContext for old DN '" + getDn().getName() + "'" + 138 ", parent '" + parent + "'"; 139 } 140 }