See: Description
Interface | Description |
---|---|
Attachments |
To add attachments to requests using the
RestClient , use an object that implements this interface. |
BulkResponse |
Interface for return type of
RestClient#getBulk(String, org.apache.http.params.HttpParams) method. |
RestClient |
Interface for SMILA HTTP Rest Client helpers.
|
Class | Description |
---|---|
ResourceHelper |
Helper class providing resources for the standard SMILA REST API to be used in the RestClient.
|
TaskManagerClientHelper |
Helper class to provide resources for the TaskManager REST API.
|
Enum | Description |
---|---|
HttpMethod |
Enumeration defining the different HTTP methods supported by
RestClient . |
Exception | Description |
---|---|
RestException |
Exception thrown by
DefaultRestClient to wrap JSON errors returned by the REST API. |
See also:
The following examples and code snippets all apply when you are running SMILA out-of-the box on localhost.
If you are running SMILA on a different host or with a different port (or an altered root context), please see non-default configuration on how to use the Rest Client in these cases.
RestClient
interface encapsulates the REST access to SMILA. It provides
methods for GET, POST, PUT and DELETE calls to the REST API and represents data using SMILA's
Any
interface and attachments using the
Attachments
interface. The latter allow working with binary data in SMILA.
The package org.eclipse.smila.http.client.impl provides a default implementation for the
RestClient
named DefaultRestClient
.
There are two helper classes providing the resources as described in REST API Reference:
ResourceHelper
for all resources beginning with /smila,
except for those that are marked as deprecated in the REST API Reference.
TaskManagerClientHelper
to provide workers that are not directly driven by
the WorkerManager with resources for task handling (internal TaskManager REST API, i.e. the resources beginning with
/taskmanager).
DefaultRestClient
,
like:
RestClient restClient = new DefaultRestClient();The following code snippet creates a job definition, sends it to the JobManager and starts it if posting was successful:
final RestClient restClient = new DefaultRestClient(); final ResourceHelper resourceHelper = new ResourceHelper(); final String jobName = "crawlCData"; // create job description as an AnyMap final AnyMap jobDescription = DataFactory.DEFAULT.createAnyMap(); jobDescription.put("name", jobName); jobDescription.put("workflow", "fileCrawling"); final AnyMap parameters = DataFactory.DEFAULT.createAnyMap(); parameters.put("tempStore", "temp"); parameters.put("jobToPushTo", "importJob"); parameters.put("dataSource", "file_data"); parameters.put("rootFolder", "c:/data"); jobDescription.put("parameters", parameters); // the resourcehelper provides us with the resource to the jobs API // we send the (AnyMap) job description in the POST body restClient.post(resourceHelper.getJobsResource(), jobDescription); // POST (here without a body) to start the Job, // the ResourceHelper provides the resource to the named job restClient.post(resourceHelper.getJobResource(jobName));The following snippet checks if the job with the given name is already running, if not, it is started, and a record with an attachment is sent to it.
final RestClient restClient = new DefaultRestClient(); final ResourceHelper resourceHelper = new ResourceHelper(); final String jobName = "indexUpdate"; // check for a current run of this job final AnyMap currentJobRun = restClient.get(resourceHelper.getJobResource(jobName)).getMap("runs").getMap("current"); if (currentJobRun != null && !currentJobRun.isEmpty()) { // a current run exists, so we don't need to start one but it may not be running. if (!"RUNNING".equalsIgnoreCase(currentJobRun.getStringValue("state"))) { // well it's just an example... throw new IllegalStateException("Job '" + jobName + "' is not running but has status '" + currentJobRun.getStringValue("state") + "'."); } } else { // no current job run, start another one. restClient.post(resourceHelper.getJobResource(jobName)); } // create attachment with a file's content final File file = new File("c:/data/notice.html"); final Attachments attachments = new AttachmentWrapper("file", file); // put some sample metadata final AnyMap metadata = DataFactory.DEFAULT.createAnyMap(); metadata.put("_recordid", "1"); metadata.put("fileName", file.getCanonicalPath()); // now post metadata with an attachment from a file. // if we had a Record with attachments, we could POST that one... // note: we could add more than one attachment using the AttachmentWrapper. restClient.post(resourceHelper.getPushRecordToJobResource(jobName), metadata, attachments);
Attachments
interface allowing
attachments to be POSTed. An attachment consists of a string key and binary data that will be POSTed as
application/octet-stream in a multi-part message.
AttachmentWrapper
in order to add attachments from
the following sources if you want to handle attachments manually:
String
File
InputStream
AttachmentWrapper
but you can add more than one attachment and mix
the types.
Example:
final RestClient restClient = new DefaultRestClient(); byte[] byteAttachment = new byte[1000]; String stringAttachment = "string attachment"; File fileAttachment = new File("c:/data/notice.html"); InputStream inputStreamAttachment = new FileInputStream(fileAttachment); AttachmentWrapper attachments = new AttachmentWrapper("byte-data", byteAttachment); attachments.add("string-data", stringAttachment); attachments.add("file-data", fileAttachment); attachments.add("stream-data", inputStreamAttachment); restClient.post(resource, parameters, attachments);
Record
s, it is natural, that the RestClient
also supports Record
s (with attachments) directly.
That means that the record's metadata will be sent with the Record
s' attachments
as parts of a multipart message.
Example:
final byte[] data1 = ...; final byte[] data2 = ...; record.setAttachment("data1", data1); record.setAttachment("data2", data2); // POST the record with the attachments restClient.post(resourceHelper.getPushRecordToJobResource(jobName), record);
E.g. you could now write a simple program that creates and starts up a crawl job and the indexUpdate-job:
public class CrawlMyData { public static void main(String[] args) { final RestClient restClient = new DefaultRestClient(); final ResourceHelper resourceHelper = new ResourceHelper(); final String jobName = "crawlCData"; // create job description as an AnyMap final AnyMap jobDescription = DataFactory.DEFAULT.createAnyMap(); jobDescription.put("name", jobName); jobDescription.put("workflow", "fileCrawling"); final AnyMap parameters = DataFactory.DEFAULT.createAnyMap(); parameters.put("tempStore", "temp"); parameters.put("jobToPushTo", "indexUpdate"); parameters.put("dataSource", "file_data"); parameters.put("rootFolder", "c:/data"); jobDescription.put("parameters", parameters); try { // start the referred job "indexUpdate" that indexes our sent data. // We should check if it is still be running, etc.. restClient.post(resourceHelper.getJobResource("indexUpdate")); } catch (RestException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { // create (or update) the job, we could check if it exists or is running, etc... restClient.post(resourceHelper.getJobsResource(), jobDescription); // POST with no body to start the Job in default mode restClient.post(resourceHelper.getJobResource(jobName)); } catch (RestException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
You should see:
RestClient
and ResourceHelper
have default constructors using the standard values for the SMILA application. These are:
If your bundle uses a different root context path, you have to create your ResourceHelper using the actual context
path. Also, if your application runs on a different server and/or using a different port, you will have to
supply this information to the constructor of the DefaultRestClient
(you can omit the leading http://).
E.g. the following code snippet:
final RestClient restClient = new DefaultRestClient("host.domain.org:80"); final ResourceHelper resourceHelper = new ResourceHelper("/context");creates a client and a resource helper connection to a SMILA instance running on http://host.domain.org:80/context.
You can also use your own connection manager or limit the number of total connections and max connections per host by
using the respective constructors of DefaultRestClient
.