package com.github.dreamhead.moco.extractor; import com.github.dreamhead.moco.HttpRequest; import com.github.dreamhead.moco.HttpRequestExtractor; import com.github.dreamhead.moco.model.MessageContent; import com.google.common.base.Optional; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.PathNotFoundException; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.List; import static com.google.common.base.Optional.absent; import static com.google.common.base.Optional.of; public class JsonPathRequestExtractor extends HttpRequestExtractor<Object> { private final ContentRequestExtractor extractor = new ContentRequestExtractor(); private final JsonPath jsonPath; public JsonPathRequestExtractor(final String jsonPath) { this.jsonPath = JsonPath.compile(jsonPath); } @Override protected Optional<Object> doExtract(final HttpRequest request) { Optional<MessageContent> requestBody = extractor.extract(request); try { if (!requestBody.isPresent()) { return absent(); } MessageContent content = requestBody.get(); Object jsonPathContent = jsonPath.read(new ByteArrayInputStream(content.getContent()), content.getCharset().toString(), Configuration.defaultConfiguration()); if (jsonPathContent == null) { return absent(); } return of(toStringArray(jsonPathContent)); } catch (PathNotFoundException e) { return absent(); } catch (IOException e) { return absent(); } } private Object toStringArray(final Object content) { if (content instanceof List) { @SuppressWarnings("unchecked") List<String> texts = (List<String>) content; return texts.toArray(new String[texts.size()]); } return content.toString(); } }