diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/json/JsonDocumentMapperParser.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/json/JsonDocumentMapperParser.java index dd990879ade..bbea50b73cf 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/json/JsonDocumentMapperParser.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/json/JsonDocumentMapperParser.java @@ -40,6 +40,7 @@ import java.util.Map; import static com.google.common.collect.Lists.*; import static org.elasticsearch.index.mapper.json.JsonMapperBuilders.*; +import static org.elasticsearch.util.json.JacksonNodes.*; /** * @author kimchy (Shay Banon) @@ -151,7 +152,7 @@ public class JsonDocumentMapperParser implements DocumentMapperParser { String propName = entry.getKey(); JsonNode propNode = entry.getValue(); if (propName.equals("nullValue")) { - builder.nullValue(propNode.getNumberValue().floatValue()); + builder.nullValue(nodeFloatValue(propNode)); } } return builder; @@ -180,7 +181,7 @@ public class JsonDocumentMapperParser implements DocumentMapperParser { String fieldName = entry.getKey(); JsonNode fieldNode = entry.getValue(); // if (fieldName.equals("compressionThreshold")) { -// builder.compressionThreshold(fieldNode.getNumberValue().intValue()); +// builder.compressionThreshold(nodeIn...); // } else if (fieldName.equals("compressionType")) { // String compressionType = fieldNode.getTextValue(); // if ("zip".equals(compressionType)) { @@ -204,7 +205,7 @@ public class JsonDocumentMapperParser implements DocumentMapperParser { String fieldName = entry.getKey(); JsonNode fieldNode = entry.getValue(); if (fieldName.equals("dynamic")) { - builder.dynamic(fieldNode.getBooleanValue()); + builder.dynamic(nodeBooleanValue(fieldNode)); } else if (fieldName.equals("type")) { String type = fieldNode.getTextValue(); if (!type.equals("object")) { @@ -227,7 +228,7 @@ public class JsonDocumentMapperParser implements DocumentMapperParser { builder.dateTimeFormatter(dateTimeFormatters); } } else if (fieldName.equals("enabled")) { - builder.enabled(fieldNode.getBooleanValue()); + builder.enabled(nodeBooleanValue(fieldNode)); } else if (fieldName.equals("pathType")) { builder.pathType(parsePathType(name, fieldNode.getValueAsText())); } else if (fieldName.equals("properties")) { @@ -362,7 +363,7 @@ public class JsonDocumentMapperParser implements DocumentMapperParser { String propName = entry.getKey(); JsonNode propNode = entry.getValue(); if (propName.equals("nullValue")) { - builder.nullValue(propNode.getNumberValue().intValue()); + builder.nullValue(nodeIntegerValue(propNode)); } } return builder; @@ -376,7 +377,7 @@ public class JsonDocumentMapperParser implements DocumentMapperParser { String propName = entry.getKey(); JsonNode propNode = entry.getValue(); if (propName.equals("nullValue")) { - builder.nullValue(propNode.getNumberValue().longValue()); + builder.nullValue(nodeLongValue(propNode)); } } return builder; @@ -390,7 +391,7 @@ public class JsonDocumentMapperParser implements DocumentMapperParser { String propName = entry.getKey(); JsonNode propNode = entry.getValue(); if (propName.equals("nullValue")) { - builder.nullValue(propNode.getNumberValue().floatValue()); + builder.nullValue(nodeFloatValue(propNode)); } } return builder; @@ -404,7 +405,7 @@ public class JsonDocumentMapperParser implements DocumentMapperParser { String propName = entry.getKey(); JsonNode propNode = entry.getValue(); if (propName.equals("nullValue")) { - builder.nullValue(propNode.getNumberValue().doubleValue()); + builder.nullValue(nodeDoubleValue(propNode)); } } return builder; @@ -438,7 +439,7 @@ public class JsonDocumentMapperParser implements DocumentMapperParser { String propName = entry.getKey(); JsonNode propNode = entry.getValue(); if (propName.equals("nullValue")) { - builder.nullValue(propNode.getBooleanValue()); + builder.nullValue(nodeBooleanValue(propNode)); } } return builder; @@ -451,7 +452,7 @@ public class JsonDocumentMapperParser implements DocumentMapperParser { String propName = entry.getKey(); JsonNode propNode = entry.getValue(); if (propName.equals("precisionStep")) { - builder.precisionStep(propNode.getNumberValue().intValue()); + builder.precisionStep(nodeIntegerValue(propNode)); } } } @@ -462,7 +463,7 @@ public class JsonDocumentMapperParser implements DocumentMapperParser { String propName = entry.getKey(); JsonNode propNode = entry.getValue(); if (propName.equals("indexName")) { - builder.indexName(propNode.getValueAsText()); + builder.indexName(propNode.getTextValue()); } else if (propName.equals("store")) { builder.store(parseStore(name, propNode.getTextValue())); } else if (propName.equals("index")) { @@ -470,11 +471,11 @@ public class JsonDocumentMapperParser implements DocumentMapperParser { } else if (propName.equals("termVector")) { builder.termVector(parseTermVector(name, propNode.getTextValue())); } else if (propName.equals("boost")) { - builder.boost(propNode.getNumberValue().floatValue()); + builder.boost(nodeFloatValue(propNode)); } else if (propName.equals("omitNorms")) { - builder.omitNorms(propNode.getBooleanValue()); + builder.omitNorms(nodeBooleanValue(propNode)); } else if (propName.equals("omitTermFreqAndPositions")) { - builder.omitTermFreqAndPositions(propNode.getBooleanValue()); + builder.omitTermFreqAndPositions(nodeBooleanValue(propNode)); } else if (propName.equals("indexAnalyzer")) { builder.indexAnalyzer(analysisService.analyzer(propNode.getTextValue())); } else if (propName.equals("searchAnalyzer")) { diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/util/json/JacksonNodes.java b/modules/elasticsearch/src/main/java/org/elasticsearch/util/json/JacksonNodes.java new file mode 100644 index 00000000000..6948aa3d602 --- /dev/null +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/util/json/JacksonNodes.java @@ -0,0 +1,68 @@ +/* + * Licensed to Elastic Search and Shay Banon under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Elastic Search 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.util.json; + +import org.codehaus.jackson.JsonNode; + +/** + * @author kimchy (shay.banon) + */ +public class JacksonNodes { + + public static float nodeFloatValue(JsonNode node) { + if (node.isNumber()) { + return node.getNumberValue().floatValue(); + } + String value = node.getTextValue(); + return Float.parseFloat(value); + } + + public static double nodeDoubleValue(JsonNode node) { + if (node.isNumber()) { + return node.getNumberValue().doubleValue(); + } + String value = node.getTextValue(); + return Double.parseDouble(value); + } + + public static int nodeIntegerValue(JsonNode node) { + if (node.isNumber()) { + return node.getNumberValue().intValue(); + } + String value = node.getTextValue(); + return Integer.parseInt(value); + } + + public static long nodeLongValue(JsonNode node) { + if (node.isNumber()) { + return node.getNumberValue().longValue(); + } + String value = node.getTextValue(); + return Long.parseLong(value); + } + + public static boolean nodeBooleanValue(JsonNode node) { + if (node.isBoolean()) { + return node.getBooleanValue(); + } + String value = node.getTextValue(); + return !(value.equals("false") || value.equals("0") || value.equals("off")); + } +}