001/*
002 * Copyright 2009-2024 Ping Identity Corporation
003 * All Rights Reserved.
004 */
005/*
006 * Copyright 2009-2024 Ping Identity Corporation
007 *
008 * Licensed under the Apache License, Version 2.0 (the "License");
009 * you may not use this file except in compliance with the License.
010 * You may obtain a copy of the License at
011 *
012 *    http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing, software
015 * distributed under the License is distributed on an "AS IS" BASIS,
016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017 * See the License for the specific language governing permissions and
018 * limitations under the License.
019 */
020/*
021 * Copyright (C) 2009-2024 Ping Identity Corporation
022 *
023 * This program is free software; you can redistribute it and/or modify
024 * it under the terms of the GNU General Public License (GPLv2 only)
025 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
026 * as published by the Free Software Foundation.
027 *
028 * This program is distributed in the hope that it will be useful,
029 * but WITHOUT ANY WARRANTY; without even the implied warranty of
030 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
031 * GNU General Public License for more details.
032 *
033 * You should have received a copy of the GNU General Public License
034 * along with this program; if not, see <http://www.gnu.org/licenses>.
035 */
036package com.unboundid.ldap.sdk.unboundidds.logs;
037
038
039
040import java.util.Collections;
041import java.util.LinkedList;
042import java.util.List;
043import java.util.StringTokenizer;
044
045import com.unboundid.ldap.sdk.ResultCode;
046import com.unboundid.ldap.sdk.unboundidds.controls.AssuredReplicationLocalLevel;
047import com.unboundid.ldap.sdk.unboundidds.controls.
048            AssuredReplicationRemoteLevel;
049import com.unboundid.util.NotExtensible;
050import com.unboundid.util.NotMutable;
051import com.unboundid.util.NotNull;
052import com.unboundid.util.Nullable;
053import com.unboundid.util.ThreadSafety;
054import com.unboundid.util.ThreadSafetyLevel;
055
056
057
058/**
059 * This class provides a data structure that holds information about a log
060 * message that may appear in the Directory Server access log about the result
061 * of a delete operation processed by the Directory Server.
062 * <BR>
063 * <BLOCKQUOTE>
064 *   <B>NOTE:</B>  This class, and other classes within the
065 *   {@code com.unboundid.ldap.sdk.unboundidds} package structure, are only
066 *   supported for use against Ping Identity, UnboundID, and
067 *   Nokia/Alcatel-Lucent 8661 server products.  These classes provide support
068 *   for proprietary functionality or for external specifications that are not
069 *   considered stable or mature enough to be guaranteed to work in an
070 *   interoperable way with other types of LDAP servers.
071 * </BLOCKQUOTE>
072 */
073@NotExtensible()
074@NotMutable()
075@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
076public class DeleteResultAccessLogMessage
077       extends DeleteRequestAccessLogMessage
078       implements OperationResultAccessLogMessage
079{
080  /**
081   * The serial version UID for this serializable class.
082   */
083  private static final long serialVersionUID = -4379716182028950134L;
084
085
086
087  // The assured replication level to use for local servers.
088  @Nullable private final AssuredReplicationLocalLevel
089       assuredReplicationLocalLevel;
090
091  // The assured replication level to use for remote servers.
092  @Nullable private final AssuredReplicationRemoteLevel
093       assuredReplicationRemoteLevel;
094
095  //  Indicates whether the delete operation targeted a soft-deleted entry.
096  @Nullable private final Boolean changeToSoftDeletedEntry;
097
098  // Indicates whether the response was known to be delayed by replication
099  // assurance processing.
100  @Nullable private final Boolean responseDelayedByAssurance;
101
102  // Indicates whether the any uncached data was accessed in the course of
103  // processing this operation.
104  @Nullable private final Boolean uncachedDataAccessed;
105
106  // The processing time for the operation.
107  @Nullable private final Double processingTime;
108
109  // The queue time for the operation.
110  @Nullable private final Double queueTime;
111
112  // The port of the backend server to which the request has been forwarded.
113  @Nullable private final Integer targetPort;
114
115  // The list of indexes for which keys near the index entry limit were accessed
116  // while processing the operation.
117  @NotNull private final List<String> indexesWithKeysAccessedNearEntryLimit;
118
119  // The list of indexes for which keys over the index entry limit were accessed
120  // while processing the operation.
121  @NotNull private final List<String> indexesWithKeysAccessedOverEntryLimit;
122
123  // The list of privileges required for processing the operation that the
124  // requester did not have.
125  @NotNull private final List<String> missingPrivileges;
126
127  // The list of privileges used during the course of processing the operation
128  // before an alternate authorization identity was assigned.
129  @NotNull private final List<String> preAuthZUsedPrivileges;
130
131  // The list of referral URLs for the operation.
132  @NotNull private final List<String> referralURLs;
133
134  // The list of response control OIDs for the operation.
135  @NotNull private final List<String> responseControlOIDs;
136
137  // The list of servers accessed while processing the operation.
138  @NotNull private final List<String> serversAccessed;
139
140  // The list of privileges used during the course of processing the operation.
141  @NotNull private final List<String> usedPrivileges;
142
143  // The assured replication timeout, in milliseconds.
144  @Nullable private final Long assuredReplicationTimeoutMillis;
145
146  // The number of intermediate response messages returned to the client.
147  @Nullable private final Long intermediateResponsesReturned;
148
149  // The result code for the operation.
150  @Nullable private final ResultCode resultCode;
151
152  // Additional information about the operation result.
153  @Nullable private final String additionalInformation;
154
155  // The alternate authorization DN for the operation.
156  @Nullable private final String authzDN;
157
158  // The diagnostic message for the operation.
159  @Nullable private final String diagnosticMessage;
160
161  // The intermediate client result for the operation.
162  @Nullable private final String intermediateClientResult;
163
164  // The matched DN for the operation.
165  @Nullable private final String matchedDN;
166
167  // The replication change ID for the operation.
168  @Nullable private final String replicationChangeID;
169
170  // The DN of the soft-deleted entry that was created as a result of a soft
171  // delete operation rather than a hard delete.
172  @Nullable private final String softDeletedEntryDN;
173
174  // The address of the backend server to which the request has been forwarded.
175  @Nullable private final String targetHost;
176
177  // The protocol used to forward the request to the backend server.
178  @Nullable private final String targetProtocol;
179
180
181
182  /**
183   * Creates a new delete result access log message from the provided message
184   * string.
185   *
186   * @param  s  The string to be parsed as a delete result access log message.
187   *
188   * @throws  LogException  If the provided string cannot be parsed as a valid
189   *                        log message.
190   */
191  public DeleteResultAccessLogMessage(@NotNull final String s)
192         throws LogException
193  {
194    this(new LogMessage(s));
195  }
196
197
198
199  /**
200   * Creates a new delete result access log message from the provided log
201   * message.
202   *
203   * @param  m  The log message to be parsed as a delete result access log
204   *            message.
205   */
206  public DeleteResultAccessLogMessage(@NotNull final LogMessage m)
207  {
208    super(m);
209
210    diagnosticMessage        = getNamedValue("message");
211    additionalInformation    = getNamedValue("additionalInfo");
212    matchedDN                = getNamedValue("matchedDN");
213    processingTime           = getNamedValueAsDouble("etime");
214    queueTime                = getNamedValueAsDouble("qtime");
215    intermediateClientResult = getNamedValue("from");
216    authzDN                  = getNamedValue("authzDN");
217    replicationChangeID      = getNamedValue("replicationChangeID");
218    softDeletedEntryDN       = getNamedValue("softDeleteEntryDN");
219    targetHost               = getNamedValue("targetHost");
220    targetPort               = getNamedValueAsInteger("targetPort");
221    targetProtocol           = getNamedValue("targetProtocol");
222
223    changeToSoftDeletedEntry =
224         getNamedValueAsBoolean("changeToSoftDeletedEntry");
225    intermediateResponsesReturned =
226         getNamedValueAsLong("intermediateResponsesReturned");
227
228    final Integer rcInteger = getNamedValueAsInteger("resultCode");
229    if (rcInteger == null)
230    {
231      resultCode = null;
232    }
233    else
234    {
235      resultCode = ResultCode.valueOf(rcInteger);
236    }
237
238    final String refStr = getNamedValue("referralURLs");
239    if ((refStr == null) || refStr.isEmpty())
240    {
241      referralURLs = Collections.emptyList();
242    }
243    else
244    {
245      final LinkedList<String> refs = new LinkedList<>();
246      int startPos = 0;
247      while (true)
248      {
249        final int commaPos = refStr.indexOf(",ldap", startPos);
250        if (commaPos < 0)
251        {
252          refs.add(refStr.substring(startPos));
253          break;
254        }
255        else
256        {
257          refs.add(refStr.substring(startPos, commaPos));
258          startPos = commaPos+1;
259        }
260      }
261      referralURLs = Collections.unmodifiableList(refs);
262    }
263
264    final String controlStr = getNamedValue("responseControls");
265    if (controlStr == null)
266    {
267      responseControlOIDs = Collections.emptyList();
268    }
269    else
270    {
271      final LinkedList<String> controlList = new LinkedList<>();
272      final StringTokenizer t = new StringTokenizer(controlStr, ",");
273      while (t.hasMoreTokens())
274      {
275        controlList.add(t.nextToken());
276      }
277      responseControlOIDs = Collections.unmodifiableList(controlList);
278    }
279
280    final String serversAccessedStr = getNamedValue("serversAccessed");
281    if ((serversAccessedStr == null) || serversAccessedStr.isEmpty())
282    {
283      serversAccessed = Collections.emptyList();
284    }
285    else
286    {
287      final LinkedList<String> servers = new LinkedList<>();
288      final StringTokenizer tokenizer =
289           new StringTokenizer(serversAccessedStr, ",");
290      while (tokenizer.hasMoreTokens())
291      {
292        servers.add(tokenizer.nextToken());
293      }
294      serversAccessed = Collections.unmodifiableList(servers);
295    }
296
297    uncachedDataAccessed = getNamedValueAsBoolean("uncachedDataAccessed");
298
299
300    final String localLevelStr = getNamedValue("localAssuranceLevel");
301    if (localLevelStr == null)
302    {
303      assuredReplicationLocalLevel = null;
304    }
305    else
306    {
307      assuredReplicationLocalLevel =
308           AssuredReplicationLocalLevel.valueOf(localLevelStr);
309    }
310
311    final String remoteLevelStr = getNamedValue("remoteAssuranceLevel");
312    if (remoteLevelStr == null)
313    {
314      assuredReplicationRemoteLevel = null;
315    }
316    else
317    {
318      assuredReplicationRemoteLevel =
319           AssuredReplicationRemoteLevel.valueOf(remoteLevelStr);
320    }
321
322    assuredReplicationTimeoutMillis =
323         getNamedValueAsLong("assuranceTimeoutMillis");
324    responseDelayedByAssurance =
325         getNamedValueAsBoolean("responseDelayedByAssurance");
326
327    final String usedPrivilegesStr = getNamedValue("usedPrivileges");
328    if ((usedPrivilegesStr == null) || usedPrivilegesStr.isEmpty())
329    {
330      usedPrivileges = Collections.emptyList();
331    }
332    else
333    {
334      final LinkedList<String> privileges = new LinkedList<>();
335      final StringTokenizer tokenizer =
336           new StringTokenizer(usedPrivilegesStr, ",");
337      while (tokenizer.hasMoreTokens())
338      {
339        privileges.add(tokenizer.nextToken());
340      }
341      usedPrivileges = Collections.unmodifiableList(privileges);
342    }
343
344    final String preAuthZUsedPrivilegesStr =
345         getNamedValue("preAuthZUsedPrivileges");
346    if ((preAuthZUsedPrivilegesStr == null) ||
347         preAuthZUsedPrivilegesStr.isEmpty())
348    {
349      preAuthZUsedPrivileges = Collections.emptyList();
350    }
351    else
352    {
353      final LinkedList<String> privileges = new LinkedList<>();
354      final StringTokenizer tokenizer =
355           new StringTokenizer(preAuthZUsedPrivilegesStr, ",");
356      while (tokenizer.hasMoreTokens())
357      {
358        privileges.add(tokenizer.nextToken());
359      }
360      preAuthZUsedPrivileges = Collections.unmodifiableList(privileges);
361    }
362
363    final String missingPrivilegesStr = getNamedValue("missingPrivileges");
364    if ((missingPrivilegesStr == null) || missingPrivilegesStr.isEmpty())
365    {
366      missingPrivileges = Collections.emptyList();
367    }
368    else
369    {
370      final LinkedList<String> privileges = new LinkedList<>();
371      final StringTokenizer tokenizer =
372           new StringTokenizer(missingPrivilegesStr, ",");
373      while (tokenizer.hasMoreTokens())
374      {
375        privileges.add(tokenizer.nextToken());
376      }
377      missingPrivileges = Collections.unmodifiableList(privileges);
378    }
379
380    final String indexesNearLimitStr =
381         getNamedValue("indexesWithKeysAccessedNearEntryLimit");
382    if ((indexesNearLimitStr == null) || indexesNearLimitStr.isEmpty())
383    {
384      indexesWithKeysAccessedNearEntryLimit = Collections.emptyList();
385    }
386    else
387    {
388      final LinkedList<String> indexes = new LinkedList<>();
389      final StringTokenizer tokenizer =
390           new StringTokenizer(indexesNearLimitStr, ",");
391      while (tokenizer.hasMoreTokens())
392      {
393        indexes.add(tokenizer.nextToken());
394      }
395      indexesWithKeysAccessedNearEntryLimit =
396           Collections.unmodifiableList(indexes);
397    }
398
399    final String indexesOverLimitStr =
400         getNamedValue("indexesWithKeysAccessedExceedingEntryLimit");
401    if ((indexesOverLimitStr == null) || indexesOverLimitStr.isEmpty())
402    {
403      indexesWithKeysAccessedOverEntryLimit = Collections.emptyList();
404    }
405    else
406    {
407      final LinkedList<String> indexes = new LinkedList<>();
408      final StringTokenizer tokenizer =
409           new StringTokenizer(indexesOverLimitStr, ",");
410      while (tokenizer.hasMoreTokens())
411      {
412        indexes.add(tokenizer.nextToken());
413      }
414      indexesWithKeysAccessedOverEntryLimit =
415           Collections.unmodifiableList(indexes);
416    }
417  }
418
419
420
421  /**
422   * Retrieves the result code for the operation.
423   *
424   * @return  The result code for the operation, or {@code null} if it is not
425   *          included in the log message.
426   */
427  @Override()
428  @Nullable()
429  public ResultCode getResultCode()
430  {
431    return resultCode;
432  }
433
434
435
436  /**
437   * Retrieves the diagnostic message for the operation.
438   *
439   * @return  The diagnostic message for the operation, or {@code null} if it is
440   *          not included in the log message.
441   */
442  @Override()
443  @Nullable()
444  public String getDiagnosticMessage()
445  {
446    return diagnosticMessage;
447  }
448
449
450
451  /**
452   * Retrieves a message with additional information about the result of the
453   * operation.
454   *
455   * @return  A message with additional information about the result of the
456   *          operation, or {@code null} if it is not included in the log
457   *          message.
458   */
459  @Override()
460  @Nullable()
461  public String getAdditionalInformation()
462  {
463    return additionalInformation;
464  }
465
466
467
468  /**
469   * Retrieves the matched DN for the operation.
470   *
471   * @return  The matched DN for the operation, or {@code null} if it is not
472   *          included in the log message.
473   */
474  @Override()
475  @Nullable()
476  public String getMatchedDN()
477  {
478    return matchedDN;
479  }
480
481
482
483  /**
484   * Retrieves the list of referral URLs for the operation.
485   *
486   * @return  The list of referral URLs for the operation, or an empty list if
487   *          it is not included in the log message.
488   */
489  @Override()
490  @NotNull()
491  public List<String> getReferralURLs()
492  {
493    return referralURLs;
494  }
495
496
497
498  /**
499   * Retrieves the number of intermediate response messages returned in the
500   * course of processing the operation.
501   *
502   * @return  The number of intermediate response messages returned to the
503   *          client in the course of processing the operation, or {@code null}
504   *          if it is not included in the log message.
505   */
506  @Override()
507  @Nullable()
508  public Long getIntermediateResponsesReturned()
509  {
510    return intermediateResponsesReturned;
511  }
512
513
514
515  /**
516   * Retrieves the length of time in milliseconds required to process the
517   * operation.
518   *
519   * @return  The length of time in milliseconds required to process the
520   *          operation, or {@code null} if it is not included in the log
521   *          message.
522   */
523  @Override()
524  @Nullable()
525  public Double getProcessingTimeMillis()
526  {
527    return processingTime;
528  }
529
530
531
532  /**
533   * Retrieves the length of time in milliseconds the operation was required to
534   * wait on the work queue.
535   *
536   * @return  The length of time in milliseconds the operation was required to
537   *          wait on the work queue, or {@code null} if it is not included in
538   *          the log message.
539   */
540  @Override()
541  @Nullable()
542  public Double getQueueTimeMillis()
543  {
544    return queueTime;
545  }
546
547
548
549  /**
550   * Retrieves the OIDs of any response controls contained in the log message.
551   *
552   * @return  The OIDs of any response controls contained in the log message, or
553   *          an empty list if it is not included in the log message.
554   */
555  @Override()
556  @NotNull()
557  public List<String> getResponseControlOIDs()
558  {
559    return responseControlOIDs;
560  }
561
562
563
564  /**
565   * Retrieves a list of the additional servers that were accessed in the course
566   * of processing the operation.  For example, if the access log message is
567   * from a Directory Proxy Server instance, then this may contain a list of the
568   * backend servers used to process the operation.
569   *
570   * @return  A list of the additional servers that were accessed in the course
571   *          of processing the operation, or an empty list if it is not
572   *          included in the log message.
573   */
574  @Override()
575  @NotNull()
576  public List<String> getServersAccessed()
577  {
578    return serversAccessed;
579  }
580
581
582
583  /**
584   * Indicates whether the server accessed any uncached data in the course of
585   * processing the operation.
586   *
587   * @return  {@code true} if the server was known to access uncached data in
588   *          the course of processing the operation, {@code false} if the
589   *          server was known not to access uncached data, or {@code null} if
590   *          it is not included in the log message (and the server likely did
591   *          not access uncached data).
592   */
593  @Nullable()
594  public Boolean getUncachedDataAccessed()
595  {
596    return uncachedDataAccessed;
597  }
598
599
600
601  /**
602   * Retrieves the content of the intermediate client result for the
603   * operation.
604   *
605   * @return  The content of the intermediate client result for the operation,
606   *          or {@code null} if it is not included in the log message.
607   */
608  @Override()
609  @Nullable()
610  public String getIntermediateClientResult()
611  {
612    return intermediateClientResult;
613  }
614
615
616
617  /**
618   * Retrieves the alternate authorization DN for the operation.
619   *
620   * @return  The alternate authorization DN for the operation, or {@code null}
621   *          if it is not included in the log message.
622   */
623  @Nullable()
624  public String getAlternateAuthorizationDN()
625  {
626    return authzDN;
627  }
628
629
630
631  /**
632   * Retrieves the replication change ID for the operation, if available.
633   *
634   * @return  The replication change ID for the operation, or {@code null} if it
635   *          is not included in the log message.
636   */
637  @Nullable()
638  public String getReplicationChangeID()
639  {
640    return replicationChangeID;
641  }
642
643
644
645  /**
646   * Retrieves the DN of the soft-deleted entry that was created as a result of
647   * this operation, if it was a soft delete rather than a normal hard delete.
648   *
649   * @return  The DN of the soft-deleted entry that was created as a result of
650   *          this operation, or {@code null} if it is not included in the log
651   *          message (e.g., because the operation was a hard delete rather than
652   *          a soft delete).
653   */
654  @Nullable()
655  public String getSoftDeletedEntryDN()
656  {
657    return softDeletedEntryDN;
658  }
659
660
661
662  /**
663   * Indicates whether the delete operation targeted a soft-deleted entry.
664   *
665   * @return  {@code true} if the delete operation was known to target a
666   *          soft-deleted entry, {@code false} if it was known to target a
667   *          non-soft-deleted entry, or {@code null} if it is not included in
668   *          the log message (and likely did not target a soft-deleted entry).
669   */
670  @Nullable()
671  public Boolean getChangeToSoftDeletedEntry()
672  {
673    return changeToSoftDeletedEntry;
674  }
675
676
677
678  /**
679   * Retrieves the address of the backend server to which the request has been
680   * forwarded.
681   *
682   * @return  The address of the backend server to which the request has been
683   *          forwarded, or {@code null} if it is not included in the log
684   *          message.
685   */
686  @Nullable()
687  public String getTargetHost()
688  {
689    return targetHost;
690  }
691
692
693
694  /**
695   * Retrieves the port of the backend server to which the request has been
696   * forwarded.
697   *
698   * @return  The port of the backend server to which the request has been
699   *          forwarded, or {@code null} if it is not included in the log
700   *          message.
701   */
702  @Nullable()
703  public Integer getTargetPort()
704  {
705    return targetPort;
706  }
707
708
709
710  /**
711   * Retrieves the protocol used to forward the request to the backend server.
712   *
713   * @return  The protocol used to forward the request to the backend server, or
714   *          {@code null} if it is not included in the log message.
715   */
716  @Nullable()
717  public String getTargetProtocol()
718  {
719    return targetProtocol;
720  }
721
722
723
724  /**
725   * Retrieves the local level that will be used for assured replication
726   * processing, if available.
727   *
728   * @return  The local level that will be used for assured replication
729   *          processing, or {@code null} if this is not included in the log
730   *          message (e.g., because assured replication will not be performed
731   *          for the operation).
732   */
733  @Nullable()
734  public AssuredReplicationLocalLevel getAssuredReplicationLocalLevel()
735  {
736    return assuredReplicationLocalLevel;
737  }
738
739
740
741  /**
742   * Retrieves the remote level that will be used for assured replication
743   * processing, if available.
744   *
745   * @return  The remote level that will be used for assured replication
746   *          processing, or {@code null} if this is not included in the log
747   *          message (e.g., because assured replication will not be performed
748   *          for the operation).
749   */
750  @Nullable()
751  public AssuredReplicationRemoteLevel getAssuredReplicationRemoteLevel()
752  {
753    return assuredReplicationRemoteLevel;
754  }
755
756
757
758  /**
759   * Retrieves the maximum length of time in milliseconds that the server will
760   * delay the response to the client while waiting for the replication
761   * assurance requirement to be satisfied.
762   *
763   * @return  The maximum length of time in milliseconds that the server will
764   *          delay the response to the client while waiting for the replication
765   *          assurance requirement to be satisfied, or {@code null} if this is
766   *          not included in the log message (e.g., because assured replication
767   *          will not be performed for the operation).
768   */
769  @Nullable()
770  public Long getAssuredReplicationTimeoutMillis()
771  {
772    return assuredReplicationTimeoutMillis;
773  }
774
775
776
777  /**
778   * Indicates whether the operation response to the client will be delayed
779   * until replication assurance has been satisfied or the timeout has occurred.
780   *
781   * @return  {@code true} if the operation response to the client will be
782   *          delayed until replication assurance has been satisfied,
783   *          {@code false} if the response will not be delayed by assurance
784   *          processing, or {@code null} if this was not included in the
785   *          log message (e.g., because assured replication will not be
786   *          performed for the operation)
787   */
788  @Nullable()
789  public Boolean getResponseDelayedByAssurance()
790  {
791    return responseDelayedByAssurance;
792  }
793
794
795
796  /**
797   * Retrieves the names of any privileges used during the course of processing
798   * the operation.
799   *
800   * @return  The names of any privileges used during the course of processing
801   *          the operation, or an empty list if no privileges were used or this
802   *          is not included in the log message.
803   */
804  @NotNull()
805  public List<String> getUsedPrivileges()
806  {
807    return usedPrivileges;
808  }
809
810
811
812  /**
813   * Retrieves the names of any privileges used during the course of processing
814   * the operation before an alternate authorization identity was assigned.
815   *
816   * @return  The names of any privileges used during the course of processing
817   *          the operation before an alternate authorization identity was
818   *          assigned, or an empty list if no privileges were used or this is
819   *          not included in the log message.
820   */
821  @NotNull()
822  public List<String> getPreAuthorizationUsedPrivileges()
823  {
824    return preAuthZUsedPrivileges;
825  }
826
827
828
829  /**
830   * Retrieves the names of any privileges that would have been required for
831   * processing the operation but that the requester did not have.
832   *
833   * @return  The names of any privileges that would have been required for
834   *          processing the operation but that the requester did not have, or
835   *          an empty list if there were no missing privileges or this is not
836   *          included in the log message.
837   */
838  @NotNull()
839  public List<String> getMissingPrivileges()
840  {
841    return missingPrivileges;
842  }
843
844
845
846  /**
847   * Retrieves the names of any indexes for which one or more keys near
848   * (typically, within 80% of) the index entry limit were accessed while
849   * processing the operation.
850   *
851   * @return  The names of any indexes for which one or more keys near the index
852   *          entry limit were accessed while processing the operation, or an
853   *          empty list if no such index keys were accessed, or if this is not
854   *          included in the log message.
855   */
856  @NotNull()
857  public List<String> getIndexesWithKeysAccessedNearEntryLimit()
858  {
859    return indexesWithKeysAccessedNearEntryLimit;
860  }
861
862
863
864  /**
865   * Retrieves the names of any indexes for which one or more keys over the
866   * index entry limit were accessed while processing the operation.
867   *
868   * @return  The names of any indexes for which one or more keys over the index
869   *          entry limit were accessed while processing the operation, or an
870   *          empty list if no such index keys were accessed, or if this is not
871   *          included in the log message.
872   */
873  @NotNull()
874  public List<String> getIndexesWithKeysAccessedOverEntryLimit()
875  {
876    return indexesWithKeysAccessedOverEntryLimit;
877  }
878
879
880
881  /**
882   * {@inheritDoc}
883   */
884  @Override()
885  @NotNull()
886  public AccessLogMessageType getMessageType()
887  {
888    return AccessLogMessageType.RESULT;
889  }
890}