1
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:
2025-05-14 04:22:48 +08:00
parent 76d276436b
commit a4abfb733a
86 changed files with 1140 additions and 450 deletions
+4 -1
View File
@@ -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
View File
@@ -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
+47 -14
View File
@@ -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` /
`...`
### **其他补充** ###
*
*其他补充
**
如有其他补充,可以在这里描述。 如有其他补充,可以在这里描述。
+22 -7
View File
@@ -1,23 +1,38 @@
--- ---
name: 功能需求 name:
about: 希望我们提供更多的功能。 功能需求
about:
希望我们提供更多的功能。
title: '' title: ''
labels: enhancement labels:
enhancement
assignees: '' assignees: ''
--- ---
### **功能简述** ###
*
*功能简述
**
简单的描述一下你想要的功能 简单的描述一下你想要的功能
### **需求来源** ###
*
*需求来源
**
简单的描述一下为什么需要这个功能。 简单的描述一下为什么需要这个功能。
### **功能参考**(可选) ###
*
*功能参考
**(可选)
如果有相关功能的参考,如文本、截图,请提供给我们。 如果有相关功能的参考,如文本、截图,请提供给我们。
### **附加内容** ###
*
*附加内容
**
如果有什么小细节需要重点注意,请在这里告诉我们。 如果有什么小细节需要重点注意,请在这里告诉我们。
+224 -29
View File
@@ -8,46 +8,167 @@
![CodeSize](https://img.shields.io/github/languages/code-size/CarmJos/configured) ![CodeSize](https://img.shields.io/github/languages/code-size/CarmJos/configured)
![](https://visitor-badge.glitch.me/badge?page_id=configured.readme) ![](https://visitor-badge.glitch.me/badge?page_id=configured.readme)
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://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)](https://www.jetbrains.com/?from=https://github.com/CarmJos/configured) [![](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)](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
View File
@@ -8,30 +8,48 @@
![CodeSize](https://img.shields.io/github/languages/code-size/CarmJos/configured) ![CodeSize](https://img.shields.io/github/languages/code-size/CarmJos/configured)
![](https://visitor-badge.glitch.me/badge?page_id=configured.readme) ![](https://visitor-badge.glitch.me/badge?page_id=configured.readme)
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://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)](https://www.jetbrains.com/?from=https://github.com/CarmJos/configured) [![](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)](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)
开源协议。
+1 -1
View File
@@ -39,4 +39,4 @@
</plugins> </plugins>
</build> </build>
</project> </project>
@@ -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")
@@ -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"})
@@ -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);
@@ -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;
}); });
} }
} }
@@ -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) {
+1 -1
View File
@@ -214,4 +214,4 @@
</plugins> </plugins>
</build> </build>
</project> </project>
@@ -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");
@@ -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 {
@@ -30,4 +29,4 @@ object KotlinConfiguration : Configuration {
serialize { v -> v } serialize { v -> v }
defaults("key", "value") defaults("key", "value")
} }
} }
@@ -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);
+1 -1
View File
@@ -48,4 +48,4 @@
</plugins> </plugins>
</build> </build>
</project> </project>
@@ -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<>();
+1 -1
View File
@@ -47,4 +47,4 @@
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
</project> </project>
@@ -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;
@@ -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");
@@ -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;
@@ -11,7 +9,7 @@ public interface FileConfigOptions {
* The charset of the file. * The charset of the file.
*/ */
ConfigurationOption<Charset> CHARSET = ConfigurationOption.of(StandardCharsets.UTF_8); ConfigurationOption<Charset> CHARSET = ConfigurationOption.of(StandardCharsets.UTF_8);
/** /**
* Whether to copy files from resource if exists. * Whether to copy files from resource if exists.
*/ */
+1 -1
View File
@@ -117,4 +117,4 @@
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
</project> </project>
+1 -1
View File
@@ -48,4 +48,4 @@
</plugins> </plugins>
</build> </build>
</project> </project>
+1 -1
View File
@@ -57,4 +57,4 @@
</plugins> </plugins>
</build> </build>
</project> </project>
@@ -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];
@@ -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,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;
@@ -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();
@@ -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<>();
@@ -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) {
@@ -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("--------------------------");
@@ -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("----------------------------");
@@ -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();
} }
@@ -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 -1
View File
@@ -48,4 +48,4 @@
</plugins> </plugins>
</build> </build>
</project> </project>
+1 -1
View File
@@ -48,4 +48,4 @@
</plugins> </plugins>
</build> </build>
</project> </project>
+1 -1
View File
@@ -304,4 +304,4 @@
</profiles> </profiles>
</project> </project>
+18 -2
View File
@@ -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
+1 -1
View File
@@ -71,4 +71,4 @@
</plugins> </plugins>
</build> </build>
</project> </project>
@@ -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;
+8 -1
View File
@@ -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
+1 -1
View File
@@ -74,4 +74,4 @@
</build> </build>
</project> </project>
@@ -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);
+1 -1
View File
@@ -63,4 +63,4 @@
</plugins> </plugins>
</build> </build>
</project> </project>
+48 -15
View File
@@ -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>
@@ -80,4 +113,4 @@ repositories {
dependencies { dependencies {
api "cc.carm.lib:configured-sql:[LATEST RELEASE]" api "cc.carm.lib:configured-sql:[LATEST RELEASE]"
} }
``` ```
+1 -1
View File
@@ -81,4 +81,4 @@
</plugins> </plugins>
</build> </build>
</project> </project>
@@ -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()));
} }
+9 -2
View File
@@ -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
@@ -61,4 +68,4 @@ repositories {
dependencies { dependencies {
api "cc.carm.lib:configured-yaml:[LATEST RELEASE]" api "cc.carm.lib:configured-yaml:[LATEST RELEASE]"
} }
``` ```
+1 -1
View File
@@ -88,4 +88,4 @@
</build> </build>
</project> </project>
@@ -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);