You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hudi.apache.org by vb...@apache.org on 2019/10/16 09:09:12 UTC
[incubator-hudi] branch master updated: [HUDI-121] Fix licensing
issues found during RC voting by general incubator group
This is an automated email from the ASF dual-hosted git repository.
vbalaji pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-hudi.git
The following commit(s) were added to refs/heads/master by this push:
new 77f4e73 [HUDI-121] Fix licensing issues found during RC voting by general incubator group
77f4e73 is described below
commit 77f4e73615d0949eec70187e397ef17f62e908a0
Author: Balaji Varadarajan <va...@uber.com>
AuthorDate: Fri Oct 11 23:00:55 2019 -0700
[HUDI-121] Fix licensing issues found during RC voting by general incubator group
---
DISCLAIMER | 6 -
DISCLAIMER-WIP | 26 +
LICENSE | 118 ++++
.../scala/org/apache/hudi/cli/SparkHelpers.scala | 11 +-
.../org/apache/hudi/common/TestRawTripPayload.java | 4 +-
.../apache/hudi/avro/HoodieAvroWriteSupport.java | 2 +-
.../apache/hudi/avro/MercifulJsonConverter.java | 300 +++++++---
.../org/apache/hudi/common/HoodieJsonPayload.java | 4 +-
.../hudi/common/util/ObjectSizeCalculator.java | 19 -
.../java/org/apache/hudi/common/util/Option.java | 265 ++-------
.../org/apache/hudi/common/util/ParquetUtils.java | 30 +-
.../apache/hudi/common/util/SchemaTestUtil.java | 4 +-
...rsionUtils.scala => AvroConversionHelper.scala} | 101 +---
.../org/apache/hudi/AvroConversionUtils.scala | 289 +---------
.../utilities/sources/helpers/AvroConvertor.java | 4 +-
.../hudi/utilities/TestHoodieDeltaStreamer.java | 31 +-
pom.xml | 7 +-
style/eclipse-java-google-style.xml | 353 ------------
style/intellij-java-google-style.xml | 614 ---------------------
19 files changed, 504 insertions(+), 1684 deletions(-)
diff --git a/DISCLAIMER b/DISCLAIMER
deleted file mode 100644
index 1238d8a..0000000
--- a/DISCLAIMER
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Hudi (incubating) is an effort undergoing incubation at The Apache Software Foundation
-(ASF), sponsored by the Apache Incubator PMC. Incubation is required of all newly accepted
-projects until a further review indicates that the infrastructure, communications, and decision
-making process have stabilized in a manner consistent with other successful ASF projects. While
-incubation status is not necessarily a reflection of the completeness or stability of the code,
-it does indicate that the project has yet to be fully endorsed by the ASF.
diff --git a/DISCLAIMER-WIP b/DISCLAIMER-WIP
new file mode 100644
index 0000000..62fbb5f
--- /dev/null
+++ b/DISCLAIMER-WIP
@@ -0,0 +1,26 @@
+Apache Hudi (incubating) is an effort undergoing incubation
+at The Apache Software Foundation (ASF), sponsored by the Apache Incubator.
+
+Incubation is required of all newly accepted projects until a further review
+indicates that the infrastructure, communications, and decision making process
+have stabilized in a manner consistent with other successful ASF projects.
+
+While incubation status is not necessarily a reflection of the
+completeness or stability of the code, it does indicate that the
+project has yet to be fully endorsed by the ASF.
+
+Some of the incubating project's releases may not be fully compliant
+with ASF policy. For example, releases may have incomplete or
+un-reviewed licensing conditions. What follows is a list of known
+issues the project is currently aware of (note that this list, by
+definition, is likely to be incomplete):
+
+ * The LICENSE and NOTICE files may not be complete and will be fixed with the next release.
+
+If you are planning to incorporate this work into your
+product or project, please be aware that you will need to conduct a
+thorough licensing review to determine the overall implications of
+including this work. For the current status of this project through the Apache
+Incubator visit:
+
+http://incubator.apache.org/projects/hudi.html
diff --git a/LICENSE b/LICENSE
index f433b1a..1746166 100644
--- a/LICENSE
+++ b/LICENSE
@@ -175,3 +175,121 @@
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed 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.
+
+--------------------------------------------------------------------------------
+
+This product includes code from Apache Hive.
+
+* org.apache.hadoop.hive.ql.io.CombineHiveInputFormat copied to org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat
+
+Copyright: 2011-2019 The Apache Software Foundation
+Home page: http://hive.apache.org/
+License: http://www.apache.org/licenses/LICENSE-2.0
+
+--------------------------------------------------------------------------------
+
+This product includes code from Apache SystemML.
+
+* org.apache.hudi.func.LazyIterableIterator adapted from org/apache/sysml/runtime/instructions/spark/data/LazyIterableIterator
+
+Copyright: 2015-2018 The Apache Software Foundation
+Home page: https://systemml.apache.org/
+License: http://www.apache.org/licenses/LICENSE-2.0
+
+--------------------------------------------------------------------------------
+
+This product includes code from https://github.com/twitter/commons/blob/master/src/java/com/twitter/common/objectsize/ObjectSizeCalculator.java with the following license
+
+=================================================================================================
+ Copyright 2011 Twitter, Inc.
+ -------------------------------------------------------------------------------------------------
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this work except in compliance with the License.
+ You may obtain a copy of the License in the LICENSE file, or 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.
+=================================================================================================
+
+This product includes code from Databricks spark-avro with the below license
+
+* org.apache.hudi.AvroConversionHelper copied from classes in com/databricks/spark/avro package
+
+ Copyright 2014 Databricks
+
+ Licensed 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.
+
+--------------------------------------------------------------------------------
+
+This product includes code from https://github.com/big-data-europe/README
+
+* docker/hoodie/hadoop/base/entrypoint.sh copied from https://github.com/big-data-europe/docker-hadoop/blob/master/base/entrypoint.sh
+
+which is under the MIT license (https://github.com/big-data-europe/README#license)
+
+The MIT License (MIT)
+
+Copyright (c) 2015 TENFORCE BVBA, INSTITUT FUR ANGEWANDTE INFORMATIK EV,
+NATIONAL CENTER FOR SCIENTIFIC RESEARCH "DEMOKRITOS", SEMANTIC WEB COMPANY
+GMBH, FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V,
+ETHNIKO KAI KAPODISTRIAKO PANEPISTIMIO ATHINON, GEIE ERCIM
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+-------------------------------------------------------------------------------
diff --git a/hudi-cli/src/main/scala/org/apache/hudi/cli/SparkHelpers.scala b/hudi-cli/src/main/scala/org/apache/hudi/cli/SparkHelpers.scala
index f2bf69b..7dc8b2b 100644
--- a/hudi-cli/src/main/scala/org/apache/hudi/cli/SparkHelpers.scala
+++ b/hudi-cli/src/main/scala/org/apache/hudi/cli/SparkHelpers.scala
@@ -17,6 +17,9 @@
package org.apache.hudi.cli
+import java.util
+import java.util.Map
+
import org.apache.avro.Schema
import org.apache.avro.generic.IndexedRecord
import org.apache.hadoop.conf.Configuration
@@ -54,11 +57,6 @@ object SparkHelpers {
}
writer.close
}
-
- def getBloomFilter(file: String, conf: Configuration): String = {
- val footer = ParquetFileReader.readFooter(conf, new Path(file));
- return footer.getFileMetaData().getKeyValueMetaData().get(HoodieAvroWriteSupport.HOODIE_AVRO_BLOOM_FILTER_METADATA_KEY)
- }
}
@@ -124,8 +122,7 @@ class SparkHelper(sqlContext: SQLContext, fs: FileSystem) {
* @return
*/
def fileKeysAgainstBF(conf: Configuration, sqlContext: SQLContext, file: String): Boolean = {
- val bfStr = SparkHelpers.getBloomFilter(file, conf)
- val bf = new BloomFilter(bfStr)
+ val bf = ParquetUtils.readBloomFilterFromParquetMetadata(conf, new Path(file))
val foundCount = sqlContext.parquetFile(file)
.select(s"`${HoodieRecord.RECORD_KEY_METADATA_FIELD}`")
.collect().count(r => !bf.mightContain(r.getString(0)))
diff --git a/hudi-client/src/test/java/org/apache/hudi/common/TestRawTripPayload.java b/hudi-client/src/test/java/org/apache/hudi/common/TestRawTripPayload.java
index 074aad4..130fb54 100644
--- a/hudi-client/src/test/java/org/apache/hudi/common/TestRawTripPayload.java
+++ b/hudi-client/src/test/java/org/apache/hudi/common/TestRawTripPayload.java
@@ -95,8 +95,8 @@ public class TestRawTripPayload implements HoodieRecordPayload<TestRawTripPayloa
if (isDeleted) {
return Option.empty();
} else {
- MercifulJsonConverter jsonConverter = new MercifulJsonConverter(schema);
- return Option.of(jsonConverter.convert(getJsonData()));
+ MercifulJsonConverter jsonConverter = new MercifulJsonConverter();
+ return Option.of(jsonConverter.convert(getJsonData(), schema));
}
}
diff --git a/hudi-common/src/main/java/org/apache/hudi/avro/HoodieAvroWriteSupport.java b/hudi-common/src/main/java/org/apache/hudi/avro/HoodieAvroWriteSupport.java
index 2fdfb1b..bd863ac 100644
--- a/hudi-common/src/main/java/org/apache/hudi/avro/HoodieAvroWriteSupport.java
+++ b/hudi-common/src/main/java/org/apache/hudi/avro/HoodieAvroWriteSupport.java
@@ -34,7 +34,7 @@ public class HoodieAvroWriteSupport extends AvroWriteSupport {
private String minRecordKey;
private String maxRecordKey;
-
+ public static final String OLD_HOODIE_AVRO_BLOOM_FILTER_METADATA_KEY = "com.uber.hoodie.bloomfilter";
public static final String HOODIE_AVRO_BLOOM_FILTER_METADATA_KEY = "org.apache.hudi.bloomfilter";
public static final String HOODIE_MIN_RECORD_KEY_FOOTER = "hoodie_min_record_key";
public static final String HOODIE_MAX_RECORD_KEY_FOOTER = "hoodie_max_record_key";
diff --git a/hudi-common/src/main/java/org/apache/hudi/avro/MercifulJsonConverter.java b/hudi-common/src/main/java/org/apache/hudi/avro/MercifulJsonConverter.java
index ea28cb3..9cebe51 100644
--- a/hudi-common/src/main/java/org/apache/hudi/avro/MercifulJsonConverter.java
+++ b/hudi-common/src/main/java/org/apache/hudi/avro/MercifulJsonConverter.java
@@ -19,52 +19,99 @@
package org.apache.hudi.avro;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableMap;
import java.io.IOException;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.avro.Schema;
+import org.apache.avro.Schema.Type;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericRecord;
+import org.apache.hudi.common.util.collection.Pair;
+import org.apache.hudi.exception.HoodieException;
+import org.apache.hudi.exception.HoodieIOException;
/**
- * Marjority of this is copied from
- * https://github.com/jwills/avro-json/blob/master/src/main/java/com/cloudera/science/avro/ common/JsonConverter.java
- * Adjusted for expected behavior of our use cases
+ * Converts Json record to Avro Generic Record
*/
public class MercifulJsonConverter {
- private final ObjectMapper mapper = new ObjectMapper();
- private final Schema baseSchema;
+ private static final Map<Schema.Type, JsonToAvroFieldProcessor> fieldTypeProcessors = getFieldTypeProcessors();
- public MercifulJsonConverter(Schema schema) {
- this.baseSchema = schema;
+ private final ObjectMapper mapper;
+
+ /**
+ * Build type processor map for each avro type.
+ */
+ private static Map<Schema.Type, JsonToAvroFieldProcessor> getFieldTypeProcessors() {
+ Map<Schema.Type, JsonToAvroFieldProcessor> processorMap =
+ new ImmutableMap.Builder<Schema.Type, JsonToAvroFieldProcessor>().put(Type.STRING, generateStringTypeHandler())
+ .put(Type.BOOLEAN, generateBooleanTypeHandler()).put(Type.DOUBLE, generateDoubleTypeHandler())
+ .put(Type.FLOAT, generateFloatTypeHandler()).put(Type.INT, generateIntTypeHandler())
+ .put(Type.LONG, generateLongTypeHandler()).put(Type.ARRAY, generateArrayTypeHandler())
+ .put(Type.RECORD, generateRecordTypeHandler()).put(Type.ENUM, generateEnumTypeHandler())
+ .put(Type.MAP, generateMapTypeHandler()).put(Type.BYTES, generateBytesTypeHandler())
+ .put(Type.FIXED, generateFixedTypeHandler()).build();
+ return processorMap;
+ }
+
+ /**
+ * Uses a default objectMapper to deserialize a json string
+ */
+ public MercifulJsonConverter() {
+ this(new ObjectMapper());
}
+ /**
+ * Allows a configured ObjectMapper to be passed for converting json records to avro record
+ */
+ public MercifulJsonConverter(ObjectMapper mapper) {
+ this.mapper = mapper;
+ }
- public GenericRecord convert(String json) throws IOException {
+ /**
+ * Converts json to Avro generic record
+ *
+ * @param json Json record
+ * @param schema Schema
+ */
+ public GenericRecord convert(String json, Schema schema) {
try {
- return convert(mapper.readValue(json, Map.class), baseSchema);
+ Map<String, Object> jsonObjectMap = mapper.readValue(json, Map.class);
+ return convertJsonToAvro(jsonObjectMap, schema);
} catch (IOException e) {
- throw new IOException("Failed to parse as Json: " + json + "\n\n" + e.getMessage());
+ throw new HoodieIOException(e.getMessage(), e);
}
}
- private GenericRecord convert(Map<String, Object> raw, Schema schema) throws IOException {
- GenericRecord result = new GenericData.Record(schema);
+ private static GenericRecord convertJsonToAvro(Map<String, Object> inputJson, Schema schema) {
+ GenericRecord avroRecord = new GenericData.Record(schema);
for (Schema.Field f : schema.getFields()) {
- String name = f.name();
- Object rawValue = raw.get(name);
- if (rawValue != null) {
- result.put(f.pos(), typeConvert(rawValue, name, f.schema()));
+ Object val = inputJson.get(f.name());
+ if (val != null) {
+ avroRecord.put(f.pos(), convertJsonToAvroField(val, f.name(), f.schema()));
}
}
+ return avroRecord;
+ }
+
+ private static Schema getNonNull(Schema schema) {
+ List<Schema> types = schema.getTypes();
+ Schema.Type firstType = types.get(0).getType();
+ return firstType.equals(Schema.Type.NULL) ? types.get(1) : types.get(0);
+ }
- return result;
+ private static boolean isOptional(Schema schema) {
+ return schema.getType().equals(Schema.Type.UNION) && schema.getTypes().size() == 2
+ && (schema.getTypes().get(0).getType().equals(Schema.Type.NULL)
+ || schema.getTypes().get(1).getType().equals(Schema.Type.NULL));
}
- private Object typeConvert(Object value, String name, Schema schema) throws IOException {
+ private static Object convertJsonToAvroField(Object value, String name, Schema schema) {
+
if (isOptional(schema)) {
if (value == null) {
return null;
@@ -73,83 +120,204 @@ public class MercifulJsonConverter {
}
} else if (value == null) {
// Always fail on null for non-nullable schemas
- throw new JsonConversionException(null, name, schema);
+ throw new HoodieJsonToAvroConversionException(null, name, schema);
+ }
+
+ JsonToAvroFieldProcessor processor = fieldTypeProcessors.get(schema.getType());
+ if (null != processor) {
+ return processor.convertToAvro(value, name, schema);
+ }
+ throw new IllegalArgumentException("JsonConverter cannot handle type: " + schema.getType());
+ }
+
+ /**
+ * Base Class for converting json to avro fields
+ */
+ private abstract static class JsonToAvroFieldProcessor implements Serializable {
+
+ public Object convertToAvro(Object value, String name, Schema schema) {
+ Pair<Boolean, Object> res = convert(value, name, schema);
+ if (!res.getLeft()) {
+ throw new HoodieJsonToAvroConversionException(value, name, schema);
+ }
+ return res.getRight();
}
- switch (schema.getType()) {
- case BOOLEAN:
+ protected abstract Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException;
+ }
+
+ private static JsonToAvroFieldProcessor generateBooleanTypeHandler() {
+ return new JsonToAvroFieldProcessor() {
+ @Override
+ public Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException {
if (value instanceof Boolean) {
- return value;
+ return Pair.of(true, value);
}
- break;
- case DOUBLE:
+ return Pair.of(false, null);
+ }
+ };
+ }
+
+ private static JsonToAvroFieldProcessor generateIntTypeHandler() {
+ return new JsonToAvroFieldProcessor() {
+ @Override
+ public Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException {
if (value instanceof Number) {
- return ((Number) value).doubleValue();
+ return Pair.of(true, ((Number) value).intValue());
+ } else if (value instanceof String) {
+ return Pair.of(true, Integer.valueOf((String) value));
}
- break;
- case FLOAT:
+ return Pair.of(false, null);
+ }
+ };
+ }
+
+ private static JsonToAvroFieldProcessor generateDoubleTypeHandler() {
+ return new JsonToAvroFieldProcessor() {
+ @Override
+ public Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException {
if (value instanceof Number) {
- return ((Number) value).floatValue();
+ return Pair.of(true, ((Number) value).doubleValue());
+ } else if (value instanceof String) {
+ return Pair.of(true, Double.valueOf((String) value));
}
- break;
- case INT:
+ return Pair.of(false, null);
+ }
+ };
+ }
+
+ private static JsonToAvroFieldProcessor generateFloatTypeHandler() {
+ return new JsonToAvroFieldProcessor() {
+ @Override
+ public Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException {
if (value instanceof Number) {
- return ((Number) value).intValue();
+ return Pair.of(true, ((Number) value).floatValue());
+ } else if (value instanceof String) {
+ return Pair.of(true, Float.valueOf((String) value));
}
- break;
- case LONG:
+ return Pair.of(false, null);
+ }
+ };
+ }
+
+ private static JsonToAvroFieldProcessor generateLongTypeHandler() {
+ return new JsonToAvroFieldProcessor() {
+ @Override
+ public Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException {
if (value instanceof Number) {
- return ((Number) value).longValue();
+ return Pair.of(true, ((Number) value).longValue());
+ } else if (value instanceof String) {
+ return Pair.of(true, Long.valueOf((String) value));
}
- break;
- case STRING:
- return value.toString();
- case ENUM:
+ return Pair.of(false, null);
+ }
+ };
+ }
+
+ private static JsonToAvroFieldProcessor generateStringTypeHandler() {
+ return new JsonToAvroFieldProcessor() {
+ @Override
+ public Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException {
+ return Pair.of(true, value.toString());
+ }
+ };
+ }
+
+ private static JsonToAvroFieldProcessor generateBytesTypeHandler() {
+ return new JsonToAvroFieldProcessor() {
+ @Override
+ public Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException {
+ return Pair.of(true, value.toString().getBytes());
+ }
+ };
+ }
+
+ private static JsonToAvroFieldProcessor generateFixedTypeHandler() {
+ return new JsonToAvroFieldProcessor() {
+ @Override
+ public Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException {
+ byte[] src = value.toString().getBytes();
+ byte[] dst = new byte[schema.getFixedSize()];
+ System.arraycopy(src, 0, dst, 0, Math.min(schema.getFixedSize(), src.length));
+ return Pair.of(true, dst);
+ }
+ };
+ }
+
+ private static JsonToAvroFieldProcessor generateEnumTypeHandler() {
+ return new JsonToAvroFieldProcessor() {
+ @Override
+ public Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException {
if (schema.getEnumSymbols().contains(value.toString())) {
- return new GenericData.EnumSymbol(schema, value.toString());
+ return Pair.of(true, new GenericData.EnumSymbol(schema, value.toString()));
}
- throw new JsonConversionException(String.format("Symbol %s not in enum", value.toString()),
+ throw new HoodieJsonToAvroConversionException(String.format("Symbol %s not in enum", value.toString()),
schema.getFullName(), schema);
- case RECORD:
- return convert((Map<String, Object>) value, schema);
- case ARRAY:
+ }
+ };
+ }
+
+ private static JsonToAvroFieldProcessor generateRecordTypeHandler() {
+ return new JsonToAvroFieldProcessor() {
+ @Override
+ public Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException {
+ GenericRecord result = new GenericData.Record(schema);
+ return Pair.of(true, convertJsonToAvro((Map<String, Object>) value, schema));
+ }
+ };
+ }
+
+ private static JsonToAvroFieldProcessor generateArrayTypeHandler() {
+ return new JsonToAvroFieldProcessor() {
+ @Override
+ public Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException {
Schema elementSchema = schema.getElementType();
List listRes = new ArrayList();
for (Object v : (List) value) {
- listRes.add(typeConvert(v, name, elementSchema));
+ listRes.add(convertJsonToAvroField(v, name, elementSchema));
}
- return listRes;
- case MAP:
+ return Pair.of(true, listRes);
+ }
+ };
+ }
+
+ private static JsonToAvroFieldProcessor generateMapTypeHandler() {
+ return new JsonToAvroFieldProcessor() {
+ @Override
+ public Pair<Boolean, Object> convert(Object value, String name, Schema schema)
+ throws HoodieJsonToAvroConversionException {
Schema valueSchema = schema.getValueType();
Map<String, Object> mapRes = new HashMap<String, Object>();
for (Map.Entry<String, Object> v : ((Map<String, Object>) value).entrySet()) {
- mapRes.put(v.getKey(), typeConvert(v.getValue(), name, valueSchema));
+ mapRes.put(v.getKey(), convertJsonToAvroField(v.getValue(), name, valueSchema));
}
- return mapRes;
- default:
- throw new IllegalArgumentException("JsonConverter cannot handle type: " + schema.getType());
- }
- throw new JsonConversionException(value, name, schema);
- }
-
- private boolean isOptional(Schema schema) {
- return schema.getType().equals(Schema.Type.UNION) && schema.getTypes().size() == 2
- && (schema.getTypes().get(0).getType().equals(Schema.Type.NULL)
- || schema.getTypes().get(1).getType().equals(Schema.Type.NULL));
- }
-
- private Schema getNonNull(Schema schema) {
- List<Schema> types = schema.getTypes();
- return types.get(0).getType().equals(Schema.Type.NULL) ? types.get(1) : types.get(0);
+ return Pair.of(true, mapRes);
+ }
+ };
}
- public static class JsonConversionException extends RuntimeException {
+ /**
+ * Exception Class for any schema conversion issue
+ */
+ public static class HoodieJsonToAvroConversionException extends HoodieException {
private Object value;
private String fieldName;
private Schema schema;
- public JsonConversionException(Object value, String fieldName, Schema schema) {
+ public HoodieJsonToAvroConversionException(Object value, String fieldName, Schema schema) {
this.value = value;
this.fieldName = fieldName;
this.schema = schema;
@@ -157,7 +325,7 @@ public class MercifulJsonConverter {
@Override
public String toString() {
- return String.format("Type conversion error for field %s, %s for %s", fieldName, value, schema);
+ return String.format("Json to Avro Type conversion error for field %s, %s for %s", fieldName, value, schema);
}
}
}
diff --git a/hudi-common/src/main/java/org/apache/hudi/common/HoodieJsonPayload.java b/hudi-common/src/main/java/org/apache/hudi/common/HoodieJsonPayload.java
index 238dc4e..54bdc0a 100644
--- a/hudi-common/src/main/java/org/apache/hudi/common/HoodieJsonPayload.java
+++ b/hudi-common/src/main/java/org/apache/hudi/common/HoodieJsonPayload.java
@@ -56,8 +56,8 @@ public class HoodieJsonPayload implements HoodieRecordPayload<HoodieJsonPayload>
@Override
public Option<IndexedRecord> getInsertValue(Schema schema) throws IOException {
- MercifulJsonConverter jsonConverter = new MercifulJsonConverter(schema);
- return Option.of(jsonConverter.convert(getJsonData()));
+ MercifulJsonConverter jsonConverter = new MercifulJsonConverter();
+ return Option.of(jsonConverter.convert(getJsonData(), schema));
}
private String getJsonData() throws IOException {
diff --git a/hudi-common/src/main/java/org/apache/hudi/common/util/ObjectSizeCalculator.java b/hudi-common/src/main/java/org/apache/hudi/common/util/ObjectSizeCalculator.java
index 6eb6842..b8b2aef 100644
--- a/hudi-common/src/main/java/org/apache/hudi/common/util/ObjectSizeCalculator.java
+++ b/hudi-common/src/main/java/org/apache/hudi/common/util/ObjectSizeCalculator.java
@@ -1,22 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.
- */
-// COPIED FROM https://github.com/twitter/commons/blob/master/src/java/com/twitter/common/objectsize/
-// ObjectSizeCalculator.java
// =================================================================================================
// Copyright 2011 Twitter, Inc.
// -------------------------------------------------------------------------------------------------
diff --git a/hudi-common/src/main/java/org/apache/hudi/common/util/Option.java b/hudi-common/src/main/java/org/apache/hudi/common/util/Option.java
index ecc01fb..083c3b4 100644
--- a/hudi-common/src/main/java/org/apache/hudi/common/util/Option.java
+++ b/hudi-common/src/main/java/org/apache/hudi/common/util/Option.java
@@ -24,291 +24,122 @@ import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
-import java.util.function.Predicate;
import java.util.function.Supplier;
/**
- * Copied from java.util.Optional and made Serializable along with methods to convert to/from standard Option
+ * Provides functionality same as java.util.Optional but is also made Serializable. Additional APIs are provided to
+ * convert to/from java.util.Optional
*/
public final class Option<T> implements Serializable {
private static final long serialVersionUID = 0L;
- /**
- * Common instance for {@code empty()}.
- */
- private static final Option<?> EMPTY = new Option<>();
+ private static final Option<?> NULL_VAL = new Option<>();
+
+ private final T val;
/**
- * If non-null, the value; if null, indicates no value is present
+ * Convert to java Optional
*/
- private final T value;
+ public Optional<T> toJavaOptional() {
+ return Optional.ofNullable(val);
+ }
/**
- * Constructs an empty instance.
- *
- * @implNote Generally only one empty instance, {@link Option#EMPTY}, should exist per VM.
+ * Convert from java.util.Optional
+ *
+ * @param v java.util.Optional object
+ * @param <T> type of the value stored in java.util.Optional object
+ * @return Option
*/
+ public static <T> Option<T> fromJavaOptional(Optional<T> v) {
+ return Option.ofNullable(v.orElse(null));
+ }
+
private Option() {
- this.value = null;
+ this.val = null;
}
- /**
- * Returns an empty {@code Option} instance. No value is present for this Option.
- *
- * @param <T> Type of the non-existent value
- * @return an empty {@code Option}
- * @apiNote Though it may be tempting to do so, avoid testing if an object is empty by comparing with {@code ==}
- * against instances returned by {@code Option.empty()}. There is no guarantee that it is a singleton.
- * Instead, use {@link #isPresent()}.
- */
- public static <T> Option<T> empty() {
- @SuppressWarnings("unchecked")
- Option<T> t = (Option<T>) EMPTY;
- return t;
+ private Option(T val) {
+ if (null == val) {
+ throw new NullPointerException("Expected a non-null value. Got null");
+ }
+ this.val = val;
}
- /**
- * Constructs an instance with the value present.
- *
- * @param value the non-null value to be present
- * @throws NullPointerException if value is null
- */
- private Option(T value) {
- this.value = Objects.requireNonNull(value);
+ public static <T> Option<T> empty() {
+ return (Option<T>) NULL_VAL;
}
- /**
- * Returns an {@code Option} with the specified present non-null value.
- *
- * @param <T> the class of the value
- * @param value the value to be present, which must be non-null
- * @return an {@code Option} with the value present
- * @throws NullPointerException if value is null
- */
public static <T> Option<T> of(T value) {
return new Option<>(value);
}
- /**
- * Returns an {@code Option} describing the specified value, if non-null, otherwise returns an empty {@code Option}.
- *
- * @param <T> the class of the value
- * @param value the possibly-null value to describe
- * @return an {@code Option} with a present value if the specified value is non-null, otherwise an empty {@code
- * Option}
- */
public static <T> Option<T> ofNullable(T value) {
- return value == null ? empty() : of(value);
- }
-
- /**
- * If a value is present in this {@code Option}, returns the value, otherwise throws {@code NoSuchElementException}.
- *
- * @return the non-null value held by this {@code Option}
- * @throws NoSuchElementException if there is no value present
- * @see Option#isPresent()
- */
- public T get() {
- if (value == null) {
- throw new NoSuchElementException("No value present");
- }
- return value;
+ return null == value ? empty() : of(value);
}
- /**
- * Return {@code true} if there is a value present, otherwise {@code false}.
- *
- * @return {@code true} if there is a value present, otherwise {@code false}
- */
public boolean isPresent() {
- return value != null;
+ return null != val;
}
- /**
- * If a value is present, invoke the specified consumer with the value, otherwise do nothing.
- *
- * @param consumer block to be executed if a value is present
- * @throws NullPointerException if value is present and {@code consumer} is null
- */
- public void ifPresent(Consumer<? super T> consumer) {
- if (value != null) {
- consumer.accept(value);
+ public T get() {
+ if (null == val) {
+ throw new NoSuchElementException("No value present in Option");
}
+ return val;
}
- /**
- * If a value is present, and the value matches the given predicate, return an {@code Option} describing the value,
- * otherwise return an empty {@code Option}.
- *
- * @param predicate a predicate to apply to the value, if present
- * @return an {@code Option} describing the value of this {@code Option} if a value is present and the value matches
- * the given predicate, otherwise an empty {@code Option}
- * @throws NullPointerException if the predicate is null
- */
- public Option<T> filter(Predicate<? super T> predicate) {
- Objects.requireNonNull(predicate);
- if (!isPresent()) {
- return this;
- } else {
- return predicate.test(value) ? this : empty();
+ public void ifPresent(Consumer<? super T> consumer) {
+ if (val != null) {
+ // process the value
+ consumer.accept(val);
}
}
- /**
- * If a value is present, apply the provided mapping function to it, and if the result is non-null, return an {@code
- * Option} describing the result. Otherwise return an empty {@code Option}.
- *
- * @param <U> The type of the result of the mapping function
- * @param mapper a mapping function to apply to the value, if present
- * @return an {@code Option} describing the result of applying a mapping function to the value of this {@code Option},
- * if a value is present, otherwise an empty {@code Option}
- * @throws NullPointerException if the mapping function is null
- * @apiNote This method supports post-processing on optional values, without the need to explicitly check for a return
- * status. For example, the following code traverses a stream of file names, selects one that has not yet
- * been processed, and then opens that file, returning an {@code Option<FileInputStream>}:
- *
- * <pre>
- * {@code
- * Option<FileInputStream> fis =
- * names.stream().filter(name -> !isProcessedYet(name))
- * .findFirst()
- * .map(name -> new FileInputStream(name));
- * }
- * </pre>
- *
- * Here, {@code findFirst} returns an {@code Option<String>}, and then {@code map} returns an {@code
- * Option<FileInputStream>} for the desired file if one exists.
- */
public <U> Option<U> map(Function<? super T, ? extends U> mapper) {
- Objects.requireNonNull(mapper);
if (!isPresent()) {
return empty();
} else {
- return Option.ofNullable(mapper.apply(value));
+ return Option.ofNullable(mapper.apply(val));
}
}
- /**
- * If a value is present, apply the provided {@code Option}-bearing mapping function to it, return that result,
- * otherwise return an empty {@code Option}. This method is similar to {@link #map(Function)}, but the provided mapper
- * is one whose result is already an {@code Option}, and if invoked, {@code flatMap} does not wrap it with an
- * additional {@code Option}.
- *
- * @param <U> The type parameter to the {@code Option} returned by
- * @param mapper a mapping function to apply to the value, if present the mapping function
- * @return the result of applying an {@code Option}-bearing mapping function to the value of this {@code Option}, if a
- * value is present, otherwise an empty {@code Option}
- * @throws NullPointerException if the mapping function is null or returns a null result
- */
- public <U> Option<U> flatMap(Function<? super T, Option<U>> mapper) {
- Objects.requireNonNull(mapper);
- if (!isPresent()) {
- return empty();
- } else {
- return Objects.requireNonNull(mapper.apply(value));
- }
- }
-
- /**
- * Return the value if present, otherwise return {@code other}.
- *
- * @param other the value to be returned if there is no value present, may be null
- * @return the value, if present, otherwise {@code other}
- */
public T orElse(T other) {
- return value != null ? value : other;
+ return val != null ? val : other;
}
- /**
- * Return the value if present, otherwise invoke {@code other} and return the result of that invocation.
- *
- * @param other a {@code Supplier} whose result is returned if no value is present
- * @return the value if present otherwise the result of {@code other.get()}
- * @throws NullPointerException if value is not present and {@code other} is null
- */
public T orElseGet(Supplier<? extends T> other) {
- return value != null ? value : other.get();
+ return val != null ? val : other.get();
}
- /**
- * Return the contained value, if present, otherwise throw an exception to be created by the provided supplier.
- *
- * @param <X> Type of the exception to be thrown
- * @param exceptionSupplier The supplier which will return the exception to be thrown
- * @return the present value
- * @throws X if there is no value present
- * @throws NullPointerException if no value is present and {@code exceptionSupplier} is null
- * @apiNote A method reference to the exception constructor with an empty argument list can be used as the supplier.
- * For example, {@code IllegalStateException::new}
- */
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
- if (value != null) {
- return value;
+ if (val != null) {
+ return val;
} else {
throw exceptionSupplier.get();
}
}
- /**
- * Indicates whether some other object is "equal to" this Option. The other object is considered equal if:
- * <ul>
- * <li>it is also an {@code Option} and;
- * <li>both instances have no value present or;
- * <li>the present values are "equal to" each other via {@code equals()}.
- * </ul>
- *
- * @param obj an object to be tested for equality
- * @return {code true} if the other object is "equal to" this object otherwise {@code false}
- */
@Override
- public boolean equals(Object obj) {
- if (this == obj) {
+ public boolean equals(Object o) {
+ if (this == o) {
return true;
}
-
- if (!(obj instanceof Option)) {
+ if (o == null || getClass() != o.getClass()) {
return false;
}
-
- Option<?> other = (Option<?>) obj;
- return Objects.equals(value, other.value);
+ Option<?> option = (Option<?>) o;
+ return Objects.equals(val, option.val);
}
- /**
- * Returns the hash code value of the present value, if any, or 0 (zero) if no value is present.
- *
- * @return hash code value of the present value or 0 if no value is present
- */
@Override
public int hashCode() {
- return Objects.hashCode(value);
+ return Objects.hash(val);
}
- /**
- * Returns a non-empty string representation of this Option suitable for debugging. The exact presentation format is
- * unspecified and may vary between implementations and versions.
- *
- * @return the string representation of this instance
- * @implSpec If a value is present the result must include its string representation in the result. Empty and present
- * Optionals must be unambiguously differentiable.
- */
@Override
public String toString() {
- return value != null ? String.format("Option[%s]", value) : "Option.empty";
- }
-
- /**
- * Convert to java Optional
- */
- public Optional<T> toJavaOptional() {
- return Optional.ofNullable(value);
- }
-
- /**
- * Convert from java.util.Optional
- */
- public static <T> Option<T> fromJavaOptional(Optional<T> v) {
- return Option.ofNullable(v.orElse(null));
+ return "Option{" + "val=" + val + '}';
}
}
diff --git a/hudi-common/src/main/java/org/apache/hudi/common/util/ParquetUtils.java b/hudi-common/src/main/java/org/apache/hudi/common/util/ParquetUtils.java
index 40d8d9f..788e607 100644
--- a/hudi-common/src/main/java/org/apache/hudi/common/util/ParquetUtils.java
+++ b/hudi-common/src/main/java/org/apache/hudi/common/util/ParquetUtils.java
@@ -20,6 +20,7 @@ package org.apache.hudi.common.util;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -116,15 +117,15 @@ public class ParquetUtils {
return readMetadata(configuration, parquetFilePath).getFileMetaData().getSchema();
}
- private static List<String> readParquetFooter(Configuration configuration, Path parquetFilePath,
- String... footerNames) {
- List<String> footerVals = new ArrayList<>();
+ private static Map<String, String> readParquetFooter(Configuration configuration, boolean required,
+ Path parquetFilePath, String... footerNames) {
+ Map<String, String> footerVals = new HashMap<>();
ParquetMetadata footer = readMetadata(configuration, parquetFilePath);
Map<String, String> metadata = footer.getFileMetaData().getKeyValueMetaData();
for (String footerName : footerNames) {
if (metadata.containsKey(footerName)) {
- footerVals.add(metadata.get(footerName));
- } else {
+ footerVals.put(footerName, metadata.get(footerName));
+ } else if (required) {
throw new MetadataNotFoundException(
"Could not find index in Parquet footer. " + "Looked for key " + footerName + " in " + parquetFilePath);
}
@@ -140,21 +141,28 @@ public class ParquetUtils {
* Read out the bloom filter from the parquet file meta data.
*/
public static BloomFilter readBloomFilterFromParquetMetadata(Configuration configuration, Path parquetFilePath) {
- String footerVal =
- readParquetFooter(configuration, parquetFilePath, HoodieAvroWriteSupport.HOODIE_AVRO_BLOOM_FILTER_METADATA_KEY)
- .get(0);
- return new BloomFilter(footerVal);
+ Map<String, String> footerVals =
+ readParquetFooter(configuration, false, parquetFilePath,
+ HoodieAvroWriteSupport.HOODIE_AVRO_BLOOM_FILTER_METADATA_KEY,
+ HoodieAvroWriteSupport.OLD_HOODIE_AVRO_BLOOM_FILTER_METADATA_KEY);
+ String footerVal = footerVals.get(HoodieAvroWriteSupport.HOODIE_AVRO_BLOOM_FILTER_METADATA_KEY);
+ if (null == footerVal) {
+ // We use old style key "com.uber.hoodie.bloomfilter"
+ footerVal = footerVals.get(HoodieAvroWriteSupport.OLD_HOODIE_AVRO_BLOOM_FILTER_METADATA_KEY);
+ }
+ return footerVal != null ? new BloomFilter(footerVal) : null;
}
public static String[] readMinMaxRecordKeys(Configuration configuration, Path parquetFilePath) {
- List<String> minMaxKeys = readParquetFooter(configuration, parquetFilePath,
+ Map<String, String> minMaxKeys = readParquetFooter(configuration, true, parquetFilePath,
HoodieAvroWriteSupport.HOODIE_MIN_RECORD_KEY_FOOTER, HoodieAvroWriteSupport.HOODIE_MAX_RECORD_KEY_FOOTER);
if (minMaxKeys.size() != 2) {
throw new HoodieException(
String.format("Could not read min/max record key out of footer correctly from %s. read) : %s",
parquetFilePath, minMaxKeys));
}
- return new String[] {minMaxKeys.get(0), minMaxKeys.get(1)};
+ return new String[] {minMaxKeys.get(HoodieAvroWriteSupport.HOODIE_MIN_RECORD_KEY_FOOTER),
+ minMaxKeys.get(HoodieAvroWriteSupport.HOODIE_MAX_RECORD_KEY_FOOTER)};
}
/**
diff --git a/hudi-common/src/test/java/org/apache/hudi/common/util/SchemaTestUtil.java b/hudi-common/src/test/java/org/apache/hudi/common/util/SchemaTestUtil.java
index 7fbf782..725c091 100644
--- a/hudi-common/src/test/java/org/apache/hudi/common/util/SchemaTestUtil.java
+++ b/hudi-common/src/test/java/org/apache/hudi/common/util/SchemaTestUtil.java
@@ -167,7 +167,7 @@ public class SchemaTestUtil {
public static GenericRecord generateAvroRecordFromJson(Schema schema, int recordNumber, String commitTime,
String fileId) throws IOException {
TestRecord record = new TestRecord(commitTime, recordNumber, fileId);
- MercifulJsonConverter converter = new MercifulJsonConverter(schema);
- return converter.convert(record.toJsonString());
+ MercifulJsonConverter converter = new MercifulJsonConverter();
+ return converter.convert(record.toJsonString(), schema);
}
}
diff --git a/hudi-spark/src/main/scala/org/apache/hudi/AvroConversionUtils.scala b/hudi-spark/src/main/scala/org/apache/hudi/AvroConversionHelper.scala
similarity index 77%
copy from hudi-spark/src/main/scala/org/apache/hudi/AvroConversionUtils.scala
copy to hudi-spark/src/main/scala/org/apache/hudi/AvroConversionHelper.scala
index e119979..97f89f9 100644
--- a/hudi-spark/src/main/scala/org/apache/hudi/AvroConversionUtils.scala
+++ b/hudi-spark/src/main/scala/org/apache/hudi/AvroConversionHelper.scala
@@ -1,12 +1,13 @@
/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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
+ * This code is copied from com.databricks:spark-avro with following license
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * Copyright 2014 Databricks
+ *
+ * Licensed 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,
@@ -23,75 +24,32 @@ import java.util
import com.databricks.spark.avro.SchemaConverters
import com.databricks.spark.avro.SchemaConverters.IncompatibleSchemaException
+import org.apache.avro.{Schema, SchemaBuilder}
import org.apache.avro.Schema.Type._
import org.apache.avro.generic.GenericData.{Fixed, Record}
import org.apache.avro.generic.{GenericData, GenericRecord}
-import org.apache.avro.{Schema, SchemaBuilder}
-import org.apache.spark.rdd.RDD
-import org.apache.spark.sql.catalyst.encoders.RowEncoder
+import org.apache.hudi.AvroConversionUtils.getNewRecordNamespace
+import org.apache.spark.sql.Row
import org.apache.spark.sql.catalyst.expressions.GenericRow
import org.apache.spark.sql.types._
-import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
import scala.collection.JavaConverters._
-
-object AvroConversionUtils {
-
- def createRdd(df: DataFrame, structName: String, recordNamespace: String): RDD[GenericRecord] = {
- val dataType = df.schema
- val encoder = RowEncoder.apply(dataType).resolveAndBind()
- df.queryExecution.toRdd.map(encoder.fromRow)
- .mapPartitions { records =>
- if (records.isEmpty) Iterator.empty
- else {
- val convertor = createConverterToAvro(dataType, structName, recordNamespace)
- records.map { x => convertor(x).asInstanceOf[GenericRecord] }
- }
- }
- }
-
- def createDataFrame(rdd: RDD[GenericRecord], schemaStr: String, ss : SparkSession): Dataset[Row] = {
- if (rdd.isEmpty()) {
- ss.emptyDataFrame
- } else {
- ss.createDataFrame(rdd.mapPartitions { records =>
- if (records.isEmpty) Iterator.empty
- else {
- val schema = Schema.parse(schemaStr)
- val dataType = convertAvroSchemaToStructType(schema)
- val convertor = createConverterToRow(schema, dataType)
- records.map { x => convertor(x).asInstanceOf[Row] }
- }
- }, convertAvroSchemaToStructType(Schema.parse(schemaStr))).asInstanceOf[Dataset[Row]]
- }
- }
-
- def getNewRecordNamespace(elementDataType: DataType,
- currentRecordNamespace: String,
- elementName: String): String = {
-
- elementDataType match {
- case StructType(_) => s"$currentRecordNamespace.$elementName"
- case _ => currentRecordNamespace
- }
- }
+object AvroConversionHelper {
/**
- * NOTE : This part of code is copied from com.databricks.spark.avro.SchemaConverters.scala (133:310) (spark-avro)
*
* Returns a converter function to convert row in avro format to GenericRow of catalyst.
*
* @param sourceAvroSchema Source schema before conversion inferred from avro file by passed in
- * by user.
- * @param targetSqlType Target catalyst sql type after the conversion.
+ * by user.
+ * @param targetSqlType Target catalyst sql type after the conversion.
* @return returns a converter function to convert row in avro format to GenericRow of catalyst.
*/
def createConverterToRow(sourceAvroSchema: Schema,
targetSqlType: DataType): AnyRef => AnyRef = {
- def createConverter(avroSchema: Schema,
- sqlType: DataType, path: List[String]): AnyRef => AnyRef = {
+ def createConverter(avroSchema: Schema, sqlType: DataType, path: List[String]): AnyRef => AnyRef = {
val avroType = avroSchema.getType
(sqlType, avroType) match {
// Avro strings are in Utf8, so we have to call toString on them
@@ -229,14 +187,15 @@ object AvroConversionUtils {
createConverter(schema, field.dataType, path :+ field.name)
}
- (item: AnyRef) => if (item == null) {
- null
- } else {
- val i = GenericData.get().resolveUnion(avroSchema, item)
- val converted = new Array[Any](fieldConverters.length)
- converted(i) = fieldConverters(i)(item)
- new GenericRow(converted)
- }
+ (item: AnyRef) =>
+ if (item == null) {
+ null
+ } else {
+ val i = GenericData.get().resolveUnion(avroSchema, item)
+ val converted = new Array[Any](fieldConverters.length)
+ converted(i) = fieldConverters(i)(item)
+ new GenericRow(converted)
+ }
case _ => throw new IncompatibleSchemaException(
s"Cannot convert Avro schema to catalyst type because schema at path " +
s"${path.mkString(".")} is not compatible " +
@@ -253,6 +212,7 @@ object AvroConversionUtils {
s"Target Catalyst type: $targetSqlType")
}
}
+
createConverter(sourceAvroSchema, targetSqlType, List.empty[String])
}
@@ -339,15 +299,4 @@ object AvroConversionUtils {
}
}
}
-
- def convertStructTypeToAvroSchema(structType: StructType,
- structName: String,
- recordNamespace: String): Schema = {
- val builder = SchemaBuilder.record(structName).namespace(recordNamespace)
- SchemaConverters.convertStructToAvro(structType, builder, recordNamespace)
- }
-
- def convertAvroSchemaToStructType(avroSchema: Schema): StructType = {
- SchemaConverters.toSqlType(avroSchema).dataType.asInstanceOf[StructType];
- }
}
diff --git a/hudi-spark/src/main/scala/org/apache/hudi/AvroConversionUtils.scala b/hudi-spark/src/main/scala/org/apache/hudi/AvroConversionUtils.scala
index e119979..e857b25 100644
--- a/hudi-spark/src/main/scala/org/apache/hudi/AvroConversionUtils.scala
+++ b/hudi-spark/src/main/scala/org/apache/hudi/AvroConversionUtils.scala
@@ -17,24 +17,14 @@
package org.apache.hudi
-import java.nio.ByteBuffer
-import java.sql.{Date, Timestamp}
-import java.util
-
import com.databricks.spark.avro.SchemaConverters
-import com.databricks.spark.avro.SchemaConverters.IncompatibleSchemaException
-import org.apache.avro.Schema.Type._
-import org.apache.avro.generic.GenericData.{Fixed, Record}
-import org.apache.avro.generic.{GenericData, GenericRecord}
+import org.apache.avro.generic.GenericRecord
import org.apache.avro.{Schema, SchemaBuilder}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.catalyst.encoders.RowEncoder
-import org.apache.spark.sql.catalyst.expressions.GenericRow
import org.apache.spark.sql.types._
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
-import scala.collection.JavaConverters._
-
object AvroConversionUtils {
@@ -43,15 +33,15 @@ object AvroConversionUtils {
val encoder = RowEncoder.apply(dataType).resolveAndBind()
df.queryExecution.toRdd.map(encoder.fromRow)
.mapPartitions { records =>
- if (records.isEmpty) Iterator.empty
- else {
- val convertor = createConverterToAvro(dataType, structName, recordNamespace)
- records.map { x => convertor(x).asInstanceOf[GenericRecord] }
+ if (records.isEmpty) Iterator.empty
+ else {
+ val convertor = AvroConversionHelper.createConverterToAvro(dataType, structName, recordNamespace)
+ records.map { x => convertor(x).asInstanceOf[GenericRecord] }
+ }
}
- }
}
- def createDataFrame(rdd: RDD[GenericRecord], schemaStr: String, ss : SparkSession): Dataset[Row] = {
+ def createDataFrame(rdd: RDD[GenericRecord], schemaStr: String, ss: SparkSession): Dataset[Row] = {
if (rdd.isEmpty()) {
ss.emptyDataFrame
} else {
@@ -60,7 +50,7 @@ object AvroConversionUtils {
else {
val schema = Schema.parse(schemaStr)
val dataType = convertAvroSchemaToStructType(schema)
- val convertor = createConverterToRow(schema, dataType)
+ val convertor = AvroConversionHelper.createConverterToRow(schema, dataType)
records.map { x => convertor(x).asInstanceOf[Row] }
}
}, convertAvroSchemaToStructType(Schema.parse(schemaStr))).asInstanceOf[Dataset[Row]]
@@ -77,269 +67,6 @@ object AvroConversionUtils {
}
}
- /**
- * NOTE : This part of code is copied from com.databricks.spark.avro.SchemaConverters.scala (133:310) (spark-avro)
- *
- * Returns a converter function to convert row in avro format to GenericRow of catalyst.
- *
- * @param sourceAvroSchema Source schema before conversion inferred from avro file by passed in
- * by user.
- * @param targetSqlType Target catalyst sql type after the conversion.
- * @return returns a converter function to convert row in avro format to GenericRow of catalyst.
- */
- def createConverterToRow(sourceAvroSchema: Schema,
- targetSqlType: DataType): AnyRef => AnyRef = {
-
- def createConverter(avroSchema: Schema,
- sqlType: DataType, path: List[String]): AnyRef => AnyRef = {
- val avroType = avroSchema.getType
- (sqlType, avroType) match {
- // Avro strings are in Utf8, so we have to call toString on them
- case (StringType, STRING) | (StringType, ENUM) =>
- (item: AnyRef) => if (item == null) null else item.toString
- // Byte arrays are reused by avro, so we have to make a copy of them.
- case (IntegerType, INT) | (BooleanType, BOOLEAN) | (DoubleType, DOUBLE) |
- (FloatType, FLOAT) | (LongType, LONG) =>
- identity
- case (BinaryType, FIXED) =>
- (item: AnyRef) =>
- if (item == null) {
- null
- } else {
- item.asInstanceOf[Fixed].bytes().clone()
- }
- case (BinaryType, BYTES) =>
- (item: AnyRef) =>
- if (item == null) {
- null
- } else {
- val byteBuffer = item.asInstanceOf[ByteBuffer]
- val bytes = new Array[Byte](byteBuffer.remaining)
- byteBuffer.get(bytes)
- bytes
- }
-
- case (struct: StructType, RECORD) =>
- val length = struct.fields.length
- val converters = new Array[AnyRef => AnyRef](length)
- val avroFieldIndexes = new Array[Int](length)
- var i = 0
- while (i < length) {
- val sqlField = struct.fields(i)
- val avroField = avroSchema.getField(sqlField.name)
- if (avroField != null) {
- val converter = createConverter(avroField.schema(), sqlField.dataType,
- path :+ sqlField.name)
- converters(i) = converter
- avroFieldIndexes(i) = avroField.pos()
- } else if (!sqlField.nullable) {
- throw new IncompatibleSchemaException(
- s"Cannot find non-nullable field ${sqlField.name} at path ${path.mkString(".")} " +
- "in Avro schema\n" +
- s"Source Avro schema: $sourceAvroSchema.\n" +
- s"Target Catalyst type: $targetSqlType")
- }
- i += 1
- }
-
- (item: AnyRef) => {
- if (item == null) {
- null
- } else {
- val record = item.asInstanceOf[GenericRecord]
-
- val result = new Array[Any](length)
- var i = 0
- while (i < converters.length) {
- if (converters(i) != null) {
- val converter = converters(i)
- result(i) = converter(record.get(avroFieldIndexes(i)))
- }
- i += 1
- }
- new GenericRow(result)
- }
- }
- case (arrayType: ArrayType, ARRAY) =>
- val elementConverter = createConverter(avroSchema.getElementType, arrayType.elementType,
- path)
- val allowsNull = arrayType.containsNull
- (item: AnyRef) => {
- if (item == null) {
- null
- } else {
- item.asInstanceOf[java.lang.Iterable[AnyRef]].asScala.map { element =>
- if (element == null && !allowsNull) {
- throw new RuntimeException(s"Array value at path ${path.mkString(".")} is not " +
- "allowed to be null")
- } else {
- elementConverter(element)
- }
- }
- }
- }
- case (mapType: MapType, MAP) if mapType.keyType == StringType =>
- val valueConverter = createConverter(avroSchema.getValueType, mapType.valueType, path)
- val allowsNull = mapType.valueContainsNull
- (item: AnyRef) => {
- if (item == null) {
- null
- } else {
- item.asInstanceOf[java.util.Map[AnyRef, AnyRef]].asScala.map { x =>
- if (x._2 == null && !allowsNull) {
- throw new RuntimeException(s"Map value at path ${path.mkString(".")} is not " +
- "allowed to be null")
- } else {
- (x._1.toString, valueConverter(x._2))
- }
- }.toMap
- }
- }
- case (sqlType, UNION) =>
- if (avroSchema.getTypes.asScala.exists(_.getType == NULL)) {
- val remainingUnionTypes = avroSchema.getTypes.asScala.filterNot(_.getType == NULL)
- if (remainingUnionTypes.size == 1) {
- createConverter(remainingUnionTypes.head, sqlType, path)
- } else {
- createConverter(Schema.createUnion(remainingUnionTypes.asJava), sqlType, path)
- }
- } else avroSchema.getTypes.asScala.map(_.getType) match {
- case Seq(t1) => createConverter(avroSchema.getTypes.get(0), sqlType, path)
- case Seq(a, b) if Set(a, b) == Set(INT, LONG) && sqlType == LongType =>
- (item: AnyRef) => {
- item match {
- case null => null
- case l: java.lang.Long => l
- case i: java.lang.Integer => new java.lang.Long(i.longValue())
- }
- }
- case Seq(a, b) if Set(a, b) == Set(FLOAT, DOUBLE) && sqlType == DoubleType =>
- (item: AnyRef) => {
- item match {
- case null => null
- case d: java.lang.Double => d
- case f: java.lang.Float => new java.lang.Double(f.doubleValue())
- }
- }
- case other =>
- sqlType match {
- case t: StructType if t.fields.length == avroSchema.getTypes.size =>
- val fieldConverters = t.fields.zip(avroSchema.getTypes.asScala).map {
- case (field, schema) =>
- createConverter(schema, field.dataType, path :+ field.name)
- }
-
- (item: AnyRef) => if (item == null) {
- null
- } else {
- val i = GenericData.get().resolveUnion(avroSchema, item)
- val converted = new Array[Any](fieldConverters.length)
- converted(i) = fieldConverters(i)(item)
- new GenericRow(converted)
- }
- case _ => throw new IncompatibleSchemaException(
- s"Cannot convert Avro schema to catalyst type because schema at path " +
- s"${path.mkString(".")} is not compatible " +
- s"(avroType = $other, sqlType = $sqlType). \n" +
- s"Source Avro schema: $sourceAvroSchema.\n" +
- s"Target Catalyst type: $targetSqlType")
- }
- }
- case (left, right) =>
- throw new IncompatibleSchemaException(
- s"Cannot convert Avro schema to catalyst type because schema at path " +
- s"${path.mkString(".")} is not compatible (avroType = $left, sqlType = $right). \n" +
- s"Source Avro schema: $sourceAvroSchema.\n" +
- s"Target Catalyst type: $targetSqlType")
- }
- }
- createConverter(sourceAvroSchema, targetSqlType, List.empty[String])
- }
-
- def createConverterToAvro(dataType: DataType,
- structName: String,
- recordNamespace: String): Any => Any = {
- dataType match {
- case BinaryType => (item: Any) =>
- item match {
- case null => null
- case bytes: Array[Byte] => ByteBuffer.wrap(bytes)
- }
- case IntegerType | LongType |
- FloatType | DoubleType | StringType | BooleanType => identity
- case ByteType => (item: Any) =>
- if (item == null) null else item.asInstanceOf[Byte].intValue
- case ShortType => (item: Any) =>
- if (item == null) null else item.asInstanceOf[Short].intValue
- case _: DecimalType => (item: Any) => if (item == null) null else item.toString
- case TimestampType => (item: Any) =>
- if (item == null) null else item.asInstanceOf[Timestamp].getTime
- case DateType => (item: Any) =>
- if (item == null) null else item.asInstanceOf[Date].getTime
- case ArrayType(elementType, _) =>
- val elementConverter = createConverterToAvro(
- elementType,
- structName,
- getNewRecordNamespace(elementType, recordNamespace, structName))
- (item: Any) => {
- if (item == null) {
- null
- } else {
- val sourceArray = item.asInstanceOf[Seq[Any]]
- val sourceArraySize = sourceArray.size
- val targetList = new util.ArrayList[Any](sourceArraySize)
- var idx = 0
- while (idx < sourceArraySize) {
- targetList.add(elementConverter(sourceArray(idx)))
- idx += 1
- }
- targetList
- }
- }
- case MapType(StringType, valueType, _) =>
- val valueConverter = createConverterToAvro(
- valueType,
- structName,
- getNewRecordNamespace(valueType, recordNamespace, structName))
- (item: Any) => {
- if (item == null) {
- null
- } else {
- val javaMap = new util.HashMap[String, Any]()
- item.asInstanceOf[Map[String, Any]].foreach { case (key, value) =>
- javaMap.put(key, valueConverter(value))
- }
- javaMap
- }
- }
- case structType: StructType =>
- val builder = SchemaBuilder.record(structName).namespace(recordNamespace)
- val schema: Schema = SchemaConverters.convertStructToAvro(
- structType, builder, recordNamespace)
- val fieldConverters = structType.fields.map(field =>
- createConverterToAvro(
- field.dataType,
- field.name,
- getNewRecordNamespace(field.dataType, recordNamespace, field.name)))
- (item: Any) => {
- if (item == null) {
- null
- } else {
- val record = new Record(schema)
- val convertersIterator = fieldConverters.iterator
- val fieldNamesIterator = dataType.asInstanceOf[StructType].fieldNames.iterator
- val rowIterator = item.asInstanceOf[Row].toSeq.iterator
-
- while (convertersIterator.hasNext) {
- val converter = convertersIterator.next()
- record.put(fieldNamesIterator.next(), converter(rowIterator.next()))
- }
- record
- }
- }
- }
- }
-
def convertStructTypeToAvroSchema(structType: StructType,
structName: String,
recordNamespace: String): Schema = {
diff --git a/hudi-utilities/src/main/java/org/apache/hudi/utilities/sources/helpers/AvroConvertor.java b/hudi-utilities/src/main/java/org/apache/hudi/utilities/sources/helpers/AvroConvertor.java
index 4049cb6..6416cf9 100644
--- a/hudi-utilities/src/main/java/org/apache/hudi/utilities/sources/helpers/AvroConvertor.java
+++ b/hudi-utilities/src/main/java/org/apache/hudi/utilities/sources/helpers/AvroConvertor.java
@@ -75,7 +75,7 @@ public class AvroConvertor implements Serializable {
private void initJsonConvertor() {
if (jsonConverter == null) {
- jsonConverter = new MercifulJsonConverter(schema);
+ jsonConverter = new MercifulJsonConverter();
}
}
@@ -83,7 +83,7 @@ public class AvroConvertor implements Serializable {
public GenericRecord fromJson(String json) throws IOException {
initSchema();
initJsonConvertor();
- return jsonConverter.convert(json);
+ return jsonConverter.convert(json, schema);
}
public Schema getSchema() {
diff --git a/hudi-utilities/src/test/java/org/apache/hudi/utilities/TestHoodieDeltaStreamer.java b/hudi-utilities/src/test/java/org/apache/hudi/utilities/TestHoodieDeltaStreamer.java
index e0fedd6..0092de0 100644
--- a/hudi-utilities/src/test/java/org/apache/hudi/utilities/TestHoodieDeltaStreamer.java
+++ b/hudi-utilities/src/test/java/org/apache/hudi/utilities/TestHoodieDeltaStreamer.java
@@ -25,6 +25,7 @@ import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
@@ -529,31 +530,17 @@ public class TestHoodieDeltaStreamer extends UtilitiesTestBase {
public static class DistanceUDF implements UDF4<Double, Double, Double, Double, Double> {
/**
- * Taken from https://stackoverflow.com/questions/3694380/calculating-distance-between-two-points-using-latitude-
- * longitude-what-am-i-doi Calculate distance between two points in latitude and longitude taking into account
- * height difference. If you are not interested in height difference pass 0.0. Uses Haversine method as its base.
- *
- * lat1, lon1 Start point lat2, lon2 End point el1 Start altitude in meters el2 End altitude in meters
- *
- * @returns Distance in Meters
+ * Returns some random number as distance between the points
+ *
+ * @param lat1 Latitiude of source
+ * @param lat2 Latitude of destination
+ * @param lon1 Longitude of source
+ * @param lon2 Longitude of destination
+ * @return
*/
@Override
public Double call(Double lat1, Double lat2, Double lon1, Double lon2) {
-
- final int R = 6371; // Radius of the earth
-
- double latDistance = Math.toRadians(lat2 - lat1);
- double lonDistance = Math.toRadians(lon2 - lon1);
- double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2) + Math.cos(Math.toRadians(lat1))
- * Math.cos(Math.toRadians(lat2)) * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
- double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
- double distance = R * c * 1000; // convert to meters
-
- double height = 0;
-
- distance = Math.pow(distance, 2) + Math.pow(height, 2);
-
- return Math.sqrt(distance);
+ return new Random().nextDouble();
}
}
diff --git a/pom.xml b/pom.xml
index 7773039..5a96810 100644
--- a/pom.xml
+++ b/pom.xml
@@ -170,6 +170,8 @@
</execution>
</executions>
</plugin>
+<!--
+ See https://jira.apache.org/jira/browse/HUDI-304
<plugin>
<groupId>com.diffplug.spotless</groupId>
<artifactId>spotless-maven-plugin</artifactId>
@@ -182,13 +184,11 @@
</eclipse>
</java>
<scala>
- <!--<endWithNewLine/>-->
<trimTrailingWhitespace/>
</scala>
</configuration>
<executions>
<execution>
- <!-- Runs in compile phase to fail fast in case of formatting issues.-->
<id>spotless-check</id>
<phase>compile</phase>
<goals>
@@ -197,6 +197,7 @@
</execution>
</executions>
</plugin>
+-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
@@ -345,7 +346,7 @@
<exclude>**/dependency-reduced-pom.xml</exclude>
<exclude>**/test/resources/*.data</exclude>
<exclude>**/target/**</exclude>
- <excludes>**/generated-sources/**</excludes>
+ <exclude>**/generated-sources/**</exclude>
</excludes>
</configuration>
<executions>
diff --git a/style/eclipse-java-google-style.xml b/style/eclipse-java-google-style.xml
deleted file mode 100644
index f99bb9f..0000000
--- a/style/eclipse-java-google-style.xml
+++ /dev/null
@@ -1,353 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF 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.
--->
-<profiles version="15">
- <profile kind="CodeFormatterProfile" name="GoogleStyle" version="15">
- <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_cascading_method_invocation_with_arguments.count_dependent" value="16|-1|16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.wrap_prefer_two_fragments" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.wrap_comment_inline_tags" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_local_variable_declaration" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="1040"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type.count_dependent" value="1585|-1|1585"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields.count_dependent" value="16|-1|16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression.count_dependent" value="16|4|80"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration.count_dependent" value="16|4|48"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration.count_dependent" value="16|4|49"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_cascading_method_invocation_with_arguments" value="16"/>
- <setting id="org.eclipse.jdt.core.compiler.source" value="1.7"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration.count_dependent" value="16|4|48"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_local_variable_annotation" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="0"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants.count_dependent" value="16|5|48"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation.count_dependent" value="16|4|48"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="1585"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="16"/>
- <setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
- <setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
- <setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_type_annotation" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_field_declaration" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_generic_type_arguments" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.comment_new_line_at_start_of_html_paragraph" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comment_prefix" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
- <setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_parameter_annotation" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="1585"/>
- <setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="2"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation.count_dependent" value="16|5|80"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter.count_dependent" value="1040|-1|1040"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package.count_dependent" value="1585|-1|1585"/>
- <setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.force_if_else_statement_brace" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
- <setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="3"/>
- <setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_package_annotation" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation.count_dependent" value="16|-1|16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="1585"/>
- <setting id="org.eclipse.jdt.core.compiler.compliance" value="1.7"/>
- <setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_new_anonymous_class" value="20"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable.count_dependent" value="1585|-1|1585"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field.count_dependent" value="1585|-1|1585"/>
- <setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration.count_dependent" value="16|5|80"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
- <setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant.count_dependent" value="16|-1|16"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
- <setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="2"/>
- <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="0"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="1585"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer.count_dependent" value="16|5|80"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.7"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
- <setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration.count_dependent" value="16|4|48"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method.count_dependent" value="1585|-1|1585"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression.count_dependent" value="16|-1|16"/>
- <setting id="org.eclipse.jdt.core.formatter.wrap_non_simple_member_annotation" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="1585"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call.count_dependent" value="16|5|80"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_generic_type_arguments.count_dependent" value="16|-1|16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression.count_dependent" value="16|5|80"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration.count_dependent" value="16|5|80"/>
- <setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
- <setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.alignment_for_for_statement" value="16"/>
- <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
- <setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
- <setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
- </profile>
-</profiles>
diff --git a/style/intellij-java-google-style.xml b/style/intellij-java-google-style.xml
deleted file mode 100644
index f8b0f5e..0000000
--- a/style/intellij-java-google-style.xml
+++ /dev/null
@@ -1,614 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF 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.
--->
-<code_scheme name="GoogleStyle">
- <option name="OTHER_INDENT_OPTIONS">
- <value>
- <option name="INDENT_SIZE" value="2" />
- <option name="CONTINUATION_INDENT_SIZE" value="4" />
- <option name="TAB_SIZE" value="2" />
- <option name="USE_TAB_CHARACTER" value="false" />
- <option name="SMART_TABS" value="false" />
- <option name="LABEL_INDENT_SIZE" value="0" />
- <option name="LABEL_INDENT_ABSOLUTE" value="false" />
- <option name="USE_RELATIVE_INDENTS" value="false" />
- </value>
- </option>
- <option name="INSERT_INNER_CLASS_IMPORTS" value="true" />
- <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
- <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
- <option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
- <value />
- </option>
- <option name="IMPORT_LAYOUT_TABLE">
- <value>
- <package name="" withSubpackages="true" static="true" />
- <emptyLine />
- <package name="" withSubpackages="true" static="false" />
- </value>
- </option>
- <option name="RIGHT_MARGIN" value="120" />
- <option name="JD_ALIGN_PARAM_COMMENTS" value="false" />
- <option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false" />
- <option name="JD_P_AT_EMPTY_LINES" value="false" />
- <option name="JD_KEEP_EMPTY_PARAMETER" value="false" />
- <option name="JD_KEEP_EMPTY_EXCEPTION" value="false" />
- <option name="JD_KEEP_EMPTY_RETURN" value="false" />
- <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
- <option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0" />
- <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
- <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="0" />
- <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
- <option name="ALIGN_MULTILINE_FOR" value="false" />
- <option name="CALL_PARAMETERS_WRAP" value="1" />
- <option name="METHOD_PARAMETERS_WRAP" value="1" />
- <option name="EXTENDS_LIST_WRAP" value="1" />
- <option name="THROWS_KEYWORD_WRAP" value="1" />
- <option name="METHOD_CALL_CHAIN_WRAP" value="1" />
- <option name="BINARY_OPERATION_WRAP" value="1" />
- <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
- <option name="TERNARY_OPERATION_WRAP" value="1" />
- <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
- <option name="FOR_STATEMENT_WRAP" value="1" />
- <option name="ARRAY_INITIALIZER_WRAP" value="1" />
- <option name="WRAP_COMMENTS" value="true" />
- <option name="IF_BRACE_FORCE" value="3" />
- <option name="DOWHILE_BRACE_FORCE" value="3" />
- <option name="WHILE_BRACE_FORCE" value="3" />
- <option name="FOR_BRACE_FORCE" value="3" />
- <option name="SPACE_BEFORE_ARRAY_INITIALIZER_LBRACE" value="true" />
- <AndroidXmlCodeStyleSettings>
- <option name="USE_CUSTOM_SETTINGS" value="true" />
- <option name="LAYOUT_SETTINGS">
- <value>
- <option name="INSERT_BLANK_LINE_BEFORE_TAG" value="false" />
- </value>
- </option>
- </AndroidXmlCodeStyleSettings>
- <JSCodeStyleSettings>
- <option name="INDENT_CHAINED_CALLS" value="false" />
- </JSCodeStyleSettings>
- <Python>
- <option name="USE_CONTINUATION_INDENT_FOR_ARGUMENTS" value="true" />
- </Python>
- <TypeScriptCodeStyleSettings>
- <option name="INDENT_CHAINED_CALLS" value="false" />
- </TypeScriptCodeStyleSettings>
- <XML>
- <option name="XML_ALIGN_ATTRIBUTES" value="false" />
- <option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
- </XML>
- <codeStyleSettings language="CSS">
- <indentOptions>
- <option name="INDENT_SIZE" value="2" />
- <option name="CONTINUATION_INDENT_SIZE" value="4" />
- <option name="TAB_SIZE" value="2" />
- </indentOptions>
- </codeStyleSettings>
- <codeStyleSettings language="ECMA Script Level 4">
- <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
- <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
- <option name="ALIGN_MULTILINE_FOR" value="false" />
- <option name="CALL_PARAMETERS_WRAP" value="1" />
- <option name="METHOD_PARAMETERS_WRAP" value="1" />
- <option name="EXTENDS_LIST_WRAP" value="1" />
- <option name="BINARY_OPERATION_WRAP" value="1" />
- <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
- <option name="TERNARY_OPERATION_WRAP" value="1" />
- <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
- <option name="FOR_STATEMENT_WRAP" value="1" />
- <option name="ARRAY_INITIALIZER_WRAP" value="1" />
- <option name="IF_BRACE_FORCE" value="3" />
- <option name="DOWHILE_BRACE_FORCE" value="3" />
- <option name="WHILE_BRACE_FORCE" value="3" />
- <option name="FOR_BRACE_FORCE" value="3" />
- <option name="PARENT_SETTINGS_INSTALLED" value="true" />
- </codeStyleSettings>
- <codeStyleSettings language="HTML">
- <indentOptions>
- <option name="INDENT_SIZE" value="2" />
- <option name="CONTINUATION_INDENT_SIZE" value="4" />
- <option name="TAB_SIZE" value="2" />
- </indentOptions>
- </codeStyleSettings>
- <codeStyleSettings language="JAVA">
- <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
- <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
- <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" />
- <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
- <option name="ALIGN_MULTILINE_RESOURCES" value="false" />
- <option name="ALIGN_MULTILINE_FOR" value="false" />
- <option name="CALL_PARAMETERS_WRAP" value="1" />
- <option name="METHOD_PARAMETERS_WRAP" value="1" />
- <option name="EXTENDS_LIST_WRAP" value="1" />
- <option name="THROWS_KEYWORD_WRAP" value="1" />
- <option name="METHOD_CALL_CHAIN_WRAP" value="1" />
- <option name="BINARY_OPERATION_WRAP" value="1" />
- <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
- <option name="TERNARY_OPERATION_WRAP" value="1" />
- <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
- <option name="FOR_STATEMENT_WRAP" value="1" />
- <option name="ARRAY_INITIALIZER_WRAP" value="1" />
- <option name="WRAP_COMMENTS" value="true" />
- <option name="IF_BRACE_FORCE" value="3" />
- <option name="DOWHILE_BRACE_FORCE" value="3" />
- <option name="WHILE_BRACE_FORCE" value="3" />
- <option name="FOR_BRACE_FORCE" value="3" />
- <option name="PARENT_SETTINGS_INSTALLED" value="true" />
- <indentOptions>
- <option name="INDENT_SIZE" value="2" />
- <option name="CONTINUATION_INDENT_SIZE" value="4" />
- <option name="TAB_SIZE" value="2" />
- </indentOptions>
- </codeStyleSettings>
- <codeStyleSettings language="JSON">
- <indentOptions>
- <option name="CONTINUATION_INDENT_SIZE" value="4" />
- <option name="TAB_SIZE" value="2" />
- </indentOptions>
- </codeStyleSettings>
- <codeStyleSettings language="JavaScript">
- <option name="RIGHT_MARGIN" value="80" />
- <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
- <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
- <option name="ALIGN_MULTILINE_FOR" value="false" />
- <option name="CALL_PARAMETERS_WRAP" value="1" />
- <option name="METHOD_PARAMETERS_WRAP" value="1" />
- <option name="BINARY_OPERATION_WRAP" value="1" />
- <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
- <option name="TERNARY_OPERATION_WRAP" value="1" />
- <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
- <option name="FOR_STATEMENT_WRAP" value="1" />
- <option name="ARRAY_INITIALIZER_WRAP" value="1" />
- <option name="IF_BRACE_FORCE" value="3" />
- <option name="DOWHILE_BRACE_FORCE" value="3" />
- <option name="WHILE_BRACE_FORCE" value="3" />
- <option name="FOR_BRACE_FORCE" value="3" />
- <option name="PARENT_SETTINGS_INSTALLED" value="true" />
- <indentOptions>
- <option name="INDENT_SIZE" value="2" />
- <option name="TAB_SIZE" value="2" />
- </indentOptions>
- </codeStyleSettings>
- <codeStyleSettings language="PROTO">
- <option name="RIGHT_MARGIN" value="80" />
- <indentOptions>
- <option name="INDENT_SIZE" value="2" />
- <option name="CONTINUATION_INDENT_SIZE" value="2" />
- <option name="TAB_SIZE" value="2" />
- </indentOptions>
- </codeStyleSettings>
- <codeStyleSettings language="protobuf">
- <option name="RIGHT_MARGIN" value="80" />
- <indentOptions>
- <option name="INDENT_SIZE" value="2" />
- <option name="CONTINUATION_INDENT_SIZE" value="2" />
- <option name="TAB_SIZE" value="2" />
- </indentOptions>
- </codeStyleSettings>
- <codeStyleSettings language="Python">
- <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
- <option name="RIGHT_MARGIN" value="80" />
- <option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
- <option name="PARENT_SETTINGS_INSTALLED" value="true" />
- <indentOptions>
- <option name="INDENT_SIZE" value="2" />
- <option name="CONTINUATION_INDENT_SIZE" value="4" />
- <option name="TAB_SIZE" value="2" />
- </indentOptions>
- </codeStyleSettings>
- <codeStyleSettings language="SASS">
- <indentOptions>
- <option name="CONTINUATION_INDENT_SIZE" value="4" />
- <option name="TAB_SIZE" value="2" />
- </indentOptions>
- </codeStyleSettings>
- <codeStyleSettings language="SCSS">
- <indentOptions>
- <option name="CONTINUATION_INDENT_SIZE" value="4" />
- <option name="TAB_SIZE" value="2" />
- </indentOptions>
- </codeStyleSettings>
- <codeStyleSettings language="TypeScript">
- <indentOptions>
- <option name="INDENT_SIZE" value="2" />
- <option name="TAB_SIZE" value="2" />
- </indentOptions>
- </codeStyleSettings>
- <codeStyleSettings language="XML">
- <indentOptions>
- <option name="INDENT_SIZE" value="2" />
- <option name="CONTINUATION_INDENT_SIZE" value="2" />
- <option name="TAB_SIZE" value="2" />
- </indentOptions>
- <arrangement>
- <rules>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>xmlns:android</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>^$</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>xmlns:.*</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>^$</XML_NAMESPACE>
- </AND>
- </match>
- <order>BY_NAME</order>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:id</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>style</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>^$</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>^$</XML_NAMESPACE>
- </AND>
- </match>
- <order>BY_NAME</order>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:.*Style</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- <order>BY_NAME</order>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:layout_width</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:layout_height</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:layout_weight</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:layout_margin</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:layout_marginTop</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:layout_marginBottom</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:layout_marginStart</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:layout_marginEnd</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:layout_marginLeft</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:layout_marginRight</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:layout_.*</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- <order>BY_NAME</order>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:padding</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:paddingTop</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:paddingBottom</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:paddingStart</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:paddingEnd</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:paddingLeft</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*:paddingRight</NAME>
- <XML_ATTRIBUTE />
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*</NAME>
- <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
- </AND>
- </match>
- <order>BY_NAME</order>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*</NAME>
- <XML_NAMESPACE>http://schemas.android.com/apk/res-auto</XML_NAMESPACE>
- </AND>
- </match>
- <order>BY_NAME</order>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*</NAME>
- <XML_NAMESPACE>http://schemas.android.com/tools</XML_NAMESPACE>
- </AND>
- </match>
- <order>BY_NAME</order>
- </rule>
- </section>
- <section>
- <rule>
- <match>
- <AND>
- <NAME>.*</NAME>
- <XML_NAMESPACE>.*</XML_NAMESPACE>
- </AND>
- </match>
- <order>BY_NAME</order>
- </rule>
- </section>
- </rules>
- </arrangement>
- </codeStyleSettings>
- <Objective-C>
- <option name="INDENT_NAMESPACE_MEMBERS" value="0" />
- <option name="INDENT_C_STRUCT_MEMBERS" value="2" />
- <option name="INDENT_CLASS_MEMBERS" value="2" />
- <option name="INDENT_VISIBILITY_KEYWORDS" value="1" />
- <option name="INDENT_INSIDE_CODE_BLOCK" value="2" />
- <option name="KEEP_STRUCTURES_IN_ONE_LINE" value="true" />
- <option name="FUNCTION_PARAMETERS_WRAP" value="5" />
- <option name="FUNCTION_CALL_ARGUMENTS_WRAP" value="5" />
- <option name="TEMPLATE_CALL_ARGUMENTS_WRAP" value="5" />
- <option name="TEMPLATE_CALL_ARGUMENTS_ALIGN_MULTILINE" value="true" />
- <option name="ALIGN_INIT_LIST_IN_COLUMNS" value="false" />
- <option name="SPACE_BEFORE_SUPERCLASS_COLON" value="false" />
- </Objective-C>
- <Objective-C-extensions>
- <option name="GENERATE_INSTANCE_VARIABLES_FOR_PROPERTIES" value="ASK" />
- <option name="RELEASE_STYLE" value="IVAR" />
- <option name="TYPE_QUALIFIERS_PLACEMENT" value="BEFORE" />
- <file>
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
- </file>
- <class>
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
- <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
- </class>
- <extensions>
- <pair source="cc" header="h" />
- <pair source="c" header="h" />
- </extensions>
- </Objective-C-extensions>
- <codeStyleSettings language="ObjectiveC">
- <option name="RIGHT_MARGIN" value="80" />
- <option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="1" />
- <option name="BLANK_LINES_BEFORE_IMPORTS" value="0" />
- <option name="BLANK_LINES_AFTER_IMPORTS" value="0" />
- <option name="BLANK_LINES_AROUND_CLASS" value="0" />
- <option name="BLANK_LINES_AROUND_METHOD" value="0" />
- <option name="BLANK_LINES_AROUND_METHOD_IN_INTERFACE" value="0" />
- <option name="ALIGN_MULTILINE_BINARY_OPERATION" value="false" />
- <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
- <option name="FOR_STATEMENT_WRAP" value="1" />
- <option name="ASSIGNMENT_WRAP" value="1" />
- <indentOptions>
- <option name="INDENT_SIZE" value="2" />
- <option name="CONTINUATION_INDENT_SIZE" value="4" />
- </indentOptions>
- </codeStyleSettings>
-</code_scheme>