Подсистема конфигурирования.

Цель документа: описание подсистемы конфигурирования проекта Eskimo.
Тип документа: техническое описание.
Составили: Савенко Д.В., Кузнецов А. А.
Дата: 05.07.2005
Версия: 1.0

Содержание:
1.	Классы для работы с конфигурацией.
2.	Парсер файлов конфигурации.
3.	Парсер файлов описания полей.

1. Классы для работы с конфигурацией.

Каждый параметр конфигурации описывается интерфейсом Property:

interface Property {
  Object getValue();
  String getName;
};

Интерфейс имеет несколько реализаций для каждого типа значений:
1.	BooleanProperty — getValue() возвращает Boolean
2.	IntegerProperty  — getValue() возвращает Integer
3.	DoubleProperty — getValue() возвращает Double
4.	StringProperty — getValue() возвращает String
5.	SelectedProperty — getValue() возвращает String
6.	ListProperty — getValue() возвращает String[].

Конфигурация сервера имеет древовидную структуру, которая описывается классом ConfigNode.

class ConfigNode {
  private String name;
  private HashMap parameters;
  private HashMap children;
  private ConfigNode parent;

  public ConfigNode(String nameNode);

  public Property getProperty(String propertyName);
    throws ObjectNotFoundException;
  public void setProperty(Property prop)
  public ConfigNode getParent();
    throws NoParentException;  
  public ConfigNode getChild(String childName);
    throws ObjectNotFoundException;
  public List getChildren();
  public void addChild(ConfigNode node);
  public String getName();
};

Этим классом пользуется сервер и парсер. Для сервисов предусмотрен другой класс, сужающий интерфейс ConfigNode:

class UserConfigNode extends IUserConfigNode {
  private ConfigNode node;
  
  public UserConfigNode(ConfigNode configNode);
  public Property getProperty(String name);
    throws ObjectNotFoundException;
  public IUserConfigNode getParent();
    throws NoParentException;  
  public IUserConfigNode getChild(String childName)
    throws ObjectNotFoundException;
  public String[] getChildren();
};

В целях безопасности класс UserConfigNode будет описан в менеджере конфигурации. Сами сервисы имеют доступ к конфигурации только через интерфейс IUserConfigNode, который имеет следующий вид:

interface IUserConfigNode {
  public Property getProperty(String name)
    throws ObjectNotFoundException;
  public IUserConfigNode getParent()
    throws NoParentException;  
  public IUserConfigNode getChild(String childName)
    throws ObjectNotFoundException;
  public String[] getChildren();
};

Менеджер конфигурации имеет вид:

interface IConfigManager {
  public UserConfigNode getConfigNode(String path)
    throws ObjectNotFoundException;
};

Функция getConfigNode() возвращает нужную ячейку конфигурации по так называемому пути конфигурации, который описывает, какой именно узел дерева конфигурации нас интересует. Например, у нас есть схема запуска с именем NuclearWarScheme, в ней группа с именем Moscow и в ней экземпляр плагина с именем RocketLauncher. Тогда чтобы получить настройки сервиса RocketLauncher, мы должны вызвать getConfigNode(“ROOT\NuclearWarScheme\Moscow\RocketLauncher”). 

2. Парсер файлов конфигурации.

Парсер файлов конфигурации вызывается один раз при запуске сервера и формирует дерево конфигурации из файла конфигурации. Он имеет следующий вид:

class Parser {
  // приватные поля и методы

  public Parser(ArrayList configStrings);
  public Parser(BufferedReader configReader);
  public Parser(String configName);

  public ConfigNode getConfigTree()
    throws BadConfigException;
}

Основной метод — getConfigTree() — бросает BadConfigException, если поданная конфигурация неверна с точки зрения синтаксиса, либо где-то не совпадают прописанные и декларированные типы полей. Более глубокая проверка правильности полей происходит на стороне плагина в момент его загрузки. 

3. Парсер файлов описания полей.

Парсер файлов описания полей вызывается один раз дли каждого плагина при его инсталляции. Он возвращает список значений типа Property для каждого поля, описанного в файле. Его класс имеет следующий вид:

class DescriptionParser {
  // приватные поля и методы

  public DescriptionParser(ArrayList configStrings);
  public DescriptionParser(BufferedReader configReader);
  public DescriptionParser(String configName);

  public List getTypesList()
    throws BadConfigException;
};