Skip to content

Commit d7b4f1e

Browse files
committed
Add composer for old enums, add persister for Instant
1 parent 1f5f88f commit d7b4f1e

File tree

4 files changed

+110
-1
lines changed

4 files changed

+110
-1
lines changed

src/main/java/com/eternalcode/parcellockers/configuration/ConfigurationManager.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.eternalcode.parcellockers.configuration;
22

33
import com.eternalcode.parcellockers.configuration.composer.DurationComposer;
4+
import com.eternalcode.parcellockers.configuration.composer.OldEnumComposer;
45
import com.eternalcode.parcellockers.configuration.composer.PositionComposer;
56
import com.eternalcode.parcellockers.shared.Position;
67
import net.dzikoysk.cdn.Cdn;
78
import net.dzikoysk.cdn.CdnFactory;
9+
import org.bukkit.Sound;
810

911
import java.io.File;
1012
import java.time.Duration;
@@ -18,6 +20,7 @@ public class ConfigurationManager {
1820
.getSettings()
1921
.withComposer(Position.class, new PositionComposer())
2022
.withComposer(Duration.class, new DurationComposer())
23+
.withComposer(Sound.class, new OldEnumComposer())
2124
.build();
2225

2326
private final Set<ReloadableConfig> configs = new HashSet<>();
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.eternalcode.parcellockers.configuration.composer;
2+
3+
import dev.rollczi.litecommands.reflect.ReflectUtil;
4+
import net.dzikoysk.cdn.CdnSettings;
5+
import net.dzikoysk.cdn.model.Element;
6+
import net.dzikoysk.cdn.model.Entry;
7+
import net.dzikoysk.cdn.model.Piece;
8+
import net.dzikoysk.cdn.reflect.TargetType;
9+
import net.dzikoysk.cdn.serdes.Composer;
10+
import net.dzikoysk.cdn.serdes.SimpleDeserializer;
11+
import org.bukkit.util.OldEnum;
12+
import panda.std.Result;
13+
14+
import java.lang.reflect.Method;
15+
import java.util.HashMap;
16+
import java.util.List;
17+
import java.util.Map;
18+
import java.util.function.Predicate;
19+
20+
public class OldEnumComposer implements Composer<OldEnum<?>>, SimpleDeserializer<OldEnum<?>> {
21+
22+
public static final Predicate<Class<?>> IS_OLD_ENUM = type -> OldEnum.class.isAssignableFrom(type);
23+
24+
private static final Map<Class<?>, Method> VALUE_OF_METHODS = new HashMap<>();
25+
26+
@Override
27+
public Result<OldEnum<?>, Exception> deserialize(String source) {
28+
throw new UnsupportedOperationException("Enum deserializer requires enum class");
29+
}
30+
31+
@Override
32+
public Result<OldEnum<?>, Exception> deserialize(TargetType type, String source) {
33+
try {
34+
Method valueOfMethod = VALUE_OF_METHODS.computeIfAbsent(type.getType(), key -> findValueOfMethod(key));
35+
OldEnum<?> oldEnum = ReflectUtil.invokeStaticMethod(valueOfMethod, source);
36+
37+
return Result.ok(oldEnum);
38+
}
39+
catch (IllegalArgumentException argumentException) {
40+
return Result.error(argumentException);
41+
}
42+
}
43+
44+
private Method findValueOfMethod(Class<?> type) {
45+
Method valueOfMethod = ReflectUtil.getMethod(type, "valueOf", String.class);
46+
valueOfMethod.setAccessible(true);
47+
return valueOfMethod;
48+
}
49+
50+
@Override
51+
public Result<? extends Element<?>, ? extends Exception> serialize(CdnSettings settings, List<String> description, String key, TargetType type, OldEnum<?> oldEnum) {
52+
return Result.ok(key.isEmpty() ? new Piece(oldEnum.name()) : new Entry(description, key, oldEnum.name()));
53+
}
54+
55+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.eternalcode.parcellockers.database.persister;
2+
3+
import com.j256.ormlite.field.FieldType;
4+
import com.j256.ormlite.field.SqlType;
5+
import com.j256.ormlite.field.types.BaseDataType;
6+
import com.j256.ormlite.support.DatabaseResults;
7+
8+
import java.sql.SQLException;
9+
import java.time.Instant;
10+
import java.time.format.DateTimeParseException;
11+
12+
public class InstantPersister extends BaseDataType {
13+
14+
private static final InstantPersister INSTANCE = new InstantPersister();
15+
16+
private InstantPersister() {
17+
super(SqlType.LONG_STRING, new Class<?>[] { Instant.class });
18+
}
19+
20+
public static InstantPersister getSingleton() {
21+
return INSTANCE;
22+
}
23+
24+
@Override
25+
public Object javaToSqlArg(FieldType fieldType, Object javaObject) {
26+
Instant instant = (Instant) javaObject;
27+
return instant.toString();
28+
}
29+
30+
@Override
31+
public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) {
32+
String value = (String) sqlArg;
33+
try {
34+
return Instant.parse(value);
35+
}
36+
catch (DateTimeParseException e) {
37+
throw new IllegalArgumentException("Invalid Instant format: " + value, e);
38+
}
39+
}
40+
41+
@Override
42+
public Object parseDefaultString(FieldType fieldType, String defaultStr) {
43+
return defaultStr;
44+
}
45+
46+
@Override
47+
public Object resultToSqlArg(FieldType fieldType, DatabaseResults results, int columnPos) throws SQLException {
48+
return results.getString(columnPos);
49+
}
50+
}

src/main/java/com/eternalcode/parcellockers/delivery/repository/DeliveryWrapper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.eternalcode.parcellockers.delivery.repository;
22

3+
import com.eternalcode.parcellockers.database.persister.InstantPersister;
34
import com.eternalcode.parcellockers.delivery.Delivery;
45
import com.j256.ormlite.field.DatabaseField;
56
import com.j256.ormlite.table.DatabaseTable;
@@ -13,7 +14,7 @@ class DeliveryWrapper {
1314
@DatabaseField(id = true)
1415
private UUID parcel;
1516

16-
@DatabaseField
17+
@DatabaseField(persisterClass = InstantPersister.class)
1718
private Instant deliveryTimestamp;
1819

1920
DeliveryWrapper() {

0 commit comments

Comments
 (0)