Conf
Средства для работы с конфигурациями.
Объект jandcode.commons.conf.Conf представляет собой структуру типа "map-of-maps".
Прежде всего, это обычный Map, точнее jandcode.commons.variant.IVariantMap.
Имена ключей (в дальнейшем - свойства) - регистрозависимые.
Значениями могут быть обычные простые объекты (строки, числа, даты) или
объекты Conf. Значениями не могут быть объекты List и Map.
Создание экземпляра
Пустой объект:
Conf x = Conf.create();Из Map:
Map m = new LinkedHashMap();
m.put("a", 1);
m.put("b", 2);
Conf x = Conf.create(m);
/*
{
a: 1
b: 2
}
*/Из List:
List lst = new ArrayList();
lst.add(1);
lst.add("q1");
lst.add(new HashMap<>());
lst.add(Arrays.asList(1, 2));
Conf x = Conf.create(lst);
/*
{
#0: 1
#1: q1
#2: {
}
#3: {
#0: 1
#1: 2
}
}
*/Значения свойств
Установить значение можно с помощью метода setValue или put:
Conf x = Conf.create();
x.setValue("a", 1);
x.put("b", 2);
/*
{
a: 1
b: 2
}
*/Прочитать значения свойств можно с помощью метода get или методов
интерфейса jandcode.commons.variant.IVariantNamed (getString, getInt и т.д.):
/*
x =
{
str1: value1
int1: 2
}
*/
String s = x.getString("str1");
// value1
int i = x.getInt("int1");
// 2Путь
Путь до свойства описывается как имена свойств, разделенных символом '/'.
Можно читать и писать значения по пути:
Conf x = Conf.create();
x.setValue("a/b/c", 1);
x.setValue("a/b/d", 2);
/*
{
a: {
b: {
c: 1
d: 2
}
}
}
*/
String s = x.getString("a/b/c");
// 1Conf как значение свойства
В качестве значения свойства может быть указан объект Conf:
Conf x = Conf.create();
x.setValue("a", Conf.create());
/*
{
a: {
}
}
*/Для получения значения как Conf имееются специальные методы getConf и findConf.
Если значения по пути отсутсвует или оно не Conf, то getConf сгенерирует ошибку,
а findConf вернет null:
Conf x = Conf.create();
x.setValue("a", Conf.create());
Conf x1 = x.getConf("a");
x1.setValue("b", 2);
/*
x =
{
a: {
b: 2
}
}
x1 =
{
b: 2
}
*/
x1 = x.findConf("AAA");
// nullfindConf может автоматически создавать объекты по указанному пути. Для этого
нужно указать вторым параметром true:
Conf x = Conf.create();
Conf x1 = x.findConf("a/b/c", true);
/*
x =
{
a: {
b: {
c: {
}
}
}
}
*/Безымянное свойство
Для имитации списков предусмотрено специальное безымянное свойство #.
При присвоении значения такому свойству генерируется уникальное имя свойства:
Conf x = Conf.create();
x.setValue("#", 0);
x.setValue("#", 1);
/*
x =
{
#0: 0
#1: 1
}
*/Map и List как значение свойства
Типы Map и List преобразуются в тип Conf.
Для типа List создается объект Conf где для каждого элемента списка
создается безымянное свойство:
Conf x = Conf.create();
Map m = new LinkedHashMap();
m.put("a", 1);
m.put("b", 2);
m.put("c", Arrays.asList("i1", "i2"));
x.setValue("map1", m);
x.setValue("list1", Arrays.asList("item1", "item2"));
/*
x =
{
map1: {
a: 1
b: 2
c: {
#0: i1
#1: i2
}
}
list1: {
#0: item1
#1: item2
}
}
*/Загрузка из файла
Загрузка возможна из файлов формата cfx, xml или json. При загрузке существующие данные в объекте не стираются.
Conf x1 = Conf.create();
UtConf.load(x1).fromString("{\"a\":1}", "a.json");
/*
x =
{
a: 1.0
}
*/
Conf x2 = Conf.create();
UtConf.load(x2).fromString("<root><b>2</b></root>", "a.cfx");
/*
x =
{
b: 2
}
*/
Conf x3 = Conf.create();
UtConf.load(x3).fromString("<root><a z=\"3\">a</a><b>2</b></root>", "a.xml");
/*
x =
{
#0: {
$name: a
z: 3
text: a
}
#1: {
$name: b
text: 2
}
}
*/join
Объекты Conf можно объединять методом join. При этом в объект, в который
объединяем, присваиваются свойства из объекта, который объединяем. Для свойств
типа Conf делаются копии.
Conf x = Conf.create();
x.setValue("a/b", 1);
Conf x1 = Conf.create();
x1.setValue("a/c", 2);
x.join(x1);
// объект x1 независимый
x1.setValue("z", 1);
/*
x =
{
a: {
b: 1
c: 2
}
}
x1 =
{
a: {
c: 2
}
z: 1
}
*/