diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 62b33c4ce..709789959 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -235,7 +235,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -243,6 +243,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
index 9bca002fa..d8d3c44b2 100644
--- a/.settings/org.eclipse.jdt.ui.prefs
+++ b/.settings/org.eclipse.jdt.ui.prefs
@@ -65,61 +65,3 @@ org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=true
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=true
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_type_arguments=true
-sp_cleanup.remove_trailing_whitespaces=true
-sp_cleanup.remove_trailing_whitespaces_all=false
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=true
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=true
-sp_cleanup.remove_unused_imports=true
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=true
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=false
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_type_arguments=false
diff --git a/api/.settings/org.eclipse.jdt.core.prefs b/api/.settings/org.eclipse.jdt.core.prefs
index 8add83f71..974b88fd1 100644
--- a/api/.settings/org.eclipse.jdt.core.prefs
+++ b/api/.settings/org.eclipse.jdt.core.prefs
@@ -259,7 +259,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -267,6 +267,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/api/.settings/org.eclipse.jdt.ui.prefs b/api/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/api/.settings/org.eclipse.jdt.ui.prefs
+++ b/api/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/core/.settings/org.eclipse.jdt.core.prefs b/core/.settings/org.eclipse.jdt.core.prefs
index bfbe09007..6f26e9072 100644
--- a/core/.settings/org.eclipse.jdt.core.prefs
+++ b/core/.settings/org.eclipse.jdt.core.prefs
@@ -249,7 +249,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -257,6 +257,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/core/.settings/org.eclipse.jdt.ui.prefs b/core/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/core/.settings/org.eclipse.jdt.ui.prefs
+++ b/core/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/Oft.java b/core/src/main/java/org/itsallcode/openfasttrace/core/Oft.java
index a2ca887ec..262ac2104 100644
--- a/core/src/main/java/org/itsallcode/openfasttrace/core/Oft.java
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/Oft.java
@@ -125,4 +125,14 @@ static Oft create()
{
return new OftRunner();
}
+
+ /**
+ * Create a builder for configuring an {@link Oft} instance, e.g. to add plugins at runtime.
+ *
+ * @return a new {@link OftBuilder}
+ */
+ static OftBuilder builder()
+ {
+ return new OftBuilder();
+ }
}
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/OftBuilder.java b/core/src/main/java/org/itsallcode/openfasttrace/core/OftBuilder.java
new file mode 100644
index 000000000..6afc3860b
--- /dev/null
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/OftBuilder.java
@@ -0,0 +1,55 @@
+package org.itsallcode.openfasttrace.core;
+
+import java.nio.file.Path;
+
+import org.itsallcode.openfasttrace.core.serviceloader.Plugin;
+import org.itsallcode.openfasttrace.core.serviceloader.ServiceLoaderConfig;
+
+/**
+ * Builder for creating {@link Oft} instances with custom configuration.
+ *
+ * Use this builder to configure additional plugins that OFT should load at runtime in addition to the plugins
+ * discovered from the default locations.
+ */
+public final class OftBuilder
+{
+ private final ServiceLoaderConfig.Builder serviceLoaderConfig = ServiceLoaderConfig.builder();
+
+ OftBuilder()
+ {
+ // Prevent instantiation from outside this package.
+ }
+
+ /**
+ * Add a named plugin consisting of one or more JAR files.
+ *
+ * All JAR files passed in one call are loaded through the same separate ClassLoader, matching the semantics of a
+ * plugin directory under {@code $HOME/.oft/plugins//}. The JAR files may contain one or more service
+ * providers; OFT loads all of them.
+ *
+ * @param name
+ * name of the plugin, used for the ClassLoader name and logging
+ * @param jars
+ * paths to the JAR files that make up the plugin
+ * @return {@code this} for fluent programming
+ * @throws IllegalArgumentException
+ * if the name is {@code null} or blank, if no JAR is given, or
+ * if a path is {@code null} or does not point to an existing JAR
+ * file
+ */
+ public OftBuilder addPlugin(final String name, final Path... jars)
+ {
+ this.serviceLoaderConfig.addPlugin(Plugin.of(name, jars));
+ return this;
+ }
+
+ /**
+ * Create a new {@link Oft} instance with the configured plugins.
+ *
+ * @return a new {@link Oft} instance
+ */
+ public Oft build()
+ {
+ return new OftRunner(new ServiceFactory(this.serviceLoaderConfig.build()));
+ }
+}
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/OftRunner.java b/core/src/main/java/org/itsallcode/openfasttrace/core/OftRunner.java
index 8bf9714ca..e72bca0f5 100644
--- a/core/src/main/java/org/itsallcode/openfasttrace/core/OftRunner.java
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/OftRunner.java
@@ -4,10 +4,9 @@
import java.util.List;
import org.itsallcode.openfasttrace.api.ReportSettings;
-import org.itsallcode.openfasttrace.api.core.LinkedSpecificationItem;
-import org.itsallcode.openfasttrace.api.core.SpecificationItem;
-import org.itsallcode.openfasttrace.api.core.Trace;
+import org.itsallcode.openfasttrace.api.core.*;
import org.itsallcode.openfasttrace.api.importer.ImportSettings;
+import org.itsallcode.openfasttrace.core.serviceloader.ServiceLoaderConfig;
/**
* Provides convenient methods for importing, tracing and reporting.
@@ -19,10 +18,10 @@ public class OftRunner implements Oft
/** Create a new instance. */
public OftRunner()
{
- this(new ServiceFactory());
+ this(new ServiceFactory(ServiceLoaderConfig.createDefault()));
}
- OftRunner(ServiceFactory serviceFactory)
+ OftRunner(final ServiceFactory serviceFactory)
{
this.serviceFactory = serviceFactory;
}
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/ServiceFactory.java b/core/src/main/java/org/itsallcode/openfasttrace/core/ServiceFactory.java
index 4d0e5d3b1..54c071492 100644
--- a/core/src/main/java/org/itsallcode/openfasttrace/core/ServiceFactory.java
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/ServiceFactory.java
@@ -13,18 +13,36 @@
import org.itsallcode.openfasttrace.core.importer.ImporterServiceImpl;
import org.itsallcode.openfasttrace.core.report.ReportService;
import org.itsallcode.openfasttrace.core.report.ReporterFactoryLoader;
+import org.itsallcode.openfasttrace.core.serviceloader.ServiceLoaderConfig;
class ServiceFactory
{
+ private final ServiceLoaderConfig serviceLoaderConfig;
+
+ /**
+ * @deprecated Use {@link #ServiceFactory(ServiceLoaderConfig)} instead.
+ */
+ @Deprecated(since = "4.11.0", forRemoval = true)
+ ServiceFactory()
+ {
+ this(ServiceLoaderConfig.createDefault());
+ }
+
+ ServiceFactory(final ServiceLoaderConfig serviceLoaderConfig)
+ {
+ this.serviceLoaderConfig = serviceLoaderConfig;
+ }
+
ExporterService createExporterService()
{
- return new ExporterService(new ExporterFactoryLoader(new ExporterContext()));
+ return new ExporterService(new ExporterFactoryLoader(new ExporterContext(), this.serviceLoaderConfig));
}
ImporterService createImporterService(final ImportSettings settings)
{
final ImporterContext context = new ImporterContext(settings);
- final ImporterService service = new ImporterServiceImpl(new ImporterFactoryLoader(context), settings);
+ final ImporterService service = new ImporterServiceImpl(
+ new ImporterFactoryLoader(context, this.serviceLoaderConfig), settings);
context.setImporterService(service);
return service;
}
@@ -41,6 +59,7 @@ Tracer createTracer()
ReportService createReportService(final ReportSettings settings)
{
- return new ReportService(new ReporterFactoryLoader(new ReporterContext(settings)));
+ return new ReportService(
+ new ReporterFactoryLoader(new ReporterContext(settings), this.serviceLoaderConfig));
}
}
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/ArgumentValidator.java b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/ArgumentValidator.java
index 3a35d19e6..72f138c9b 100644
--- a/core/src/main/java/org/itsallcode/openfasttrace/core/cli/ArgumentValidator.java
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/cli/ArgumentValidator.java
@@ -2,14 +2,14 @@
import static java.util.Arrays.asList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
import java.util.stream.Collectors;
+import org.itsallcode.openfasttrace.api.exporter.ExporterContext;
import org.itsallcode.openfasttrace.api.report.ReportVerbosity;
import org.itsallcode.openfasttrace.core.cli.commands.*;
import org.itsallcode.openfasttrace.core.exporter.ExporterFactoryLoader;
+import org.itsallcode.openfasttrace.core.serviceloader.ServiceLoaderConfig;
/**
* The {@link ArgumentValidator} checks whether the command line arguments given
@@ -85,7 +85,8 @@ private boolean validateTraceCommand()
private boolean validateConvertCommand()
{
final String format = Objects.requireNonNull(this.arguments.getOutputFormat(), "");
- if (!new ExporterFactoryLoader(null).isFormatSupported(format))
+ if (!new ExporterFactoryLoader(new ExporterContext(), ServiceLoaderConfig.createDefault())
+ .isFormatSupported(format))
{
this.error = "export format '" + format + "' is not supported.";
return false;
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/exporter/ExporterFactoryLoader.java b/core/src/main/java/org/itsallcode/openfasttrace/core/exporter/ExporterFactoryLoader.java
index 4ec7bc226..92697038e 100644
--- a/core/src/main/java/org/itsallcode/openfasttrace/core/exporter/ExporterFactoryLoader.java
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/exporter/ExporterFactoryLoader.java
@@ -4,8 +4,7 @@
import java.util.List;
import org.itsallcode.openfasttrace.api.exporter.*;
-import org.itsallcode.openfasttrace.core.serviceloader.InitializingServiceLoader;
-import org.itsallcode.openfasttrace.core.serviceloader.Loader;
+import org.itsallcode.openfasttrace.core.serviceloader.*;
/**
* This class is responsible for finding the matching {@link ExporterFactory}
@@ -20,11 +19,28 @@ public class ExporterFactoryLoader
*
* @param context
* the context for the new loader.
+ * @deprecated Use {@link #ExporterFactoryLoader(ExporterContext, ServiceLoaderConfig)} instead.
*/
+ @Deprecated(since = "4.11.0", forRemoval = true)
public ExporterFactoryLoader(final ExporterContext context)
{
// [impl->dsn~plugins.loading.plugin-types~1]
- this(InitializingServiceLoader.load(ExporterFactory.class, context));
+ this(InitializingServiceLoader.load(ExporterFactory.class, context, ServiceLoaderConfig.createDefault()));
+ }
+
+ /**
+ * Create a new loader for the given context that uses the given service
+ * loader configuration.
+ *
+ * @param context
+ * the context for the new loader.
+ * @param config
+ * configuration for the service loader
+ */
+ // [impl->dsn~plugins.loading.configuration~1]
+ public ExporterFactoryLoader(final ExporterContext context, final ServiceLoaderConfig config)
+ {
+ this(InitializingServiceLoader.load(ExporterFactory.class, context, config));
}
ExporterFactoryLoader(final Loader serviceLoader)
@@ -49,13 +65,10 @@ public ExporterFactory getExporterFactory(final String outputFormat)
final List matchingExporters = getMatchingFactories(outputFormat);
return switch (matchingExporters.size())
{
- case 0 ->
- throw new ExporterException(
+ case 0 -> throw new ExporterException(
"Found no matching exporter for output format '" + outputFormat + "'");
- case 1 ->
- matchingExporters.get(0);
- default ->
- throw new ExporterException("Found more than one matching exporter for output format '"
+ case 1 -> matchingExporters.get(0);
+ default -> throw new ExporterException("Found more than one matching exporter for output format '"
+ outputFormat + "'");
};
}
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/importer/ImporterFactoryLoader.java b/core/src/main/java/org/itsallcode/openfasttrace/core/importer/ImporterFactoryLoader.java
index dda9cbc37..cc33aa52d 100644
--- a/core/src/main/java/org/itsallcode/openfasttrace/core/importer/ImporterFactoryLoader.java
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/importer/ImporterFactoryLoader.java
@@ -1,15 +1,12 @@
package org.itsallcode.openfasttrace.core.importer;
import java.nio.file.Path;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
import java.util.logging.Logger;
import org.itsallcode.openfasttrace.api.importer.*;
import org.itsallcode.openfasttrace.api.importer.input.InputFile;
-import org.itsallcode.openfasttrace.core.serviceloader.InitializingServiceLoader;
-import org.itsallcode.openfasttrace.core.serviceloader.Loader;
+import org.itsallcode.openfasttrace.core.serviceloader.*;
/**
* This class is responsible for finding the matching {@link ImporterFactory}
@@ -36,11 +33,28 @@ public class ImporterFactoryLoader
*
* @param context
* context for the new loader
+ * @deprecated Use {@link #ImporterFactoryLoader(ImporterContext, ServiceLoaderConfig)} instead.
*/
+ @Deprecated(since = "4.11.0", forRemoval = true)
public ImporterFactoryLoader(final ImporterContext context)
{
// [impl->dsn~plugins.loading.plugin-types~1]
- this(InitializingServiceLoader.load(ImporterFactory.class, context));
+ this(InitializingServiceLoader.load(ImporterFactory.class, context, ServiceLoaderConfig.createDefault()));
+ }
+
+ /**
+ * Create a new loader for the given context that uses the given service
+ * loader configuration.
+ *
+ * @param context
+ * context for the new loader
+ * @param config
+ * configuration for the service loader
+ */
+ // [impl->dsn~plugins.loading.configuration~1]
+ public ImporterFactoryLoader(final ImporterContext context, final ServiceLoaderConfig config)
+ {
+ this(InitializingServiceLoader.load(ImporterFactory.class, context, config));
}
/**
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/report/ReporterFactoryLoader.java b/core/src/main/java/org/itsallcode/openfasttrace/core/report/ReporterFactoryLoader.java
index 41a328996..06f449c24 100644
--- a/core/src/main/java/org/itsallcode/openfasttrace/core/report/ReporterFactoryLoader.java
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/report/ReporterFactoryLoader.java
@@ -4,8 +4,7 @@
import org.itsallcode.openfasttrace.api.exporter.ExporterException;
import org.itsallcode.openfasttrace.api.report.*;
-import org.itsallcode.openfasttrace.core.serviceloader.InitializingServiceLoader;
-import org.itsallcode.openfasttrace.core.serviceloader.Loader;
+import org.itsallcode.openfasttrace.core.serviceloader.*;
/**
* This class is responsible for finding the matching {@link ReporterFactory}
@@ -21,11 +20,29 @@ public class ReporterFactoryLoader
* @param context
* the context used for initializing new
* {@link ReporterFactory}s.
+ * @deprecated Use {@link #ReporterFactoryLoader(ReporterContext, ServiceLoaderConfig)} instead.
*/
+ @Deprecated(since = "4.11.0", forRemoval = true)
public ReporterFactoryLoader(final ReporterContext context)
{
// [impl->dsn~plugins.loading.plugin-types~1]
- this(InitializingServiceLoader.load(ReporterFactory.class, context));
+ this(InitializingServiceLoader.load(ReporterFactory.class, context, ServiceLoaderConfig.createDefault()));
+ }
+
+ /**
+ * Create a new {@link ReporterFactoryLoader} that uses the given service
+ * loader configuration.
+ *
+ * @param context
+ * the context used for initializing new
+ * {@link ReporterFactory}s.
+ * @param config
+ * configuration for the service loader
+ */
+ // [impl->dsn~plugins.loading.configuration~1]
+ public ReporterFactoryLoader(final ReporterContext context, final ServiceLoaderConfig config)
+ {
+ this(InitializingServiceLoader.load(ReporterFactory.class, context, config));
}
private ReporterFactoryLoader(final Loader serviceLoader)
@@ -50,10 +67,10 @@ public ReporterFactory getReporterFactory(final String outputFormat)
final List matchingReporters = getMatchingFactories(outputFormat);
return switch (matchingReporters.size())
{
- case 0 -> throw new ExporterException(
+ case 0 -> throw new ExporterException(
"Found no matching reporter for output format '" + outputFormat + "'");
- case 1 -> matchingReporters.get(0);
- default -> throw new ReportException("Found more than one matching reporter for output format '"
+ case 1 -> matchingReporters.get(0);
+ default -> throw new ReportException("Found more than one matching reporter for output format '"
+ outputFormat + "'");
};
}
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/InitializingServiceLoader.java b/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/InitializingServiceLoader.java
index 805a3b49f..fb6bcfd3b 100644
--- a/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/InitializingServiceLoader.java
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/InitializingServiceLoader.java
@@ -40,11 +40,37 @@ public final class InitializingServiceLoader, C> impl
* context with which to initialize the newly created service
* instances.
* @return an {@link InitializingServiceLoader} for type T
+ * @deprecated Use {@link #load(Class, Object, ServiceLoaderConfig)} instead.
*/
- public static , C> Loader load(
- final Class serviceType, final C context)
+ @Deprecated(since = "4.11.0", forRemoval = true)
+ public static , C> Loader load(final Class serviceType, final C context)
{
- final ServiceLoaderFactory loaderFactory = ServiceLoaderFactory.createDefault();
+ return load(serviceType, context, ServiceLoaderConfig.createDefault());
+ }
+
+ /**
+ * Create a new {@link InitializingServiceLoader} using the given service
+ * loader configuration.
+ *
+ * @param
+ * service type.
+ * @param
+ * service context type.
+ * @param serviceType
+ * type of the services to load.
+ * @param context
+ * context with which to initialize the newly created service
+ * instances.
+ * @param config
+ * configuration for the service loader, e.g. additional plugins
+ * configured at runtime.
+ * @return an {@link InitializingServiceLoader} for type T
+ */
+ // [impl->dsn~plugins.loading.configuration~1]
+ public static , C> Loader load(final Class serviceType, final C context,
+ final ServiceLoaderConfig config)
+ {
+ final ServiceLoaderFactory loaderFactory = new ServiceLoaderFactory(config);
return new InitializingServiceLoader<>(loaderFactory.createLoader(serviceType), context);
}
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/Plugin.java b/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/Plugin.java
new file mode 100644
index 000000000..8542c1d37
--- /dev/null
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/Plugin.java
@@ -0,0 +1,120 @@
+package org.itsallcode.openfasttrace.core.serviceloader;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.*;
+
+/**
+ * A plugin configured at runtime, consisting of a name and one or more JAR
+ * files.
+ *
+ * All JAR files of a plugin are loaded through a single separate ClassLoader.
+ * The JAR files may contain one or more service providers; OFT loads all of
+ * them.
+ */
+public final class Plugin
+{
+ private final String name;
+ private final List jars;
+
+ private Plugin(final String name, final List jars)
+ {
+ this.name = name;
+ this.jars = jars;
+ }
+
+ /**
+ * Create a new plugin.
+ *
+ * @param name
+ * name of the plugin, used for the ClassLoader name and logging
+ * @param jars
+ * paths to the JAR files that make up the plugin
+ * @return a new plugin
+ * @throws IllegalArgumentException
+ * if the name is {@code null} or blank, if no JAR is given, or
+ * if a path is {@code null} or does not point to an existing JAR
+ * file
+ */
+ public static Plugin of(final String name, final Path... jars)
+ {
+ if (name == null || name.isBlank())
+ {
+ throw new IllegalArgumentException("Plugin name must not be null or blank.");
+ }
+ if (jars == null || jars.length == 0)
+ {
+ throw new IllegalArgumentException("At least one plugin JAR must be given for plugin '" + name + "'.");
+ }
+ final List validatedJars = Arrays.stream(jars)
+ .map(jar -> validateJar(name, jar))
+ .toList();
+ return new Plugin(name, validatedJars);
+ }
+
+ private static Path validateJar(final String name, final Path jar)
+ {
+ if (jar == null)
+ {
+ throw new IllegalArgumentException("Plugin JAR path must not be null for plugin '" + name + "'.");
+ }
+ if (!Files.isRegularFile(jar))
+ {
+ throw new IllegalArgumentException(
+ "Plugin JAR '" + jar + "' of plugin '" + name + "' does not exist or is not a file.");
+ }
+ if (!jar.getFileName().toString().toLowerCase(Locale.ENGLISH).endsWith(".jar"))
+ {
+ throw new IllegalArgumentException(
+ "Plugin file '" + jar + "' of plugin '" + name + "' is not a JAR file.");
+ }
+ return jar;
+ }
+
+ /**
+ * Get the name of the plugin.
+ *
+ * @return the name of the plugin
+ */
+ public String getName()
+ {
+ return this.name;
+ }
+
+ /**
+ * Get the JAR files that make up the plugin.
+ *
+ * @return the JAR files that make up the plugin
+ */
+ public List getJars()
+ {
+ return List.copyOf(this.jars);
+ }
+
+ @Override
+ public String toString()
+ {
+ return "Plugin [name=" + this.name + ", jars=" + this.jars + "]";
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return Objects.hash(this.name, this.jars);
+ }
+
+ @Override
+ public boolean equals(final Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass())
+ {
+ return false;
+ }
+ final Plugin other = (Plugin) obj;
+ return Objects.equals(this.name, other.name) && Objects.equals(this.jars, other.jars);
+ }
+}
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderConfig.java b/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderConfig.java
new file mode 100644
index 000000000..514e46c3b
--- /dev/null
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderConfig.java
@@ -0,0 +1,173 @@
+package org.itsallcode.openfasttrace.core.serviceloader;
+
+import java.nio.file.Path;
+import java.util.*;
+
+/**
+ * Configuration for the service loader.
+ *
+ * This object collects all settings that control how OFT discovers and loads services (importers, exporters, and
+ * reporters).
+ */
+public final class ServiceLoaderConfig
+{
+ private final Path pluginsDirectory;
+ private final boolean searchCurrentClasspath;
+ private final List plugins;
+
+ private ServiceLoaderConfig(final Builder builder)
+ {
+ this.pluginsDirectory = builder.pluginsDirectory;
+ this.searchCurrentClasspath = builder.searchCurrentClasspath;
+ this.plugins = Collections.unmodifiableList(new ArrayList<>(builder.plugins));
+ }
+
+ /**
+ * Create the default configuration.
+ *
+ * The default configuration searches the current class path and the default plugin directory in the user's home
+ * {@code ~/.oft/plugins} and configures no additional plugins.
+ *
+ * @return the default configuration
+ */
+ public static ServiceLoaderConfig createDefault()
+ {
+ return builder().build();
+ }
+
+ /**
+ * Create a builder for {@link ServiceLoaderConfig}.
+ *
+ * @return a new builder
+ */
+ public static Builder builder()
+ {
+ return new Builder();
+ }
+
+ /**
+ * Create a builder initialized with the values of this configuration.
+ *
+ * @return a new builder
+ */
+ public Builder toBuilder()
+ {
+ return new Builder()
+ .pluginsDirectory(this.pluginsDirectory)
+ .searchCurrentClasspath(this.searchCurrentClasspath)
+ .addPlugins(this.plugins);
+ }
+
+ /**
+ * Get the directory that is searched for plugins.
+ *
+ * @return the plugin directory
+ */
+ public Path getPluginsDirectory()
+ {
+ return this.pluginsDirectory;
+ }
+
+ /**
+ * Check whether the current class path is searched for services.
+ *
+ * @return {@code true} if the current class path is searched
+ */
+ public boolean isSearchCurrentClasspath()
+ {
+ return this.searchCurrentClasspath;
+ }
+
+ /**
+ * Get the plugins configured at runtime.
+ *
+ * @return the configured plugins
+ */
+ public List getPlugins()
+ {
+ return this.plugins;
+ }
+
+ /**
+ * Builder for {@link ServiceLoaderConfig}.
+ */
+ public static final class Builder
+ {
+ private Path pluginsDirectory = defaultPluginsDirectory();
+ private boolean searchCurrentClasspath = true;
+ private final List plugins = new ArrayList<>();
+
+ private Builder()
+ {
+ // Prevent instantiation from outside this class.
+ }
+
+ private static Path defaultPluginsDirectory()
+ {
+ return Path.of(System.getProperty("user.home")).resolve(".oft").resolve("plugins");
+ }
+
+ /**
+ * Set the directory that is searched for plugins. Default: the {@code .oft/plugins} directory in the user's
+ * home.
+ *
+ * @param pluginsDirectory
+ * the plugin directory
+ * @return {@code this} for fluent programming
+ */
+ public Builder pluginsDirectory(final Path pluginsDirectory)
+ {
+ this.pluginsDirectory = Objects.requireNonNull(pluginsDirectory, "pluginsDirectory");
+ return this;
+ }
+
+ /**
+ * Set whether the current class path is searched for services. Default: {@code true}.
+ *
+ * @param searchCurrentClasspath
+ * {@code true} if the current class path should be searched
+ * @return {@code this} for fluent programming
+ */
+ public Builder searchCurrentClasspath(final boolean searchCurrentClasspath)
+ {
+ this.searchCurrentClasspath = searchCurrentClasspath;
+ return this;
+ }
+
+ /**
+ * Add a plugin configured at runtime.
+ *
+ * @param plugin
+ * the plugin to add
+ * @return {@code this} for fluent programming
+ */
+ public Builder addPlugin(final Plugin plugin)
+ {
+ this.plugins.add(Objects.requireNonNull(plugin, "plugin"));
+ return this;
+ }
+
+ /**
+ * Add plugins configured at runtime.
+ *
+ * @param plugins
+ * the plugins to add
+ * @return {@code this} for fluent programming
+ */
+ public Builder addPlugins(final List plugins)
+ {
+ this.plugins.addAll(Objects.requireNonNull(plugins, "plugins"));
+ return this;
+ }
+
+ /**
+ * Create a new {@link ServiceLoaderConfig}.
+ *
+ * @return a new configuration
+ */
+ public ServiceLoaderConfig build()
+ {
+ return new ServiceLoaderConfig(this);
+ }
+ }
+}
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderFactory.java b/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderFactory.java
index 559a03d1e..d08ad3ab0 100644
--- a/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderFactory.java
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderFactory.java
@@ -14,22 +14,17 @@
class ServiceLoaderFactory
{
private static final Logger LOGGER = Logger.getLogger(ServiceLoaderFactory.class.getName());
- private final Path pluginsDirectory;
- private final boolean searchCurrentClasspath;
+ private final ServiceLoaderConfig config;
/**
* Create a new factory for service {@link Loader}.
*
- * @param pluginsDirectory
- * directory to search for plugins
- * @param searchCurrentClasspath
- * whether to search the current classpath for plugins. This is
- * useful for testing to avoid loading plugins twice.
+ * @param config
+ * configuration for the service loader
*/
- ServiceLoaderFactory(final Path pluginsDirectory, final boolean searchCurrentClasspath)
+ ServiceLoaderFactory(final ServiceLoaderConfig config)
{
- this.pluginsDirectory = pluginsDirectory;
- this.searchCurrentClasspath = searchCurrentClasspath;
+ this.config = config;
}
/**
@@ -39,13 +34,7 @@ class ServiceLoaderFactory
*/
static ServiceLoaderFactory createDefault()
{
- final Path pluginsDirectory = getHomeDirectory().resolve(".oft").resolve("plugins");
- return new ServiceLoaderFactory(pluginsDirectory, true);
- }
-
- private static Path getHomeDirectory()
- {
- return Path.of(System.getProperty("user.home"));
+ return new ServiceLoaderFactory(ServiceLoaderConfig.createDefault());
}
/**
@@ -78,10 +67,12 @@ private static Loader createLoader(final Class serviceType, final List
* @return a list of service origins
*/
// [impl->dsn~plugins.loading~1]
+ // [impl->dsn~plugins.loading.configuration~1]
List findServiceOrigins()
{
final List origins = new ArrayList<>(findPluginOrigins());
- if (searchCurrentClasspath)
+ origins.addAll(findAdditionalPluginOrigins());
+ if (this.config.isSearchCurrentClasspath())
{
origins.add(ServiceOrigin.forCurrentClassPath());
}
@@ -89,8 +80,16 @@ List findServiceOrigins()
return origins;
}
+ private Collection findAdditionalPluginOrigins()
+ {
+ return this.config.getPlugins().stream()
+ .map(plugin -> ServiceOrigin.forJars(plugin.getName(), plugin.getJars()))
+ .toList();
+ }
+
private Collection findPluginOrigins()
{
+ final Path pluginsDirectory = this.config.getPluginsDirectory();
if (!Files.isDirectory(pluginsDirectory))
{
return Collections.emptyList();
@@ -108,7 +107,7 @@ private Collection findPluginOrigins()
catch (final IOException exception)
{
throw new UncheckedIOException(
- "Failed to list plugin directories in '" + this.pluginsDirectory + "': " + exception.getMessage(),
+ "Failed to list plugin directories in '" + pluginsDirectory + "': " + exception.getMessage(),
exception);
}
}
diff --git a/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceOrigin.java b/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceOrigin.java
index cbe421070..721747ef6 100644
--- a/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceOrigin.java
+++ b/core/src/main/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceOrigin.java
@@ -52,14 +52,29 @@ static ServiceOrigin forJar(final Path jar)
// [impl->dsn~plugins.loading.separate-classloader~1]
static ServiceOrigin forJars(final List jars)
{
- return new JarFileOrigin(jars, createClassLoader(jars));
+ return new JarFileOrigin(jars, createClassLoader(getClassLoaderName(jars), jars));
}
- private static URLClassLoader createClassLoader(final List jars)
+ /**
+ * Create a service origin for a named plugin consisting of a list of JAR files.
+ *
+ * @param name
+ * name of the plugin, used for the ClassLoader name
+ * @param jars
+ * list of paths to JAR files
+ * @return a service origin for the JAR files
+ */
+ // [impl->dsn~plugins.loading.configuration~1]
+ static ServiceOrigin forJars(final String name, final List jars)
+ {
+ return new JarFileOrigin(jars, createClassLoader("PluginClassLoader-" + name, jars));
+ }
+
+ private static URLClassLoader createClassLoader(final String name, final List jars)
{
final URL[] urls = jars.stream().map(ServiceOrigin::toUrl)
.toArray(URL[]::new);
- return new ChildFirstClassLoader(getClassLoaderName(jars), urls, getBaseClassLoader());
+ return new ChildFirstClassLoader(name, urls, getBaseClassLoader());
}
private static String getClassLoaderName(final List jars)
diff --git a/core/src/test/java/org/itsallcode/openfasttrace/core/OftBuilderTest.java b/core/src/test/java/org/itsallcode/openfasttrace/core/OftBuilderTest.java
new file mode 100644
index 000000000..c031565d1
--- /dev/null
+++ b/core/src/test/java/org/itsallcode/openfasttrace/core/OftBuilderTest.java
@@ -0,0 +1,49 @@
+package org.itsallcode.openfasttrace.core;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+// [utest->dsn~plugins.loading.configuration~1]
+class OftBuilderTest
+{
+ @TempDir
+ Path tempDir;
+
+ @Test
+ void buildCreatesOft() throws IOException
+ {
+ final Path jar = createJar("plugin.jar");
+ final Oft oft = Oft.builder().addPlugin("my-plugin", jar).build();
+ assertThat(oft, instanceOf(OftRunner.class));
+ }
+
+ @Test
+ void buildWithoutPluginsCreatesOft()
+ {
+ assertThat(Oft.builder().build(), notNullValue());
+ }
+
+ @Test
+ void addPluginRejectsInvalidJar()
+ {
+ final Path missing = tempDir.resolve("missing.jar");
+ final OftBuilder builder = Oft.builder();
+ assertThrows(IllegalArgumentException.class, () -> builder.addPlugin("my-plugin", missing));
+ }
+
+ private Path createJar(final String fileName) throws IOException
+ {
+ final Path jar = tempDir.resolve(fileName);
+ Files.createFile(jar);
+ return jar;
+ }
+}
diff --git a/core/src/test/java/org/itsallcode/openfasttrace/core/importer/ImporterFactoryLoaderClassloaderIT.java b/core/src/test/java/org/itsallcode/openfasttrace/core/importer/ImporterFactoryLoaderClassloaderIT.java
index 0f2e252cd..9752286ea 100644
--- a/core/src/test/java/org/itsallcode/openfasttrace/core/importer/ImporterFactoryLoaderClassloaderIT.java
+++ b/core/src/test/java/org/itsallcode/openfasttrace/core/importer/ImporterFactoryLoaderClassloaderIT.java
@@ -10,6 +10,7 @@
import org.itsallcode.openfasttrace.api.importer.ImporterException;
import org.itsallcode.openfasttrace.api.importer.input.InputFile;
import org.itsallcode.openfasttrace.api.importer.input.RealFileInput;
+import org.itsallcode.openfasttrace.core.serviceloader.ServiceLoaderConfig;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
@@ -41,7 +42,8 @@ final void testGetImporterFactoryThrowsExceptionWhenTcclIsLimited(@Mock final Im
try
{
Thread.currentThread().setContextClassLoader(limitedClassLoader);
- final ImporterFactoryLoader loaderWithLimitedTccl = new ImporterFactoryLoader(context);
+ final ImporterFactoryLoader loaderWithLimitedTccl = new ImporterFactoryLoader(context,
+ ServiceLoaderConfig.createDefault());
final InputFile file = RealFileInput.forPath(Paths.get("test.md"));
final ImporterException exception = assertThrows(ImporterException.class,
() -> loaderWithLimitedTccl.getImporterFactory(file));
diff --git a/core/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/PluginTest.java b/core/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/PluginTest.java
new file mode 100644
index 000000000..6d5c46433
--- /dev/null
+++ b/core/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/PluginTest.java
@@ -0,0 +1,110 @@
+package org.itsallcode.openfasttrace.core.serviceloader;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.jupiter.api.Assertions.assertAll;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+// [utest->dsn~plugins.loading.configuration~1]
+class PluginTest
+{
+ @TempDir
+ Path tempDir;
+
+ @Test
+ void testOfCreatesPluginWithNameAndJars() throws IOException
+ {
+ final Path jar = createJar("plugin.jar");
+ final Plugin plugin = Plugin.of("my-plugin", jar);
+ assertAll(
+ () -> assertThat(plugin.getName(), equalTo("my-plugin")),
+ () -> assertThat(plugin.getJars(), contains(jar)));
+ }
+
+ @Test
+ void testOfSupportsMultipleJars() throws IOException
+ {
+ final Path jar1 = createJar("plugin.jar");
+ final Path jar2 = createJar("dependency.jar");
+ final Plugin plugin = Plugin.of("my-plugin", jar1, jar2);
+ assertThat(plugin.getJars(), contains(jar1, jar2));
+ }
+
+ @Test
+ void testOfRejectsNullName() throws IOException
+ {
+ final Path jar = createJar("plugin.jar");
+ final IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
+ () -> Plugin.of(null, jar));
+ assertThat(exception.getMessage(), equalTo("Plugin name must not be null or blank."));
+ }
+
+ @Test
+ void testOfRejectsBlankName() throws IOException
+ {
+ final Path jar = createJar("plugin.jar");
+ final IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
+ () -> Plugin.of(" ", jar));
+ assertThat(exception.getMessage(), equalTo("Plugin name must not be null or blank."));
+ }
+
+ @Test
+ void testOfRejectsEmptyJarList()
+ {
+ final IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
+ () -> Plugin.of("my-plugin"));
+ assertThat(exception.getMessage(), equalTo("At least one plugin JAR must be given for plugin 'my-plugin'."));
+ }
+
+ @Test
+ void testOfRejectsNullJar()
+ {
+ final IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
+ () -> Plugin.of("my-plugin", (Path) null));
+ assertThat(exception.getMessage(), equalTo("Plugin JAR path must not be null for plugin 'my-plugin'."));
+ }
+
+ @Test
+ void testOfRejectsMissingJar()
+ {
+ final Path missing = tempDir.resolve("missing.jar");
+ final IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
+ () -> Plugin.of("my-plugin", missing));
+ assertThat(exception.getMessage(),
+ equalTo("Plugin JAR '" + missing + "' of plugin 'my-plugin' does not exist or is not a file."));
+ }
+
+ @Test
+ void testOfRejectsNonJarFile() throws IOException
+ {
+ final Path file = tempDir.resolve("plugin.txt");
+ Files.createFile(file);
+ final IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
+ () -> Plugin.of("my-plugin", file));
+ assertThat(exception.getMessage(),
+ equalTo("Plugin file '" + file + "' of plugin 'my-plugin' is not a JAR file."));
+ }
+
+ @Test
+ void testEqualsContract()
+ {
+ EqualsVerifier.forClass(Plugin.class).verify();
+ }
+
+ private Path createJar(final String fileName) throws IOException
+ {
+ final Path jar = tempDir.resolve(fileName);
+ Files.createFile(jar);
+ return jar;
+ }
+}
diff --git a/core/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderFactoryTest.java b/core/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderFactoryTest.java
index 2741e34d8..c587fe6f0 100644
--- a/core/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderFactoryTest.java
+++ b/core/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderFactoryTest.java
@@ -20,6 +20,9 @@ class ServiceLoaderFactoryTest
@TempDir
Path tempDir;
+ @TempDir
+ Path configuredJarsDir;
+
@Test
void noPluginJar()
{
@@ -28,14 +31,22 @@ void noPluginJar()
private ServiceLoaderFactory factory()
{
- return new ServiceLoaderFactory(tempDir, true);
+ return new ServiceLoaderFactory(config(tempDir, true));
+ }
+
+ private static ServiceLoaderConfig config(final Path pluginsDirectory, final boolean searchCurrentClasspath)
+ {
+ return ServiceLoaderConfig.builder()
+ .pluginsDirectory(pluginsDirectory)
+ .searchCurrentClasspath(searchCurrentClasspath)
+ .build();
}
@Test
void findServiceSkipCurrentClassLoader()
{
final Path missingDirectory = tempDir.resolve("missing-dir");
- assertThat(new ServiceLoaderFactory(missingDirectory, false).findServiceOrigins(), empty());
+ assertThat(new ServiceLoaderFactory(config(missingDirectory, false)).findServiceOrigins(), empty());
}
@Test
@@ -123,9 +134,71 @@ void findServiceOriginsMultiPlugins() throws IOException
Files.createFile(pluginDir2.resolve("plugin2.jar"));
final List origins = factory().findServiceOrigins();
assertAll(() -> assertThat(origins, hasSize(3)),
- () -> assertThat(origins.get(0).getClassLoader().getName(),
- equalTo("JarClassLoader-plugin1.jar")),
- () -> assertThat(origins.get(1).getClassLoader().getName(),
- equalTo("JarClassLoader-plugin2.jar")));
+ () -> assertThat(origins.get(0).getClassLoader().getName(), equalTo("JarClassLoader-plugin1.jar")),
+ () -> assertThat(origins.get(1).getClassLoader().getName(), equalTo("JarClassLoader-plugin2.jar")));
+ }
+
+ // [utest->dsn~plugins.loading.configuration~1]
+ @Test
+ void findServiceOriginsConfiguredPlugin() throws IOException
+ {
+ final Path jar = createJar("configured.jar");
+ final ServiceLoaderFactory factory = new ServiceLoaderFactory(
+ config(tempDir, true).toBuilder().addPlugin(Plugin.of("my-plugin", jar)).build());
+ final List origins = factory.findServiceOrigins();
+ assertAll(() -> assertThat(origins, hasSize(2)),
+ () -> assertThat(origins.get(0).getClassLoader().getName(), equalTo("PluginClassLoader-my-plugin")));
+ }
+
+ // [utest->dsn~plugins.loading.configuration~1]
+ @Test
+ void findServiceOriginsConfiguredPluginWithMultipleJars() throws IOException
+ {
+ final Path jar1 = createJar("plugin.jar");
+ final Path jar2 = createJar("dependency.jar");
+ final ServiceLoaderFactory factory = new ServiceLoaderFactory(
+ config(tempDir, true).toBuilder().addPlugin(Plugin.of("my-plugin", jar1, jar2)).build());
+ final List origins = factory.findServiceOrigins();
+ assertAll(() -> assertThat(origins, hasSize(2)),
+ () -> assertThat(origins.get(0).getClassLoader().getName(), equalTo("PluginClassLoader-my-plugin")));
+ }
+
+ // [utest->dsn~plugins.loading.configuration~1]
+ @Test
+ void findServiceOriginsMultipleConfiguredPlugins() throws IOException
+ {
+ final Path jar1 = createJar("plugin1.jar");
+ final Path jar2 = createJar("plugin2.jar");
+ final ServiceLoaderFactory factory = new ServiceLoaderFactory(config(tempDir, true).toBuilder()
+ .addPlugin(Plugin.of("plugin-one", jar1))
+ .addPlugin(Plugin.of("plugin-two", jar2))
+ .build());
+ final List origins = factory.findServiceOrigins();
+ assertAll(() -> assertThat(origins, hasSize(3)),
+ () -> assertThat(origins.get(0).getClassLoader().getName(), equalTo("PluginClassLoader-plugin-one")),
+ () -> assertThat(origins.get(1).getClassLoader().getName(), equalTo("PluginClassLoader-plugin-two")));
+ }
+
+ // [utest->dsn~plugins.loading.configuration~1]
+ @Test
+ void findServiceOriginsConfiguredPluginsAppendedAfterPluginDirectory() throws IOException
+ {
+ final Path pluginDir = tempDir.resolve("plugin1");
+ Files.createDirectories(pluginDir);
+ Files.createFile(pluginDir.resolve("plugin1.jar"));
+ final Path configuredJar = createJar("configured.jar");
+ final ServiceLoaderFactory factory = new ServiceLoaderFactory(
+ config(tempDir, true).toBuilder().addPlugin(Plugin.of("configured", configuredJar)).build());
+ final List origins = factory.findServiceOrigins();
+ assertAll(() -> assertThat(origins, hasSize(3)),
+ () -> assertThat(origins.get(0).getClassLoader().getName(), equalTo("JarClassLoader-plugin1.jar")),
+ () -> assertThat(origins.get(1).getClassLoader().getName(), equalTo("PluginClassLoader-configured")));
+ }
+
+ private Path createJar(final String fileName) throws IOException
+ {
+ final Path jar = configuredJarsDir.resolve(fileName);
+ Files.createFile(jar);
+ return jar;
}
}
diff --git a/doc/changes/changes_4.11.0.md b/doc/changes/changes_4.11.0.md
index 2e3958bee..3b80d4383 100644
--- a/doc/changes/changes_4.11.0.md
+++ b/doc/changes/changes_4.11.0.md
@@ -1,23 +1,26 @@
-# OpenFastTrace 4.11.0, released 2026-09-??
+# OpenFastTrace 4.11.0, released 2026-10-??
-Code name: Visual Basic tag importer and documentation improvement
+Code name: Configurable Plugins
## Summary
+OFT now allows embedders to pass plugin JARs to OFT at runtime through the Java API, so plugins
+resolved through an external dependency mechanism no longer need to be installed in the
+predefined plugin directory.
+
The source tag importer now supports Visual Basic (`.vb`) source files.
The user guide documentation now has automatic lateral navigation.
-Fix typo and syntax in agent skills.
-
-## Feature
+## Features
-- #612: Add support for Visual Basic in the source tag importer
+* #610: Allow adding plugins via configuration using `Oft.builder().addPlugin(name, jars...)`
+* #612: Add support for Visual Basic in the source tag importer
## Documentation
-- #604: Fixed link to Product Lifecycle in SECURITY.md
-- #605: Added automatic lateral navigation to the user guide documentation
-- #606: Fixed typo in AGENTS.md for "functions"
-- #608: Fixed formatting and updated links in README.md
-- #614: Fixed markdown syntax in the AI agent skill
+* #604: Fixed link to Product Lifecycle in SECURITY.md
+* #605: Added automatic lateral navigation to the user guide documentation
+* #606: Fixed typo in AGENTS.md for "functions"
+* #608: Fixed formatting and updated links in README.md
+* #614: Fixed markdown syntax in the AI agent skill
diff --git a/doc/changesets/610-allow-adding-plugins-via-configuration.md b/doc/changesets/610-allow-adding-plugins-via-configuration.md
new file mode 100644
index 000000000..d68170b04
--- /dev/null
+++ b/doc/changesets/610-allow-adding-plugins-via-configuration.md
@@ -0,0 +1,124 @@
+# GH-610 Allow Adding Plugins via Configuration
+
+## Goal
+
+Provide a public, programmatic way to pass plugin JAR paths to OFT at runtime so that
+embedders (e.g. the `openfasttrace-gradle` plugin, which resolves `pluginDependencies`
+through a Gradle configuration) no longer need the fragile workaround of replacing the
+thread context class loader (TCCL) with a child-first loader and copying OFT's built-in
+provider JARs into it.
+
+Today OFT can only discover third-party plugins from the fixed directory
+`$HOME/.oft/plugins//*.jar`. `ServiceLoaderFactory` is package-private and
+hardcodes that directory, `InitializingServiceLoader.load(Class, C)` accepts no plugin
+locations, and `ClassPathServiceLoader.filterOtherClassLoader` rejects any service whose
+class loader differs from the origin's. As a result, embedders that resolve plugins through
+their own dependency mechanism cannot register them without breaking built-in importing and
+reporting.
+
+## Scope
+
+In scope:
+
+* A public builder API in `core` to configure plugin JARs: `Oft.builder().addPlugin(name, jars...).build()`.
+* Support for **multiple JARs per plugin**: each `addPlugin(String name, Path... jars)` call forms
+ one named plugin loaded through a single `ChildFirstClassLoader`, matching the existing
+ `$HOME/.oft/plugins//*.jar` semantics.
+* Support for **multiple plugins in one configured plugin**: a plugin's JARs may contain several
+ service providers, and OFT loads all of them.
+* A `ServiceLoaderConfig` object that collects the service loader settings (plugin directory,
+ class path search, configured plugins) so the service loader API stays stable when new options
+ are added.
+* Explicitly configured plugins are loaded **in addition to** the default plugin directory.
+* Built-in providers continue to load from the current class path, so configuring a plugin
+ no longer makes built-in importers/exporters/reporters disappear.
+* Programmatic configuration only (no CLI flags).
+
+Out of scope:
+
+* CLI options for plugin configuration.
+* Replacing or disabling the default `$HOME/.oft/plugins` discovery.
+* Changing how built-in providers are discovered.
+* Changing plugin packaging or the plugin developer contract.
+
+## Design References
+
+* [System Requirements](../spec/system_requirements.md)
+* [Quality Requirements](../spec/design/quality_requirements.md)
+* [Design](../spec/design.md) — "Discovering and Loading Plugins"
+
+## Strategy
+
+Keep the existing plugin-loading internals (`ServiceLoaderFactory`, `ServiceOrigin`,
+`ChildFirstClassLoader`, `ClassPathServiceLoader`) unchanged in behavior and continue to
+hide them behind the package-private boundary. Thread the configured plugin groups from the
+public facade down to the three factory loaders:
+
+1. `OftBuilder` (new, public, in `core`) collects named plugins and builds an `OftRunner`
+ backed by a `ServiceFactory` that carries a `ServiceLoaderConfig`.
+2. `ServiceFactory` passes the `ServiceLoaderConfig` to `ImporterFactoryLoader`,
+ `ExporterFactoryLoader`, and `ReporterFactoryLoader`.
+3. Those loaders call a new public `InitializingServiceLoader.load(Class, C, ServiceLoaderConfig)`
+ overload, which builds a `ServiceLoaderFactory` that appends one `ServiceOrigin.forJars(name, jars)`
+ per configured plugin after the default-directory origins.
+
+`Oft.create()` remains for backward compatibility and delegates to the builder with no
+configured plugins. Validation of configured paths happens in `Plugin.of(...)` so invalid input
+is rejected at the API boundary.
+
+## Task List
+
+- [ ] Create and checkout a new Git branch `feature/610_allow_adding_plugins_via_configuration`
+
+### Requirements And Design
+
+- [ ] Add `req~plugins.loading.configuration~1` to `doc/spec/system_requirements.md` under
+ "Third Party Plugins" (Covers `feat~plugins~1`, Needs dsn)
+- [ ] Stop and ask user for a review of the system requirements
+- [ ] Add `dsn~plugins.loading.configuration~1` to `doc/spec/design.md` under
+ "Discovering and Loading Plugins" (Covers the new requirement, Needs impl, utest, itest),
+ documenting additive semantics, one class loader per configured plugin, and preservation
+ of built-in providers
+- [ ] Stop and ask user for a review of the design
+
+### Implementation
+
+- [ ] Add public `Plugin` type in `core` with `Plugin.of(String name, Path... jars)` (reject
+ null/blank name, empty JAR list, and non-existent or non-`.jar` paths with
+ `IllegalArgumentException`)
+- [ ] Add public `ServiceLoaderConfig` in `core` collecting the plugin directory, class path
+ search flag, and configured plugins, with a builder and `toBuilder()`
+- [ ] Add public `OftBuilder` in `core` with `addPlugin(String name, Path... jars)` and `build()`
+- [ ] Add `Oft.builder()` returning `OftBuilder`; keep `Oft.create()` delegating to the builder
+- [ ] Refactor `ServiceLoaderFactory` to consume `ServiceLoaderConfig` and append one
+ `ServiceOrigin.forJars(name, jars)` per configured plugin in `findServiceOrigins()`
+- [ ] Add public `InitializingServiceLoader.load(Class, C, ServiceLoaderConfig)` overload
+- [ ] Add constructor overloads to `ImporterFactoryLoader`, `ExporterFactoryLoader`, and
+ `ReporterFactoryLoader` that accept a `ServiceLoaderConfig`
+- [ ] Add `ServiceFactory(ServiceLoaderConfig)` constructor and keep the no-arg constructor
+ for `Oft.create()`
+
+### Verification
+
+- [ ] `ServiceLoaderFactoryTest`: configured plugin produces a named origin; multiple JARs in
+ one plugin share one origin; multiple configured plugins produce multiple origins;
+ configured origins are appended after default-directory origins
+- [ ] `InitializingServiceLoaderTest`: the new overload forwards the service loader configuration
+- [ ] New `PluginTest`: parameter validation (null/blank name, empty, missing, non-JAR)
+- [ ] New `OftBuilderTest`: build wiring
+- [ ] `ServiceLoaderFactoryIT` (product): load a real plugin JAR from a configured path and
+ assert the plugin loads while built-in reporters remain available; load two plugins from
+ one `addPlugin(...)` call and assert both are loaded
+- [ ] Keep the OpenFastTrace trace clean (`./oft-self-trace.sh`)
+- [ ] Keep required build and plugin verification tasks green (`mvn -T 1C verify`)
+
+### Update user documentation
+
+- [ ] Document `Oft.builder().addPlugin(...)` in `doc/user_guide/oft_api/using_oft_from_java.md`
+- [ ] Mention programmatic plugin configuration in `doc/plugins.md`
+
+## Version and Changelog Update
+
+- [ ] Raise the version to 4.11.0 (this is a feature release)
+- [ ] Write the changelog entry for 4.11.0 in `doc/changes/changes_4.11.0.md` and link it from
+ `doc/changes/changes.md`
diff --git a/doc/developer_guide/developer_guide.md b/doc/developer_guide/developer_guide.md
index e0ff80f6e..24339e809 100644
--- a/doc/developer_guide/developer_guide.md
+++ b/doc/developer_guide/developer_guide.md
@@ -26,7 +26,7 @@ To use OpenFastTrace as a dependency in your [Maven](https://maven.apache.org) p
org.itsallcode.openfasttrace
openfasttrace
- 4.9.0
+ 4.11.0
compile
@@ -38,7 +38,7 @@ To use OpenFastTrace as a dependency in your [Gradle](https://gradle.org/) proje
```groovy
dependencies {
- compile "org.itsallcode.openfasttrace:openfasttrace:4.9.0"
+ compile "org.itsallcode.openfasttrace:openfasttrace:4.11.0"
}
```
diff --git a/doc/spec/design.md b/doc/spec/design.md
index dbb96da42..4fe0b01d7 100644
--- a/doc/spec/design.md
+++ b/doc/spec/design.md
@@ -192,6 +192,39 @@ Covers:
Needs: impl, utest, itest
+### Configuring Plugins Programmatically
+`dsn~plugins.loading.configuration~1`
+
+API users configure additional plugins via `Oft.builder().addPlugin(String name, Path... jars).build()`.
+
+Each `addPlugin(...)` call defines one named plugin consisting of one or more JAR files. OFT
+loads each configured plugin through a single separate ClassLoader, matching the semantics of
+a plugin directory under `$HOME/.oft/plugins//`. A plugin's JAR files may contain
+one or more service providers; OFT loads all of them.
+
+The plugin configuration is collected in a `ServiceLoaderConfig` object that is passed to the
+service loader. This object also holds the other service loader settings (the plugin directory
+and whether the current class path is searched), so that additional options can be added
+without changing the service loader API.
+
+Configured plugins are loaded in addition to the plugins discovered from the default
+locations. Plugins included with OFT are still loaded from the current ClassPath, so
+configuring a plugin does not remove the built-in importers, exporters, and reporters.
+
+Rationale:
+
+* Embedders that resolve plugins through their own dependency mechanism cannot install them
+ in the predefined directory.
+* Grouping JARs per plugin preserves the class loader isolation between plugins.
+* A dedicated configuration object keeps the service loader API stable when new options are
+ added.
+
+Covers:
+
+* [`req~plugins.loading.configuration~1`](system_requirements.md#configuring-plugins-programmatically)
+
+Needs: impl, utest, itest
+
### Plugin Loader Uses Separate ClassLoaders
`dsn~plugins.loading.separate-classloader~1`
diff --git a/doc/spec/system_requirements.md b/doc/spec/system_requirements.md
index 6d96d0d3b..223638097 100644
--- a/doc/spec/system_requirements.md
+++ b/doc/spec/system_requirements.md
@@ -1102,6 +1102,26 @@ Covers:
Needs: dsn
+#### Configuring Plugins Programmatically
+`req~plugins.loading.configuration~1`
+
+Embedders using the OFT Java API can pass named plugins to OFT at runtime instead of relying
+on the predefined plugin installation directory. A plugin consists of a name and one or more
+JAR files.
+
+Rationale:
+
+* Embedders that resolve plugins through their own dependency mechanism (e.g. a build tool
+ plugin) cannot install them in the predefined directory.
+* A public API avoids fragile workarounds such as replacing the thread context class loader.
+* A plugin may consist of multiple JARs, so the API must allow grouping JARs into one plugin.
+* A plugin's JARs may contain multiple service providers that OFT must all load.
+
+Covers:
+* [feat~plugins~1](#third-party-plugins)
+
+Needs: dsn
+
#### Supported Plugin Types
`req~plugins.types~1`
diff --git a/doc/user_guide/oft_api/using_oft_from_java.md b/doc/user_guide/oft_api/using_oft_from_java.md
index 450b600ff..de056c817 100644
--- a/doc/user_guide/oft_api/using_oft_from_java.md
+++ b/doc/user_guide/oft_api/using_oft_from_java.md
@@ -124,3 +124,23 @@ Each of those classes comes with a builder which is called like this:
```java
ReportSettings settings = ReportSettings.builder().newline(Newline.UNIX).build();
```
+
+#### Adding Plugins From Java
+
+By default OFT loads plugins from the predefined plugin directory (see [Plugins](../../plugins.md)). When you embed OFT and resolve plugins through your own dependency mechanism, you can pass plugin JARs to OFT at runtime using the `Oft` builder:
+
+```java
+final Oft oft = Oft.builder()
+ .addPlugin("my-plugin", Path.of("path/to/my-plugin.jar"))
+ .build();
+```
+
+Each `addPlugin(name, jars...)` call defines one named plugin. All JARs passed in one call are loaded through the same separate ClassLoader, so you can pass a plugin together with its dependencies:
+
+```java
+final Oft oft = Oft.builder()
+ .addPlugin("my-plugin", Path.of("my-plugin.jar"), Path.of("my-plugin-dependency.jar"))
+ .build();
+```
+
+A plugin's JARs may contain multiple service providers (importers, exporters, reporters); OFT loads all of them. Configured plugins are loaded in addition to the plugins from the default plugin directory, and the built-in importers, exporters, and reporters remain available.
diff --git a/exporter/common/.settings/org.eclipse.jdt.core.prefs b/exporter/common/.settings/org.eclipse.jdt.core.prefs
index c033839cb..d7f2f9559 100644
--- a/exporter/common/.settings/org.eclipse.jdt.core.prefs
+++ b/exporter/common/.settings/org.eclipse.jdt.core.prefs
@@ -150,7 +150,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -158,6 +158,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/exporter/common/.settings/org.eclipse.jdt.ui.prefs b/exporter/common/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/exporter/common/.settings/org.eclipse.jdt.ui.prefs
+++ b/exporter/common/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/exporter/specobject/.settings/org.eclipse.jdt.core.prefs b/exporter/specobject/.settings/org.eclipse.jdt.core.prefs
index c033839cb..d7f2f9559 100644
--- a/exporter/specobject/.settings/org.eclipse.jdt.core.prefs
+++ b/exporter/specobject/.settings/org.eclipse.jdt.core.prefs
@@ -150,7 +150,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -158,6 +158,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/exporter/specobject/.settings/org.eclipse.jdt.ui.prefs b/exporter/specobject/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/exporter/specobject/.settings/org.eclipse.jdt.ui.prefs
+++ b/exporter/specobject/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/importer/gherkin/.settings/org.eclipse.jdt.core.prefs b/importer/gherkin/.settings/org.eclipse.jdt.core.prefs
index c033839cb..d7f2f9559 100644
--- a/importer/gherkin/.settings/org.eclipse.jdt.core.prefs
+++ b/importer/gherkin/.settings/org.eclipse.jdt.core.prefs
@@ -150,7 +150,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -158,6 +158,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/importer/gherkin/.settings/org.eclipse.jdt.ui.prefs b/importer/gherkin/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/importer/gherkin/.settings/org.eclipse.jdt.ui.prefs
+++ b/importer/gherkin/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/importer/lightweightmarkup/.settings/org.eclipse.jdt.core.prefs b/importer/lightweightmarkup/.settings/org.eclipse.jdt.core.prefs
index c033839cb..d7f2f9559 100644
--- a/importer/lightweightmarkup/.settings/org.eclipse.jdt.core.prefs
+++ b/importer/lightweightmarkup/.settings/org.eclipse.jdt.core.prefs
@@ -150,7 +150,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -158,6 +158,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/importer/lightweightmarkup/.settings/org.eclipse.jdt.ui.prefs b/importer/lightweightmarkup/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/importer/lightweightmarkup/.settings/org.eclipse.jdt.ui.prefs
+++ b/importer/lightweightmarkup/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/importer/markdown/.settings/org.eclipse.jdt.core.prefs b/importer/markdown/.settings/org.eclipse.jdt.core.prefs
index c033839cb..d7f2f9559 100644
--- a/importer/markdown/.settings/org.eclipse.jdt.core.prefs
+++ b/importer/markdown/.settings/org.eclipse.jdt.core.prefs
@@ -150,7 +150,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -158,6 +158,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/importer/markdown/.settings/org.eclipse.jdt.ui.prefs b/importer/markdown/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/importer/markdown/.settings/org.eclipse.jdt.ui.prefs
+++ b/importer/markdown/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/importer/restructuredtext/.settings/org.eclipse.jdt.core.prefs b/importer/restructuredtext/.settings/org.eclipse.jdt.core.prefs
index c033839cb..d7f2f9559 100644
--- a/importer/restructuredtext/.settings/org.eclipse.jdt.core.prefs
+++ b/importer/restructuredtext/.settings/org.eclipse.jdt.core.prefs
@@ -150,7 +150,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -158,6 +158,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/importer/restructuredtext/.settings/org.eclipse.jdt.ui.prefs b/importer/restructuredtext/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/importer/restructuredtext/.settings/org.eclipse.jdt.ui.prefs
+++ b/importer/restructuredtext/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/importer/specobject/.settings/org.eclipse.jdt.core.prefs b/importer/specobject/.settings/org.eclipse.jdt.core.prefs
index c033839cb..d7f2f9559 100644
--- a/importer/specobject/.settings/org.eclipse.jdt.core.prefs
+++ b/importer/specobject/.settings/org.eclipse.jdt.core.prefs
@@ -150,7 +150,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -158,6 +158,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/importer/specobject/.settings/org.eclipse.jdt.ui.prefs b/importer/specobject/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/importer/specobject/.settings/org.eclipse.jdt.ui.prefs
+++ b/importer/specobject/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/importer/tag-importer-common/.settings/org.eclipse.jdt.core.prefs b/importer/tag-importer-common/.settings/org.eclipse.jdt.core.prefs
index c033839cb..d7f2f9559 100644
--- a/importer/tag-importer-common/.settings/org.eclipse.jdt.core.prefs
+++ b/importer/tag-importer-common/.settings/org.eclipse.jdt.core.prefs
@@ -150,7 +150,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -158,6 +158,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/importer/tag-importer-common/.settings/org.eclipse.jdt.ui.prefs b/importer/tag-importer-common/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/importer/tag-importer-common/.settings/org.eclipse.jdt.ui.prefs
+++ b/importer/tag-importer-common/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/importer/tag/.settings/org.eclipse.jdt.core.prefs b/importer/tag/.settings/org.eclipse.jdt.core.prefs
index c033839cb..d7f2f9559 100644
--- a/importer/tag/.settings/org.eclipse.jdt.core.prefs
+++ b/importer/tag/.settings/org.eclipse.jdt.core.prefs
@@ -150,7 +150,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -158,6 +158,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/importer/tag/.settings/org.eclipse.jdt.ui.prefs b/importer/tag/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/importer/tag/.settings/org.eclipse.jdt.ui.prefs
+++ b/importer/tag/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/importer/xmlparser/.settings/org.eclipse.jdt.core.prefs b/importer/xmlparser/.settings/org.eclipse.jdt.core.prefs
index 8add83f71..974b88fd1 100644
--- a/importer/xmlparser/.settings/org.eclipse.jdt.core.prefs
+++ b/importer/xmlparser/.settings/org.eclipse.jdt.core.prefs
@@ -259,7 +259,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -267,6 +267,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/importer/xmlparser/.settings/org.eclipse.jdt.ui.prefs b/importer/xmlparser/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/importer/xmlparser/.settings/org.eclipse.jdt.ui.prefs
+++ b/importer/xmlparser/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/importer/zip/.settings/org.eclipse.jdt.core.prefs b/importer/zip/.settings/org.eclipse.jdt.core.prefs
index d209b54c4..d9c635a3b 100644
--- a/importer/zip/.settings/org.eclipse.jdt.core.prefs
+++ b/importer/zip/.settings/org.eclipse.jdt.core.prefs
@@ -158,7 +158,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -166,6 +166,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/importer/zip/.settings/org.eclipse.jdt.ui.prefs b/importer/zip/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/importer/zip/.settings/org.eclipse.jdt.ui.prefs
+++ b/importer/zip/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/parent/pom.xml b/parent/pom.xml
index 12d12c469..3b1cbe8b3 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -9,7 +9,7 @@
pom
https://github.com/itsallcode/openfasttrace
- 4.10.0
+ 4.11.0
17
6.1.0-M1
6.1.3
diff --git a/product/.settings/org.eclipse.jdt.core.prefs b/product/.settings/org.eclipse.jdt.core.prefs
index 7c61bbcba..3d2285dd2 100644
--- a/product/.settings/org.eclipse.jdt.core.prefs
+++ b/product/.settings/org.eclipse.jdt.core.prefs
@@ -257,7 +257,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -265,6 +265,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/product/.settings/org.eclipse.jdt.ui.prefs b/product/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/product/.settings/org.eclipse.jdt.ui.prefs
+++ b/product/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/product/src/test/java/org/itsallcode/openfasttrace/TestAllServicesAvailable.java b/product/src/test/java/org/itsallcode/openfasttrace/TestAllServicesAvailable.java
index 381bf5d63..4026abbec 100644
--- a/product/src/test/java/org/itsallcode/openfasttrace/TestAllServicesAvailable.java
+++ b/product/src/test/java/org/itsallcode/openfasttrace/TestAllServicesAvailable.java
@@ -22,6 +22,7 @@
import org.itsallcode.openfasttrace.core.exporter.ExporterFactoryLoader;
import org.itsallcode.openfasttrace.core.importer.ImporterFactoryLoader;
import org.itsallcode.openfasttrace.core.report.ReporterFactoryLoader;
+import org.itsallcode.openfasttrace.core.serviceloader.ServiceLoaderConfig;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.io.TempDir;
import org.junit.jupiter.params.ParameterizedTest;
@@ -50,21 +51,21 @@ private static ImporterFactoryLoader createImporterLoader()
final ImporterContext contextMock = mock(ImporterContext.class,
withSettings().defaultAnswer(Answers.RETURNS_DEEP_STUBS));
- return new ImporterFactoryLoader(contextMock);
+ return new ImporterFactoryLoader(contextMock, ServiceLoaderConfig.createDefault());
}
private static ExporterFactoryLoader createExporterLoader()
{
final ExporterContext contextMock = mock(ExporterContext.class,
withSettings().defaultAnswer(Answers.RETURNS_DEEP_STUBS));
- return new ExporterFactoryLoader(contextMock);
+ return new ExporterFactoryLoader(contextMock, ServiceLoaderConfig.createDefault());
}
private static ReporterFactoryLoader createReporterLoader()
{
final ReporterContext contextMock = mock(ReporterContext.class,
withSettings().defaultAnswer(Answers.RETURNS_DEEP_STUBS));
- return new ReporterFactoryLoader(contextMock);
+ return new ReporterFactoryLoader(contextMock, ServiceLoaderConfig.createDefault());
}
@ParameterizedTest
diff --git a/product/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderFactoryIT.java b/product/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderFactoryIT.java
index 5fcad73f3..59e81db0a 100644
--- a/product/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderFactoryIT.java
+++ b/product/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/ServiceLoaderFactoryIT.java
@@ -42,7 +42,46 @@ void loadServiceFromWrongJar() throws IOException
private Loader createLoader()
{
- return new ServiceLoaderFactory(tempDir, false).createLoader(ReporterFactory.class);
+ return new ServiceLoaderFactory(ServiceLoaderConfig.builder()
+ .pluginsDirectory(tempDir)
+ .searchCurrentClasspath(false)
+ .build()).createLoader(ReporterFactory.class);
+ }
+
+ // [itest->dsn~plugins.loading.configuration~1]
+ @Test
+ void loadMultiplePluginsFromOneConfiguredPlugin() throws IOException
+ {
+ final Path plaintextJar = findPluginJar(Path.of("../reporter/plaintext/target"),
+ Pattern.compile("openfasttrace-reporter-plaintext-\\d+\\.\\d+\\.\\d+\\.jar"));
+ final Path htmlJar = findPluginJar(Path.of("../reporter/html/target"),
+ Pattern.compile("openfasttrace-reporter-html-\\d+\\.\\d+\\.\\d+\\.jar"));
+ final ServiceLoaderConfig config = ServiceLoaderConfig.builder()
+ .pluginsDirectory(tempDir)
+ .searchCurrentClasspath(false)
+ .addPlugin(Plugin.of("reporters", plaintextJar, htmlJar))
+ .build();
+ try (Loader loader = new ServiceLoaderFactory(config).createLoader(ReporterFactory.class))
+ {
+ final List services = loader.load().toList();
+ final List serviceClassNames = services.stream()
+ .map(service -> service.getClass().getName())
+ .toList();
+ assertAll(
+ () -> assertThat(services, hasSize(2)),
+ () -> assertThat(serviceClassNames, hasItem(
+ "org.itsallcode.openfasttrace.report.plaintext.PlaintextReporterFactory")),
+ () -> assertThat(serviceClassNames, hasItem(
+ "org.itsallcode.openfasttrace.report.html.HtmlReporterFactory")));
+ }
+ }
+
+ private Path findPluginJar(final Path targetDir, final Pattern filePattern) throws IOException
+ {
+ return findMatchingFile(targetDir, filePattern)
+ .orElseThrow(() -> new AssertionError(
+ "Did not find file matching '" + filePattern + "' in '" + targetDir
+ + "'. Ensure the module was built with 'mvn package'."));
}
@Test
@@ -77,7 +116,8 @@ private void preparePlugin(final Path targetDir, final Pattern filePattern) thro
private Optional findMatchingFile(final Path dir, final Pattern filePattern) throws IOException
{
- try(final Stream files = Files.list(dir)) {
+ try (final Stream files = Files.list(dir))
+ {
return files.filter(file -> filePattern.matcher(file.getFileName().toString()).matches())
.findFirst();
}
diff --git a/product/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/TestInitializingServiceLoader.java b/product/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/TestInitializingServiceLoader.java
index 98ad3c447..ae8e2c8d0 100644
--- a/product/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/TestInitializingServiceLoader.java
+++ b/product/src/test/java/org/itsallcode/openfasttrace/core/serviceloader/TestInitializingServiceLoader.java
@@ -13,8 +13,8 @@
import org.itsallcode.openfasttrace.api.report.ReporterContext;
import org.itsallcode.openfasttrace.api.report.ReporterFactory;
import org.itsallcode.openfasttrace.exporter.specobject.SpecobjectExporterFactory;
-import org.itsallcode.openfasttrace.importer.markdown.MarkdownImporterFactory;
import org.itsallcode.openfasttrace.importer.gherkin.GherkinImporterFactory;
+import org.itsallcode.openfasttrace.importer.markdown.MarkdownImporterFactory;
import org.itsallcode.openfasttrace.importer.restructuredtext.RestructuredTextImporterFactory;
import org.itsallcode.openfasttrace.importer.specobject.SpecobjectImporterFactory;
import org.itsallcode.openfasttrace.importer.tag.TagImporterFactory;
@@ -36,7 +36,7 @@ void testNoServicesRegistered()
{
final Object context = new Object();
final Loader voidServiceLoader = InitializingServiceLoader
- .load(InitializableServiceStub.class, context);
+ .load(InitializableServiceStub.class, context, ServiceLoaderConfig.createDefault());
final List services = voidServiceLoader.load().toList();
assertThat(services, emptyIterable());
assertThat(voidServiceLoader.load().toList(), emptyIterable());
@@ -95,10 +95,10 @@ void testReporterFactoriesRegistered()
}
}
- private , C> List getRegisteredServices(final Class type,
- final C context)
+ private , C> List getRegisteredServices(final Class type, final C context)
{
- final Loader serviceLoader = InitializingServiceLoader.load(type, context);
+ final Loader serviceLoader = InitializingServiceLoader.load(type, context,
+ ServiceLoaderConfig.createDefault());
return serviceLoader.load().toList();
}
diff --git a/product/src/test/java/org/itsallcode/openfasttrace/report/TestReportService.java b/product/src/test/java/org/itsallcode/openfasttrace/report/TestReportService.java
index 79967154e..fd8664da1 100644
--- a/product/src/test/java/org/itsallcode/openfasttrace/report/TestReportService.java
+++ b/product/src/test/java/org/itsallcode/openfasttrace/report/TestReportService.java
@@ -18,6 +18,7 @@
import org.itsallcode.openfasttrace.api.report.*;
import org.itsallcode.openfasttrace.core.report.ReportService;
import org.itsallcode.openfasttrace.core.report.ReporterFactoryLoader;
+import org.itsallcode.openfasttrace.core.serviceloader.ServiceLoaderConfig;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.io.TempDir;
@@ -95,7 +96,8 @@ void testReportToIllegalPathThrowsReportExpection(@TempDir final Path tempDir)
private ReportService createService(final ReportSettings settings)
{
- return new ReportService(new ReporterFactoryLoader(new ReporterContext(settings)));
+ return new ReportService(
+ new ReporterFactoryLoader(new ReporterContext(settings), ServiceLoaderConfig.createDefault()));
}
private Path createReadOnlyFile(final Path tempDir) throws IOException
diff --git a/reporter/aspec/.settings/org.eclipse.jdt.core.prefs b/reporter/aspec/.settings/org.eclipse.jdt.core.prefs
index bfbe09007..6f26e9072 100644
--- a/reporter/aspec/.settings/org.eclipse.jdt.core.prefs
+++ b/reporter/aspec/.settings/org.eclipse.jdt.core.prefs
@@ -249,7 +249,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -257,6 +257,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/reporter/aspec/.settings/org.eclipse.jdt.ui.prefs b/reporter/aspec/.settings/org.eclipse.jdt.ui.prefs
index 8f5db901b..2dc86ae5a 100644
--- a/reporter/aspec/.settings/org.eclipse.jdt.ui.prefs
+++ b/reporter/aspec/.settings/org.eclipse.jdt.ui.prefs
@@ -1,147 +1,8 @@
cleanup_settings_version=2
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/reporter/html/.settings/org.eclipse.jdt.core.prefs b/reporter/html/.settings/org.eclipse.jdt.core.prefs
index bfbe09007..6f26e9072 100644
--- a/reporter/html/.settings/org.eclipse.jdt.core.prefs
+++ b/reporter/html/.settings/org.eclipse.jdt.core.prefs
@@ -249,7 +249,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -257,6 +257,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/reporter/html/.settings/org.eclipse.jdt.ui.prefs b/reporter/html/.settings/org.eclipse.jdt.ui.prefs
index 8f5db901b..2dc86ae5a 100644
--- a/reporter/html/.settings/org.eclipse.jdt.ui.prefs
+++ b/reporter/html/.settings/org.eclipse.jdt.ui.prefs
@@ -1,147 +1,8 @@
cleanup_settings_version=2
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/reporter/plaintext/.settings/org.eclipse.jdt.core.prefs b/reporter/plaintext/.settings/org.eclipse.jdt.core.prefs
index c033839cb..d7f2f9559 100644
--- a/reporter/plaintext/.settings/org.eclipse.jdt.core.prefs
+++ b/reporter/plaintext/.settings/org.eclipse.jdt.core.prefs
@@ -150,7 +150,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -158,6 +158,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/reporter/plaintext/.settings/org.eclipse.jdt.ui.prefs b/reporter/plaintext/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/reporter/plaintext/.settings/org.eclipse.jdt.ui.prefs
+++ b/reporter/plaintext/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false
diff --git a/testutil/.settings/org.eclipse.jdt.core.prefs b/testutil/.settings/org.eclipse.jdt.core.prefs
index e0ea780f8..1e0eb0bb9 100644
--- a/testutil/.settings/org.eclipse.jdt.core.prefs
+++ b/testutil/.settings/org.eclipse.jdt.core.prefs
@@ -249,7 +249,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
@@ -257,6 +257,7 @@ org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variabl
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_record_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
diff --git a/testutil/.settings/org.eclipse.jdt.ui.prefs b/testutil/.settings/org.eclipse.jdt.ui.prefs
index a23c50a8f..cd7ee8e5a 100644
--- a/testutil/.settings/org.eclipse.jdt.ui.prefs
+++ b/testutil/.settings/org.eclipse.jdt.ui.prefs
@@ -1,146 +1,7 @@
eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_itsallcode style
formatter_settings_version=23
org.eclipse.jdt.ui.ignorelowercasenames=true
org.eclipse.jdt.ui.importorder=java;javax;org;com;
org.eclipse.jdt.ui.ondemandthreshold=4
org.eclipse.jdt.ui.staticondemandthreshold=4
-sp_cleanup.add_all=false
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.array_with_curly=false
-sp_cleanup.arrays_fill=false
-sp_cleanup.bitwise_conditional_expression=false
-sp_cleanup.boolean_literal=false
-sp_cleanup.boolean_value_rather_than_comparison=false
-sp_cleanup.break_loop=false
-sp_cleanup.collection_cloning=false
-sp_cleanup.comparing_on_criteria=false
-sp_cleanup.comparison_statement=false
-sp_cleanup.controlflow_merge=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
-sp_cleanup.convert_to_switch_expressions=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.do_while_rather_than_while=false
-sp_cleanup.double_negation=false
-sp_cleanup.else_if=false
-sp_cleanup.embedded_if=false
-sp_cleanup.evaluate_nullable=false
-sp_cleanup.extract_increment=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.hash=false
-sp_cleanup.if_condition=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.instanceof=false
-sp_cleanup.instanceof_keyword=false
-sp_cleanup.invert_equals=false
-sp_cleanup.join=false
-sp_cleanup.lazy_logical_operator=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.map_cloning=false
-sp_cleanup.merge_conditional_blocks=false
-sp_cleanup.multi_catch=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.no_string_creation=false
-sp_cleanup.no_super=false
-sp_cleanup.number_suffix=false
-sp_cleanup.objects_equals=false
-sp_cleanup.on_save_use_additional_actions=true
-sp_cleanup.one_if_rather_than_duplicate_blocks_that_fall_through=false
-sp_cleanup.operand_factorization=false
-sp_cleanup.organize_imports=true
-sp_cleanup.overridden_assignment=false
-sp_cleanup.plain_replacement=false
-sp_cleanup.precompile_regex=false
-sp_cleanup.primitive_comparison=false
-sp_cleanup.primitive_parsing=false
-sp_cleanup.primitive_rather_than_wrapper=false
-sp_cleanup.primitive_serialization=false
-sp_cleanup.pull_out_if_from_if_else=false
-sp_cleanup.pull_up_assignment=false
-sp_cleanup.push_down_negation=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.reduce_indentation=false
-sp_cleanup.redundant_comparator=false
-sp_cleanup.redundant_falling_through_block_end=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_array_creation=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.return_expression=false
-sp_cleanup.simplify_lambda_expression_and_method_ref=false
-sp_cleanup.single_used_field=false
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.standard_comparison=false
-sp_cleanup.static_inner_class=false
-sp_cleanup.strictly_equal_or_different=false
-sp_cleanup.stringbuffer_to_stringbuilder=false
-sp_cleanup.stringbuilder=false
-sp_cleanup.stringbuilder_for_local_vars=false
-sp_cleanup.stringconcat_to_textblock=false
-sp_cleanup.substring=false
-sp_cleanup.switch=false
-sp_cleanup.system_property=false
-sp_cleanup.system_property_boolean=false
-sp_cleanup.system_property_file_encoding=false
-sp_cleanup.system_property_file_separator=false
-sp_cleanup.system_property_line_separator=false
-sp_cleanup.system_property_path_separator=false
-sp_cleanup.ternary_operator=false
-sp_cleanup.try_with_resource=false
-sp_cleanup.unlooped_while=false
-sp_cleanup.unreachable_block=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_autoboxing=false
-sp_cleanup.use_blocks=true
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_directly_map_method=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_string_is_blank=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-sp_cleanup.use_unboxing=false
-sp_cleanup.use_var=false
-sp_cleanup.useless_continue=false
-sp_cleanup.useless_return=false
-sp_cleanup.valueof_rather_than_instantiation=false