|
@@ -2,6 +2,7 @@ package org.hswebframework.web.dict;
|
|
|
|
|
|
import com.alibaba.fastjson.JSONException;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.alibaba.fastjson.annotation.JSONType;
|
|
|
import com.alibaba.fastjson.parser.DefaultJSONParser;
|
|
|
import com.alibaba.fastjson.parser.JSONLexer;
|
|
|
import com.alibaba.fastjson.parser.JSONToken;
|
|
@@ -20,11 +21,16 @@ import java.util.function.Predicate;
|
|
|
/**
|
|
|
* 枚举字典,使用枚举来实现数据字典,可通过集成此接口来实现一些有趣的功能.
|
|
|
* ⚠️:如果使用了位运算来判断枚举,枚举数量不要超过64个,且顺序不要随意变动!
|
|
|
- * 如果枚举数量大于64,你应该使用{@link org.hswebframework.web.dict.apply.DictApply}来处理
|
|
|
+ * 如果枚举数量大于64,你应该使用{@link org.hswebframework.web.dict.apply.DictApply}来处理.
|
|
|
+ * ⚠️:如果要开启在反序列化json的时候,支持将对象反序列化枚举,由于fastJson目前的版本还不支持从父类获取注解,
|
|
|
+ * 所以需要在实现类上注解:<code>@JSONType(deserializer = EnumDict.EnumDictJSONDeserializer.class)</code>.
|
|
|
*
|
|
|
* @author zhouhao
|
|
|
* @see 3.0
|
|
|
+ * @see EnumDictJSONDeserializer
|
|
|
+ * @see JSONSerializable
|
|
|
*/
|
|
|
+@JSONType(deserializer = EnumDict.EnumDictJSONDeserializer.class)
|
|
|
public interface EnumDict<V> extends JSONSerializable {
|
|
|
|
|
|
/**
|
|
@@ -54,7 +60,7 @@ public interface EnumDict<V> extends JSONSerializable {
|
|
|
return ordinal();
|
|
|
}
|
|
|
|
|
|
- default long getBit() {
|
|
|
+ default long getMask() {
|
|
|
return 1L << index();
|
|
|
}
|
|
|
|
|
@@ -68,13 +74,13 @@ public interface EnumDict<V> extends JSONSerializable {
|
|
|
return this == v
|
|
|
|| getValue() == v
|
|
|
|| getValue().equals(v)
|
|
|
- || v.equals(getBit())
|
|
|
+ || v.equals(getMask())
|
|
|
|| String.valueOf(getValue()).equalsIgnoreCase(String.valueOf(v))
|
|
|
|| getText().equalsIgnoreCase(String.valueOf(v));
|
|
|
}
|
|
|
|
|
|
default boolean in(long bit) {
|
|
|
- return (bit & getBit()) != 0;
|
|
|
+ return (bit & getMask()) != 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -133,30 +139,30 @@ public interface EnumDict<V> extends JSONSerializable {
|
|
|
}
|
|
|
|
|
|
@SafeVarargs
|
|
|
- static <T extends EnumDict> long toBit(T... t) {
|
|
|
+ static <T extends EnumDict> long toMask(T... t) {
|
|
|
if (t == null) {
|
|
|
return 0L;
|
|
|
}
|
|
|
long value = 0L;
|
|
|
for (T t1 : t) {
|
|
|
- value |= t1.getBit();
|
|
|
+ value |= t1.getMask();
|
|
|
}
|
|
|
return value;
|
|
|
}
|
|
|
|
|
|
@SafeVarargs
|
|
|
- static <T extends EnumDict> boolean bitIn(long bit, T... t) {
|
|
|
- long value = toBit(t);
|
|
|
+ static <T extends EnumDict> boolean maskIn(long bit, T... t) {
|
|
|
+ long value = toMask(t);
|
|
|
return (bit & value) == value;
|
|
|
}
|
|
|
|
|
|
@SafeVarargs
|
|
|
- static <T extends EnumDict> boolean bitInAny(long bit, T... t) {
|
|
|
- long value = toBit(t);
|
|
|
+ static <T extends EnumDict> boolean maskInAny(long bit, T... t) {
|
|
|
+ long value = toMask(t);
|
|
|
return (bit & value) != 0;
|
|
|
}
|
|
|
|
|
|
- static <T extends EnumDict> List<T> getByBit(Class<T> tClass, long bit) {
|
|
|
+ static <T extends EnumDict> List<T> getByMask(Class<T> tClass, long bit) {
|
|
|
List<T> arr = new ArrayList<>();
|
|
|
for (T t : tClass.getEnumConstants()) {
|
|
|
if (t.in(bit)) {
|
|
@@ -166,29 +172,47 @@ public interface EnumDict<V> extends JSONSerializable {
|
|
|
return arr;
|
|
|
}
|
|
|
|
|
|
- boolean DEFAULT_WRITE_JSON_OBJECT = Boolean.getBoolean("hsweb.enum.dict.enableWriteJSONObject");
|
|
|
+ /**
|
|
|
+ * 默认在序列化为json时,默认会以对象方式写出枚举,可通过系统环境变量 <code>hsweb.enum.dict.disableWriteJSONObject</code>关闭默认设置。
|
|
|
+ * 比如: java -jar -Dhsweb.enum.dict.disableWriteJSONObject=true
|
|
|
+ */
|
|
|
+ boolean DEFAULT_WRITE_JSON_OBJECT = !Boolean.getBoolean("hsweb.enum.dict.disableWriteJSONObject");
|
|
|
|
|
|
- default boolean writeJSONObject() {
|
|
|
+ /**
|
|
|
+ * @return 是否在序列化为json的时候, 将枚举以对象方式序列化
|
|
|
+ * @see this#DEFAULT_WRITE_JSON_OBJECT
|
|
|
+ */
|
|
|
+ default boolean isWriteJSONObjectEnabled() {
|
|
|
return DEFAULT_WRITE_JSON_OBJECT;
|
|
|
}
|
|
|
|
|
|
- default JSONObject getWriteObject() {
|
|
|
+ /**
|
|
|
+ * 当{@link this#isWriteJSONObjectEnabled()}返回true时,在序列化为json的时候,会写出此方法返回的对象
|
|
|
+ *
|
|
|
+ * @return 最终序列化的值
|
|
|
+ * @see this#isWriteJSONObjectEnabled()
|
|
|
+ */
|
|
|
+ default Object getWriteJSONObject() {
|
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
jsonObject.put("value", getValue());
|
|
|
jsonObject.put("text", getText());
|
|
|
+ jsonObject.put("index", index());
|
|
|
+ jsonObject.put("mask", getMask());
|
|
|
return jsonObject;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
default void write(JSONSerializer jsonSerializer, Object o, Type type, int i) throws IOException {
|
|
|
- if (writeJSONObject()) {
|
|
|
- jsonSerializer.write(getWriteObject());
|
|
|
+ if (isWriteJSONObjectEnabled()) {
|
|
|
+ jsonSerializer.write(getWriteJSONObject());
|
|
|
} else {
|
|
|
jsonSerializer.write(getValue());
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 自定义fastJson枚举序列化
|
|
|
+ */
|
|
|
class EnumDictJSONDeserializer implements ObjectDeserializer {
|
|
|
|
|
|
@Override
|