2020-04-25 19:56:47 -07:00
|
|
|
package com.opensr5.ini;
|
2015-12-23 19:01:26 -08:00
|
|
|
|
2019-08-26 17:58:40 -07:00
|
|
|
import org.jetbrains.annotations.Nullable;
|
2016-01-19 21:01:29 -08:00
|
|
|
|
2015-12-23 19:01:26 -08:00
|
|
|
import java.io.*;
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* (c) Andrey Belomutskiy
|
|
|
|
* 12/23/2015.
|
|
|
|
*/
|
|
|
|
public class IniFileModel {
|
2020-03-05 21:37:30 -08:00
|
|
|
public static final String RUSEFI_INI_PREFIX = "rusefi";
|
|
|
|
public static final String RUSEFI_INI_SUFFIX = ".ini";
|
2015-12-23 19:01:26 -08:00
|
|
|
|
2020-04-25 19:56:47 -07:00
|
|
|
private static IniFileModel INSTANCE;
|
2016-01-19 20:02:48 -08:00
|
|
|
private String dialogId;
|
|
|
|
private String dialogUiName;
|
|
|
|
private Map<String, DialogModel> dialogs = new TreeMap<>();
|
2019-08-26 17:58:40 -07:00
|
|
|
private Map<String, DialogModel.Field> allFields = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
|
|
|
|
// this is only used while reading model - TODO extract reader
|
|
|
|
private List<DialogModel.Field> fieldsOfCurrentDialog = new ArrayList<>();
|
2015-12-23 19:01:26 -08:00
|
|
|
|
|
|
|
public static void main(String[] args) {
|
2020-04-25 19:56:47 -07:00
|
|
|
System.out.println(IniFileModel.getInstance("..").dialogs);
|
2015-12-23 19:01:26 -08:00
|
|
|
}
|
|
|
|
|
2020-04-25 19:56:47 -07:00
|
|
|
public void readIniFile(String iniFilePath) {
|
|
|
|
String fileName = findMetaInfoFile(iniFilePath);
|
2020-03-05 21:37:30 -08:00
|
|
|
File input = null;
|
|
|
|
if (fileName != null)
|
|
|
|
input = new File(fileName);
|
|
|
|
if (fileName == null || !input.exists()) {
|
|
|
|
System.out.println("No such file: " + RUSEFI_INI_PREFIX + "*" + RUSEFI_INI_SUFFIX);
|
2015-12-23 19:01:26 -08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-03-01 14:13:48 -08:00
|
|
|
RawIniFile content = IniFileReader.read(input);
|
2015-12-23 19:01:26 -08:00
|
|
|
|
|
|
|
|
2017-03-01 14:13:48 -08:00
|
|
|
for (RawIniFile.Line line : content.getLines()) {
|
|
|
|
handleLine(line);
|
2016-01-15 20:01:43 -08:00
|
|
|
}
|
2017-03-01 14:13:48 -08:00
|
|
|
|
|
|
|
finishDialog();
|
2016-01-15 20:01:43 -08:00
|
|
|
}
|
2015-12-23 19:01:26 -08:00
|
|
|
|
2020-04-25 19:56:47 -07:00
|
|
|
private String findMetaInfoFile(String iniFilePath) {
|
|
|
|
File dir = new File(iniFilePath);
|
2020-03-05 21:37:30 -08:00
|
|
|
if (!dir.isDirectory())
|
|
|
|
return null;
|
|
|
|
for (String file : dir.list()) {
|
|
|
|
if (file.startsWith(RUSEFI_INI_PREFIX) && file.endsWith(RUSEFI_INI_SUFFIX))
|
2020-04-25 19:56:47 -07:00
|
|
|
return iniFilePath + File.separator + file;
|
2020-03-05 21:37:30 -08:00
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2016-01-17 22:01:46 -08:00
|
|
|
private void finishDialog() {
|
2019-08-26 17:58:40 -07:00
|
|
|
if (fieldsOfCurrentDialog.isEmpty())
|
2016-01-17 22:01:46 -08:00
|
|
|
return;
|
2016-03-21 14:02:08 -07:00
|
|
|
if (dialogUiName == null)
|
2017-02-05 15:04:56 -08:00
|
|
|
dialogUiName = dialogId;
|
2019-08-26 17:58:40 -07:00
|
|
|
dialogs.put(dialogUiName, new DialogModel(dialogId, dialogUiName, fieldsOfCurrentDialog));
|
2016-01-17 22:01:46 -08:00
|
|
|
|
2016-01-19 20:02:48 -08:00
|
|
|
dialogId = null;
|
2019-08-26 17:58:40 -07:00
|
|
|
fieldsOfCurrentDialog.clear();
|
2016-01-17 22:01:46 -08:00
|
|
|
}
|
|
|
|
|
2017-03-01 14:13:48 -08:00
|
|
|
private void handleLine(RawIniFile.Line line) {
|
2016-01-15 20:01:43 -08:00
|
|
|
try {
|
2017-03-01 14:13:48 -08:00
|
|
|
LinkedList<String> list = new LinkedList<>(Arrays.asList(line.getTokens()));
|
2015-12-23 19:01:26 -08:00
|
|
|
|
2016-01-15 20:01:43 -08:00
|
|
|
trim(list);
|
2015-12-23 19:01:26 -08:00
|
|
|
|
2016-01-15 20:01:43 -08:00
|
|
|
if (list.isEmpty())
|
|
|
|
return;
|
|
|
|
String first = list.getFirst();
|
2015-12-23 19:01:26 -08:00
|
|
|
|
2016-01-15 20:01:43 -08:00
|
|
|
if ("dialog".equals(first)) {
|
|
|
|
handleDialog(list);
|
2015-12-23 19:01:26 -08:00
|
|
|
|
2016-01-15 20:01:43 -08:00
|
|
|
} else if ("field".equals(first)) {
|
|
|
|
handleField(list);
|
2015-12-23 19:01:26 -08:00
|
|
|
}
|
2016-01-15 20:01:43 -08:00
|
|
|
} catch (RuntimeException e) {
|
2017-03-01 14:13:48 -08:00
|
|
|
throw new IllegalStateException("While [" + line.getRawText() + "]", e);
|
2015-12-23 19:01:26 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-15 20:01:43 -08:00
|
|
|
private void handleField(LinkedList<String> list) {
|
|
|
|
list.removeFirst(); // "field"
|
|
|
|
|
2019-08-26 17:58:40 -07:00
|
|
|
String uiFieldName = list.isEmpty() ? "" : list.removeFirst();
|
2016-01-15 20:01:43 -08:00
|
|
|
|
2016-01-19 21:01:29 -08:00
|
|
|
String key = list.isEmpty() ? null : list.removeFirst();
|
2016-01-15 20:01:43 -08:00
|
|
|
|
2019-08-26 17:58:40 -07:00
|
|
|
DialogModel.Field field = new DialogModel.Field(key, uiFieldName);
|
|
|
|
if (key != null) {
|
|
|
|
// UI labels do not have 'key'
|
|
|
|
allFields.put(key, field);
|
|
|
|
}
|
|
|
|
fieldsOfCurrentDialog.add(field);
|
|
|
|
System.out.println("IniFileModel: Field label=[" + uiFieldName + "] : key=[" + key + "]");
|
|
|
|
}
|
|
|
|
|
2020-04-29 18:45:42 -07:00
|
|
|
public Map<String, DialogModel.Field> getAllFields() {
|
|
|
|
return allFields;
|
|
|
|
}
|
|
|
|
|
2019-08-26 17:58:40 -07:00
|
|
|
@Nullable
|
|
|
|
public DialogModel.Field getField(String key) {
|
|
|
|
DialogModel.Field field = allFields.get(key);
|
|
|
|
return field;
|
2016-01-15 20:01:43 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
private void handleDialog(LinkedList<String> list) {
|
2016-01-17 22:01:46 -08:00
|
|
|
finishDialog();
|
2016-01-15 20:01:43 -08:00
|
|
|
State state;
|
|
|
|
list.removeFirst(); // "dialog"
|
|
|
|
state = State.DIALOG;
|
|
|
|
// trim(list);
|
|
|
|
String keyword = list.removeFirst();
|
|
|
|
// trim(list);
|
|
|
|
String name = list.isEmpty() ? null : list.removeFirst();
|
|
|
|
|
2016-01-19 20:02:48 -08:00
|
|
|
dialogId = keyword;
|
|
|
|
dialogUiName = name;
|
2018-01-24 17:11:44 -08:00
|
|
|
System.out.println("IniFileModel: Dialog key=" + keyword + ": name=[" + name + "]");
|
2016-01-15 20:01:43 -08:00
|
|
|
}
|
|
|
|
|
2015-12-23 19:01:26 -08:00
|
|
|
private void trim(LinkedList<String> list) {
|
|
|
|
while (!list.isEmpty() && list.getFirst().isEmpty())
|
|
|
|
list.removeFirst();
|
|
|
|
}
|
|
|
|
|
|
|
|
enum State {
|
|
|
|
SKIPPING,
|
|
|
|
DIALOG
|
|
|
|
}
|
|
|
|
|
2020-04-25 19:56:47 -07:00
|
|
|
public static synchronized IniFileModel getInstance(String iniFilePath) {
|
|
|
|
if (INSTANCE == null) {
|
|
|
|
INSTANCE = new IniFileModel();
|
|
|
|
INSTANCE.readIniFile(iniFilePath);
|
|
|
|
}
|
2016-01-19 20:02:48 -08:00
|
|
|
return INSTANCE;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Map<String, DialogModel> getDialogs() {
|
|
|
|
return dialogs;
|
|
|
|
}
|
2015-12-23 19:01:26 -08:00
|
|
|
}
|