001/*
002 * Copyright 2022-2024 Ping Identity Corporation
003 * All Rights Reserved.
004 */
005/*
006 * Copyright 2022-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) 2022-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.v2.text;
037
038
039
040import java.util.Collections;
041import java.util.List;
042
043import com.unboundid.ldap.sdk.DereferencePolicy;
044import com.unboundid.ldap.sdk.SearchScope;
045import com.unboundid.ldap.sdk.unboundidds.logs.AccessLogOperationType;
046import com.unboundid.ldap.sdk.unboundidds.logs.LogException;
047import com.unboundid.ldap.sdk.unboundidds.logs.v2.SearchRequestAccessLogMessage;
048import com.unboundid.util.NotExtensible;
049import com.unboundid.util.NotMutable;
050import com.unboundid.util.NotNull;
051import com.unboundid.util.Nullable;
052import com.unboundid.util.ThreadSafety;
053import com.unboundid.util.ThreadSafetyLevel;
054
055
056
057/**
058 * This class provides a data structure that holds information about a
059 * text-formatted search request access log message.
060 * <BR>
061 * <BLOCKQUOTE>
062 *   <B>NOTE:</B>  This class, and other classes within the
063 *   {@code com.unboundid.ldap.sdk.unboundidds} package structure, are only
064 *   supported for use against Ping Identity, UnboundID, and
065 *   Nokia/Alcatel-Lucent 8661 server products.  These classes provide support
066 *   for proprietary functionality or for external specifications that are not
067 *   considered stable or mature enough to be guaranteed to work in an
068 *   interoperable way with other types of LDAP servers.
069 * </BLOCKQUOTE>
070 */
071@NotExtensible()
072@NotMutable()
073@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
074public class TextFormattedSearchRequestAccessLogMessage
075       extends TextFormattedRequestAccessLogMessage
076       implements SearchRequestAccessLogMessage
077{
078  /**
079   * The serial version UID for this serializable class.
080   */
081  private static final long serialVersionUID = 7498979077353447769L;
082
083
084
085  // The types only flag for the search request.
086  @Nullable private final Boolean typesOnly;
087
088  // The alias dereferencing policy for the search request.
089  @Nullable private final DereferencePolicy dereferencePolicy;
090
091  // The size limit for the search request.
092  @Nullable private final Integer sizeLimit;
093
094  // The time limit for the search request.
095  @Nullable private final Integer timeLimit;
096
097  // The list of requested attributes for the search request.
098  @NotNull private final List<String> requestedAttributes;
099
100  // The scope for the search request.
101  @Nullable private final SearchScope scope;
102
103  // The base DN for ths search request.
104  @Nullable private final String baseDN;
105
106  // The filter for ths search request.
107  @Nullable private final String filter;
108
109
110
111  /**
112   * Creates a new text-formatted search request access log message from the
113   * provided message string.
114   *
115   * @param  logMessageString  The string representation of this log message.
116   *                           It must not be {@code null}.
117   *
118   * @throws  LogException  If the provided string cannot be parsed as a valid
119   *                        log message.
120   */
121  public TextFormattedSearchRequestAccessLogMessage(
122              @NotNull final String logMessageString)
123         throws LogException
124  {
125    this(new TextFormattedLogMessage(logMessageString));
126  }
127
128
129
130  /**
131   * Creates a new text-formatted search request access log message from the
132   * provided message.
133   *
134   * @param  logMessage  The log message to use to create this search request
135   *                     access log message.  It must not be {@code null}.
136   */
137  TextFormattedSearchRequestAccessLogMessage(
138       @NotNull final TextFormattedLogMessage logMessage)
139  {
140    super(logMessage);
141
142    baseDN = getString(TextFormattedAccessLogFields.SEARCH_BASE_DN);
143    filter = getString(TextFormattedAccessLogFields.SEARCH_FILTER);
144    sizeLimit =
145         getIntegerNoThrow(TextFormattedAccessLogFields.SEARCH_SIZE_LIMIT);
146    timeLimit = getIntegerNoThrow(
147         TextFormattedAccessLogFields.SEARCH_TIME_LIMIT_SECONDS);
148    typesOnly = getBooleanNoThrow(
149         TextFormattedAccessLogFields.SEARCH_TYPES_ONLY);
150
151
152    final Integer scopeValue = getIntegerNoThrow(
153         TextFormattedAccessLogFields.SEARCH_SCOPE_VALUE);
154    if (scopeValue == null)
155    {
156      scope = null;
157    }
158    else
159    {
160      scope = SearchScope.valueOf(scopeValue);
161    }
162
163
164    final String derefStr =
165         getString(TextFormattedAccessLogFields.SEARCH_DEREF_POLICY);
166    if (derefStr == null)
167    {
168      dereferencePolicy = null;
169    }
170    else
171    {
172      DereferencePolicy policy = null;
173      for (final DereferencePolicy p : DereferencePolicy.values())
174      {
175        if (p.getName().equalsIgnoreCase(derefStr))
176        {
177          policy = p;
178          break;
179        }
180      }
181
182      dereferencePolicy = policy;
183    }
184
185
186    final List<String> requestedAttrsList = getCommaDelimitedStringList(
187         TextFormattedAccessLogFields.SEARCH_REQUESTED_ATTRIBUTES);
188    if ((requestedAttrsList.size() == 1) &&
189         requestedAttrsList.get(0).equals("ALL"))
190    {
191      requestedAttributes = Collections.emptyList();
192    }
193    else
194    {
195      requestedAttributes = requestedAttrsList;
196    }
197  }
198
199
200
201  /**
202   * {@inheritDoc}
203   */
204  @Override()
205  @NotNull()
206  public final AccessLogOperationType getOperationType()
207  {
208    return AccessLogOperationType.SEARCH;
209  }
210
211
212
213  /**
214   * {@inheritDoc}
215   */
216  @Override()
217  @Nullable()
218  public final String getBaseDN()
219  {
220    return baseDN;
221  }
222
223
224
225  /**
226   * {@inheritDoc}
227   */
228  @Override()
229  @Nullable()
230  public final SearchScope getScope()
231  {
232    return scope;
233  }
234
235
236
237  /**
238   * {@inheritDoc}
239   */
240  @Override()
241  @Nullable()
242  public final String getFilter()
243  {
244    return filter;
245  }
246
247
248
249  /**
250   * {@inheritDoc}
251   */
252  @Override()
253  @Nullable()
254  public final DereferencePolicy getDereferencePolicy()
255  {
256    return dereferencePolicy;
257  }
258
259
260
261  /**
262   * {@inheritDoc}
263   */
264  @Override()
265  @Nullable()
266  public final Integer getSizeLimit()
267  {
268    return sizeLimit;
269  }
270
271
272
273  /**
274   * {@inheritDoc}
275   */
276  @Override()
277  @Nullable()
278  public final Integer getTimeLimitSeconds()
279  {
280    return timeLimit;
281  }
282
283
284
285  /**
286   * {@inheritDoc}
287   */
288  @Override()
289  @Nullable()
290  public final Boolean getTypesOnly()
291  {
292    return typesOnly;
293  }
294
295
296
297  /**
298   * {@inheritDoc}
299   */
300  @Override()
301  @NotNull()
302  public final List<String> getRequestedAttributes()
303  {
304    return requestedAttributes;
305  }
306}