Class SlingClient
- java.lang.Object
-
- org.apache.sling.testing.clients.AbstractSlingClient
-
- org.apache.sling.testing.clients.SlingClient
-
- All Implemented Interfaces:
Closeable
,AutoCloseable
,org.apache.http.client.HttpClient
- Direct Known Subclasses:
IndexingClient
,MicrodataClient
,OsgiConsoleClient
,QueryClient
,SlingEmailClient
@Immutable public class SlingClient extends AbstractSlingClient
The Base class for all Integration Test Clients. It provides generic methods to send HTTP requests to a server.
It has methods to perform simple node operations on the server like creating and deleting nodes, etc. on the server using requests.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
SlingClient.Builder
static class
SlingClient.InternalBuilder<T extends SlingClient>
Extensible InternalBuilder for SlingClient.
-
Field Summary
Fields Modifier and Type Field Description static String
CLIENT_CONNECTION_TIMEOUT_PROP
static String
DEFAULT_NODE_TYPE
static String
SUDO_COOKIE_NAME
-
Constructor Summary
Constructors Constructor Description SlingClient(URI url, String user, String password)
Handy constructor easy to use in simple tests.SlingClient(org.apache.http.impl.client.CloseableHttpClient http, SlingClientConfig config)
Constructor used by Builders and adaptTo().
-
Method Summary
All Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description SlingHttpResponse
createFolder(String folderName, String folderTitle, String parentPath, int... expectedStatus)
Creates a new Folder of type sling:OrderedFolder.SlingHttpResponse
createNode(String path, String nodeType)
Creates the node specified by a given path with the given node type.
If the given node type isnull
, the node will be created with the default type: "sling:OrderedFolder".
If the node already exists, the method will return null, with no errors.
The method ignores trailing slashes so a path like this /a/b/c/// is accepted and will create the c node if the rest of the path exists.SlingHttpResponse
createNodeRecursive(String path, String nodeType)
Recursively creates all the none existing nodes in the given path using thecreateNode(String, String)
method.SlingHttpResponse
deletePath(String path, int... expectedStatus)
Deletes a sling path (:operation delete)com.fasterxml.jackson.databind.JsonNode
doGetJson(String path, int depth, int... expectedStatus)
Returns theJsonNode
object corresponding to a content node.SlingClient
endImpersonation()
End the impersonation of the current user.boolean
exists(String path)
Checks whether a path exists or not by making a GET request to that path with thejson
extensioncom.fasterxml.jackson.databind.JsonNode
getJsonNode(String path, int depth)
Deprecated.usewaitExists(String, long, long)
anddoGetJson(String, int, int...)
insteadcom.fasterxml.jackson.databind.JsonNode
getJsonNode(String path, int depth, long waitMillis, int retryNumber, int... expectedStatus)
Deprecated.usewaitExists(String, long, long)
anddoGetJson(String, int, int...)
insteadprotected String
getNodeNameFromPath(String path)
Extracts the node from pathprotected String
getParentPath(String path)
Extracts the parent path from the given StringString
getUser()
Returns the name of the user that will be used to authenticate the requests (by basic auth, if not replaced).String
getUUId(com.fasterxml.jackson.databind.JsonNode jsonNode)
Get the UUID from a node that was already parsed in aJsonNode
String
getUUID(String path)
Get the UUID of a repository pathSlingClient
impersonate(String userId)
Impersonate user with the givenuserId
SlingHttpResponse
importContent(String parentPath, String contentType, File contentFile, int... expectedStatus)
Create a tree structure underparentPath
by providing acontentFile
in one of the supported formats: xml, jcr.xml, json, jar, zip.SlingHttpResponse
importContent(String parentPath, String contentType, String content, int... expectedStatus)
Create a tree structure underparentPath
by providing acontent
in one of the supported formats: xml, jcr.xml, json, jar, zip.SlingHttpResponse
importJson(String parentPath, com.fasterxml.jackson.databind.JsonNode json, int... expectedStatus)
Wrapper method overimportContent(String, String, String, int...)
for directly importing a json nodeSlingHttpResponse
move(String srcPath, String destPath, int... expectedStatus)
Moves a sling path to a new location (:operation move)SlingHttpResponse
setPropertiesString(String nodePath, List<org.apache.http.NameValuePair> properties, int... expectedStatus)
Sets multiple String properties on a node in a single requestSlingHttpResponse
setPropertyString(String nodePath, String propName, String propValue, int... expectedStatus)
Sets String component property on a node.SlingHttpResponse
setPropertyStringArray(String nodePath, String propName, List<String> propValueList, int... expectedStatus)
Sets a String[] component property on a node.SlingHttpResponse
upload(File file, String mimeType, String toPath, boolean createFolders, int... expectedStatus)
Uploads a file to the repository.void
waitExists(String path, long timeout, long delay)
Waits until a path exists by making successive GET requests to that path with thejson extension
void
waitUntilExists(String path, long waitMillis, int retryCount)
Deprecated.usewaitExists(String, long, long)
instead.-
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
-
-
-
-
Field Detail
-
DEFAULT_NODE_TYPE
public static final String DEFAULT_NODE_TYPE
- See Also:
- Constant Field Values
-
CLIENT_CONNECTION_TIMEOUT_PROP
public static final String CLIENT_CONNECTION_TIMEOUT_PROP
- See Also:
- Constant Field Values
-
SUDO_COOKIE_NAME
public static final String SUDO_COOKIE_NAME
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
SlingClient
public SlingClient(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 usedconfig
- sling specific configs- Throws:
ClientException
- if the client could not be created- See Also:
AbstractSlingClient(CloseableHttpClient, SlingClientConfig)
-
SlingClient
public SlingClient(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 authenticationpassword
- password for basic authentication- Throws:
ClientException
- never, kept for uniformity with the other constructors
-
-
Method Detail
-
move
public SlingHttpResponse move(String srcPath, String destPath, int... expectedStatus) throws ClientException
Moves a sling path to a new location (:operation move)- Parameters:
srcPath
- source pathdestPath
- destination pathexpectedStatus
- list of accepted status codes in response- Returns:
- the response
- Throws:
ClientException
- if an error occurs during operation
-
deletePath
public SlingHttpResponse deletePath(String path, int... expectedStatus) throws ClientException
Deletes a sling path (:operation delete)- Parameters:
path
- path to be deletedexpectedStatus
- list of accepted status codes in response- Returns:
- the response
- Throws:
ClientException
- if an error occurs during operation
-
createNodeRecursive
public SlingHttpResponse createNodeRecursive(String path, String nodeType) throws ClientException
Recursively creates all the none existing nodes in the given path using thecreateNode(String, String)
method. All the created nodes will have the given node type.- Parameters:
path
- the path to use for creating all the none existing nodesnodeType
- the node type to use for the created nodes- Returns:
- the response to the creation of the leaf node
- Throws:
ClientException
- if one of the nodes can't be created
-
createNode
public SlingHttpResponse createNode(String path, String nodeType) throws ClientException
Creates the node specified by a given path with the given node type.
If the given node type isnull
, the node will be created with the default type: "sling:OrderedFolder".
If the node already exists, the method will return null, with no errors.
The method ignores trailing slashes so a path like this /a/b/c/// is accepted and will create the c node if the rest of the path exists.- Parameters:
path
- the path to the node to createnodeType
- the type of the node to create- Returns:
- the sling HTTP response or null if the path already existed
- Throws:
ClientException
- if the node can't be created
-
endImpersonation
public SlingClient endImpersonation()
End the impersonation of the current user.
-
exists
public boolean exists(String path) throws ClientException
Checks whether a path exists or not by making a GET request to that path with the
json
extension- Parameters:
path
- path to be checked- Returns:
- true if GET response returns 200
- Throws:
ClientException
- if the request could not be performed
-
getParentPath
protected String getParentPath(String path)
Extracts the parent path from the given String- Parameters:
path
- string containing the path- Returns:
- the parent path if exists or empty string otherwise
-
getNodeNameFromPath
protected String getNodeNameFromPath(String path)
Extracts the node from path- Parameters:
path
- string containing the path- Returns:
- the node without parent path
-
waitUntilExists
@Deprecated public void waitUntilExists(String path, long waitMillis, int retryCount) throws ClientException, InterruptedException
Deprecated.usewaitExists(String, long, long)
instead.Checks whether a path exists or not by making a GET request to that path with the
json extension
It polls the server and waits until the path exists
- Parameters:
path
- path to be checkedwaitMillis
- time to wait between retriesretryCount
- number of retries before throwing an exception- Throws:
ClientException
- if the path was not foundInterruptedException
- to mark this operation as "waiting"
-
waitExists
public void waitExists(String path, long timeout, long delay) throws TimeoutException, InterruptedException
Waits until a path exists by making successive GET requests to that path with the
json extension
Polls the server until the path exists or until timeout is reached
- Parameters:
path
- path to be checkedtimeout
- max total time to wait, in millisecondsdelay
- time to wait between checks, in milliseconds- Throws:
TimeoutException
- if the path was not found before timeoutInterruptedException
- to mark this operation as "waiting", should be rethrown by callers- Since:
- 1.1.0
-
setPropertyString
public SlingHttpResponse setPropertyString(String nodePath, String propName, String propValue, int... expectedStatus) throws ClientException
Sets String component property on a node.- Parameters:
nodePath
- path to the node to be editedpropName
- name of the property to be editedpropValue
- value of the property to be editedexpectedStatus
- list of expected HTTP Status to be returned, if not set, 200 is assumed.- Returns:
- the response object
- Throws:
ClientException
- if something fails during the request/response cycle
-
setPropertyStringArray
public SlingHttpResponse setPropertyStringArray(String nodePath, String propName, List<String> propValueList, int... expectedStatus) throws ClientException
Sets a String[] component property on a node.- Parameters:
nodePath
- path to the node to be editedpropName
- name of the property to be editedpropValueList
- List of String valuesexpectedStatus
- list of expected HTTP Status to be returned, if not set, 200 is assumed.- Returns:
- the response
- Throws:
ClientException
- if something fails during the request/response cycle
-
setPropertiesString
public SlingHttpResponse setPropertiesString(String nodePath, List<org.apache.http.NameValuePair> properties, int... expectedStatus) throws ClientException
Sets multiple String properties on a node in a single request- Parameters:
nodePath
- path to the node to be editedproperties
- list of NameValue pairs with the name and value for each property. String[] properties can be defined by adding multiple time the same property name with different valuesexpectedStatus
- list of expected HTTP Status to be returned, if not set, 200 is assumed.- Returns:
- the response
- Throws:
ClientException
- if the operation could not be completed
-
getJsonNode
@Deprecated public com.fasterxml.jackson.databind.JsonNode getJsonNode(String path, int depth) throws ClientException, InterruptedException
Deprecated.usewaitExists(String, long, long)
anddoGetJson(String, int, int...)
insteadReturns the JSON content of a node already mapped to aJsonNode
.
Waits max 10 seconds for the node to be created.- Parameters:
path
- the path to the content nodedepth
- the number of levels to go down the tree, -1 for infinity- Returns:
- a
JsonNode
mapping to the requested content node. - Throws:
ClientException
- if something fails during request/response processingInterruptedException
- to mark this operation as "waiting"
-
getJsonNode
@Deprecated public com.fasterxml.jackson.databind.JsonNode getJsonNode(String path, int depth, long waitMillis, int retryNumber, int... expectedStatus) throws ClientException, InterruptedException
Deprecated.usewaitExists(String, long, long)
anddoGetJson(String, int, int...)
insteadReturns JSON format of a content node already mapped to aJsonNode
.- Parameters:
path
- the path to the content nodedepth
- the number of levels to go down the tree, -1 for infinitywaitMillis
- how long it should wait between requestsretryNumber
- number of retries before throwing an exceptionexpectedStatus
- list of allowed HTTP Status to be returned. If not set, http status 200 (OK) is assumed.- Returns:
- a
JsonNode
mapping to the requested content node. - Throws:
ClientException
- if something fails during request/response cycleInterruptedException
- to mark this operation as "waiting"
-
doGetJson
public com.fasterxml.jackson.databind.JsonNode doGetJson(String path, int depth, int... expectedStatus) throws ClientException
Returns theJsonNode
object corresponding to a content node.- Parameters:
path
- the path to the content nodedepth
- the number of levels to go down the tree, -1 for infinityexpectedStatus
- list of allowed HTTP Status to be returned. If not set, 200 (OK) is assumed.- Returns:
- a
JsonNode
mapping to the requested content node. - Throws:
ClientException
- if the path does not exist or something fails during request/response cycle- Since:
- 1.1.0
-
upload
public SlingHttpResponse upload(File file, String mimeType, String toPath, boolean createFolders, int... expectedStatus) throws ClientException
Uploads a file to the repository. It creates a leaf node typednt:file
. The intermediary nodes are created with type "sling:OrderedFolder" if parametercreateFolders
is true- Parameters:
file
- the file to be uploadedmimeType
- the MIME Type of the filetoPath
- the complete path of the file in the repository including file namecreateFolders
- if true, all non existing parent nodes will be created using node typesling:OrderedFolder
expectedStatus
- list of expected HTTP Status to be returned, if not set, 201 is assumed.- Returns:
- the response
- Throws:
ClientException
- if something fails during the request/response cycle
-
createFolder
public SlingHttpResponse createFolder(String folderName, String folderTitle, String parentPath, int... expectedStatus) throws ClientException
Creates a new Folder of type sling:OrderedFolder. Same as usingNew Folder...
in the Site Admin.- Parameters:
folderName
- The name of the folder to be used in the URL.folderTitle
- Title of the Folder to be set in jcr:titleparentPath
- The parent path where the folder gets added.expectedStatus
- list of expected HTTP Status to be returned, if not set, 201 is assumed.- Returns:
- the response
- Throws:
ClientException
- if something fails during the request/response cycle
-
importContent
public SlingHttpResponse importContent(String parentPath, String contentType, String content, int... expectedStatus) throws ClientException
Create a tree structure under
parentPath
by providing acontent
in one of the supported formats: xml, jcr.xml, json, jar, zip.This is the implementation of
:operation import
, as documented in importing-content-structures- Parameters:
parentPath
- path where the tree is createdcontentType
- format of the contentcontent
- string expressing the structure to be created, in the specified formatexpectedStatus
- list of expected HTTP Status to be returned, if not set, 201 is assumed- Returns:
- the response
- Throws:
ClientException
- if something fails during the request/response cycle
-
importContent
public SlingHttpResponse importContent(String parentPath, String contentType, File contentFile, int... expectedStatus) throws ClientException
Create a tree structure under
parentPath
by providing acontentFile
in one of the supported formats: xml, jcr.xml, json, jar, zip.This is the implementation of
:operation import
, as documented in importing-content-structures- Parameters:
parentPath
- path where the tree is createdcontentType
- format of the contentcontentFile
- file containing the structure to be created, in the specified formatexpectedStatus
- list of expected HTTP Status to be returned, if not set, 200 is assumed- Returns:
- the response
- Throws:
ClientException
- if something fails during the request/response cycle
-
importJson
public SlingHttpResponse importJson(String parentPath, com.fasterxml.jackson.databind.JsonNode json, int... expectedStatus) throws ClientException
Wrapper method overimportContent(String, String, String, int...)
for directly importing a json node- Parameters:
parentPath
- path where the tree is createdjson
- json node with the desired structureexpectedStatus
- list of expected HTTP Status to be returned, if not set, 201 is assumed- Returns:
- the response
- Throws:
ClientException
- if something fails during the request/response cycle
-
getUUID
public String getUUID(String path) throws ClientException
Get the UUID of a repository path- Parameters:
path
- path in repository- Returns:
- uuid as String or null if path does not exist
- Throws:
ClientException
- if something fails during request/response cycle
-
getUUId
public String getUUId(com.fasterxml.jackson.databind.JsonNode jsonNode) throws ClientException
Get the UUID from a node that was already parsed in aJsonNode
- Parameters:
jsonNode
-JsonNode
object of the repository node- Returns:
- UUID as String or null if jsonNode is null or if the UUID was not found
- Throws:
ClientException
- if something fails during request/response cycle
-
getUser
public String getUser()
Description copied from class:AbstractSlingClient
Returns the name of the user that will be used to authenticate the requests (by basic auth, if not replaced).- Overrides:
getUser
in classAbstractSlingClient
- Returns:
- user's name
-
impersonate
public SlingClient impersonate(String userId)
Impersonate user with the givenuserId
By impersonating a user SlingClient can access content from the perspective of that user.
Passing anull
will clear impersonation.- Parameters:
userId
- the user to impersonate. Anull
value clears impersonation
-
-