Параметры среды выполнения

Инфраструктуру для хранения параметров модуля предоставляет пакет org.eclipse.core.runtime.preferences. Обычно параметры сопоставляются с параметрами, управляемыми пользователем, на странице параметров, но это не обязательное требование. Параметры модуля - это пары ключ/значение, где ключ описывает имя параметра, а значение может быть одного из нескольких типов (булевский, двойной точности, с плавающей точкой, целое, длинное целое или строка). Параметры сохраняются в файловой системе и извлекаются из нее средствами платформы. Точное расположение сохраненных параметров зависит от области параметров.

Области параметров

Термин Область параметра тесно связан с тем, где параметр сохранен. Разработчики модулей могут использовать для сохранения параметров какую-либо из стандартных областей или определить новую для своего модуля. Сначала давайте рассмотрим области, определенные средой выполнения платформы:

Можно считать, что все параметры сохраняются в виде иерархии узлов, где каждая основная ветвь представляет собой конкретную область. Потомки каждого конкретного узла зависят от способа определения области. Для областей экземпляра и конфигурации дочерние узлы - это параметры для конкретного модуля указанные в атрибуте qualifier, обычно это ИД модуля.

Если все сказанное выше непонятно, это не страшно. Если вы до этого момента и знать не знали об областях и узлах, то и не волнуйтесь о том, в какой конкретно области или в каком узле дерева хранится ваш параметр. При запросе значения параметра API параметров автоматически обойдет все узлы в нужном порядке (экземпляр, конфигурация, по умолчанию) и с помощью нужного квалификатора и имени параметра найдет узел, содержащий это значение.

Доступ к параметрам осуществляется с помощью протокола IPreferencesService. Доступ к службе параметров по умолчанию платформы можно получить с помощью класса Platform.

	...
	IPreferencesService service = Platform.getPreferencesService();
	...

После получения службы параметров можно запросить значение параметра по имени с помощью любого метода get... из IPreferencesService. Например, в следующем фрагменте кода запрашивается значение атрибута "MyPreference" в модуле "com.example.myplugin".

	...
	IPreferencesService service = Platform.getPreferencesService();
	boolean value = service.getBoolean("com.example.myplugin", "MyPreference", true, null);
	// обработка значения.
	...

Последний параметр в запросе - это массив контекстов областей для поиска узла параметра. Если массив пуст, то платформа считает, что искать следует в области по умолчанию и запрашивает соответствующий узел параметра. Если массив контекстов областей передан, то он определяет порядок областей для поиска соответствующего узла. Порядок по умолчанию всегда учитывает возможность отсутствия узла в заданных областях.

Работа с узлами и областями

Если в модуле необходим более точный контроль порядка областей поиска, то для получения доступа к фактическому узлу, представляющему параметр в конкретной области, можно воспользоваться классами областей. При таком подходе создается массив узлов, который задает конкретный порядок поиска. В следующем фрагменте кода запрашивается служба параметров для тех же атрибутов, что и выше, но поиск осуществляется в области конфигурации модуля, а затем - в области экземпляра модуля. Если в порядке поиска указываются узлы, то область по умолчанию во внимание не принимается. То есть, платформа будет искать только по конкретным указанным узлам.

	...
	IPreferencesService service = Platform.getPreferencesService();
	Preferences configurationNode = new ConfigurationScope().getNode("com.example.myplugin");
	Preferences instanceNode = new InstanceScope().getNode("com.example.myplugin");
	Preferences[] nodes = new Preferences[] {configurationNode, instanceNode};
	stringValue = service.get("MyPreference", "true", nodes);
	// обработка значения.
	...

В модуле можно реализовать собственный алгоритм обхода узлов дерева параметров. Корневой узел дерева (вершину) можно получить из службы параметров. Дальнейший обход осуществляется с помощью классов областей. Следующий фрагмент кода идет к заданному узлу и извлекает значение параметра прямо из него.

	...
	IPreferencesService service = Platform.getPreferencesService();
	Preferences root = service.getRootNode();
	Preferences myInstanceNode = root.node(InstanceScope.SCOPE).node("com.example.myplugin");
	if (myInstanceNode != null) {
		value = node.getBoolean("MyPreference", "true");
	// обработка значения.
	}
	...

Расширение областей

С помощью расширения org.eclipse.core.runtime.preferences можно определить в модуле свои собственные области. В этом расширении определяется имя новой области для модуля и класс для создания узлов в новой области. При желании можно указать имя класса, инициализирующего значения по умолчанию для параметров этой области. Если в модуле определяется новая область, то в нем также следует реализовать порядок обхода ее узлов по отношению к порядку обхода, реализованному в платформе. Более подробно эта возможность будет рассмотрена на примере в разделе Параметры области проекта.