/*
* Copyright 2012 Splunk, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"): you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package com.splunk;
import java.util.Map;
/**
* The {@code JobCollection} class represents a collection of jobs. A job
* is an individual instance of a running or completed search or report, along
* with its related output.
*/
public class JobCollection extends EntityCollection<Job> {
static String oneShotNotAllowed = String.format(
"Oneshot not allowed, use service oneshot search method");
static final String REST_PATH = "search/jobs";
/**
* Class constructor.
*
* @param service The connected {@code Service} instance.
*/
JobCollection(Service service) {
super(service, REST_PATH, Job.class);
this.refreshArgs.put("count", "0");
}
/**
* Class constructor.
*
* @param service The connected {@code Service} instance.
* @param args Collection arguments that specify the number of entities to
* return and how to sort them (see {@link CollectionArgs}).
*/
JobCollection(Service service, Args args) {
super(service, REST_PATH, Job.class, args);
this.refreshArgs.put("count", "0");
}
/**
* Creates a search with a UTF8 pre-encoded search request.
* <p>
* <b>Note:</b> You can't create a "oneshot" search using this method.
* Instead, use the {@link Service#oneshotSearch} method.
*
* @param query The search query.
* @return The unique search identifier (SID).
*/
public Job create(String query) {
return create(query, (Map)null);
}
/**
* Creates a search.
* <p>
* <b>Note:</b> You can't create a "oneshot" search using this method.
* Instead, use the {@link Service#oneshotSearch} method.
*
* @param query The search query.
* @param args Additional arguments for this job (see {@link JobArgs}).
* @return The unique search identifier (SID).
*/
public Job create(String query, Map args) {
if (args != null && args.containsKey("exec_mode")) {
if (args.get("exec_mode").equals("oneshot"))
throw new RuntimeException(oneShotNotAllowed);
}
args = Args.create(args).add("search", query);
ResponseMessage response = service.post(path, args);
assert(response.getStatus() == 201);
String sid = Xml.parse(response.getContent())
.getElementsByTagName("sid")
.item(0)
.getTextContent();
Job job = new Job(service, REST_PATH + "/" + sid);
job.refresh();
return job;
}
/**
* Creates a search.
* <p>
* <b>Note:</b> You can't create a "oneshot" search using this method.
* Instead, use the {@link Service#oneshotSearch} method.
*
* @param query The search query.
* @param args Additional arguments for this job (see {@link JobArgs}).
* @return The unique search identifier (SID) for the job.
*/
// NOTE: This overload exists primarily to provide better documentation
// for the "args" parameter.
public Job create(String query, JobArgs args) {
return this.create(query, (Map<String, Object>) args);
}
/**
* Returns the job's response.
*
* @return The job's response.
*/
@Override public ResponseMessage list() {
return service.get(path, this.refreshArgs);
}
/**
* Returns the job's unique search identifier (SID), which is used as this
* item's key.
*
* @param entry The {@code AtomEntry} response.
* @return This job's SID.
*/
@Override protected String itemKey(AtomEntry entry) {
return (String)entry.content.get("sid");
}
}