Package org.apache.sling.testing.clients.indexing

# Class IndexingClient

java.lang.Object
org.apache.sling.testing.clients.AbstractSlingClient
org.apache.sling.testing.clients.SlingClient
org.apache.sling.testing.clients.indexing.IndexingClient

All Implemented Interfaces:
  `Closeable`, `AutoCloseable`, `org.apache.http.client.HttpClient`

public class IndexingClient extends SlingClient

Interface to the oak indexing mechanism

Exposes `waitForAsyncIndexing(long, long)` for waiting all the indexing lanes to finish indexing and to guarantee all the indices are up to date

For using `waitForAsyncIndexing(long, long)`, the user must have access rights to:

- read/write in `/tmp`
- install bundles via `OsgiConsoleClient` (if the query servlet was not previously installed)

In short, it requires administrative rights.

## Nested Class Summary

## Nested classes/interfaces inherited from class org.apache.sling.testing.clients.SlingClient

`SlingClient.Builder, SlingClient.InternalBuilder<T extends SlingClient>`

## Field Summary

Fields
Modifier and Type
Field
Description
`static final String`
`ASYNC_INDEXER_CONFIG`

### Fields inherited from class org.apache.sling.testing.clients.SlingClient

`CLIENT_CONNECTION_TIMEOUT_PROP, DEFAULT_NODE_TYPE, SUDO_COOKIE_NAME`

## Constructor Summary

Constructors
Constructor
Description
`IndexingClient(URI url, String user, String password)`
Handy constructor easy to use in simple tests.
`IndexingClient(org.apache.http.impl.client.CloseableHttpClient http, SlingClientConfig config)`
Constructor used by Builders and adaptTo().

## Method Summary

Modifier and Type
Method
Description
`List<String>`
`getLaneNames()`
Return the list of indexing lanes configured by `setLaneNames(java.lang.String...)`, if any.
`void`
`install()`
Creates the necessary custom indices in the repository, if not already present.
`void`
`setLaneNames(String... laneNames)`
Set provided `laneNames` to config map.
`void`
`uninstall()`
Deprecated.
Use #uninstallWithRetry
`void`
`uninstallWithRetry()`
Retries cleaning all the data generated by `install()` and `waitForAsyncIndexing(long, long)`.
`void`
`waitForAsyncIndexing()`
Same as `waitForAsyncIndexing(long timeout, long delay)`, but with default values for `timeout=1min` and `delay=500ms`.
`void`
`waitForAsyncIndexing(long timeout, long delay)`
Blocks until all the async indices are up to date, to guarantee that the susequent queries return all the results.

### Methods inherited from class org.apache.sling.testing.clients.SlingClient

`createFolder, createNode, createNodeRecursive, deletePath, doGetJson, endImpersonation, exists, getJsonNode, getJsonNode, getNodeNameFromPath, getParentPath, getUser, getUUId, getUUID, impersonate, importContent, importContent, importJson, move, setPropertiesString, setPropertyString, setPropertyStringArray, upload, waitExists, waitUntilExists`

### Methods inherited from class org.apache.sling.testing.clients.AbstractSlingClient

`adaptTo, addValue, close, doDelete, doGet, doGet, doGet, doHead, doPatch, doPost, doPost, doPut, doRawRequest, doRequest, doStreamGet, doStreamPost, doStreamRequest, execute, execute, execute, execute, execute, execute, execute, execute, getClientId, getConnectionManager, getCookieStore, getCredentialsProvider, getParams, getPassword, getPath, getPath, getUrl, getUrl, getUrl, getValue, getValues, hasValue`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### ASYNC_INDEXER_CONFIG

public static final String ASYNC_INDEXER_CONFIG

See Also:
  - Constant Field Values

## Constructor Details

### IndexingClient

public IndexingClient(org.apache.http.impl.client.CloseableHttpClient http, SlingClientConfig config) throws ClientException
Constructor used by Builders and adaptTo(). Should never be called directly from the code.

Parameters:
  `http` - the underlying HttpClient to be used
  `config` - sling specific configs
Throws:
  `ClientException` - if the client could not be created

### IndexingClient

public IndexingClient(URI url, String user, String password) throws ClientException

Handy constructor easy to use in simple tests. Creates a client that uses basic authentication.

For constructing clients with complex configurations, use a `SlingClient.InternalBuilder`

For constructing clients with the same configuration, but a different class, use `AbstractSlingClient.adaptTo(Class)`

Parameters:
  `url` - url of the server (including context path)
  `user` - username for basic authentication
  `password` - password for basic authentication
Throws:
  `ClientException` - never, kept for uniformity with the other constructors

## Method Details

### setLaneNames

public void setLaneNames(String... laneNames)
Set provided `laneNames` to config map. This allows for subsequent initializations using `adaptTo` that shard the same config map to not require further configuration of lane names

Parameters:
  `laneNames` - lane names to work on

### getLaneNames

public List<String> getLaneNames() throws ClientException
Return the list of indexing lanes configured by `setLaneNames(java.lang.String...)`, if any. Else, retrieves configured lanes on the instance

Returns:
  list of lane names
Throws:
  `ClientException` - in case of problems

### waitForAsyncIndexing

public void waitForAsyncIndexing(long timeout, long delay) throws TimeoutException, InterruptedException, ClientException

Blocks until all the async indices are up to date, to guarantee that the susequent queries return all the results.

Works by creating a custom index for each lane, adding specific content to be indexed by these indices and then repeatedly searching this content until everything is found (indexed). All the content is created under "/tmp/testing/waitForAsyncIndexing"

Indices are automatically created, but only if not already present. This method does not delete the indices at the end to avoid generating too much noise on the instance. To completely clean any traces, the user must call `uninstall()`

Requires administrative rights to install bundles and to create nodes under "/tmp/testing/waitForAsyncIndexing"

Parameters:
  `timeout` - max time to wait, in milliseconds, before throwing `TimeoutException`
  `delay` - time to sleep between retries
Throws:
  `TimeoutException` - if the `timeout` was reached before all the indices were updated
  `InterruptedException` - to mark this method as waiting
  `ClientException` - if an error occurs during http requests/responses

### waitForAsyncIndexing

public void waitForAsyncIndexing() throws InterruptedException, ClientException, TimeoutException
Same as `waitForAsyncIndexing(long timeout, long delay)`, but with default values for `timeout=1min` and `delay=500ms`.

Throws:
  `TimeoutException` - if the `timeout` was reached before all the indices were updated
  `InterruptedException` - to mark this method as waiting
  `ClientException` - if an error occurs during http requests/responses
See Also:
  - `waitForAsyncIndexing(long, long)`

### install

public void install() throws ClientException

Creates the necessary custom indices in the repository, if not already present.

It is automatically called in each wait, there's no need to explicitly invoke it from the test.

Throws:
  `ClientException` - if the installation fails

### uninstall

public void uninstall() throws ClientException
Deprecated.
Use #uninstallWithRetry

Cleans all the data generated by `install()` and `waitForAsyncIndexing(long, long)`.

User must manually call this if needed, as opposed to `install()`, which is called automatically.

Throws:
  `ClientException` - if the cleanup failed

### uninstallWithRetry

public void uninstallWithRetry() throws TimeoutException, InterruptedException

Retries cleaning all the data generated by `install()` and `waitForAsyncIndexing(long, long)`.

User must manually call this if needed, as opposed to `install()`, which is called automatically.

Throws:
  `TimeoutException` - if retry operation times out and the path still exists
  `InterruptedException` - if the retry operation was interrupted by the user