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");
// 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
}
*/