El paquete org.eclipse.core.runtime.preferences proporciona una infraestructura para almacenar las preferencias de un conector. Generalmente, las preferencias se correlacionan con valores controlados por el usuario en la página Preferencias, aunque esto no es necesario para la infraestructura subyacente. Las preferencias de conector son pares formados por clave/valor, en los que la clave describe el nombre de la preferencia y el valor es uno de los diversos tipos (boolean, double, float, int, long o string). La plataforma puede almacenar y recuperar las preferencias del sistema de archivos. La ubicación exacta de las preferencias guardadas depende del ámbito de la preferencia.
El almacén global de preferencias puede considerarse una jerarquía de nodos, en la que cada rama principal de la jerarquía representa un ámbito determinado. Los hijos de un nodo determinado dependen de cómo se haya definido ese ámbito. Para los ámbitos de instancia y configuración, los nodos hijos son las preferencias de un conector determinado, según lo especificado por un calificador de preferencias, generalmente el ID del conector.
Si todo esto le parece confuso, no se preocupe. Si no le importan los ámbitos y los nodos, no necesitará preocuparse de ningún ámbito determinado ni de qué nodo del árbol contiene realmente el valor de la preferencia. La API de preferencias examinará automáticamente los nodos en el orden adecuado (instancia, configuración, omisión) cuando el usuario solicite un valor de preferencias y utilizará el calificador suministrado y el nombre de la preferencia para buscar el nodo que contiene de hecho el valor.
Se accede a las preferencias mediante el protocolo IPreferencesService. Puede accederse al servicio de preferencias por omisión de la plataforma mediante la clase Platform.
... IPreferencesService service = Platform.getPreferencesService(); ...
Una vez obtenido el servicio de preferencias, pueden consultarse valores de preferencias por nombre mediante cualquiera de los métodos get... suministrados en IPreferencesService. Por ejemplo, el siguiente fragmento de código consulta el valor de la preferencia "MyPreference" del conector "com.example.myplugin".
... IPreferencesService service = Platform.getPreferencesService(); boolean value = service.getBoolean("com.example.myplugin", "MyPreference", true, null); //realizar alguna acción con el valor. ...
El último parámetro del método de consulta es una matriz de contextos de ámbito que se utilizan al buscar el nodo de preferencias. Si la matriz es null, la plataforma presupone que debe utilizarse el orden de búsqueda de ámbito por omisión y averigua el nodo de preferencias adecuado. Si se pasa una matriz de contextos de ámbito, ésta determina el orden de búsqueda de ámbito que debe utilizarse para buscar el nodo de preferencias. El orden de búsqueda de ámbito por omisión se consulta siempre que no puede encontrarse ningún nodo utilizando los ámbitos especificados.
Si un conector necesita un control más detallado sobre el orden de búsqueda de ámbito, pueden utilizarse las clases que representan los ámbitos para acceder al nodo real que representa la preferencia en un ámbito determinado. De este modo, puede crearse una matriz de nodos que especifique el orden de búsqueda de determinado. El siguiente fragmento de código consulta el servicio de preferencias la misma preferencia utilizada anteriormente, pero busca en el ámbito de configuración del conector, y después en el ámbito de instancia del conector. Si se especifican nodos para el orden de búsqueda, el ámbito por omisión no se tiene en cuenta. Es decir, la plataforma sólo buscará en los nodos exactos que se han suministrado.
... 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); //realizar alguna acción con el valor. ...
Un conector también puede implementar su propia estrategia transversal a través de los nodos del árbol de preferencias. El nodo raíz del árbol de preferencias puede obtenerse del servicio de preferencias. Pueden utilizarse las clases de ámbito para examinar el árbol con mayor profundidad. El siguiente fragmento de código llega hasta un nodo específico y recupera el valor de preferencia del propio nodo.
... 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"); //realizar alguna acción con el valor. } ...
Los conectores pueden definir sus propios ámbitos especializados mediante la extensión org.eclipse.core.runtime.preferences. En esta extensión, el conector define el nombre del ámbito nuevo, así como una clase que puede crear nodos de preferencias para el ámbito nuevo. Opcionalmente, puede especificar el nombre de la clase que inicializa los valores de preferencias por omisión de ese ámbito. Cuando un conector define un ámbito nuevo, dicho conector tiene la opción de implementar el orden transversal de cualquier ámbito nuevo en relación al orden transversal de la plataforma. Examinaremos esta capacidad con mayor detalle en el ejemplo específico de preferencias cuyo ámbito es un proyecto.