Skip to content

Commit 26ffc5d

Browse files
committed
feat(testcontainers): add simple Tarantool 2.11.x lua config serializer
Needed for #41
1 parent 54fc1a4 commit 26ffc5d

File tree

4 files changed

+567
-2
lines changed

4 files changed

+567
-2
lines changed

testcontainers/pom.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,7 @@
115115
<artifactId>jsonschema2pojo-maven-plugin</artifactId>
116116
<version>${jsonschema2pojo.version}</version>
117117
<configuration>
118-
<sourceDirectory>${basedir}/src/main/resources/tarantool/Tarantool3Configuration.yaml
119-
</sourceDirectory>
118+
<sourceDirectory>${basedir}/src/main/resources/tarantool</sourceDirectory>
120119
<targetPackage>io.tarantool.autogen</targetPackage>
121120
<useInnerClassBuilders>true</useInnerClassBuilders>
122121
<generateBuilders>true</generateBuilders>
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* Copyright (c) 2025 VK DIGITAL TECHNOLOGIES LIMITED LIABILITY COMPANY
3+
* All Rights Reserved.
4+
*/
5+
6+
package org.testcontainers.containers.tarantool.config;
7+
8+
import java.io.IOException;
9+
import java.math.BigDecimal;
10+
import java.nio.charset.StandardCharsets;
11+
import java.nio.file.Files;
12+
import java.nio.file.Path;
13+
import java.util.Map;
14+
15+
import com.fasterxml.jackson.annotation.JsonInclude.Include;
16+
import com.fasterxml.jackson.core.type.TypeReference;
17+
import com.fasterxml.jackson.databind.ObjectMapper;
18+
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
19+
20+
import io.tarantool.autogen.Tarantool2Configuration;
21+
22+
public class LuaConfiguration {
23+
24+
private static final ObjectMapper OBJECT_MAPPER;
25+
26+
private static final TypeReference<Map<String, Object>> TYPE_REFERENCE;
27+
28+
private static final String CFG_CHUNK_START = "box.cfg{\n\t";
29+
30+
private static final String CFG_CHUNK_END = "}";
31+
32+
static {
33+
OBJECT_MAPPER = new ObjectMapper();
34+
OBJECT_MAPPER
35+
.setSerializationInclusion(Include.NON_NULL)
36+
.setSerializationInclusion(Include.NON_EMPTY);
37+
OBJECT_MAPPER.registerModule(new Jdk8Module());
38+
TYPE_REFERENCE = new TypeReference<>() {};
39+
}
40+
41+
public static void writeAsLuaScript(Path path, Tarantool2Configuration config)
42+
throws IOException {
43+
final byte[] configAsString = serializeConfig(config);
44+
Files.write(path, configAsString);
45+
}
46+
47+
private static byte[] serializeConfig(Tarantool2Configuration config) {
48+
final Map<String, Object> configAsMap = OBJECT_MAPPER.convertValue(config, TYPE_REFERENCE);
49+
final StringBuilder sb = new StringBuilder(CFG_CHUNK_START);
50+
for (Map.Entry<String, Object> entry : configAsMap.entrySet()) {
51+
if (entry.getValue() != null) {
52+
sb.append(entry.getKey())
53+
.append("=")
54+
.append(serializeValue(entry.getValue()))
55+
.append(',')
56+
.append("\n\t");
57+
}
58+
}
59+
sb.delete(sb.length() - 2, sb.length());
60+
if (!configAsMap.isEmpty()) {
61+
sb.append('\n');
62+
}
63+
return sb.append(CFG_CHUNK_END).toString().getBytes(StandardCharsets.UTF_8);
64+
}
65+
66+
private static String serializeValue(Object value) {
67+
if (value == null) {
68+
return "nil";
69+
}
70+
71+
if (value instanceof String | value instanceof Enum<?>) {
72+
return "'" + value + "'";
73+
}
74+
75+
if (value instanceof Boolean) {
76+
return value.toString();
77+
}
78+
79+
if (value instanceof BigDecimal) {
80+
return ((BigDecimal) value).stripTrailingZeros().toPlainString();
81+
}
82+
83+
if (value instanceof Number) {
84+
return value.toString();
85+
}
86+
87+
throw new IllegalArgumentException("Cannot serialize value of type " + value.getClass());
88+
}
89+
}

0 commit comments

Comments
 (0)