org.elasticsearch.testframework.rest.yaml.ObjectPath Maven / Gradle / Ivy
package org.elasticsearch.testframework.rest.yaml;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.rest.Response;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.xcontent.DeprecationHandler;
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
import org.elasticsearch.common.xcontent.XContent;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Holds an object and allows to extract specific values from it given their path
*/
public class ObjectPath {
private final Object object;
public static ObjectPath createFromResponse(Response response) throws IOException {
byte[] bytes = EntityUtils.toByteArray(response.getEntity());
String contentType = response.getHeader("Content-Type");
XContentType xContentType = XContentType.fromMediaTypeOrFormat(contentType);
return ObjectPath.createFromXContent(xContentType.xContent(), new BytesArray(bytes));
}
public static ObjectPath createFromXContent(XContent xContent, BytesReference input) throws IOException {
try (XContentParser parser = xContent
.createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, input.streamInput())) {
if (parser.nextToken() == XContentParser.Token.START_ARRAY) {
return new ObjectPath(parser.listOrderedMap());
}
return new ObjectPath(parser.mapOrdered());
}
}
public ObjectPath(Object object) {
this.object = object;
}
/**
* A utility method that creates an {@link ObjectPath} via {@link #ObjectPath(Object)} returns
* the result of calling {@link #evaluate(String)} on it.
*/
public static T evaluate(Object object, String path) throws IOException {
return new ObjectPath(object).evaluate(path, Stash.EMPTY);
}
/**
* Returns the object corresponding to the provided path if present, null otherwise
*/
public T evaluate(String path) throws IOException {
return evaluate(path, Stash.EMPTY);
}
/**
* Returns the object corresponding to the provided path if present, null otherwise
*/
@SuppressWarnings("unchecked")
public T evaluate(String path, Stash stash) throws IOException {
String[] parts = parsePath(path);
Object object = this.object;
for (String part : parts) {
object = evaluate(part, object, stash);
if (object == null) {
return null;
}
}
return (T)object;
}
@SuppressWarnings("unchecked")
private Object evaluate(String key, Object object, Stash stash) throws IOException {
if (stash.containsStashedValue(key)) {
key = stash.getValue(key).toString();
}
if (object instanceof Map) {
return ((Map) object).get(key);
}
if (object instanceof List) {
List