Skip to content

Commit dbe2f53

Browse files
committed
Support YAML as content type
1 parent 9aae62b commit dbe2f53

File tree

10 files changed

+454
-137
lines changed

10 files changed

+454
-137
lines changed

pom.xml

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@
119119
<dependency>
120120
<groupId>com.fasterxml.jackson.core</groupId>
121121
<artifactId>jackson-core</artifactId>
122-
<version>2.0.4</version>
122+
<version>2.0.5</version>
123123
<scope>compile</scope>
124124
</dependency>
125125

@@ -131,9 +131,9 @@
131131
</dependency>
132132

133133
<dependency>
134-
<groupId>org.yaml</groupId>
135-
<artifactId>snakeyaml</artifactId>
136-
<version>1.6</version>
134+
<groupId>com.fasterxml.jackson.dataformat</groupId>
135+
<artifactId>jackson-dataformat-yaml</artifactId>
136+
<version>2.0.5</version>
137137
<scope>compile</scope>
138138
</dependency>
139139

@@ -344,7 +344,7 @@
344344
<include>org.mvel:mvel2</include>
345345
<include>com.fasterxml.jackson.core:jackson-core</include>
346346
<include>com.fasterxml.jackson.dataformat:jackson-dataformat-smile</include>
347-
<include>org.yaml:snakeyaml</include>
347+
<include>com.fasterxml.jackson.dataformat:jackson-dataformat-yaml</include>
348348
<include>joda-time:joda-time</include>
349349
<include>io.netty:netty</include>
350350
<include>com.ning:compress-lzf</include>
@@ -375,10 +375,6 @@
375375
<pattern>com.fasterxml.jackson</pattern>
376376
<shadedPattern>org.elasticsearch.common.jackson</shadedPattern>
377377
</relocation>
378-
<relocation>
379-
<pattern>org.yaml</pattern>
380-
<shadedPattern>org.elasticsearch.common.yaml</shadedPattern>
381-
</relocation>
382378
<relocation>
383379
<pattern>org.joda</pattern>
384380
<shadedPattern>org.elasticsearch.common.joda</shadedPattern>

src/main/java/org/elasticsearch/common/settings/loader/JsonSettingsLoader.java

Lines changed: 3 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -19,106 +19,16 @@
1919

2020
package org.elasticsearch.common.settings.loader;
2121

22-
import org.elasticsearch.common.xcontent.XContentFactory;
23-
import org.elasticsearch.common.xcontent.XContentParser;
2422
import org.elasticsearch.common.xcontent.XContentType;
2523

