mirror of
https://github.com/CarmJos/EasyConfiguration.git
synced 2026-06-04 10:38:19 +08:00
style: Reformatted code with .editorconfig
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
# configured Javadoc
|
# configured Javadoc
|
||||||
|
|
||||||
Based on [Github Pages](https://pages.github.com/), please see [JavaDoc](https://carmjos.github.io/configured) 。
|
Based
|
||||||
|
on [Github Pages](https://pages.github.com/),
|
||||||
|
please
|
||||||
|
see [JavaDoc](https://carmjos.github.io/configured) 。
|
||||||
|
|||||||
+346
@@ -0,0 +1,346 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
indent_style = space
|
||||||
|
tab_width = 4
|
||||||
|
|
||||||
|
[*.java]
|
||||||
|
indent_size = 4
|
||||||
|
max_line_length = 120
|
||||||
|
ij_java_align_consecutive_assignments = false
|
||||||
|
ij_java_align_consecutive_variable_declarations = false
|
||||||
|
ij_java_align_group_field_declarations = false
|
||||||
|
ij_java_align_multiline_annotation_parameters = false
|
||||||
|
ij_java_align_multiline_array_initializer_expression = false
|
||||||
|
ij_java_align_multiline_assignment = false
|
||||||
|
ij_java_align_multiline_binary_operation = false
|
||||||
|
ij_java_align_multiline_chained_methods = false
|
||||||
|
ij_java_align_multiline_deconstruction_list_components = true
|
||||||
|
ij_java_align_multiline_extends_list = false
|
||||||
|
ij_java_align_multiline_for = true
|
||||||
|
ij_java_align_multiline_method_parentheses = false
|
||||||
|
ij_java_align_multiline_parameters = true
|
||||||
|
ij_java_align_multiline_parameters_in_calls = false
|
||||||
|
ij_java_align_multiline_parenthesized_expression = false
|
||||||
|
ij_java_align_multiline_records = true
|
||||||
|
ij_java_align_multiline_resources = true
|
||||||
|
ij_java_align_multiline_ternary_operation = false
|
||||||
|
ij_java_align_multiline_text_blocks = false
|
||||||
|
ij_java_align_multiline_throws_list = false
|
||||||
|
ij_java_align_subsequent_simple_methods = false
|
||||||
|
ij_java_align_throws_keyword = false
|
||||||
|
ij_java_align_types_in_multi_catch = true
|
||||||
|
ij_java_annotation_new_line_in_record_component = false
|
||||||
|
ij_java_annotation_parameter_wrap = off
|
||||||
|
ij_java_array_initializer_new_line_after_left_brace = false
|
||||||
|
ij_java_array_initializer_right_brace_on_new_line = false
|
||||||
|
ij_java_array_initializer_wrap = off
|
||||||
|
ij_java_assert_statement_colon_on_next_line = false
|
||||||
|
ij_java_assert_statement_wrap = off
|
||||||
|
ij_java_assignment_wrap = off
|
||||||
|
ij_java_binary_operation_sign_on_next_line = false
|
||||||
|
ij_java_binary_operation_wrap = off
|
||||||
|
ij_java_blank_lines_after_anonymous_class_header = 0
|
||||||
|
ij_java_blank_lines_after_class_header = 0
|
||||||
|
ij_java_blank_lines_after_imports = 1
|
||||||
|
ij_java_blank_lines_after_package = 1
|
||||||
|
ij_java_blank_lines_around_class = 1
|
||||||
|
ij_java_blank_lines_around_field = 0
|
||||||
|
ij_java_blank_lines_around_field_in_interface = 0
|
||||||
|
ij_java_blank_lines_around_field_with_annotations = 0
|
||||||
|
ij_java_blank_lines_around_initializer = 1
|
||||||
|
ij_java_blank_lines_around_method = 1
|
||||||
|
ij_java_blank_lines_around_method_in_interface = 1
|
||||||
|
ij_java_blank_lines_before_class_end = 0
|
||||||
|
ij_java_blank_lines_before_imports = 1
|
||||||
|
ij_java_blank_lines_before_method_body = 0
|
||||||
|
ij_java_blank_lines_before_package = 0
|
||||||
|
ij_java_blank_lines_between_record_components = 0
|
||||||
|
ij_java_block_brace_style = end_of_line
|
||||||
|
ij_java_block_comment_add_space = false
|
||||||
|
ij_java_block_comment_at_first_column = true
|
||||||
|
ij_java_builder_methods =
|
||||||
|
ij_java_call_parameters_new_line_after_left_paren = false
|
||||||
|
ij_java_call_parameters_right_paren_on_new_line = false
|
||||||
|
ij_java_call_parameters_wrap = off
|
||||||
|
ij_java_case_statement_on_separate_line = true
|
||||||
|
ij_java_catch_on_new_line = false
|
||||||
|
ij_java_class_annotation_wrap = split_into_lines
|
||||||
|
ij_java_class_brace_style = end_of_line
|
||||||
|
ij_java_class_count_to_use_import_on_demand = 5
|
||||||
|
ij_java_class_names_in_javadoc = 1
|
||||||
|
ij_java_deconstruction_list_wrap = normal
|
||||||
|
ij_java_do_not_indent_top_level_class_members = false
|
||||||
|
ij_java_do_not_wrap_after_single_annotation = false
|
||||||
|
ij_java_do_not_wrap_after_single_annotation_in_parameter = false
|
||||||
|
ij_java_do_while_brace_force = never
|
||||||
|
ij_java_doc_add_blank_line_after_description = true
|
||||||
|
ij_java_doc_add_blank_line_after_param_comments = false
|
||||||
|
ij_java_doc_add_blank_line_after_return = false
|
||||||
|
ij_java_doc_add_p_tag_on_empty_lines = true
|
||||||
|
ij_java_doc_align_exception_comments = true
|
||||||
|
ij_java_doc_align_param_comments = true
|
||||||
|
ij_java_doc_do_not_wrap_if_one_line = false
|
||||||
|
ij_java_doc_enable_formatting = true
|
||||||
|
ij_java_doc_enable_leading_asterisks = true
|
||||||
|
ij_java_doc_indent_on_continuation = false
|
||||||
|
ij_java_doc_keep_empty_lines = true
|
||||||
|
ij_java_doc_keep_empty_parameter_tag = true
|
||||||
|
ij_java_doc_keep_empty_return_tag = true
|
||||||
|
ij_java_doc_keep_empty_throws_tag = true
|
||||||
|
ij_java_doc_keep_invalid_tags = true
|
||||||
|
ij_java_doc_param_description_on_new_line = false
|
||||||
|
ij_java_doc_preserve_line_breaks = false
|
||||||
|
ij_java_doc_use_throws_not_exception_tag = true
|
||||||
|
ij_java_else_on_new_line = false
|
||||||
|
ij_java_entity_dd_prefix =
|
||||||
|
ij_java_entity_dd_suffix = EJB
|
||||||
|
ij_java_entity_eb_prefix =
|
||||||
|
ij_java_entity_eb_suffix = Bean
|
||||||
|
ij_java_entity_hi_prefix =
|
||||||
|
ij_java_entity_hi_suffix = Home
|
||||||
|
ij_java_entity_lhi_prefix = Local
|
||||||
|
ij_java_entity_lhi_suffix = Home
|
||||||
|
ij_java_entity_li_prefix = Local
|
||||||
|
ij_java_entity_li_suffix =
|
||||||
|
ij_java_entity_pk_class = java.lang.String
|
||||||
|
ij_java_entity_ri_prefix =
|
||||||
|
ij_java_entity_ri_suffix =
|
||||||
|
ij_java_entity_vo_prefix =
|
||||||
|
ij_java_entity_vo_suffix = VO
|
||||||
|
ij_java_enum_constants_wrap = off
|
||||||
|
ij_java_enum_field_annotation_wrap = off
|
||||||
|
ij_java_extends_keyword_wrap = off
|
||||||
|
ij_java_extends_list_wrap = off
|
||||||
|
ij_java_field_annotation_wrap = split_into_lines
|
||||||
|
ij_java_field_name_prefix =
|
||||||
|
ij_java_field_name_suffix =
|
||||||
|
ij_java_filter_class_prefix =
|
||||||
|
ij_java_filter_class_suffix =
|
||||||
|
ij_java_filter_dd_prefix =
|
||||||
|
ij_java_filter_dd_suffix =
|
||||||
|
ij_java_finally_on_new_line = false
|
||||||
|
ij_java_for_brace_force = never
|
||||||
|
ij_java_for_statement_new_line_after_left_paren = false
|
||||||
|
ij_java_for_statement_right_paren_on_new_line = false
|
||||||
|
ij_java_for_statement_wrap = off
|
||||||
|
ij_java_generate_final_locals = false
|
||||||
|
ij_java_generate_final_parameters = false
|
||||||
|
ij_java_generate_use_type_annotation_before_type = true
|
||||||
|
ij_java_if_brace_force = never
|
||||||
|
ij_java_imports_layout = @*, *, |, javax.**, java.**, |, $*
|
||||||
|
ij_java_indent_case_from_switch = true
|
||||||
|
ij_java_insert_inner_class_imports = false
|
||||||
|
ij_java_insert_override_annotation = true
|
||||||
|
ij_java_keep_blank_lines_before_right_brace = 2
|
||||||
|
ij_java_keep_blank_lines_between_package_declaration_and_header = 2
|
||||||
|
ij_java_keep_blank_lines_in_code = 2
|
||||||
|
ij_java_keep_blank_lines_in_declarations = 2
|
||||||
|
ij_java_keep_builder_methods_indents = false
|
||||||
|
ij_java_keep_control_statement_in_one_line = true
|
||||||
|
ij_java_keep_first_column_comment = true
|
||||||
|
ij_java_keep_indents_on_empty_lines = false
|
||||||
|
ij_java_keep_line_breaks = true
|
||||||
|
ij_java_keep_multiple_expressions_in_one_line = false
|
||||||
|
ij_java_keep_simple_blocks_in_one_line = false
|
||||||
|
ij_java_keep_simple_classes_in_one_line = false
|
||||||
|
ij_java_keep_simple_lambdas_in_one_line = false
|
||||||
|
ij_java_keep_simple_methods_in_one_line = false
|
||||||
|
ij_java_label_indent_absolute = false
|
||||||
|
ij_java_label_indent_size = 0
|
||||||
|
ij_java_lambda_brace_style = end_of_line
|
||||||
|
ij_java_layout_on_demand_import_from_same_package_first = true
|
||||||
|
ij_java_layout_static_imports_separately = true
|
||||||
|
ij_java_line_comment_add_space = false
|
||||||
|
ij_java_line_comment_add_space_on_reformat = false
|
||||||
|
ij_java_line_comment_at_first_column = true
|
||||||
|
ij_java_listener_class_prefix =
|
||||||
|
ij_java_listener_class_suffix =
|
||||||
|
ij_java_local_variable_name_prefix =
|
||||||
|
ij_java_local_variable_name_suffix =
|
||||||
|
ij_java_message_dd_prefix =
|
||||||
|
ij_java_message_dd_suffix = EJB
|
||||||
|
ij_java_message_eb_prefix =
|
||||||
|
ij_java_message_eb_suffix = Bean
|
||||||
|
ij_java_method_annotation_wrap = split_into_lines
|
||||||
|
ij_java_method_brace_style = end_of_line
|
||||||
|
ij_java_method_call_chain_wrap = off
|
||||||
|
ij_java_method_parameters_new_line_after_left_paren = false
|
||||||
|
ij_java_method_parameters_right_paren_on_new_line = false
|
||||||
|
ij_java_method_parameters_wrap = off
|
||||||
|
ij_java_modifier_list_wrap = false
|
||||||
|
ij_java_multi_catch_types_wrap = normal
|
||||||
|
ij_java_names_count_to_use_import_on_demand = 3
|
||||||
|
ij_java_new_line_after_lparen_in_annotation = false
|
||||||
|
ij_java_new_line_after_lparen_in_deconstruction_pattern = true
|
||||||
|
ij_java_new_line_after_lparen_in_record_header = false
|
||||||
|
ij_java_new_line_when_body_is_presented = false
|
||||||
|
ij_java_packages_to_use_import_on_demand = java.awt.*, javax.swing.*
|
||||||
|
ij_java_parameter_annotation_wrap = off
|
||||||
|
ij_java_parameter_name_prefix =
|
||||||
|
ij_java_parameter_name_suffix =
|
||||||
|
ij_java_parentheses_expression_new_line_after_left_paren = false
|
||||||
|
ij_java_parentheses_expression_right_paren_on_new_line = false
|
||||||
|
ij_java_place_assignment_sign_on_next_line = false
|
||||||
|
ij_java_prefer_longer_names = true
|
||||||
|
ij_java_prefer_parameters_wrap = false
|
||||||
|
ij_java_preserve_module_imports = true
|
||||||
|
ij_java_record_components_wrap = normal
|
||||||
|
ij_java_repeat_annotations =
|
||||||
|
ij_java_repeat_synchronized = true
|
||||||
|
ij_java_replace_instanceof_and_cast = false
|
||||||
|
ij_java_replace_null_check = true
|
||||||
|
ij_java_replace_sum_lambda_with_method_ref = true
|
||||||
|
ij_java_resource_list_new_line_after_left_paren = false
|
||||||
|
ij_java_resource_list_right_paren_on_new_line = false
|
||||||
|
ij_java_resource_list_wrap = off
|
||||||
|
ij_java_rparen_on_new_line_in_annotation = false
|
||||||
|
ij_java_rparen_on_new_line_in_deconstruction_pattern = true
|
||||||
|
ij_java_rparen_on_new_line_in_record_header = false
|
||||||
|
ij_java_servlet_class_prefix =
|
||||||
|
ij_java_servlet_class_suffix =
|
||||||
|
ij_java_servlet_dd_prefix =
|
||||||
|
ij_java_servlet_dd_suffix =
|
||||||
|
ij_java_session_dd_prefix =
|
||||||
|
ij_java_session_dd_suffix = EJB
|
||||||
|
ij_java_session_eb_prefix =
|
||||||
|
ij_java_session_eb_suffix = Bean
|
||||||
|
ij_java_session_hi_prefix =
|
||||||
|
ij_java_session_hi_suffix = Home
|
||||||
|
ij_java_session_lhi_prefix = Local
|
||||||
|
ij_java_session_lhi_suffix = Home
|
||||||
|
ij_java_session_li_prefix = Local
|
||||||
|
ij_java_session_li_suffix =
|
||||||
|
ij_java_session_ri_prefix =
|
||||||
|
ij_java_session_ri_suffix =
|
||||||
|
ij_java_session_si_prefix =
|
||||||
|
ij_java_session_si_suffix = Service
|
||||||
|
ij_java_space_after_closing_angle_bracket_in_type_argument = false
|
||||||
|
ij_java_space_after_colon = true
|
||||||
|
ij_java_space_after_comma = true
|
||||||
|
ij_java_space_after_comma_in_type_arguments = true
|
||||||
|
ij_java_space_after_for_semicolon = true
|
||||||
|
ij_java_space_after_quest = true
|
||||||
|
ij_java_space_after_type_cast = true
|
||||||
|
ij_java_space_before_annotation_array_initializer_left_brace = false
|
||||||
|
ij_java_space_before_annotation_parameter_list = false
|
||||||
|
ij_java_space_before_array_initializer_left_brace = false
|
||||||
|
ij_java_space_before_catch_keyword = true
|
||||||
|
ij_java_space_before_catch_left_brace = true
|
||||||
|
ij_java_space_before_catch_parentheses = true
|
||||||
|
ij_java_space_before_class_left_brace = true
|
||||||
|
ij_java_space_before_colon = true
|
||||||
|
ij_java_space_before_colon_in_foreach = true
|
||||||
|
ij_java_space_before_comma = false
|
||||||
|
ij_java_space_before_deconstruction_list = false
|
||||||
|
ij_java_space_before_do_left_brace = true
|
||||||
|
ij_java_space_before_else_keyword = true
|
||||||
|
ij_java_space_before_else_left_brace = true
|
||||||
|
ij_java_space_before_finally_keyword = true
|
||||||
|
ij_java_space_before_finally_left_brace = true
|
||||||
|
ij_java_space_before_for_left_brace = true
|
||||||
|
ij_java_space_before_for_parentheses = true
|
||||||
|
ij_java_space_before_for_semicolon = false
|
||||||
|
ij_java_space_before_if_left_brace = true
|
||||||
|
ij_java_space_before_if_parentheses = true
|
||||||
|
ij_java_space_before_method_call_parentheses = false
|
||||||
|
ij_java_space_before_method_left_brace = true
|
||||||
|
ij_java_space_before_method_parentheses = false
|
||||||
|
ij_java_space_before_opening_angle_bracket_in_type_parameter = false
|
||||||
|
ij_java_space_before_quest = true
|
||||||
|
ij_java_space_before_switch_left_brace = true
|
||||||
|
ij_java_space_before_switch_parentheses = true
|
||||||
|
ij_java_space_before_synchronized_left_brace = true
|
||||||
|
ij_java_space_before_synchronized_parentheses = true
|
||||||
|
ij_java_space_before_try_left_brace = true
|
||||||
|
ij_java_space_before_try_parentheses = true
|
||||||
|
ij_java_space_before_type_parameter_list = false
|
||||||
|
ij_java_space_before_while_keyword = true
|
||||||
|
ij_java_space_before_while_left_brace = true
|
||||||
|
ij_java_space_before_while_parentheses = true
|
||||||
|
ij_java_space_inside_one_line_enum_braces = false
|
||||||
|
ij_java_space_within_empty_array_initializer_braces = false
|
||||||
|
ij_java_space_within_empty_method_call_parentheses = false
|
||||||
|
ij_java_space_within_empty_method_parentheses = false
|
||||||
|
ij_java_spaces_around_additive_operators = true
|
||||||
|
ij_java_spaces_around_annotation_eq = true
|
||||||
|
ij_java_spaces_around_assignment_operators = true
|
||||||
|
ij_java_spaces_around_bitwise_operators = true
|
||||||
|
ij_java_spaces_around_equality_operators = true
|
||||||
|
ij_java_spaces_around_lambda_arrow = true
|
||||||
|
ij_java_spaces_around_logical_operators = true
|
||||||
|
ij_java_spaces_around_method_ref_dbl_colon = false
|
||||||
|
ij_java_spaces_around_multiplicative_operators = true
|
||||||
|
ij_java_spaces_around_relational_operators = true
|
||||||
|
ij_java_spaces_around_shift_operators = true
|
||||||
|
ij_java_spaces_around_type_bounds_in_type_parameters = true
|
||||||
|
ij_java_spaces_around_unary_operator = false
|
||||||
|
ij_java_spaces_inside_block_braces_when_body_is_present = false
|
||||||
|
ij_java_spaces_within_angle_brackets = false
|
||||||
|
ij_java_spaces_within_annotation_parentheses = false
|
||||||
|
ij_java_spaces_within_array_initializer_braces = false
|
||||||
|
ij_java_spaces_within_braces = false
|
||||||
|
ij_java_spaces_within_brackets = false
|
||||||
|
ij_java_spaces_within_cast_parentheses = false
|
||||||
|
ij_java_spaces_within_catch_parentheses = false
|
||||||
|
ij_java_spaces_within_deconstruction_list = false
|
||||||
|
ij_java_spaces_within_for_parentheses = false
|
||||||
|
ij_java_spaces_within_if_parentheses = false
|
||||||
|
ij_java_spaces_within_method_call_parentheses = false
|
||||||
|
ij_java_spaces_within_method_parentheses = false
|
||||||
|
ij_java_spaces_within_parentheses = false
|
||||||
|
ij_java_spaces_within_record_header = false
|
||||||
|
ij_java_spaces_within_switch_parentheses = false
|
||||||
|
ij_java_spaces_within_synchronized_parentheses = false
|
||||||
|
ij_java_spaces_within_try_parentheses = false
|
||||||
|
ij_java_spaces_within_while_parentheses = false
|
||||||
|
ij_java_special_else_if_treatment = true
|
||||||
|
ij_java_static_field_name_prefix =
|
||||||
|
ij_java_static_field_name_suffix =
|
||||||
|
ij_java_subclass_name_prefix =
|
||||||
|
ij_java_subclass_name_suffix = Impl
|
||||||
|
ij_java_switch_expressions_wrap = normal
|
||||||
|
ij_java_ternary_operation_signs_on_next_line = false
|
||||||
|
ij_java_ternary_operation_wrap = off
|
||||||
|
ij_java_test_name_prefix =
|
||||||
|
ij_java_test_name_suffix = Test
|
||||||
|
ij_java_throws_keyword_wrap = off
|
||||||
|
ij_java_throws_list_wrap = off
|
||||||
|
ij_java_use_external_annotations = false
|
||||||
|
ij_java_use_fq_class_names = false
|
||||||
|
ij_java_use_relative_indents = false
|
||||||
|
ij_java_use_single_class_imports = true
|
||||||
|
ij_java_variable_annotation_wrap = off
|
||||||
|
ij_java_visibility = public
|
||||||
|
ij_java_while_brace_force = never
|
||||||
|
ij_java_while_on_new_line = false
|
||||||
|
ij_java_wrap_comments = false
|
||||||
|
ij_java_wrap_first_method_in_call_chain = false
|
||||||
|
ij_java_wrap_long_lines = false
|
||||||
|
ij_java_wrap_semicolon_after_call_chain = false
|
||||||
|
|
||||||
|
[*.xml]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
tab_width = 4
|
||||||
|
max_line_length = 120
|
||||||
|
|
||||||
|
[*.json]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
tab_width = 2
|
||||||
|
max_line_length = 120
|
||||||
|
|
||||||
|
[*.{yml,yaml}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
tab_width = 2
|
||||||
|
max_line_length = 120
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
max_line_length = 0
|
||||||
|
trim_trailing_whitespace = false
|
||||||
@@ -1,37 +1,70 @@
|
|||||||
---
|
---
|
||||||
name: 问题提交
|
name:
|
||||||
about: 描述问题并提交,帮助我们对其进行检查与修复。
|
问题提交
|
||||||
|
about:
|
||||||
|
描述问题并提交,帮助我们对其进行检查与修复。
|
||||||
title: ''
|
title: ''
|
||||||
labels: bug
|
labels:
|
||||||
|
bug
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### **问题简述**
|
###
|
||||||
|
*
|
||||||
|
*问题简述
|
||||||
|
**
|
||||||
|
|
||||||
用简短的话语描述一下大概问题。
|
用简短的话语描述一下大概问题。
|
||||||
|
|
||||||
### **问题来源**
|
###
|
||||||
|
*
|
||||||
|
*问题来源
|
||||||
|
**
|
||||||
|
|
||||||
描述一下通过哪些操作才发现的问题,如:
|
描述一下通过哪些操作才发现的问题,如:
|
||||||
|
|
||||||
1. 使用了 '...'
|
1.
|
||||||
2. 输入了 '....'
|
使用了 '...'
|
||||||
3. 出现了报错 '....'
|
2.
|
||||||
|
输入了 '....'
|
||||||
|
3.
|
||||||
|
出现了报错 '....'
|
||||||
|
|
||||||
### **预期结果** (可选)
|
###
|
||||||
|
*
|
||||||
|
*预期结果
|
||||||
|
** (可选)
|
||||||
|
|
||||||
如果问题不发生,应该是什么情况
|
如果问题不发生,应该是什么情况
|
||||||
|
|
||||||
### **问题截图/问题报错**
|
###
|
||||||
|
*
|
||||||
|
*问题截图/问题报错
|
||||||
|
**
|
||||||
|
|
||||||
如果有报错或输出,请提供截图。
|
如果有报错或输出,请提供截图。
|
||||||
|
|
||||||
### **操作环境**
|
###
|
||||||
|
*
|
||||||
|
*操作环境
|
||||||
|
**
|
||||||
|
|
||||||
- 系统环境: `Windows 10` / `Ubuntu` / `...`
|
-
|
||||||
- Java版本: `JDK11` / `OPENJDK8` / `JRE8` / `...`
|
系统环境:
|
||||||
|
`Windows 10` /
|
||||||
|
`Ubuntu` /
|
||||||
|
`...`
|
||||||
|
-
|
||||||
|
Java版本:
|
||||||
|
`JDK11` /
|
||||||
|
`OPENJDK8` /
|
||||||
|
`JRE8` /
|
||||||
|
`...`
|
||||||
|
|
||||||
### **其他补充**
|
###
|
||||||
|
*
|
||||||
|
*其他补充
|
||||||
|
**
|
||||||
|
|
||||||
如有其他补充,可以在这里描述。
|
如有其他补充,可以在这里描述。
|
||||||
|
|||||||
@@ -1,23 +1,38 @@
|
|||||||
---
|
---
|
||||||
name: 功能需求
|
name:
|
||||||
about: 希望我们提供更多的功能。
|
功能需求
|
||||||
|
about:
|
||||||
|
希望我们提供更多的功能。
|
||||||
title: ''
|
title: ''
|
||||||
labels: enhancement
|
labels:
|
||||||
|
enhancement
|
||||||
assignees: ''
|
assignees: ''
|
||||||
---
|
---
|
||||||
|
|
||||||
### **功能简述**
|
###
|
||||||
|
*
|
||||||
|
*功能简述
|
||||||
|
**
|
||||||
|
|
||||||
简单的描述一下你想要的功能
|
简单的描述一下你想要的功能
|
||||||
|
|
||||||
### **需求来源**
|
###
|
||||||
|
*
|
||||||
|
*需求来源
|
||||||
|
**
|
||||||
|
|
||||||
简单的描述一下为什么需要这个功能。
|
简单的描述一下为什么需要这个功能。
|
||||||
|
|
||||||
### **功能参考**(可选)
|
###
|
||||||
|
*
|
||||||
|
*功能参考
|
||||||
|
**(可选)
|
||||||
|
|
||||||
如果有相关功能的参考,如文本、截图,请提供给我们。
|
如果有相关功能的参考,如文本、截图,请提供给我们。
|
||||||
|
|
||||||
### **附加内容**
|
###
|
||||||
|
*
|
||||||
|
*附加内容
|
||||||
|
**
|
||||||
|
|
||||||
如果有什么小细节需要重点注意,请在这里告诉我们。
|
如果有什么小细节需要重点注意,请在这里告诉我们。
|
||||||
|
|||||||
@@ -8,46 +8,167 @@
|
|||||||

|

|
||||||

|

|
||||||
|
|
||||||
README LANGUAGES [ [**English**](README.md) | [中文](README_CN.md) ]
|
README
|
||||||
|
LANGUAGES [ [
|
||||||
|
*
|
||||||
|
*English
|
||||||
|
**](README.md) | [中文](README_CN.md) ]
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
# configured _(config framework)_
|
# configured
|
||||||
|
_(
|
||||||
|
config
|
||||||
|
framework)_
|
||||||
|
|
||||||
<img src=".doc/images/logo-bg.svg" width="150px" alt="logo" align="right" style="float: right"/>
|
<img src=".doc/images/logo-bg.svg" width="150px" alt="logo" align="right" style="float: right"/>
|
||||||
|
|
||||||
_**"Once set, Simple get."**_
|
_
|
||||||
|
*
|
||||||
|
*"
|
||||||
|
Once
|
||||||
|
set,
|
||||||
|
Simple
|
||||||
|
get."
|
||||||
|
**_
|
||||||
|
|
||||||
A simple, easy-to-use and universal solution for managing, loading, reading,
|
A
|
||||||
and updating configuration files.
|
simple,
|
||||||
|
easy-to-use
|
||||||
|
and
|
||||||
|
universal
|
||||||
|
solution
|
||||||
|
for
|
||||||
|
managing,
|
||||||
|
loading,
|
||||||
|
reading,
|
||||||
|
and
|
||||||
|
updating
|
||||||
|
configuration
|
||||||
|
files.
|
||||||
|
|
||||||
Supported **JSON**, **YAML**, **Hocon**, **TOML**, **SQL**, **MongoDB**... and much more!
|
Supported
|
||||||
|
*
|
||||||
|
*JSON
|
||||||
|
**,
|
||||||
|
*
|
||||||
|
*YAML
|
||||||
|
**,
|
||||||
|
*
|
||||||
|
*Hocon
|
||||||
|
**,
|
||||||
|
*
|
||||||
|
*TOML
|
||||||
|
**,
|
||||||
|
*
|
||||||
|
*SQL
|
||||||
|
**,
|
||||||
|
*
|
||||||
|
*MongoDB
|
||||||
|
**...
|
||||||
|
and
|
||||||
|
much
|
||||||
|
more!
|
||||||
|
|
||||||
## Features & Advantages
|
## Features & Advantages
|
||||||
|
|
||||||
Supported [YAML](impl/yaml), [JSON](impl/json), [HOCON](impl/hocon) and [SQL](impl/sql) based configuration files
|
Supported [YAML](providers/yaml), [JSON](providers/json), [HOCON](providers/hocon)
|
||||||
|
and [SQL](providers/sql)
|
||||||
|
based
|
||||||
|
configuration
|
||||||
|
files
|
||||||
format.
|
format.
|
||||||
|
|
||||||
- Class-based mechanism for initializing, loading, retrieving, and updating configuration files, ensuring convenience
|
-
|
||||||
and efficiency.
|
Class-based
|
||||||
- Supports manual serialization and deserialization of complex configurations.
|
mechanism
|
||||||
- Offers multiple builder forms for rapid construction of `ConfigValue<?>` objects.
|
for
|
||||||
- Enables specification of configuration paths, comments, and more via annotations.
|
initializing,
|
||||||
|
loading,
|
||||||
|
retrieving,
|
||||||
|
and
|
||||||
|
updating
|
||||||
|
configuration
|
||||||
|
files,
|
||||||
|
ensuring
|
||||||
|
convenience
|
||||||
|
and
|
||||||
|
efficiency.
|
||||||
|
-
|
||||||
|
Supports
|
||||||
|
manual
|
||||||
|
serialization
|
||||||
|
and
|
||||||
|
deserialization
|
||||||
|
of
|
||||||
|
complex
|
||||||
|
configurations.
|
||||||
|
-
|
||||||
|
Offers
|
||||||
|
multiple
|
||||||
|
builder
|
||||||
|
forms
|
||||||
|
for
|
||||||
|
rapid
|
||||||
|
construction
|
||||||
|
of
|
||||||
|
`ConfigValue<?>`
|
||||||
|
objects.
|
||||||
|
-
|
||||||
|
Enables
|
||||||
|
specification
|
||||||
|
of
|
||||||
|
configuration
|
||||||
|
paths,
|
||||||
|
comments,
|
||||||
|
and
|
||||||
|
more
|
||||||
|
via
|
||||||
|
annotations.
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
For the latest JavaDoc release, [CLICK HERE](https://CarmJos.github.io/configured).
|
For
|
||||||
|
the
|
||||||
|
latest
|
||||||
|
JavaDoc
|
||||||
|
release, [CLICK HERE](https://CarmJos.github.io/configured).
|
||||||
|
|
||||||
For a detailed development guide, [CLICK HERE](.doc/README.md).
|
For
|
||||||
|
a
|
||||||
|
detailed
|
||||||
|
development
|
||||||
|
guide, [CLICK HERE](.doc/README.md).
|
||||||
|
|
||||||
### Preview
|
### Preview
|
||||||
|
|
||||||
To quickly demonstrate the applicability of the project, here are a few practical demonstrations:
|
To
|
||||||
|
quickly
|
||||||
|
demonstrate
|
||||||
|
the
|
||||||
|
applicability
|
||||||
|
of
|
||||||
|
the
|
||||||
|
project,
|
||||||
|
here
|
||||||
|
are
|
||||||
|
a
|
||||||
|
few
|
||||||
|
practical
|
||||||
|
demonstrations:
|
||||||
|
|
||||||
- [Database configuration.](demo/src/main/java/cc/carm/lib/configuration/demo/DatabaseConfiguration.java)
|
- [Database configuration.](demo/src/main/java/cc/carm/lib/configuration/demo/DatabaseConfiguration.java)
|
||||||
- [Demonstration of all types of configuration instance classes.](demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java)
|
- [Demonstration of configuration instance classes.](demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java)
|
||||||
|
|
||||||
Check out all code demonstrations [HERE](demo/src/main/java/cc/carm/lib/configuration/demo/DatabaseConfiguration.java).
|
Check
|
||||||
For more examples, see the [Development Guide](.doc/README.md).
|
out
|
||||||
|
all
|
||||||
|
code
|
||||||
|
demonstrations [HERE](demo/src/main/java/cc/carm/lib/configuration/demo/DatabaseConfiguration.java).
|
||||||
|
For
|
||||||
|
more
|
||||||
|
examples,
|
||||||
|
see
|
||||||
|
the [Development Guide](.doc/README.md).
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
|
||||||
@@ -240,30 +361,104 @@ dependencies {
|
|||||||
|
|
||||||
## Derived Projects
|
## Derived Projects
|
||||||
|
|
||||||
### [**MineConfiguration**](https://github.com/CarmJos/MineConfiguration) (by @CarmJos)
|
### [
|
||||||
|
*
|
||||||
|
*MineConfiguration
|
||||||
|
**](https://github.com/CarmJos/MineConfiguration) (by @CarmJos)
|
||||||
|
|
||||||
configured for MineCraft!
|
configured
|
||||||
Easily manage configurations on MineCraft-related server platforms.
|
for
|
||||||
|
MineCraft!
|
||||||
|
Easily
|
||||||
|
manage
|
||||||
|
configurations
|
||||||
|
on
|
||||||
|
MineCraft-related
|
||||||
|
server
|
||||||
|
platforms.
|
||||||
|
|
||||||
Currently, it supports BungeeCord, Velocity, Bukkit (Spigot) servers,
|
Currently,
|
||||||
with more platforms to be supported soon.
|
it
|
||||||
|
supports
|
||||||
|
BungeeCord,
|
||||||
|
Velocity,
|
||||||
|
Bukkit (
|
||||||
|
Spigot)
|
||||||
|
servers,
|
||||||
|
with
|
||||||
|
more
|
||||||
|
platforms
|
||||||
|
to
|
||||||
|
be
|
||||||
|
supported
|
||||||
|
soon.
|
||||||
|
|
||||||
## Support and Donation
|
## Support and Donation
|
||||||
|
|
||||||
If you appreciate this plugin, consider supporting me with a donation!
|
If
|
||||||
|
you
|
||||||
|
appreciate
|
||||||
|
this
|
||||||
|
plugin,
|
||||||
|
consider
|
||||||
|
supporting
|
||||||
|
me
|
||||||
|
with
|
||||||
|
a
|
||||||
|
donation!
|
||||||
|
|
||||||
Thank you for supporting open-source projects!
|
Thank
|
||||||
|
you
|
||||||
|
for
|
||||||
|
supporting
|
||||||
|
open-source
|
||||||
|
projects!
|
||||||
|
|
||||||
Many thanks to Jetbrains for kindly providing a license for us to work on this and other open-source projects.
|
Many
|
||||||
|
thanks
|
||||||
|
to
|
||||||
|
Jetbrains
|
||||||
|
for
|
||||||
|
kindly
|
||||||
|
providing
|
||||||
|
a
|
||||||
|
license
|
||||||
|
for
|
||||||
|
us
|
||||||
|
to
|
||||||
|
work
|
||||||
|
on
|
||||||
|
this
|
||||||
|
and
|
||||||
|
other
|
||||||
|
open-source
|
||||||
|
projects.
|
||||||
|
|
||||||
[](https://www.jetbrains.com/?from=https://github.com/CarmJos/configured)
|
[](https://www.jetbrains.com/?from=https://github.com/CarmJos/configured)
|
||||||
|
|
||||||
Many thanks to [ArtformGames](https://github.com/ArtformGames) for their
|
Many
|
||||||
strong support and active contribution to this project!
|
thanks
|
||||||
|
to [ArtformGames](https://github.com/ArtformGames)
|
||||||
|
for
|
||||||
|
their
|
||||||
|
strong
|
||||||
|
support
|
||||||
|
and
|
||||||
|
active
|
||||||
|
contribution
|
||||||
|
to
|
||||||
|
this
|
||||||
|
project!
|
||||||
|
|
||||||
<img src="https://raw.githubusercontent.com/ArtformGames/.github/master/logo/logo_full.svg" width="317px" height="117px" alt="ArtformGames">
|
<img src="https://raw.githubusercontent.com/ArtformGames/.github/master/logo/logo_full.svg" width="317px" height="117px" alt="ArtformGames">
|
||||||
|
|
||||||
## Open Source License
|
## Open Source License
|
||||||
|
|
||||||
This project's source code is licensed under
|
This
|
||||||
|
project's
|
||||||
|
source
|
||||||
|
code
|
||||||
|
is
|
||||||
|
licensed
|
||||||
|
under
|
||||||
the [GNU LESSER GENERAL PUBLIC LICENSE](https://www.gnu.org/licenses/lgpl-3.0.html).
|
the [GNU LESSER GENERAL PUBLIC LICENSE](https://www.gnu.org/licenses/lgpl-3.0.html).
|
||||||
|
|||||||
+51
-16
@@ -8,30 +8,48 @@
|
|||||||

|

|
||||||

|

|
||||||
|
|
||||||
README LANGUAGES [ [English](README.md) | [**中文**](README_CN.md) ]
|
README
|
||||||
|
LANGUAGES [ [English](README.md) | [
|
||||||
|
*
|
||||||
|
*中文
|
||||||
|
**](README_CN.md) ]
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
# configured _(配置文件框架)_
|
# configured
|
||||||
|
_(
|
||||||
|
配置文件框架)_
|
||||||
|
|
||||||
<img src=".doc/images/logo-bg.svg" width="150px" alt="logo" align="right" style="float: right"/>
|
<img src=".doc/images/logo-bg.svg" width="150px" alt="logo" align="right" style="float: right"/>
|
||||||
|
|
||||||
**一次配置,轻松读取!**
|
*
|
||||||
|
*一次配置,轻松读取!
|
||||||
|
**
|
||||||
|
|
||||||
一款简单便捷的通用配置文件加载、读取与更新工具,可自定义配置的格式。
|
一款简单便捷的通用配置文件加载、读取与更新工具,可自定义配置的格式。
|
||||||
|
|
||||||
## 特性 & 优势
|
## 特性 & 优势
|
||||||
|
|
||||||
支持 [YAML](providers/yaml), [JSON](providers/gson), [HOCON](providers/hocon) 和 [SQL](providers/sql) 等多种配置文件格式。
|
支持 [YAML](providers/yaml), [JSON](providers/gson), [HOCON](providers/hocon)
|
||||||
|
和 [SQL](providers/sql)
|
||||||
|
等多种配置文件格式。
|
||||||
|
|
||||||
- 基于类的配置文件初始化、加载、获取与更新机制,方便快捷。
|
-
|
||||||
- 支持复杂配置的手动序列化、反序列化。
|
基于类的配置文件初始化、加载、获取与更新机制,方便快捷。
|
||||||
- 提供多种builder形式,快速构建 `ConfigValue<?>` 对象。
|
-
|
||||||
- 支持通过注解规定配置对应的路径、注释等信息。
|
支持复杂配置的手动序列化、反序列化。
|
||||||
|
-
|
||||||
|
提供多种builder形式,快速构建
|
||||||
|
`ConfigValue<?>`
|
||||||
|
对象。
|
||||||
|
-
|
||||||
|
支持通过注解规定配置对应的路径、注释等信息。
|
||||||
|
|
||||||
## 开发
|
## 开发
|
||||||
|
|
||||||
详细开发介绍请 [点击这里](.doc/README.md) , JavaDoc(最新Release)
|
详细开发介绍请 [点击这里](.doc/README.md) ,
|
||||||
|
JavaDoc(
|
||||||
|
最新Release)
|
||||||
请 [点击这里](https://CarmJos.github.io/configured) 。
|
请 [点击这里](https://CarmJos.github.io/configured) 。
|
||||||
|
|
||||||
### 示例代码
|
### 示例代码
|
||||||
@@ -260,12 +278,25 @@ dependencies {
|
|||||||
|
|
||||||
## 衍生项目
|
## 衍生项目
|
||||||
|
|
||||||
### [**MineConfiguration**](https://github.com/CarmJos/MineConfiguration) (by @CarmJos )
|
### [
|
||||||
|
*
|
||||||
|
*MineConfiguration
|
||||||
|
**](https://github.com/CarmJos/MineConfiguration) (by @CarmJos )
|
||||||
|
|
||||||
configured for MineCraft!
|
configured
|
||||||
开始在 MineCraft 相关服务器平台上轻松(做)配置吧!
|
for
|
||||||
|
MineCraft!
|
||||||
|
开始在
|
||||||
|
MineCraft
|
||||||
|
相关服务器平台上轻松(
|
||||||
|
做)
|
||||||
|
配置吧!
|
||||||
|
|
||||||
目前支持 BungeeCord, Bukkit(Spigot) 服务端,后续将支持更多平台。
|
目前支持
|
||||||
|
BungeeCord,
|
||||||
|
Bukkit(
|
||||||
|
Spigot)
|
||||||
|
服务端,后续将支持更多平台。
|
||||||
|
|
||||||
## 支持与捐赠
|
## 支持与捐赠
|
||||||
|
|
||||||
@@ -273,14 +304,18 @@ configured for MineCraft!
|
|||||||
|
|
||||||
感谢您对开源项目的支持!
|
感谢您对开源项目的支持!
|
||||||
|
|
||||||
万分感谢 Jetbrains 为我们提供了从事此项目和其他开源项目的许可!
|
万分感谢
|
||||||
|
Jetbrains
|
||||||
|
为我们提供了从事此项目和其他开源项目的许可!
|
||||||
|
|
||||||
[](https://www.jetbrains.com/?from=https://github.com/CarmJos/configured)
|
[](https://www.jetbrains.com/?from=https://github.com/CarmJos/configured)
|
||||||
|
|
||||||
万分感谢来自 [ArtformGames](https://github.com/ArtformGames) 对本项目的大力支持与积极贡献!
|
万分感谢来自 [ArtformGames](https://github.com/ArtformGames)
|
||||||
|
对本项目的大力支持与积极贡献!
|
||||||
|
|
||||||
<img src="https://raw.githubusercontent.com/ArtformGames/.github/master/logo/logo_full.svg" width="317px" height="117px" alt="ArtformGames">
|
<img src="https://raw.githubusercontent.com/ArtformGames/.github/master/logo/logo_full.svg" width="317px" height="117px" alt="ArtformGames">
|
||||||
|
|
||||||
## 开源协议
|
## 开源协议
|
||||||
|
|
||||||
本项目源码采用 [GNU LESSER GENERAL PUBLIC LICENSE](https://www.gnu.org/licenses/lgpl-3.0.html) 开源协议。
|
本项目源码采用 [GNU LESSER GENERAL PUBLIC LICENSE](https://www.gnu.org/licenses/lgpl-3.0.html)
|
||||||
|
开源协议。
|
||||||
|
|||||||
@@ -4,4 +4,5 @@ package cc.carm.lib.configuration;
|
|||||||
* The root interface of the configuration file interfaces,
|
* The root interface of the configuration file interfaces,
|
||||||
* which is used to label a class as a configuration.
|
* which is used to label a class as a configuration.
|
||||||
*/
|
*/
|
||||||
public interface Configuration { }
|
public interface Configuration {
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import java.util.Objects;
|
|||||||
* @param <TYPE> The type of the target value
|
* @param <TYPE> The type of the target value
|
||||||
*/
|
*/
|
||||||
public class ValueAdapter<TYPE>
|
public class ValueAdapter<TYPE>
|
||||||
implements ValueSerializer<TYPE>, ValueParser<TYPE> {
|
implements ValueSerializer<TYPE>, ValueParser<TYPE> {
|
||||||
|
|
||||||
protected final @NotNull ValueType<TYPE> type;
|
protected final @NotNull ValueType<TYPE> type;
|
||||||
|
|
||||||
@@ -55,9 +55,9 @@ public class ValueAdapter<TYPE>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable Object serialize(
|
public @Nullable Object serialize(
|
||||||
@NotNull ConfigurationHolder<?> holder,
|
@NotNull ConfigurationHolder<?> holder,
|
||||||
@NotNull ValueType<? super TYPE> type,
|
@NotNull ValueType<? super TYPE> type,
|
||||||
@NotNull TYPE value
|
@NotNull TYPE value
|
||||||
) throws Exception {
|
) throws Exception {
|
||||||
if (serializer == null) throw new UnsupportedOperationException("Serializer is not supported");
|
if (serializer == null) throw new UnsupportedOperationException("Serializer is not supported");
|
||||||
return serializer.serialize(holder, type, value);
|
return serializer.serialize(holder, type, value);
|
||||||
@@ -65,9 +65,9 @@ public class ValueAdapter<TYPE>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable TYPE parse(
|
public @Nullable TYPE parse(
|
||||||
@NotNull ConfigurationHolder<?> holder,
|
@NotNull ConfigurationHolder<?> holder,
|
||||||
@NotNull ValueType<? super TYPE> type,
|
@NotNull ValueType<? super TYPE> type,
|
||||||
@NotNull Object value
|
@NotNull Object value
|
||||||
) throws Exception {
|
) throws Exception {
|
||||||
if (deserializer == null) throw new UnsupportedOperationException("Deserializer is not supported");
|
if (deserializer == null) throw new UnsupportedOperationException("Deserializer is not supported");
|
||||||
return deserializer.parse(holder, type, value);
|
return deserializer.parse(holder, type, value);
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ public class ValueAdapterRegistry {
|
|||||||
ValueAdapter<FROM> fromAdapter = adapterOf(from);
|
ValueAdapter<FROM> fromAdapter = adapterOf(from);
|
||||||
if (fromAdapter == null) throw new IllegalArgumentException("No adapter for type " + from);
|
if (fromAdapter == null) throw new IllegalArgumentException("No adapter for type " + from);
|
||||||
register(to,
|
register(to,
|
||||||
serializer == null ? null : (provider, type, value) -> fromAdapter.serialize(provider, from, serializer.handle(value)),
|
serializer == null ? null : (provider, type, value) -> fromAdapter.serialize(provider, from, serializer.handle(value)),
|
||||||
parser == null ? null : (provider, type, data) -> parser.handle(fromAdapter.parse(provider, from, data))
|
parser == null ? null : (provider, type, data) -> parser.handle(fromAdapter.parse(provider, from, data))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,14 +84,14 @@ public class ValueAdapterRegistry {
|
|||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public <T> @Nullable ValueAdapter<T> adapterOf(@NotNull ValueType<T> type) {
|
public <T> @Nullable ValueAdapter<T> adapterOf(@NotNull ValueType<T> type) {
|
||||||
ValueAdapter<?> matched = adapters.stream()
|
ValueAdapter<?> matched = adapters.stream()
|
||||||
.filter(adapter -> adapter.type().equals(type))
|
.filter(adapter -> adapter.type().equals(type))
|
||||||
.findFirst().orElse(null);
|
.findFirst().orElse(null);
|
||||||
if (matched != null) return (ValueAdapter<T>) matched;
|
if (matched != null) return (ValueAdapter<T>) matched;
|
||||||
|
|
||||||
// If no adapter found, try to find the adapter for the super type
|
// If no adapter found, try to find the adapter for the super type
|
||||||
return (ValueAdapter<T>) adapters.stream()
|
return (ValueAdapter<T>) adapters.stream()
|
||||||
.filter(adapter -> adapter.type().isSubtypeOf(type))
|
.filter(adapter -> adapter.type().isSubtypeOf(type))
|
||||||
.findFirst().orElse(null);
|
.findFirst().orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T> ValueAdapter<T> adapterOf(@NotNull T value) {
|
public <T> ValueAdapter<T> adapterOf(@NotNull T value) {
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
public interface ValueParser<TYPE> {
|
public interface ValueParser<TYPE> {
|
||||||
|
|
||||||
@Nullable TYPE parse(
|
@Nullable TYPE parse(
|
||||||
@NotNull ConfigurationHolder<?> holder,
|
@NotNull ConfigurationHolder<?> holder,
|
||||||
@NotNull ValueType<? super TYPE> type, @NotNull Object data
|
@NotNull ValueType<? super TYPE> type, @NotNull Object data
|
||||||
) throws Exception;
|
) throws Exception;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
public interface ValueSerializer<TYPE> {
|
public interface ValueSerializer<TYPE> {
|
||||||
|
|
||||||
@Nullable Object serialize(
|
@Nullable Object serialize(
|
||||||
@NotNull ConfigurationHolder<?> holder,
|
@NotNull ConfigurationHolder<?> holder,
|
||||||
@NotNull ValueType<? super TYPE> type, @NotNull TYPE value
|
@NotNull ValueType<? super TYPE> type, @NotNull TYPE value
|
||||||
) throws Exception;
|
) throws Exception;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ public abstract class ValueType<T> {
|
|||||||
public static final ValueType<Character> CHAR_TYPE = ofPrimitiveType(char.class);
|
public static final ValueType<Character> CHAR_TYPE = ofPrimitiveType(char.class);
|
||||||
|
|
||||||
public static final ValueType<?>[] PRIMITIVE_TYPES = {
|
public static final ValueType<?>[] PRIMITIVE_TYPES = {
|
||||||
STRING, INTEGER, LONG, DOUBLE, FLOAT, BOOLEAN, BYTE, SHORT, CHAR,
|
STRING, INTEGER, LONG, DOUBLE, FLOAT, BOOLEAN, BYTE, SHORT, CHAR,
|
||||||
INTEGER_TYPE, LONG_TYPE, DOUBLE_TYPE, FLOAT_TYPE, BOOLEAN_TYPE, BYTE_TYPE, SHORT_TYPE, CHAR_TYPE
|
INTEGER_TYPE, LONG_TYPE, DOUBLE_TYPE, FLOAT_TYPE, BOOLEAN_TYPE, BYTE_TYPE, SHORT_TYPE, CHAR_TYPE
|
||||||
};
|
};
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
|||||||
+2
-2
@@ -11,11 +11,11 @@ import java.util.Arrays;
|
|||||||
public class PrimitiveAdapter<T> extends ValueAdapter<T> {
|
public class PrimitiveAdapter<T> extends ValueAdapter<T> {
|
||||||
|
|
||||||
public static final String[] TRUE_VALUES = new String[]{
|
public static final String[] TRUE_VALUES = new String[]{
|
||||||
"true", "yes", "on", "1", "enabled", "enable", "active"
|
"true", "yes", "on", "1", "enabled", "enable", "active"
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final String[] FALSE_VALUES = new String[]{
|
public static final String[] FALSE_VALUES = new String[]{
|
||||||
"false", "no", "off", "0", "disabled", "disable", "inactive"
|
"false", "no", "off", "0", "disabled", "disable", "inactive"
|
||||||
};
|
};
|
||||||
|
|
||||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
|
|||||||
+13
-13
@@ -12,27 +12,27 @@ import static cc.carm.lib.configuration.adapter.strandard.PrimitiveAdapter.*;
|
|||||||
public interface StandardAdapters {
|
public interface StandardAdapters {
|
||||||
|
|
||||||
@NotNull PrimitiveAdapter<?>[] PRIMITIVES = new PrimitiveAdapter[]{
|
@NotNull PrimitiveAdapter<?>[] PRIMITIVES = new PrimitiveAdapter[]{
|
||||||
ofString(), ofBoolean(), ofBooleanType(), ofCharacter(), ofCharacterType(),
|
ofString(), ofBoolean(), ofBooleanType(), ofCharacter(), ofCharacterType(),
|
||||||
ofInteger(), ofIntegerType(), ofLong(), ofLongType(), ofDouble(), ofDoubleType(),
|
ofInteger(), ofIntegerType(), ofLong(), ofLongType(), ofDouble(), ofDoubleType(),
|
||||||
ofFloat(), ofFloatType(), ofShort(), ofShortType(), ofByte(), ofByteType()
|
ofFloat(), ofFloatType(), ofShort(), ofShortType(), ofByte(), ofByteType()
|
||||||
};
|
};
|
||||||
|
|
||||||
@NotNull ValueAdapter<Enum<?>> ENUMS = PrimitiveAdapter.ofEnum();
|
@NotNull ValueAdapter<Enum<?>> ENUMS = PrimitiveAdapter.ofEnum();
|
||||||
|
|
||||||
@NotNull ValueAdapter<UUID> UUID = new ValueAdapter<>(
|
@NotNull ValueAdapter<UUID> UUID = new ValueAdapter<>(
|
||||||
ValueType.of(UUID.class),
|
ValueType.of(UUID.class),
|
||||||
(provider, type, value) -> value.toString(),
|
(provider, type, value) -> value.toString(),
|
||||||
(provider, type, value) -> java.util.UUID.fromString(value.toString())
|
(provider, type, value) -> java.util.UUID.fromString(value.toString())
|
||||||
);
|
);
|
||||||
|
|
||||||
@NotNull ValueAdapter<ConfigureSection> SECTIONS = new ValueAdapter<>(
|
@NotNull ValueAdapter<ConfigureSection> SECTIONS = new ValueAdapter<>(
|
||||||
ValueType.of(ConfigureSection.class),
|
ValueType.of(ConfigureSection.class),
|
||||||
(provider, type, value) -> value,
|
(provider, type, value) -> value,
|
||||||
(provider, type, value) -> {
|
(provider, type, value) -> {
|
||||||
if (value instanceof ConfigureSection) {
|
if (value instanceof ConfigureSection) {
|
||||||
return (ConfigureSection) value;
|
return (ConfigureSection) value;
|
||||||
} else throw new IllegalArgumentException("Value is not a ConfigurationSection");
|
} else throw new IllegalArgumentException("Value is not a ConfigurationSection");
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,9 +19,9 @@ import java.util.function.Supplier;
|
|||||||
|
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
public abstract class AbstractConfigBuilder<
|
public abstract class AbstractConfigBuilder<
|
||||||
TYPE, UNIT, RESULT extends ConfigValue<TYPE, UNIT>, HOLDER extends ConfigurationHolder<?>,
|
TYPE, UNIT, RESULT extends ConfigValue<TYPE, UNIT>, HOLDER extends ConfigurationHolder<?>,
|
||||||
SELF extends AbstractConfigBuilder<TYPE, UNIT, RESULT, HOLDER, SELF>
|
SELF extends AbstractConfigBuilder<TYPE, UNIT, RESULT, HOLDER, SELF>
|
||||||
> {
|
> {
|
||||||
|
|
||||||
protected final Class<? super HOLDER> providerClass;
|
protected final Class<? super HOLDER> providerClass;
|
||||||
protected final ValueType<TYPE> type;
|
protected final ValueType<TYPE> type;
|
||||||
@@ -156,8 +156,8 @@ public abstract class AbstractConfigBuilder<
|
|||||||
|
|
||||||
protected @NotNull ValueManifest<TYPE, UNIT> buildManifest() {
|
protected @NotNull ValueManifest<TYPE, UNIT> buildManifest() {
|
||||||
return new ValueManifest<>(
|
return new ValueManifest<>(
|
||||||
type(), this.defaultValueSupplier, this.valueValidator,
|
type(), this.defaultValueSupplier, this.valueValidator,
|
||||||
this.initializer, this.holder, this.path
|
this.initializer, this.holder, this.path
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ import cc.carm.lib.configuration.source.ConfigurationHolder;
|
|||||||
import cc.carm.lib.configuration.value.ConfigValue;
|
import cc.carm.lib.configuration.value.ConfigValue;
|
||||||
|
|
||||||
public abstract class CommonConfigBuilder<
|
public abstract class CommonConfigBuilder<
|
||||||
TYPE, UNIT,
|
TYPE, UNIT,
|
||||||
RESULT extends ConfigValue<TYPE, UNIT>,
|
RESULT extends ConfigValue<TYPE, UNIT>,
|
||||||
SELF extends CommonConfigBuilder<TYPE, UNIT, RESULT, SELF>
|
SELF extends CommonConfigBuilder<TYPE, UNIT, RESULT, SELF>
|
||||||
> extends AbstractConfigBuilder<TYPE, UNIT, RESULT, ConfigurationHolder<?>, SELF> {
|
> extends AbstractConfigBuilder<TYPE, UNIT, RESULT, ConfigurationHolder<?>, SELF> {
|
||||||
|
|
||||||
protected CommonConfigBuilder(ValueType<TYPE> type) {
|
protected CommonConfigBuilder(ValueType<TYPE> type) {
|
||||||
super(ConfigurationHolder.class, type);
|
super(ConfigurationHolder.class, type);
|
||||||
|
|||||||
+13
-13
@@ -14,10 +14,10 @@ import java.util.LinkedHashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public abstract class AbstractSectionBuilder<
|
public abstract class AbstractSectionBuilder<
|
||||||
TYPE, UNIT,
|
TYPE, UNIT,
|
||||||
RESULT extends ConfigValue<TYPE, UNIT>,
|
RESULT extends ConfigValue<TYPE, UNIT>,
|
||||||
SELF extends AbstractSectionBuilder<TYPE, UNIT, RESULT, SELF>
|
SELF extends AbstractSectionBuilder<TYPE, UNIT, RESULT, SELF>
|
||||||
> extends CommonConfigBuilder<TYPE, UNIT, RESULT, SELF> {
|
> extends CommonConfigBuilder<TYPE, UNIT, RESULT, SELF> {
|
||||||
|
|
||||||
|
|
||||||
protected final @NotNull ValueType<UNIT> paramType;
|
protected final @NotNull ValueType<UNIT> paramType;
|
||||||
@@ -62,15 +62,15 @@ public abstract class AbstractSectionBuilder<
|
|||||||
|
|
||||||
protected ValueAdapter<UNIT> buildAdapter() {
|
protected ValueAdapter<UNIT> buildAdapter() {
|
||||||
return new ValueAdapter<>(this.paramType)
|
return new ValueAdapter<>(this.paramType)
|
||||||
.parser((p, type, data) -> {
|
.parser((p, type, data) -> {
|
||||||
ConfigureSection section = p.deserialize(ConfigureSection.class, data);
|
ConfigureSection section = p.deserialize(ConfigureSection.class, data);
|
||||||
if (section == null) return null;
|
if (section == null) return null;
|
||||||
return this.parser.handle(p, section);
|
return this.parser.handle(p, section);
|
||||||
})
|
})
|
||||||
.serializer((p, type, data) -> {
|
.serializer((p, type, data) -> {
|
||||||
Map<String, Object> map = this.serializer.handle(p, data);
|
Map<String, Object> map = this.serializer.handle(p, data);
|
||||||
return map == null || map.isEmpty() ? null : map;
|
return map == null || map.isEmpty() ? null : map;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-11
@@ -9,9 +9,9 @@ import cc.carm.lib.configuration.value.ConfigValue;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public abstract class AbstractSourceBuilder<
|
public abstract class AbstractSourceBuilder<
|
||||||
V, SOURCE, UNIT, RESULT extends ConfigValue<V, UNIT>,
|
V, SOURCE, UNIT, RESULT extends ConfigValue<V, UNIT>,
|
||||||
SELF extends AbstractSourceBuilder<V, SOURCE, UNIT, RESULT, SELF>
|
SELF extends AbstractSourceBuilder<V, SOURCE, UNIT, RESULT, SELF>
|
||||||
> extends CommonConfigBuilder<V, UNIT, RESULT, SELF> {
|
> extends CommonConfigBuilder<V, UNIT, RESULT, SELF> {
|
||||||
|
|
||||||
protected final @NotNull ValueType<SOURCE> sourceType;
|
protected final @NotNull ValueType<SOURCE> sourceType;
|
||||||
protected final @NotNull ValueType<UNIT> paramType;
|
protected final @NotNull ValueType<UNIT> paramType;
|
||||||
@@ -49,14 +49,14 @@ public abstract class AbstractSourceBuilder<
|
|||||||
|
|
||||||
protected ValueAdapter<UNIT> buildAdapter() {
|
protected ValueAdapter<UNIT> buildAdapter() {
|
||||||
return new ValueAdapter<>(this.paramType)
|
return new ValueAdapter<>(this.paramType)
|
||||||
.parser((holder, type, data) -> {
|
.parser((holder, type, data) -> {
|
||||||
SOURCE source = holder.deserialize(this.sourceType, data);
|
SOURCE source = holder.deserialize(this.sourceType, data);
|
||||||
return this.valueParser.handle(holder, source);
|
return this.valueParser.handle(holder, source);
|
||||||
})
|
})
|
||||||
.serializer((holder, type, data) -> {
|
.serializer((holder, type, data) -> {
|
||||||
SOURCE source = this.valueSerializer.handle(holder, data);
|
SOURCE source = this.valueSerializer.handle(holder, data);
|
||||||
return holder.serialize(source);
|
return holder.serialize(source);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -20,23 +20,23 @@ public class ConfigListBuilder<V> {
|
|||||||
|
|
||||||
public <S> @NotNull SourceListBuilder<S, V> from(@NotNull ValueType<S> sourceType) {
|
public <S> @NotNull SourceListBuilder<S, V> from(@NotNull ValueType<S> sourceType) {
|
||||||
return new SourceListBuilder<>(
|
return new SourceListBuilder<>(
|
||||||
ArrayList::new, sourceType, type,
|
ArrayList::new, sourceType, type,
|
||||||
ValueHandler.required(type),
|
ValueHandler.required(type),
|
||||||
ValueHandler.required(sourceType)
|
ValueHandler.required(sourceType)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull SourceListBuilder<String, V> fromString() {
|
public @NotNull SourceListBuilder<String, V> fromString() {
|
||||||
return new SourceListBuilder<>(
|
return new SourceListBuilder<>(
|
||||||
ArrayList::new, ValueType.STRING, type,
|
ArrayList::new, ValueType.STRING, type,
|
||||||
ValueHandler.required(type), ValueHandler.stringValue()
|
ValueHandler.required(type), ValueHandler.stringValue()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull SectionListBuilder<V> fromSection() {
|
public @NotNull SectionListBuilder<V> fromSection() {
|
||||||
return new SectionListBuilder<>(
|
return new SectionListBuilder<>(
|
||||||
ArrayList::new, type,
|
ArrayList::new, type,
|
||||||
ValueHandler.required(type), ValueHandler.required()
|
ValueHandler.required(type), ValueHandler.required()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import java.util.function.Consumer;
|
|||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class SectionListBuilder<V>
|
public class SectionListBuilder<V>
|
||||||
extends AbstractSectionBuilder<List<V>, V, ConfiguredList<V>, SectionListBuilder<V>> {
|
extends AbstractSectionBuilder<List<V>, V, ConfiguredList<V>, SectionListBuilder<V>> {
|
||||||
|
|
||||||
protected @NotNull Supplier<? extends List<V>> constructor;
|
protected @NotNull Supplier<? extends List<V>> constructor;
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import java.util.function.Consumer;
|
|||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class SourceListBuilder<SOURCE, V>
|
public class SourceListBuilder<SOURCE, V>
|
||||||
extends AbstractSourceBuilder<List<V>, SOURCE, V, ConfiguredList<V>, SourceListBuilder<SOURCE, V>> {
|
extends AbstractSourceBuilder<List<V>, SOURCE, V, ConfiguredList<V>, SourceListBuilder<SOURCE, V>> {
|
||||||
|
|
||||||
protected @NotNull Supplier<? extends List<V>> constructor;
|
protected @NotNull Supplier<? extends List<V>> constructor;
|
||||||
|
|
||||||
|
|||||||
@@ -32,9 +32,9 @@ public class ConfigMapBuilder<M extends Map<K, V>, K, V> {
|
|||||||
|
|
||||||
public @NotNull <S> SourceMapBuilder<M, S, K, V> from(@NotNull ValueType<S> sourceType) {
|
public @NotNull <S> SourceMapBuilder<M, S, K, V> from(@NotNull ValueType<S> sourceType) {
|
||||||
return from(
|
return from(
|
||||||
sourceType,
|
sourceType,
|
||||||
ValueHandler.required(keyType), ValueHandler.stringValue(),
|
ValueHandler.required(keyType), ValueHandler.stringValue(),
|
||||||
ValueHandler.required(valueType), ValueHandler.required()
|
ValueHandler.required(valueType), ValueHandler.required()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,35 +44,35 @@ public class ConfigMapBuilder<M extends Map<K, V>, K, V> {
|
|||||||
@NotNull ValueHandler<S, V> valueParser,
|
@NotNull ValueHandler<S, V> valueParser,
|
||||||
@NotNull ValueHandler<V, S> valueSerializer) {
|
@NotNull ValueHandler<V, S> valueSerializer) {
|
||||||
return new SourceMapBuilder<>(
|
return new SourceMapBuilder<>(
|
||||||
this.constructor, sourceType, keyType, valueType,
|
this.constructor, sourceType, keyType, valueType,
|
||||||
keyParser, keySerializer, valueParser, valueSerializer
|
keyParser, keySerializer, valueParser, valueSerializer
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull SourceMapBuilder<M, String, K, V> fromString() {
|
public @NotNull SourceMapBuilder<M, String, K, V> fromString() {
|
||||||
return from(
|
return from(
|
||||||
ValueType.STRING,
|
ValueType.STRING,
|
||||||
ValueHandler.required(keyType), ValueHandler.stringValue(),
|
ValueHandler.required(keyType), ValueHandler.stringValue(),
|
||||||
ValueHandler.required(valueType), ValueHandler.stringValue()
|
ValueHandler.required(valueType), ValueHandler.stringValue()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull SectionMapBuilder<M, K, V> fromSection() {
|
public @NotNull SectionMapBuilder<M, K, V> fromSection() {
|
||||||
return fromSection(
|
return fromSection(
|
||||||
ValueHandler.required(keyType), ValueHandler.stringValue(),
|
ValueHandler.required(keyType), ValueHandler.stringValue(),
|
||||||
ValueHandler.required(valueType), ValueHandler.required()
|
ValueHandler.required(valueType), ValueHandler.required()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull SectionMapBuilder<M, K, V> fromSection(
|
public @NotNull SectionMapBuilder<M, K, V> fromSection(
|
||||||
@NotNull ValueHandler<String, K> keyParser,
|
@NotNull ValueHandler<String, K> keyParser,
|
||||||
@NotNull ValueHandler<K, String> keySerializer,
|
@NotNull ValueHandler<K, String> keySerializer,
|
||||||
@NotNull ValueHandler<ConfigureSection, V> valueParser,
|
@NotNull ValueHandler<ConfigureSection, V> valueParser,
|
||||||
@NotNull ValueHandler<V, Map<String, Object>> valueSerializer
|
@NotNull ValueHandler<V, Map<String, Object>> valueSerializer
|
||||||
) {
|
) {
|
||||||
return new SectionMapBuilder<>(
|
return new SectionMapBuilder<>(
|
||||||
this.constructor, keyType, valueType,
|
this.constructor, keyType, valueType,
|
||||||
keyParser, keySerializer, valueParser, valueSerializer
|
keyParser, keySerializer, valueParser, valueSerializer
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import java.util.function.Consumer;
|
|||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class SectionMapBuilder<MAP extends Map<K, V>, K, V>
|
public class SectionMapBuilder<MAP extends Map<K, V>, K, V>
|
||||||
extends AbstractSectionBuilder<Map<K, V>, V, ConfiguredMap<K, V>, SectionMapBuilder<MAP, K, V>> {
|
extends AbstractSectionBuilder<Map<K, V>, V, ConfiguredMap<K, V>, SectionMapBuilder<MAP, K, V>> {
|
||||||
|
|
||||||
protected final @NotNull ValueType<K> keyType;
|
protected final @NotNull ValueType<K> keyType;
|
||||||
|
|
||||||
@@ -78,14 +78,14 @@ public class SectionMapBuilder<MAP extends Map<K, V>, K, V>
|
|||||||
|
|
||||||
public @NotNull ValueAdapter<K> buildKeyAdapter() {
|
public @NotNull ValueAdapter<K> buildKeyAdapter() {
|
||||||
return new ValueAdapter<>(this.keyType)
|
return new ValueAdapter<>(this.keyType)
|
||||||
.parser((holder, type, data) -> {
|
.parser((holder, type, data) -> {
|
||||||
String source = holder.deserialize(String.class, data);
|
String source = holder.deserialize(String.class, data);
|
||||||
return this.keyParser.handle(holder, source);
|
return this.keyParser.handle(holder, source);
|
||||||
})
|
})
|
||||||
.serializer((holder, type, data) -> {
|
.serializer((holder, type, data) -> {
|
||||||
String source = this.keySerializer.handle(holder, data);
|
String source = this.keySerializer.handle(holder, data);
|
||||||
return holder.serialize(source);
|
return holder.serialize(source);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import java.util.function.Consumer;
|
|||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class SourceMapBuilder<MAP extends Map<K, V>, SOURCE, K, V>
|
public class SourceMapBuilder<MAP extends Map<K, V>, SOURCE, K, V>
|
||||||
extends AbstractSourceBuilder<Map<K, V>, SOURCE, V, ConfiguredMap<K, V>, SourceMapBuilder<MAP, SOURCE, K, V>> {
|
extends AbstractSourceBuilder<Map<K, V>, SOURCE, V, ConfiguredMap<K, V>, SourceMapBuilder<MAP, SOURCE, K, V>> {
|
||||||
|
|
||||||
protected final @NotNull ValueType<K> keyType;
|
protected final @NotNull ValueType<K> keyType;
|
||||||
|
|
||||||
@@ -74,14 +74,14 @@ public class SourceMapBuilder<MAP extends Map<K, V>, SOURCE, K, V>
|
|||||||
|
|
||||||
public @NotNull ValueAdapter<K> buildKeyAdapter() {
|
public @NotNull ValueAdapter<K> buildKeyAdapter() {
|
||||||
return new ValueAdapter<>(this.keyType)
|
return new ValueAdapter<>(this.keyType)
|
||||||
.parser((holder, type, data) -> {
|
.parser((holder, type, data) -> {
|
||||||
String source = holder.deserialize(String.class, data);
|
String source = holder.deserialize(String.class, data);
|
||||||
return this.keyParser.handle(holder, source);
|
return this.keyParser.handle(holder, source);
|
||||||
})
|
})
|
||||||
.serializer((holder, type, data) -> {
|
.serializer((holder, type, data) -> {
|
||||||
String source = this.keySerializer.handle(holder, data);
|
String source = this.keySerializer.handle(holder, data);
|
||||||
return holder.serialize(source);
|
return holder.serialize(source);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -38,8 +38,8 @@ public class ConfigValueBuilder<V> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull SectionValueBuilder<V> fromSection(
|
public @NotNull SectionValueBuilder<V> fromSection(
|
||||||
@NotNull ValueHandler<ConfigureSection, V> valueParser,
|
@NotNull ValueHandler<ConfigureSection, V> valueParser,
|
||||||
@NotNull ValueHandler<V, ? extends Map<String, Object>> valueSerializer
|
@NotNull ValueHandler<V, ? extends Map<String, Object>> valueSerializer
|
||||||
) {
|
) {
|
||||||
return new SectionValueBuilder<>(this.type, valueParser, valueSerializer);
|
return new SectionValueBuilder<>(this.type, valueParser, valueSerializer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import cc.carm.lib.configuration.value.standard.ConfiguredValue;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public class SourceValueBuilder<S, V>
|
public class SourceValueBuilder<S, V>
|
||||||
extends AbstractSourceBuilder<V, S, V, ConfiguredValue<V>, SourceValueBuilder<S, V>> {
|
extends AbstractSourceBuilder<V, S, V, ConfiguredValue<V>, SourceValueBuilder<S, V>> {
|
||||||
|
|
||||||
|
|
||||||
public SourceValueBuilder(@NotNull ValueType<S> sourceType, @NotNull ValueType<V> valueType,
|
public SourceValueBuilder(@NotNull ValueType<S> sourceType, @NotNull ValueType<V> valueType,
|
||||||
|
|||||||
@@ -30,10 +30,10 @@ import java.util.function.Supplier;
|
|||||||
* @param <SELF> Self builder, for further implement support.
|
* @param <SELF> Self builder, for further implement support.
|
||||||
*/
|
*/
|
||||||
public abstract class ConfigurationFactory<
|
public abstract class ConfigurationFactory<
|
||||||
SOURCE extends ConfigureSource<?, ?, SOURCE>,
|
SOURCE extends ConfigureSource<?, ?, SOURCE>,
|
||||||
HOLDER extends ConfigurationHolder<SOURCE>,
|
HOLDER extends ConfigurationHolder<SOURCE>,
|
||||||
SELF
|
SELF
|
||||||
> {
|
> {
|
||||||
|
|
||||||
protected @NotNull ValueAdapterRegistry adapters = new ValueAdapterRegistry();
|
protected @NotNull ValueAdapterRegistry adapters = new ValueAdapterRegistry();
|
||||||
protected @NotNull ConfigurationOptionHolder options = new ConfigurationOptionHolder();
|
protected @NotNull ConfigurationOptionHolder options = new ConfigurationOptionHolder();
|
||||||
|
|||||||
@@ -100,21 +100,21 @@ public class PathGenerator {
|
|||||||
*/
|
*/
|
||||||
public static String covertPathName(String name) {
|
public static String covertPathName(String name) {
|
||||||
return name
|
return name
|
||||||
// Replace all uppercase letters with dashes
|
// Replace all uppercase letters with dashes
|
||||||
.replaceAll("[A-Z]", "=$0")
|
.replaceAll("[A-Z]", "=$0")
|
||||||
// If the first letter is also capitalized,
|
// If the first letter is also capitalized,
|
||||||
// it will also be converted and the first dash will need to be removed
|
// it will also be converted and the first dash will need to be removed
|
||||||
.replaceAll("^=(.*)$", "$1")
|
.replaceAll("^=(.*)$", "$1")
|
||||||
// Because the name may contain _, it needs to be treated a little differently
|
// Because the name may contain _, it needs to be treated a little differently
|
||||||
.replaceAll("_=([A-Z])", "_$1")
|
.replaceAll("_=([A-Z])", "_$1")
|
||||||
// The content that is not named in all caps is then converted
|
// The content that is not named in all caps is then converted
|
||||||
.replaceAll("([a-z])=([A-Z])", "$1_$2")
|
.replaceAll("([a-z])=([A-Z])", "$1_$2")
|
||||||
// Remove any extra horizontal lines
|
// Remove any extra horizontal lines
|
||||||
.replace("=", "")
|
.replace("=", "")
|
||||||
// Replace the underscore with a dash
|
// Replace the underscore with a dash
|
||||||
.replace("_", "-")
|
.replace("_", "-")
|
||||||
// Finally, convert it to all lowercase
|
// Finally, convert it to all lowercase
|
||||||
.toLowerCase();
|
.toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -901,9 +901,9 @@ public interface ConfigureSection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static <T, C extends Collection<T>> @NotNull C parseCollection(
|
static <T, C extends Collection<T>> @NotNull C parseCollection(
|
||||||
@Nullable List<?> data,
|
@Nullable List<?> data,
|
||||||
@NotNull Supplier<C> constructor,
|
@NotNull Supplier<C> constructor,
|
||||||
@NotNull DataFunction<Object, T> parser
|
@NotNull DataFunction<Object, T> parser
|
||||||
) {
|
) {
|
||||||
C values = constructor.get();
|
C values = constructor.get();
|
||||||
if (data == null) return values;
|
if (data == null) return values;
|
||||||
|
|||||||
@@ -17,9 +17,9 @@ import java.util.Set;
|
|||||||
* @see ConfigureSection
|
* @see ConfigureSection
|
||||||
*/
|
*/
|
||||||
public abstract class ConfigureSource<
|
public abstract class ConfigureSource<
|
||||||
SECTION extends ConfigureSection, ORIGINAL,
|
SECTION extends ConfigureSection, ORIGINAL,
|
||||||
SELF extends ConfigureSource<SECTION, ORIGINAL, SELF>>
|
SELF extends ConfigureSource<SECTION, ORIGINAL, SELF>>
|
||||||
implements ConfigureSection {
|
implements ConfigureSection {
|
||||||
|
|
||||||
protected final @NotNull ConfigurationHolder<? extends SELF> holder;
|
protected final @NotNull ConfigurationHolder<? extends SELF> holder;
|
||||||
protected long lastUpdateMillis;
|
protected long lastUpdateMillis;
|
||||||
|
|||||||
@@ -135,8 +135,8 @@ public class ConfiguredMap<K, V> extends CachedConfigValue<Map<K, V>, V> impleme
|
|||||||
for (Map.Entry<K, V> entry : value.entrySet()) {
|
for (Map.Entry<K, V> entry : value.entrySet()) {
|
||||||
try {
|
try {
|
||||||
data.put(
|
data.put(
|
||||||
keySerializer.serialize(holder(), keyType(), entry.getKey()),
|
keySerializer.serialize(holder(), keyType(), entry.getKey()),
|
||||||
valueSerializer.serialize(holder(), valueType(), withValidated(entry.getValue()))
|
valueSerializer.serialize(holder(), valueType(), withValidated(entry.getValue()))
|
||||||
);
|
);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throwing(path + "." + entry.getKey(), e);
|
throwing(path + "." + entry.getKey(), e);
|
||||||
|
|||||||
@@ -85,9 +85,9 @@ public class ConfiguredValue<V> extends CachedConfigValue<V, V> {
|
|||||||
|
|
||||||
public static <V> ConfiguredValue<V> of(@NotNull ValueType<V> type, @NotNull Supplier<@Nullable V> defaultSupplier) {
|
public static <V> ConfiguredValue<V> of(@NotNull ValueType<V> type, @NotNull Supplier<@Nullable V> defaultSupplier) {
|
||||||
return of(
|
return of(
|
||||||
new ValueManifest<>(type, defaultSupplier),
|
new ValueManifest<>(type, defaultSupplier),
|
||||||
(provider, t, data) -> provider.deserialize(type, data),
|
(provider, t, data) -> provider.deserialize(type, data),
|
||||||
(provider, t, value) -> provider.serialize(value)
|
(provider, t, value) -> provider.serialize(value)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
//import java.util.LinkedList;
|
//import java.util.LinkedList;
|
||||||
//import java.util.List;
|
//import java.util.List;
|
||||||
//
|
//
|
||||||
///**
|
/// **
|
||||||
// * @author Chris2018998
|
// * @author Chris2018998
|
||||||
// */
|
// */
|
||||||
//public class OffsetUtil {
|
//public class OffsetUtil {
|
||||||
@@ -25,15 +25,15 @@
|
|||||||
// } catch (NoSuchFieldException | IllegalAccessException e) {
|
// } catch (NoSuchFieldException | IllegalAccessException e) {
|
||||||
// e.printStackTrace();
|
// e.printStackTrace();
|
||||||
// }
|
// }
|
||||||
//// try {
|
/// / try {
|
||||||
//// unsafe = AccessController.doPrivileged((PrivilegedExceptionAction<Unsafe>) () -> {
|
/// / unsafe = AccessController.doPrivileged((PrivilegedExceptionAction<Unsafe>) () -> {
|
||||||
//// Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
|
/// / Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
|
||||||
//// theUnsafe.setAccessible(true);
|
/// / theUnsafe.setAccessible(true);
|
||||||
//// return (Unsafe) theUnsafe.get(null);
|
/// / return (Unsafe) theUnsafe.get(null);
|
||||||
//// });
|
/// / });
|
||||||
//// } catch (Throwable e) {
|
/// / } catch (Throwable e) {
|
||||||
//// System.err.println("Unable to load unsafe");
|
/// / System.err.println("Unable to load unsafe");
|
||||||
//// }
|
/// / }
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// public static List<FieldOffset> getClassMemberOffset(Class<?> beanClass) {
|
// public static List<FieldOffset> getClassMemberOffset(Class<?> beanClass) {
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ public interface DatabaseConfiguration extends Configuration {
|
|||||||
|
|
||||||
@ConfigPath("driver")
|
@ConfigPath("driver")
|
||||||
@HeaderComments({
|
@HeaderComments({
|
||||||
"数据库驱动配置,请根据数据库类型设置。",
|
"数据库驱动配置,请根据数据库类型设置。",
|
||||||
"- MySQL(旧): com.mysql.jdbc.Driver",
|
"- MySQL(旧): com.mysql.jdbc.Driver",
|
||||||
"- MySQL(新): com.mysql.cj.jdbc.Driver",
|
"- MySQL(新): com.mysql.cj.jdbc.Driver",
|
||||||
"- MariaDB(推荐): org.mariadb.jdbc.Driver",
|
"- MariaDB(推荐): org.mariadb.jdbc.Driver",
|
||||||
})
|
})
|
||||||
ConfiguredValue<String> DRIVER_NAME = ConfiguredValue.of(
|
ConfiguredValue<String> DRIVER_NAME = ConfiguredValue.of(
|
||||||
String.class, "com.mysql.cj.jdbc.Driver"
|
String.class, "com.mysql.cj.jdbc.Driver"
|
||||||
);
|
);
|
||||||
|
|
||||||
ConfiguredValue<String> HOST = ConfiguredValue.of(String.class, "127.0.0.1");
|
ConfiguredValue<String> HOST = ConfiguredValue.of(String.class, "127.0.0.1");
|
||||||
|
|||||||
+24
-24
@@ -16,10 +16,10 @@ import java.util.UUID;
|
|||||||
@ConfigPath(root = true)
|
@ConfigPath(root = true)
|
||||||
@HeaderComments({"此处内容将显示在配置文件的最上方"})
|
@HeaderComments({"此处内容将显示在配置文件的最上方"})
|
||||||
@FooterComments({
|
@FooterComments({
|
||||||
"------------------------------------------------",
|
"------------------------------------------------",
|
||||||
"此处内容将显示在配置文件的最下方",
|
"此处内容将显示在配置文件的最下方",
|
||||||
"可用于显示版权信息等",
|
"可用于显示版权信息等",
|
||||||
"感谢您使用 https://github.com/CarmJos/configured !"
|
"感谢您使用 https://github.com/CarmJos/configured !"
|
||||||
})
|
})
|
||||||
public interface DemoConfiguration extends Configuration {
|
public interface DemoConfiguration extends Configuration {
|
||||||
|
|
||||||
@@ -38,30 +38,30 @@ public interface DemoConfiguration extends Configuration {
|
|||||||
@HeaderComments({"空值测试"})
|
@HeaderComments({"空值测试"})
|
||||||
@InlineComment("空值Inline注释")
|
@InlineComment("空值Inline注释")
|
||||||
ConfiguredMap<String, String> EMPTY = ConfiguredMap.builderOf(String.class, String.class)
|
ConfiguredMap<String, String> EMPTY = ConfiguredMap.builderOf(String.class, String.class)
|
||||||
.asLinkedMap().fromString()
|
.asLinkedMap().fromString()
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@ConfigPath("registered_users") // 通过注解规定配置文件中的路径,若不进行注解则以变量名自动生成。
|
@ConfigPath("registered_users") // 通过注解规定配置文件中的路径,若不进行注解则以变量名自动生成。
|
||||||
@HeaderComments({"Section类型数据测试"}) // 通过注解给配置添加注释。
|
@HeaderComments({"Section类型数据测试"}) // 通过注解给配置添加注释。
|
||||||
@InlineComment("默认地注释会加到Section的首行末尾") // 通过注解给配置添加注释。
|
@InlineComment("默认地注释会加到Section的首行末尾") // 通过注解给配置添加注释。
|
||||||
ConfiguredList<UserRecord> ALLOWLISTS = ConfiguredList.builderOf(UserRecord.class).fromSection()
|
ConfiguredList<UserRecord> ALLOWLISTS = ConfiguredList.builderOf(UserRecord.class).fromSection()
|
||||||
.parse(UserRecord::deserialize).serialize(UserRecord::serialize)
|
.parse(UserRecord::deserialize).serialize(UserRecord::serialize)
|
||||||
.defaults(UserRecord.CARM).build();
|
.defaults(UserRecord.CARM).build();
|
||||||
|
|
||||||
@HeaderComments({
|
@HeaderComments({
|
||||||
"------------------------------------------------",
|
"------------------------------------------------",
|
||||||
"[ID - ItemStack]对照表", "", "用于测试Map类型的解析与序列化保存"
|
"[ID - ItemStack]对照表", "", "用于测试Map类型的解析与序列化保存"
|
||||||
})
|
})
|
||||||
@FooterComments("------------------------------------------------")
|
@FooterComments("------------------------------------------------")
|
||||||
ConfiguredMap<Integer, ItemStack> ITEMS = ConfiguredMap.builderOf(Integer.class, ItemStack.class)
|
ConfiguredMap<Integer, ItemStack> ITEMS = ConfiguredMap.builderOf(Integer.class, ItemStack.class)
|
||||||
.asLinkedMap().fromSection()
|
.asLinkedMap().fromSection()
|
||||||
.parseKey(data -> Integer.parseInt(data))
|
.parseKey(data -> Integer.parseInt(data))
|
||||||
.parse(ItemStack::deserialize).serialize(ItemStack::serialize)
|
.parse(ItemStack::deserialize).serialize(ItemStack::serialize)
|
||||||
.defaults(m -> {
|
.defaults(m -> {
|
||||||
m.put(1, new ItemStack("stone", 64));
|
m.put(1, new ItemStack("stone", 64));
|
||||||
m.put(2, new ItemStack("iron", 64, "铁锭", Arrays.asList("一些铁锭", "可以制造东西")));
|
m.put(2, new ItemStack("iron", 64, "铁锭", Arrays.asList("一些铁锭", "可以制造东西")));
|
||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -72,18 +72,18 @@ public interface DemoConfiguration extends Configuration {
|
|||||||
|
|
||||||
@ConfigPath(value = "uuid-value", root = true)
|
@ConfigPath(value = "uuid-value", root = true)
|
||||||
public static final ConfiguredValue<UUID> UUID_CONFIG_VALUE = ConfiguredValue
|
public static final ConfiguredValue<UUID> UUID_CONFIG_VALUE = ConfiguredValue
|
||||||
.builderOf(UUID.class).fromString()
|
.builderOf(UUID.class).fromString()
|
||||||
.parse((holder, data) -> UUID.fromString(data))
|
.parse((holder, data) -> UUID.fromString(data))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@HeaderComments({"内部类的内部类测试", "通过这种方式,您可以轻易实现多层次的配置文件结构"})
|
@HeaderComments({"内部类的内部类测试", "通过这种方式,您可以轻易实现多层次的配置文件结构"})
|
||||||
@FooterComments({"-------------"})
|
@FooterComments({"-------------"})
|
||||||
public interface That extends Configuration {
|
public interface That extends Configuration {
|
||||||
|
|
||||||
ConfiguredList<UUID> OPERATORS = ConfiguredList
|
ConfiguredList<UUID> OPERATORS = ConfiguredList
|
||||||
.builderOf(UUID.class).fromString()
|
.builderOf(UUID.class).fromString()
|
||||||
.parse(s -> Objects.requireNonNull(UUID.fromString(s)))
|
.parse(s -> Objects.requireNonNull(UUID.fromString(s)))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import cc.carm.lib.configuration.Configuration
|
|||||||
import cc.carm.lib.configuration.annotation.ConfigPath
|
import cc.carm.lib.configuration.annotation.ConfigPath
|
||||||
import cc.carm.lib.configuration.annotation.ConfigVersion
|
import cc.carm.lib.configuration.annotation.ConfigVersion
|
||||||
import cc.carm.lib.configuration.kotlin.value.*
|
import cc.carm.lib.configuration.kotlin.value.*
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
@ConfigPath(root = true)
|
@ConfigPath(root = true)
|
||||||
object KotlinConfiguration : Configuration {
|
object KotlinConfiguration : Configuration {
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ public class RegistryConfig implements Configuration {
|
|||||||
@InlineComment(value = "用户名(匹配注释)", regex = "name") // 通过注解给配置添加注释。
|
@InlineComment(value = "用户名(匹配注释)", regex = "name") // 通过注解给配置添加注释。
|
||||||
@InlineComment(value = "信息", regex = {"info.*", "info.game.*"}) // 通过注解给配置添加注释。
|
@InlineComment(value = "信息", regex = {"info.*", "info.game.*"}) // 通过注解给配置添加注释。
|
||||||
public final ConfiguredValue<UserRecord> OWNER = ConfiguredValue.builderOf(UserRecord.class).fromSection()
|
public final ConfiguredValue<UserRecord> OWNER = ConfiguredValue.builderOf(UserRecord.class).fromSection()
|
||||||
.defaults(new UserRecord("Carm", UUID.randomUUID()))
|
.defaults(new UserRecord("Carm", UUID.randomUUID()))
|
||||||
.parse((holder, section) -> UserRecord.deserialize(section))
|
.parse((holder, section) -> UserRecord.deserialize(section))
|
||||||
.serialize((holder, data) -> data.serialize()).build();
|
.serialize((holder, data) -> data.serialize()).build();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,10 +69,10 @@ public class ItemStack {
|
|||||||
|
|
||||||
public static ItemStack deserialize(ConfigureSection section) {
|
public static ItemStack deserialize(ConfigureSection section) {
|
||||||
return new ItemStack(
|
return new ItemStack(
|
||||||
section.getString("material"),
|
section.getString("material"),
|
||||||
section.getInt("amount", 1),
|
section.getInt("amount", 1),
|
||||||
section.getString("name"),
|
section.getString("name"),
|
||||||
section.getStringList("lore")
|
section.getStringList("lore")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ public class UserRecord extends AbstractRecord {
|
|||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "TestUser{" +
|
return "TestUser{" +
|
||||||
"name='" + name + '\'' +
|
"name='" + name + '\'' +
|
||||||
", uuid=" + uuid +
|
", uuid=" + uuid +
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10,9 +10,9 @@ import java.io.File;
|
|||||||
public class JSONConfigTests {
|
public class JSONConfigTests {
|
||||||
|
|
||||||
protected final ConfigurationHolder<?> holder = JSONConfigFactory
|
protected final ConfigurationHolder<?> holder = JSONConfigFactory
|
||||||
.from(new File("target"), "config.json")
|
.from(new File("target"), "config.json")
|
||||||
.resourcePath("example.json")
|
.resourcePath("example.json")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onTest() {
|
public void onTest() {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public class YamlTests {
|
|||||||
public void test() {
|
public void test() {
|
||||||
|
|
||||||
ConfigurationHolder<YAMLSource> holder = YAMLConfigFactory.from("target/tests.yml")
|
ConfigurationHolder<YAMLSource> holder = YAMLConfigFactory.from("target/tests.yml")
|
||||||
.resourcePath("configs/sample.yml").build();
|
.resourcePath("configs/sample.yml").build();
|
||||||
|
|
||||||
Validators.activate(holder);
|
Validators.activate(holder);
|
||||||
|
|
||||||
|
|||||||
@@ -28,22 +28,22 @@ public class MongoTest {
|
|||||||
gsonHolder.initialize(MongoConfig.class);
|
gsonHolder.initialize(MongoConfig.class);
|
||||||
|
|
||||||
MongoClientSettings settings = MongoClientSettings.builder()
|
MongoClientSettings settings = MongoClientSettings.builder()
|
||||||
.applyConnectionString(new ConnectionString(
|
.applyConnectionString(new ConnectionString(
|
||||||
"mongodb://" + MongoConfig.HOST.resolve() + ":" + MongoConfig.PORT.resolve()
|
"mongodb://" + MongoConfig.HOST.resolve() + ":" + MongoConfig.PORT.resolve()
|
||||||
))
|
))
|
||||||
.credential(MongoCredential.createCredential(
|
.credential(MongoCredential.createCredential(
|
||||||
MongoConfig.USERNAME.resolve(), MongoConfig.DATABASE.resolve(),
|
MongoConfig.USERNAME.resolve(), MongoConfig.DATABASE.resolve(),
|
||||||
MongoConfig.PASSWORD.resolve().toCharArray()
|
MongoConfig.PASSWORD.resolve().toCharArray()
|
||||||
))
|
))
|
||||||
.uuidRepresentation(UuidRepresentation.STANDARD)
|
.uuidRepresentation(UuidRepresentation.STANDARD)
|
||||||
.build();
|
.build();
|
||||||
MongoClient mongoClient = MongoClients.create(settings);
|
MongoClient mongoClient = MongoClients.create(settings);
|
||||||
MongoDatabase mongoDatabase = mongoClient.getDatabase(MongoConfig.DATABASE.resolve());
|
MongoDatabase mongoDatabase = mongoClient.getDatabase(MongoConfig.DATABASE.resolve());
|
||||||
|
|
||||||
ConfigurationHolder<?> mongoHolder = MongoConfigFactory
|
ConfigurationHolder<?> mongoHolder = MongoConfigFactory
|
||||||
.from(mongoDatabase, "configs")
|
.from(mongoDatabase, "configs")
|
||||||
.namespace("my_plugin")
|
.namespace("my_plugin")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// Test the configuration
|
// Test the configuration
|
||||||
ConfigurationTest.testDemo(mongoHolder);
|
ConfigurationTest.testDemo(mongoHolder);
|
||||||
|
|||||||
@@ -33,9 +33,9 @@ public class SQLConfigTest {
|
|||||||
manager.setDebugMode(true);
|
manager.setDebugMode(true);
|
||||||
|
|
||||||
ConfigurationHolder<?> holder = SQLConfigFactory.from(manager)
|
ConfigurationHolder<?> holder = SQLConfigFactory.from(manager)
|
||||||
.tableName("test_configs")
|
.tableName("test_configs")
|
||||||
.namespace("testing")
|
.namespace("testing")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
ConfigurationTest.testDemo(holder);
|
ConfigurationTest.testDemo(holder);
|
||||||
ConfigurationTest.testInner(holder);
|
ConfigurationTest.testInner(holder);
|
||||||
|
|||||||
+4
-4
@@ -42,12 +42,12 @@ public interface CommentableMeta {
|
|||||||
|
|
||||||
static void register(@NotNull ConfigurationInitializer initializer) {
|
static void register(@NotNull ConfigurationInitializer initializer) {
|
||||||
initializer.registerAnnotation(
|
initializer.registerAnnotation(
|
||||||
HeaderComments.class, HEADER,
|
HeaderComments.class, HEADER,
|
||||||
a -> Arrays.asList(a.value())
|
a -> Arrays.asList(a.value())
|
||||||
);
|
);
|
||||||
initializer.registerAnnotation(
|
initializer.registerAnnotation(
|
||||||
FooterComments.class, FOOTER,
|
FooterComments.class, FOOTER,
|
||||||
a -> Arrays.asList(a.value())
|
a -> Arrays.asList(a.value())
|
||||||
);
|
);
|
||||||
initializer.registerAnnotation(InlineComment.class, INLINE, a -> {
|
initializer.registerAnnotation(InlineComment.class, INLINE, a -> {
|
||||||
Map<String, String> map = new HashMap<>();
|
Map<String, String> map = new HashMap<>();
|
||||||
|
|||||||
+2
-2
@@ -9,8 +9,8 @@ import java.io.File;
|
|||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
|
||||||
public abstract class FileConfigFactory<SOURCE extends FileConfigSource<?, ?, SOURCE>,
|
public abstract class FileConfigFactory<SOURCE extends FileConfigSource<?, ?, SOURCE>,
|
||||||
HOLDER extends ConfigurationHolder<SOURCE>, SELF extends FileConfigFactory<SOURCE, HOLDER, SELF>>
|
HOLDER extends ConfigurationHolder<SOURCE>, SELF extends FileConfigFactory<SOURCE, HOLDER, SELF>>
|
||||||
extends ConfigurationFactory<SOURCE, HOLDER, SELF> {
|
extends ConfigurationFactory<SOURCE, HOLDER, SELF> {
|
||||||
|
|
||||||
|
|
||||||
protected @NotNull File file;
|
protected @NotNull File file;
|
||||||
|
|||||||
+2
-2
@@ -17,7 +17,7 @@ import java.nio.file.Files;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public abstract class FileConfigSource<SECTION extends ConfigureSection, ORIGINAL, SELF extends FileConfigSource<SECTION, ORIGINAL, SELF>>
|
public abstract class FileConfigSource<SECTION extends ConfigureSection, ORIGINAL, SELF extends FileConfigSource<SECTION, ORIGINAL, SELF>>
|
||||||
extends ConfigureSource<SECTION, ORIGINAL, SELF> {
|
extends ConfigureSource<SECTION, ORIGINAL, SELF> {
|
||||||
|
|
||||||
protected final @NotNull File file;
|
protected final @NotNull File file;
|
||||||
protected final @Nullable String resourcePath;
|
protected final @Nullable String resourcePath;
|
||||||
@@ -116,7 +116,7 @@ public abstract class FileConfigSource<SECTION extends ConfigureSection, ORIGINA
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void saveResource(@NotNull String resourcePath, boolean replace)
|
protected void saveResource(@NotNull String resourcePath, boolean replace)
|
||||||
throws IOException, IllegalArgumentException {
|
throws IOException, IllegalArgumentException {
|
||||||
Objects.requireNonNull(resourcePath, "ResourcePath cannot be null");
|
Objects.requireNonNull(resourcePath, "ResourcePath cannot be null");
|
||||||
if (resourcePath.isEmpty()) throw new IllegalArgumentException("ResourcePath cannot be empty");
|
if (resourcePath.isEmpty()) throw new IllegalArgumentException("ResourcePath cannot be empty");
|
||||||
|
|
||||||
|
|||||||
-2
@@ -1,7 +1,5 @@
|
|||||||
package cc.carm.lib.configuration.source.option;
|
package cc.carm.lib.configuration.source.option;
|
||||||
|
|
||||||
import cc.carm.lib.configuration.source.option.ConfigurationOption;
|
|
||||||
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -27,8 +27,8 @@ public class ConfiguredText<MSG, RECEIVER> extends ConfiguredValue<TextContents>
|
|||||||
|
|
||||||
public static final ValueType<TextContents> TEXT_TYPE = ValueType.of(TextContents.class);
|
public static final ValueType<TextContents> TEXT_TYPE = ValueType.of(TextContents.class);
|
||||||
public static final ValueAdapter<TextContents> TEXT_ADAPTER = new ValueAdapter<>(TEXT_TYPE,
|
public static final ValueAdapter<TextContents> TEXT_ADAPTER = new ValueAdapter<>(TEXT_TYPE,
|
||||||
(h, t, d) -> d.serialize(),
|
(h, t, d) -> d.serialize(),
|
||||||
(h, t, d) -> TextContents.deserialize(d)
|
(h, t, d) -> TextContents.deserialize(d)
|
||||||
);
|
);
|
||||||
|
|
||||||
protected final @NotNull BiFunction<RECEIVER, String, String> parser;
|
protected final @NotNull BiFunction<RECEIVER, String, String> parser;
|
||||||
@@ -51,8 +51,8 @@ public class ConfiguredText<MSG, RECEIVER> extends ConfiguredValue<TextContents>
|
|||||||
|
|
||||||
public PreparedText<MSG, RECEIVER> prepare(@NotNull Object... values) {
|
public PreparedText<MSG, RECEIVER> prepare(@NotNull Object... values) {
|
||||||
return new PreparedText<MSG, RECEIVER>(resolve(), this.params)
|
return new PreparedText<MSG, RECEIVER>(resolve(), this.params)
|
||||||
.parser(this.parser).compiler(this.compiler)
|
.parser(this.parser).compiler(this.compiler)
|
||||||
.dispatcher(this.dispatcher).placeholders(values);
|
.dispatcher(this.dispatcher).placeholders(values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -120,7 +120,7 @@ public class ConfiguredText<MSG, RECEIVER> extends ConfiguredValue<TextContents>
|
|||||||
}
|
}
|
||||||
|
|
||||||
public abstract static class Builder<MSG, RECEIVER, SELF extends Builder<MSG, RECEIVER, SELF>>
|
public abstract static class Builder<MSG, RECEIVER, SELF extends Builder<MSG, RECEIVER, SELF>>
|
||||||
extends AbstractConfigBuilder<TextContents, TextContents, ConfiguredText<MSG, RECEIVER>, ConfigurationHolder<?>, SELF> {
|
extends AbstractConfigBuilder<TextContents, TextContents, ConfiguredText<MSG, RECEIVER>, ConfigurationHolder<?>, SELF> {
|
||||||
protected @NotNull TextContents.Builder defaultBuilder = TextContents.builder();
|
protected @NotNull TextContents.Builder defaultBuilder = TextContents.builder();
|
||||||
protected @NotNull String[] params = new String[0];
|
protected @NotNull String[] params = new String[0];
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ import java.util.function.Function;
|
|||||||
import java.util.function.UnaryOperator;
|
import java.util.function.UnaryOperator;
|
||||||
|
|
||||||
public abstract class ContentHandler<RECEIVER, SELF extends ContentHandler<RECEIVER, SELF>>
|
public abstract class ContentHandler<RECEIVER, SELF extends ContentHandler<RECEIVER, SELF>>
|
||||||
implements Replaceable<RECEIVER, SELF>, Insertable<RECEIVER, SELF> {
|
implements Replaceable<RECEIVER, SELF>, Insertable<RECEIVER, SELF> {
|
||||||
|
|
||||||
protected BiFunction<RECEIVER, String, String> parser = (receiver, value) -> value;
|
protected BiFunction<RECEIVER, String, String> parser = (receiver, value) -> value;
|
||||||
protected String lineSeparator = System.lineSeparator();
|
protected String lineSeparator = System.lineSeparator();
|
||||||
|
|||||||
-1
@@ -1,6 +1,5 @@
|
|||||||
package cc.carm.lib.configuration.value.text.function;
|
package cc.carm.lib.configuration.value.text.function;
|
||||||
|
|
||||||
import cc.carm.lib.configuration.value.text.data.TextContents;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ import java.util.function.BiFunction;
|
|||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public abstract class TextParser<RECEIVER, SELF extends TextParser<RECEIVER, SELF>>
|
public abstract class TextParser<RECEIVER, SELF extends TextParser<RECEIVER, SELF>>
|
||||||
extends ContentHandler<RECEIVER, SELF> {
|
extends ContentHandler<RECEIVER, SELF> {
|
||||||
|
|
||||||
public abstract TextContents texts();
|
public abstract TextContents texts();
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -29,7 +29,7 @@ public class AppendLineInserter<RECEIVER> extends ContentInserter<RECEIVER> {
|
|||||||
* </ul>
|
* </ul>
|
||||||
*/
|
*/
|
||||||
public static final @NotNull Pattern APPEND_PATTERN = Pattern.compile(
|
public static final @NotNull Pattern APPEND_PATTERN = Pattern.compile(
|
||||||
"^(?:\\{(?<prefix>.*)})?#(?<id>.*)#(?:\\{(?<above>-?\\d+)(?:,(?<down>-?\\d+))?})?$"
|
"^(?:\\{(?<prefix>.*)})?#(?<id>.*)#(?:\\{(?<above>-?\\d+)(?:,(?<down>-?\\d+))?})?$"
|
||||||
);
|
);
|
||||||
|
|
||||||
public AppendLineInserter(int priority) {
|
public AppendLineInserter(int priority) {
|
||||||
@@ -50,9 +50,9 @@ public class AppendLineInserter<RECEIVER> extends ContentInserter<RECEIVER> {
|
|||||||
|
|
||||||
String prefix = Optional.ofNullable(matcher.group("prefix")).orElse("");
|
String prefix = Optional.ofNullable(matcher.group("prefix")).orElse("");
|
||||||
int offsetAbove = Optional.ofNullable(matcher.group("above"))
|
int offsetAbove = Optional.ofNullable(matcher.group("above"))
|
||||||
.map(Integer::parseInt).orElse(0);
|
.map(Integer::parseInt).orElse(0);
|
||||||
int offsetDown = Optional.ofNullable(matcher.group("down"))
|
int offsetDown = Optional.ofNullable(matcher.group("down"))
|
||||||
.map(Integer::parseInt).orElse(offsetAbove); // If offsetDown is not set, use offsetAbove
|
.map(Integer::parseInt).orElse(offsetAbove); // If offsetDown is not set, use offsetAbove
|
||||||
|
|
||||||
List<String> contents = new ArrayList<>();
|
List<String> contents = new ArrayList<>();
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ public class OptionalLineInserter<RECEIVER> extends ContentInserter<RECEIVER> {
|
|||||||
* </ul>
|
* </ul>
|
||||||
*/
|
*/
|
||||||
public static final @NotNull Pattern OPTIONAL_PATTERN = Pattern.compile(
|
public static final @NotNull Pattern OPTIONAL_PATTERN = Pattern.compile(
|
||||||
"^\\?\\[(?<id>.+)](?<content>.*)$"
|
"^\\?\\[(?<id>.+)](?<content>.*)$"
|
||||||
);
|
);
|
||||||
|
|
||||||
public OptionalLineInserter(int priority) {
|
public OptionalLineInserter(int priority) {
|
||||||
|
|||||||
+7
-7
@@ -12,9 +12,9 @@ import java.util.List;
|
|||||||
public class ConfigTest {
|
public class ConfigTest {
|
||||||
|
|
||||||
public static final String[] WEBSITES = new String[]{
|
public static final String[] WEBSITES = new String[]{
|
||||||
"https://carm.cc",
|
"https://carm.cc",
|
||||||
"https://www.baidu.com",
|
"https://www.baidu.com",
|
||||||
"https://www.google.com"
|
"https://www.google.com"
|
||||||
};
|
};
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -27,10 +27,10 @@ public class ConfigTest {
|
|||||||
System.out.println("--------------------------");
|
System.out.println("--------------------------");
|
||||||
|
|
||||||
List<String> str = AppMessages.WELCOME.prepare()
|
List<String> str = AppMessages.WELCOME.prepare()
|
||||||
.placeholders("Carm")
|
.placeholders("Carm")
|
||||||
.insert("guidance")
|
.insert("guidance")
|
||||||
.insert("websites", WEBSITES)
|
.insert("websites", WEBSITES)
|
||||||
.compile(System.out);
|
.compile(System.out);
|
||||||
|
|
||||||
System.out.println("--------------------------");
|
System.out.println("--------------------------");
|
||||||
|
|
||||||
|
|||||||
+9
-9
@@ -33,17 +33,17 @@ public class ParseTest {
|
|||||||
TextContents textContents = new TextContents(lines, optional);
|
TextContents textContents = new TextContents(lines, optional);
|
||||||
|
|
||||||
PreparedText<String, PrintStream> msg = new PreparedText<String, PrintStream>(textContents)
|
PreparedText<String, PrintStream> msg = new PreparedText<String, PrintStream>(textContents)
|
||||||
.dispatcher((p, s) -> s.forEach(p::println))
|
.dispatcher((p, s) -> s.forEach(p::println))
|
||||||
.parser((p, s) -> s)
|
.parser((p, s) -> s)
|
||||||
.compiler((p, s) -> s)
|
.compiler((p, s) -> s)
|
||||||
.replace( // Custom replacer, replace $UUID$ with Random UUID
|
.replace( // Custom replacer, replace $UUID$ with Random UUID
|
||||||
"$UUID$", () -> UUID.randomUUID().toString()
|
"$UUID$", () -> UUID.randomUUID().toString()
|
||||||
);
|
);
|
||||||
|
|
||||||
msg.placeholder("name", "Carm")
|
msg.placeholder("name", "Carm")
|
||||||
.insert("guidance")
|
.insert("guidance")
|
||||||
.insert("click")
|
.insert("click")
|
||||||
.insert("websites", "Baidu", "Bilibili", "Google");
|
.insert("websites", "Baidu", "Bilibili", "Google");
|
||||||
|
|
||||||
|
|
||||||
System.out.println("----------------------------");
|
System.out.println("----------------------------");
|
||||||
|
|||||||
+13
-13
@@ -7,22 +7,22 @@ import cc.carm.lib.configuration.annotation.ConfigPath;
|
|||||||
public interface AppMessages extends Configuration {
|
public interface AppMessages extends Configuration {
|
||||||
|
|
||||||
ConfiguredMsg WELCOME = ConfiguredMsg.builder()
|
ConfiguredMsg WELCOME = ConfiguredMsg.builder()
|
||||||
.defaults(
|
.defaults(
|
||||||
"Hello, %(name)",
|
"Hello, %(name)",
|
||||||
"#more-creating#{1}",
|
"#more-creating#{1}",
|
||||||
"This is a test message",
|
"This is a test message",
|
||||||
"#guidance#",
|
"#guidance#",
|
||||||
"{- }#websites#{0,1}",
|
"{- }#websites#{0,1}",
|
||||||
"Thanks for your reading!")
|
"Thanks for your reading!")
|
||||||
.optional("guidance", "To get more information for %(name), see:")
|
.optional("guidance", "To get more information for %(name), see:")
|
||||||
.params("name").build();
|
.params("name").build();
|
||||||
|
|
||||||
ConfiguredMsg NO_PERMISSION = ConfiguredMsg.builder()
|
ConfiguredMsg NO_PERMISSION = ConfiguredMsg.builder()
|
||||||
.defaults("Sorry! But you don't have permissions to do this.")
|
.defaults("Sorry! But you don't have permissions to do this.")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
ConfiguredMsg NOT_AVAILABLE = ConfiguredMsg.builder()
|
ConfiguredMsg NOT_AVAILABLE = ConfiguredMsg.builder()
|
||||||
.defaults("Error! Service is not available now.", "Please contact your system manager.")
|
.defaults("Error! Service is not available now.", "Please contact your system manager.")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -20,11 +20,11 @@ public class ConfiguredMsg extends ConfiguredText<String, PrintStream> {
|
|||||||
public ConfiguredMsg(@NotNull ValueManifest<TextContents, TextContents> manifest,
|
public ConfiguredMsg(@NotNull ValueManifest<TextContents, TextContents> manifest,
|
||||||
@NotNull String[] params) {
|
@NotNull String[] params) {
|
||||||
super(
|
super(
|
||||||
manifest,
|
manifest,
|
||||||
(p, s) -> s,
|
(p, s) -> s,
|
||||||
(p, s) -> s,
|
(p, s) -> s,
|
||||||
(p, s) -> s.forEach(p::println),
|
(p, s) -> s.forEach(p::println),
|
||||||
params
|
params
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,24 @@
|
|||||||
# configured-JSON
|
# configured-JSON
|
||||||
|
|
||||||
JSON file-based implementation, compatible with all Java environments.
|
JSON
|
||||||
|
file-based
|
||||||
|
implementation,
|
||||||
|
compatible
|
||||||
|
with
|
||||||
|
all
|
||||||
|
Java
|
||||||
|
environments.
|
||||||
|
|
||||||
**Remember that JSON does not support file comments.**
|
*
|
||||||
|
*Remember
|
||||||
|
that
|
||||||
|
JSON
|
||||||
|
does
|
||||||
|
not
|
||||||
|
support
|
||||||
|
file
|
||||||
|
comments.
|
||||||
|
**
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
|
|||||||
@@ -17,11 +17,11 @@ import java.util.Objects;
|
|||||||
public class JSONSource extends FileConfigSource<SourcedSection, Map<String, Object>, JSONSource> {
|
public class JSONSource extends FileConfigSource<SourcedSection, Map<String, Object>, JSONSource> {
|
||||||
|
|
||||||
public static final @NotNull Gson DEFAULT_GSON = new GsonBuilder()
|
public static final @NotNull Gson DEFAULT_GSON = new GsonBuilder()
|
||||||
.serializeNulls().disableHtmlEscaping().setPrettyPrinting()
|
.serializeNulls().disableHtmlEscaping().setPrettyPrinting()
|
||||||
.registerTypeAdapter(
|
.registerTypeAdapter(
|
||||||
SourcedSection.class,
|
SourcedSection.class,
|
||||||
(JsonSerializer<SourcedSection>) (src, t, c) -> c.serialize(src.data())
|
(JsonSerializer<SourcedSection>) (src, t, c) -> c.serialize(src.data())
|
||||||
).create();
|
).create();
|
||||||
|
|
||||||
protected final @NotNull Gson gson;
|
protected final @NotNull Gson gson;
|
||||||
protected @Nullable SourcedSection rootSection;
|
protected @Nullable SourcedSection rootSection;
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
# configured-HOCON
|
# configured-HOCON
|
||||||
|
|
||||||
HOCON file-based implementation, compatible with all Java environments.
|
HOCON
|
||||||
|
file-based
|
||||||
|
implementation,
|
||||||
|
compatible
|
||||||
|
with
|
||||||
|
all
|
||||||
|
Java
|
||||||
|
environments.
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
|
|||||||
+30
-27
@@ -9,15 +9,18 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.*;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
public class HOCONSource
|
public class HOCONSource
|
||||||
extends FileConfigSource<SourcedSection, Map<String, Object>, HOCONSource> {
|
extends FileConfigSource<SourcedSection, Map<String, Object>, HOCONSource> {
|
||||||
protected @Nullable SourcedSection rootSection;
|
protected @Nullable SourcedSection rootSection;
|
||||||
|
|
||||||
protected HOCONSource(
|
protected HOCONSource(
|
||||||
@NotNull ConfigurationHolder<? extends HOCONSource> holder,
|
@NotNull ConfigurationHolder<? extends HOCONSource> holder,
|
||||||
@NotNull File file, @Nullable String resourcePath
|
@NotNull File file, @Nullable String resourcePath
|
||||||
) {
|
) {
|
||||||
super(holder, 0, file, resourcePath);
|
super(holder, 0, file, resourcePath);
|
||||||
|
|
||||||
@@ -54,32 +57,32 @@ public class HOCONSource
|
|||||||
// accumulator: 将 Section 中的信息为 typesafe config 添加并返回
|
// accumulator: 将 Section 中的信息为 typesafe config 添加并返回
|
||||||
// combiner: 合并两个配置文件
|
// combiner: 合并两个配置文件
|
||||||
Config config = this.getValues(true).entrySet().stream().reduce(
|
Config config = this.getValues(true).entrySet().stream().reduce(
|
||||||
ConfigFactory.empty(),
|
ConfigFactory.empty(),
|
||||||
(cfg, entry) -> {
|
(cfg, entry) -> {
|
||||||
String key = entry.getKey(); // 源数据 key
|
String key = entry.getKey(); // 源数据 key
|
||||||
Object value = entry.getValue(); // 源数据 value
|
Object value = entry.getValue(); // 源数据 value
|
||||||
|
|
||||||
ConfigValue result; // 最终转换为 typesafe 的 ConfigValue 类型
|
ConfigValue result; // 最终转换为 typesafe 的 ConfigValue 类型
|
||||||
if (value == null || value instanceof Boolean || value instanceof String || value instanceof Number) {
|
if (value == null || value instanceof Boolean || value instanceof String || value instanceof Number) {
|
||||||
result = ConfigValueFactory.fromAnyRef(value); // 原始数据类型
|
result = ConfigValueFactory.fromAnyRef(value); // 原始数据类型
|
||||||
} else if (value instanceof Iterator) {
|
} else if (value instanceof Iterator) {
|
||||||
result = ConfigValueFactory.fromIterable((Iterable<?>) value);
|
result = ConfigValueFactory.fromIterable((Iterable<?>) value);
|
||||||
} else if (value instanceof Map) {
|
} else if (value instanceof Map) {
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
result = ConfigValueFactory.fromMap((Map<String, ?>) value);
|
result = ConfigValueFactory.fromMap((Map<String, ?>) value);
|
||||||
} else {
|
} else {
|
||||||
result = ConfigValueFactory.fromAnyRef(String.valueOf(value));
|
result = ConfigValueFactory.fromAnyRef(String.valueOf(value));
|
||||||
}
|
}
|
||||||
List<String> headerComments = HOCONSource.this.getHeaderComments(key); // 获取其注释
|
List<String> headerComments = HOCONSource.this.getHeaderComments(key); // 获取其注释
|
||||||
result = result.withOrigin(result.origin().withComments(headerComments)); // 赋予其注释
|
result = result.withOrigin(result.origin().withComments(headerComments)); // 赋予其注释
|
||||||
return cfg.withValue(key, result); // 将其添加到根 config 中
|
return cfg.withValue(key, result); // 将其添加到根 config 中
|
||||||
},
|
},
|
||||||
Config::withFallback
|
Config::withFallback
|
||||||
);
|
);
|
||||||
return config.root().render(
|
return config.root().render(
|
||||||
ConfigRenderOptions.defaults()
|
ConfigRenderOptions.defaults()
|
||||||
.setJson(false)
|
.setJson(false)
|
||||||
.setOriginComments(false)
|
.setOriginComments(false)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,11 +18,11 @@ public interface SampleConfig extends Configuration {
|
|||||||
|
|
||||||
@HeaderComments({"[ UUID >-----------------------------------", "A lot of UUIDs"})
|
@HeaderComments({"[ UUID >-----------------------------------", "A lot of UUIDs"})
|
||||||
ConfiguredList<UUID> UUIDS = ConfiguredList.builderOf(UUID.class).fromString()
|
ConfiguredList<UUID> UUIDS = ConfiguredList.builderOf(UUID.class).fromString()
|
||||||
.parse(UUID::fromString).serialize(UUID::toString)
|
.parse(UUID::fromString).serialize(UUID::toString)
|
||||||
.defaults(
|
.defaults(
|
||||||
UUID.fromString("00000000-0000-0000-0000-000000000000"),
|
UUID.fromString("00000000-0000-0000-0000-000000000000"),
|
||||||
UUID.fromString("00000000-0000-0000-0000-000000000001")
|
UUID.fromString("00000000-0000-0000-0000-000000000001")
|
||||||
).build();
|
).build();
|
||||||
|
|
||||||
@ConfigPath("info") // Custom path
|
@ConfigPath("info") // Custom path
|
||||||
interface INFO extends Configuration {
|
interface INFO extends Configuration {
|
||||||
|
|||||||
@@ -4,14 +4,14 @@ import cc.carm.lib.configuration.source.ConfigurationHolder;
|
|||||||
import cc.carm.lib.configuration.source.hocon.HOCONConfigFactory;
|
import cc.carm.lib.configuration.source.hocon.HOCONConfigFactory;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class SampleTest {
|
public class SampleTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() {
|
public void test() {
|
||||||
// 1. Make a configuration provider from a file.
|
// 1. Make a configuration provider from a file.
|
||||||
ConfigurationHolder<?> holder = HOCONConfigFactory.from("target/config.conf")
|
ConfigurationHolder<?> holder = HOCONConfigFactory.from("target/config.conf")
|
||||||
.resourcePath("configs/sample.conf")
|
.resourcePath("configs/sample.conf")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// 2. Initialize the configuration classes or instances.
|
// 2. Initialize the configuration classes or instances.
|
||||||
holder.initialize(SampleConfig.class);
|
holder.initialize(SampleConfig.class);
|
||||||
|
|||||||
+47
-14
@@ -1,8 +1,16 @@
|
|||||||
# configured-SQL
|
# configured-SQL
|
||||||
|
|
||||||
SQL database implementation, support for MySQL or MariaDB.
|
SQL
|
||||||
|
database
|
||||||
|
implementation,
|
||||||
|
support
|
||||||
|
for
|
||||||
|
MySQL
|
||||||
|
or
|
||||||
|
MariaDB.
|
||||||
|
|
||||||
## Table schema
|
## Table schema
|
||||||
|
|
||||||
```mysql
|
```mysql
|
||||||
CREATE TABLE IF NOT EXISTS conf
|
CREATE TABLE IF NOT EXISTS conf
|
||||||
(
|
(
|
||||||
@@ -16,9 +24,11 @@ CREATE TABLE IF NOT EXISTS conf
|
|||||||
`version` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, # 配置项的版本
|
`version` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, # 配置项的版本
|
||||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, # 创建时间
|
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, # 创建时间
|
||||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
PRIMARY KEY (`namespace`, `path`)
|
PRIMARY KEY (`namespace`,
|
||||||
) ENGINE = InnoDB
|
`path`)
|
||||||
DEFAULT CHARSET = utf8mb4;
|
)
|
||||||
|
ENGINE = InnoDB
|
||||||
|
DEFAULT CHARSET = utf8mb4;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
@@ -32,16 +42,30 @@ CREATE TABLE IF NOT EXISTS conf
|
|||||||
|
|
||||||
<repository>
|
<repository>
|
||||||
<!-- Using Maven Central Repository for secure and stable updates, though synchronization might be needed. -->
|
<!-- Using Maven Central Repository for secure and stable updates, though synchronization might be needed. -->
|
||||||
<id>maven</id>
|
<id>
|
||||||
<name>Maven Central</name>
|
maven
|
||||||
<url>https://repo1.maven.org/maven2</url>
|
</id>
|
||||||
|
<name>
|
||||||
|
Maven
|
||||||
|
Central
|
||||||
|
</name>
|
||||||
|
<url>
|
||||||
|
https://repo1.maven.org/maven2
|
||||||
|
</url>
|
||||||
</repository>
|
</repository>
|
||||||
|
|
||||||
<repository>
|
<repository>
|
||||||
<!-- Using GitHub dependencies for real-time updates, configuration required (recommended). -->
|
<!-- Using GitHub dependencies for real-time updates, configuration required (recommended). -->
|
||||||
<id>configured</id>
|
<id>
|
||||||
<name>GitHub Packages</name>
|
configured
|
||||||
<url>https://maven.pkg.github.com/CarmJos/configured</url>
|
</id>
|
||||||
|
<name>
|
||||||
|
GitHub
|
||||||
|
Packages
|
||||||
|
</name>
|
||||||
|
<url>
|
||||||
|
https://maven.pkg.github.com/CarmJos/configured
|
||||||
|
</url>
|
||||||
</repository>
|
</repository>
|
||||||
|
|
||||||
</repositories>
|
</repositories>
|
||||||
@@ -53,10 +77,19 @@ CREATE TABLE IF NOT EXISTS conf
|
|||||||
<project>
|
<project>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>
|
||||||
<artifactId>configured-sql</artifactId>
|
cc.carm.lib
|
||||||
<version>[LATEST RELEASE]</version>
|
</groupId>
|
||||||
<scope>compile</scope>
|
<artifactId>
|
||||||
|
configured-sql
|
||||||
|
</artifactId>
|
||||||
|
<version>
|
||||||
|
[LATEST
|
||||||
|
RELEASE]
|
||||||
|
</version>
|
||||||
|
<scope>
|
||||||
|
compile
|
||||||
|
</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
+9
-9
@@ -32,7 +32,7 @@ public class SQLConfigFactory extends ConfigurationFactory<SQLSource, Configurat
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected static final @NotNull Gson DEFAULT_GSON = new GsonBuilder()
|
protected static final @NotNull Gson DEFAULT_GSON = new GsonBuilder()
|
||||||
.serializeNulls().disableHtmlEscaping().create();
|
.serializeNulls().disableHtmlEscaping().create();
|
||||||
|
|
||||||
protected static final @NotNull BiConsumer<String, TableCreateBuilder> DEFAULT_TABLE_SCHEMA = (tableName, builder) -> {
|
protected static final @NotNull BiConsumer<String, TableCreateBuilder> DEFAULT_TABLE_SCHEMA = (tableName, builder) -> {
|
||||||
builder.addColumn("namespace", "VARCHAR(32) NOT NULL");
|
builder.addColumn("namespace", "VARCHAR(32) NOT NULL");
|
||||||
@@ -48,17 +48,17 @@ public class SQLConfigFactory extends ConfigurationFactory<SQLSource, Configurat
|
|||||||
builder.addColumn("version", "MEDIUMINT UNSIGNED NOT NULL DEFAULT 0");
|
builder.addColumn("version", "MEDIUMINT UNSIGNED NOT NULL DEFAULT 0");
|
||||||
|
|
||||||
builder.addColumn(
|
builder.addColumn(
|
||||||
"create_time",
|
"create_time",
|
||||||
"TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"
|
"TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"
|
||||||
);
|
);
|
||||||
builder.addColumn(
|
builder.addColumn(
|
||||||
"update_time",
|
"update_time",
|
||||||
"TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
|
"TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"
|
||||||
);
|
);
|
||||||
|
|
||||||
builder.setIndex(
|
builder.setIndex(
|
||||||
IndexType.PRIMARY_KEY, "pk_" + tableName.toLowerCase(),
|
IndexType.PRIMARY_KEY, "pk_" + tableName.toLowerCase(),
|
||||||
"namespace", "path"
|
"namespace", "path"
|
||||||
);
|
);
|
||||||
builder.setTableSettings("ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
|
builder.setTableSettings("ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
|
||||||
};
|
};
|
||||||
@@ -163,8 +163,8 @@ public class SQLConfigFactory extends ConfigurationFactory<SQLSource, Configurat
|
|||||||
|
|
||||||
return new ConfigurationHolder<SQLSource>(this.adapters, this.options, this.metadata, this.initializer) {
|
return new ConfigurationHolder<SQLSource>(this.adapters, this.options, this.metadata, this.initializer) {
|
||||||
final SQLSource source = new SQLSource(
|
final SQLSource source = new SQLSource(
|
||||||
this, System.currentTimeMillis(),
|
this, System.currentTimeMillis(),
|
||||||
gson, manager, resolvers, tableName, namespace
|
gson, manager, resolvers, tableName, namespace
|
||||||
);
|
);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -7,6 +7,6 @@ public interface SQLOptions {
|
|||||||
/**
|
/**
|
||||||
* Whether to purge the configuration's in-database data when saving.
|
* Whether to purge the configuration's in-database data when saving.
|
||||||
*/
|
*/
|
||||||
ConfigurationOption<Boolean> PURGE = ConfigurationOption.of( true);
|
ConfigurationOption<Boolean> PURGE = ConfigurationOption.of(true);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,10 +104,10 @@ public class SQLSource extends ConfigureSource<SourcedSection, Map<String, Objec
|
|||||||
|
|
||||||
int version = holder().metadata(path).get(VersionedMetaTypes.VERSION, 0);
|
int version = holder().metadata(path).get(VersionedMetaTypes.VERSION, 0);
|
||||||
dataValues.add(new Object[]{
|
dataValues.add(new Object[]{
|
||||||
namespace, path, time, version, typeID, data,
|
namespace, path, time, version, typeID, data,
|
||||||
Commentable.getInlineComment(holder(), path),
|
Commentable.getInlineComment(holder(), path),
|
||||||
gson.toJson(Commentable.getHeaderComments(holder(), path)),
|
gson.toJson(Commentable.getHeaderComments(holder(), path)),
|
||||||
gson.toJson(Commentable.getFooterComments(holder(), path))
|
gson.toJson(Commentable.getFooterComments(holder(), path))
|
||||||
});
|
});
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
@@ -118,18 +118,18 @@ public class SQLSource extends ConfigureSource<SourcedSection, Map<String, Objec
|
|||||||
purge();
|
purge();
|
||||||
}
|
}
|
||||||
this.table.createReplaceBatch()
|
this.table.createReplaceBatch()
|
||||||
.setColumnNames(
|
.setColumnNames(
|
||||||
"namespace", "path", "update_time", "version", "type", "value",
|
"namespace", "path", "update_time", "version", "type", "value",
|
||||||
"inline_comment", "header_comments", "footer_comments"
|
"inline_comment", "header_comments", "footer_comments"
|
||||||
).setAllParams(dataValues).execute();
|
).setAllParams(dataValues).execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onReload() throws Exception {
|
protected void onReload() throws Exception {
|
||||||
Map<String, Object> loaded = new LinkedHashMap<>();
|
Map<String, Object> loaded = new LinkedHashMap<>();
|
||||||
try (SQLQuery query = this.table.createQuery()
|
try (SQLQuery query = this.table.createQuery()
|
||||||
.addCondition("namespace", namespace)
|
.addCondition("namespace", namespace)
|
||||||
.build().execute()) {
|
.build().execute()) {
|
||||||
ResultSet rs = query.getResultSet();
|
ResultSet rs = query.getResultSet();
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
String path = rs.getString("path");
|
String path = rs.getString("path");
|
||||||
@@ -161,9 +161,9 @@ public class SQLSource extends ConfigureSource<SourcedSection, Map<String, Objec
|
|||||||
|
|
||||||
protected int typeIdOf(@NotNull Object value) {
|
protected int typeIdOf(@NotNull Object value) {
|
||||||
return this.resolvers.entrySet().stream()
|
return this.resolvers.entrySet().stream()
|
||||||
.filter(entry -> entry.getValue().isInstance(value))
|
.filter(entry -> entry.getValue().isInstance(value))
|
||||||
.findFirst().map(Map.Entry::getKey)
|
.findFirst().map(Map.Entry::getKey)
|
||||||
.orElseThrow(() -> new IllegalStateException("No resolvers for value " + value.getClass().getName()));
|
.orElseThrow(() -> new IllegalStateException("No resolvers for value " + value.getClass().getName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
# configured-YAML
|
# configured-YAML
|
||||||
|
|
||||||
YAML file-based implementation, compatible with all Java environments.
|
YAML
|
||||||
|
file-based
|
||||||
|
implementation,
|
||||||
|
compatible
|
||||||
|
with
|
||||||
|
all
|
||||||
|
Java
|
||||||
|
environments.
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class YAMLSource
|
public class YAMLSource
|
||||||
extends FileConfigSource<SourcedSection, Map<String, Object>, YAMLSource>
|
extends FileConfigSource<SourcedSection, Map<String, Object>, YAMLSource>
|
||||||
implements CommentedSection {
|
implements CommentedSection {
|
||||||
|
|
||||||
protected final @NotNull YamlConstructor yamlConstructor;
|
protected final @NotNull YamlConstructor yamlConstructor;
|
||||||
protected final @NotNull YamlRepresenter yamlRepresenter;
|
protected final @NotNull YamlRepresenter yamlRepresenter;
|
||||||
@@ -109,9 +109,9 @@ public class YAMLSource
|
|||||||
@Override
|
@Override
|
||||||
public void save() throws Exception {
|
public void save() throws Exception {
|
||||||
CommentedYAMLWriter writer = new CommentedYAMLWriter(
|
CommentedYAMLWriter writer = new CommentedYAMLWriter(
|
||||||
String.valueOf(this.pathSeparator()),
|
String.valueOf(this.pathSeparator()),
|
||||||
dumperOptions().getIndent(),
|
dumperOptions().getIndent(),
|
||||||
holder.option(CommentableOptions.COMMENT_EMPTY_VALUE)
|
holder.option(CommentableOptions.COMMENT_EMPTY_VALUE)
|
||||||
);
|
);
|
||||||
try {
|
try {
|
||||||
fileWriter(w -> w.write(writer.saveToString(this)));
|
fileWriter(w -> w.write(writer.saveToString(this)));
|
||||||
|
|||||||
@@ -23,11 +23,11 @@ public interface SampleConfig extends Configuration {
|
|||||||
@HeaderComments({"[ UUID >-----------------------------------", "A lot of UUIDs"})
|
@HeaderComments({"[ UUID >-----------------------------------", "A lot of UUIDs"})
|
||||||
@FooterComments("[ UUID >-----------------------------------")
|
@FooterComments("[ UUID >-----------------------------------")
|
||||||
ConfiguredList<UUID> UUIDS = ConfiguredList.builderOf(UUID.class).fromString()
|
ConfiguredList<UUID> UUIDS = ConfiguredList.builderOf(UUID.class).fromString()
|
||||||
.parse(UUID::fromString).serialize(UUID::toString)
|
.parse(UUID::fromString).serialize(UUID::toString)
|
||||||
.defaults(
|
.defaults(
|
||||||
UUID.fromString("00000000-0000-0000-0000-000000000000"),
|
UUID.fromString("00000000-0000-0000-0000-000000000000"),
|
||||||
UUID.fromString("00000000-0000-0000-0000-000000000001")
|
UUID.fromString("00000000-0000-0000-0000-000000000001")
|
||||||
).build();
|
).build();
|
||||||
|
|
||||||
@ConfigPath("info") // Custom path
|
@ConfigPath("info") // Custom path
|
||||||
interface INFO extends Configuration {
|
interface INFO extends Configuration {
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ public class SampleTest {
|
|||||||
public void test() {
|
public void test() {
|
||||||
// 1. Make a configuration provider from a file.
|
// 1. Make a configuration provider from a file.
|
||||||
ConfigurationHolder<?> holder = YAMLConfigFactory.from("target/config.yml")
|
ConfigurationHolder<?> holder = YAMLConfigFactory.from("target/config.yml")
|
||||||
.resourcePath("configs/sample.yml")
|
.resourcePath("configs/sample.yml")
|
||||||
.indent(2) // Optional: Set the indentation of the configuration file.
|
.indent(2) // Optional: Set the indentation of the configuration file.
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// 2. Initialize the configuration classes or instances.
|
// 2. Initialize the configuration classes or instances.
|
||||||
holder.initialize(SampleConfig.class);
|
holder.initialize(SampleConfig.class);
|
||||||
|
|||||||
Reference in New Issue
Block a user