001    /*
002     * Copyright 2016 UnboundID Corp.
003     * All Rights Reserved.
004     */
005    /*
006     * Copyright (C) 2016 UnboundID Corp.
007     *
008     * This program is free software; you can redistribute it and/or modify
009     * it under the terms of the GNU General Public License (GPLv2 only)
010     * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
011     * as published by the Free Software Foundation.
012     *
013     * This program is distributed in the hope that it will be useful,
014     * but WITHOUT ANY WARRANTY; without even the implied warranty of
015     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016     * GNU General Public License for more details.
017     *
018     * You should have received a copy of the GNU General Public License
019     * along with this program; if not, see <http://www.gnu.org/licenses>.
020     */
021    package com.unboundid.ldap.sdk.experimental;
022    
023    
024    
025    import com.unboundid.ldap.sdk.Entry;
026    import com.unboundid.ldap.sdk.LDAPException;
027    import com.unboundid.ldap.sdk.ModifyDNRequest;
028    import com.unboundid.ldap.sdk.OperationType;
029    import com.unboundid.ldap.sdk.ResultCode;
030    import com.unboundid.util.NotMutable;
031    import com.unboundid.util.StaticUtils;
032    import com.unboundid.util.ThreadSafety;
033    import com.unboundid.util.ThreadSafetyLevel;
034    
035    import static com.unboundid.ldap.sdk.experimental.ExperimentalMessages.*;
036    
037    
038    
039    /**
040     * This class represents an entry that holds information about a modify DN
041     * operation processed by an LDAP server, as per the specification described in
042     * draft-chu-ldap-logschema-00.
043     */
044    @NotMutable()
045    @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
046    public final class DraftChuLDAPLogSchema00ModifyDNEntry
047           extends DraftChuLDAPLogSchema00Entry
048    {
049      /**
050       * The name of the attribute used to hold the value of the delete old RDN
051       * flag.
052       */
053      public static final String ATTR_DELETE_OLD_RDN = "reqDeleteOldRDN";
054    
055    
056    
057      /**
058       * The name of the attribute used to hold the new RDN value.
059       */
060      public static final String ATTR_NEW_RDN = "reqNewRDN";
061    
062    
063    
064      /**
065       * The name of the attribute used to hold the new superior DN value.
066       */
067      public static final String ATTR_NEW_SUPERIOR_DN = "reqNewSuperior";
068    
069    
070    
071      /**
072       * The serial version UID for this serializable class.
073       */
074      private static final long serialVersionUID = 5891004379538957384L;
075    
076    
077    
078      // The delete old RDN value.
079      private final boolean deleteOldRDN;
080    
081      // The new RDN.
082      private final String newRDN;
083    
084      // The new superior DN.
085      private final String newSuperiorDN;
086    
087    
088    
089      /**
090       * Creates a new instance of this modify DN access log entry from the provided
091       * entry.
092       *
093       * @param  entry  The entry used to create this modify DN access log entry.
094       *
095       * @throws  LDAPException  If the provided entry cannot be decoded as a valid
096       *                         modify DN access log entry as per the specification
097       *                         contained in draft-chu-ldap-logschema-00.
098       */
099      public DraftChuLDAPLogSchema00ModifyDNEntry(final Entry entry)
100             throws LDAPException
101      {
102        super(entry, OperationType.MODIFY_DN);
103    
104    
105        // Get the new RDN.
106        newRDN = entry.getAttributeValue(ATTR_NEW_RDN);
107        if (newRDN == null)
108        {
109          throw new LDAPException(ResultCode.DECODING_ERROR,
110               ERR_LOGSCHEMA_DECODE_MISSING_REQUIRED_ATTR.get(entry.getDN(),
111                    ATTR_NEW_RDN));
112        }
113    
114    
115        // Get the delete old RDN flag.
116        final String deleteOldRDNString =
117             entry.getAttributeValue(ATTR_DELETE_OLD_RDN);
118        if (deleteOldRDNString == null)
119        {
120          throw new LDAPException(ResultCode.DECODING_ERROR,
121               ERR_LOGSCHEMA_DECODE_MISSING_REQUIRED_ATTR.get(entry.getDN(),
122                    ATTR_DELETE_OLD_RDN));
123        }
124    
125        final String lowerDeleteOldRDN =
126             StaticUtils.toLowerCase(deleteOldRDNString);
127        if (lowerDeleteOldRDN.equals("true"))
128        {
129          deleteOldRDN = true;
130        }
131        else if (lowerDeleteOldRDN.equals("false"))
132        {
133          deleteOldRDN = false;
134        }
135        else
136        {
137          throw new LDAPException(ResultCode.DECODING_ERROR,
138               ERR_LOGSCHEMA_DECODE_MODIFY_DN_DELETE_OLD_RDN_ERROR.get(
139                    entry.getDN(), ATTR_DELETE_OLD_RDN, deleteOldRDNString));
140        }
141    
142    
143        // Get the new superior DN.
144        newSuperiorDN = entry.getAttributeValue(ATTR_NEW_SUPERIOR_DN);
145      }
146    
147    
148    
149      /**
150       * Retrieves the new RDN for the modify DN request described by this modify DN
151       * access log entry.
152       *
153       * @return  The new RDN for the modify DN request described by this modify DN
154       *          access log entry.
155       */
156      public String getNewRDN()
157      {
158        return newRDN;
159      }
160    
161    
162    
163      /**
164       * Retrieves the value of the "delete old RDN" flag for the modify DN request
165       * described by this modify DN access log entry.
166       *
167       * @return  {@code true} if the modify request indicated that old RDN
168       *          attribute values should be removed from the entry, or
169       *          {@code false} if old RDN attribute values should be preserved.
170       */
171      public boolean deleteOldRDN()
172      {
173        return deleteOldRDN;
174      }
175    
176    
177    
178      /**
179       * Retrieves the new superior DN for the modify DN request described by this
180       * modify DN access log entry, if any.
181       *
182       * @return  The new superior DN for the modify DN request described by this
183       *          modify DN access log entry, or {@code null} if there is no new
184       *          superior DN.
185       */
186      public String getNewSuperiorDN()
187      {
188        return newSuperiorDN;
189      }
190    
191    
192    
193      /**
194       * Retrieves a {@code ModifyDNRequest} created from this modify DN access log
195       * entry.
196       *
197       * @return  The {@code ModifyDNRequest} created from this modify DN access log
198       *          entry.
199       */
200      public ModifyDNRequest toModifyDNRequest()
201      {
202        return new ModifyDNRequest(getTargetEntryDN(), newRDN, deleteOldRDN,
203             newSuperiorDN, getRequestControlArray());
204      }
205    }