diff --git a/server/build.gradle b/server/build.gradle index d6c78ccd4b553..4daa3c2c4f051 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -150,6 +150,8 @@ check.dependsOn(testScriptDocValuesMissingV7Behaviour) unitTest { // these are tested explicitly in separate test tasks exclude '**/*ScriptDocValuesMissingV7BehaviourTests.class' + jvmArg '-Djava.locale.providers=COMPAT' + } forbiddenPatterns { diff --git a/server/src/main/java/org/elasticsearch/common/time/JavaDateFormatter.java b/server/src/main/java/org/elasticsearch/common/time/JavaDateFormatter.java index af9552b19aa87..6ae251e091b7c 100644 --- a/server/src/main/java/org/elasticsearch/common/time/JavaDateFormatter.java +++ b/server/src/main/java/org/elasticsearch/common/time/JavaDateFormatter.java @@ -76,7 +76,7 @@ class JavaDateFormatter implements DateFormatter { throw new IllegalArgumentException("formatters must have the same locale"); } this.printer = printer; - this.format = "8" + format; + this.format = format.startsWith("8") ? format : "8" + format; if (parsers.length == 0) { this.parsers = Collections.singletonList(printer); diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexIT.java b/server/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexIT.java index 575577c25097c..a87a23cfca64e 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexIT.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexIT.java @@ -42,6 +42,7 @@ import org.elasticsearch.test.ESIntegTestCase; import org.elasticsearch.test.ESIntegTestCase.ClusterScope; import org.elasticsearch.test.ESIntegTestCase.Scope; +import org.hamcrest.Matchers; import java.util.HashMap; import java.util.List; @@ -56,8 +57,6 @@ import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.hamcrest.core.IsNull.notNullValue; @@ -385,21 +384,38 @@ public void testIndexNameInResponse() { } public void testCreateIndexWithJava8Date() throws Exception { - String jodaIncompatibleFormat = "8yyyy-MM-dd HH:mm:ssXX"; - XContentBuilder builder = jsonBuilder().startObject().startObject("properties") - .startObject("time") - .field("type", "date") - .field("format", jodaIncompatibleFormat) - .endObject().endObject().endObject(); - - CreateIndexRequestBuilder requestBuilder = client().admin().indices().prepareCreate("test"); - assertAcked(requestBuilder.addMapping("doc", builder).get()); + BiFunction> createIndex = (xContentBuilder, propertyToBeReturned) -> { + String indexName = "test" + xContentBuilder.hashCode(); + CreateIndexRequestBuilder requestBuilder = client().admin().indices().prepareCreate(indexName); + assertAcked(requestBuilder.addMapping("doc", xContentBuilder).get()); + + GetMappingsResponse response = client().admin().indices().prepareGetMappings(indexName).get(); + List formats = XContentMapValues.extractRawValues(propertyToBeReturned, response + .getMappings() + .get(indexName) + .get("doc") + .getSourceAsMap()); + return formats; + }; - GetMappingsResponse response = client().admin().indices().prepareGetMappings("test").get(); - List formats = - XContentMapValues.extractRawValues("properties.time.format", response.getMappings().get("test").get("doc").getSourceAsMap()); - assertThat(formats, hasSize(1)); - assertThat(formats.get(0), is(jodaIncompatibleFormat)); + XContentBuilder builder = jsonBuilder().startObject().startObject("properties") + .startObject("time") + .field("type", "date") + .field("format", "8yyyy-MM-dd-MM-dd HH:mm:ssXX") + .endObject() + .endObject().endObject(); + + assertThat(createIndex.apply(builder, "properties.time.format"), Matchers.contains("8yyyy-MM-dd-MM-dd HH:mm:ssXX")); + + + builder = jsonBuilder().startObject().startObject("properties") + .startObject("time") + .field("type", "date") + .field("format", "8yyyy-MM-dd-MM-dd HH:mm:ssXX") + .field("locale", "de") + .endObject() + .endObject().endObject(); + assertThat(createIndex.apply(builder, "properties.time.locale"), Matchers.contains("de")); } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java index d9443bf076482..06e39b4fc35d5 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java @@ -270,6 +270,18 @@ public void testFloatEpochFormat() throws IOException { assertEquals(epochMillis, pointField.numericValue().longValue()); } + public void testChangeLocaleWith8Prefix() throws IOException { + String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type") + .startObject("properties").startObject("field").field("type", "date") + .field("format", "8E, d MMM uuuu HH:mm:ss Z") + .field("locale", "de") + .endObject().endObject().endObject().endObject()); + + DocumentMapper mapper = parser.parse("type", new CompressedXContent(mapping)); + + assertEquals(mapping, mapper.mappingSource().toString()); + } + public void testChangeLocale() throws IOException { String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type") .startObject("properties").startObject("field").field("type", "date").field("locale", "fr").endObject().endObject()