-
Notifications
You must be signed in to change notification settings - Fork 12
/
InfluxConfigurationWriter.java
220 lines (195 loc) · 8.03 KB
/
InfluxConfigurationWriter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
package io.apisense.embed.influx.configuration;
import com.moandjiezana.toml.TomlWriter;
import io.apisense.embed.influx.configuration.server.ConfigurationSection;
import io.apisense.embed.influx.configuration.server.HttpConfigurationSection;
import io.apisense.embed.influx.configuration.server.MetaConfigurationSection;
import io.apisense.embed.influx.configuration.server.UdpConfigurationSection;
import io.apisense.embed.influx.configuration.server.ConfigurationProperty;
import io.apisense.embed.influx.configuration.server.HeadConfigurationSection;
import io.apisense.embed.influx.configuration.server.DataConfigurationSection;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.Collections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
/**
* Default implementation of a {@link ConfigurationWriter}.
*/
public final class InfluxConfigurationWriter implements ConfigurationWriter {
private static final Logger logger = LoggerFactory.getLogger(InfluxConfigurationWriter.class.getName());
private final Map<String, Object> configMap;
private final TomlWriter tomlWriter;
private File dataPath;
InfluxConfigurationWriter(Set<ConfigurationSection> configurationSections, File dataPath, TomlWriter writer) {
this.dataPath = dataPath;
this.tomlWriter = writer;
this.configMap = inflateConfigurationMap(configurationSections);
}
/**
* Build a configuration map in order to inflate a Toml configuration file.
* The provided section with a null name will be added before others in order to fall under no section.
*
* @param configurationSections The set of sections to add to our configuration map.
* @return The inflated {@link Map}.
*/
private static Map<String, Object> inflateConfigurationMap(Set<ConfigurationSection> configurationSections) {
Map<String, Object> configMap = new LinkedHashMap<>(); // to add some predictable order when creating config file
// We are looping a first time to find every section without name,
// For those sections we put all the defined properties as is in the configuration file.
// We have to do it before to not fall under an existing section.
for (ConfigurationSection configurationSection : configurationSections) {
if (configurationSection.getName() == null) {
addConfigProperties(configurationSection, configMap);
}
}
// We can then process all the named sections.
for (ConfigurationSection configurationSection : configurationSections) {
if (configurationSection.getName() != null) {
if (configurationSection.isArray()) {
configMap.put(configurationSection.getName(), Collections.singletonList(configurationSection.getConfiguration()));
} else {
configMap.put(configurationSection.getName(), configurationSection.getConfiguration());
}
}
}
return configMap;
}
/**
* Break down the given section to add its properties one by one.
*
* @param configurationSection The section to add.
* @param configMap The map to add the section into.
*/
private static void addConfigProperties(ConfigurationSection configurationSection, Map<String, Object> configMap) {
Map<ConfigurationProperty, Object> configuration = configurationSection.getConfiguration();
for (ConfigurationProperty configurationProperty : configuration.keySet()) {
configMap.put(configurationProperty.toString(), configuration.get(configurationProperty));
}
}
@Override
public File getDataPath() {
return dataPath;
}
@Override
public void addStatements(Map<String, Object> config) {
this.configMap.putAll(config);
}
@Override
public File writeFile() throws IOException {
File configFile = File.createTempFile("influxdb.config", Long.toString(System.nanoTime()));
logger.debug("Writing configuration file into: " + configFile.getAbsolutePath());
tomlWriter.write(configMap, configFile);
return configFile;
}
/**
* Build an {@link InfluxConfigurationWriter}.
*/
public static final class Builder {
private Set<ConfigurationSection> configuration;
private TomlWriter writer = new TomlWriter();
private File dataPath = null;
public Builder() {
configuration = new LinkedHashSet<>();
// Default configuration
setBackupAndRestorePort(8088);
setHttp(8086);
}
public InfluxConfigurationWriter build() {
if (dataPath == null) {
try {
File tempFile = Files
.createTempDirectory("embed-influx-data-" + Long.toString(System.nanoTime()))
.toFile();
setDataPath(tempFile);
} catch (IOException e) {
throw new RuntimeException("Unable to create default data path", e);
}
}
return new InfluxConfigurationWriter(configuration, dataPath, writer);
}
/**
* Add HTTP section with defined port
*
* @param httpPort - port number
* @return The current {@link Builder}.
*/
public Builder setHttp(int httpPort) {
addSection(new HttpConfigurationSection(httpPort, false));
return this;
}
/**
* Add HTTP section with defined port and auth enabled
*
* @param httpPort - port number
* @param auth - flag to enable/disable auth
* @return The current {@link Builder}.
*/
public Builder setHttp(int httpPort, boolean auth) {
addSection(new HttpConfigurationSection(httpPort, auth));
return this;
}
/**
* Add BackupAndRestore section with defined port
*
* @param backupAndRestorePort - port number
* @return The current {@link Builder}.
*/
public Builder setBackupAndRestorePort(int backupAndRestorePort) {
addSection(new HeadConfigurationSection(backupAndRestorePort));
return this;
}
/**
* Add UDP section with defined port
*
* @param udpPort - port number
* @return The current {@link Builder}.
*/
public Builder setUdp(int udpPort) {
addSection(new UdpConfigurationSection(udpPort, "udp"));
return this;
}
/**
* Add HTTP section with defined port and auth enabled
*
* @param udpPort - port number
* @param database - name for UDP database
* @return The current {@link Builder}.
*/
public Builder setUdp(int udpPort, String database) {
addSection(new UdpConfigurationSection(udpPort, database));
return this;
}
/**
* Add data and meta sections.
*
* @param dataPath - path to data location
* @return The current {@link Builder}.
*/
public Builder setDataPath(File dataPath) {
this.dataPath = dataPath;
addSection(new MetaConfigurationSection(dataPath));
addSection(new DataConfigurationSection(dataPath));
return this;
}
/**
* Add a customized section to the current configuration.
*
* @param section The {@link ConfigurationSection} to add.
* @return The current {@link Builder}.
*/
public Builder addSection(ConfigurationSection section) {
configuration.remove(section);
configuration.add(section);
return this;
}
public Builder setWriter(TomlWriter writer) {
this.writer = writer;
return this;
}
}
}