Skip to content

Commit

Permalink
If a value/field is a Calendar, it will be converted to a Date using …
Browse files Browse the repository at this point in the history
…getTime()

Closes elastic#2911
  • Loading branch information
Lucas Ward authored and Lucas Ward committed Apr 17, 2013
1 parent 271305d commit 34e8187
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 0 deletions.
Expand Up @@ -39,6 +39,7 @@
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

Expand Down Expand Up @@ -734,6 +735,8 @@ public XContentBuilder field(String name, Object value) throws IOException {
field(name, ((Boolean) value).booleanValue());
} else if (value instanceof Date) {
field(name, (Date) value);
} else if (value instanceof Calendar) {
field(name, convertCalendar((Calendar) value));
} else if (type == byte[].class) {
field(name, (byte[]) value);
} else if (value instanceof ReadableInstant) {
Expand Down Expand Up @@ -843,6 +846,8 @@ public XContentBuilder value(Object value) throws IOException {
value((byte[]) value);
} else if (value instanceof Date) {
value((Date) value);
} else if (value instanceof Calendar) {
value(convertCalendar((Calendar) value));
} else if (value instanceof ReadableInstant) {
value((ReadableInstant) value);
} else if (value instanceof BytesReference) {
Expand All @@ -860,6 +865,10 @@ public XContentBuilder value(Object value) throws IOException {
return this;
}

private Date convertCalendar(Calendar value) {

This comment has been minimized.

Copy link
@s1monw

s1monw Apr 17, 2013

I mean not that is really matters but what is the reason for having this in a method and not just call getTime() in each of the places?

return value.getTime();
}

public XContentBuilder field(String name, boolean value) throws IOException {
field(name);
generator.writeBoolean(value);
Expand Down
Expand Up @@ -178,6 +178,8 @@ private static void writeValue(XContentGenerator gen, Object value) throws IOExc
gen.writeBinary((byte[]) value);
} else if (value instanceof Date) {
gen.writeString(XContentBuilder.defaultDatePrinter.print(((Date) value).getTime()));
} else if (value instanceof Calendar) {
gen.writeString(XContentBuilder.defaultDatePrinter.print((((Calendar) value)).getTimeInMillis()));
} else if (value instanceof BytesReference) {
BytesReference bytes = (BytesReference) value;
if (!bytes.hasArray()) {
Expand Down
Expand Up @@ -28,6 +28,8 @@
import org.elasticsearch.common.xcontent.XContentType;
import org.testng.annotations.Test;

import java.util.*;

import static org.elasticsearch.common.xcontent.XContentBuilder.FieldCaseConversion.CAMELCASE;
import static org.elasticsearch.common.xcontent.XContentBuilder.FieldCaseConversion.UNDERSCORE;
import static org.hamcrest.MatcherAssert.assertThat;
Expand Down Expand Up @@ -106,4 +108,31 @@ public void testFieldCaseConversion() throws Exception {
builder.startObject().field("testName", "value").endObject();
assertThat(builder.string(), equalTo("{\"test_name\":\"value\"}"));
}

@Test
public void testDateTypesConversion() throws Exception {
Date date = new Date();
String expectedDate = XContentBuilder.defaultDatePrinter.print(date.getTime());
Calendar calendar = new GregorianCalendar();
String expectedCalendar = XContentBuilder.defaultDatePrinter.print(calendar.getTimeInMillis());
XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON);
builder.startObject().field("date", date).endObject();
assertThat(builder.string(), equalTo("{\"date\":\"" + expectedDate + "\"}"));

builder = XContentFactory.contentBuilder(XContentType.JSON);
builder.startObject().field("calendar", calendar).endObject();
assertThat(builder.string(), equalTo("{\"calendar\":\"" + expectedCalendar + "\"}"));

builder = XContentFactory.contentBuilder(XContentType.JSON);
Map<String, Object> map = new HashMap<String, Object>();
map.put("date", date);
builder.map(map);
assertThat(builder.string(), equalTo("{\"date\":\"" + expectedDate + "\"}"));

builder = XContentFactory.contentBuilder(XContentType.JSON);
map = new HashMap<String, Object>();
map.put("calendar", calendar);
builder.map(map);
assertThat(builder.string(), equalTo("{\"calendar\":\"" + expectedCalendar + "\"}"));
}
}

0 comments on commit 34e8187

Please sign in to comment.