Conf

Связи
  • jandcode-commons (lib)
  • jandcode.commons.conf (package)
  • jandcode.commons.conf.Conf (class)
  • jandcode.commons.UtConf (class)

Средства для работы с конфигурациями.

Объект 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");
// 1

Conf как значение свойства

В качестве значения свойства может быть указан объект 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");
// null

findConf может автоматически создавать объекты по указанному пути. Для этого нужно указать вторым параметром 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
}
*/