> {
}
}
- protected void setComments(@NotNull String path, @Nullable ConfigComment filedComments) {
- setComments(path, readComments(filedComments));
+ protected void setComments(@Nullable String path, @Nullable ConfigCommentInfo comments) {
+ if (comments != null) this.provider.setComment(path, comments);
}
- protected void setComments(@NotNull String path, @NotNull String[] comments) {
- if (comments.length <= 0) return;
- this.provider.setComments(path, comments);
- }
-
- protected static @NotNull String[] readComments(@Nullable ConfigComment filedComments) {
- if (filedComments == null) return new String[0];
- if (String.join("", filedComments.value()).length() <= 0) return new String[0];
- return filedComments.value();
- }
-
- protected static @NotNull String[] getClassComments(@NotNull Class> clazz,
- @Nullable ConfigComment fieldAnnotation) {
- String[] clazzComments = readComments(clazz.getAnnotation(ConfigComment.class));
- if (clazzComments.length > 0) return clazzComments;
- else return readComments(fieldAnnotation);
+ protected static @Nullable ConfigCommentInfo getClassComments(@NotNull Class> clazz,
+ @Nullable ConfigComment fieldAnnotation) {
+ ConfigCommentInfo classComments = ConfigCommentInfo.fromAnnotation(clazz.getAnnotation(ConfigComment.class));
+ if (classComments != null) return classComments;
+ return ConfigCommentInfo.fromAnnotation(fieldAnnotation);
}
protected static @Nullable String getClassPath(@NotNull Class> clazz,
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/annotation/ConfigComment.java b/core/src/main/java/cc/carm/lib/configuration/core/annotation/ConfigComment.java
index b24e874..5874024 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/annotation/ConfigComment.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/annotation/ConfigComment.java
@@ -14,4 +14,32 @@ public @interface ConfigComment {
@NotNull
String[] value() default "";
+ /**
+ * 首行换行,即会在注释开始前进行一次换行,与上方配置分离,优化观感。
+ * 如:
+ *
+ * some-key: "SomeValue"
+ *
+ * # 注释第一行
+ * # 注释第二行
+ * startWrap: true
+ *
+ *
+ * @return 是否在结尾添加换行符
+ */
+ boolean startWrap() default true;
+
+ /**
+ * 末尾换行,即会在注释结束后进行一次换行,如:
+ *
+ * # 注释第一行
+ * # 注释第二行
+ *
+ * endWrap: true
+ *
+ * 该功能可用于编写配置文件的顶部注释。
+ *
+ * @return 是否在结尾添加换行符
+ */
+ boolean endWrap() default false;
}
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java
index 2b6b275..0be89fd 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java
@@ -1,5 +1,6 @@
package cc.carm.lib.configuration.core.builder;
+import cc.carm.lib.configuration.core.source.ConfigCommentInfo;
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
import cc.carm.lib.configuration.core.value.ConfigValue;
import org.jetbrains.annotations.NotNull;
@@ -13,6 +14,9 @@ public abstract class AbstractConfigBuilder providerClass) {
@@ -38,10 +42,34 @@ public abstract class AbstractConfigBuilder>
extends AbstractConfigBuilder> {
- protected @Nullable ConfigurationProvider> provider;
- protected @Nullable String path;
-
- protected @NotNull String[] comments = new String[0];
- protected @Nullable T defaultValue;
-
public CommonConfigBuilder() {
super(ConfigurationProvider.class);
}
- protected abstract @NotNull B getThis();
-
- public abstract @NotNull ConfigValue> build();
-
- public @NotNull B from(@Nullable ConfigurationProvider> provider) {
- this.provider = provider;
- return getThis();
- }
-
- public @NotNull B path(@Nullable String path) {
- this.path = path;
- return getThis();
- }
-
- public @NotNull B comments(@NotNull String... comments) {
- this.comments = comments;
- return getThis();
- }
-
- public @NotNull B defaults(@Nullable T defaultValue) {
- this.defaultValue = defaultValue;
- return getThis();
- }
-
-
}
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java
index 3ede77f..3a09cda 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java
@@ -65,7 +65,7 @@ public class SourceListBuilder extends CommonConfigBuilder, Source
@Override
public @NotNull ConfiguredList build() {
return new ConfiguredList<>(
- this.provider, this.path, this.comments,
+ this.provider, this.path, this.buildComments(),
this.valueClass, this.defaultValue,
this.sourceParser.andThen(this.valueParser),
this.valueSerializer.andThen(sourceSerializer)
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java
index 1667bd0..3345c6d 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java
@@ -89,7 +89,7 @@ public class SourceMapBuilder, S, K, V> extends CommonConfig
@Override
public @NotNull ConfiguredMap build() {
return new ConfiguredMap<>(
- this.provider, this.path, this.comments,
+ this.provider, this.path,this.buildComments(),
this.defaultValue, this.supplier,
this.keyClass, this.keyParser,
this.valueClass, this.sourceParser.andThen(this.valueParser),
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java
index d9bdbe2..4366f73 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java
@@ -45,7 +45,7 @@ public class SectionValueBuilder
@Override
public @NotNull ConfiguredSection build() {
return new ConfiguredSection<>(
- this.provider, this.path, this.comments,
+ this.provider, this.path,this.buildComments(),
this.valueClass, this.defaultValue,
this.parser, this.serializer
);
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java
index deb77fb..f52f0ee 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java
@@ -3,6 +3,7 @@ package cc.carm.lib.configuration.core.builder.value;
import cc.carm.lib.configuration.core.builder.CommonConfigBuilder;
import cc.carm.lib.configuration.core.function.ConfigDataFunction;
import cc.carm.lib.configuration.core.function.ConfigValueParser;
+import cc.carm.lib.configuration.core.source.ConfigCommentInfo;
import cc.carm.lib.configuration.core.value.type.ConfiguredValue;
import org.jetbrains.annotations.NotNull;
@@ -57,7 +58,7 @@ public class SourceValueBuilder extends CommonConfigBuilder build() {
return new ConfiguredValue<>(
- this.provider, this.path, this.comments,
+ this.provider, this.path, this.buildComments(),
this.valueClass, this.defaultValue,
this.valueParser.compose(this.sourceParser),
this.valueSerializer.andThen(sourceSerializer)
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigCommentInfo.java b/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigCommentInfo.java
new file mode 100644
index 0000000..47818a3
--- /dev/null
+++ b/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigCommentInfo.java
@@ -0,0 +1,80 @@
+package cc.carm.lib.configuration.core.source;
+
+import cc.carm.lib.configuration.core.annotation.ConfigComment;
+import cc.carm.lib.configuration.core.value.ConfigValue;
+import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.Optional;
+
+public class ConfigCommentInfo {
+
+ public static @NotNull ConfigCommentInfo DEFAULT_INFO = of(new String[0], true, false);
+
+ protected final @NotNull String[] comments;
+ protected final boolean startWrap;
+ protected final boolean endWrap;
+
+ public ConfigCommentInfo(@NotNull String[] comments, boolean startWrap, boolean endWrap) {
+ this.comments = comments;
+ this.startWrap = startWrap;
+ this.endWrap = endWrap;
+ }
+
+ public @NotNull String[] getComments() {
+ return comments;
+ }
+
+ public boolean endWrap() {
+ return endWrap;
+ }
+
+ public boolean startWrap() {
+ return startWrap;
+ }
+
+ public static @NotNull ConfigCommentInfo of(@NotNull String[] comments, boolean startWrap, boolean endWrap) {
+ return new ConfigCommentInfo(comments, startWrap, endWrap);
+ }
+
+ public static @NotNull ConfigCommentInfo defaults() {
+ return DEFAULT_INFO;
+ }
+
+ @Contract("!null->!null")
+ public static @Nullable ConfigCommentInfo fromAnnotation(@Nullable ConfigComment comment) {
+ if (comment == null) return null;
+ else return new ConfigCommentInfo(comment.value(), comment.startWrap(), comment.endWrap());
+ }
+
+ public static @NotNull ConfigCommentInfo fromValue(@NotNull ConfigValue> value) {
+ return Optional.ofNullable(value.getComments()).orElse(defaults());
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ConfigCommentInfo that = (ConfigCommentInfo) o;
+ return startWrap == that.startWrap && endWrap == that.endWrap && Arrays.equals(getComments(), that.getComments());
+ }
+
+ @Override
+ public int hashCode() {
+ int result = Objects.hash(startWrap, endWrap);
+ result = 31 * result + Arrays.hashCode(getComments());
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "ConfigCommentInfo{" +
+ "comments=" + Arrays.toString(comments) +
+ ", startWrap=" + startWrap +
+ ", endWrap=" + endWrap +
+ '}';
+ }
+}
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java b/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java
index cfc735a..66153e6 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java
@@ -27,9 +27,9 @@ public abstract class ConfigurationProvider {
public abstract void save() throws Exception;
- public abstract void setComments(@NotNull String path, @NotNull String... comments);
+ public abstract void setComment(@Nullable String path, @Nullable ConfigCommentInfo comment);
- public abstract @Nullable String[] getComments(@NotNull String path);
+ public abstract @Nullable ConfigCommentInfo getComment(@Nullable String path);
public abstract @NotNull ConfigInitializer extends ConfigurationProvider> getInitializer();
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/ConfigValue.java b/core/src/main/java/cc/carm/lib/configuration/core/value/ConfigValue.java
index 6ebfe37..426ca7d 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/value/ConfigValue.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/value/ConfigValue.java
@@ -1,6 +1,7 @@
package cc.carm.lib.configuration.core.value;
import cc.carm.lib.configuration.core.builder.ConfigBuilder;
+import cc.carm.lib.configuration.core.source.ConfigCommentInfo;
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
import cc.carm.lib.configuration.core.source.ConfigurationWrapper;
import org.jetbrains.annotations.NotNull;
@@ -17,12 +18,13 @@ public abstract class ConfigValue {
protected @Nullable ConfigurationProvider> provider;
protected @Nullable String configPath;
- protected @NotNull String[] comments;
+ protected @Nullable ConfigCommentInfo comments;
protected @Nullable T defaultValue;
public ConfigValue(@Nullable ConfigurationProvider> provider,
- @Nullable String configPath, @NotNull String[] comments, @Nullable T defaultValue) {
+ @Nullable String configPath, @Nullable ConfigCommentInfo comments,
+ @Nullable T defaultValue) {
this.provider = provider;
this.configPath = configPath;
this.comments = comments;
@@ -30,11 +32,12 @@ public abstract class ConfigValue {
}
public void initialize(@NotNull ConfigurationProvider> provider, boolean saveDefault,
- @NotNull String configPath, @NotNull String... comments) {
+ @NotNull String configPath, @Nullable ConfigCommentInfo comments) {
if (this.provider == null) this.provider = provider;
if (this.configPath == null) this.configPath = configPath;
- if (this.comments.length == 0) this.comments = comments;
+ if (this.comments == null) this.comments = comments;
if (saveDefault) setDefault();
+ if (getComments() != null) this.provider.setComment(getConfigPath(), getComments());
}
public @Nullable T getDefaultValue() {
@@ -103,6 +106,11 @@ public abstract class ConfigValue {
Optional.ofNullable(getDefaultValue()).ifPresent(this::set);
}
+ /**
+ * 判断加载的配置是否与默认值相同。
+ *
+ * @return 获取当前值是否为默认值。
+ */
public boolean isDefault() {
T defaultValue = getDefaultValue();
T value = get();
@@ -137,12 +145,8 @@ public abstract class ConfigValue {
getConfiguration().set(getConfigPath(), value);
}
- public String[] getComments() {
+ public @Nullable ConfigCommentInfo getComments() {
return comments;
}
- public void setComments(String[] comments) {
- this.comments = comments;
- }
-
}
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/impl/CachedConfigValue.java b/core/src/main/java/cc/carm/lib/configuration/core/value/impl/CachedConfigValue.java
index 368809c..93a9b4a 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/value/impl/CachedConfigValue.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/value/impl/CachedConfigValue.java
@@ -1,5 +1,6 @@
package cc.carm.lib.configuration.core.value.impl;
+import cc.carm.lib.configuration.core.source.ConfigCommentInfo;
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
import cc.carm.lib.configuration.core.value.ConfigValue;
import org.jetbrains.annotations.NotNull;
@@ -12,7 +13,7 @@ public abstract class CachedConfigValue extends ConfigValue {
protected long parsedTime = -1;
public CachedConfigValue(@Nullable ConfigurationProvider> provider, @Nullable String sectionPath,
- @NotNull String[] comments, @Nullable T defaultValue) {
+ @Nullable ConfigCommentInfo comments, @Nullable T defaultValue) {
super(provider, sectionPath, comments, defaultValue);
}
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredList.java b/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredList.java
index 7cdb942..9eb95b2 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredList.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredList.java
@@ -2,6 +2,7 @@ package cc.carm.lib.configuration.core.value.type;
import cc.carm.lib.configuration.core.builder.list.ConfigListBuilder;
import cc.carm.lib.configuration.core.function.ConfigDataFunction;
+import cc.carm.lib.configuration.core.source.ConfigCommentInfo;
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
import cc.carm.lib.configuration.core.value.impl.CachedConfigValue;
import org.jetbrains.annotations.NotNull;
@@ -22,7 +23,7 @@ public class ConfiguredList extends CachedConfigValue> {
protected final @NotNull ConfigDataFunction serializer;
public ConfiguredList(@Nullable ConfigurationProvider> provider,
- @Nullable String sectionPath, @NotNull String[] comments,
+ @Nullable String sectionPath, @Nullable ConfigCommentInfo comments,
@NotNull Class valueClass, @Nullable List defaultValue,
@NotNull ConfigDataFunction