26-
import java.io.IOException;
27-
import java.util.List;
28-
import java.util.Map;
29-
30-
import static com.google.common.collect.Lists.newArrayList;
31-
import static com.google.common.collect.Maps.newHashMap;
32-
3324
/**
3425
* Settings loader that loads (parses) the settings in a json format by flattening them
3526
* into a map.
36-
*
37-
*
3827
*/
39-
public class JsonSettingsLoader implements SettingsLoader {
40-
41-
@Override
42-
public Map<String, String> load(String source) throws IOException {
43-
XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(source);
44-
try {
45-
return load(parser);
46-
} finally {
47-
parser.close();
48-
}
49-
}
28+
public class JsonSettingsLoader extends XContentSettingsLoader {
5029

5130
@Override
52-
public Map<String, String> load(byte[] source) throws IOException {
53-
XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(source);
54-
try {
55-
return load(parser);
56-
} finally {
57-
parser.close();
58-
}
31+
public XContentType contentType() {
32+
return XContentType.JSON;
5933
}
60-
61-
public Map<String, String> load(XContentParser jp) throws IOException {
62-
StringBuilder sb = new StringBuilder();
63-
Map<String, String> settings = newHashMap();
64-
List<String> path = newArrayList();
65-
jp.nextToken();
66-
serializeObject(settings, sb, path, jp, null);
67-
return settings;
68-
}
69-
70-
private void serializeObject(Map<String, String> settings, StringBuilder sb, List<String> path, XContentParser parser, String objFieldName) throws IOException {
71-
if (objFieldName != null) {
72-
path.add(objFieldName);
73-
}
74-
75-
String currentFieldName = null;
76-
XContentParser.Token token;
77-
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
78-
if (token == XContentParser.Token.START_OBJECT) {
79-
serializeObject(settings, sb, path, parser, currentFieldName);
80-
} else if (token == XContentParser.Token.START_ARRAY) {
81-
serializeArray(settings, sb, path, parser, currentFieldName);
82-
} else if (token == XContentParser.Token.FIELD_NAME) {
83-
currentFieldName = parser.currentName();
84-
} else if (token == XContentParser.Token.VALUE_NULL) {
85-
// ignore this
86-
} else {
87-
serializeValue(settings, sb, path, parser, currentFieldName);
88-
89-
}
90-
}
91-
92-
if (objFieldName != null) {
93-
path.remove(path.size() - 1);
94-
}
95-
}
96-
97-
private void serializeArray(Map<String, String> settings, StringBuilder sb, List<String> path, XContentParser parser, String fieldName) throws IOException {
98-
XContentParser.Token token;
99-
int counter = 0;
100-
while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) {
101-
if (token == XContentParser.Token.START_OBJECT) {
102-
serializeObject(settings, sb, path, parser, fieldName + '.' + (counter++));
103-
} else if (token == XContentParser.Token.START_ARRAY) {
104-
serializeArray(settings, sb, path, parser, fieldName + '.' + (counter++));
105-
} else if (token == XContentParser.Token.FIELD_NAME) {
106-
fieldName = parser.currentName();
107-
} else if (token == XContentParser.Token.VALUE_NULL) {
108-
// ignore
109-
} else {
110-
serializeValue(settings, sb, path, parser, fieldName + '.' + (counter++));
111-
}
112-
}
113-
}
114-
115-
private void serializeValue(Map<String, String> settings, StringBuilder sb, List<String> path, XContentParser parser, String fieldName) throws IOException {
116-
sb.setLength(0);
117-
for (String pathEle : path) {
118-
sb.append(pathEle).append('.');
119-
}
120-
sb.append(fieldName);
121-
settings.put(sb.toString(), parser.text());
122-
}
123-
12434
}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/*
2+
* Licensed to ElasticSearch and Shay Banon under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. ElasticSearch licenses this
6+
* file to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.elasticsearch.common.settings.loader;
21+
22+
import org.elasticsearch.common.xcontent.XContentFactory;
23+
import org.elasticsearch.common.xcontent.XContentParser;
24+
import org.elasticsearch.common.xcontent.XContentType;
25+
26+
import java.io.IOException;
27+
import java.util.List;
28+
import java.util.Map;
29+
30+
import static com.google.common.collect.Lists.newArrayList;
31+
import static com.google.common.collect.Maps.newHashMap;
32+
33+
/**
34+
* Settings loader that loads (parses) the settings in a xcontent format by flattening them
35+
* into a map.
36+
*/
37+
public abstract class XContentSettingsLoader implements SettingsLoader {
38+
39+
public abstract XContentType contentType();
40+
41+
@Override
42+
public Map<String, String> load(String source) throws IOException {
43+
XContentParser parser = XContentFactory.xContent(contentType()).createParser(source);
44+
try {
45+
return load(parser);
46+
} finally {
47+
parser.close();
48+
}
49+
}
50+
51+
@Override
52+
public Map<String, String> load(byte[] source) throws IOException {
53+
XContentParser parser = XContentFactory.xContent(contentType()).createParser(source);
54+
try {
55+
return load(parser);
56+
} finally {
57+
parser.close();
58+
}
59+
}
60+
61+
public Map<String, String> load(XContentParser jp) throws IOException {
62+
StringBuilder sb = new StringBuilder();
63+
Map<String, String> settings = newHashMap();
64+
List<String> path = newArrayList();
65+
XContentParser.Token token = jp.nextToken();
66+
if (token == null) {
67+
return settings;
68+
}
69+
serializeObject(settings, sb, path, jp, null);
70+
return settings;
71+
}
72+
73+
private void serializeObject(Map<String, String> settings, StringBuilder sb, List<String> path, XContentParser parser, String objFieldName) throws IOException {
74+
if (objFieldName != null) {
75+
path.add(objFieldName);
76+
}
77+
78+
String currentFieldName = null;
79+
XContentParser.Token token;
80+
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
81+
if (token == XContentParser.Token.START_OBJECT) {
82+
serializeObject(settings, sb, path, parser, currentFieldName);
83+
} else if (token == XContentParser.Token.START_ARRAY) {
84+
serializeArray(settings, sb, path, parser, currentFieldName);
85+
} else if (token == XContentParser.Token.FIELD_NAME) {
86+
currentFieldName = parser.currentName();
87+
} else if (token == XContentParser.Token.VALUE_NULL) {
88+
// ignore this
89+
} else {
90+
serializeValue(settings, sb, path, parser, currentFieldName);
91+
92+
}
93+
}
94+
95+
if (objFieldName != null) {
96+
path.remove(path.size() - 1);
97+
}
98+
}
99+
100+
private void serializeArray(Map<String, String> settings, StringBuilder sb, List<String> path, XContentParser parser, String fieldName) throws IOException {
101+
XContentParser.Token token;
102+
int counter = 0;
103+
while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) {
104+
if (token == XContentParser.Token.START_OBJECT) {
105+
serializeObject(settings, sb, path, parser, fieldName + '.' + (counter++));
106+
} else if (token == XContentParser.Token.START_ARRAY) {
107+
serializeArray(settings, sb, path, parser, fieldName + '.' + (counter++));
108+
} else if (token == XContentParser.Token.FIELD_NAME) {
109+
fieldName = parser.currentName();
110+
} else if (token == XContentParser.Token.VALUE_NULL) {
111+
// ignore
112+
} else {
113+
serializeValue(settings, sb, path, parser, fieldName + '.' + (counter++));
114+
}
115+
}
116+
}
117+
118+
private void serializeValue(Map<String, String> settings, StringBuilder sb, List<String> path, XContentParser parser, String fieldName) throws IOException {
119+
sb.setLength(0);
120+
for (String pathEle : path) {
121+
sb.append(pathEle).append('.');
122+
}
123+
sb.append(fieldName);
124+
settings.put(sb.toString(), parser.text());
125+
}
126+
127+
}

