1 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Data Access Library desde la perspectiva del cliente de la librería gvSIG: Avanzando Juntos http://www.gvsig.gva.es http://www.gvsig.org Jose Manuel Vivó Arnal (Chema) Desarrollador v2.0 [email protected]
2 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Objetivos de la presentación: Introducción a la Arquitectura DAL. Conocer los servicios DAL para fuentes tabulares: Enumeración de servicios Introducción a los principales servicios.
3 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. ¿Dónde encontrar documentación? http://www.gvsig.org/web/docdev/gvsig_desktop_2_0/org.gvsig.fmap.dal/
4 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Índice de la presentación: 1. Introducción y Contexto de la librería. 2. Descripción general de la arquitectura. 3. Descripción de la arquitectura para datos tabulares. 4. Preguntas. 5. Acceso a Fenómenos (Básico, Filtrado, Ordenación, Contexto). 6. Preguntas. 7. Modificación y escritura de un almacén. 8. Preguntas. 9. Consultar la estructura de un almacén. 10. Creación de un almacén nuevo.
5 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Índice de la presentación: 11. Modificación de la estructura de un almacén. 12. Preguntas 13. Manejo de la selección de Fenómenos de un almacén. 14. Bloqueo de Fenómenos. 15. Acceso a operaciones específicas del proveedor. 16. Soporte para atributos calculados. 17. Preguntas. 18. Pila de comandos. 19. Soporte para índices. 20. Transformación de un almacén. 21. Preguntas
6 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. ¿Qué es DAL? Data Access Library: denominación de la capa de accesos a dato de gvSIG. Pretende dotar de una capa de abstracción homogénea a las fuentes de datos para el núcleo de la aplicación. Arquitectura pensada para ser flexible y robusta: Desacoplamiento. Trazabilidad.
7 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Contexto de DAL
8 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Descripción general de la arquitectura. Bloques que componen la librería: Application Programming Interface (API): Servicios que se ofrecen al consumidor de la librería. Service Provider Interface (SPI): Servicios que deben ofrecer los proveedores de datos a la librería. Implementación: Parte que procesa la peticiones del consumidor usando los servicios de proveedor.
9 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Descripción general de la arquitectura. Como consumidor gvSIG sólo ve las interfaces de API. La parte de la implementación aisla al consumidor de los detalles de la fuente de datos. La Implementación prepara las peticiones al proveedor de forma estándar. El proveedor se encarga de hacer las operaciones necesarias para procesar la petición y realizar la consulta de los datos a la fuente de datos, devolviéndolos de forma estándar. La implementación ofrece los resultados de forma idéntica, independientemente de las características de la fuente.
10 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Visión general del API Diagrama 1
11 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Visión general de API para datos Tabulares Diagrama 2
12 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Ejemplo de acceso a un Shape y a una tabla PostgreSQL: DataManager manager; StoreParameters params; FeatureStore store; FeatureSet features; Feature feature; manager = DALLocator.getDataManager(); params = manager.createStoreParameters("PostgreSQL"); params.setDynValue("host", SERVER_IP); params.setDynValue("dbuser",SERVER_USER); params.setDynValue("password",SERVER_PASWD); params.setDynValue("dbname",SERVER_DBNAME); params.setDynValue("table","prueba"); store = (FeatureStore)manager.createStore(params); features = store.getFeatureSet(); DisposableIterator it = features.iterator(); while( it.hasNext() ) { feature = (Feature)it.next(); System.out.println(feature.getString("nombre")); } it.dispose(); features.dispose(); store.dispose(); DataManager manager; StoreParameters params; FeatureStore store; FeatureSet features; Feature feature; manager = DALLocator.getDataManager(); params = manager.createStoreParameters("Shape"); params.setDynValue("shpfilename","data/prueba.shp"); store = (FeatureStore)manager.createStore(params); features = store.getFeatureSet(); DisposableIterator it = features.iterator(); while( it.hasNext() ) { feature = (Feature)it.next(); System.out.println(feature.getString("NOMBRE")); } it.dispose(); features.dispose(); store.dispose(); Código fuente 2Código fuente 1
13 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Descripción Arquitectura DAL Preguntas ¿?
14 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos: Básico Explicación de ejemplo (Código Fuente 1): 1. Accedemos al Manager a través del Locator. 7 manager = DALLocator.getDataManager(); 2. Creamos una instancia de los parámetros. 8 params = manager.createStoreParameters("Shape"); 3. Rellenamos los datos necesarios para acceder al almacén. 9 params.setDynValue("shpfilename","data/prueba.shp"); 4. Creamos el almacén. 10 store = (FeatureStore)manager.createStore(params); 5. Accedemos al conjunto (Set) de los Fenómenos. 11 features = store.getFeatureSet();
15 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos: Básico 6. Pedimos un Iterador al conjunto de Fenómenos. 13 DisposableIterator it = features.iterator(); 7. Iteramos. 14 while (it.hasNext()){ 15 Feature feature = (Feature)it.next();... 17 } 8. Liberamos los recursos que hemos usado. 18 it.dispose(); 19 features.dispose(); 20 store.dispose();
16 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos: Básico FeatureStore: - getFeatureTypes, getDefaultFeatureType: aceso a la definición de la estructura del almacén. - getFeatureSet: Crea un subconjunto de fenómenos. - getFeatureCount: Cantidad total de fenómenos. - getParameters: Parámetros del almacén. - dispose: Libera recursos utilizados y prepara para su eliminación.
17 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos: Básico FeatureSet: - getFeatureTypes, getDefaultFeatureType - getSize: Cantidad de fenómenos en el subconjunto. - isEmpty: Informa si hay fenómenos. - iterator: Crea un nuevo iterador sobre el subconjunto. - fastIterator: Crea un nuevo iterador sobre el subconjunto usando la misma instancia de Feature.
18 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos: Básico Feature: - getType: devuelve la estructura del fenómeno. - get: devuelve el valor de un atributo (por indicie o nombre). - getInt, getString, getBoolean, getDouble...: devuelve el valor de un atributo usando el tipo especificado. - getArray: devuelve el valor de un atributo de tipo Array. - getGeometry: devuelve el valor de un atributo de tipo geométrico. - getDefaultGeometry: devuelve el valor del atributo de tipo geométrico seleccionado por defecto.
19 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos: Filtrado Iterator typeIt = store.getFeatureTypes().iterator(); while( typeIt.hasNext() ) { FeatureQuery query = store.createFeatureQuery(); FeatureType type = (FeatureType)typeIt.next(); query.setFeatureType(type); features = store.getFeatureSet(query); DisposableIterator it = features.iterator(); while( it.hasNext() ) { feature = (Feature)it.next(); System.out.println( feature.getString("NOMBRE")); } it.dispose(); features.dispose(); } FeatureQuery query = store.createFeatureQuery(); Evaluator filter = manager.createExpresion("NOMBRE like 'a%'"); query.setFilter(filter); features = store.getFeatureSet(query); DisposableIterator it = features.iterator(); while( it.hasNext() ) { feature = (Feature)it.next(); System.out.println( feature.getString("NOMBRE")); } it.dispose(); features.dispose(); Filtrado por tipo: Filtrado por expresión: Código fuente 3Código fuente 4
20 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos: Filtrado Explicación de ejemplo (Código Fuente 4): 1. Creamos un FeatureQuery a través del store. 1 FeatureQuery query = store 2.createFeatureQuery(); 2. Creamos un Evaluator basado en una expresión. 3 Evaluato filter = manager 4.createExpresion("NOMBRE like 'a%'"); 3. Establecemos el filtro en la consulta. 5 query.setFilter(filter); 5. Accedemos al conjunto (Set) de los Fenómenos usando la definición de consulta que hemos construido. 6 features = store.getFeatureSet(query);
21 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos: Filtrado FeatureStore : - getFeatureSet(FeatureQuery): Crear un subconjunto de fenómenos según la consulta recibida. - getFeatureSet(FeatureQuery,Observer): Crear un subconjunto de fenómenos según la consulta recibida en segundo plano. - createFeatureQuery(): Crear una instancia de definición de consulta. FeatureQuery : - setFeatureType(FeatureType): Establece/Selecciona el tipo a usar. - get/setFeatureTypeId(String): id del tipo a usar. - get/setAttributeNames(String[]): Lista de atributos a usar del tipo especificado. - get/setFilter(Evaluator): Filtro a aplicar. - hasFilter(): Informa si se ha aplicado un filtro.
22 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos: Ordenación FeatureQuery query = store.createFeatureQuery(); query.getOrder().add("CODIGO",true); query.getOrder().add("NOMBRE",false); features = store.getFeatureSet(query); DisposableIterator it = features.iterator(); while( it.hasNext() ) { feature = (Feature)it.next(); System.out.println( feature.getString("NOMBRE")); } it.dispose(); features.dispose(); FeatureQuery query = store.createFeatureQuery(); Evaluator nombreToLower = manager.createExpresion("toLower(NOMBRE)"); query.getOrder().add("CODIGO",true); query.getOrder().add(nombreToLower,false); features = store.getFeatureSet(query); DisposableIterator it = features.iterator(); while( it.hasNext() ) { feature = (Feature)it.next(); System.out.println( feature.getString("NOMBRE")); } it.dispose(); features.dispose(); Ordenación por nombre: Ordenación por expresión: Código fuente 5Código fuente 6
23 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos: Ordenación Explicación de ejemplo (Código Fuente 6): 1. Creamos un FeatureQuery a través del store. 1 FeatureQuery query = store 2.createFeatureQuery(); 2. Creamos un Evaluator basado en una expresión que transforma el atributo NOMBRE a minúsculas. 3 Evaluato nombreToLower = manager 4.createExpresion("toLower(NOMBRE)"); 3. Establecemos el orden en la consulta. 5 query.getOrder().add("CODIGO",true); 6 query.getOrder().add(nombreToLower,false); 4. Creamos un conjunto (Set) de Fenómenos usando la definición de consulta que hemos construido. 7 features = store.getFeatureSet(query);
24 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos: Ordenación FeatureQuery : - get/setOrder(FeatureQueryOrder): Establece un orden a partir de uno existente. - hasOrder(): Informa si hay establecido un orden. FeatureQueryOrder : - add(String, boolean): Añade un orden a partir de un nombre de atributo. - add(Evaluator, boolean): Añade un orden a partir de una expresión. - clear(): Limpia el orden establecido. - remove: Elimina un elemento del orden.
25 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos: Contexto El objeto FeatureQuery admite añadir parámetros de contexto para que el proveedor de datos pueda optimizar los datos resultantes dependiendo de la operación. Un ejemplo sería la escala de visualización en el pintado de la capa. FeatureQuery : - get/setQueryParameter(String,Object): Devuelve/establece el valor de un parámetro de contexto. - get/setScale(double): Devuelve/establece el valor del parámetro escala de visualización.
26 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a Fenómenos Preguntas ¿?
27 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación y escritura de un almacén. En este apartado veremos: ● Introducción. ● Servicios que ofrece el almacén para la edición. ● Servicios de modificación de un fenómeno. ● Inserción de nuevos fenómenos. ● Modificación de fenómenos ya existentes. ● Eliminación de fenómenos. ● Reglas de validación.
28 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación y escritura de un almacén: Introducción. Un almacén tiene los siguientes modos: MODE_QUERY: Modo de Consulta o estándar. No admite operaciones de edición. MODE_FULLEDIT: Modo de edición completa. Admite operaciones de deshacer y rehacer. Admite consulta de datos. Los cambios se aplican en memoria y no persisten hasta finalizar. Soportado para todos los almacenes. Si se intenta persistir y el almacén es de sólo lectura habrá una excepción. MODE_APPEND: Modo en sólo inserción de nuevo fenómenos. No admite deshacer/rehacer. No admite consultas. Los cambios se aplican directamente en el proveedor. No soportado por todos los almacenes.
29 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación y escritura de un almacén: Servicios del almacén para edición. FeatureStore: - allowWrite: Informa si es capaz de persistir cambios. - edit: Entra en modo edición (Full o Append) (Full por omisión). - cancelEditing: Finaliza edición cancelando los cambios. - finishEditing: Finaliza edición persistiendo los cambios. - IsEditing/isAppending: Informa del modo actual. - undo/redo: deshacer/rehacer cambios. - insert/update/delete: inserción/actualización/eliminación de fenómenos - createNewFeature: creación de un nuevo fenómeno para rellenar. - IsAppendModeSupported: Informa del soporte del modo Append en el almacén - begin/endEditingGroup: gestionan agrupaciones de modificaciones (para undo/redo).
30 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación y escritura de un almacén: Servicios de modificación de un fenómeno. El objeto Feature no da servicios de modificación, para ello debemos usar EditableFeature, el cual se hace a través de FeatureStore.createNewFeature o del Feature.getEditable EditableFeature: – set: Estable el valor de un atributo. – setInt,setString,setDouble: Establece el valor de un atributo. – setDefaultGeometry: Establece el valor del campo marcado como geometría por defecto. – getSource: Devuelve la Feature original de la que se ha sacado la copia con el Feature.getEditable. – copyFrom: Copia los valore de los atributos usando los de otra Feature.
31 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación y escritura de un almacén: Validez de los Set y sus servicios de edición. La modificación de un almacén provoca que los FeatureSet que estuviesen activos hasta el momento queden invalidados. Para evitar que el FeatureSet con el que trabajamos se invalide, debemos usar sus propios servicios de actualización FeatureSet: – insert/update/delete: Realiza un cambio en el almacén origen de los datos, teniendo en cuenta los cambios en el propio Set. Iterator: – remove: (de un FeatureSet) Elimina del almacén origen el último fenómeno accedido, teniendo en cuenta los cambios en el Set de origen.
32 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación y escritura de un almacén: Inserción de nuevos fenómenos. store.edit(); EditableFeature feature = store.createNewFeature(); feature.set("NOMBRE", "Burjasot"); feature.set("TIPO", "MUNICIPIO"); store.insert(feature); store.finishEditing(); Código fuente 7 Explicación del ejemplo: 1. Entramos en modo Fullediting. 1 store.edit(); 2. Creamos un nuevo fenómeno. 3 EditableFeature feature = store.createNewFeature(); 3. Rellenamos los datos del fenómeno. 4 feature.set( "NOMBRE","Burjasot" ); 4. Insertamos en el almacén. 7 store.insert(feature); 4. Finalizamos edición guardando los cambios. 8 store.finishEditing();
33 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación y escritura de un almacén: Modificación de fenómenos existentes. store.edit(); EditableFeature feature; FeatureQuery query = store.createFeatureQuery(); query.setFilter(manager.createExpresion("NOMBRE = 'Burjasot'")); features = store.getFeatureSet(query); Iterator it = features.iterator(); while( it.hasNext() ) { feature = ((Feature)it.next()).getEditable(); feature.set("TIPO", "Municipio"); features.update(feature); } features.dispose(); store.finishEditing(); Código fuente 8
34 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación y escritura de un almacén: Modificación de fenómenos existentes. Explicación de ejemplo (Código Fuente 8): 1. Entramos en modo edición. 1 store.edit(); 2. Creamos un FeatureSet con los fenómenos que queremos modificar. 6 features = store.getFeatureSet(query); 3. Pedimos al fenómeno su Editable y actualizamos el valor. 11 feature = ((Feature)it.next()).getEditable(); 12 feature.set("TIPO", "Municipio"); 4. Actualizamos el fenómeno en el Set. 13 features.update(feature); 5. Finalizamos edición guardando los datos. 17 store.finishEditing();
35 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación y escritura de un almacén: Eliminación de fenómenos. store.edit(); FeatureQuery query = store.createFeatureQuery(); query.setFilter(manager.createExpresion("NOMBRE = 'Burjasot'")); features = store.getFeatureSet(query); Iterator it = features.iterator(); while( it.hasNext() ) { it.next(); it.remove(); } features.dispose(); store.finishEditing(); Código fuente 9
36 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación y escritura de un almacén: Eliminación de fenómenos. Explicación de ejemplo (Código Fuente 9): 1. Entramos en modo edición. 1 store.edit(); 2. Creamos un FeatureSet con los fenómenos que queremos modificar. 5 features = store.getFeatureSet(query); 3. Iteramos al siguiente elemento. 10 it.next() ; 4. Eliminamos el fenómeno actual desde el iterador. 11 it.remove(); 5. Finalizamos edición guardando los datos. 13 store.finishEditing();
37 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación y escritura de un almacén: Reglas de validación. La librería soporta la aplicación de reglas que validen la integridad de los datos de los almacenes. Dichas reglas pueden ser aplicadas: ● En la inserción o modificación de un fenómeno. ● Al finalizar la edición. ● En ambos casos. La definición de una Regla de validación pasa por implementar el interface FeatureRule. Las reglas se aplican sobre los FeatureType.
38 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación y escritura de un almacén. Preguntas ¿?
39 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Consultar la estructura de un almacén. Introducción. Un almacén admite múltiples estructuras de datos. Un almacén, por comodidad, declara una estructura a usar por defecto. Las estructuras se definen por la clase FeatureType. Un atributos de los que compone un FeatureType lo define un FeatureAttributeDescriptor. Un FeatureType puede tener definido un atributo de tipo geometría para usar por defecto.
40 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Consultar la estructura de un almacén. Principales servicios. FeatureType: - size: Número de atributos. - getIndex: Índice de atributo por su nombre. - getDefaultGeometryAttributeName/Index: atributo geométrico por defecto. - Iterator: Iterador sobre los atributos. - get/getAttribute: devuelve el atributo (por nombre o índice). - getId: devuelve el identificador de la estructura.
41 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Consultar la estructura de un almacén. Principales servicios. FeatureAttributeDescriptor: - getName: Nombre del atributo. - getDataType/getDataTypeName: tipo del atributo. - getDefaultValue: valor por defecto. - getIndex: índice que ocupa. - getSize: tamaño. - getEvaluator: devuelve el evaluador que se usará para calcular un atributo calculado. - allowNull: informa si admite el valor nulo. - isPrimaryKey: informa si es parte de la clave primaria. - isReadOnly: informa si es de sólo lectura.
42 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Consultar la estructura de un almacén. Ejemplo. FeatureType featureType = store.getDefaultFeatureType(); Iterator it = featureType.iterator(); while( it.hasNext() ) { attribute = (FeatureAttributeDescriptor)it.next(); System.out.print(attribute.getDataTypeName(); if( attribute.getSize() > 1 ) { System.out.print("["+attribute.getSize()+"]"); } System.out.print(" " + attribute.getName() ); Evaluator eval = attribute.getEvaluator(); if( eval != null ) { System.out.print( attribute.getName()+ ", "+ attribute.getDataTypeName()+ " -- Calculado "+ eval.getCQL()); } System.out.println(); } Código fuente 10
43 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Creación de un almacén nuevo. Introducción a los exploradores. Los servicios de consulta, creación y eliminación de almacenes de la librería ofrecen a través de los ServerExplorer. Los ServerExplorer van más unidos al soporte de los datos que al tipo (FileSystem, DB, Web). Los ServerExplorer requieren sus propios parámetros, que pueden ser los mismo o un subconjunto de los necesarios para el almacén.
44 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Creación de un almacén nuevo. Principales servicios de los exploradores. DataServerExplorer: - canAdd: informa si es posible la creación de almacenes. - canAdd(tipo): informa si es posible la creación de almacenes de un tipo en concreto (si soporta varios tipos). - list: devuelve una lista de DataParameters de los almacenes disponibles en el servidor. - add: Crea un nuevo almacén a partir de los parámetros recibidos - remove: Elimina un almacén del servidor - getAddParameters: crea un objeto para rellenar los parámetros necesarios para la creación de un almacén.
45 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Creación de un almacén nuevo. Servicios definición de estructura. EditableFeatureType : - add: añade un nuevo atributo en base a los parámetros. - remove: elimina un atributo. - setDefaultGeometryAttributeName: establece el nombre del atributo geométrico que se va a usar por defecto. EditableFeatureAttributeDescriptor: - setSize: establece el tamaño del atributo. - setPrecision: estable la precisión del atributo para los tipo decimales. - setPrimaryKey: establece que forma parte de la clave primaria. - setAllowNull: establece si el atributo admitirá valores nulos.
46 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Creación de un almacén nuevo. Ejemplo. DataExplorerParameters eparams = manager.createServerExplorerParameters("FilesystemExplorer"); eparams.setDynValue("initialpath","/data"); DataServerExplorer serverExplorer = manager.createServerExplorer(eparams); NewFeatureStoreParameters sparams = (NewFeatureStoreParameters) serverExplorer.getAddParameters("DBF"); sparams.setDynValue("dbffilename","prueba.dbf"); EditableFeatureType featureType = (EditableFeatureType) sparams.getDefaultFeatureType(); featureType.add("NOMBRE", DataTypes.STRING,100); featureType.add("MUNICIPIO", DataTypes.STRING,100); featureType.add("POBLACION", DataTypes.LONG); featureType.add("AREA", DataTypes.DOUBLE); serverExplorer.add(sparams); Código fuente 11
47 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Creación de un almacén nuevo. Ejemplo. Explicación de ejemplo (Código Fuente 11): 1. Creamos los parámetro para un explorador de ficheros. 1 DataExplorerParameters eparams = manager 2.createServerExplorerParameters("FilesystemExplorer"); 3 eparams.setDynValue("initialpath","/data"); 2. Creamos un explorador de ficheros. 4 DataServerExplorer serverExplorer = manager.createServerExplorer(eparams); 3. Pedimos los parámetros al explorador para crear un almacén de tipo DBF. 6 NewFeatureStoreParameters sparams = (NewFeatureStoreParameters) 7 serverExplorer.getAddParameters("DBF"); 4. Rellenamos el parámetro de la ruta al nuevo fichero. 8 sparams.setDynValue("dbffilename","prueba.dbf");
48 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Creación de un almacén nuevo. Ejemplo. 5. Definimos la estructura de los datos del almacén. 11 EditableFeatureType featureType = (EditableFeatureType) 12 sparams.getDefaultFeatureType(); 13 featureType.add("NOMBRE", DataTypes.STRING,100); 14 featureType.add("MUNICIPIO", DataTypes.STRING,100);... 6. Solicitamos al explorador que cree el almacén. 18 serverExplorer.add(sparams);
49 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación de la estructura de un almacén. Ejemplo store.edit(); FeatureType featureType = store.getDefaultFeatureType(); EditableFeatureType editableFeatureType = featureType.getEditable(); editableFeatureType.getAttributeDescriptor("MUNICIPIO").setSize(50); editableFeatureType.getAttributeDescriptor("NOMBRE").setSize(50); store.update(editableFeatureType); store.finishEdition(); Código fuente 12
50 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Modificación de la estructura de un almacén. Ejemplo. Explicación de ejemplo (Código Fuente 12): 1. Entramos en edición. 1 store.edit(); 2. Accedemos al FeatureType por defecto. 2 FeatureType featureType = store.getDefaultFeatureType(); 3. Accedemos a una copia Editable de la estructura. 3 EditableFeatureType editableFeatureType = featureType.getEditable(); 4. Hacemos las modificaciones. 4 editableFeatureType.getAttributeDescriptor("MUNICIPIO").setSize(50); 4. Actualizamos en el almacén. 6 store.update(editableFeatureType); 4. Finalizamos edición guardando los cambios. 7 store.finishEdition();
51 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Crear almacén nuevo. Consulta y modificación de estructura del almacén. Preguntas ¿?
52 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Manejo de la selección de Fenómenos. Introducción. Un almacén ofrece una selección de fenómenos. La selección es una especialización de un FeatureSet. Los FeatureSelection por defecto almacenan FeatureReference, pero los proveedores pueden ofrecer otra implementación.
53 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Manejo de la selección de Fenómenos. Principales servicios. FeatureStore: - getFeatureSelection: selección actual. - createFeatureSelection: crea un set de selección vacío. - setSelection: estable una selección sustituyendo al actual. FeatureReference: - getFeature: devuelve la feature a la que hace referencia. Feature: - getReference: devuelve una instancia de FeatureRefrence.
54 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Manejo de la selección de Fenómenos. Principales servicios. FeatureSelection: - de/select: de/selecciona un Feature o un FeatureSet. - isSelected: informa si una Feature está seleccionada. - de/selectAll: de/selecciona todos los elementos. - reverse: invierte la selección.
55 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Bloqueo de Fenómenos en el servidor. La librería ofrece un interface para el bloqueo de fenómenos en el servidor. Este servicio se delega en el proveedor de datos. Los proveedores pueden no soportar este servicio. Esta parte de la librería no está desarrollada y es susceptible a cambios.
56 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Acceso a operaciones específicas del proveedor. Los proveedores de datos puede ofrecer servicios específicos que no estén contemplados en el API. A estos servicios se accede mediante los DynMethods a través del almacén. Un ejemplo serían las leyendas estándar de los proveedores de CAD. Se pueden explorar que métodos específicos del proveedor que tiene un almacén usando su DynClass.
57 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Soporte para atributos calculados. La librería ofrece la posibilidad de definir y añadir campos calculados al cualquier almacén. Estos campos no persisten dentro de soporte del almacén. Se calculan bajo demanda, pero sólo la primera vez. Se usa una instancia de Evaluator para definirlo. Se añaden en el almacén usando la edición. Pueden añadirse en almacenes de sólo lectura.
58 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Soporte para atributos calculados. Ejemplo store.edit(); FeatureType featureType = store.getDefaultFeatureType(); EditableFeatureType editableFeatureType = featureType.getEditable(); editableFeatureType.add("DENSIDAD_POBLACION", DataTypes.DOUBLE, manager.createExpresion("POBLACION / AREA") ); store.update(editableFeatureType); store.finishEditing(); Código fuente 13
59 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Soporte para atributos calculados. Ejemplo Explicación de ejemplo (Código Fuente 13): 1. Entramos en edición. 1 store.edit(); 2. Accedemos al FeatureType por defecto. 2 FeatureType featureType = store.getDefaultFeatureType(); 3. Accedemos a una copia Editable de la estructura. 3 EditableFeatureType editableFeatureType = featureType.getEditable(); 4. Añadimos el atributo basado en una expresión. 4 editableFeatureType.add("DENSIDAD_POBLACION", 5 DataTypes.DOUBLE, 6 manager.createExpresion("POBLACION / AREA") 7 ); 4. Actualizamos en el almacén. 6 store.update(editableFeatureType); 4. Finalizamos edición guardando los cambios. 7 store.finishEdition();
60 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Soporte para atributos calculados. Ejemplo con atributo personalizado. class XY2Geometry extends AbstractEvaluator { private String xname; private String yname; private GeometryManager geomManager; public XY2Geometry initialize(String xname, String yname) { this.xname = xname; this.yname = yname; geomManager = GeometryLocator.getGeometryManager(); return this; } Continua... Código fuente 14
61 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Soporte para atributos calculados. Ejemplo con atributo personalizado. Continua... public Object evaluate(EvaluatorData data) throws EvaluatorException { Double x = (Double) data.getDataValue(this.xname); Double y = (Double) data.getDataValue(this.yname); Geometry geom; try { geom = geomManager.createPoint(x.doubleValue(), y.doubleValue(), Geometry.SUBTYPES.GEOM2D); } catch (CreateGeometryException e) { throw new EvaluatorException(e); } return geom; } public String getName() { return "XY2Geometry"; } Código fuente 14
62 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Soporte para atributos calculados. Ejemplo con atributo personalizado. store.edit(); FeatureType featureType = store.getDefaultFeatureType(); EditableFeatureType editableFeatureType = featureType.getEditable(); editableFeatureType.add("GEOM", DataTypes.GEOMETRY, new XY2Geometry().initialize("X", "Y") ); store.update(editableFeatureType); store.finishEditing(); Código fuente 15 Para aplicar el atributo que hemos definido, usaremos lo siguiente:
63 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Soporte para atributos calculados. Preguntas ¿?
64 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Pila de comandos de edición. En el modo de edición FULLEDITING hay soporte para deshacer y rehacer las modificaciones que se aplican al almacén. Estas acciones se almacenan en forma de comandos en una pila. La información de esta pila está accesible a través del almacén. Puede que existan acciones en las que no sea posible deshacer.
65 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Soporte para índices. La librería ofrece el API y SPI para el uso e implementación de índices de datos locales. Actualmente hay varias implementaciones de índices para atributos de tipo Geométrico. Las implementaciones de índices pueden ser en memoria, disco.... Las búsquedas y ordenaciones usan los índices de forma automática, si son aplicables, una vez generados. Un almacén puede tener creados uno o varios índices sobre cada una de las estructuras de almacén.
66 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Transformación de un almacén. Transformación es un algoritmo que a partir de un fenómeno de un tipo produce otro fenómeno de otro tipo distinto, sin modificar el original. Se pueden apilar varias transformaciones sobre un almacén. Un almacén transformados es de sólo lectura. Las transformaciones deben implementar el interface FeatureStoreTransform.
67 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Transformación de un almacén. Ejemplo. public class MyTransform extends AbstractFeatureStoreTransform { private String geomName; private String xname; private String yname; private GeometryManager geomManager; public MyTransform() { this.geomManager = GeometryLocator.getGeometryManager(); } public MyTransform initialize(FeatureStore store, String geomName, String xname, String yname) throws DataException { setFeatureStore(store); this.geomName = geomName; this.xname = xname; this.yname = yname; EditableFeatureType type = getFeatureStore().getDefaultFeatureType().getEditable(); Continua... Código fuente 16
68 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Transformación de un almacén. Ejemplo. Continua... type.add(geomName, DataTypes.GEOMETRY); List list = new ArrayList(1); list.add(type.getNotEditableCopy()); setFeatureTypes(list, (FeatureType) list.get(0)); return this; } public void applyTransform(Feature source, EditableFeature target) throws DataException { target.copyFrom(source); Geometry geom; try { geom = geomManager.createPoint( source.getDouble(xname),source.getDouble(yname), Geometry.SUBTYPES.GEOM2D); } catch (CreateGeometryException e) { throw new ReadException("XYTranform", e); } Continua... Código fuente 16
69 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Transformación de un almacén. Ejemplo. Continua... target.setGeometry(this.geomName, geom); } public void saveToState(PersistentState state) throws PersistenceException { state.set("xname", xname); state.set("yname", yname); state.set("geomName", geomName); } public void loadFromState(PersistentState state) throws PersistenceException { this.xname = state.getString("xname"); this.yname = state.getString("yname"); this.geomName = state.getString("geomName"); } Continua... Código fuente 16
70 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Transformación de un almacén. Ejemplo. Continua... public FeatureType getSourceFeatureTypeFrom( FeatureType targetFeatureType) { EditableFeatureType ed = targetFeatureType.getEditable(); ed.remove(this.geomName); return ed.getNotEditableCopy(); } public boolean isTransformsOriginalValues() { return false; } Código fuente 16
71 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Soporte para atributos calculados. Ejemplo con atributo personalizado. FeatureStoreTransform transform = new MyTransform().initialize(store,"geom","x","y"); store.getTransforms().add(transform); Código fuente 17 Para aplicar la transformación anterior, usaremos lo siguiente:
72 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Preguntas ¿?
73 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. Gracias por su atención.
74 gvSIG_des_2.x_d: Curso de desarrolladores de gvSIG Desktop v 2.x DAL desde la perspectiva del cliente de la librería. gvSIG. Geographic Information System of the Valencian Government Copyright (C) 2007-2009 Infrastructures and Transports Department of the Valencian Government (CIT) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.