From e14e2a6597d2d580e34d28851d5047739f451407 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Thu, 10 Oct 2013 11:16:24 +0200 Subject: [PATCH] Added IndexRequest#source(Object...) input validation Added checks to IndexRequest#source(Object...) to ensure and even number of parameters. This method otherwise throws an AIOOBException which is confusing to users and doesn't report the root cause of the problem. --- .../action/index/IndexRequest.java | 3 + .../action/index/IndexRequestBuilder.java | 1 + .../index/IndexRequestBuilderTests.java | 61 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 src/test/java/org/elasticsearch/index/IndexRequestBuilderTests.java diff --git a/src/main/java/org/elasticsearch/action/index/IndexRequest.java b/src/main/java/org/elasticsearch/action/index/IndexRequest.java index 4b36970b0f2..88897d5d692 100644 --- a/src/main/java/org/elasticsearch/action/index/IndexRequest.java +++ b/src/main/java/org/elasticsearch/action/index/IndexRequest.java @@ -401,6 +401,9 @@ public class IndexRequest extends ShardReplicationOperationRequest } public IndexRequest source(Object... source) { + if (source.length % 2 != 0) { + throw new IllegalArgumentException("The number of object passed must be even but was [" + source.length + "]"); + } try { XContentBuilder builder = XContentFactory.contentBuilder(contentType); builder.startObject(); diff --git a/src/main/java/org/elasticsearch/action/index/IndexRequestBuilder.java b/src/main/java/org/elasticsearch/action/index/IndexRequestBuilder.java index 2a847b657fb..308f2e13a32 100644 --- a/src/main/java/org/elasticsearch/action/index/IndexRequestBuilder.java +++ b/src/main/java/org/elasticsearch/action/index/IndexRequestBuilder.java @@ -204,6 +204,7 @@ public class IndexRequestBuilder extends ShardReplicationOperationRequestBuilder /** * Constructs a simple document with a field name and value pairs. + * Note: the number of objects passed to this method must be and even number. */ public IndexRequestBuilder setSource(Object... source) { request.source(source); diff --git a/src/test/java/org/elasticsearch/index/IndexRequestBuilderTests.java b/src/test/java/org/elasticsearch/index/IndexRequestBuilderTests.java new file mode 100644 index 00000000000..f9a6fb5a7b9 --- /dev/null +++ b/src/test/java/org/elasticsearch/index/IndexRequestBuilderTests.java @@ -0,0 +1,61 @@ +/* + * Licensed to ElasticSearch and Shay Banon under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. ElasticSearch licenses this + * file to you 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 org.elasticsearch.index; + +import org.elasticsearch.action.index.IndexRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.common.bytes.BytesArray; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.test.AbstractIntegrationTest; +import org.elasticsearch.test.hamcrest.ElasticSearchAssertions; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutionException; + +public class IndexRequestBuilderTests extends AbstractIntegrationTest { + + + @Test + public void testSetSource() throws InterruptedException, ExecutionException { + createIndex("test"); + ensureYellow(); + Map map = new HashMap(); + map.put("test_field", "foobar"); + IndexRequestBuilder[] builders = new IndexRequestBuilder[] { + client().prepareIndex("test", "test").setSource((Object)"test_field", (Object)"foobar"), + client().prepareIndex("test", "test").setSource("{\"test_field\" : \"foobar\"}"), + client().prepareIndex("test", "test").setSource(new BytesArray("{\"test_field\" : \"foobar\"}")), + client().prepareIndex("test", "test").setSource(new BytesArray("{\"test_field\" : \"foobar\"}"), randomBoolean()), + client().prepareIndex("test", "test").setSource(new BytesArray("{\"test_field\" : \"foobar\"}").toBytes()), + client().prepareIndex("test", "test").setSource(map) + }; + indexRandom(true, builders); + SearchResponse searchResponse = client().prepareSearch("test").setQuery(QueryBuilders.termQuery("test_field", "foobar")).get(); + ElasticSearchAssertions.assertHitCount(searchResponse, builders.length); + } + + @Test(expected = IllegalArgumentException.class) + public void testOddNumberOfSourceObjetc() { + client().prepareIndex("test", "test").setSource((Object)"test_field", (Object)"foobar", new Object()); + } + +}