src/main/java/org/elasticsearch/common/settings/loader/YamlSettingsLoader.java

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@
1919

2020
package org.elasticsearch.common.settings.loader;
2121

22-
import org.elasticsearch.common.io.FastByteArrayInputStream;
23-
import org.yaml.snakeyaml.Yaml;
22+
import org.elasticsearch.common.xcontent.XContentType;
2423

2524
import java.io.IOException;
2625
import java.util.Map;
@@ -29,21 +28,16 @@
2928
* Settings loader that loads (parses) the settings in a yaml format by flattening them
3029
* into a map.
3130
*/
32-
public class YamlSettingsLoader implements SettingsLoader {
31+
public class YamlSettingsLoader extends XContentSettingsLoader {
3332

3433
@Override
35-
public Map<String, String> load(String source) throws IOException {
36-
// replace tabs with whitespace (yaml does not accept tabs, but many users might use it still...)
37-
source = source.replace("\t", " ");
38-
Yaml yaml = new Yaml();
39-
Map<Object, Object> yamlMap = (Map<Object, Object>) yaml.load(source);
40-
return Helper.loadNestedFromMap(yamlMap);
34+
public XContentType contentType() {
35+
return XContentType.YAML;
4136
}
4237

4338
@Override
44-
public Map<String, String> load(byte[] source) throws IOException {
45-
Yaml yaml = new Yaml();
46-
Map<Object, Object> yamlMap = (Map<Object, Object>) yaml.load(new FastByteArrayInputStream(source));
47-
return Helper.loadNestedFromMap(yamlMap);
39+
public Map<String, String> load(String source) throws IOException {
40+
// replace tabs with whitespace (yaml does not accept tabs, but many users might use it still...)
41+
return super.load(source.replace("\t", " "));
4842
}
4943
}

0 commit comments

Comments
 (0)