Download TFM_Daniel Machado Fernández

Document related concepts
no text concepts found
Transcript
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo
UNIVERSIDAD DE OVIEDO
MÁSTER UNIVERSITARIO EN INGENIERÍA WEB
TRABAJO FIN DE MÁSTER
“SISTEMA UNIFICADOR Y CATALOGADOR
DE SERVICIOS WEB DE TEMÁTICA COMÚN”
DANIEL MACHADO FERNÁNDEZ
El tutor autoriza la defensa del Trabajo Fin de Máster
Fdo. D. SECUNDINO JOSÉ GONZÁLEZ PÉREZ...............
Oviedo, JUNIO de 2014
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
1
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo
Agradecimientos
A Cundi, por darme la oportunidad de realizar este trabajo.
Al C1Nn, por su inestimable ayuda cuando la he necesitado.
A Natalia, por haber hecho el camino más fácil.
2
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo
Resumen
Se propone una aplicación web que sea capaz de registrar servicios web de una temática
común con el objetivo de conocer su funcionamiento para poder obtener información de ellos
de forma unificada. Además, el sistema también será capaz de realizar un catálogo que
permita a los usuarios buscar los servicios web registrados mediante un componente buscador
que proporcionará información de los servicios web como pueden ser las operaciones que
contienen, a qué categoría pertenecen y cual es la dirección donde se pueden encontrar esos
servicios web.
Otra de las funcionalidades que ofrece el sistema es la capacidad de utilizar esos
conocimientos para ofrecer un punto de acceso a esa información que está registrada, es
decir, se podrán obtener resultados de diferentes servicios web de forma unificada.
Para conseguir obtener este conocimiento, el sistema lo hace a través de un formulario de
registro disponible en la web, que consultará el fichero WSDL y entre los registros previos y la
aplicación de funciones String Metrics determinará cómo se hace la traducción entre el
modelo de referencia y el del servicio web.
La aplicación está desarrollada con Java Enterprise Edition, además de incluir un buscador de
tipo Apache Solr (Lucene) y una base de datos NoSQL Apache Cassandra.
Otras de las tecnologías utilizadas en el desarrollo han sido Apache Maven, Spring Framework,
Apache CXF y especificaciones como JSR-330 (Inyección de dependencias) y JSR-220 (JPA).
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
3
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo
Palabras Clave
Servicios Web, Interoperabilidad, Becas, Universidades, Java, Apache CXF.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
5
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo
Abstract
The result of this project is a web application that it is capable to register a common topic web
services with the purpose of retrieve information about its structure in a unified form.
Moreover, the system is also capable to compound a catalog that allows users search
information about the registered web services through a search engine component that
provides information about this web services like operations, categories and its WSDL's
address.
The system offers other capabilities like use the knowledge learned in the register process to
build a common access point to the registered web services to mine it in a common way.
To make the previous goal, the system "learns" this information from the register process
available in the web, from the WSDL file specified. With the previous registers and applying
String Metrics functions it determines how to make the translate between the reference
model and the registered web service.
The Application was developed with Java Enterprise Edition, and includes a search engine like
Apache Solr (Lucene) and a NoSQL database like Apache Cassandra.
Other tecnologies that has been used in this development were Apache Maven, Spring
Framework, Apache CXF and JSR-330 (Dependency Injection) and JSR-220 (JPA) specifications.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
7
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo
Keywords
Web Services, Interoperability, Scholarships, Universities, Java, Apache CXF.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
9
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo
Índice General
CAPÍTULO 1.
MEMORIA DEL PROYECTO ...........................................................................................17
1.1
RESUMEN DE LA MOTIVACIÓN, OBJETIVOS Y ALCANCE DEL PROYECTO ..................................................... 17
1.2
RESUMEN DE TODOS LOS ASPECTOS .................................................................................................. 18
1.2.1 Introducción.......................................................................................................................... 18
1.2.2 Referencias Técnicas............................................................................................................. 18
1.2.3 Planificación del Proyecto..................................................................................................... 18
1.2.4 Análisis.................................................................................................................................. 18
1.2.5 Diseño del sistema ................................................................................................................ 18
1.2.6 Implementación del sistema ................................................................................................. 18
1.2.7 Desarrollo de pruebas .......................................................................................................... 18
1.2.8 Manuales del Sistema........................................................................................................... 19
1.2.9 Conclusiones y ampliaciones ................................................................................................ 19
1.2.10
Presupuesto...................................................................................................................... 19
1.2.11
Referencias Bibliográficas ................................................................................................ 19
1.2.12
Apéndices ......................................................................................................................... 19
CAPÍTULO 2.
INTRODUCCIÓN ...........................................................................................................21
2.1
JUSTIFICACIÓN DEL PROYECTO .......................................................................................................... 21
2.2
OBJETIVOS DEL PROYECTO ............................................................................................................... 22
2.3
ESTUDIO DE LA SITUACIÓN ACTUAL ................................................................................................... 23
2.3.1 Evaluación de Alternativas ................................................................................................... 24
CAPÍTULO 3.
REFERENCIAS TÉCNICAS ..............................................................................................29
3.1
JAVA ........................................................................................................................................... 29
3.2
SPRING FRAMEWORK ..................................................................................................................... 30
3.2.1 Spring MVC ........................................................................................................................... 30
3.2.2 Spring Test ............................................................................................................................ 31
3.2.3 Spring Data ........................................................................................................................... 31
3.3
JUNIT .......................................................................................................................................... 32
3.4
APACHE SOLR ............................................................................................................................... 32
3.5
SISTEMAS GESTORES DE BASE DE DATOS NO-SQL ................................................................................ 32
3.5.1 Apache Cassandra ................................................................................................................ 32
3.6
POSTGRESQL ............................................................................................................................... 33
3.7
JPA ............................................................................................................................................ 33
3.8
SERVICIOS WEB ............................................................................................................................. 34
3.8.1 Apache CXF ........................................................................................................................... 34
3.9
BOOTSTRAP .................................................................................................................................. 34
3.10
JQUERY........................................................................................................................................ 34
3.11
STRING METRICS ........................................................................................................................... 35
3.11.1
Chapman matching Soundex / Soundex .......................................................................... 35
3.11.2
Smith-Waterman-Gotoh .................................................................................................. 35
3.11.3
Monge-Elkan .................................................................................................................... 35
3.12
MAVEN ....................................................................................................................................... 36
3.13
SVN ........................................................................................................................................... 36
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
11
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo
CAPÍTULO 4.
PLANIFICACIÓN DEL PROYECTO Y RESUMEN DE PRESUPUESTOS ................................ 37
4.1
PLANIFICACIÓN ..............................................................................................................................37
4.1.1 Contexto ................................................................................................................................37
4.1.2 Personal ................................................................................................................................38
4.1.3 Tareas del proyecto ...............................................................................................................38
4.1.4 Resumen................................................................................................................................44
4.1.5 Ajuste de la planificación ......................................................................................................45
4.2
CONCLUSIONES DE LA PLANIFICACIÓN .................................................................................................49
4.3
RESUMEN DEL PRESUPUESTO............................................................................................................50
CAPÍTULO 5.
ANÁLISIS ..................................................................................................................... 51
5.1
DEFINICIÓN DEL SISTEMA .................................................................................................................51
5.1.1 Determinación del Alcance del Sistema ................................................................................51
5.2
REQUISITOS DEL SISTEMA.................................................................................................................52
5.2.1 Obtención de los Requisitos del Sistema ...............................................................................52
5.2.2 Identificación de Actores del Sistema ...................................................................................54
5.2.3 Especificación de Casos de Uso .............................................................................................55
5.3
IDENTIFICACIÓN DE LOS SUBSISTEMAS EN LA FASE DE ANÁLISIS ................................................................57
5.3.1 Descripción de los Subsistemas .............................................................................................57
5.3.2 Descripción de los Interfaces entre Subsistemas...................................................................58
5.4
DIAGRAMA DE CLASES PRELIMINAR DEL ANÁLISIS .................................................................................59
5.4.1 Diagrama de Clases ..............................................................................................................59
5.4.2 Descripción de las Clases .......................................................................................................59
5.5
ANÁLISIS DE CASOS DE USO Y ESCENARIOS ..........................................................................................63
5.5.1 Registrar universidad ............................................................................................................63
5.6
ANÁLISIS DE INTERFACES DE USUARIO ................................................................................................66
5.6.1 Formulario de registro ..........................................................................................................66
5.6.2 Buscador ...............................................................................................................................67
5.6.3 Detalle de Universidad ..........................................................................................................67
5.6.4 Diagrama de Navegabilidad .................................................................................................68
5.7
ESPECIFICACIÓN DEL PLAN DE PRUEBAS ..............................................................................................69
CAPÍTULO 6.
DISEÑO DEL SISTEMA.................................................................................................. 71
6.1
ARQUITECTURA DEL SISTEMA............................................................................................................71
6.1.1 Diagramas de Paquetes ........................................................................................................71
6.1.2 Diagramas de Componentes .................................................................................................74
6.1.3 Diagramas de Despliegue .....................................................................................................74
6.2
DISEÑO DE CLASES .........................................................................................................................76
6.2.1 Diagrama de Clases ..............................................................................................................76
6.3
DIAGRAMAS DE INTERACCIÓN Y ESTADOS............................................................................................94
6.3.1 Registro de una nueva Universidad ......................................................................................94
6.3.2 Buscador ...............................................................................................................................96
6.3.3 Publicador .............................................................................................................................96
6.4
DIAGRAMAS DE ACTIVIDADES ...........................................................................................................97
6.5
DISEÑO DE LA BASE DE DATOS ..........................................................................................................98
6.5.1 Descripción del SGBD Usado .................................................................................................98
6.5.2 Integración del SGBD en Nuestro Sistema ............................................................................98
6.5.3 Diagrama E-R ........................................................................................................................98
6.6
DISEÑO DE LA INTERFAZ ...................................................................................................................99
6.6.1 Descripción de la Interfaz ......................................................................................................99
12
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
6.6.2 Descripción del Comportamiento de la Interfaz ................................................................. 106
6.7
ESPECIFICACIÓN TÉCNICA DEL PLAN DE PRUEBAS ............................................................................... 107
6.7.1 Pruebas Unitarias ............................................................................................................... 107
6.7.2 Pruebas de Integración y del Sistema ................................................................................. 109
6.7.3 Pruebas de Usabilidad y Accesibilidad ............................................................................... 109
6.7.4 Pruebas de Rendimiento ..................................................................................................... 112
CAPÍTULO 7.
IMPLEMENTACIÓN DEL SISTEMA ..............................................................................113
7.1
ESTÁNDARES Y NORMAS SEGUIDOS ................................................................................................. 113
7.1.1 HMTL 5 ............................................................................................................................... 113
7.1.2 CSS 3 ................................................................................................................................... 113
7.1.3 Java Conventions ................................................................................................................ 113
7.1.4 JPA (JSR-317) ...................................................................................................................... 113
7.1.5 Dependency Injection For Java (JSR-330) ........................................................................... 113
7.1.6 JAX-WS (JSR-224) ................................................................................................................ 113
7.1.7 MVC (Model-View-Controller) ............................................................................................ 114
7.2
LENGUAJES DE PROGRAMACIÓN ..................................................................................................... 115
7.3
HERRAMIENTAS Y PROGRAMAS USADOS PARA EL DESARROLLO............................................................. 116
7.3.1 Spring Tool Suite ................................................................................................................. 116
7.3.2 SVN ..................................................................................................................................... 116
7.3.3 Maven................................................................................................................................. 116
7.3.4 Microsoft Project ................................................................................................................ 116
7.3.5 Microsoft Office .................................................................................................................. 117
7.3.6 Enterprise Architect ............................................................................................................ 117
7.3.7 Windows 7 .......................................................................................................................... 117
7.4
CREACIÓN DEL SISTEMA ................................................................................................................ 118
7.4.1 Problemas Encontrados ...................................................................................................... 118
7.4.2 Descripción Detallada de las Clases.................................................................................... 119
CAPÍTULO 8.
DESARROLLO DE LAS PRUEBAS .................................................................................158
8.1
PRUEBAS UNITARIAS .................................................................................................................... 158
8.2
PRUEBAS DE INTEGRACIÓN Y DEL SISTEMA ........................................................................................ 159
8.3
PRUEBAS DE USABILIDAD Y ACCESIBILIDAD........................................................................................ 160
8.3.1 Pruebas de Usabilidad ........................................................................................................ 160
8.3.2 Pruebas de Accesibilidad (WCAG 2.0) ................................................................................. 163
8.4
PRUEBAS DE RENDIMIENTO ........................................................................................................... 167
CAPÍTULO 9.
MANUALES DEL SISTEMA ..........................................................................................169
9.1
MANUAL DE INSTALACIÓN ............................................................................................................. 169
9.1.1 PostgreSQL ......................................................................................................................... 169
9.1.2 Apache Cassandra .............................................................................................................. 169
9.1.3 Apache Solr ......................................................................................................................... 170
9.1.4 Apache Tomcat 7 ................................................................................................................ 170
9.2
MANUAL DE EJECUCIÓN ................................................................................................................ 171
9.3
MANUAL DE USUARIO .................................................................................................................. 172
9.4
MANUAL DEL PROGRAMADOR........................................................................................................ 173
CAPÍTULO 10.
10.1
10.2
CONCLUSIONES Y AMPLIACIONES .........................................................................175
CONCLUSIONES ........................................................................................................................... 175
AMPLIACIONES ............................................................................................................................ 176
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
13
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo
CAPÍTULO 11.
PRESUPUESTO ...................................................................................................... 177
CAPÍTULO 12.
REFERENCIAS BIBLIOGRÁFICAS ............................................................................. 179
12.1
12.2
LIBROS Y ARTÍCULOS .................................................................................................................... 179
REFERENCIAS EN INTERNET ............................................................................................................ 180
CAPÍTULO 13.
APÉNDICES ........................................................................................................... 183
13.1
GLOSARIO Y DICCIONARIO DE DATOS .............................................................................................. 183
13.2
JUSTIFICACIÓN DEL CAMBIO .......................................................................................................... 186
13.3 ESTADO DEL ARTE DE LA WEB SEMÁNTICA ....................................................................................... 187
13.3.1
Introducción ................................................................................................................... 187
13.3.2
Ontología ....................................................................................................................... 187
13.3.3
Servicios Web Semánticos ............................................................................................. 193
13.3.4
Almacenamiento de ontologías ..................................................................................... 196
13.3.5
Problemas ...................................................................................................................... 199
13.3.6
Arquitectura................................................................................................................... 200
13.3.7
Tecnologías y Herramientas seleccionadas ................................................................... 202
13.3.8
Referencias de interés.................................................................................................... 203
13.4
HOJA DE DECISIONES DEL CAMBIO .................................................................................................. 204
13.4.1
Servicios Web Semánticos ............................................................................................. 204
13.4.2
Servicios Web Unificados ............................................................................................... 205
13.4.3
Tecnológicas .................................................................................................................. 206
13.5
CONTENIDO ENTREGADO EN EL CD-ROM ....................................................................................... 208
13.5.1
Contenidos ..................................................................................................................... 208
13.5.2
Ficheros de Configuración ............................................................................................. 209
13.5.3
Log4j.properties ............................................................................................................. 219
13.5.4
Database.properties ...................................................................................................... 220
13.5.5
Persistence.xml .............................................................................................................. 220
13.5.6
Orm.xml ......................................................................................................................... 220
13.5.7
Beans ............................................................................................................................. 221
13.5.8
Publisher.wsdl ................................................................................................................ 224
13.6
CÓDIGO FUENTE ......................................................................................................................... 226
13.6.1
Define-tramites-servicios-web-unificados-buscador ..................................................... 226
13.6.2
Define-tramites-servicios-web-unificados-modelo ........................................................ 250
13.6.3
Define-tramites-servicios-web-unificados-publisher ..................................................... 277
13.6.4
Define-tramites-servicios-web-unificados-recolector .................................................... 278
13.6.5
Define-tramites-servicios-web-unificados-registrador .................................................. 281
13.6.6
Define-tramites-servicios-web-unificados-service ......................................................... 290
14
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo
Índice de Figuras
Ilustración 1. Alternativa 1 ...................................................................................................................24
Ilustración 2. Alternativa 2 ...................................................................................................................25
Ilustración 3. Alternativa 3 ...................................................................................................................26
Ilustración 4. Alternativa 4 ...................................................................................................................27
Ilustración 5. Referencias Técnicas. Spring ...........................................................................................30
Ilustración 6. Planificación. Diagrama Resumen Proyecto ....................................................................44
Ilustración 7. Planificación. Diagrama de recursos ...............................................................................44
Ilustración 8. Planificación. Coste por Componentes ............................................................................44
Ilustración 9. Resumen de los casos de uso ..........................................................................................55
Ilustración 10. Diagrama de clases previo ............................................................................................59
Ilustración 11. Casos Uso. Registrar una universidad............................................................................63
Ilustración 12. Casos Uso. Obtener información del servicio web ........................................................64
Ilustración 13. Casos Uso. Emparejamiento de campso ........................................................................65
Ilustración 14. Interfaz de Usuario. Formulario de Registro..................................................................66
Ilustración 15. Interfaz de Usuario. Buscador .......................................................................................67
Ilustración 16. Interfaz de Usuario. Detalle Universidad.......................................................................67
Ilustración 17. Diagrama de Navegabilidd ............................................................................................68
Ilustración 18. Arquitectura. Diagrama de Paquetes ............................................................................71
Ilustración 19. Arquitectura. Paquete Modelo .....................................................................................71
Ilustración 20. Arquitectura. Paquete Service ......................................................................................72
Ilustración 21. Arquitectura. Paquete Buscador ...................................................................................72
Ilustración 22. Arquitectura. Paquete Recolector .................................................................................73
Ilustración 23. Arquitectura. Paquete Registrador ...............................................................................73
Ilustración 24. Diagrama Despliegue ....................................................................................................74
Ilustración 25. Diagrama Clases. Controller ..........................................................................................76
Ilustración 26. Diagrama Clases. Search ...............................................................................................77
Ilustración 27. Diagrama Clases. SearchView .......................................................................................77
Ilustración 28. Diagrama Clases. University ..........................................................................................78
Ilustración 29. Diagramas Clases. Diagramas Clases .............................................................................78
Ilustración 30Diagrama Clases. Validator .............................................................................................79
Ilustración 31. Diagrama Clases. View ..................................................................................................80
Ilustración 32. Diagramas Clases. Model ..............................................................................................81
Ilustración 33. Diagramas Clases. NoSQL ..............................................................................................81
Ilustración 34. Diagramas Clases. Persistence ......................................................................................82
Ilustración 35. Diagramas Clases. Class ................................................................................................82
Ilustración 36. Diagramas Clases. Util ...................................................................................................82
Ilustración 37. Diagramas Clases. Wrapper ..........................................................................................83
Ilustración 38. Diagramas Clases. Publisher..........................................................................................83
Ilustración 39. Diagramas Clases. Recolector .......................................................................................84
Ilustración 40. Diagramas Clases. Ws ...................................................................................................84
Ilustración 41. Diagramas Clases. Matcher ...........................................................................................85
Ilustración 42. Diagramas Clases. Presentation ....................................................................................86
Ilustración 43. Diagramas Clases. University ........................................................................................87
Ilustración 44. Diagrama Clases. Ws .....................................................................................................88
Ilustración 45. Diagramas Clases. Builder .............................................................................................89
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
15
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo
Ilustración 46. Diagramas Clases. Business .......................................................................................... 90
Ilustración 47. Diagramas Clases. Exception ........................................................................................ 90
Ilustración 48. Diagramas Clases. Matcher .......................................................................................... 91
Ilustración 49. Diagramas Clases. SearchEngine ................................................................................... 91
Ilustración 50. Diagramas Clases. Solr .................................................................................................. 92
Ilustración 51. Diagramas Clases. University ........................................................................................ 92
Ilustración 52. Diagramas Clases. Ws ................................................................................................... 93
Ilustración 53. Diagrama Secuencia. Registro Universidad 1 ................................................................ 94
Ilustración 54. Diagrama Secuencia. Registro Universidad 2 ................................................................ 94
Ilustración 55. Diagrama Secuencia. Registro Universidad 3 ................................................................ 95
Ilustración 56. Diagrama Secuencia. Registro Universidad 4 ................................................................ 95
Ilustración 57. Diagrama Secuencia. Buscador ..................................................................................... 96
Ilustración 58. Diagrama Secuencia. Publicador ................................................................................... 96
Ilustración 59. Diagrama Actividad. Registro Universidad.................................................................... 97
Ilustración 60. Diagrama E-R ................................................................................................................ 98
Ilustración 61. Interfaz. Página de inicio .............................................................................................. 99
Ilustración 62. Interfaz. Formulario de registro .................................................................................. 100
Ilustración 63. Interfaz. Selección de Operaciones ............................................................................. 101
Ilustración 64. Interfaz. Emparejamiento campos Beca ..................................................................... 101
Ilustración 65. Interfaz. Emparejamiento campos Solicitante ............................................................ 102
Ilustración 66. Interfaz. Formulario guardado .................................................................................... 103
Ilustración 67. Interfaz. Buscador ...................................................................................................... 103
Ilustración 68. Interfaz. Detalle Universidad ...................................................................................... 104
Ilustración 69. Interfaz. Pantalla del recolector ................................................................................. 104
Ilustración 70. Interfaz. Información de la aplicación ......................................................................... 105
Ilustración 71. Interfaz. Mensaje informativo .................................................................................... 106
Ilustración 72. Interfaz. Mensajes de Error ........................................................................................ 106
Ilustración 73. Test. Resultados del procesamiento de Tests ............................................................. 158
Ilustración 74. Pruebas. Cuestionario Usuario 1 ................................................................................. 161
Ilustración 75. Pruebas. Cuestionario Usuario 2................................................................................. 162
Ilustración 76. Pruebas. Cuestionario Responsable Calidad ............................................................... 163
Ilustración 77. Pruebas. Cuestionario Responsable Calidad 2 ............................................................ 163
Ilustración 78. Nivel A Accesibilidad .................................................................................................. 164
Ilustración 79. Nivel AA Acesibilidad.................................................................................................. 165
Ilustración 80. Nivel AAA Acesibilidad ............................................................................................... 166
Ilustración 81. Stack de Tecnologías Semánticas ................................................................................ 188
Ilustración 82. Niveles de OWL .......................................................................................................... 189
Ilustración 83. Niveles de WSML ........................................................................................................ 190
Ilustración 84. Arquitectura Pellet ..................................................................................................... 192
Ilustración 85. Enfoque de WSMO ..................................................................................................... 194
Ilustración 86. Enfoque de OWL-S ...................................................................................................... 194
Ilustración 87. Interacción con WSMX ............................................................................................... 195
Ilustración 88. IBM-SOR ..................................................................................................................... 197
Ilustración 89. Arquitectura SWS ....................................................................................................... 200
Ilustración 90. Arquitectura Apache Jena .......................................................................................... 201
16
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Memoria del Proyecto | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Capítulo 1. Memoria del Proyecto
1.1 Resumen de la Motivación, Objetivos y
Alcance del Proyecto
Debido a la problemática que existe en materia de intercambio de expedientes universitarios,
es común pensar que se le ha de buscar alguna solución. Estando en una sociedad de la
información en la que nos encontramos, que para que una universidad concreta que necesite
un expediente de un alumno o conocer el sistema de becas ofertadas de otra universidad, no
pueda obtenerlas de forma automática si no que bien se tenga que realizar un componente
específico o que la solución sea consultarlas en una página web o mediante correos
electrónicos entre responsables, es una gran pérdida de tiempo.
Se podía diseñar un sistema que sea capaz de facilitar esta tarea y que allanase el camino para
poder explotar la información que pueden obtener las universidades unas de otras bien sea en
forma de mejores programas, facilidades para becas de movilidad, ahorro de tiempo y trabajo
de operarios y en recursos.
A colación de estos hechos, este proyecto busca hacer esta tarea de la interoperabilidad entre
universidades algo menos árida, pues se propone que cada universidad mediante un registro
en un formulario deje constancia de cómo son sus servicios web y de esta forma el sistema
pueda conseguir traducir sus servicios web a un formato común para que la información que
se comparta entre universidades sea transparente provenga del punto del que provenga.
Por otro lado, también se ofrecerá la posibilidad de consumir esta información de las
universidades mediante un único punto de acceso a través de un servicio web parametrizable
para obtener los resultados que el usuario desee más convenientes. Este punto de acceso se
abastecerá de los registros que se realicen en el punto anteriomente explicado pues conocerá
cómo realizar las traducciones entre universidad y sistema.
Este proyecto también ha de servir para generar un catálogo de servicios web a nivel nacional
pues contendrá un buscador que realizará las tareas de biblioteca donde consultar los servicios
web que están registrados, qué operaciones tienen y en qué dirección se pueden encontrar.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
17
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Memoria del Proyecto
1.2 Resumen de Todos los Aspectos
1.2.1
Introducción
En este apartado de la documentación, se irá guiando al lector a través de los puntos más
básicos del proyecto como por ejemplo pueden ser la motivación, los objetivos que se buscan,
la situación actual…
1.2.2
Referencias Técnicas
Rincón técnico donde se explicarán los términos y tecnologías que se han utilizado a la hora de
elaborar el proyecto.
1.2.3
Planificación del Proyecto
Apoyándose en un diagrama de Gantt, se replicará el calendario que se siguió en la ejecución
del proyecto, dando así una estimación en caso de querer reproducir el mismo.
1.2.4
Análisis
Se desentrañará parte del trabajo previo a la ejecución del proyecto. Requisitos del sistema,
casos de uso, alcance del proyecto, pruebas, etc.
1.2.5
Diseño del sistema
Aquí se plasma la mayor parte del trabajo de ejecución del proyecto. Diagramas de clases, de
interacción, más pruebas de rendimiento, unitarias, etc.
1.2.6
Implementación del sistema
Se describirán las tecnologías utilizadas, las normas seguidas y las herramientas utilizadas para
la implementación.
1.2.7
Desarrollo de pruebas
Como se ha venido diciendo en los capítulos anteriores, aquí se detallarán las pruebas que se
han realizado y los resultados.
18
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Memoria del Proyecto | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
1.2.8
Manuales del Sistema
Aquí se facilitarán una serie de manuales que se espera puedan ayudar a los futuros
programadores, usuarios y administradores a utilizar el proyecto facilitando.
1.2.9
Conclusiones y ampliaciones
Este es un buen sitio para plasmar las posibles ampliaciones del proyecto que se podrían
realizar, además de reseñar las impresiones que se han tenido en la consecución del proyecto.
1.2.10
Presupuesto
Estimación monetaria del montante que supondría realizar el proyecto para una
empresa/usuario que deseara replicar el proyecto. Se facilita el presupuesto general y el
detallado.
1.2.11
Referencias Bibliográficas
Referencias que se han consultado para la obtención de conocimientos que no se tenían a la
hora de realizar el proyecto.
1.2.12
Apéndices
Se detallarán anexos que se han considerado oportunos para la comprensión más profunda del
proyecto. Se especificará la información facilitada en el CD-ROM que acompaña a esta
documentación.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
19
Introducción | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
Capítulo 2. Introducción
2.1 Justificación del Proyecto
Hoy en día uno de los grandes problemas que las entidades o empresas manejan es la
organización de información. Organizar la información que poseen o con la que trabajan es
una tarea compleja, pero si además esa información se ha de compartir con otras empresas
del mismo ámbito, la tarea se vuelve mucho más complicada. Actualmente el canal por el que
se comparte esa información entre las diferentes empresas si se tiene en cuenta que están
informatizadas y actualizadas, será Internet y el medio común más utilizado será exponer una
serie de servicios web que ofrecerán esa información que quieren compartir bajo unos
criterios concretos.
Como se puede deducir, cada empresa o entidad tendrá sus propios servicios web publicados,
teniendo cada uno una finalidad concreta. Por ejemplo, se puede comprender que un hospital
concreto pueda “difundir” los expedientes clínicos de sus “clientes” entre otros hospitales bajo
demanda. Si una persona de Oviedo va al médico por una urgencia en Valencia, el médico que
le trate en Valencia deberá conocer sus datos, con lo que si el hospital de Oviedo tiene su
repositorio de información particular y el de Valencia el suyo (que sería lo más común para
focalizar y no ralentizar los sistemas), tendrán que transmitir esa información de algún modo.
Parece bastante sencillo pensar que no existe problema en este caso, pues si los servicios
informáticos del hospital de Oviedo tienen un servicio web con el que puedan obtener el
expediente clínico del paciente desde Valencia el problema está resuelto. ¿Y qué ocurre con la
forma? Para que desde Valencia sepan que 66 son los kilogramos que pesa el paciente y no la
edad hay que darle sentido a los datos que se reciben y ese sentido entre dos sistemas que se
comunican de forma automática es complicado tenerlo, a lo mejor no entre dos, pero hay que
darse cuenta que hospitales existen muchos. ¿Cómo se podría solucionar esto? La forma más
sencilla sería que cada hospital adaptara sus servicios web a un estándar común que un
organismo regulador debería de definir, pero a falta de esta entidad/sistema, no queda más
remedio que utilizar un sistema que intente adivinar que esos 66 finalmente sean los
kilogramos y no la edad.
Este trabajo se centrará en el ámbito universitario, concretamente en la compartición de
catálogo de becas entre universidades, aunque el caso que se ha expuesto haya sido el de un
hospital para que sea más fácil entender el problema al que se enfrenta el trabajo y lo
extensible que pueda ser.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
21
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Introducción
2.2 Objetivos del Proyecto
La finalidad por la que se realiza este proyecto es facilitar la comunicación y el traspaso de
información de ámbito similar entre dos entidades que anteriormente bien por
desconocimiento de que podrían compartir información o bien por falta de entendimiento
entre las partes no podían realizarlo.
Además también permitirá llevar acabo un catálogo de los servicios que estén registrados, a
modo de repositorio desde el cual se podrá obtener información de todos los servicios.
Este catálogo también será indexado y será posible acceder a su contenido mediante
búsquedas para su fácil acceso.
Para que estos servicios estén disponibles, se pondrá a disposición de los usuarios un
formulario de registro semi-inteligente que será capaz de adivinar las similitudes entre el
sistema base o de referencia y el que se está registrando.
Los servicios del catálogo, serán capaces de ser llamados de forma conjunta, para recibir la
información de forma homogénea, siendo independiente la entidad que los sirva.
22
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Introducción | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
2.3 Estudio de la Situación Actual
La Ley 11/2007 LAECSP “Ley de Acceso Electrónico de los Ciudadanos a los Servicios Públicos”
fue una ley en la que se obligaba a las Administraciones Públicas a ofrecer sus servicios a los
ciudadanos por medios telemáticos. Por razones obvias, como la recesión económica y la crisis
económica por la que estamos atravesando, esta Ley, de obligado cumplimiento a 1 de enero
de 2010, se relajó y las administraciones fueron adaptándose en función a sus posibilidades.
La tramitación electrónica trajo consigo la necesidad de modificar los procedimientos
administrativos a los que estábamos acostumbrados, la mayoría de los cuales se tramitaban en
papel y a través de una ventanilla, en la que muchas veces teníamos que hacer largas colas
para la tramitación de ciertos servicios, e incluso, presentar información redundante, por
ejemplo, fotocopia del DNI, estar al corriente de nuestros pagos, certificado del padrón, etc.
En muchos de estos casos se ofreció la posibilidad de simplificar el procedimiento, evitando
que el ciudadano tuviese que presentar información que, de alguna forma, ya estuviese en
poder de la propia administración u organismos públicos. Aquí nace un nuevo término de
Interoperabilidad administrativa, se hace necesaria la comunicación entre los distintos
organismos para el intercambio de información, evitando que el ciudadano presente
información redundante, sólo se le solicitará autorización para realizar dicha consulta desde el
organismo correspondiente en cada momento. Esto trae consigo la creación y aprobación del
ENS y del ENI, RD 3 y 4 de 2010 en la que se establecen las normas técnicas de seguridad y de
interoperabilidad, respectivamente, de la información. Los ESQUEMAS NACIONALES son
normativas muy avanzadas y exigentes cuyo fin es crear condiciones objetivas de
interoperabilidad y de seguridad que faciliten el ejercicio de derechos y el cumplimiento de
deberes a través de los medios electrónicos.
El ENI se define en el apartado 1 del artículo 42 de la Ley 11/2007, “… el conjunto de criterios y
recomendaciones en materia de seguridad, conservación y normalización de la información, de
los formatos y de las aplicaciones que deben ser tenidos en cuenta por las Administraciones
Públicas para la toma de decisiones tecnológicas que garanticen la interoperabilidad”.
Además, las Normas Técnicas de Interoperabilidad desarrollan aspectos concretos de diversas
cuestiones necesarios para asegurar los aspectos más prácticos y operativos de la
interoperabilidad entre las Administraciones Públicas y el ciudadano. La relación de normas
incluye los estándares del documento electrónico, del expediente electrónico, digitalización de
documentos, política de firma electrónica y de certificados de la Administración e, incluso, el
tratamiento de ficheros de intercambio de información, que no son más que la definición
estándar de una estructura de ficheros XML. Todo esto no es suficiente para el intercambio de
información entre organismos, por ejemplo, las Universidades que quieren intercambiar un
expediente académico de un alumno en el que éste desea cambiar de una Universidad a otra,
en la actualidad, se tiene que hacer con el expediente en formato papel. Se pretende que el
cambio se realice de forma electrónica, para ello es necesario crear estructuras comunes de
información y, a través de una capa de servicios, se puede intercambiar la información de
forma que las universidades sigan con el mismo sistema de información, pero que puedan
interactuar con una capa de servicios para intercambiarse el expediente académico. Dicha
capa de servicios debe contener una cierta inteligencia o semántica para la interpretación del
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
23
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Introducción
modelo de datos de un expediente e, incluso, para la interpretación de la información del
expediente.
La solución planteada debería ser válida para otros sectores y otras funcionalidades, por
ejemplo, el Ministerio de Educación quiere obtener los expedientes o notas medias de todos
los alumnos becados, y que lo dicho se pueda llevar a cabo.
2.3.1
Evaluación de Alternativas
Debido a la propia idiosincrasia de los servicios web, el punto conflictivo no está en conseguir
recopilar todos estos servicios, que también, pero sobretodo, lo árido del asunto es cómo se
consigue normalizar toda la información que presenta cada uno de los servicios web ya que al
estar construidos de forma independiente unos de otros, se deberá de depender de un
organismo regulador que proponga un estándar o norma por el cual se tendrán que regir estos
servicios web, o al menos, los datos que ofrecen.
2.3.1.1 Introducción de XSD comunes
Una vez existe la necesidad de tener que cambiar el modelo, la primera opción y más compleja
de llevar a cabo es modificar los servicios web existentes y que sea cada una de las
universidades la responsable de llevar a cabo esta modificación de sus servicios, que teniendo
en cuenta cómo está actualmente la situación, no es probable que suceda este cambio de
modelo por parte de cada una de ellas.
Ilustración 1. Alternativa 1
24
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Introducción | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
2.3.1.2 Web semántica
En lugar de que cada universidad redefina otra vez sus servicios web, se podría optar por
externalizar este proceso de traducción de cada uno de los modelos, aprovechando las
bondades que proporciona una tecnología tan novedosa como puede ser la web semántica. De
esta forma el objetivo estaría en conseguir mediante consultas sobre una ontología en SPARQL
las conexiones entre un campo del servicio web de una universidad concreta y el del nuevo
modelo genérico. Una vez los datos estén convertidos en el modelo genérico, se volverían a
publicar unos nuevos servicios web con la información transformada pero recogiendo la
información solicitada.
El mayor inconveniente de esta solución es que la ontología adecuada para realizar la
traducción que resultaría, sería excesivamente degenerada en el sentido de que solamente
estaría compuesta por clases aprovechando el sistema de herencia y aun así, no daría soporte
completo a todos los campos y probabilidades que podrían encontrarse.
Ilustración 2. Alternativa 2
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
25
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Introducción
2.3.1.3 Repositorios de información y XSD común
Esta última alternativa sería una revisión de la anterior, mejorándola en el sentido de que se
sustituiría una ontología que proporciona conocimiento semántico, por una base de datos que
en principio será NoSQL, acompañada de Lucene que nos permitirá por un lado tener un
almacén de términos con sus correspondientes traducciones y un índice que permitirá
enriquecer léxicamente las búsquedas y traducciones. Ésta es la alternativa que sobre el papel
parece más factible de realizarse. Si se tiene en cuenta que la Alternativa 1 es inviable por el
costo de trabajo de cada universidad y que la Alternativa 2 sugiere el uso de una tecnología de
forma inadecuada, lo más adecuado a parte de porque técnicamente es una solución buena
parece que sí da con el perfil que se busca.
Ilustración 3. Alternativa 3
26
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Introducción | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
2.3.1.4 Modelo mapeado
Debido a que Lucene no proporcionaba lo que se creía en un principio, se intentó utilizar esta
biblioteca para realizar el matching de campos entre los modelos de la universidad concreta y
el modelo genérico pero se descartó debido a que está orientado a la indexación de archivos.
Finalmente se decidió cambiar el modelo anterior y remozarlo para obtener la versión final
que se terminará implantando.
Se utilizará un modelo mapeado que consiste en generar un repositorio de conocimiento con
los emparejamientos que se vayan haciendo y de esta forma los siguientes emparejamientos
pueden ir siendo predichos en función del tamaño del repositorio. Además para apoyar la
teoría anterior se utilizarán una serie de funciones matemáticas catalogadas como String
Metrics que proporcionan mediciones sobre cuánto se parecen dos cadenas de texto (no
semánticamente, pero sí léxicamente), con lo que entre las dos soluciones se puede llevar a
cabo un mapeo casi automático de los servicios web.
Este mapeo se realizará durante el registro y a partir de la información que se obtenga a partir
del fichero WSDL que define los servicios web. Toda la información se hará mediante una
instanciación dinámica de los métodos de los servicios web y se hará uso también de la
introspección del lenguaje.
Ilustración 4. Alternativa 4
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
27
Referencias técnicas | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
Capítulo 3. Referencias técnicas
3.1 Java
Java es un lenguaje de programación orientado a objetos de propósito general, que hizo su
aparición en 1995 y fue escrito por James Gosling y la empresa Sun Microsystems (ahora
adquirida por Oracle). Lo que le diferencia del resto de lenguajes es que debido a que para
ejecutar sus programas hace falta una máquina virtual que los hospede, una vez se realiza la
compilación de un programa a bytecodes, se puede ejecutar en cualquier máquina virtual de
Java.
En sus inicios, la mayor cuota de mercado que manejaba este lenguaje eran sistemas que
albergaban microcontroladores como pueden ser lavadoras, neveras, etc. Aunque ahora como
más éxito ha conseguido es como lenguaje para aplicaciones empresariales (anteriormente
conocido como J2EE, ahora JEE) y por ser el lenguaje utilizado a la hora de desarrollar
aplicaciones para sistemas Android.
Gran parte de su éxito es debido a que es multiplataforma y muy fácil de usar para las
personas que no son todavía muy expertas en el desarrollo de programas pues la curva de
aprendizaje es bastante liviana y al estar ejecutado dentro de la Máquina Virtual de Java, no es
posible realizar acciones dañinas sobre el computador que las ejecuta, como podría serlo por
ejemplo el lenguaje C en sus inicios.
Al no llevar esta gestión de la memoria y referencias de objetos es un lenguaje más pesado y
menos potente comparándolo con lenguajes como C++ pues el sistema recolector de basura,
es el encargado dentro del ámbito Java de liberar las referencias que ya no se utilicen dentro
del programa cada una cantidad determinada de minutos para liberar memoria.
En este proyecto, se utilizará Java 7 a pesar de que ya ha salido la octava versión del lenguaje
que intenta acercarse un poco más a ciertos lenguajes dinámicos pues comienza a incluir
funciones lambda.
El mayor punto fuerte de Java es que tiene un ecosistema que permite realizar aplicaciones
web de forma muy sencilla mediante el uso de diversos frameworks web.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
29
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Referencias técnicas
3.2 Spring Framework
Es un framework de acogida mundial cuyo fin es la Inyección de Dependencias o Inversión de
Control (Inversion of Control, IoC) además de incluir soporte para la programación orientada a
aspectos que tan de moda está últimamente. Para la implementación del IoC Spring lo hace
mediante un contenedor. Por otra parte, Spring también posee una serie de bibliotecas que
proporcionan funcionalidad en varios ámbitos de la programación como pueden ser
frameworks web (Spring MVC), para la gestión de la persistencia (Spring JDBC, Spring Data),
para la gestión de transacciónes (no sólo de persistencia, a nivel de negocio también con
Spring TX), para la generación de procesos batch (Spring Batch) y muchos más.
Ilustración 5. Referencias Técnicas. Spring
3.2.1
Spring MVC
Es un framework que permite la realización de aplicaciones bajo el patrón MVC. Para ello,
mediante un Servlet definido en el archivo web.xml que denominan DispatcherServlet que
realiza funciones de front controller (de igual forma que lo hace Struts), lo que hace es filtrar
todas las peticiones HTTP y las distribuye por las diferentes clases anotadas con @Controller
que tienen mapeada una dirección. Este controlador, a su vez, pasará el control a la vista
correspondiente (generalmente, una página JSP) donde se renderizará el resultado de las
operaciones de negocio necesarias en función de cada petición. Para ejecutar lógica en la
presentación, Spring MVC proporciona una serie de etiquetas para la gestión de los
formularios ya que permiten orientarlos a modelos de la aplicación y así inyectar los campos
directamente en atributos de las clases, a parte de las tradicionales JSTL. Como es de esperar,
también tiene soporte para la internacionalización y localización de la página mediante
ficheros properties, interceptores para filtrar peticiones, control de errores mediante la
captura de excepciones, resolvedor de recursos de la vista para filtrar qué se hace público y
qué no mediante rutas…
30
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Referencias técnicas | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
3.2.2
Spring Test
Spring Test es una herramienta de utilidad que se utiliza para poder ejecutar pruebas unitarias
en entornos Spring. Es especialmente necesario utilizar esta herramienta, debido a que será la
proveedora del contexto Spring para que funcione la inyección de dependencias en la
aplicación. Además también es útil, porque permitirá poder ejecutar contextos diferentes a la
hora de realizar tanto las pruebas como la ejecución real de la aplicación: tener diferentes
configuraciones de las bases de datos, diferentes unidades de persistencia, carga de diferentes
módulos (baterías de mock, por ejemplo).
3.2.3
Spring Data
Gracias a Spring Data es relativamente sencillo interactuar con las fuentes de datos que se
encargan de la persistencia en un proyecto, siendo posible utilizar Spring Data con JPA, JDBC,
Solr, Redis, Hadoop, etc.
Esta fácil interacción, es debido a que en la versión de JPA, proporciona de forma transparente
las operaciones CRUD para un modelo (mediante templates) además de generar búsquedas
sencillas de forma automática mediante un interface con lo que no es necesario
implementarlas, sólo definirlas y extender de CRUDRepository. En el caso de Solr, permite
gestionar la generación de índices de forma sencilla y similar a como se hace con Spring Data
JPA. Para la gestión de los recursos con las bases de datos y el buscador se define
3.2.3.1 Spring Data JPA
Permite llevar la gestión completa del ORM de Java de forma casi transparente, tan solo basta
con implementar unas interfaces que incluye. Permite la realización de consultas básicas de
forma transparente para el usuario, además de añadir la posibilidad de realizar las consultas en
lenguaje JPQL. Realiza la gestión de las transacciones y además también permite incluir las
anotaciones JPA para la elaboración del modelo relacional en las bases de datos.
3.2.3.2 Spring Data Solr
Al igual que en el caso anterior, este componente simplifica enormemente la integración de
Apache Solr con una aplicación web. Si ya puede ser complejo integrar un buscador de
contenidos dentro de una aplicación con todo lo que ello conlleva, el realizar las consultas
sobre los índices de Solr es tan sencillo como implementar una serie de interfaces de la
biblioteca según nos convengan unos tipos de búsqueda u otros.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
31
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Referencias técnicas
3.3 JUnit
Framework por excelencia en entornos Java para la realización de pruebas unitarias. Una gran
integración como plugin con el IDE Eclipse y la capacidad de su utilización mediante
anotaciones en las clases que serán detectadas como pruebas hacen de su uso algo muy
sencillo.
3.4 Apache Solr
Es un motor de búsqueda web referencia basado en la plataforma Apache Lucene y que está
apoyado en la Apache Software Foundation. Proporciona funciones de búsqueda de texto
completo y parcial mediante la generación de índices de contenido asociado a un término. Al
estar desplegado sobre un servidor web que incluye el producto, es posible visualizar y
monitorizar cómo se está gestionando en todo momento el propio motor, siendo posible ver
los recursos que se están consumiendo de la máquina host, realizar consultas sobre las
colecciones generadas, etc.
Por otro lado, la configuración de este motor se realiza mediante ficheros de tipo XML donde
se definen las estructuras de datos necesarias para la generación de los índices y del contenido
que se almacenará bajo esos índices.
3.5 Sistemas Gestores de Base de datos No-SQL
Las bases de datos No-SQL son una evolución de las bases de datos tradicionales (relacionales,
en red, etc) en las que predomina más la información que se va a guardar en ellas que la
estructura que deben seguir, aunque esto no quiere decir que no puedan seguir un esquema
predeterminado.
3.5.1
Apache Cassandra
Es un sistema gestor de base de datos distribuida de tipo NoSQL adoptado por la Apache
Software Foundation de código abierto y que originalmente fue desarrollada por Facebook
para ser el motor de búsqueda de su Inbox.
El modelo interno de almacenamiento que utiliza es una BigTable (Sistema de almacenamiento
propietario y comprimido de Google) sobre una infraestructura similar a la de Amazon
Dynamo.
La clasificación genérica de este producto es concretamente, una NoSQL de tipo Clave-Valor,
con lo que se pueden almacenar bajo una clave, una serie de campos o tablas, así que en este
sentido tiene un cierto “parecido” con CouchDB (orientada a documentos) en lugar de con
Redis que es una Clave-Valor pura.
32
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Referencias técnicas | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
Las características más destacables podrían ser que es descentralizada, y por consiguiente no
tiene nodos críticos con los que poner en riesgo el sistema (cuando se utilice de forma
distribuida), también tolerante a fallos pues tiene replicación automática a través de diversos
nodos para mantener la consistencia y gestiona la consistencia para evitar problemas de
lectura/escritura a lo largo de los nodos distribuidos.
Para la realización de consultas, este producto tiene un lenguaje propio llamado CQL
(Cassandra Query Language) que es un lenguaje de consultas de tipo SQL aunque
generalmente se utilicen interfaces que solucionan el trabajo más “áspero” de interacción con
la solución como pueden ser Hector o Firebrand para emular un ORM.
3.6 PostgreSQL
Sistema gestor de bases de datos (generalmente SGBD o DBMS en inglés) de tipo relacional
con lo que basa su almacenamiento en un sistema de tablas o registros de la propia empresa
PostgreSQL Global Development Group, distribuido sobre una licencia de tipo MIT y que es
libre, de código abierto y que cumple con las características ACID (Atomicity, Consistency,
Isolation and Durability) para la gestión de operaciones transaccionales. Como es habitual en
este software, el lenguaje de consultas es SQL, concretamente la versión 2008 además de
soportar conexiones por ODBC y la posibilidad de aplicar una capa gráfica para la gestión de la
base de datos como puede ser pgAdmin. PostgreSQL es junto con MySQL el software líder en
SGBDs relacionales.
3.7 JPA
Es la referencia de Java para la Persistencia (JSR-303). Por sí sola define las operaciones y el
sistema que hay que seguir para utilizar Object Relational Models en las aplicaciones Java.
Es un avance importante respecto al uso más convencional de las consultas y las bases de
datos relacionales pues agrega una capa entre la base de datos y la aplicación donde se
mapean las clases de la aplicación y se traducen al modelo relacional. De esta forma, siempre
se están utilizando objetos de la aplicación y se separa la responsabilidad de usar registros que
eran más comunes en épocas de lenguajes procedimentales como C y se pasan a utilizar
objetos mapeados donde además es posible controlar y gestionar el ciclo de vida del objeto en
todo momento.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
33
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Referencias técnicas
3.8 Servicios Web
Es una nueva forma de transmisión de información entre aplicaciones, que tiene como base la
compartición de información entre dos puntos mediante la red bajo el protocolo SOAP. Esta
información, habitualmente es presentada en forma de exposición de métodos de clases y que
se pueden invocar de forma remota, como si fueran métodos de la propia clase, de forma
transparente.
Estos servicios web, generalmente vienen descritos en un lenguaje denominado WSDL (Web
Service Description Language) y en un archivo de mismo nombre, donde se puede identificar
como un contrato, pues se definirán los tipos de los parámetros, los nombres de los métodos
(que se utilizarán en el extremo como una interfaz) y el tipo del retorno además de la
definición de las clases que intervienen en el proceso.
3.8.1
Apache CXF
Framework para Servicios Web, bajo la especificación de Java para Servicios Web (JAX-WS –
JSR 311) facilita la creación de servicios web mediante anotaciones y el consumo de los
mismos a partir de su archivo WSDL.
Su inclusión en el proyecto frente a otros como por ejemplo Axis es la capacidad de realizar
instanciaciones de forma dinámica de servicios web sin necesidad de crear el stack de clases
necesario (clases originales y sus response, por ejemplo).
3.9 Bootstrap
Framework web que facilita el diseño responsivo en las páginas web. Su implementación se
basa fundamentalmente en JavaScript y en CSS y su funcionamiento es tan simple como
ajustar un diseño web original a los diferentes cambios de pantalla que puedan ser factibles de
realizarse sobre diferentes tipos de navegadores como por ejemplo móviles, tablets, tamaños
de pantalla poco comunes, etc.
3.10 jQuery
Framework JavaScript que permite trabajar de forma más eficiente y rápida sobre el árbol
DOM que se construye a partir del documento HTML. Facilita la forma de trabajar y de mutar
el árbol añadiendo además componentes AJAX para mejorar la experiencia de usuario.
34
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Referencias técnicas | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
3.11 String Metrics
Son una serie de funciones matemáticas que cuantifican cuánto se parecen dos cadenas de
texto entre sí.
3.11.1
Chapman matching Soundex / Soundex
Soundex es un algoritmo que mide cuanto se parecen dos palabras fonéticamente. Si bien la
implementación original y el algoritmo original están centradas en el Inglés, las pruebas
realizadas han demostrado que puede ser válido en habla hispana para los propósitos del
proyecto.
3.11.2
Smith-Waterman-Gotoh
Es una métrica para realizar alineamiento local de secuencias biológicas (ADN, ARN, proteínas)
es decir, busca similitudes entre pares de secuencias.
Se basa en la utilización de algoritmos de programación dinámica, de tal forma que tiene la
propiedad de garantizar el alineamiento entre dos cadenas respecto a una puntuación que es
obtenida de matrices de sustitución. Debido a esto último es fácil encontrar similitudes con la
famosa distancia Levenshtein de sustitución.
3.11.3
Monge-Elkan
Al contario de lo que se piensa, no es una implementación de Smith-Waterman, es una
revisión de Smith-Waterman Gotoh, este enfoque realiza otra serie de pruebas teniendo en
cuenta la similaridad semántica de un número de campos o subcampos. Cada subcampo es
evaluado contra el subcampo en la cadena de comparación usando la distancia Gotoh entre los
campos y esto se combina después con un algoritmo de matching.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
35
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Referencias técnicas
3.12 Maven
Es una herramienta de despliegue automático de aplicaciones Java. Se puede ver como una
remodelación del antiguo Apache Ant, que fue tan exitoso en la generación de ficheros WAR
para su posible despliegue en entornos JEE. La mayor mejora que supone Maven es que se
encarga de la gestión de las dependencias en forma de bibliotecas que puedan tener los
proyectos, él las instala de forma automática, además de tener un amplio abanico de plantillas
para crear proyectos sin comenzar de cero. Para la gestión de las bibliotecas, éstas han de ser
incluidas en forma de dependencias dentro de un fichero XML denominado pom.xml que
además permitirá la gestión completa del proyecto, con qué plugins compilar, metadatos del
proyecto, gestión del empaquetamiento, etc. Ligada a esta nueva filosofía de las
dependencias, también acoge la nueva tendencia del multiproyecto por la cual se aconseja
tener un proyecto por cada capa (Tier) de la aplicación. Por último, otro de sus grandes
ventajas es su perfecta integración como plugin de Eclipse para la gestión de los proyectos.
3.13 SVN
Apache Subversion es un controlador de versionado que permite sincronizar archivos contra
un servidor para llevar un control de los cambios que se van haciendo en un proyecto y
permitir de esta forma la separación del proyecto en etapas. En caso de fallos, es posible poder
volver a versiones antiguas del proyecto, por ejemplo sin necesidad de realizar copias del
propio proyecto a mano.
36
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Planificación del Proyecto y Resumen de Presupuestos | Plataforma para Interoperabilidad de
sistemas de información dentro de un mismo ámbito organizativo
Capítulo 4. Planificación
Proyecto
y
Resumen
Presupuestos
del
de
4.1 Planificación
Para realizar una planificación más “real”, se ha optado por describir una organización ideal en
lugar de utilizar el trabajo de una sola persona para llevarla a cabo.
4.1.1
Contexto
La empresa que llevará a cabo el proyecto será una empresa típica del sector TIC asturiano de
en torno a 80-100 empleados. En ella habrá diferentes perfiles profesionales desde el punto de
vista jerárquico, en la cumbre de la pirámide estarían los Socios capitalistas que serán los
propios dueños de la empresa. Debajo de ellos, gestionando las áreas desde dentro de la
empresa estarán los Gerentes, que serán los encargados de realizar propuestas, buscar
clientes… Para gestionar los proyectos conseguidos por los Gerentes, estarán los Jefes de
Proyecto que se encargarán de planificar y coordinar los proyectos que tengan asignados. Para
ayudar en la gestión a los Jefes de Proyecto, nos encontramos con los Analistas que serán los
encargados de realizar trabajos de análisis. Tanto los Jefes de Proyecto como los Analistas no
trabajan solamente para un proyecto, si no que se van rotando en diferentes proyectos según
se necesitan de sus prestaciones. En el fondo de la pirámide, nos encontraríamos a los
Programadores, Administradores de Sistemas, Diseñadores y Testers que serán los que
llevarán el mayor peso del proyecto. Tanto los testers como los Administradores de Sistemas y
Diseñadores estarán rotando entre proyectos según se les requiera.
Verticalmente trabajará un equipo de calidad, que estará pendiente de que se cumplan los
procedimientos en todos los proyectos de la empresa.
Departamentalmente, la empresa estará dividida en una consultoría, una sección de
Investigación+Desarrollo+Innovación, calidad y sistemas.
Los perfiles técnicos de los programadores tendrán que ser grandes conocedores de la
tecnología Java, haber trabajado con JPA, Spring y al menos conocer el funcionamiento de un
buscador. También sería conveniente que hubiesen trabajado con Servicios Web.
Los recursos de los que dispone la empresa, son un edificio propio construido hace 5 años,
secretaria en el hall del edificio, personal de contabilidad y de recursos humanos, cada persona
de la organización cuenta con su puesto de trabajo compuesto de mesa, silla, ordenador y una
impresora para compartir cada 10. Además también se dispone de una granja de servidores
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
37
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Planificación del Proyecto y Resumen de Presupuestos
para permitir dar hosting a los clientes que lo necesiten además de permitir compartir recursos
entre empleados como por ejemplo software, repositorios de código o guías de estilo.
Como gastos fijos de la empresa podríamos incluir seguros del edificio, de la propia empresa,
de los empleados, luz, agua, calefacción, mantenimiento de los equipos, consumibles como
tóner, CDs, papel, internet, teléfono, sueldos de empleados, intereses de préstamos bancarios,
dietas…
El horario de la empresa, de 9:00 a 19:00 con una hora para comer y un descanso a media
mañana de treinta minutos. Con un horario de jornada reducida en verano, que será de 8:00 a
15:00 aunque no afectaría al proyecto.
4.1.2
Personal
Puesto
Cantidad
1
Jefe de Proyecto
2
Analista
4
Programador
1
Administrador de Sistemas
1
Diseñador
1
Tester
Tabla 1. Planificación. Personal de la empresa
Puesto
Servidor
Portátil
4.1.3
Cantidad
1
10
Tabla 2. Planificación. Otros recursos
Tareas del proyecto
Para una mejor comprensión de las tareas se aconseja mirar la documentación adjunta en los
archivos de Microsoft Project.
4.1.3.1 Previo
Para comenzar el proyecto, lo primero que se ha tenido que realizar ha sido la
cumplimentación de diversa documentación y análisis del proyecto para tener una visión más
concreta de lo que se iba a desarrollar, estudiar alternativas factibles de desarrollarse, realizar
los diagramas de clases y componentes del proyecto, selección de tecnologías… en definitiva
una serie de preparativos para poder arrancar el proyecto con las consiguientes puestas a
punto de equipos y entornos.
38
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Planificación del Proyecto y Resumen de Presupuestos | Plataforma para Interoperabilidad de
sistemas de información dentro de un mismo ámbito organizativo
Duración final del Sprint 18 días.
Nombre de tarea
Duración
Previo
18,13 días
Análisis
12 días
Cubrimiento del "pliego" (Anteproyecto)
3 días
Entrega del "pliego"
1 día
Estudio de alternativas
3 días
Casos de Uso
2 días
Diagrama de Clases
2 días
Diagrama de Interacción
2 días
Modelado de datos
3 días
Selección de tecnologías
1 día
Diagrama de componentes
1 día
Diseño
2 días
Diseño de la arquitectura
2 días
Implementación
2,13 días
Preparación del servidor Tomcat
3 horas
Preparación de la Base de Datos PostgreSQL
3 horas
Preparación de la Base de Datos Cassandra
2 horas
Preparación del Entorno de Desarrollo STS
2 horas
Preparación de Solr
1 día
Configuración del SVN
5 horas
Configuración de Maven
4 horas
Test
1 día
Test de software
1 día
Test de servidores
1 día
Test de base de datos
1 día
Entrega de propuesta y documentación
1 día
Tabla 3. Planificación. Listado de Tareas Previo
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
39
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Planificación del Proyecto y Resumen de Presupuestos
4.1.3.2 Componente Registrador
Comienza la implantación de los componentes propiamente dicha, se empiezan a realizar los
ajustes necesarios introducidos por el cliente de las partes que no le han gustado y se
comienza a realizar el análisis y diseño del componente, además también se comienza con la
realización de la búsqueda de las funciones String Metrics para las mediciones del sistema de
aprendizaje que apoyará el Matcher de Servicios Web.
Otro de los desarrollos que se llevarán a cabo será la realización de las introspecciones de
Servicios Web así como la persistencia y el modelado.
Finalmente se realizará el testeo de todos los componentes desarrollados y la entrega del
componente desarrollado en el sprint.
Duración final del Sprint 24 días.
Nombre de tarea
Duración
Componente Registrador
24 días
Ajustes de cambios introducidos por el cliente
1 día
Análisis
2 días
Casos de Uso
1 día
Diagrama de Clases
1 día
Diagrama de Interacción
1 día
Implementación
16 días
Búsqueda de funciones StringMetrics para medida
8 días
entre dos cadenas
Desarrollo del Matcher
10 días
Por campo
10 días
Por método
8 días
Tratamiento de los Servicios Web
5 días
Persistencia de los nuevos Servicios Web
2 días
Introspección de los Servicios Web
5 días
Tratamiento de la Universidad
5 días
Persistencia de la Universidad
2 días
Refactorización
1 día
Test
4 días
Probar componente Matcher
1 día
Refinamiento de los emparejamientos
1 día
Probar persistencia de Servicios Web
1 día
Probar persistencia de Universidades
1 día
Entrega del componente REGISTRADOR
1 día
Tabla 4. Planificación. Listado de Tareas. Componente Registrador
40
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Planificación del Proyecto y Resumen de Presupuestos | Plataforma para Interoperabilidad de
sistemas de información dentro de un mismo ámbito organizativo
4.1.3.3 Componente Recolector
En este Sprint se realizará el desarrollo del Recolector de Servicios Web, como en cada Sprint,
el comienzo es siempre el mismo, se realizan los ajustes necesarios sobre el componente
anterior además de realizar el análisis del componente a desarrollar.
La implementación constará de la gestión para la conexión con los servicios web de cada
universidad concreta, recolección de datos de los servicios web y las transformación al modelo
de referencia además de incluir una refactorización de código que llevará al testeo del
desarrollo a realizar.
Duración final del Sprint 23 días.
Nombre de tarea
Duración
Componente Recolector
23 días
Ajustes sobre el componente anterior del cliente
1 día
Análisis
1 día
Diagrama de clases
1 día
Casos de Uso
1 día
Implementación
18 días
Conexión con los Servicios Web concretos de cada
5 días
Universidad
Recolección de datos de los Servicios Web
5 días
Transformación de los datos de los Servicios Web
8 días
concretos en un modelo común
Refactorización
1 día
Test
2 días
Testeo del componente Recolector
1 día
Test de integración
1 día
Entrega del componente RECOLECTOR
1 día
Tabla 5.Planificación. Listado de Tareas. Componente Recolector
4.1.3.4 Componente Buscador
En este Sprint se va a realizar el Buscador de Servicios web, con lo que se tendrá que hacer la
integración con el servidor que tendrá instalado el Apache Solr, además de la realización de
todas las interfaces de usuario, y el desarrollo de las mismas.
En este punto también se deberá de realizar la primera integración de componentes, que
tendrá que ensamblarse junto con el Matcher y el Recolector.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
41
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Planificación del Proyecto y Resumen de Presupuestos
Duración del Sprint 25 días.
Nombre de tarea
Duración
Componente Buscador
25 días
Ajustes sobre el componente anterior del cliente
1 día
Análisis
1 día
Casos de uso
1 día
Diagrama de clases
1 día
Diseño
14 días
Diseño de Interfaces de Usuario
7 días
Diseño de estilos del sitio web
7 días
Implementación
18 días
Configuración de Solr para el buscador
9 días
Integración de Solr con el sitio web mediante
4 días
Spring Data Solr
Implementación de la portada
5 días
Implementación del registro de Servicios Web
10 días
Implementación del apartado de ayuda
2 días
Implementación de la persistencia con Spring Data
5 días
JPA
Diseño de interfaces responsivas con Bootstrap
7 días
Realización de formularios mediante AJAX
5 días
Integración de componentes Buscador - Matcher 5 días
Recolector
Refactorización
2 días
Test
4 días
Comprobar comportamiento del diseño
1 día
responsivo en interfaces móviles y pantallas grandes
Comprobar integración entre buscador y los otros
1 día
dos componentes
Comprobar el sitio web
1 día
Comprobar la capa de servicio
1 día
Entrega del componente BUSCADOR
1 día
Tabla 6. Planificación. Listado de Tareas. Componente Buscador
42
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Planificación del Proyecto y Resumen de Presupuestos | Plataforma para Interoperabilidad de
sistemas de información dentro de un mismo ámbito organizativo
4.1.3.5 Componente Publicador
Finalmente el componente Publicador se encargará de exponer los Servicios Web que genere
el proyecto además de realizar la integración con los anteriores componentes ya ensamblados.
También será el momento en el que se cerrará el proyecto, junto con la entrega final del
mismo.
Duración del Sprint final 12 días.
Nombre de tarea
Duración
Componente Publicador
12 días
Ajustes sobre el componente anterior del cliente
1 día
Análisis
1 día
Casos de uso
1 día
Diagrama de clases
1 día
Implementación
5 días
Generar un publicador para el acceso por Servicio
5 días
Web
Integración de componentes de la aplicación
5 días
Refactorización
5 días
Test
5 días
Asegurar que se cumplen todos los test previos
5 días
Entrega de la aplicación completa
1 día
Tabla 7. Planificación. Listado de Tareas. Componente Publicador
4.1.3.6 Reuniones
A lo largo del proyecto se planea como mínimo la realización de 6 reuniones con el cliente, una
para presentar el proyecto al cliente y que dé el visto bueno del mismo, y otras 5 para entregar
los diferentes componentes que se generarán a lo largo de los diferentes Sprints.
Duración de las reuniones a lo largo del proyecto 103 días.
Nombre de tarea
Duración
Reuniones
103 días
Reunión 1 - Exposición del proyecto
1 día
Reunión 2 - Entrega del pliego Planificación de
1 día
REGISTRADOR
Reunión 3 - Entrega del REGISTRADOR Planificación
1 día
de RECOLECTOR
Reunión 4 - Entrega de RECOLECTOR Planificación
1 día
de BUSCADOR
Reunión 5 - Entrega BUSCADOR Planificación de
1 día
PUBLISHER
Reunión 6 - Cierre del proyecto
1 día
Tabla 8. Planificación. Listado de Tareas. Reuniones
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
43
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Planificación del Proyecto y Resumen de Presupuestos
4.1.4
Resumen
A continuación se presentan una serie de diagramas y de datos que resumen el desarrollo del
proyecto estimado.
Ilustración 6. Planificación. Diagrama Resumen Proyecto
Ilustración 7. Planificación. Diagrama de recursos
Ilustración 8. Planificación. Coste por Componentes
44
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Planificación del Proyecto y Resumen de Presupuestos | Plataforma para Interoperabilidad de
sistemas de información dentro de un mismo ámbito organizativo
Número de tareas: 107
Duración de la tarea mayor: 10 días (Implementación del Registro de los Servicios Web)
Duración de la tarea menor: 1 día (Comprobar la capa de servicio)
Número de tareas críticas: 6
Número máximo de tareas críticas simultáneas: 1
Media de holguras:
Presupuesto total de personal: 79.370 €
Duración total del proyecto: 103 días
Número de recursos totales: 10
Número de recursos personales: 10
4.1.5
Ajuste de la planificación
Tras realizar la primera planificación, se han tenido que realizar algunos ajustes sobre la
planificación original debido a algunos retrasos.
Los componentes que se han visto retrasados han sido los siguientes:
Nombre de tarea
Duración
Comienzo
Fin
Previo
Análisis
Cubrimiento del "pliego" (Anteproyecto)
Entrega del "pliego"
Estudio de alternativas
Casos de Uso
Diagrama de Clases
Diagrama de Interacción
Modelado de datos
Selección de tecnologías
Diagrama de componentes
Diseño
Diseño de la arquitectura
Implementación
Preparación del servidor Tomcat
Preparación de la Base de Datos PostgreSQL
Preparación de la Base de Datos Cassandra
Preparación del Entorno de Desarrollo STS
Preparación de Solr
18,13 días
12 días
3 días
1 día
3 días
2 días
2 días
2 días
3 días
1 día
1 día
2 días
2 días
2,13 días
3 horas
3 horas
2 horas
2 horas
1 día
lun 02/12/13
lun 02/12/13
lun 02/12/13
jue 05/12/13
vie 06/12/13
mié 11/12/13
mié 11/12/13
vie 13/12/13
vie 13/12/13
mié 11/12/13
mar 17/12/13
mié 18/12/13
mié 18/12/13
vie 20/12/13
vie 20/12/13
vie 20/12/13
vie 20/12/13
lun 23/12/13
vie 20/12/13
jue 26/12/13
mar 17/12/13
mié 04/12/13
jue 05/12/13
mar 10/12/13
jue 12/12/13
jue 12/12/13
lun 16/12/13
mar 17/12/13
mié 11/12/13
mar 17/12/13
jue 19/12/13
jue 19/12/13
mar 24/12/13
vie 20/12/13
vie 20/12/13
vie 20/12/13
lun 23/12/13
vie 20/12/13
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
45
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Planificación del Proyecto y Resumen de Presupuestos
Configuración del SVN
5 horas
lun 23/12/13
Configuración de Maven
4 horas
lun 23/12/13
Test
1 día
mar 24/12/13
Test de software
1 día
mar 24/12/13
Test de servidores
1 día
mar 24/12/13
Test de base de datos
1 día
mar 24/12/13
Entrega de propuesta y documentación
1 día
mié 25/12/13
Tabla 9. Planificación. Ajuste Listado Tareas. Previo
lun 23/12/13
mar 24/12/13
mié 25/12/13
mié 25/12/13
mié 25/12/13
mié 25/12/13
jue 26/12/13
A este componente sólo le ha afectado el retraso en el comienzo de las tareas, pues la
planificación se ha hecho de fin a inicio.
Nombre de tarea
Duración
Comienzo
Componente Registrador
26 días
jue 26/12/13
Ajustes de cambios introducidos por el cliente
1 día
jue 26/12/13
Análisis
2 días
vie 27/12/13
Casos de Uso
1 día
vie 27/12/13
Diagrama de Clases
1 día
vie 27/12/13
Diagrama de Interacción
1 día
lun 30/12/13
Implementación
18 días
mar 31/12/13
Búsqueda de funciones StringMetrics para
10 días
mar 31/12/13
medida entre dos cadenas
Desarrollo del Matcher
10 días
mar 31/12/13
Por campo
10 días
mar 31/12/13
Por método
8 días
mar 31/12/13
Tratamiento de los Servicios Web
5 días
mar 14/01/14
Persistencia de los nuevos Servicios Web
2 días
mar 14/01/14
Introspección de los Servicios Web
5 días
mar 14/01/14
Tratamiento de la Universidad
5 días
vie 10/01/14
Persistencia de la Universidad
2 días
mar 21/01/14
Refactorización
1 día
jue 23/01/14
Test
4 días
vie 24/01/14
Probar componente Matcher
1 día
vie 24/01/14
Refinamiento de los emparejamientos
1 día
lun 27/01/14
Probar persistencia de Servicios Web
1 día
mar 28/01/14
Probar persistencia de Universidades
1 día
mié 29/01/14
Entrega del componente REGISTRADOR
1 día
jue 30/01/14
Tabla 10. Planificación. Ajuste Listado Tareas. Registrador
46
Fin
vie 31/01/14
vie 27/12/13
mar 31/12/13
lun 30/12/13
lun 30/12/13
mar 31/12/13
vie 24/01/14
mar 14/01/14
mar 14/01/14
mar 14/01/14
vie 10/01/14
mar 21/01/14
jue 16/01/14
mar 21/01/14
vie 17/01/14
jue 23/01/14
vie 24/01/14
jue 30/01/14
lun 27/01/14
mar 28/01/14
mié 29/01/14
jue 30/01/14
vie 31/01/14
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Planificación del Proyecto y Resumen de Presupuestos | Plataforma para Interoperabilidad de
sistemas de información dentro de un mismo ámbito organizativo
Aquí se ha introducido el retraso de dos días en la tarea de Búsqueda de funciones con
StringMetrics, se han tenido que hacer unas mediciones extra pues las reglas son aplicables al
inglés, entonces se debía de comprobar que podrían ser útiles en castellano.
Nombre de tarea
Duración
Comienzo
Componente Recolector
23 días
vie 31/01/14
Ajustes sobre el componente anterior del cliente 1 día
vie 31/01/14
Análisis
1 día
lun 03/02/14
Diagrama de clases
1 día
lun 03/02/14
Casos de Uso
1 día
lun 03/02/14
Implementación
18 días
mar 04/02/14
Conexión con los Servicios Web concretos de
5 días
mar 04/02/14
cada Universidad
Recolección de datos de los Servicios Web
5 días
mar 11/02/14
Transformación de los datos de los Servicios
8 días
mar 18/02/14
Web concretos en un modelo común
Refactorización
1 día
mar 04/02/14
Test
2 días
vie 28/02/14
Testeo del componente Recolector
1 día
vie 28/02/14
Test de integración
1 día
lun 03/03/14
Entrega del componente RECOLECTOR
1 día
mar 04/03/14
Tabla 11. Planificación. Ajuste Listado Tareas. Recolector
Fin
mié 05/03/14
lun 03/02/14
mar 04/02/14
mar 04/02/14
mar 04/02/14
vie 28/02/14
mar 11/02/14
mar 18/02/14
vie 28/02/14
mié 05/02/14
mar 04/03/14
lun 03/03/14
mar 04/03/14
mié 05/03/14
Sin retrasos, tan sólo se ha movido la fecha, la duración es la misma.
Nombre de tarea
Duración
Comienzo
Fin
Componente Buscador
Ajustes sobre el componente anterior del cliente
Análisis
Casos de uso
Diagrama de clases
Diseño
Diseño de Interfaces de Usuario
Diseño de estilos del sitio web
Implementación
Configuración de Solr para el buscador
Integración de Solr con el sitio web mediante
Spring Data Solr
Implementación de la portada
Implementación del registro de Servicios Web
Implementación del apartado de ayuda
Implementación de la persistencia con Spring
Data JPA
Diseño de interfaces responsivas con Bootstrap
Realización de formularios mediante AJAX
Integración de componentes Buscador Matcher - Recolector
25 días
1 día
1 día
1 día
1 día
17 días
9 días
8 días
18 días
9 días
mié 05/03/14
mié 05/03/14
jue 06/03/14
jue 06/03/14
jue 06/03/14
mié 05/03/14
mié 05/03/14
mar 18/03/14
vie 07/03/14
vie 07/03/14
mié 09/04/14
jue 06/03/14
vie 07/03/14
vie 07/03/14
vie 07/03/14
vie 28/03/14
mar 18/03/14
vie 28/03/14
mié 02/04/14
jue 20/03/14
4 días
vie 07/03/14
jue 13/03/14
5 días
10 días
2 días
vie 07/03/14 vie 14/03/14
vie 07/03/14 vie 21/03/14
jue 20/03/14 lun 24/03/14
5 días
jue 13/03/14 jue 20/03/14
7 días
5 días
vie 14/03/14
vie 21/03/14
5 días
lun 24/03/14 lun 31/03/14
mar 25/03/14
vie 28/03/14
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
47
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Planificación del Proyecto y Resumen de Presupuestos
Refactorización
2 días
lun 31/03/14
Test
4 días
mié 02/04/14
Comprobar comportamiento del diseño
responsivo en interfaces móviles y pantallas
1 día
mié 02/04/14
grandes
Comprobar integración entre buscador y los
1 día
jue 03/04/14
otros dos componentes
Comprobar el sitio web
1 día
vie 04/04/14
Comprobar la capa de servicio
1 día
lun 07/04/14
Entrega del componente BUSCADOR
1 día
mar 08/04/14
Tabla 12. Planificación. Ajuste Listado Tareas. Buscador
mié 02/04/14
mar 08/04/14
jue 03/04/14
vie 04/04/14
lun 07/04/14
mar 08/04/14
mié 09/04/14
Sin retrasos de duración, tan solo se mueve la fecha.
Nombre de tarea
Duración
Comienzo
Componente Publicador
12 días
mié 09/04/14
Ajustes sobre el componente anterior del cliente 1 día
mié 09/04/14
Análisis
1 día
jue 10/04/14
Casos de uso
1 día
jue 10/04/14
Diagrama de clases
1 día
jue 10/04/14
Implementación
5 días
vie 11/04/14
Generar un publicador para el acceso por
5 días
vie 11/04/14
Servicio Web
Integración de componentes de la aplicación
5 días
vie 11/04/14
Refactorización
5 días
vie 11/04/14
Test
5 días
vie 18/04/14
Asegurar que se cumplen todos los test previos 5 días
vie 18/04/14
Entrega de la aplicación completa
1 día
vie 25/04/14
Tabla 13. Planificación. Ajuste Listado Tareas. Publicador
Fin
vie 25/04/14
jue 10/04/14
vie 11/04/14
vie 11/04/14
vie 11/04/14
vie 18/04/14
vie 18/04/14
vie 18/04/14
vie 18/04/14
vie 25/04/14
vie 25/04/14
lun 28/04/14
Tampoco existen retrasos en este componente, se mueve la fecha por la demora introducida
en el inicio.
48
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Planificación del Proyecto y Resumen de Presupuestos | Plataforma para Interoperabilidad de
sistemas de información dentro de un mismo ámbito organizativo
4.2 Conclusiones de la planificación
Afortunadamente, la planificación se ajustó bastante a lo que finalmente sucedió durante el
desarrollo del proyecto debido a que se realizó una planificación de fin a inicio.
Esto puede indicar dos cosas: por un lado, los plazos han sido sobreestimados o bien se han
excedido los recursos asignados y habría sido suficiente con menos personal con lo que a priori
parece una buena planificación, igual al final no lo es tanto por el ajuste final aunque los
recursos que no se utilizaron que estaban sobreestimados se derivaron a otros proyectos en
curso.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
49
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Planificación del Proyecto y Resumen de Presupuestos
4.3 Resumen del Presupuesto
Item
1
2
3
4
Concepto
Licencias
Formación
Desarrollo
Otros
50
Cantidad
1
1
1
1
Precio(€)
Subtotal(€)
17.790,00 €
17.790,00 €
850,00 €
850,00 €
97.586,50 €
97.586,50 €
800,00 €
800,00 €
TOTAL (sin IVA)
117.026,50 €
TOTAL (con 21% IVA)
141.602,07 €
Tabla 14. Resumen del Presupuesto
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Análisis | Plataforma para Interoperabilidad de sistemas de información dentro de un mismo
ámbito organizativo
Capítulo 5. Análisis
5.1 Definición del Sistema
5.1.1
Determinación del Alcance del Sistema
Como se ha venido comentando, el alcance del sistema es construir una aplicación
multimodular que permita por una parte registrar servicios web de una universidad y
clasificarlos mediante una serie de parámetros. Además también deberá de realizar el
emparejamiento de los campos entre el modelo de referencia de forma semiautomática
aunque necesitará de supervisión.
Los servicios web que estén registrados, podrán ser localizados de forma sencilla mediante un
sistema buscador el cual tendrá diferentes campos indexados para realizar búsquedas bien sea
por el nombre de la universidad, por la categorización del servicio web…
El registro de los servicios web deberá de tener la mínima intervención humana, es decir, el
sistema se encargará de recolectar la máxima información posible del fichero WSDL que
presente la universidad a registrar. Esto incluiría la identificación de todos los métodos que
incluya el WSDL, sus parámetros y sus clases y además se hará la relación con el sistema de
referencia entre las clases.
Por otro lado, el sistema también deberá publicar un servicio web que hará posible la
obtención de información de todos los servicios web que están registrados facilitando la
recolección de datos por parte de sistemas de terceros que quieran acceder a la información
de forma unificada pues todos los datos que obtengan tendrán todos el mismo formato. Este
servicio web tendrá disponible un método que permitirá la recolección de las becas
universitarias bien por categoría, por parámetro o por universidad.
El sistema se deberá de implementar de forma que sea lo suficientemente trivial y sencillo
reciclar el desarrollo y adaptarlo para trasladarlo a otros ámbitos como pueden ser la sanidad,
el sector bancario o similares.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
51
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Análisis
5.2 Requisitos del Sistema
5.2.1
Obtención de los Requisitos del Sistema
5.2.1.1 Requisitos funcionales
Código
RF1.1
Nombre Requisito
Registrar Universidad
RF1.1.1
RF1.2
RF1.2.1
RF1.2.2
RF1.2.3
RF1.2.3.1
RF1.2.3.2
RF1.2.4
RF1.3
RF1.3.1
RF1.3.2
RF1.4
RF1.4.1
RF1.5
RF1.5.1
52
Descripción del Requisito
Se debe permitir a las universidades registrarse en
el sistema.
Registrar el servicio web Se tendrá que registrar por cada universidad un
de la universidad
fichero WSDL.
Extraer información del Se deberá recabar toda la información posible del
servicio web de la fichero ofrecido por la universidad.
universidad
Detectar los métodos Se deberán detectar los métodos que ofrece el
disponibles en el servicio servicio web y que se entiende serán relacionados
web
con becas universitarias.
Detectar los modelos del Se deberán detectar también los atributos de las
servicio web
clases del servicio web para poder emparejarse con
los del modelo de referencia.
Emparejar campos
El sistema deberá intentar emparejar los campos
de la clase del servicio web de la universidad de
forma automática con los del modelo de referencia.
Sistema de aprendizaje
El sistema deberá de aprender con cada registro
que se haga en el sistema.
Apoyo con String Metrics El sistema, si no es capaz de decidir el
emparejamiento se basará en una serie de
funciones de String Metrics para apoyar la decisión.
Almacenar
los Estos emparejamientos realizados, deberán ser
emparejamientos
almacenados para su uso posterior.
Buscar servicios web
El sistema deberá permitir la búsqueda mediante
un buscador al estilo “Google”.
Por categoría
El buscador deberá permitir realizar búsquedas por
categorías (vicerrectorado, alumno, curso).
Por nombre
El buscador deberá permitir realizar búsquedas por
nombre de la universidad.
Interfaz web
El sistema deberá de ofrecer una interfaz web para
poder realizar el registro y la búsqueda de los
servicios web.
Interfaz de consola
El sistema también deberá de ofrecer el registro de
nuevos servicios web mediante una aplicación de
consola.
Recolectar información
El sistema deberá de permitir recolectar
información de los servicios web que estén
registrados.
Forma homogénea
El sistema deberá de ofrecer los datos de forma
homogénea, es decir, deberá de convertir los datos
recibidos del servicio web y convertirlos a un
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Análisis | Plataforma para Interoperabilidad de sistemas de información dentro de un mismo
ámbito organizativo
Código
RF1.5.2
RF1.5.3
Nombre Requisito
Descripción del Requisito
formato común.
Publicar Servicio Web
El sistema deberá de ofrecer un servicio web para
que los sistemas de terceros puedan recolectar la
información.
Parametrizable
El servicio web deberá de poder obtener becas por
alumno, vicerrectorado o universidad.
Tabla 15. Requisitos funcionales
5.2.1.2 Requisitos no funcionales
Código
RNF1.1
RNF1.2
RNF1.2.1
RNF1.3
RNF1.4
RNF1.5
RNF1.6
RNF1.7
RNF1.8
Nombre Requisito
Descripción del Requisito
Lenguaje
de El lenguaje utilizado en la aplicación será Java.
programación
Tipo del SGBD
El sistema deberá de tener dos sistemas gestores
de bases de datos, uno No SQL y otro Relacional.
SGBD
El SGBD No SQL deberá de ser compatible con un
sistema Windows.
JavaScript no disponible
La web deberá de funcionar de forma transparente
independientemente de si se tenga activado el
intérprete de JavaScript.
Interfaz responisva
La interfaz web deberá de ser adaptable a cualquier
tipo de pantalla.
Capacidad de carga
El sistema deberá de ser posible de aguantar las
conexiones que reciba de parte de las diferentes
universidades.
Modularidad
La aplicación deberá de ser ampliable o al menos
modificada de forma sencilla para poder ajustarse a
otros ámbitos, no solo al universitario.
Apache Solr
El sistema deberá de implementar un buscador,
concretamente el motor de búsqueda será Apache
Lucene, en su versión web.
Multiproyecto
El sistema deberá de ser un sistema desarrollado
mediante multiproyecto y con Apache Maven para
poder desplegarlo en el repositorio de
componentes.
Tabla 16. Requisitos no funcionales
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
53
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Análisis
5.2.2
Identificación de Actores del Sistema
5.2.2.1 Base de datos relacional
Es el servidor de base de datos relacional del sistema, en ciertas ocasiones se tendrán que
almacenar datos, consultar operaciones… en definitiva realizar trabajo de almacenamiento y
recuperación de información por lo que se estima que es una parte importante de la aplicación
y puede tener entidad como si misma.
5.2.2.2 Matcher
Componente del sistema de registro, es el encargado de realizar las operaciones de los
emparejamientos de campos, consulta con la base de datos NoSQL, aplica las reglas de String
Metrics a los campos de los servicios web obtenidos y decide los emparejamientos.
5.2.2.3 Recolector
Subsistema recolector que es utilizado por el publicador. Se encarga de obtener los datos
invocando a los diferentes servicios web registrados.
5.2.2.4 Servidor de búsqueda
Es el servidor dedicado al buscador que tendrá montado un entorno con Apache Solr. El será
capaz de resolver las consultas de las búsquedas que realicen los usuarios de la aplicación
además de indexar los nuevos servicios web registrados.
5.2.2.5 Servidores externos
Agrupación de los servidores de terceros. Estos almacenarán y expondrán los servicios web de
cada universidad.
5.2.2.6 Sistema
El propio sistema, la aplicación.
5.2.2.7 Usuario
Usuario que interactuará con la aplicación. Su función será la de buscar universidades,
registrarlas y consultar datos de las mismas.
54
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Análisis | Plataforma para Interoperabilidad de sistemas de información dentro de un mismo
ámbito organizativo
5.2.3
Especificación de Casos de Uso
Ilustración 9. Resumen de los casos de uso
Nombre del Caso de Uso
Registrar servicios web
Descripción
Creará una nueva universidad en el sistema y registrará su servicio web. En el proceso, se
encargará de recoger información del servicio web y de emparejar los campos del servicio con
los del modelo de referencia.
Nombre del Caso de Uso
Buscar servicios web
Descripción
Bien sean servicios web, universidades, métodos… Este caso de uso engloba todo lo
relacionado con la búsqueda de información de la aplicación y del uso del sistema de
búsqueda.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
55
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Análisis
Nombre del Caso de Uso
Publicar los servicios web
Descripción
El sistema publicará un servicio web para que las universidades que lo deseen puedan
invocarlo y del cual obtendrán becas en función de los parámetros que definan de todas las
universidades que estén registradas.
Nombre del Caso de Uso
Obtener datos de los servicios web
Descripción
El sistema recolectará información de los servicios web. Es decir, invocará cada servicio web
registrado para obtener sus becas en función a los criterios definidos en la llamada. Una vez
obtenidos los datos, los transformará a un sistema de referencia común para poder devolver
los datos de forma homogénea en lugar de obtener el formato de cada universidad.
56
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Análisis | Plataforma para Interoperabilidad de sistemas de información dentro de un mismo
ámbito organizativo
5.3 Identificación de los Subsistemas en la Fase de
Análisis
Para un mejor manejo y una mejor comprensión de la aplicación se ha dividido ésta en
diferentes subsistemas en función de las tareas que realizan sus componentes. De este modo
se pueden encontrar los siguientes:




Buscador
Registrador
Recolector
Publicador
5.3.1
Descripción de los Subsistemas
5.3.1.1 Subsistema Buscador
Es el encargado de, en función de los parámetros que defina el usuario en la búsqueda web,
traducirlos para entregárselos al motor de búsqueda y obtener los resultados que se ajusten.
Además de integrar el componente de búsqueda también es el encargado de ofrecer la
aplicación web del sistema.
5.3.1.2 Subsistema Registrador
Este subsistema tiene como función realizar el registro de las nuevas universidades, además
también se encargará de en el proceso de registro, obtener los datos del archivo WSDL
presentado por la universidad en el registro y de realizar el emparejamiento de los campos del
WSDL con los del modelo de referencia.
5.3.1.3 Subsistema Recolector
Se encarga de conectarse al listado de servicios web que están almacenados, obtenidos de los
registros que haya tenido la aplicación. Además de conectarse a los mismos, tendrá el objetivo
de a partir de las reglas definidas de emparejamiento que se definieran en el registrador,
devolver los datos en un formato que sea independiente de la universidad de la que se
obtienen los datos.
5.3.1.4 Subsistema Publicador
Su función es publicar los servicios web y hacer de nexo común entre todos los servicios web
que estén registrados y las universidades que quieran obtener la información de las becas pues
será el punto de acceso que tendrán para obtener los datos.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
57
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Análisis
5.3.2
Descripción
Subsistemas
de
los
Interfaces
entre
Como una de las características del sistema es que fuera modular, desde el primer momento
se diseñó como un sistema multiproyecto, es decir, Maven tiene la posibilidad de poder definir
este concepto dentro de sus características por lo que cada uno de los subsistemas que se han
descrito anteriormente son realmente un proyecto dentro del sistema que a su vez es otro
proyecto padre en sí mismo. Esta habilidad resulta en que los componentes serán distribuidos
a través de ellos en forma de bibliotecas JAR, para que cada subsistema pueda utilizar lo que
necesite de los otros a modo de interfaces.
De esta forma, se pueden encontrar las siguientes interfaces: MatcherManagerService,
SearchEngineService, UniversityManagerService, OperationsWrapperService y
WebServiceManagerService que serán las encargadas de ofrecer los servicios de cada
componente a los demás.
58
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Análisis | Plataforma para Interoperabilidad de sistemas de información dentro de un mismo
ámbito organizativo
5.4 Diagrama de Clases Preliminar del Análisis
5.4.1
Diagrama de Clases
Ilustración 10. Diagrama de clases previo
5.4.2
Descripción de las Clases
5.4.2.1 Subsistema Registrador
Nombre de la Clase
Matcher
Descripción
Será la encargada de aplicar los métodos de String Metrics a los campos obtenidos en el
recolector. Aunque antes deberá de conectarse a la base de datos NoSQL y obtener los
emparejamientos previos realizados y comprobarlos.
Responsabilidades
Emparejar los campos entre los campos de la universidad y los del modelo de referencia.
Atributos Propuestos
DAO: Almacenar los mapeos resultantes
Campos: Listado de campos obtenidos del servicio web.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
59
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Análisis
Métodos Propuestos
aplicarStringMetrics: Aplicará las funciones String Metrics para medir cuanto se parecen dos
cadenas.
buscarEmparejamiento: Buscará en la base de datos de emparejamientos previos.
almacenarEmparejamientos: Guardará en base de datos los emparejamientos realizados.
Nombre de la Clase
RecolectorInformacionServiciosWeb
Descripción
Se encargará de recoger información importante del fichero WSDL mediante la instanciación
dinámica del mismo y combinándolo con reflectividad.
Responsabilidades
Recogerá toda la información posible: campos, métodos, retornos…
Además
Atributos Propuestos
WSDL: url del servicio web
Campos: Campos obtenidos del servicio web
Metodos: Métodos obtenidos del servicio web
Métodos Propuestos
getCampos: Obtendrá los campos de las clases del servicio web.
getOperaciones: Obtendrá las operaciones que se pueden ejecutar en el servicio web.
5.4.2.2 Subsistema Buscador
Nombre de la Clase
BuscadorUniversidades
Descripción
Se comunicará con el buscador para realizar la búsqueda según los criterios propuestos por el
usuario.
Responsabilidades
Traducir los parámetros introducidos por el usuario y comunicárselos al servidor Lucene para
que realice la búsqueda.
Presentar los resultados.
Atributos Propuestos
Parámetros: keywords que introducirá el usuario en el buscador.
Métodos Propuestos
Buscar: Realizará la llamada al interfaz de Solr.
Nombre de la Clase
ControladorWeb
Descripción
Será el encargado de filtrar las peticiones y mapearlas al método correspondiente según la
dirección introducida en el navegador por el usuario.
Responsabilidades
Hacer de controlador Web.
Atributos Propuestos
60
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Análisis | Plataforma para Interoperabilidad de sistemas de información dentro de un mismo
ámbito organizativo
Métodos Propuestos
Nombre de la Clase
DAO
Descripción
Interactuará con la Base de Datos y será el encargado de realizar la persistencia de la
aplicación
Responsabilidades
Gestionar comunicaciones con la base de datos.
Obtener datos de la base de datos.
Almacenar datos en la base de datos.
Atributos Propuestos
Métodos Propuestos
almacenarUniversidad: Guardará una universidad en BD.
almacenarEmparejamiento: Guardará el emparejamiento en BD.
5.4.2.3 Subsistema Recolector
Nombre de la Clase
ConectorServiciosWeb
Descripción
Su función será la de conectarse a los distintos servicios web que estén registrados en la
aplicación. Una vez conectado, hará las peticiones oportunas para obtener las becas,
traducirlas al modelo de referencia y devolverlas.
Responsabilidades
Gestionar las conexiones con los servicios web registrados.
Modificar los datos obtenidos para transformarlos a un modelo común.
Atributos Propuestos
WSDLs: listado de urls de los servicios web a invocar
Emparejamientos: emparejamientos realizados previamente para unificar los resultados
Métodos Propuestos
invocarMetodo: Invocará el método correspondiente de forma dinámica sin generar el stub
típico y con los parámetros indicados.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
61
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Análisis
5.4.2.4 Subsistema Publicador
Nombre de la Clase
PublicadorServiciosWeb
Descripción
Deberá exponer un método capaz de hacer de entrada a las universidades para recolectar
becas. Este método tendrá que ser lo suficientemente configurable para abarcar las
diferentes configuraciones.
Responsabilidades
Ofrecer un WSDL con un método para recoger información de los servicios web registrados.
Atributos Propuestos
Categoria: Categoría que se quiere utilizar para filtrar las becas: Vicerrectorado, Alumno,
Curso…
Universidad: Si se desea filtrar por universidad, su nombre
Parametros: En caso de ser varios, filtros usar una lista de parámetros.
Métodos Propuestos
obtenerBecas: Obtendrá las becas llamando al recolector en función de los parámetros que se
definan en la llamada.
62
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Análisis | Plataforma para Interoperabilidad de sistemas de información dentro de un mismo
ámbito organizativo
5.5 Análisis de Casos de Uso y Escenarios
5.5.1
Registrar universidad
Ilustración 11. Casos Uso. Registrar una universidad
Registrar universidad
Precondiciones
Poscondiciones
Actores
Descripción
El servidor de aplicaciones deberá de estar corriendo la aplicación y el
usuario deberá de estar dentro de la página web.
La universidad y sus emparejamientos deberán de estar almacenados
en la base de datos.
Usuario, Matcher
Usuario:
1. El usuario introducirá los datos de la universidad en el
formulario.
2. El usuario validará los emparejamientos ofrecidos por el sistema
Matcher:
1. Emparejará los campos de forma automática mediante una
estimación.
Se almacenarán los emparejamientos y la universidad.
Variaciones
(escenarios
secundarios)
-
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
63
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Análisis
Registrar universidad

Excepciones

Notas
El usuario no ha introducido los campos correctos en el
formulario.
El servicio web de la universidad no está disponible.
-
5.5.1.1 Obtener información del servicio web
Ilustración 12. Casos Uso. Obtener información del servicio web
Obtener información del servicio web
Precondiciones
Poscondiciones
Actores
Descripción
El servicio web de la universidad a inscribirse ha de estar disponible
El sistema deberá presentar los emparejamientos
Sistema, Servidores Externos
Sistema:
1. Instanciará dinámicamente el servicio web.
2. Recogerá los campos obtenidos mediante reflectividad.
Servidores Externos:
1. Responderá a la llamada del sistema cuando se solicite el
servicio web.
Variaciones
(escenarios
secundarios)
-
Excepciones
Notas
64

El servicio web de la universidad no está disponible.
-
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Análisis | Plataforma para Interoperabilidad de sistemas de información dentro de un mismo
ámbito organizativo
5.5.1.2 Realizar el emparejamiento de campos
Ilustración 13. Casos Uso. Emparejamiento de campso
Realizar el emparejamiento de campos
Precondiciones
Poscondiciones
Actores
Descripción
Se deben de haber obtenido los campos del servicio web
El sistema devolverá los emparejamientos realizados automáticamente
Matcher, Sistema, Usuario
Matcher:
1. Consultar contra el sistema de conocimiento si ya se ha
realizado un emparejamiento igual previamente.
2. Aplicar reglas String Metrics en comparación con los
resultados obtenidos del sistema de conocimiento.
3. Evaluar los resultados en función de un factor.
4. Presentar los resultados obtenidos autónomamente.
Usuario:
1. Validar los parámetros que se le presentan y rectificarlos si
no son correctos.
Variaciones
(escenarios
secundarios)
Excepciones
Notas
-
-
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
65
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Análisis
5.6 Análisis de Interfaces de Usuario
El concepto que se diseñó para las interfaces de usuario es simple. Una pantalla con un
formulario para el registro de las nuevas universidades, una pantalla de buscador que muestre
los resultados y la visión del detalle de cada una de las universidades registradas.
5.6.1
Formulario de registro
Ilustración 14. Interfaz de Usuario. Formulario de Registro
Esta pantalla sería un prototipo de lo que se buscaría a la hora de registrar las nuevas
universidades.
En la parte superior siempre hay que tener en cuenta que se tendrá un buscador para poder
buscar las universidades que ya estén registradas.
La otra parte de la pantalla, se dedicará a un formulario que recogerá datos de la universidad
como puede ser el nombre, la dirección de sus servicios web, los emparejamientos de los
campos de la Beca y del Solicitante, sus métodos del servicio web…
66
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Análisis | Plataforma para Interoperabilidad de sistemas de información dentro de un mismo
ámbito organizativo
5.6.2
Buscador
Ilustración 15. Interfaz de Usuario. Buscador
Esta sería una pantalla prototípica del listado de resultados que presentaría el buscador por
ejemplo al buscar un término que pudiera ser “Universidad de Oviedo”. En el listado se pueden
ver todas las operaciones que ofrecería la universidad y se seleccionará cualquiera del listado
para ver el detalle de la misma.
5.6.3
Detalle de Universidad
Ilustración 16. Interfaz de Usuario. Detalle Universidad
En el detalle de la universidad se mostrará el nombre, su URL donde encontrar su servicio web
y el catálogo de operaciones que presenta el servicio web además de indicar la categoría de
cada una de las operaciones.
Como en todos los casos, la zona superior será destinada al buscador con el cajetín de texto
para introducir las palabras claves y el botón de buscar.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
67
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Análisis
5.6.4
Diagrama de Navegabilidad
Ilustración 17. Diagrama de Navegabilidd
68
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Análisis | Plataforma para Interoperabilidad de sistemas de información dentro de un mismo
ámbito organizativo
5.7 Especificación del Plan de Pruebas
En este apartado se especificarán los tipos de pruebas que se tendrán en cuenta a la hora de
comprobar el buen funcionamiento de la aplicación.



Pruebas Unitarias: Estas pruebas se realizarán mediante la herramienta JUnit y se
podrán ejecutar tanto de forma autónoma, como cada vez que se haga un
empaquetado de la aplicación automáticamente (Maven antes de realizar un
empaquetado de la aplicación se encarga de pasar las pruebas unitarias para en caso
de fallar, no realizar el mismo).
Pruebas de Integración: Debido a que la aplicación está conformada por diferentes
componentes, se deberán testear los componentes para conocer si la integración
entre los mismos es la adecuada.
Pruebas del Sistema: Debido a que el sistema está basado en varios componentes, es
una buena práctica saber que a la hora de introducir un nuevo registro, éste se replica
en todos los repositorios de información que existen en la aplicación, de esta forma se
conocerá si la aplicación es consistente. También es una buena prueba del sistema
conocer los consumos de memoria que tiene la aplicación, de CPU, etc.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
69
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
Capítulo 6. Diseño del Sistema
6.1 Arquitectura del Sistema
6.1.1
Diagramas de Paquetes
Ilustración 18. Arquitectura. Diagrama de Paquetes
6.1.1.1 Modelo
Ilustración 19. Arquitectura. Paquete Modelo
Este paquete contendrá todos los modelos necesarios para utilizar la aplicación. Además
también incluye las interfaces de persistencia y las clases de Utilidad.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
71
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.1.1.2 Service
Ilustración 20. Arquitectura. Paquete Service
Este paquete incluye las interfaces correspondientes a la capa de servicio de la aplicación.
Tanto este paquete como el anterior se distribuirán a lo largo de los otros paquetes pues
contienen las operaciones de negocio necesarias para el funcionamiento desencapsulado de la
aplicación.
6.1.1.3 Buscador
Ilustración 21. Arquitectura. Paquete Buscador
Incluye todas las clases necesarias para gestionar el controlador de la aplicación y la gestión
del registro de nuevos servicios web por formulario, así como las búsquedas de los servicios
web registrados.
72
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.1.1.4 Recolector
Ilustración 22. Arquitectura. Paquete Recolector
Es el encargado de obtener las becas según la categoría, de esta forma ofrecerá una clase por
cada una de las categorías disponibles para la búsqueda.
6.1.1.5 Registrador
Ilustración 23. Arquitectura. Paquete Registrador
Es el encargado de llevar el peso del registro de nuevos servicios web. En él se implementan las
operaciones necesarias para el emparejador de campos, instanciador de servicios web de
forma dinámica…
6.1.1.6 Publisher
Se encarga de ofrecer los servicios web para que las aplicaciones puedan acceder a la
recolección de las becas que ofrezcan los servicios web registrados en el sistema.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
73
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.1.2
Diagramas de Componentes
Los componentes del sistema coinciden con los paquetes mostrados en el apartado anterior
con lo que para su revisión puede volver a consultarlo.
6.1.3
Diagramas de Despliegue
Ilustración 24. Diagrama Despliegue
6.1.3.1 Nodo 1
Contendrá a los componentes de la aplicación: Buscador, Registrador, Recolector y Publisher.
Además este estará ejecutado dentro del Contenedor de Aplicaciones Apache Tomcat 7 e
interactuará con el servidor buscador Apache Solr, con la base de datos relacional PostgreSQL,
con Apache Cassandra y además con los diferentes servicios web de las diferentes
universidades.
6.1.3.2 Nodo 2 y Nodo 3
Servicios web de diferentes universidades. Estos servicios web están expuestos públicamente
mediante un WSDL.
74
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.1.3.3 Nodo 4
Es el servidor que contiene el sistema gestor de bases de datos relacional PostgreSQL en modo
servidor que almacenará parte de la persistencia de la aplicación. La conexión con este
servidor se realizará mediante un interfaz JDBC. Este nodo puede agregar nuevos clusters en
función de la carga que se demande del mismo.
6.1.3.4 Nodo 5
Contiene un servidor Apache Cassandra con una base de datos NoSQL clusterizable en modo
servidor. Podrá generar replicación maestro-esclavo si se requiriera por motivos de
rendimiento de la aplicación.
6.1.3.5 Nodo 6
En este nodo se instalará un servidor Jetty que se encargará de ejecutar la aplicación Apache
Solr. Este servidor será el encargado de llevar la búsqueda de los servicios web registrados,
que él mismo se encarga de indexar en sus diccionarios.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
75
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.2 Diseño de Clases
6.2.1
Diagrama de Clases
Debido al entramado de referencias entre clases y a la cantidad de clases que hay es inviable
realizar un único diagrama donde se representen todas las clases, es por esto que se han
dividio por componentes para facilitar la comprensión y a su vez, en paquetes.
6.2.1.1 Buscador
6.2.1.1.1 Controller
Ilustración 25. Diagrama Clases. Controller
76
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.2.1.1.2 Search
Ilustración 26. Diagrama Clases. Search
Ilustración 27. Diagrama Clases. SearchView
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
77
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.2.1.1.3 University
Ilustración 28. Diagrama Clases. University
Ilustración 29. Diagramas Clases. Diagramas Clases
78
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.2.1.1.4 Validator
Ilustración 30Diagrama Clases. Validator
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
79
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.2.1.1.5 View
Ilustración 31. Diagrama Clases. View
80
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.2.1.2 Model
6.2.1.2.1 Model
Ilustración 32. Diagramas Clases. Model
6.2.1.2.2 NoSQL
Ilustración 33. Diagramas Clases. NoSQL
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
81
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.2.1.2.3 Persistence
Ilustración 34. Diagramas Clases. Persistence
6.2.1.2.4 Solr
Ilustración 35. Diagramas Clases. Class
6.2.1.2.5 Utils
Ilustración 36. Diagramas Clases. Util
82
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.2.1.2.6 Wrapper
Ilustración 37. Diagramas Clases. Wrapper
6.2.1.3 Publisher
6.2.1.3.1 Publisher
Ilustración 38. Diagramas Clases. Publisher
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
83
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.2.1.4 Recolector
6.2.1.4.1 Recolector
Ilustración 39. Diagramas Clases. Recolector
6.2.1.4.2 Ws
Ilustración 40. Diagramas Clases. Ws
84
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.2.1.5 Registrador
6.2.1.5.1 Matcher
Ilustración 41. Diagramas Clases. Matcher
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
85
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.2.1.5.2 Presentation
Ilustración 42. Diagramas Clases. Presentation
86
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.2.1.5.3 University
Ilustración 43. Diagramas Clases. University
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
87
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.2.1.5.4 Ws
Ilustración 44. Diagrama Clases. Ws
88
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.2.1.6 Service
6.2.1.6.1 Builder
Ilustración 45. Diagramas Clases. Builder
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
89
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.2.1.6.2 Business
Ilustración 46. Diagramas Clases. Business
6.2.1.6.3 Exception
Ilustración 47. Diagramas Clases. Exception
90
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.2.1.6.4 Matcher
Ilustración 48. Diagramas Clases. Matcher
6.2.1.6.5 SearchEngine
Ilustración 49. Diagramas Clases. SearchEngine
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
91
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.2.1.6.6 Solr
Ilustración 50. Diagramas Clases. Solr
6.2.1.6.7 University
Ilustración 51. Diagramas Clases. University
92
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.2.1.6.8 Ws
Ilustración 52. Diagramas Clases. Ws
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
93
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.3 Diagramas de Interacción y Estados
6.3.1
Registro de una nueva Universidad
Ilustración 53. Diagrama Secuencia. Registro Universidad 1
El controlador de la aplicación deriva a la vista representada por CheckOperationsView. Este lo
primero que realiza es la validación de los campos recibidos del formulario. Se intenta
encontrar la universidad en la base de datos, se obtienen las operaciones, se intenta encontrar
la universidad por otros parámetros… todo esto para comprobar que la universidad no se ha
registrado previamente. Finalmente se devuelve el control al controlador Spring para que
represente la jsp del siguiente paso del formulario.
Ilustración 54. Diagrama Secuencia. Registro Universidad 2
94
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
En esta segunda parte del registro, es cuando se seleccionan las operaciones y el nombre del
modelo con lo que se deberán de validar los parámetros de entrada del formulario y se
devolverá el control al controlador de Spring a la jsp para seleccionar y emparejar los campos
de la Beca.
Ilustración 55. Diagrama Secuencia. Registro Universidad 3
Antes de presentar el formulario, se obtendrán los campos del servicio web de la universidad
que se registran y se intentan emparejar con los del modelo de referencia. Una vez
seleccionados los campos por el usuario, se proceden a validar antes de devolver el control a la
jsp correspondiente para introducir los datos del Solicitante.
Ilustración 56. Diagrama Secuencia. Registro Universidad 4
Como en el caso anterior, antes de presentar el formulario, se obtendrán los emparejamientos
que se creen idóneos entre el Solicitante y el modelo de referencia.
Una vez presentado, se seleccionan los emparejamientos por parte del usuario y se validan los
campos que estén de forma correcta. Cuando se tienen los emparejamientos confirmados se
procederá a guardar todos los emparejamientos y datos que se han recogido en todo el
proceso, de esta forma se evita que el sistema quede en forma inconsistente.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
95
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.3.2
Buscador
Ilustración 57. Diagrama Secuencia. Buscador
Una vez el usuario introduce los conceptos de la búsqueda, el controlador derivará en la vista
la ejecución, que a través de los managers terminará consultando contra el servidor de
búsqueda los conceptos introducidos por el usuario.
6.3.3
Publicador
Ilustración 58. Diagrama Secuencia. Publicador
A la hora de la llamada que realizarán los sistemas de terceros cuando quieran consultar datos
de becas, lo tendrán que hacer a través del ScholarshipManager, que configurarán con una
serie de parámetros (categoría, universidad) y se encargará de obtener los mapeos de la
universidad concreta entre el modelo de referencia y los modelos de la universidad para
finalmente realizar la invocación dinámica al servicio web de cada universidad.
96
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.4 Diagramas de Actividades
Ilustración 59. Diagrama Actividad. Registro Universidad
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
97
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.5 Diseño de la Base de Datos
6.5.1
Descripción del SGBD Usado
El Sistema Gestor de Bases de Datos utilizado es PostgreSQL en modo servidor. Una
descripción más detallada se puede encontrar en las Referencias Técnicas.
6.5.2
Integración del SGBD en Nuestro Sistema
La función que tiene el sistema gestor de bases de datos en nuestro sistema es la de almacenar
las nuevas universidades que se registren en la aplicación y los mapeos entre los campos de
cada universidad y sus operaciones.
6.5.3
Diagrama E-R
Ilustración 60. Diagrama E-R
98
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.6 Diseño de la Interfaz
6.6.1
Descripción de la Interfaz
Ilustración 61. Interfaz. Página de inicio
La pantalla de inicio es similar a la de cualquier aplicación web que se pueda encontrar. Al
estar hablando de un buscador, el componente más destacado y central será el cuadro de
texto y el botón con la lupa de buscar que nos servirá de buscador, además de encontrarse
con un cuadro de bienvenida que conduce a la zona de información.
La parte superior será fija y constará de una serie de ítems que harán de menú de navegación
dentro de la página.
Este menú superior, incluirá un elemento para volver al inicio de la aplicación, otro para ir al
formulario de registro de nuevos servicios web, otro para acceder a la información del
recolector y otro para acceder a la información de la aplicación.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
99
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
Ilustración 62. Interfaz. Formulario de registro
Una vez estemos ante el formulario de registro, se podrán identificar en la zona central de la
página una serie de números, que no harán más que indicar en el paso que se encuentra el
usuario dentro del proceso de registro. Además todos los formularios tendrán la capacidad de
ir hacia adelante y de reiniciar el formulario, para ello se dispone de un botón azul para
continuar y uno rojo para reiniciar.
Estos campos que se han de cubrir en el registro, estarán marcados con símbolos de
admiración en caso de que sean obligatorios.
100
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
Ilustración 63. Interfaz. Selección de Operaciones
Una vez avanzamos a la siguiente sección del formulario se puede comprobar que la
distribución es igual que en el formulario anterior, aunque ahora se seleccionarán las
operaciones mediante botones de tipo radio y una caja de texto para registrar el nombre del
modelo.
Ilustración 64. Interfaz. Emparejamiento campos Beca
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
101
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
En el tercer paso del registro del servicio web, se puede comprobar que es el mismo estilo que
el formulario anterior. Campos del formulario que representan atributos de la clase del
modelo.
Ilustración 65. Interfaz. Emparejamiento campos Solicitante
Cuarto paso del registro, el formulario es igual que en el caso anterior, pues cada campo sigue
siendo un atributo de la clase Solicitante del servicio web.
102
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
Ilustración 66. Interfaz. Formulario guardado
Pantalla que indica que el formulario se ha guardado con éxito. Se ve reflejado el quinto paso y
tras informar de que se ha tenido éxito en la operación, se permite trasladar al usuario al
inicio.
Ilustración 67. Interfaz. Buscador
Una vez se ha registrado el servicio web, se puede utilizar el buscador para localizarlo. Se
puede localizar por el nombre de la universidad, por algún nombre del método o por categoría.
Tras realizar la búsqueda, se presentan los resultados para poder acceder al que más nos
convenza.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
103
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
Ilustración 68. Interfaz. Detalle Universidad
Tras seleccionar el resultado del buscador que más se ajuste a los criterios, lo que muestra la
aplicación es el detalle de la universidad seleccionada, donde se mostrará el nombre de la
universidad, la URL del fichero WSDL y los métodos de cada categoría que se pueden invocar.
Ilustración 69. Interfaz. Pantalla del recolector
En la tercera opción que aparece en el menú superior se puede ver el Recolector, este
trasladará al usuario a la página donde se informa de la dirección del recolector y de las
operaciones invocables por los usuarios además de una explicación.
104
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
Ilustración 70. Interfaz. Información de la aplicación
La aplicación también dispone de una pantalla de información que es la cuarta opción del
menú superior. Desde cada uno de los párrafos que se presentan y que cada uno describe una
funcionalidad disponible en la página web, se puede ir a la funcionalidad desde el enlace al
final del texto.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
105
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.6.2
Descripción
Interfaz
del
Comportamiento
de
la
A la hora de mostrar mensajes de error o avisos, la aplicación generará unos mensajes en una
especie de burbujas de color anaranjado, que el usuario podrá cerrar en el aspa superior
derecha para que los mensajes desaparezcan.
Ilustración 71. Interfaz. Mensaje informativo
Si por el contrario, en un campo marcado con el símbolo de admiración no introducimos el
texto o la aplicación deduce que no es correcta la operación, también nos dará un mensaje de
error como el siguiente:
Ilustración 72. Interfaz. Mensajes de Error
106
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.7 Especificación Técnica del Plan de Pruebas
A la hora de probar el software que se ha desarrollado se ha probado en dos equipos de
características lo suficientemente diferentes como son:


Portátil
o Intel i7 3610QM (2.3GHz)
o 6 GB RAM
o HDD 1TB
o Windows 7 Home Premium 64 bits
Sobremesa
o Intel X
o 4GB RAM
o HDD 500 GB
o Windows 7 Professional 64 bits
Las pruebas que se realizarán estarán dentro del multiproyecto entregado dentro del CD de la
aplicación.
6.7.1
Pruebas Unitarias
La realización de las pruebas unitarias se llevará a cargo mediante la herramienta JUnit. Esta
herramienta se encargará de ejecutar las pruebas y determinar si son correctas o la aplicación
falla alguno de los tests. Estas pruebas se ejecutarán siempre cada vez que se realice un
despliegue de la aplicación a cargo de Maven.
Las clases / métodos que se han decidido probar dentro de la aplicación son aquellas que son
factibles de que puedan dar problemas. Es decir, no se probarán modelos o managers que se
utilicen como pass-through para redundar en una persistencia en la base de datos, por
ejemplo.
6.7.1.1 BecaBuilder
Con el método:

testGetBeca: Se encargará de obtener unas becas concretas de un servicio web
registrado en la aplicación. Además comprobará si la beca recibida está bien
construida.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
107
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.7.1.2 MatcherManagerService
Con los métodos:



testMatch: Comprueba la realización de una serie de emparejamientos automáticos
generados por la aplicación respecto a una serie de campos concretos.
testSaveModelWrapper: Realiza la prueba de guardar el modelo en Cassandra.
testSaveOperationWrapper: Realiza la prueba de guardar la operación en Cassandra.
6.7.1.3 SearchEngineService
Con los métodos:


testSearchOperations: Realiza una prueba a buscar en el servidor de buscador sobre
operaciones registradas anteriormente.
testSearchUniversities: Realiza una prueba a buscar en el servidor de buscador sobre
universidades registradas anteriormente.
6.7.1.4 UniversityManagerService
Con los métodos:





108
testSave: Simula un proceso de registro de una universidad.
testRemove: Prueba a borrar una universidad creada anteriormente.
testFindUniversity: Prueba a encontrar una universidad.
testFindUniversityByWsdl: Prueba a encontrar una universidad mediante la dirección
de su servicio web.
testFindUniversityByName: Prueba a encontrar una universidad mediante el nombre
de la universidad.
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
6.7.1.5 WebServiceManagerService
Con los métodos:








testFailWrongArgumentNumber: Comprueba que la aplicación falla cuando no se le
pasa el número adecuado de parámetros (derivado de la instanciación dinámica).
testFailBadArguments: Comprueba que los tipos de los parámetros recibidos son los
adecuados.
testFailMethod: Comprueba que la aplicación falla como debe fallar si no se invoca a
un método disponible.
testFailWSDL: Comprueba que la aplicación falla si no está el WSDL disponible.
testGetOperations: Realiza una prueba para obtener las operaciones disponibles en un
WSDL.
testGetOperationsIOs: Obtiene los parámetros de entrada y los de retorno de los
diferentes métodos del servicio web.
testGetClassFields: Obtiene los atributos de una clase mediante introspección.
testGetBecasByParam: Prueba a obtener una serie de becas realizando la
instanciación dinámica de servicios web.
6.7.2
Pruebas de Integración y del Sistema
Para la realización de las pruebas de Integración y del Sistema, se tendrá que el sistema
funcione como debería, las búsquedas en servicios se realicen como deben, las conexiones
entre servicios son adecuadas, etc.
6.7.3
Pruebas de Usabilidad y Accesibilidad
6.7.3.1 Diseño de Cuestionarios
6.7.3.1.1 Cuestionario de Evaluación
Para evaluar la usabilidad de la aplicación, se realizarán a un conjunto de potenciales usuarios
de la aplicación y estos cuestionaros darán como resultado lo “fácil” que es utilizar la
aplicación que se está describiendo.
Es por ello que las preguntas que se realizarán serán de varios tipos: por un lado estarán las de
carácter general para conocer realmente qué conocimientos posee de base el usuario y por
otro están las preguntas que indicarán qué sencillo es utilizar la aplicación o cómo de
gratificante es la experiencia de usuario.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
109
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
6.7.3.1.2 Cuestionario para el Responsable de las Pruebas
Como también es recomendable generar un cuestionario para la persona que está a cargo de
evaluar a los usuarios, también se generará un cuestionario para que el responsable pueda
aportar información extra de cada uno de los usuarios y de lo que él ha apreciado durante la
sesión de la prueba.
6.7.3.2 Actividades de las Pruebas de Usabilidad
6.7.3.2.1 Preguntas de carácter general
¿Usa un ordenador frecuentemente?
1.
2.
3.
4.
Todos los días
Varias veces a la semana
Ocasionalmente
Nunca o casi nunca
¿Qué tipo de actividades realiza con el ordenador?
1.
2.
3.
4.
Es parte de mi trabajo o profesión
Lo uso básicamente para ocio
Solo empleo aplicaciones estilo Office
Únicamente leo el correo y navego ocasionalmente
¿Ha usado alguna vez software como el de esta prueba?
1. Sí, he empleado software similar
2. No, aunque si empleo otros programas que me ayudan a realizar tareas similares
3. No, nunca
¿Qué busca principalmente en un programa?
1.
2.
3.
4.
Que sea fácil de usar
Que sea intuitivo
Que sea rápido
Que tenga todas las funciones necesarias
¿Qué tipo de programas suele utilizar en el ordenador?
1.
2.
3.
4.
Ofimáticos
Navegador Web
Ambos
Otros
¿Está acostumbrado a navegar por internet con el teléfono móvil?
1. Sí
2. No
¿Posee conocimientos de programación?
110
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Diseño del Sistema | Plataforma para Interoperabilidad de sistemas de información dentro
de un mismo ámbito organizativo
1. Sí
2. No
Tabla 17. Usabilidad. Cuestionario Preguntas generales
6.7.3.2.2 Actividades guiadas
Las actividades que han de hacer los usuarios son las siguientes:





Añadir una nueva universidad a la aplicación
Obtener ayuda en la aplicación
Conseguir acceder al detalle de una universidad
Buscar una operación de un servicio web de una categoría concreta
Obtener la URL del servicio web publicador
6.7.3.2.3 Preguntas Cortas sobre la Aplicación y Observaciones
Estas preguntas se deberán de contestar después de hacer las actividades guiadas.
Facilidad de Uso
¿Sabe dónde está dentro de la
aplicación?
¿Existe ayuda para las funciones
en caso de que tenga dudas?
¿Le resulta sencillo el uso de la
aplicación?
Funcionalidad
¿Funciona cada tarea como usted
espera?
¿El tiempo de respuesta de la
aplicación es muy grande?
¿Han sido útiles los mensajes de
error?
¿Han sido útiles los indicadores?
¿Ha sido útil la ayuda?
Aspectos gráficos
Siempre
Frecuentemente
Ocasionalmente
Nunca
Siempre
Frecuentemente
Ocasionalmente
Nunca
Calidad del Interfaz
Muy
Adecuado
Adecuado
El tipo y tamaño de letra es
Los iconos e imágenes usados son
Los colores empleados son
Diseño de la Interfaz
¿Le resulta fácil de usar?
¿El diseño de las pantallas es claro y
atractivo?
¿Cree que el programa está bien
estructurado?
¿Se ha adaptado el diseño adecuadamente a
su dispositivo?
Si
Poco
Adecuado
Nada
Adecuado
No
A veces
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
111
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Diseño del Sistema
Observaciones
Cualquier comentario del usuario
Tabla 18. Usabilidad. Cuestionario Preguntas cortas
6.7.3.2.4 Cuestionario para el Responsable de las Pruebas
Aspecto Observado
Notas
El usuario comienza a trabajar de
forma rápida por las tareas
Tiempo en realizar cada tarea
Errores leves cometidos
Errores graves cometidos
El usuario ha preguntado
Tabla 19. Usabilidad. Cuestionario Preguntas Responsable
6.7.3.3 Pruebas de Accesibilidad
Para conocer el nivel de accesibilidad que tiene la aplicación se utilizarán cuestionario con las
recomendaciones de WCAG 2.0.
Además se utilizará el validador web http://achecker.ca/checker/
6.7.4
Pruebas de Rendimiento
Para conocer el rendimiento de la aplicación se visualizarán los estados internos del sistema
sobre el que se ejecuta. Las mediciones que se harán será conocer la cantidad de memoria
RAM consumida por la aplicación, el porcentaje de CPU, consumo de datos de la aplicación,
velocidades de respuesta de la página web y velocidades de respuesta en el consumo de los
servicios web.
112
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Capítulo 7. Implementación
Sistema
del
7.1 Estándares y Normas Seguidos
7.1.1
HMTL 5
Si bien no es un estándar oficial, sí que está en proceso de estandarización y por eso se ha
optado por generar el código de las JSPs con este lenguaje de marcado. De esta forma, la
aplicación web está escrita con esta tecnología.
7.1.2
CSS 3
Los estilos de la página web están basados en CSS y LESS. Además se apoya con JQuery y
bootstrap para aumentar la responsividad del diseño.
7.1.3
Java Conventions
A la hora de codificar la aplicación se ha decidido aplicar las reglas definidas en las Java
Conventions para la escritura y formateo del código desarrollado.
7.1.4
JPA (JSR-317)
Se ha decidido utilizar esta especificación en lugar de utilizar la implementación Hibernate. De
esta forma se consigue liberar la dependencia y poder modificar el proveedor de la
implementación sin afectar al diseño de la aplicación.
7.1.5
Dependency Injection For Java (JSR-330)
Igual que en el apartado anterior, para la inyección de dependencias se ha utilizado la
especificación mediante anotaciones @Inject y @Named. De esta forma aunque sean menos
representativos como por ejemplo lo son los estereotipos que proporciona Spring, si se da el
caso de que hay que modificar el proveedor de CDI no habrá problemas.
7.1.6
JAX-WS (JSR-224)
Para la especificación de los servicios web se han utilizado estas anotaciones proporcionadas
por la especificación.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
113
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
7.1.7
MVC (Model-View-Controller)
Para montar la estructura de la aplicación web se decidió utilizar este patrón arquitectónico
que es el más utilizado debido a la separación de responsabilidades entre las capas y ser la que
proporciona la tecnología utilizada para el controlador web (Spring-MVC).
114
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
7.2 Lenguajes de Programación
El lenguaje de programación utilizado ha sido Java en su versión JEE 7 para aplicaciones
empresariales. Debido a que Java suele mantener la compatibilidad con versiones anteriores
es posible utilizar JEE 6. Por debajo de esta última versión no se garantiza su correcto
funcionamiento.
Otro de los lenguajes utilizados en la programación ha sido JavaScript y concretamente con su
componente JQuery para realizar llamadas AJAX al servidor sin necesidad de refrescar la
página. La versión de JQuery utilizada es 2.0.0 minificada.
Para ver todas las versiones de los componentes utilizados se recomienda ver la sección de
anexos donde se incluirán los ficheros POM.xml de cada uno de los proyectos utilizados y que
definen tanto los componentes como sus versiones.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
115
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
7.3 Herramientas y Programas Usados para el
Desarrollo
7.3.1
Spring Tool Suite
Desarrollado en Java por Pivotal, es un entorno de desarrollo orientado a desarrollar
aplicaciones con Java y concretamente con los componentes SpringFramework, Maven, SVN,
JPA… Está desarrollado como un plug-in de Eclipse y enriquece enormemente la experiencia
del desarrollador teniendo un control máximo del proyecto.
7.3.2
SVN
Subversion es un sistema para el control del versionado. Es decir, permite llevar un track del
histórico de versiones de un proyecto siendo muy sencillo poder volver a una versión anterior
en caso de ser necesario y de compartir el código del proyecto pues está instalado en un
servidor.
7.3.3
Maven
Es una herramienta de despliegue automático de aplicaciones Java. Se puede ver como una
remodelación del antiguo Apache Ant, que fue tan exitoso en la generación de ficheros WAR
para su posible despliegue en entornos JEE. La mayor mejora que supone Maven es que se
encarga de la gestión de las dependencias en forma de bibliotecas que puedan tener los
proyectos, él las instala de forma automática, además de tener un amplio abanico de plantillas
para crear proyectos sin comenzar de cero. Para la gestión de las bibliotecas, éstas han de ser
incluidas en forma de dependencias dentro de un fichero XML denominado pom.xml que
además permitirá la gestión completa del proyecto, con qué plugins compilar, metadatos del
proyecto, gestión del empaquetamiento, etc. Ligada a esta nueva filosofía de las
dependencias, también acoge la nueva tendencia del multiproyecto por la cual se aconseja
tener un proyecto por cada capa (Tier) de la aplicación. Por último, otro de sus grandes
ventajas es su perfecta integración como plugin de Eclipse para la gestión de los proyectos.
7.3.4
Microsoft Project
Herramienta de Micrososft para la gestión de proyectos. Con él se ha diseñado el diagrama de
Gantt y se ha llevado a cabo la planificación del proyecto.
116
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
7.3.5
Microsoft Office
Suite ofimática que comprende programas como Microsoft Word para el procesado de textos,
Microsoft Excel para la realización de hojas de cálculo y Microsoft PowerPoint para la
realización de presentaciones.
7.3.6
Enterprise Architect
Herramienta CASE para la realización de los diagramas necesarios para documentar el
proyecto. Fundamental en el proceso de análisis y diseño ya que con él se desarrolla la
arquitectura, diagramas de clases, de interacción, de actividad, etc.
7.3.7
Windows 7
Sistema operativo de catacter propietario desarrollado por Microsoft sobre el cual se realiza la
documentación y análisis del proyecto. Para el ejemplo también será el sistema operativo
sobre el que se ejecutará la aplicación.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
117
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
7.4 Creación del Sistema
7.4.1
Problemas Encontrados
A la hora de realizar el desarrollo de este proyecto, el primer enfoque que se le dio fue que se
podía resolver mediante aplicando tecnologías relacionados con Web Semántica.
La convicción que se tenía en un principio fue que se podía realizar una Ontología lo
suficientemente potente como para que pudiera representar el modelo de referencia que se
plantea y que luego tanto con servicios web semánticos como mediante consultas SPARQL se
podían aplicar razonamientos a la Ontología para poder realizar los emparejamientos de
campos entre universidades.
El problema llegó desde que estaba construida la Ontología, cuando no se consiguió hacer un
modelo lo suficientemente rico semánticamente bien por no tener unos conocimientos
avanzados de la materia o porque simplemente no se estaba utilizando la tecnología en la
forma en la que se debería de utilizar. Tras desecharse este modelo se comenzó a plantear el
nuevo sistema mediante NoSQL y String Metrics.
Otro de los problemas que ocurrieron a lo largo del desarrollo del sistema fue cómo conseguir
llamar a los diferentes servicios web para obtener información o bien para realizar la
introspección de las clases y métodos incluidos en el servicio web sin generar todo el stub de
clases que se generan cuando se desarrolla un cliente para un determinado servicio web.
Esto finalmente se resolvió mediante la inclusión de Apache CXF para la instanciación dinámica
de servicios web, que si bien no es trivial, sí facilita el trabajo de forma notoria.
118
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
7.4.2
Descripción Detallada de las Clases
7.4.2.1 Buscador
7.4.2.1.1 BecaFormController
@Controller
@RequestMapping(value="/beca")
@SessionAttributes(value="beca")
public class BecaFormController
extends java.lang.Object
Controlador del formulario del modelo Beca. Atenderá las peticiones que sean de su
responsabilidad mediante las direcciones filtradas en los métodos.
Author:
Danielmf
Fields:
private IMatchBecaView
becaView
private BecaDirectorForm
builder
private static Logger logger
private MatcherManagerService
matcherService
private WebServiceManagerService webServiceService
Operations:
@RequestMapping(method=GET)
public java.lang.String setupForm(org.springframework.ui.Model m
odel,
javax.servlet.http.HttpServletRequest request)
Prepara el formulario de la Beca rellenando sus campos previamente con el modelo
Parameters:
model - a rellenar previa ejecución del formulario
request Returns:
vista a devolver el control
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
119
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
@RequestMapping(method=POST)
public java.lang.String submitForm(@ModelAttribute(value="beca")
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.Beca
Wrapper beca,
org.springframework.validation.BindingResult result,
org.springframework.web.bind.support.SessionStatus status,
javax.servlet.http.HttpServletRequest request,
org.springframework.ui.Model model)
Recoge la acción procesada al enviar el formulario del modelo Beca
Parameters:
beca - Modelo que será mapeado por el formulario
result - Resultado del mapeo del formulario
status - estado de la sesión, en caso de que exista algo que no ocurra como
debiera
request model - Model para realizar el binding
Returns:
vista donde se devolverá el control
7.4.2.1.2 OperationsFormController
@Controller
@RequestMapping(value="/operations")
public class OperationsFormController
extends java.lang.Object
Controlador de gestión del formulario de Operaciones de los servicios web
Author:
danielmf
Fields:
private static Logger logger
private IMatchOperationsView
120
matchOperationsView
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Operations:
@RequestMapping(method=POST)
public java.lang.String submitForm(javax.servlet.http.HttpServle
tRequest request,
@RequestParam(value="modelo")
java.lang.String modelo,
@RequestParam(value="VICERRECTORADO")
java.lang.String VC,
@RequestParam(value="CURSO")
java.lang.String curso,
@RequestParam(value="ALUMNO")
java.lang.String alumno)
Recoge la acción procesada al enviar el formulario del modelo OperationWrapper
Parameters:
request modelo - clase que emparejará con el modelo de referencia
VC - operacion para las becas del vicerrectorado
curso - operacion para las becas del curso
alumno - operacion para las becas por alumno
Returns:
7.4.2.1.3 SolicitanteFormController
@Controller
@RequestMapping(value="/solicitante")
@SessionAttributes(value="solicitante")
public class SolicitanteFormController
extends java.lang.Object
Controlador de gestión del formulario de Solicitante
Author:
danielmf
Fields:
privateBecaDirectorForm
builder
private static Logger logger
private MatcherManagerService
private ISaveProcessView
matcherService
saveProcessView
private WebServiceManagerService webServiceService
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
121
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
Operations:
@RequestMapping(method=GET)
public java.lang.String setupForm(org.springframework.ui.Model m
odel,
javax.servlet.http.HttpServletRequest request)
Preparación del formulario del modelo para inyectar campos previamente
Parameters:
model request Returns:
@RequestMapping(method=POST)
public java.lang.String submitForm(@ModelAttribute(value="solici
tante")
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.Soli
citanteWrapper solicitante,
org.springframework.validation.BindingResult result,
org.springframework.web.bind.support.SessionStatus status,
javax.servlet.http.HttpServletRequest request,
org.springframework.ui.Model model)
Parameters:
solicitante - clase que se mapeará en el formulario
result - resultado del mapeo
status - estado para obtener los errores
request model Returns:
7.4.2.1.4 UniversityController
@Controller
public class UniversityController
extends java.lang.Object
Controlador de la University
Author:
danielmf
122
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Fields:
private ICheckOperationsView
private IDetailView
detailView
private IDetailView
detailViewFull
checkOperationsView
private IMatchBecaView
matchBecaView
private ISaveProcessView
saveProcessView
Operations:
@RequestMapping(value="/univ/{univ}/min")
public java.lang.String detail(@PathVariable(value="univ")
java.lang.Long id,
org.springframework.ui.Model model)
Filtra las peticiones para el detalle de una universidad en caso de que se procese la
petición mediante JavaScript
Parameters:
id - de la University
model - para devolver el resultado
Returns:
@RequestMapping(value="/univ/{univ}")
public java.lang.String detailFull(@PathVariable(value="univ")
java.lang.Long id,
org.springframework.ui.Model model)
Filtra las peticiones para el detalle de una universidad en caso de que la petición se
ejecute sin JavaScript
Parameters:
id - de la University
model - para devolver el resultado
Returns:
7.4.2.1.5 UniversityFormController
@Controller
@RequestMapping(value="/form")
@SessionAttributes(value="university")
public class UniversityFormController
extends java.lang.Object
Controlador del formulario del modelo University
Author:
danielmf
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
123
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
Fields:
private ICheckOperationsView
checkOperationsView
private static Logger logger
Operations:
@RequestMapping(method=GET)
public java.lang.String setupForm(org.springframework.ui.Model m
odel)
Prepara el formulario inyectando los parámetros necesarios para rellenar los campos
Parameters:
model Returns:
@RequestMapping(method=POST)
public java.lang.String submitForm(@ModelAttribute(value="univer
sity")
es.uniovi.innova.eadministracion.tramites.swu.model.University u
niversity,
org.springframework.validation.BindingResult result,
org.springframework.web.bind.support.SessionStatus status,
javax.servlet.http.HttpServletRequest request,
org.springframework.ui.Model model)
Recoge los datos del fomulario y los valida para continuar con el registro del formulario
Parameters:
university - objeto University rellena del formulario
result - para devolver mensajes a la vista
status - con el estado de la petición
request model Returns:
vista a la que quiere devolversele el control
7.4.2.1.6 HomeController
@Controller
public class HomeController
extends java.lang.Object
Controlador de la página inicial (Buscador)
Author:
danielmf
124
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Fields:
private static Logger
logger
Operations:
@RequestMapping(value="/form")
public java.lang.String form()
Mapea las peticiones para el formulario de registro de los Servicios Web en la url /form
Returns:
@RequestMapping(value="/",
method=GET)
public java.lang.String home()
Filtra el tráfico inicial a la home
Returns:
@RequestMapping(value="/info")
public java.lang.String info()
Mapea las peticiones para la página de información en la url /info
Returns:
@RequestMapping(value="/retriever")
public java.lang.String retriever()
Mapea las peticiones para la información del Recolector de Becas en la url /retriever
Returns:
7.4.2.1.7 SearchEngineController
@Controller
public class SearchEngineController
extends java.lang.Object
Controlador del componente Buscador. Atenderá las peticiones que sean de su
responsabilidad mediante las direcciones filtradas en los métodos.
Author:
danielmf
Fields:
private static Logger logger
private ISearchView searchView
private ISearchViewNoScript searchViewNoScript
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
125
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
Operations:
@RequestMapping(value="/searchMin",
method=POST)
public java.lang.String search(@RequestParam(value="search_text"
)
java.lang.String search,
org.springframework.ui.Model model)
Filtra las peticiones del buscador que atiendan a la url /searchMin
Parameters:
search - parametro que llega del formulario
model - modelo para devolver la respuesta
Returns:
@RequestMapping(value="/search",
method=POST)
public java.lang.String searchNoScript(@RequestParam(value="sear
ch_text")
java.lang.String search,
org.springframework.ui.Model model)
Filtra las peticiones del buscador con el JavaScript desactivado en la url /search
Parameters:
search - parámetro que llega del formulario
model - modelo para devolver la respuesta
Returns:
7.4.2.1.8 SearchView
@Named
public class SearchView
extends java.lang.Object
implements ISearchView
Resuelve la vista del buscador mediante la implementación del patrón Command
Author:
Danielmf
Fields:
private SearchEngineService
126
searchEngine
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Operations:
public java.lang.String execute(java.lang.String search,
org.springframework.ui.Model model)
Specified by:
execute in interface ISearchView
7.4.2.1.9 CheckOperationsView
@Named
public class CheckOperationsView
extends java.lang.Object
implements ICheckOperationsView
Clase que implementa un patrón Command para resolver la vista de las operaciones
Author:
danielmf
Fields:
private static Logger
logger
private UniversityValidator
validator
privateWebServiceManagerService
webServiceManager
Operations:
public java.lang.String execute(javax.servlet.http.HttpServletRe
quest request,
es.uniovi.innova.eadministracion.tramites.swu.model.University u
niversity,
org.springframework.ui.Model model,
org.springframework.validation.BindingResult result)
Specified by:
execute in interface ICheckOperationsView
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
127
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
7.4.2.1.10
DetailView
@Named
public class DetailView
extends java.lang.Object
implements IDetailView
Resuelve la vista del detalle de la University mediante un Command
Author:
danielmf
Fields:
private static Logger logger
privateUniversityManagerService
universityService
Operations:
public java.lang.String execute(java.lang.Long id,
org.springframework.ui.Model model)
Specified by:
execute in interface IDetailView
7.4.2.1.11 MatchBecaView
@Named
public class MatchBecaView
extends java.lang.Object
implements IMatchBecaView
Resuelve la vista para el matcheador de la beca mediante un Command
Author:
danielmf
Fields:
privateMatcherManagerService
matcherService
private BecaWrapperValidator
validator
private WebServiceManagerService webServiceService
128
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Operations:
public java.lang.String execute(javax.servlet.http.HttpServletRe
quest request,
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.Beca
Wrapper beca,
org.springframework.ui.Model model,
org.springframework.validation.BindingResult result)
Specified by:
execute in interface IMatchBecaView
private java.util.Map<java.lang.String,java.lang.String> putAttr
ibutes(es.uniovi.innova.eadministracion.tramites.swu.model.wrapp
er.BecaWrapper beca)
Se encarga de meter en la session un Map con los atributos de la Beca
Parameters:
beca - recogida del formulario
Returns:
Map con el campo y el emparejamiento recogido en el formulario
7.4.2.1.12
MatchOperationsView
@Named
public class MatchOperationsView
extends java.lang.Object
implements IMatchOperationsView
Resuelve la vista para el emparejador de las operaciones
Author:
danielmf
Fields:
private BecaDirectorForm
builder
private static Logger logger
private MatcherManagerService
matcherService
private OperationsValidator operationsValidator
private WebServiceManagerService webServiceService
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
129
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
Operations:
public java.lang.String execute(javax.servlet.http.HttpServletRe
quest request,
java.lang.String modelo,
java.lang.String VC,
java.lang.String curso,
java.lang.String alumno)
Specified by:
execute in interface IMatchOperationsView
private java.lang.String setOperations(java.lang.String VC,
java.lang.String curso,
java.lang.String alumno,
java.util.Map<java.lang.String,java.lang.String> operations)
Comprueba y almacena en un Map las operaciones seleccionadas en el formulario
Parameters:
VC - operación que relaciona con el Vicerrectorado
curso - operación que relacion con el curso
alumno - operación que relaciona con el alumno
operations - mapa donde se almacenan las operaciones
Returns:
el nombre del paquete para recoger el modelo
7.4.2.1.13
SaveProcessView
@Named
public class SaveProcessView
extends java.lang.Object
implements ISaveProcessView
Resuelve la vista para el guardado del proceso de creación de una nueva universidad
Author:
danielmf
Fields:
private MatcherManagerService
matcherService
private UniversityManagerService
universityService
private SolicitanteWrapperValidator validator
130
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Operations:
@Transactional
public java.lang.String execute(javax.servlet.http.HttpServletRe
quest request,
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.Soli
citanteWrapper solicitante,
org.springframework.ui.Model model,
org.springframework.validation.BindingResult result)
Specified by:
execute in interface ISaveProcessView
private boolean joinable(java.lang.String key)
Comprueba si un match es compuesto
Parameters:
key - match
Returns:
si es compuesto o no
private java.util.Map<java.lang.String,java.lang.String> putAttr
ibutes(es.uniovi.innova.eadministracion.tramites.swu.model.wrapp
er.SolicitanteWrapper solicitante)
Crea un Map con los atributos del Solicitante
Parameters:
solicitante - recogido en el formulario
Returns:
el mapa con los atributos tras el match
private void setBeca(es.uniovi.innova.eadministracion.tramites.s
wu.model.University u,
java.lang.String modelo,
java.util.Map<java.lang.String,java.lang.String> fields_beca)
Guarda una beca recogida en el formulario
Parameters:
university modelo fields_beca -
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
131
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
private void setOperations(es.uniovi.innova.eadministracion.tram
ites.swu.model.University u,
java.util.Map<java.lang.String,java.lang.String> operations)
Guarda las operaciones recogidas previamente en el formulario
Parameters:
university operations - Map con las operaciones recogidas
private void setSolicitante(java.util.Map<java.lang.String,java.
lang.String> fields,
es.uniovi.innova.eadministracion.tramites.swu.model.University u
,
java.lang.String modelo)
Guarda un Solicitante recogido previamente en el formulario
Parameters:
fields - map con los campos del solicitante
university modelo private java.lang.String[] split(java.lang.String key)
Obtiene los campos de un match compuesto
Parameters:
key - match
Returns:
un Array con los matches
7.4.2.2
Modelo
7.4.2.2.1 Beca
public class Beca
extends java.lang.Object
Modelo que representa una Beca
Author:
danielmf
132
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Fields:
private String asunto_convocatoria
private Double cuantia_otorgada
private String curso_academico
private String destino
private String estado_solicitud
private String nombre_procedimiento_convocatoria
private Solicitante solicitante
7.4.2.2.2 Solicitante
public class Solicitante
extends java.lang.Object
Author:
danielmf
Fields:
private String apellido1_solicitante
private String apellido2_solicitante
private String documento_identificativo
private String estudios
private Integer fecha_nacimiento
private String nacionalidad
private String nombre_solicitante
private String sexo
private String tipo_documento_identificativo
7.4.2.2.3 University
@Entity
public class University
extends java.lang.Object
JavaBean que modela los datos recopilados de una Universidad
Author:
danielmf
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
133
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
Fields:
private Long id
private Set<ModelWrapper> modelsWrapper
private String name
private Set<OperationWrapper> operationsWrapper
private String personInCharge
private String wsdl
7.4.2.2.4 Vicerrectorado
public class Vicerrectorado
extends java.lang.Object
Modelo que representa un Vicerrectorado
Author:
danielmf
Fields:
private Long id
private String nombre
private String responsible
7.4.2.2.5 Constants
public class Constants
extends java.lang.Object
Clase que define constantes que se utilizan a lo largo de la aplicación
Author:
Danielmf
134
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Fields:
static String[] BECA
static String
INDEX
static String
MATCH
static String
MATCH_OPERATION_ALUMNO
static String
MATCH_OPERATION_CURSO
static String
MATCH_OPERATION_VICERRECTORADO
static String[] MODEL
static String
MODELCLASS
static String
NOSQL
static String[] OPS
static String[] SOLICITANTE
7.4.2.2.6 BecaWrapper
public class BecaWrapper
extends java.lang.Object
Envoltorio para utilizar Beca sin necesidad de utilizar sus agregados
Author:
danielmf
Fields:
private String asunto_convocatoria
private String cuantia_otorgada
private String curso_academico
private String destino
private String estado_solicitud
private String nombre_procedimiento_convocatoria
7.4.2.2.7 ModelWrapper
@Entity
public class ModelWrapper
extends java.lang.Object
Envoltorio para recoger los campos entre el modelo genérico y una University
Author:
danielmf
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
135
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
Fields:
private String clazz
private String concrete
private String join
private String match
private String modelClazz
private University university
7.4.2.2.8 OperationWrapper
@Entity
public class OperationWrapper
extends java.lang.Object
Modela una relación entre las operaciones de un wsdl y una University
Author:
danielmf
Fields:
private String match
private String op
private University
university
7.4.2.2.9 OperationWrapperDocument
public class OperationWrapperDocument
extends java.lang.Object
Envoltorio para las Operaciones de los servicios web
Author:
danielmf
Fields:
private String id
private String match
private String op
private Integer university
private String university_name
136
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
7.4.2.2.10
ParamsWrapper
public class ParamsWrapper
extends java.lang.Object
Envoltorio que almacena el tipo de argumentos que recibe un método y el tipo del
retorno
Author:
danielmf
Fields:
private List<java.lang.String> fields
private String return_
7.4.2.2.11
SolicitanteWrapper
public class SolicitanteWrapper
extends java.lang.Object
Envoltorio para un Solicitante
Author:
Danielmf
Fields:
private String apellido1_solicitante
private String apellido2_solicitante
private String documento_identificativo
private String estudios
private String fecha_nacimiento
private String nacionalidad
private String nombre_solicitante
private String sexo
private String tipo_documento_identificativo
7.4.2.2.12
HashDataService
public interface HashDataService
Fachada que define las operaciones de la capa de persistencia relativa a la base de
datos NoSQL.
Author:
Danielmf
Operations:
void init()
Carga el modelo inicial (solo se ejecuta una vez)
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
137
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
ModelWrapper queryModel(java.lang.String field,
java.lang.String modelClazz)
Busca matches previos relativos a ModelWrapper
Parameters:
field modelClazz Returns:
null o el match
OperationWrapper queryOps(OperationWrapper operationWrapper)
Busca matches previos relativos a OperationWrapper
Parameters:
operationWrapper Returns:
null o el match
void save(ModelWrapper modelWrapper)
Guarda en la base de datos NoSQL un match con el modelo
Parameters:
modelWrapper void save(OperationWrapper operationWrapper)
Guarda en la base de datos NoSQL un match con una operación
Parameters:
operationWrapper -
7.4.2.2.13
ModelWrapperDataService
@Named
public interface ModelWrapperDataService
extends
org.springframework.data.repository.CrudRepository<ModelWrapper,
ModelWrapperKey>
Capa
de
persistencia
que
encapsula
las
operaciones
de ModelWrapper mediante CrudRepository
Author:
Danielmf
138
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Operations:
@Query(name="ModelWrapper.findByUniversityClazz")
java.util.List<ModelWrapper> findByUniversityClazz(University un
iversity, java.lang.String clazz)
7.4.2.2.14
OperationsWrapperDataService
@Named
public interface OperationsWrapperDataService
extends
org.springframework.data.repository.CrudRepository<OperationWrap
per,OperationWrapperKey>
Capa
de
persistencia
que
encapsula
las
operaciones
de OperationWrapper mediante CrudRepository
Author:
danielmf
Operations:
java.util.List<OperationWrapper> findByMatch(java.lang.String ma
tch)
@Query(name="OperationWrapper.findByMatchAndUniversityId")
java.util.List<OperationWrapper> findByMatchAndUniversityId(java
.lang.String mode, java.lang.Long id)
java.util.List<OperationWrapper> findByUniversity(University uni
versity)
7.4.2.2.15
UniversityDataService
@Named
public interface UniversityDataService
extends
org.springframework.data.repository.CrudRepository<University,ja
va.lang.Long>
Inferface que implementa CrudRepository para gestionar las CRUD con la base de
datos del modelo University
Author:
danielmf
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
139
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
Operations:
University findByName(java.lang.String name)
Busca universidades por nombre
Parameters:
name - para identificar la Universidad
Returns:
University findByWsdl(java.lang.String wsdl)
Busca universidades por el WSDL
Parameters:
wsdl - url donde se alojan los servicios
Returns:
7.4.2.2.16
OperationsWrapperDocumentRepository
@Named
public interface OperationsWrapperDocumentRepository
extends
org.springframework.data.solr.repository.SolrCrudRepository<Oper
ationWrapperDocument,java.lang.String>
Interface que resuelve las operaciones de Spring Data Solr para la funcionalidad del
buscador.
Author:
Danielmf
Operations:
@Query(value="op:*?0* OR match:*?0* OR university_name:*?0*")
java.util.List<OperationWrapperDocument> findByMatchOrOp(java.la
ng.String keyword)
7.4.2.2.17
Helper
public class Helper
extends java.lang.Object
Helper para cargar las configuraciones y otros métodos de utilidad
Author:
danielmf
140
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Operations:
Public
static java.lang.String getClassName(java.lang.String classNameW
ithPackage)
Obtiene el nombre de una clase sin el paquete
Parameters:
classNameWithPackage Returns:
public
static java.lang.String getProperty(java.lang.String CONF_FILE,
java.lang.String key)
Obtiene una propiedad de un fichero de propiedades bajo una clave
Parameters:
CONF_FILE key Returns:
public
static java.lang.String retrieveCompleteName(java.lang.String cl
azzName)
Obtiene el paquete base de una clase bajo un servicio web.
Parameters:
clazzName Returns:
7.4.2.3 Publisher
7.4.2.3.1 ScholarshipManager
public class ScholarshipManager
extends java.lang.Object
Ofrece un servicio web para poder obtener becas de forma unificada
Author:
danielmf
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
141
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
Operations:
Public List<Beca> getBecasByParam(java.lang.Object param,
java.lang.String category, java.lang.String university)
Obtiene las becas en función de unos parametros
Parameters:
param category university Returns:
Listado de becas
7.4.2.4 Recolector
7.4.2.4.1 ShowBecasByAlumno
@Named
public class ShowBecasByAlumno
extends java.lang.Object
implements Executable
Presenta las becas de la categoría de Alumno
Author:
danielmf
Fields:
private String dni
private static Logger logger
private String universidad
private WebServiceManagerService webServiceService
Operations:
public void execute()
Description copied from interface: Executable
Método para asegurar que todas las clases de la capa de presentación pertenecen al
Command
Specified by:
execute in interface Executable
142
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
7.4.2.4.2 ShowBecasByCurso
@Named
public class ShowBecasByCurso
extends java.lang.Object
implements Executable
Presenta las becas generadas por la categoría de curso
Author:
danielmf
Fields:
private int curso
private static Logger logger
private String universidad
private WebServiceManagerService webServiceService
Operations:
public void execute()
Description copied from interface: Executable
Método para asegurar que todas las clases de la capa de presentación pertenecen al
Command
Specified by:
execute in interface Executable
7.4.2.4.3 ShowBecasByVicerrectorado
@Named
public class ShowBecasByVicerrectorado
extends java.lang.Object
implements Executable
Presenta las becas generadas por la categoría Vicerrectorado.
Author:
danielmf
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
143
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
Fields:
private static Logger logger
private String universidad
private Vicerrectorado vicerrectorado
private WebServiceManagerService webServiceService
Operations:
public void execute()
Description copied from interface: Executable
Método para asegurar que todas las clases de la capa de presentación pertenecen al
Command
Specified by:
execute in interface Executable
7.4.2.5 Registrador
7.4.2.5.1 CheckStatus
@Named
public class CheckStatus
extends java.lang.Object
implements Executable
Clase que comprueba la postcondición de la aplicación para no dejar datos
inconsistentes
Author:
danielmf
Fields:
private MatcherManagerService
private University
university
private UniversityManagerService
144
matcherService
universityService
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Operations:
public void execute()
Description copied from interface: Executable
Método para asegurar que todas las clases de la capa de presentación pertenecen al
Command
Specified by:
execute in interface Executable
7.4.2.5.2 Builder
@Named
public class Builder
extends java.lang.Object
implements Executable
Construye los resultados después de hacerse los matches
Author:
danielmf
Fields:
private static Logger logger
private MatcherManagerService matcherService
private Map< String, Object> matches
Operations:
public void execute()
Description copied from interface: Executable
Método para asegurar que todas las clases de la capa de presentación pertenecen al
Command
Specified by:
execute in interface Executable
7.4.2.5.3 MatchFields
@Named
public class MatchFields
extends java.lang.Object
implements Executable
Desencadena el matching de campos con las técnicas de String Metrics
Author:
danielmf
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
145
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
Fields:
private String clazz
private String field
private static Logger logger
private MatcherManagerService matcherService
private Map< String, Object> matches
private String modelClazz
private University university
Operations:
public void execute()
Description copied from interface: Executable
Método para asegurar que todas las clases de la capa de presentación pertenecen al
Command
Specified by:
execute in interface Executable
7.4.2.5.4 MatchOtherFields
@Named
public class MatchOtherFields
extends java.lang.Object
implements Executable
Termina de mapear los campos que no se emparejaron mediante StringMetrics y la
NoSQL
Author:
danielmf
Fields:
private String clazz
private String field
private Map< String, Object> matches
private String modelClazz
private University university
146
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Operations:
public void execute()
Description copied from interface: Executable
Método para asegurar que todas las clases de la capa de presentación pertenecen al
Command
Specified by:
execute in interface Executable
7.4.2.5.5 CreateUniversity
@Named
public class CreateUniversity
extends java.lang.Object
implements Executable
Crea una universidad en la base de datos
Author:
danielmf
Fields:
private University
university
private UniversityManagerService
universityService
private WebServiceManagerService webServiceService
Operations:
public void execute()
Description copied from interface: Executable
Método para asegurar que todas las clases de la capa de presentación pertenecen al
Command
Specified by:
execute in interface Executable
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
147
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
7.4.2.5.6 ListFields
@Named
public class ListFields
extends java.lang.Object
implements Executable
Lista los campos de una clase mediante introspección
Author:
danielmf
Fields:
private String clazzName
private List< String> fields
private WebServiceManagerService webserviceService
private String wsdl
Operations:
public void execute()
Description copied from interface: Executable
Método para asegurar que todas las clases de la capa de presentación pertenecen al
Command
Specified by:
execute in interface Executable
7.4.2.5.7 ListOperations
@Named
public class ListOperations
extends java.lang.Object
implements Executable
Obtiene las operaciones de un wsdl y descarta las no interesantes para la aplicación
Author:
Danielmf
148
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Fields:
private String choice
private static Logger logger
private MatcherManagerService
matcherService
private String modelo
private List<OperationWrapper>
operations
private List< String> ops
private University
university
private WebServiceManagerService webserviceService
Operations:
public void execute()
Description copied from interface: Executable
Método para asegurar que todas las clases de la capa de presentación pertenecen al
Command
Specified by:
execute in interface Executable
private void lastTry(es.uniovi.innova.eadministracion.tramites.s
wu.model.wrapper.OperationWrapper o)
throws java.io.IOException
Throws:
java.io.IOException
private java.util.List<java.lang.Integer> showOps(java.util.List
<java.lang.String> ops)throws java.io.IOException
Throws:
java.io.IOException
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
149
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
7.4.2.6 Service
7.4.2.6.1 BecaBuilder
public abstract class BecaBuilder
extends java.lang.Object
Constructor (Builder) en la jerarquía Builder, define las operaciones abstractas de
construcción que implementarán los concretos.
Author:
danielmf
7.4.2.6.2 BecaDirector
public class BecaDirector
extends java.lang.Object
Director de la jerarquía Builder en la construción de la Beca
Author:
danielmf
Fields:
private static BecaBuilder
builder
private static Logger logger
Operations:
public
static es.uniovi.innova.eadministracion.tramites.swu.model.Beca
build(java.util.List<es.uniovi.innova.eadministracion.tramites.s
wu.model.wrapper.ModelWrapper> models,
java.lang.Object beca)
Dirige las operaciones de construcción por partes
Parameters:
models - información en crudo
Returns:
Beca construida por partes
private static java.lang.Object getter(java.lang.Object beca,
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.Mode
lWrapper mw)
Obtiene matches de dentro del objeto
Parameters:
beca - sacada de la invocación del SW
mw - para hacer el emparejamiento
Returns:
el valor de la beca del emparejamiento
150
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
7.4.2.6.3 BecaDirectorForm
@Component
public class BecaDirectorForm
extends java.lang.Object
Builder para construir el modelo del formulario
Author:
Danielmf
Fields:
private ConcreteFormBecaBuilder builder
private static Logger logger
private MatcherManagerService matcherManager
Operations:
public es.uniovi.innova.eadministracion.tramites.swu.model.wrapp
er.BecaWrapper build(java.util.List<java.lang.String> fields)
Dirige las operaciones de construcción por partes
Parameters:
fields - información en crudo
Returns:
Beca construida por partes
public es.uniovi.innova.eadministracion.tramites.swu.model.wrapp
er.SolicitanteWrapper buildSol(java.util.List<java.lang.String>
fields)
7.4.2.6.4 ConcreteBecaBuilder
public class ConcreteBecaBuilder
extends BecaBuilder
Author:
Danielmf
Fields:
private Beca beca
private Solicitante
solicitante
7.4.2.6.5 ConcreteFormBecaBuilder
public class ConcreteFormBecaBuilder
extends BecaBuilder
Author:
Danielmf
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
151
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
Fields:
private Beca beca
private Solicitante
solicitante
7.4.2.6.6 MatcherManagerService
public interface MatcherManagerService
Fachada que define las operaciones de los matchers NoSQL y StringMetrics
Author:
danielmf
Operations:
void init()
Inicializa la base de datos con los datos necesarios
java.lang.String match(java.lang.String field,java.lang.String m
odelClazz)
Busca el campo más factible de casar con el modelo externo
Parameters:
field - campo externo
Returns:
campo del modelo propio con el que casa
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.Mode
lWrapper save(es.uniovi.innova.eadministracion.tramites.swu.mode
l.wrapper.ModelWrapper modelWrapper)
Guarda en la base de datos la relación para un campo
Parameters:
modelWrapper Returns:
modelWrapper con id
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.Oper
ationWrapper save(es.uniovi.innova.eadministracion.tramites.swu.
model.wrapper.OperationWrapper operationWrapper)
Guarda la Operacion en la base de datos
Parameters:
operationWrapper Returns:
operationWrapper con id
152
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
boolean checkStatus(es.uniovi.innova.eadministracion.tramites.sw
u.model.University university)
Comprueba si la base de datos tiene operaciones relativas a una University para
temas de consistencia
Parameters:
universidad Returns:
void delete(es.uniovi.innova.eadministracion.tramites.swu.model.
wrapper.ModelWrapper m)
Borra un match entre campos
Parameters:
mvoid delete(es.uniovi.innova.eadministracion.tramites.swu.model.
wrapper.OperationWrapper op)
Borra un match entre operaciones
Parameters:
op -
7.4.2.6.7 OperationsWrapperService
public interface OperationsWrapperService
Operaciones necesarias para Spring Data Solr y que alimentan al buscador
Author:
danielmf
Operations:
void addToIndex(es.uniovi.innova.eadministracion.tramites.swu.mo
del.wrapper.OperationWrapper operationWrapper)
Añade al indice una operación
Parameters:
operationWrapper void deleteFromIndex(es.uniovi.innova.eadministracion.tramites.s
wu.model.wrapper.OperationWrapper operationWrapper)
Borra del índice una operación
Parameters:
operationWrapper -
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
153
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
java.util.List<es.uniovi.innova.eadministracion.tramites.swu.mod
el.wrapper.OperationWrapperDocument> search(java.lang.String key
word)
Realiza la busqueda en función de una palabra clave
Parameters:
keyword Returns:
7.4.2.6.8 SearchEngineService
public interface SearchEngineService
Fachada que define las operaciones del Servicio de Buscador
Author:
danielmf
Operations:
java.util.List<es.uniovi.innova.eadministracion.tramites.swu.mod
el.wrapper.OperationWrapper> searchOperations(java.lang.String s
earch)
Busca operaciones en la base de conocimiento y en la base de datos
Parameters:
search - servicio a buscar
Returns:
lista de operaciones y de operaciones relacionadas
es.uniovi.innova.eadministracion.tramites.swu.model.University s
earchUniversities(java.lang.String search)
Busca universidades en la base de datos
Parameters:
search - universidad a buscar
Returns:
lista de universidades relacionadas
7.4.2.6.9 UniversityManagerService
public interface UniversityManagerService
Fachada que define las operaciones del modelo de la University
Author:
danielmf
154
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Operations:
es.uniovi.innova.eadministracion.tramites.swu.model.University s
ave(es.uniovi.innova.eadministracion.tramites.swu.model.Universi
ty university)
Almacena una University en la Base de Datos
Parameters:
university void remove(es.uniovi.innova.eadministracion.tramites.swu.model.
University university)
Borra una University de la Base de Datos
Parameters:
university es.uniovi.innova.eadministracion.tramites.swu.model.University f
indUniversity(java.lang.Long id)
Obtiene una University por ID
Parameters:
id Returns:
es.uniovi.innova.eadministracion.tramites.swu.model.University f
indUniversityByWsdl(java.lang.String wsdl)
Obtiene una University a partir de un wsdl
Parameters:
wsdl Returns:
es.uniovi.innova.eadministracion.tramites.swu.model.University f
indUniversityByName(java.lang.String name)
Obtiene una University a partir de un nombre
Parameters:
name Returns:
7.4.2.6.10
WebServiceManagerService
public interface WebServiceManagerService
Fachada que define las operaciones relativas a interoperabilidad con Servicios Web
Author:
danielmf
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
155
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Implementación del Sistema
Operations:
java.util.List<java.lang.String> getOperations(java.lang.String
wsdl)
Obtiene las operaciones de un Servicio Web
Parameters:
wsdl Returns:
Listado de operaciones
java.lang.Object connect(java.lang.String wsdl,
java.lang.String method,
java.lang.Object[] args,
java.lang.ClassLoader classLoader)
throws java.lang.Exception
Realiza una inovcación genérica a un método definido en un WSDL.
Parameters:
wsdl method args - array de objects
classLoader Returns:
Throws:
java.lang.Exception
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.Para
msWrapper getOperationIOs(java.lang.String wsdl,
java.lang.String clazzName)
throws java.lang.ClassNotFoundException
Obtiene los parámetros de una clase (argumentos de entrada de un método del WSDL
y el retorno).
Parameters:
wsdl clazzName - completo con el paquete
Returns:
ParamsWrapper envoltorio con los parámetros
Throws:
java.lang.ClassNotFoundException
156
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Implementación del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
java.util.List<java.lang.String> getClassFields(java.lang.String
clazzName,
java.lang.String wsdl)
Obtiene los atributos de una clase dada
Parameters:
clazzName Returns:
Listado de strings con los atributos
java.util.List<es.uniovi.innova.eadministracion.tramites.swu.mod
el.Beca> getBecasByParam(java.lang.Object param,
java.lang.String mode)
Invoca a los métodos de los Servicios Web recopilados en el recolector según el tipo
de método
Parameters:
param - Parámetro que se pasa al método del Servicio Web
mode - tipo de método
Returns:
Listado de Beca recopiladas
java.util.List<es.uniovi.innova.eadministracion.tramites.swu.mod
el.Beca> getBecasByParam(java.lang.Object param,java.lang.String
mode,java.lang.String university)
Invoca a lso métodos de los Servicios Web recopilados en el recolector según el tipo
de método y la universidad
Parameters:
param - Parámetro que se pasa al método del Servicio Web
mode - Tipo de método
university - Nombre de la universidad
Returns:
Listado de Beca recopiladas
7.4.2.6.11
GenericException
public class GenericException
extends java.lang.RuntimeException
Excepción genérica para recogerla en las vistas del sitio web y mostrar mensajes
personalizados de error
Author: danielmf
Fields:
protected String msg
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
157
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Desarrollo de las Pruebas
Capítulo 8.
Desarrollo de las Pruebas
8.1 Pruebas Unitarias
Si se quiere comprobar esto, se puede realizar ejecutando las pruebas con la herramienta JUnit
y para hacerlo de forma más sencilla, se ha realizado una Suite que facilita el trabajo de
comprobación de los tests.
Ilustración 73. Test. Resultados del procesamiento de Tests
158
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Desarrollo de las Pruebas | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
8.2 Pruebas de Integración y del Sistema
Para comprobar las pruebas de integración y de sistema, en este proyecto se ha comprobado
que todo funcionara de forma correcta.
Las pruebas unitarias son ya una prueba de integración y del sistema puesto que en ellas se
interconectan todos los componentes y en mayor o menor medida las pruebas utilizan varios
componentes que están interconectados entre sí.
Además se ha comprobado por otra parte, el gasto en memoria que supone tener el sistema
corriendo dentro de un solo ordenador.
RAM: 1.2 GB + 570 MB + 223 MB + 158 MB = 2.2 GB aprox.
Como se puede comprobar la aplicación es bastante pesada, aunque si se tiene en cuenta que
los 1.2 GB del inicio son de SpringToolSuite y del Apache Tomcat que alberga las aplicaciones
del buscador y del publicador con los servicios web disponibles.
Los 570 MB son destinados a un segundo servidor de aplicaciones Jetty con la aplicación de
Apache Solr y los 223 MB de la base de datos NoSQL Apache Cassandra.
Finalmente los 158 MB restantes son de la aplicación ejecutándose.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
159
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Desarrollo de las Pruebas
8.3 Pruebas de Usabilidad y Accesibilidad
8.3.1
Pruebas de Usabilidad
Debido al perfil de la aplicación, no va a ser utilizada por cualquier usuario. El usuario que
utilice esta aplicación será responsable del registro de la Universidad a la que representa con
lo que se da por supuesto que tendrá unos conocimientos informáticos avanzados.
8.3.1.1 Usuario 1
El usuario 1 es un ingeniero informático superior, con amplios conocimientos informáticos y
que tiene a cargo un equipo de desarrolladores en el servicio de informática de su Universidad.
Además está acostumbrado a trabajar con arquitecturas orientadas a servicio con lo que sus
conocimientos en servicios web son amplios.
¿Usa un ordenador frecuentemente?
Todos los días
¿Qué tipo de actividades realiza con el ordenador?
Es parte de mi trabajo o profesión
¿Ha usado alguna vez software como el de esta prueba?
No, nunca
¿Qué busca principalmente en un programa?
Que tenga todas las funciones necesarias
¿Qué tipo de programas suele utilizar en el ordenador?
Otros
¿Está acostumbrado a navegar por internet con el teléfono móvil?
Sí
¿Posee conocimientos de programación?
1. Sí
Facilidad de Uso
Siempre
¿Sabe dónde está dentro de la
aplicación?
¿Existe ayuda para las funciones
en caso de que tenga dudas?
¿Le resulta sencillo el uso de la X
aplicación?
160
Frecuentemente
X
Ocasionalmente
Nunca
X
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Desarrollo de las Pruebas | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Funcionalidad
Siempre Frecuentemente Ocasionalmente Nunca
¿Funciona cada tarea como usted X
espera?
¿El tiempo de respuesta de la
X
aplicación es muy grande?
¿Han sido útiles los mensajes de X
error?
¿Han sido útiles los indicadores?
X
¿Ha sido útil la ayuda?
X
Calidad del Interfaz
Muy
Poco
Nada
Aspectos gráficos
Adecuado
Adecuado
Adecuado
Adecuado
El tipo y tamaño de letra es
X
Los iconos e imágenes usados son
X
Los colores empleados son
X
Diseño de la Interfaz
Si
No
A veces
¿Le resulta fácil de usar?
X
¿El diseño de las pantallas es claro y X
atractivo?
¿Cree que el programa está bien X
estructurado?
¿Se ha adaptado el diseño adecuadamente a X
su dispositivo?
Observaciones
La aplicación web es simple e intuitiva.
Ilustración 74. Pruebas. Cuestionario Usuario 1
8.3.1.2 Usuario 2
El segundo usuario que se puso a disposición de cubrir el test es una egregada en informática
del Software de 23 años que todavía no tiene el grado terminado. Nunca ha trabajado con
servicios web, tan sólo los ha visto a nivel académico. El entorno laboral lo conoce sólo a través
de una beca que está disfrutando en estos momentos en la Universidad, pero ha sido
designada para realizar la tarea.
¿Usa un ordenador frecuentemente?
Todos los días
¿Qué tipo de actividades realiza con el ordenador?
Es parte de mi trabajo o profesión
¿Ha usado alguna vez software como el de esta prueba?
No, nunca
¿Qué busca principalmente en un programa?
Que sea intuitivo
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
161
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Desarrollo de las Pruebas
¿Qué tipo de programas suele utilizar en el ordenador?
Otros
¿Está acostumbrado a navegar por internet con el teléfono móvil?
Sí
¿Posee conocimientos de programación?
Sí
Ilustración 75. Pruebas. Cuestionario Usuario 2
Facilidad de Uso
Siempre Frecuentemente
¿Sabe dónde está dentro de la
X
aplicación?
¿Existe ayuda para las funciones
X
en caso de que tenga dudas?
¿Le resulta sencillo el uso de la
X
aplicación?
Funcionalidad
Siempre Frecuentemente
¿Funciona cada tarea como usted
X
espera?
¿El tiempo de respuesta de la
aplicación es muy grande?
¿Han sido útiles los mensajes de X
error?
¿Han sido útiles los indicadores?
X
¿Ha sido útil la ayuda?
X
Calidad del Interfaz
Muy
Aspectos gráficos
Adecuado
Adecuado
El tipo y tamaño de letra es
X
Los iconos e imágenes usados son
X
Los colores empleados son
X
Diseño de la Interfaz
Si
¿Le resulta fácil de usar?
X
¿El diseño de las pantallas es claro y X
atractivo?
¿Cree que el programa está bien X
estructurado?
¿Se ha adaptado el diseño adecuadamente a X
su dispositivo?
Observaciones
Nada que añadir.
162
Ocasionalmente
Nunca
Ocasionalmente
Nunca
X
Poco
Adecuado
Nada
Adecuado
No
A veces
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Desarrollo de las Pruebas | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
8.3.1.3 Responsable de Calidad
8.3.1.3.1 Usuario 1
Aspecto Observado
El usuario comienza a trabajar de
forma rápida por las tareas
Tiempo en realizar cada tarea
Errores leves cometidos
Notas
Sin ningún problema. Ha registrado el servicio web sin
problemas y no ha necesitado ayuda en ningún momento.
Menos de 5 minutos.
Intentar introducir el nombre del paquete en el modelo a
registrar.
Errores graves cometidos
Ninguno
El usuario ha preguntado
Nada
Ilustración 76. Pruebas. Cuestionario Responsable Calidad
8.3.1.3.2 Usuario 2
Aspecto Observado
El usuario comienza a trabajar de
forma rápida por las tareas
Tiempo en realizar cada tarea
Errores leves cometidos
Errores graves cometidos
Notas
Al principio se le vio dubitativa, no enfocaba bien las
tareas.
Más de 5 minutos
Ninguno
No introducir de forma correcta la dirección del WSDL,
pues introdujo la dirección del Servicio en lugar del
fichero.
El usuario ha preguntado
Frecuentemente, no parecía saber qué estaba haciendo o
no tener los conocimientos necesarios.
Ilustración 77. Pruebas. Cuestionario Responsable Calidad 2
8.3.2
Pruebas de Accesibilidad (WCAG 2.0)
8.3.2.1 Nivel A
WCAG
2.0
1.1.1
1.2.1
1.2.2
1.2.3
1.3.1
1.3.2
1.3.3
Titulo
Contenido no textual
Solo audio y solo
vídeo (grabado)
Subtítulos
(grabados)
Audiodescripción o
medio
alternativo
(grabado)
Información
y
relaciones
Secuencia
significativa
Características
sensoriales
Comentarios
Si
No
N/A
X
X
X
X
X
X
X
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
163
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Desarrollo de las Pruebas
WCAG
2.0
1.4.1
Titulo
1.4.2
Control del audio
X
2.1.1
Teclado
X
2.1.2
Sin trampas para el
foco del teclado
Tiempo ajustable
2.2.1
2.2.2
Comentarios
Uso del color
Si
X
X
2.4.1
2.4.2
Titulado de páginas
X
2.4.3
Orden del foco
X
2.4.4
Propósito de los
X
enlaces
(en
contexto)
Idioma de la página
Está internacionalizada pero cuando
cambia el idioma, el <html lang>
siempre es el mismo.
3.1.1
X
X
X
3.2.1
Al recibir el foco
X
3.2.2
Al recibir entradas
X
3.3.1
Identificación
errores
Etiquetas
instrucciones
Procesamiento
3.3.2
4.1.1
4.1.2
Nombre,
valor
N/A
X
Poner en pausa,
detener, ocultar
Umbral de tres
destellos o menos
Evitar bloques
No se aplica el saltado de contenido.
2.3.1
No
de Mediante mensajes de alerta
o
X
X
X
X
función,
X
Ilustración 78. Nivel A Accesibilidad
164
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Desarrollo de las Pruebas | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
8.3.2.2 Nivel AA
WCAG
2.0
1.2.4
Titulo
Comentarios
Si
1.4.5
Sub
títulos
(en
directo)
Audiodescripción
(grabado)
Contraste (mínimo)
Cambio de tamaño
del texto
Imágenes de texto
2.4.5
Múltiples vías
2.4.6
2.4.7
Encabezados
etiquetas
Foco visible
3.1.2
Idioma de las partes
3.2.3
Navegación
X
coherente
Identificación
X
coherente
Sugerencias
ante
X
errores
Prevención
de Se debe introducir un apartado de
errores
(legales, Accesibilidad.
financieros, datos)
Ilustración 79. Nivel AA Acesibilidad
1.2.5
1.4.3
1.4.4
3.2.4
3.3.3
3.3.4
No
N/A
X
X
X
X
X
Se puede tener en cuenta la página de X
información como un Mapa Web.
y
X
X
X
X
8.3.2.3 Nivel AAA
WCAG
2.0
1.2.6
1.2.7
1.2.8
1.2.9
1.4.6
1.4.7
1.4.8
Titulo
Comentarios
Lengua de señas
(grabado)
Audiodescripción
ampliada (grabada)
Medio
alternativo
(grabado)
Solo
audio
(en
directo)
Contraste
No cumple el ratio exigido.
(mejorado)
Sonido de fondo bajo
o ausente
Presentación visual
Si
No
N/A
X
X
X
X
X
X
X
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
165
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Desarrollo de las Pruebas
WCAG
2.0
Titulo
1.4.9
2.2.3
Imágenes de texto
(sin excepciones)
Teclado
(sin
excepciones)
Sin tiempo
2.2.4
Interrupciones
X
2.2.5
Re-autentificación
X
2.3.2
Tres destellos
X
2.4.8
Ubicación
2.4.9
3.1.3
Propósito de los
enlaces
(sólo
enlaces)
Encabezados
de
sección
Palabras inusuales
3.1.4
Abreviaturas
3.1.5
Nivel de lectura
3.1.6
Pronunciación
3.2.5
Cambios a petición
3.3.5
Ayuda
3.3.6
Prevención
errores (todos)
2.1.3
2.4.10
Comentarios
Si
No
N/A
X
X
X
No existen unas migas de pan para
ubicar al usuario.
X
X
X
X
X
X
X
X
X
de
X
Ilustración 80. Nivel AAA Acesibilidad
166
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Desarrollo de las Pruebas | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
8.4 Pruebas de Rendimiento
Las pruebas de rendimiento que se han realizado han sido básicas. Se han tomado tiempos y se
ha comprobado el consumo que tendría la aplicación (en MB descargados) por las
herramientas de desarrollador de cualquier navegador web (Mozilla Firefox o Google Chrome).
En un registro de un servicio web nuevo se realizan 99 peticiones al servidor por recursos (JS,
CSS, HTML…) con un total de 63.2 KB en 277ms. Como se puede comprobar es una aplicación
muy ligera (todos los ficheros de recursos JS están minificados con lo que su tamaño es casi
residual). El proceso de registro del servicio web tarda alrededor de 2 minutos.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
167
Manuales del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Capítulo 9. Manuales del Sistema
9.1 Manual de Instalación
Para comenzar con la instalación del sistema lo primero que hay que hacer es instalar las
herramientas de soporte que hacen falta para la aplicación.
9.1.1
PostgreSQL
Como cualquier aplicación web de hoy en día, hay que instalar un sistema gestor de bases de
datos, en esta aplicación se ha optado por utilizar PostgreSQL, pero puede ser sustituida por
cualquier otra, siendo conscientes que hay que realizar una serie de cambios en la aplicación
(fichero database.properties y persistence.xml para cambiar el driver de Postgre al utilizado,
además de IP del servidor, base de datos, nombre de usuario y contraseña).
Se puede descargar de aquí la versión que más se ajuste a nuestro sistema operativo:
http://www.enterprisedb.com/products-services-training/pgdownload#windows
Una vez instalada la base de datos, desde el gestor que incluye (seguir el wizard), hay que crear
la base de datos “universidades” y asignárselo a un usuario que crearemos (preferiblemente
distinto a postgres). No es necesario crear las tablas, pues de eso ya se encargará de hacerlo
JPA automáticamente.
9.1.2
Apache Cassandra
Una vez instalado el sistema gestor de bases de datos relacionales, hay que instalar el de la
NoSQL Clave-Valor y en este caso se ha decidido utilizar Cassandra. En este caso sí hay
dependencia de la base de datos con lo que no hay más remedio que utilizar esta.
Se
puede
descargar
la
versión
2.0.6
que
es
la
utilizada
aquí
http://www.apache.org/dyn/closer.cgi?path=/cassandra/2.0.8/apache-cassandra-2.0.8bin.tar.gz
:
Una vez descomprimido el archivo, hay que ejecutar el archivo cassandra.bat que está en la
carpeta bin del directorio descomprimido. Esto arrancará la base de datos en modo servidor y
ya estará disponible para su uso.
Cuando esté arrancada, hay que ir a la aplicación y ejecutar la clase CassandraSetUp que lo que
generará será las estructuras necesarias para soportar la aplicación en Cassandra (similar a lo
que haría JPA automáticamente).
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
169
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Manuales del Sistema
9.1.3
Apache Solr
Cuando ya tenemos la persistencia instalada, debemos descargar el servidor de búsqueda que
vamos a utilizar en la aplicación. Se puede descargar su versión 4.7.2 de aquí:
http://www.apache.org/dyn/closer.cgi/lucene/solr/4.7.2
Una vez descargada, se ha de descomprimir. Una vez descomprimida la carpeta, se ha de
navegar por el interior de la aplicación y sustituir el archivo schemas.xml (solr4.7.2/example/solr/collection1/conf/) por el que se adjunta como anexo en esta
documentación para ajustar los índices del buscador a los de la aplicación. Una vez está
sustituido el archivo, se ha de ir a solr-4.7.2/example y ejecutar java –jar start.jar para arrancar
el servidor Jetty que tiene Lucene instalado ya con las estructuras de la aplicación.
9.1.4
Apache Tomcat 7
Con toda la estructura ya en marcha, sólo queda desplegar la aplicación dentro de un
contenedor de aplicaciones. En este caso se ha elegido Apache Tomcat 7
(http://apache.rediris.es/tomcat/tomcat-7/v7.0.54/bin/apache-tomcat-7.0.54.zip) y bastará
con arrancar el archivo startup.bat para levantar el servidor. Una vez arrancado, se deberá
introducir el archivo buscador.war en la carpeta webapps del servidor además del
publisher.war para que se desplieguen.
9.1.4.1 Apache CXF
Es posible que sea necesario introducir los jars de apache CXF dentro de apache tomcat para
que se ejecuten los servicios web.
Con esto ya tendríamos nuestras aplicaciones desplegadas en el servidor local.
Si por el contrario, queremos hacerlo desde un Entorno de Desarrollo, se puede utilizar Maven
para automatizar el proceso. Con ejecutar maven clean install, se descargará todo lo necesario
(a partir del paso de Apache Solr inclusive, se tienen que hacer de todas formas) para ejecutar
la aplicación y tenerla disponible. Esto generará dos ficheros war (los antes mencionados) para
subirlos al servidor.
170
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Manuales del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
9.2 Manual de Ejecución
Al ser una aplicación web no es necesario un manual de ejecución puesto que se desplegará
automáticamente en el servidor, para instalarlo, sigua el manual anterior.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
171
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Manuales del Sistema
9.3 Manual de Usuario
Una vez la aplicación ya se encuentra instalada en un servidor y desplegada, el paso a
continuación es utilizarla. Este manual servirá para introducir los conceptos más básicos a la
persona que vaya a registrar y utilizar la aplicación web.
Para
comenzar,
se
deberá
visitar
desde
el
navegador
la
dirección
http://localhost:8080/buscador (o donde se encuentre desplegada la aplicación). Lo primero
que se ve nada más entrar es la pantalla de bienvenida, que nos mostrará un buscador que
todavía no servirá de mucho, pues no hay ningún dato cargado al inicio.
Antes de utilizarlo, se deben cargar datos, con lo que para registrar la universidad se debe de
pulsar sobre sobre el menú superior en el apartado “Registrador de SW”.
Esto dirigirá al usuario a una página con un formulario dividido en 5 pasos, donde el primero
de ellos será introducir los datos de la universidad que se va a registrar (nombre, responsable y
url del servicio web).
Una vez se continúa a la siguiente pantalla, se deberá seleccionar a qué categoría pertenece
cada uno de los métodos del servicio web, y además, el nombre (solo el nombre, sin el
paquete) del modelo que incluye la beca y el solicitante.
La siguiente pantalla ya estará autorellenada, el sistema propondrá una serie de sugerencias
para el autocompletado del formulario que el usuario deberá de corregir en caso de que no
sean correctos los emparejamientos de los campos entre los propuestos y los del servicio web
que se está registrando.
Por último, habrá que repetir el paso anterior, pero esta vez con los campos del Solicitante en
lugar de la Beca. Cuando están todos los campos obligatorios cubiertos, se ha de confirmar el
registro que concluirá con una pantalla informativa del éxito del registro.
Para comprobar que el servicio se ha registrado correctamente, se puede utilizar el buscador
para encontrar lo que se acaba de registrar. El buscador se puede utilizar para encontrar
operaciones de servicios web por categoría, por nombre del servicio web, por nombre de la
universidad…
Esto resultará en un listado de resultados, que una vez seleccionado el que más satisfaga los
intereses del usuario, llevará a un detalle de la universidad, donde se mostrará la URL del
servicio web además de los métodos de la universidad por si se quieren utilizar o son de
interés.
Debido a que son temas programáticos, el uso del recolector se describirá en el manual del
programador.
172
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Manuales del Sistema | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
9.4 Manual del Programador
Para utilizar el publicador, se ha de consumir su servicio web como si se tratara de un servicio
web común.
Este servicio web ofrece dos opciones para el método:

getBecasByParam(Object param, String category, String university).
Una es pasando la Universidad a null. De esta forma se consigue aplicar el parámetro y la
categoría seleccionada a TODOS los servicios web registrados en la aplicación. Por el contrario,
si se quere obtener los resultados de una sola universidad, se ha de pasar como parámetro el
nombre de la universidad (como viene en la página web del buscador).
Si por el contrario lo que se quiere es extender la aplicación, es probable que aunque no sea
trivial, sí que es posible cambiar el ámbito en el que está centrado. Es decir, con muy pocos
cambios se debería de poder hacer o bien parametrizable para que sirva para cualquier
dominio o bien adaptarse para utilizarse con ese fin.
Lo básico será modificar los modelos relacionados con la universidad e introducir los del nuevo
ámbito, modificar las categorías (Vicerrectorado, Alumno y Curso) y modificar los archivos web
para que la página se adapte al nuevo dominio (script.js, Controllers…).
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
173
Conclusiones y Ampliaciones | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Capítulo 10. Conclusiones
Ampliaciones
y
10.1 Conclusiones
Realizar un Proyecto Fin de Máster es una tarea muy dura. Si además lo compaginas con una
jornada laboral completa se hace más complicado todavía. La cantidad de tiempo que se le
puede dedicar siempre es limitada, los plazos se ajustan al límite y cualquier fallo que cometas
puede resultar en una semana de trabajo de retraso.
Si bien el enfoque que se tomó para realizar este proyecto fue realizarlo con mucho adelanto
para poder tener márgenes de tiempo holgados al final cuando se mira el trabajo realizado es
mucho pero siempre se puede mejorar o se puede tener una sensación agridulce cuando todas
esas cosas que se plantean para realizar en un inicio se tienen que cortar por falta de tiempo.
Si se ha de destacar alguna cosa buena, desde luego es la gran cantidad de tecnologías que se
han probado / utilizado en la realización de este proyecto. Algunas experimentales, otras más
consolidadas pero TODAS han sido utilizadas de forma nunca antes vistas por el autor.
Especialmente ha sido satisfactorio utilizar un motor de búsqueda como Apache Solr (Lucene)
o realizar una experiencia de usuario completamente opuesta a la que se ve en el Máster de
Ingeniería Web, es decir, de unas transiciones con recargas de páginas pesadas y poco fluidas a
unas peticiones AJAX que son transparentes para el usuario y que tan de moda está.
Las sensaciones generales de cómo se ha terminado el producto son buenas, cumple su
cometido por el que está desarrollado y servirá de base para realizar una serie de trabajos
futuros muy interesantes a nivel académico.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
175
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Conclusiones y Ampliaciones
10.2 Ampliaciones
Si bien el sistema a la hora de realizar el emparejamiento de campos se comporta de forma
correcta, una de las posibles ampliaciones a realizar sería realizar algo más de trabajo en este
apartado. Para comenzar, se podría pensar en el emparejamiento de campos que ahora se
realiza en la aplicación de las reglas String Metrics y en los emparejamientos previos que se
han realizado.
El trabajo a realizar a partir de aquí sería pensar en el modelo en tres pasos: el primero sería el
que se está realizando tratando los nombres de campos y los otros dos serían tratar el
contenido de los campos que recibimos. A estos contenidos se les podrían aplicar sistemas de
clasificación como puede ser clustering, redes neuronales, algoritmos de los K-vecinos… y
conseguir recoger más información que ayudase al sistema que ya está construido. La última
parte sería la aplicación de reglas de decisión del tipo si cumple estas condiciones, es esta
categoría donde serían especialmente útiles patrones o expresiones regulares para
reconocerlos en los contenidos recibidos.
Otra ampliación que sería muy factible de realizar sería securizar el servicio web que se ofrece
(y la aplicación también) ya que se tratan de datos sensibles, de esta forma se debería de pedir
un usuario y una contraseña en el formulario de registro para poder autenticarse contra los
servicios web de otras universidades.
Si no se quiere realizar la securización de esa forma, se puede incluir dentro de un ESB, de esta
forma el sistema podría monitorizarse y controlar los accesos para conocer estadísiticas,
además de securizarse.
Por último, otra de las ampliaciones factibles de realizar sería la inclusión de tipos complejos a
la hora de realizar el trabajo con los servicios web pues habría que montar una estructura
excesivamente compleja pero que daría un resultado fantástico.
176
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Presupuesto | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
Capítulo 11. Presupuesto
Concepto
Descripción
Licencias Micrososft Windows 7 Professional
Microsoft Office 2010
Enterprise Architect
Microsoft Project 2010
Java
Apache Commons
Cassandra
PostgreSQL
Ubuntu Server 12.04
Desarrollo Trabajo Previo
Componente Registrador
Componente Recolector
Componente Buscador
Componente Publicador
Entrega de aplicación
Formación Usuarios
Programadores
Administradores
Otros
Instalación
Reuniones
Precio(€)
134,00 €
379,00 €
199,00 €
1.067,00 €
- €
- €
- €
- €
- €
18.000,00 €
21.500,00 €
8.500,00 €
25.000,00 €
9.000,00 €
600,00 €
50,00 €
50,00 €
50,00 €
200,00 €
100,00 €
TOTAL (sin IVA)
TOTAL (con 21% IVA)
Tabla 20. Presupuesto. Detalle del Presupuesto
Ítem
1
2
3
4
5
6
7
8
9
10
Descripción
Programador 1
Programador 2
Programador 3
Programador 4
Analista 1
Analista 2
Tester 1
Diseñador 1
Administrador de Sistemas 1
Jefe de Proyecto 1
Cantidad
10
10
10
10
1
8
1
1
1
1
1
1
1
1
1
10
5
2
1
6
Cantidad
393
297
369
313
136
128
120
136
10
120
Precio(€)
35,00 €
35,00 €
35,00 €
35,00 €
55,00 €
55,00 €
40,00 €
30,00 €
35,00 €
74,00 €
TOTAL (sin IVA)
TOTAL (con 21% IVA)
Tabla 21. Presupuesto. Personal implicado
Subtotal(€)
1.340,00 €
3.790,00 €
1.990,00 €
10.670,00 €
- €
- €
- €
- €
- €
18.000,00 €
21.500,00 €
8.500,00 €
25.000,00 €
9.000,00 €
600,00 €
500,00 €
250,00 €
100,00 €
200,00 €
600,00 €
102.040,00 €
123.468,40 €
Subtotal(€)
13.755,00 €
10.395,00 €
12.915,00 €
10.955,00 €
7.480,00 €
7.040,00 €
4.800,00 €
4.080,00 €
350,00 €
8.880,00 €
80.650,00 €
97.586,50 €
En los presupuestos que se presentan, están desglosados los ítems genéricos del primer
presupuesto. De esta forma, se puede ver que hay dinero dedicado a licencias (algunas de las
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
177
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Presupuesto
que se incluyen son a coste cero), el precio por componente desarrollado, el dinero destinado
a formación y a otros gastos como pueden ser desplazamiento y tiempo de reuniones e
instalación del sistema. Además también se adjunta un segundo presupuesto que describe el
costo de recursos humanos dentro del proyecto, que sería aplicable como una mayor
descripción del primero.
Los gastos derivados del desarrollo como pueden ser autónomos, gastos de electricidad, de
uso de equipos y demás han sido distribuidos a lo largo de los componentes, para que de esta
forma no se tengan conceptos extraños dentro del presupuesto.
178
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Referencias Bibliográficas | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
Capítulo 12. Referencias
Bibliográficas
12.1 Libros y Artículos
[Athena] “Advanced Technologies for Interoperability of Heterogeneous Enterprise Networks
and their Applications” – Athena.
[Cohen] “A Comparison of String Distance Metrics for Name-Matching Tasks” – William W.
Cohen et alumni.
[Heimans] “ONTOLOGY REASONING WITH LARGE DATA REPOSITORIES” – Stijn Heimans et
alumni.
[Henb] “A Database Backend for OWL” - Jorg Henb, Joachim Kleb, Stephan Grimm, Jurgen
Bock.
[LePendu] “Ontology Database: A New Method for Semantic Modeling and an Application to
Brainwave Data” - Paea LePendu, Dejing Dou, Gwen A. Frishkoff, Jiawei Rong.
[Meditskos] “Combining a DL Reasoner and a Rule Engine for Improving Entailment-based
OWL Reasoning” - Georgios Meditskos, Nick Bassiliades.
[Minerva] “Minerva: A Scalable OWL Ontology Storage and Inference System” - Jian Zhou, Li
Ma, Qiaoling Liu, Lei Zhang, Yong Yu, Yue Pan.
[Oracle] “ORACLE SPATIAL AND GRAPH RDF SEMANTIC GRAPH” – Oracle.
[Parsia] “The OWL-S Experience (are you experienced?)” - Bijan Parsia, Evren Sirin, James
Hendler.
[Srinivasan] “Adding OWL-S to UDDI, implementation and throughput” – Naveen Srinivasan,
Massimo Paolucci, Katia Sycara.
[Stanford] “Semantic Web Services” - Sheila A. McIlraith, Tran Cao Son, Honglei Zeng.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
179
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Referencias Bibliográficas
12.2 Referencias en Internet
[BBC] “BBC World Cup 2010 dynamic semantic publishing”
http://www.bbc.co.uk/blogs/legacy/bbcinternet/2010/07/bbc_world_cup_2010_dynamic_se
m.html
[Cassandra] “Apache Cassandra Download” http://cassandra.apache.org/
[Cloud4SOA] “A Cloud interoperability framework and platform for user-centric, semantically
enhanced, service-oriented application design, deployment and distributed execution”
http://www.cloud4soa.eu/
[eGMS] “e-GMS-e-Government Metadata Standard” http://www.esd.org.uk/standards/egms/
[eGOV] “Access eGovernment An educational program” http://access-egov.info/
[EsLoMas] “Visión del W3C sobre la Web Semántica”
http://www.eslomas.com/2006/11/introduccion-web-semantica/3/
[GIC] “The Greek interoperability centre: enabling research in the interoperability domain”
http://www.istworld.org/ProjectDetails.aspx?ProjectId=bbea853dbb214d2c853e602137069fb4
[GILS] “GILS What is it? Where's it going?”
http://www.dlib.org/dlib/december96/12christian.html
[Java] “Java Development Kit 7”
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
[Jena] “Apache Jena” http://jena.apache.org/
[KAON] “KAON, Wikipedia” http://en.wikipedia.org/wiki/KAON
[Khaos] “DBOWL: A SCALABLE OWL-DL REASONER”
http://khaos.uma.es/dbowl/html/overview.jsp
[Konstantinou]
“ONTOLOGY
AND
DATABASE
CURRENTIMPLEMENTATIONS AND FUTURE DIRECTIONS”
MAPPING:
A
SURVEY
OF
http://www.academia.edu/165762/Ontology_and_Database_Mapping_A_Survey_of_Current_
Implementations_and_Future_Directions
[LinkedData] “Linked Data - Connect Distributed Data across the Web” http://linkeddata.org/
[LinkedDataTools] “Tutorial 5: Querying Semantic Data”
http://www.linkeddatatools.com/querying-semantic-data
180
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Referencias Bibliográficas | Plataforma para Interoperabilidad de sistemas de información
dentro de un mismo ámbito organizativo
[Maven] “Apache Maven Download” http://maven.apache.org/
[MiREG] “A Framework for Management of Information Resources in E-government”
http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=5592108&tag=1&url=http%3A%2F%2
Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D5592108%26tag%3D1
[MisBytes] “Aplicación empresarial de Ontologías Informáticas SWWS”
http://www.misbytes.com/wp/2006/08/28/aplicacion-empresarial-de-ontologiasinformaticas-swws-1era-parte-introduccion-el-proximo-salto/
[MKBergman] “Ontology-Driven Apps Using Generic Applications”
http://www.mkbergman.com/948/ontology-driven-apps-using-generic-applications/
[MRebollo] “Servicios Web Semánticos”
http://www.slideshare.net/mrebollo/serviciosweb#btnNext
[ODP] “Ontology Design Patterns” http://ontologydesignpatterns.org/wiki/Main_Page
[OntoGOV] “Ontology enabled E-Gov Service Configuration”
http://www.istworld.org/ProjectDetails.aspx?ProjectId=f0b608ec90854d40be7eaca3abcef863
[Ontotext] “OWLIM Downloads” http://www.ontotext.com/owlim/downloads
[OWL-S] “OWL for Services” http://www.ai.sri.com/daml/services/owl-s/tools.html
[OWL-S2] “OWL-S Semantic Markup for Web Services” http://www.w3.org/Submission/OWLS/
[OWL-SKOS] “Using OWL and SKOS” http://www.w3.org/2006/07/SWD/SKOS/skos-andowl/master.html
[OWL] “Lenguaje de Ontologías Web (OWL)” http://www.w3.org/2007/09/OWL-Overviewes.html
[OWLDB] “A backend for native OWL Persistence” http://owldb.sourceforge.net/
[PAE] “Portal de Administración electronica”
http://administracionelectronica.gob.es/pae_Home?_nfpb=true&_pageLabel=P300019542127
8313231711&langPae=es#.U4n9D_m00hc
[PostgreSQL] “PostgreSQL Download” http://www.postgresql.org/
[SAKE] “SAKE: Semantic-enabled Agile Knowledge-based e-Government”
http://www.epractice.eu/en/cases/sake
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
181
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Referencias Bibliográficas
[SEEMP] “The SEEMP Approach to Semantic Interoperability for E-Employment”
http://oa.upm.es/5039/
[SemanticGOV] “SemanticGOV, Wikipedia” http://en.wikipedia.org/wiki/SemanticGov
[Simmetrics] “Simmetrics Sourceforge” http://sourceforge.net/projects/simmetrics/
[SmartGOV] “A Governmental Knowledge-based platform for public sector online services”
http://smartgov.e-gov.gr/
[Solr] “Apache Solr Download” http://lucene.apache.org/solr/downloads.html
[Spring] “Spring Framework” http://spring.io/tools/sts
[Spring2] “Spring Tool Suite Download” http://spring.io/tools/sts
[Stardog] “Stardog Documentation” http://docs.stardog.com/
[TerreGOV] “Terregov: Impact of eGovernment on Territorial Government Services"
https://www.gfi.be/hosting/gfi/website/wcmEN.nsf/pages/terregov
[Tomcat] “Apache Tomcat 7 Download” http://tomcat.apache.org/download-70.cgi
[UDEF] “Universal Data Element Framework, Wikipedia”
http://en.wikipedia.org/wiki/Universal_Data_Element_Framework
[Virtuoso] “Virtuoso Sesame Provider”
http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtSesame2Provider
182
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
Capítulo 13. Apéndices
13.1 Glosario y Diccionario de Datos
ABox: Conjunto de razonamiento que se basa en inferir razonamiento sobre las instancias de
una ontología.
API: Application Programming Interface, es un conjunto de clases, método e interfaces que
ofrecen una funcionalidad externa.
DDL: Data Definition Language, es el lenguaje que se utiliza en los DBMS para crear y modificar
las estructuras de las bases de datos.
DIG: Interface común que comparten los razonadores para facilitar el cambio de un razonador
por otro sin necesidad de realizar grandes modificaciones en el programa.
Eclipse: Entorno de desarrollo más utilizado por la comunidad fundamentalmente centrado en
Java y escrito en el mismo lenguaje.
Framework: Conjunto de herramientas, módulos y artefactos software que dan soporte a un
problema concreto y que permite construir software sobre él. Es común que además, el
framework sea ampliable.
IDE: Integrated Development Environment, es un entorno de desarrollo que permite al
programador escribir, compilar y ejecutar programas además de depurar los errores que
pueda tener el mismo.
Instancia: Una instancia de una clase es una concreción de un tipo. Por ejemplo, Pedro desde
un punto de vista programático podría ser una instancia de la clase Persona.
JDBC: Java Data Base Connector, es un driver basado en ODBC que permite la conexión desde
Java a una base de datos. Concretamente es una estandarización de esta conexión para
permitir el intercambio de bases de datos sin necesidad de realizar grandes cambios en la
estructura del programa.
KB: Knowledge Base, es una base de datos orientada a la gestión de unidades de
conocimiento.
KRSS: Knowledge Representation System Specification, Sistema de especificación de
representación de conocimiento, sirve para definir unidades de conocimiento.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
183
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
Matcher: Componente que se encarga de emparejar los campos entre una Universidad
concreta y el modelo genérico. Para realizar el emparejamiento, se utilizará primero la base de
conocimiento adquirida en los anteriores emparejamientos, pues se realimenta mediante una
base de datos NoSQL. En caso de que el match no sea válido, se pasaría a aplicar técnicas de
comparación de cadenas de texto que se denominan String Métrics, que calculan la distancia
entre dos cadenas de texto dando como resultado un valor numérico. Cuanto más grande sea
este número, mayor será la probabilidad de que se esté comparando la misma cadena de
texto. Para esta aplicación, se ha fijado un grado de compatibilidad del 70 %.
Modelo de referencia: Es un modelo propuesto por la entidad reguladora que se utilizará para
asegurar la homogeneidad en los resultados que se obtendrán en la invocación de los
diferentes SW que se han registrado previamente pues se utilizará como molde para la
traducción de los casos concretos en genéricos.
Módulo buscador: Módulo web que permite a los usuarios del sitio encontrar los diferentes
servicios registrados en el catálogo.
Módulo invocador / Recolector: Proceso que permite invocar los SW que están registrados en
el catálogo y obtener los resultados de forma homogénea, pues cada resultado de cada
método de los SW van traducidos según el Modelo genérico.
Módulo Registrador / Registrador de SW: Es un módulo web que se encarga del registro de
los Servicios Web que ofrece una Universidad concreta para añadirlos al catálogo de servicios.
Simplificándolo, se puede ver como un formulario que recoge los métodos que ofrece el WSDL,
seleccionar los más relevantes y realizar un emparejamiento de los campos del modelo que
utiliza la Universidad concreta y el modelo genérico.
NoSQL: Grupo de nuevos SGBDs que no basan su almacenamiento en un modelo relacional,
como pueden ser las orientadas a documentos, clave-valor, grafos… Es muy común que tengan
un mayor rendimiento que las antiguas relacionales además que se cree que están más
adaptados a las necesidades modernas que los registros de las relacionales.
OBDB: Ontology Based Data Bases, Igual que un RDBMs pero en lugar de orientado a modelos
relacionales lo está a ontologías.
OBO: Sirve para definir ontologías, pero orientadas a biología y genética. Son más simples de
utilizar.
ORM: Object Relational Mapper, es un conversor entre registros de la base de datos y clases
del modelo de una aplicación. De esta forma, un ORM se encarga de generar las estructuras
necesarias para replicar el modelo de la aplicación en la base de datos y de esta forma poder
persistir el estado de una instancia de una clase en registros de la base de datos pues es
habitual que un atributo de una clase esté correspondida con una columna de una tabla, y esta
misma tabla con la clase. En Java, la especificación está definida por JPA, siendo necesario
utilizar una implementación, como por ejemplo, Hibernate.
Plugin: Aplicación que permite ampliar la funcionalidad original de un producto.
184
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
RDBMs: Relational Data Base Management System, Sistema Gestor de Bases de Datos
Relacionales que permite gestionar una base de datos (conjunto de datos). Una de las más
famosas es Oracle.
Resaltado sintáctico: Capacidad casi imprescindible de cualquier buen IDE, es un soporte que
te da el editor de texto para colorear las sentencias de código en función de su categoría.
Servicio Web: Es una forma de intercambio de información entre aplicaciones que permite
hacer públicas tus aplicaciones para que cualquiera pueda conectarse a ellas mientras siga
unos protocolos establecidos. Cabe destacar que permite la interoperabilidad de sistemas
aunque estén escritos en lenguajes de programación diferentes.
SNARL: Es un sistema que permite mostrar notificaciones en el escritorio. Generalmente se
utiliza en sistemas Unix.
SOA: Service Oriented Architecture, Arquitectura que fomenta la construcción de software
mediante Servicios Web.
SOAP: Simple Object Access Protocol, es un protocolo de intercambio de datos que permite la
realización de Servicios Web.
SPARQL: SPARQL Query Language for RDF, SPARQL lenguaje de consultas para RDF es una
recomendación del W3C para la consulta de datos sobre ontologías.
Stack: Conjunto de tecnologías, servicios, herramientas, aplicaciones…
SWRL: Semantic Web Rule Language, permite definir reglas semánticas en lenguajes como
OWL mediante el lenguaje RuleML.
TBox: Conjunto de razonamiento que se basa en inferir razonamiento sobre la definición
(pertenencia a clases, por ejemplo) de una ontología.
Turtle: Es una sintaxis de RDF que permite describir documentos ontológicos RDF mediante
lenguaje natural.
W3C: World Wide Web Consorcium, empresa encargada de estandarizar y desarrollar
tecnologías Web.
WSDL: Web Service Description Language, es un lenguaje que permite definir cómo se
comporta un Servicio Web. También puede referirse a la URL donde está definido ese archivo
de forma indistinta.
XML: eXtensible Markup Language, es un formato que permite transmitir información de
modo estructurado. Su gran hándicap es la cantidad de código innecesario que se genera
entorno a los datos a transmitir.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
185
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.2 Justificación del Cambio
El motivo por el que se decidió cambiar el modelo fue en esencia, debido a que no se consiguió
elaborar un modelo semántico sobre el que realizar la aplicación, es decir, dadas las
herramientas que proporciona la construcción de ontologías, no creí que fueran suficientes
para montar un sistema semántico y similar al que ya existía. Se podría explicar de otra forma,
que con la funcionalidad que te provee OWL (tecnología definida para ontologías de obligada
utilización en la administración pública) no se ha conseguido representar el modelo que
existía, bien por desconocimiento, bien porque la tecnología no lo permite.
Además, una ontología tampoco serviría para obtener el resultado que se busca de traducir los
servicios web que ya existen en otro común, pues una ontología no te permitiría realizar
traducciones de campos de una clase, una ontología lo que te permite es hacerle preguntas en
base a las relaciones que se forman en ella. Un ejemplo perfecto de cómo funciona una
ontología sería representar un árbol genealógico, donde definirías los conceptos de padre,
hijo, tío, hermano, etc y tras realizar un árbol de una familia, podrías preguntar qué relación
existe entre Juan y Luis, a lo que te respondería que son primos, por ejemplo.
Es por ello, que decidimos cambiar el modelo en el tema funcional, manteniendo esa esencia
semántica pero desde un punto de vista más práctico, mediante el uso de diccionarios. De esta
forma, lo que hacemos es crear una base de conocimiento donde vamos recogiendo los casos
concretos de cada universidad y que pueden ser aplicados a las siguientes que se vayan a
registrar. Es decir, si la Universidad 1, dice que sus campos son ape1 y ape2 para formar
apellidos, cuando venga a registrarse la Universidad 2, y por ejemplo su campo para formar
apellidos fuera ape, nos estaría dando un matching válido o también podría ser que tuviera
ape1 y ape2 también definidos con lo que también obtendríamos el mismo resultado. Al estar
jugando con que estamos utilizando el mismo modelo pero con nombres ligeramente
distintos, la utilización de diccionarios y de las tecnologías de StringMetrics (funciones que
evalúan cuánto se parecen dos palabras) parece que son más acertadas para realizar
traducciones de unos modelos en otros.
186
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.3
Estado del Arte de la Web Semántica
13.3.1
Introducción
En el siguiente documento se va a recoger un estudio sobre la situación actual de la Web
Semántica. En él se tratarán términos como Ontología, qué lenguajes se pueden utilizar para
definirlas, qué herramientas son las que más repercusión están teniendo y una serie de
razonadores para ejecutar consultas sobre ontologías.
También se tratarán los Servicios Web Semánticos y en qué estado se encuentran, cómo se
definen y qué entornos de ejecución existen además de ver qué controversia existe a la hora
de utilizar una ontología cuando se tienen que crear instancias y qué bases de datos
actualmente pueden ser útiles.
Para terminar, se describirá una arquitectura que se podría seguir a la hora de implementar un
aprovechamiento semántico.
13.3.2
Ontología
Una ontología informática define de manera enriquecida y formal un modelo del dominio para
catalogar diferentes recursos Web. Esto quiere decir, que puede dar un significado semántico
compuesto por entidades (clases o conceptos) y atributos, las relaciones que existen entre
estas entidades, bien sea de modo cuantificable o categorizado así como una serie de axiomas
que permitirá obtener resultados sobre las instanciaciones de estas clases.
Debido a la obtención de este modelo enriquecido, se puede obtener una comunicación entre
sistemas más rica, permitiendo que las propias máquinas sean capaces de inferir conocimiento
sobre unos datos de forma desatendida.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
187
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.3.2.1
Lenguajes de Definición
Existen dos lenguajes de definición de ontologías que destacan sobre los demás: OWL (Web
Ontology Language) y WSMO (Web Server Modeling Ontology). Existen otros como
RDF(Resource Description FrameWork) y RDFS(RDF Schema) pero tienen un menor grado
semántico dentro de los diferentes lenguajes.
Ilustración 81. Stack de Tecnologías Semánticas
13.3.2.1.1
OWL (Web Ontology Language)
Desarrollado por el W3C y una de las más longevas. Recientemente apoyado por la
Administración Pública Española (BOE-A-2012-13501) en su Norma Técnica de
Interoperabilidad de Catálogo de Estándares, es un lenguaje de definición de ontologías que
permite definir Clases, Relaciones, Axiomas, Atributos e Instancias.
Además, existen tres grados para definir ontologías con OWL:



188
OWL Lite: Expresividad reducida y la versión más limitada de las tres.
OWL DL: Orientado al Lenguaje Descriptivo (DL), es el que exigen la mayoría de
razonadores para ejecutar sus motores de inferencia. Más enriquecido que OWL Lite,
permite añadir Reglas a la definición para aplicar inferencia en tiempo finito.
OWL Full: Está un nivel por encima de OWL DL, aumenta la expresividad del anterior
pero ya no se puede asegurar la completitud del razonamiento en tiempo finito.
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
Es posible establecer un diagrama de conjuntos entre estos lenguajes:
Ilustración 82. Niveles de OWL
13.3.2.1.2
WSMO (Web Service Modeling Ontology)
Pertenece a un conjunto de conceptos que definen una especie de framework para definir un
ciclo de vida del software completo aunque el recomendado sea OWL por su nivel de madurez.
Está constituido por WSMO (Web Service Modeling Ontology), WSML (Web Service Modeling
Language) y WSMX (Web Service Modeling eXecution environment). De esta forma, WSMO
permite definir el modelo conceptual para un Servicio Web Semántico, WSML es el propio
lenguaje en el que se desarrollará la ontología y WSMX es el entorno de ejecución en el que se
integrarán los Servicios Web Semánticos desarrollados.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
189
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
Al igual que OWL, WSML también presenta diferentes niveles de definición, siendo éstos:





WSML-Core: Versión básica del lenguaje de definición, permite Conceptos (clases),
relaciones binarias, instancias y relaciones jerárquicas.
WSML-DL: Versión de OWL-DL en lenguaje WSML, añade lógica descriptiva a WSMLCore.
WSML-Flight: Otra vertiente de WSML-Core, al mismo nivel de WSML-DL, permite
incluir restricciones en forma de reglas.
WSML-Rule: Incremento de WSML-Flight, además de lo anterior permite definir reglas
no seguras de completitud en tiempo finito.
WSML-Full: Aúna WSML-Rule y WSML-DL en un mismo tipo, siendo el tope jerárquico
dentro de WSML.
Ilustración 83. Niveles de WSML
13.3.2.2
Herramientas
Para la creación de ontologías y la utilización de los diferentes lenguajes, existen una serie de
herramientas específicas para cada uno de estos lenguajes. Las más destacadas pueden ser
Protégé, WSMT y WSMO Studio, la primera para OWL y las otras dos para WSMO.
13.3.2.2.1
Protégé
Desarrollado por la Universidad de Stanford, Protégé está en su versión 4.1 y permite la
creación de ontologías mediante una interfaz gráfica siendo la creación de clases y atributos un
proceso trivial. En esta versión se ha quitado funcionalidad que bajo el punto de vista del
autor, era fundamental. En la anterior versión de Protégé (3.4.8) incluía una definición de
formularios que permitía encorsetar los campos de las clases para facilitar la creación de
instancias en gran medida, además de permitir la asociación de clases a los atributos y las
relaciones en forma de operadores “OR”. Esto último es especialmente importante debido a
que si no se implementan las asociaciones mediante “OR”, las instancias que tengan esas
relaciones y esos atributos pertenecerán a todas las clases que tengan esas mismas instancias.
190
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
De esta forma, se puede tener una clase Perro que tiene un atributo nombre y una clase
Hombre que tiene el mismo atributo nombre. Cuando realizamos la asociación de los atributos
a las clases si no se utiliza “OR” impactará en la creación de una instancia Perro y una instancia
Humano, de esta forma la instancia Luis y la instancia Toby, pertenecerán a las clases Perro y
Hombre cuando sólo tendrían que pertenecer a Hombre y Perro respectivamente.
Otra de las características interesantes que incluye Protégé es la integración con diferentes
razonadores, como pueden ser Pellet y FaCT++ por defecto además de poder ser ampliados
mediante plugins.
Por estas características la versión que se recomienda óptima de utilización sería la 3.4.8 de
forma que se optimizará la creación de ontologías y sus instancias.
13.3.2.2.2
WSMT (Web Service Modeling Toolkit)
Web Service Modeling Toolkit permite desarrollar los dos conceptos que propone WSMO, la
ontología y el enriquecimiento de los Servicios Web Semánticos. Actualmente está en su
versión 2.0 y también permite la publicación de ontologías en un entorno WSMX además de
realizar consultas sobre los diferentes razonadores específicos para cada uno de los diferentes
“sabores” de WSML. Desarrollado sobre la arquitectura del IDE Eclipse, para los que estén
familiarizados con esta plataforma les puede resultar realmente sencillo crear ontologías con
esta herramienta, además de poseer un entorno gráfico de la forma que lo incluye Protégé
aunque menos vistoso y funcional, luego toda la parte de la definición es más como realizarlo
escribiendo código aunque proporcione soporte para la escritura y resaltado sintáctico como
cualquier entorno de desarrollo.
Cabe destacar que la visualización de la ontología una vez realizada por medio de diagramas de
burbujas, es mucho más clara que en Protégé pues aprovecha de mejor forma los espacios y
no realiza un gráfico atropellado como Protégé.
13.3.2.2.3
WSMO Studio
WSMO Studio pretende ser una alternativa a WSMT, de la misma forma, tiene su estructura
relacionada con Eclipse, concretamente está construido como plugins de éste, aunque también
existe la forma de encontrarlo ya integrado con Eclipse para su descarga.
Como contrapunto a WSMT, no posee razonadores para inferir conocimiento en el propio
entorno de desarrollo pero sí que tiene un entorno gráfico para construir ontologías aunque
similar al que ofrece WSMT (poco cuidado) además del propio editor de texto con resaltado
sintáctico. En el caso de las representaciones gráficas de la ontología, utiliza también el mismo
sistema que WSMT, ofreciendo un marco de trabajo más limpio que Protégé. Además tiene un
apartado de Repositorio donde permite publicar las ontologías generadas.
Para terminar, hay que destacar que es una herramienta que está en fase beta, concretamente
la 0.7.3 y data del 2008 con lo que da que pensar que está algo olvidado su desarrollo.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
191
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.3.2.3
Razonadores
En este apartado aparecerán razonadores para ambos lenguajes, de esta forma, se tratarán
Pellet y FaCT++ para OWL e IRIS para WSMO ya que otros razonadores como RACERPro son
herramientas de pago y parece que están desactualizadas (página web sin modificaciones
desde el 2009).
13.3.2.3.1
Pellet 2.3.0
Razonador sobre la capa OWL DL (permite OWL 2) escrito en Java de la empresa Clark&Parsia
bajo licencia AGPL v3 para desarrollos Open Source y bajo otras licencias no especificadas (se
entiende que comerciales) en caso de desarrollos propietarios.
Incluye soporte para consultas con SPARQL, razonamiento de tipos, soporte para reglas SWRL
además de permitir depuración de ontologías.
Existe un plugin para Protégé que integra el razonador con el IDE y nos permite realizar
consultas mediante SPARQL, inferir tipos de las clases y los atributos e inferir relaciones.
Permite razonamientos sobre ABox, TBox y sobre KB (Knowledge Base) en una ontología
completa y es especialmente interesante que esté escrito en Java, de esta forma se puede
integrar con multitud de aplicaciones programadas en este lenguaje (Jena, sobretodo).
Ilustración 84. Arquitectura Pellet
192
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.3.2.3.2
FaCT++ 1.6.1
Razonador escrito en C++ y de código abierto publicado bajo una licencia GNU pública
propiedad de la Universidad de Manchester, también existe en desarrollo una versión Java
denominada JFact. La última versión es la 1.6.1 del 26 de Octubre de 2012, luego se entiende
que es de las pocas herramientas que todavía están en continuo desarrollo y no abandonada
(caso de RacerPRO).
Está implementado sobre la OWL API, luego le permite interactuar con RDF, OWL, Turtle, KRSS
y OBO aunque tan solo soporta OWL 2 DL de forma parcial debido a que tiene problemas con
el soporte para ciertos tipos de datos y las claves.
Estos problemas hacen que el uso de esta herramienta sea descartado, al menos hasta que se
solventen estos problemas. Debido a la constante evolución de la herramienta, da que pensar
que se solucionará pronto.
13.3.2.3.3
IRIS (Integrated Rule Inference System)
Es un razonador escrito en Java que funciona con ontologías de tipo WSML además de con
RDFS y que permite negación de tipo well-founded, stratified y reglas no seguras. Tiene una
licencia LGPL y está financiado por SOA4ALL y European Framework 7. La última versión de
este razonador, la 0.61 es de Agosto de hace un año y no es una versión release que es la 0.60
de Febrero de 2010, con lo que se puede afirmar que el proyecto va lento pues no tiene una
versión estable lanzada, sólo betas aunque en su página web existe un apartado para realizar
una demo online donde permite la entrada de una serie de reglas y axiomas para ejecutar el
razonamiento sobre ellas.
13.3.3
Servicios Web Semánticos
Los Servicios Web Semánticos son una forma de explotar esta nueva visión de la Web
compuesta por Ontologías. Debido a su naturaleza de sistemas expuestos (o formas de
exteriorizar información) a otros sistemas, son las herramientas más indicadas para conseguir
explotar esta nueva arquitectura por buscar la inferencia de información de forma desatendida
para proporcionar esta información.
13.3.3.1
Lenguajes de Definición
Como lenguajes de definición de Servicios Web Semánticos los más utilizados y siguiendo con
los de definición de ontologías se puede hacer una conexión entre WSMO y WSML y entre
OWL y OWL-S.
En el primer caso, es el mismo lenguaje que se estaba utilizando para la creación de las
ontologías y en el segundo, lo que se hace es agregar una capa a las tecnologías existentes
(WSDL, Web Service Description Language) para permitir la compatibilidad entre OWL y los
Servicios Web.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
193
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.3.3.1.1
WSML (Web Service Modeling Language)
Es el mismo lenguaje que se utiliza para la creación de ontologías descrito anteriormente, salvo
que en esta orientación hacia los Servicios Web Semánticos, permite definir mediadores y
metas, para definir el comportamiento de los servicios web y las metas que pueda buscar el
usuario.
Ilustración 85. Enfoque de WSMO
13.3.3.1.2
OWL-S (Web Ontology Language – Services)
Como se ha comentado anteriormente, OWL-S se tiene que tomar como servicio de marcado
para los Servicios Web existentes, es más, lo que hace es enriquecer WSDL para poder dar
soporte a las Ontologías definidas con OWL.
Para lograr esto, OWL-S define tres etapas que son las del Service Profile (perfil del servicio),
Process Model (modelado del proceso) y Grounding (forma de interaccionar con la ontología).



Service Profile: Se encarga del descubrimiento y la selección de servicios.
Process Model: Ontología que se encarga de procesar las operaciones del servicio.
Grounding: Define los mensajes de interoperabilidad con otros servicios.
Ilustración 86. Enfoque de OWL-S
194
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.3.3.2
Entornos de Ejecución
Para conseguir ofrecer estos Servicios Web Semánticos, en el caso de OWL-S nos bastará con
un Servidor de Servicios Web común como puede ser Axis que ya se estaría utilizando para los
actuales Servicios Web, en el caso de los proporcionados por WSMO, requerirán de un entorno
de explotación concreto que viene agregado en el Stack de WSMO, el WSMX (Web Service
Modeling eXecution environment).
13.3.3.2.1
Axis
Servidor que permite desplegar Servicios Web de la fundación Apache implementando el
protocolo SOAP.
13.3.3.2.2
WSMX (Web Service Modeling eXecution environment)
Ilustración 87. Interacción con WSMX
WSMX es un entorno de ejecución que permite desplegar Servicios Web Semánticos
modelados con WSML. Este entorno se encarga de la publicación de estos servicios, además de
publicar las ontologías por separado. Para la publicación de estos servicios, internamente
también implementa un servidor Apache Axis para la publicación de Servicios Web.
Concretamente, WSMX lo que hace es permitir el descubrimiento dinámico, la mediación y la
invocación de Servicios Web. De esta forma, se encarga de utilizar los mediadores definidos
así como de definir las metas que vienen predefinidas en los archivos de WSMO seleccionando
el Servicio Web que mejor se adecúe según las necesidades de la petición.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
195
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.3.4
Almacenamiento de ontologías
Inicialmente, las ontologías fueron creadas como un modelo cerrado. Esto quiere decir que
una ontología una vez se creaba, no se modificaba posteriormente, o al menos no se pretendía
modificarla dinámicamente. Por ello, sus clases, relaciones y atributos eran definidos junto con
sus instancias y no variaban. Según en qué entornos, éste puede ser un aprovechamiento de la
tecnología muy válido y suficiente, pero si se enfoca el problema hacia el desarrollo de
aplicaciones empresariales, es necesario poder generar instancias de las clases de forma
dinámica, puesto que las propias aplicaciones empresariales generarán datos de esta forma.
Para la solución de esta controversia, existen una serie de tecnologías que pueden dar soporte
para ello.
13.3.4.1
DBOWL
Propuesto por la Universidad de Málaga, presenta una arquitectura propietaria que consta de
una RDBMS Oracle 11g para la persistencia de las instancias (ABox) que monta encima un
razonador RACER Pro. Esto implica que tanto Oracle 11g como RACER Pro son sistemas de
pago. El problema que tiene esta herramienta es que tan solo se puede interactuar con ella
mediante su web (http://khaos.uma.es/dbowl/html/overview.jsp) y se conocen sus bondades
a través de un artículo científico, con lo que no existe una forma de comprobar
fehacientemente que es una herramienta que se pueda utilizar para nuestros propósitos.
13.3.4.2
OntoDB
Para utilizar OntoDB, se debe instalar un PostgreSQL 8.2.4 (a fecha de este documento está en
la 9.2.1, puede ser un problema) y de una forma extrañamente concreta (el idioma de la
instalación por ejemplo, forzosamente debe ser el francés). Basado en la ontología de
catalogación PLIB que en los 90 fue creada para catalogar componentes industriales en
catálogos electrónicos, utiliza su propio lenguaje de consultas y de DDL, OntoQL, frente a lo
habitual, que es SPARQL.
Otro de los puntos conflictivos es que no se puede importar una ontología creada
anteriormente con un editor si no que se debe de introducir a mano mediante OntoQL, por lo
que hace excesivamente necesario el aprendizaje de este lenguaje para la utilización de la
herramienta.
196
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.3.4.3
DLDB-OWL
Herramienta del 2004, tan sólo se publicó esta versión 1.0. Utiliza una versión de Fact (JFact)
para realizar razonamientos. Al contrario que OntoDB, este DBMS permite la importación de la
ontología en formato OWL dentro de la base de datos, pero lo que no permite es utilizarse en
forma de servidor.
El mayor problema que presenta esta solución además de no permitir la utilización en modo
servidor, es que para persistir los datos de la ontología utiliza Microsoft Access con lo que hace
inviable su utilización en casi cualquier entorno empresarial debido a la utilización de
máquinas Unix.
13.3.4.4
IBM-SOR
Siguiendo el modelo de DBOWL, pero unos años antes, IBM también propuso un sistema
parecido, pero en este caso propone un cambio en la arquitectura que resulta muy
interesante. El mayor problema es que el artículo es de 2007 y a fecha de noviembre de 2012
no se conoce implementación de dicha herramienta.
Ilustración 88. IBM-SOR
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
197
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.3.4.5
InstanceStore
Compuesta por un RDBMS y un razonador y con la premisa de utilizar el razonador única y
exclusivamente cuando sea necesario, esta solución delega todo el trabajo en la base de datos
salvo en los casos en los que la caché no pueda solventarlos que es cuando entonces ejecutará
razonamientos ABox sobre ontologías OWL.
Para cada una de las ontologías que se quieran utilizar en esta herramienta, creará una base de
datos nueva, incluso cuando sean dos esquemas iguales con lo que se tendrá que tener
especial cuidado a la hora de utilizarla e intentar aunar las ontologías bajo un mismo fichero.
Como característica destacable, no está ligado a ningún razonador concreto ni a ningún
RDBMS concreto. Esto es posible debido a que utiliza Java para la implementación luego
mediante JDBC permite el uso de Oracle, Hypersonic o MySQL y para la parte del razonador
una interface DIG que permite conexiones con FaCT, Racer y FaCT++.
13.3.4.6
OWLIM
Base de datos comercial implementada en Java, permite integración con Jena y con Sesame
para su utilización desde código. Existe en tres versiones (Lite, SE y Enterprise) siendo la
versión a utilizar en entornos empresariales la SE o si se necesita de escalabilidad la Enterprise.
La versión Lite es gratuita, pero no es posible su utilización en entornos comerciales.
Puede que sea la más famosa, debido a ser el sistema de bases de datos que utilizó la cadena
británica BBC para introducir semántica en su página web deportiva con motivo de cubrir la
Eurocopa 2010 y los Juegos Olímpicos 2012 mediante ontologías en RDF.
13.3.4.7
Stardog
Lanzada su versión 1.1 en Noviembre del 2012, Stardog es una base de datos RDF comercial
con modo servidor, que almacena sus instancias en RDF y aplica razonamiento OWL. Tanto
OWLIM como Stardog, son alternativas comerciales a las anteriores, pero cabe destacar que
son las que parecen más profesionales.
Incluye integración con Java y con Spring para una fácil utilización de la base de datos desde
código mediante Jena, Sesame y SNARL.
198
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.3.5
Problemas
Como se puede comprobar en los casos expuestos, hay excesiva diversidad de
implementaciones, unas con un RDBMS como soporte, otras con un sistema propio, unas con
razonadores externos, otras con él propio, otras con almacenamiento tipo RDF(tripletas), otros
bajo un esquema ontológico... pero con un denominador común, todas están en fases iniciales.
De hecho, que Stardog y OWLIM sean las más profesionales puede ser debido única y
exclusivamente a que hayan invertido dinero y tiempo en la forma de presentación del
producto mediante la creación de sus páginas web.
Otro de los puntos que más se repiten en la mayoría de las soluciones es que vienen siendo
consecuencias de publicaciones científicas por ello muchas de ellas no superan la versión 1.0 o
ni siquiera llegan a implementarse completamente y llevan sin actualizarse desde hace más de
tres años.
Por último, la inclusión de razonador o no es fundamental, debido a que si se tiene que realizar
una transformación de la base de datos a memoria para obtener OWL y luego utilizar un
razonador externo, a parte de tener que transportar gran parte de la base de datos a memoria,
se va a tener que procesar todo en memoria con el costo de tiempo que ello conlleva. Esta
inclusión del razonador también lleva implícita la problemática de tener la capacidad o no de
realizar razonamientos sobre ABox o sólo sobre la TBox.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
199
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.3.6
Arquitectura
Bajo el punto de vista del autor, una forma factible de llevar a cabo la inclusión semántica
dentro de una arquitectura SOA podría ser la siguiente:
Ilustración 89. Arquitectura SWS
Como podemos ver, el modelo de la ontología definido irá persistido en una de las bases de
datos mencionadas en este documento, además de ir agregando instancias que se puedan
generar por medio de las aplicaciones definidoras de trámites que ya están en funcionamiento.
Por otro lado tendremos los Servicios Web Semánticos que realizarán peticiones sobre una
instanciación del framework Apache Jena que se encargará de traducir las peticiones en
razonamientos sobre la capa razonadora del OBDB y devolver los resultados al Servicio Web
que realizó la petición.
13.3.6.1
Apache Jena
Este framework escrito en Java de la Apache Foundation tiene una sección propia dentro de
este documento debido a las capacidades que ofrece a los programadores. En su sitio web se
define como “una herramienta para crear aplicaciones web semánticas” y razón no les falta.
Por un lado, nos ofrece una API para procesar y escribir RDF en XML, tripletas y otros formatos.
También nos permite gestionar mediante otro API, ontologías en OWL y RDFS. Tiene un
razonador propio y además mediante interfaces se complementa con casi todos los
razonadores del mercado que tengan una interface Java (la gran mayoría).
200
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
Otra de las versatilidades que incluye, es la capacidad de almacenar contenido mediante
tripletas RDF en disco además de aplicar razonamientos mediante SPARQL.
Como contrapunto a lo anterior, todavía no da soporte para OWL 2 pero es una de las
características a las que se le espera que de soporte pronto (está incluida en su roadmap).
Además ofrece la ampliación mediante componentes propios de Jena, como pueden ser SDB y
TDB que permite persistir ontologías, la primera apoyándose en un RDBMS común (como
Oracle o PostgreSQL, por ejemplo) y la segunda utiliza un Tuple-Store habitual. Además
permiten razonamientos sobre ellos.
Ilustración 90. Arquitectura Apache Jena
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
201
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.3.7
Tecnologías y Herramientas seleccionadas
Finalmente las tecnologías que se van a utilizar, en el proyecto son las siguientes:

OWL: Esta viene impuesta por la NTICAP (Norma Técnica de Interoperabilidad de
Catálogo de estándares de la Administración Pública) publicada en el BOE A-201213501 (número 262, Miércoles 31 de Octubre de 2012, Sec. III Pág. 76723) además de
ser una tecnología más madura que WSMO y no necesitar del añadido de tener que
utilizar un entorno de ejecución a parte (WSMX) ya que OWL-S puede funcionar sobre
un Apache Tomcat.

OWL-S: Debido a que sin él no podemos utilizar Servicios Web Semánticos mediante
la creación de ontologías en OWL.

Apache Jena: Es el framework que se va a utilizar para manejar las ontologías en
memoria además de crear nuevas instancias sobre las ontologías. Como punto fuerte
además tiene que nos permite solucionar el problema de la persistencia mediante
SDB y con el motor SPARQL que incluye junto con su razonador propio.

PostgreSQL: Se utilizará este RDBMS por ser el sistema utilizado en la empresa,
realmente serviría cualquiera para complementar a SDB.

Protégé: Por ser el editor más extendido en la codificación de Ontologías (se podría
haber utilizado Java combinado con Jena, pero sería muy tedioso) y ser fácil de
utilizar, además de soportar plugins para OWL-S y permitir realizar el enriquecimiento
de la ontología mediante servicios web.

Eclipse: Entorno de desarrollo para codificar el proyecto que integrará todas las
tecnologías aquí mencionadas.

pgAdmin: Interfaz que permite conectarse y gestionar PostgreSQL de manera gráfica,
es la más utilizada.
202
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.3.8
Referencias de interés
[Axis]: http://axis.apache.org/axis/
[DBOWL]: http://khaos.uma.es/dbowl/
[DIG]: http://dig.sourceforge.net/
[DLDB-OWL]: http://bit.ly/Zjvy52
[Eclipse]: http://www.eclipse.org/
[FaCT++]: http://code.google.com/p/factplusplus/
[IBM-SOR]: http://bit.ly/QWwFUP
[instanceStore]: http://bit.ly/TvDMAE
[IRIS]: http://www.iris-reasoner.org/
[Jena]: http://jena.apache.org/
[OntoDB]: http://www.lias-lab.fr/forge/projects/ontodb
[OWL]: http://www.w3.org/TR/owl-features/
[OWL-S]: http://www.w3.org/Submission/OWL-S/
[OWLIM]: http://www.ontotext.com/owlim
[Pellet]: http://clarkparsia.com/pellet/
[PostgreSQL]: http://www.postgresql.org.es/
[Protégé]: http://protege.stanford.edu/
[RDF]: http://www.w3.org/RDF/
[SemanticWeb]: http://semanticweb.com/
[SPARQL]: http://www.w3.org/TR/rdf-sparql-query/
[Stardog]: http://stardog.com/
[W3C]: http://www.w3.org/
[WSMO]: http://www.wsmo.org/
[WSMO-Studio]: http://www.wsmostudio.org/
[WSMT]: http://sourceforge.net/projects/wsmt/
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
203
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.4 Hoja de Decisiones del cambio
13.4.1
Servicios Web Semánticos
13.4.1.1
Diseño



Utilizar el modelo vcasem y vcatalog como referencia: Debido a que se tenía que
implementar una ontología para ofrecer servicios web semánticos que ya se estaban
ofreciendo se decidió usar el mismo modelo existente traducido a una tecnología
semántica.
Cerrar el proyecto por inviabilidad del mismo: Tras un tiempo de trabajo con la
tecnología, se desechó continuar por esta vía debido a que la capa semántica que
envolvía al modelo no aportaba la suficiente semántica para ejecutar razonamientos
sobre él.
Generación de instancias dinámicamente: Debido a la naturaleza de la aplicación, se ha
decidido generar las instancias de la ontología de forma dinámica, esto es debido a
que los servicios web crean nuevas instancias y se han de hacer semánticas también.
Para llevarlo a cabo se utilizará reflectividad.
13.4.1.2
Tecnológicas

WSML: Se decidió utilizar en un principio WSML por que parecía que era la tecnología
sobre la que apoyar los desarrollos semánticos más innovadora pues extendía una
plataforma completa sobre ella (Descubrimiento de Servicios Web, Máquina de
ejecución de Servicios Web y Herramienta de Desarrollo para esos mismos Servicios).

OWL: Tras llevar un tiempo de desarrollo con WSML, se tuvo que cambiar la tecnología
para definir la ontología con lo que hubo que migrar el trabajo hecho de WSML a OWL
teniendo que habituarse a otro entorno de desarrollo y a otro lenguaje. Este cambio es
debido a la Administración Pública Española (BOE-A-2012-13501) que en su Norma
Técnica de Interoperabilidad de Catálogo de Estándares decidió que para utilizar
ontologías, se debía utilizar OWL y para los Servicios Web Semánticos OWL-S.

Stardog: Se decidió utilizar esta base de datos en su versión de prueba para comprobar
que realmente funcionaban las bases de datos para el almacenamiento de instancias
de ontologías debido a lo poco evolucionada que está la tecnología semántica en
general.

Apache Jena: Como framework para utilizar ontologías y OWL concretamente desde
Java, se ha decidido utilizar esta herramienta puesto que es la referencia en estos
casos. Además también incluye un módulo SDB para persistir la ontología con sus
instancias en una base de datos relacional.

PostgreSQL: Se decidió utilizar PostgreSQL por ser la habitual en el C1Nn y por
necesitarse con SDB pues genera una serie de tablas para montar su estructura y
persistir la ontología.
204
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.4.2
Servicios Web Unificados
13.4.2.1
Diseño

Cambio de modelo, cambio de arquitectura: Al cambiar el modelo que se tenía
pensado originalmente, también se decidió un cambio de arquitectura. Ahora
tendríamos algo de este tipo:
Un módulo registrador, donde las universidades deberán registrarse junto con su WSDL.
Un módulo intermediario o recolector que recogerá los datos de todos los servicios web
registrados.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
205
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices

Modelo Hash: Para la utilización de Cassandra, se ha de definir un modelo dentro de
los pares Clave-Valor. Este constará:
o Concrete: Será la clave de por la que indexará la NoSQL.
o Match: Campo con el que conecta del modelo genérico.
o Join: Campo con el que se juntaría para componer un campo del modelo
genérico.
o Clazz: Clase a la que pertenece (de la universidad concreta).
o ModelClazz: Clase a la que pertenece del modelo.
o Universidad: Id de la universidad a la que pertenece.

Paso de aplicación de consola desordenada a N-Capas: Para facilitar más adelante la
incorporación de nuevas funcionalidades y permitir la sustitución de unas capas por
otras. Desacoplamiento.

Colecciones: Se preguntará por el template de la colección al usuario, esto es debido a
que no puede obtenerse sin instanciar la colección debido a que CXF no especifica el
mismo. Y para ello se tendría que hacer una llamada válida al Servicio Web, tarea que
corresponde al otro módulo (intermediario, no registrador).

Cambio de utilización NoSQL: Originalmente la idea de utilizar la NoSQL era como una
gran tabla hash, pero fue degenerando al introducir JPA porque se intentó aprovechar
el mismo modelo que iba en la relacional y en la NoSQL redundando en el modelo
descrito en el punto Modelo Hash. Con el paso de las pruebas, me di cuenta de que si
utilizabas tal cual el modelo, sólo harías match con las que ya tienes dentro (que
concuerden con la universidad, clase, etc), entonces se ha cambiado el enfoque para
que tanto el StringMetrics y el CassandraMatcher hagan exactamente lo mismo: Vean
si hay una coincidencia en el nombre, no en el emparejamiento, que se hará
posteriormente.
13.4.3
Tecnológicas

Apache Lucene: Se intentó utilizar esta biblioteca para realizar el matching de campos
entre los modelos de la universidad concreta y el modelo genérico pero se descartó
debido a que está orientado a la indexación de archivos.

String Metrics: Para sustituir la utilización de Lucene, se decide utilizar SimMetrics
(conjunto de métricas que miden cuánto se parecen 2 términos) que se adapta
perfectamente a lo que necesitamos. De esta forma obtendremos matchs del tipo:
ape1 = [apellidos]. De entre todo el catálogo, utilizamos: ChapmanMatchingSoundex,
Soundex, SmithWatermanGotoh, SmithWatermanGotohWindowedAffine y
MongeElkan por ser las que nos dan los resultados ajustados a nuestras necesidades.

Elección de NoSQL: Para apoyar String Utils, se decide que hay que usar una NoSQL
como si fuera una gran tabla hash para encontrar matches al vuelo, en caso de que se
haya dado el match previamente. De entre las disponibles, se utilizará una Clave-Valor
por ser lo que necesitamos y de entre ellas Apache Cassandra.
206
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo

Biblioteca de conexión Cassandra: Se barajó utilizar varias bibliotecas: Astyanax,
Firebrand y Hector. Se utiliza finalmente Hector por ser en la que se basan las otras
dos y además ser la que mejor funciona. Firebrand además era una solución similar a
Hibernate, por lo que podrían confluir demasiadas anotaciones similares y podría
terminar llevando a confusión además de que en el caso de Cassandra puede
interesarnos llevar un mayor control. Astyanax, por su parte, es una implementación
propuesta por Netflix que está en fase de desarrollo.

Generación de instancias dinámicas (2): Ahora se utilizará Apache CXF para la
instanciación momentánea de las clases de los Servicios Web pues las genera en un
classpath paralelo en memoria y facilita el trabajo a la hora de trabajar con Servicios
Web, ya que está preparado para ejecutarlos dinámicamente. De otra manera,
necesitaríamos utilizar órdenes de consola o utilizando el protocolo SOAP, usando el
XML…

Recolección de los tipos de datos: Para conocer los campos de las clases de las
universidades concretas, debemos utilizar alguna herramienta que nos permita
obtener los tipos de datos que hay en los WSDLs, bien sea mediante el XSD que
incorporan u otros métodos. Primero se intentó con WSDL4J, EasyWSDL y WODEN
pero ninguno consiguió dar los resultados esperados con lo que finalmente se utilizará
CXF combinado con reflectividad para obtener estos datos.

JPA+Hibernate+SpringData: Para la capa de persistencia se decidió cambiar la que
había con JDBC por una más moderna con JPA debido a que nos interesa trabajar
siempre con objetos, nos lo facilita enormemente JPA (se ha utilizado la
implementación de referencia, no las características propias de Hibernate) por lo que
si se decide cambiar Hibernate en el futuro, sería trivial.

Contenedor de Inyección de Dependencias: Debido a la separación de capas que se ha
comentado anteriormente, es recomendable agregar un contenedor de Inyección de
Dependencias como puede ser el framework Spring que además de resolvernos la
inyección de las instancias de las clases, también nos facilitará la vida a la hora de
utilizar los estereotipos de los Servicios, Repositorios, etc. Por otro lado también nos
ayudará con la configuración de JPA y en un futuro, también si decidimos agregar una
capa Web a la solución mediante Spring MVC.
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
207
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.5 Contenido Entregado en el CD-ROM
13.5.1
Contenidos
Directorio
./ Directorio raíz del CD
./proyectos
./documentacion
./documentacion/img
./documentacion/uml
./documentación/Project
./documentación/Excel
208
Contenido
Contiene toda la estructura de directorios del
proyecto para desarrollo.
Contiene toda la documentación asociada al
proyecto. Es necesario incluir un fichero con
el documento final del proyecto (en formato
.doc o .docx de Word o bien .sxw de Open
Office, por ejemplo) además de un fichero
.PDF
Directorio que contiene las imágenes
utilizadas en la documentación. Estas
imágenes tendrán formato .png si son
capturas de pantalla, .wmf si son diagramas o
esquemas y .jpg sólo si son fotografías.
Ficheros que genera la herramienta (Rose,
ArgoUML, etc.) con la que se han generado
los diagramas UML y de entidad relación.
Ficheros de la planificación del proyecto de
Microsoft Project.
Presupuestos del proyecto.
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.5.2
Ficheros de Configuración
13.5.2.1
Maven
13.5.2.1.1
Define-tramites-servicios-web-unificados
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>define-tramites-servicios-web-unificados</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
<packaging>pom</packaging>
<name>define-tramites-servicios-web-unificados</name>
<properties>
<java-version>1.7</java-version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<org.springframework.version>3.2.3.RELEASE</org.springframework.version>
<org.springframework.data.version>1.3.2.RELEASE</org.springframework.data.version
>
<org.apache.cxf.version>2.7.11</org.apache.cxf.version>
<org.hibernate.version>4.1.10.Final</org.hibernate.version>
<org.hibernate.validator.version>5.0.0.Final</org.hibernate.validator.version>
<junit.version>4.11</junit.version>
<jpa.version>1.0.1.Final</jpa.version>
<org.commons.jdbcp.version>1.4</org.commons.jdbcp.version>
<org.slf4j.version>1.7.5</org.slf4j.version>
<postgresql.jdbc.version>9.1-901-1.jdbc4</postgresql.jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
</plugins>
</build>
<modules>
<module>
define-tramites-servicios-web-unificados-registrador
</module>
<module>define-tramites-servicios-web-unificados-modelo</module>
<module>define-tramites-servicios-web-unificados-buscador</module>
<module>
define-tramites-servicios-web-unificados-service
</module>
<module>define-tramites-servicios-web-unificados-recolector</module>
<module>define-tramites-servicios-web-unificados-publisher</module>
</modules>
<dependencies>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
209
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j.version}</version>
<scope>compile</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Spring FW -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Solr -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>1.0.0.RC1</version>
</dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-core</artifactId>
<version>4.3.0</version>
<exclusions>
<exclusion>
<groupId>com.spatial4j</groupId>
<artifactId>spatial4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.8</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-maven-milesone</id>
<url>http://repo.springsource.org/libs-milestone</url>
</repository>
</repositories>
</project>
210
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.5.2.1.2
Define-tramites-servicios-web-unificados-buscador
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>define-tramites-servicios-web-unificados</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</parent>
<artifactId>define-tramites-servicios-web-unificados-buscador</artifactId>
<name>define-tramites-servicios-web-unificados-buscador</name>
<packaging>war</packaging>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>
define-tramites-servicios-web-unificados-modelo
</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>
define-tramites-servicios-web-unificados-registrador
</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</dependency>
<!-- TESTING -->
<!-- Spring Test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework.version}</version>
<scope>test</scope>
</dependency>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
211
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<warName>buscador</warName>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
13.5.2.1.3
Define-tramites-servicios-web-unificados-modelo
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>define-tramites-servicios-web-unificados</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</parent>
<artifactId>define-tramites-servicios-web-unificados-modelo</artifactId>
<name>define-tramites-servicios-web-unificados-modelo</name>
<dependencies>
<!-- BBDD -->
<!-- Apache Cassandra Client (Hector) -->
<dependency>
<groupId>org.hectorclient</groupId>
<artifactId>hector-core</artifactId>
<version>1.1-2</version>
<exclusions>
212
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- PostgreSQL JDBC -->
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.jdbc.version}</version>
</dependency>
<!-- JPA Hibernate -->
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>${jpa.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${org.hibernate.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Gestor del pool -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${org.commons.jdbcp.version}</version>
</dependency>
<!-- Spring Data -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${org.springframework.data.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
13.5.2.1.4
Define-tramites-servicios-web-unificados-publisher
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>define-tramites-servicios-web-unificados</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</parent>
<artifactId>define-tramites-servicios-web-unificados-publisher</artifactId>
<packaging>war</packaging>
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
213
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<apache.cxf.version>2.7.11</apache.cxf.version>
</properties>
<name>publisher</name>
<dependencies>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- SW CXF -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${apache.cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${apache.cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>${apache.cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-policy</artifactId>
<version>${apache.cxf.version}</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
214
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>
define-tramites-servicios-web-unificados-modelo
</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>
define-tramites-servicios-web-unificados-service
</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>publisher</finalName>
<plugins>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-java2ws-plugin</artifactId>
<version>${apache.cxf.version}</version>
<executions>
<execution>
<id>generate-wsdl</id>
<phase>process-classes</phase>
<configuration>
<className>es.uniovi.innova.eadministracion.tramites.swu.service.ScholarshipServi
ce</className>
<genWsdl>true</genWsdl>
<verbose>true</verbose>
<outputFile>${basedir}/src/main/webapp/WEB-INF/wsdl/publisher.wsdl</outputFile>
</configuration>
<goals>
<goal>java2ws</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse
m2e settings
only. It has no influence on the Maven build
itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>
org.apache.cxf
</groupId>
<artifactId>
cxfjava2ws-plugin
</artifactId>
<versionRange>
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
215
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
[2.7.11,)
</versionRange>
<goals>
<goal>java2ws</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
13.5.2.1.5
Define-tramites-servicios-web-unificados-recolector
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>define-tramites-servicios-web-unificados</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</parent>
<artifactId>define-tramites-servicios-web-unificados-recolector</artifactId>
<name>define-tramites-servicios-web-unificados-recolector</name>
<dependencies>
<!-- WS dependencies -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${org.apache.cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${org.apache.cxf.version}</version>
</dependency>
<dependency>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>
define-tramites-servicios-web-unificados-modelo
</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</dependency>
216
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
<dependency>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>
define-tramites-servicios-web-unificados-service
</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</dependency>
<!-- TESTING -->
<!-- Spring Test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework.version}</version>
<scope>test</scope>
</dependency>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
13.5.2.1.6
Define-tramites-servicios-web-unificados-registrador
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>define-tramites-servicios-web-unificados</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</parent>
<artifactId>define-tramites-servicios-web-unificados-registrador</artifactId>
<name>define-tramites-servicios-web-unificados-registrador</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>METAINF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>METAINF/spring.schemas</resource>
</transformer>
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
217
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransform
er">
<mainClass>es.uniovi.innova.eadministracion.tramites.swu.main.ProcessTest</mainCl
ass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>
define-tramites-servicios-web-unificados-modelo
</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>
define-tramites-servicios-web-unificados-service
</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</dependency>
<!-- TESTING -->
<!-- Spring Test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework.version}</version>
<scope>test</scope>
</dependency>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
13.5.2.1.7
Define-tramites-servicios-web-unificados-service
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>define-tramites-servicios-web-unificados</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</parent>
<artifactId>define-tramites-servicios-web-unificados-service</artifactId>
<name>define-tramites-servicios-web-unificados-service</name>
<url>http://maven.apache.org</url>
<properties>
218
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>es.uniovi.innova.tramites</groupId>
<artifactId>
define-tramites-servicios-web-unificados-modelo
</artifactId>
<version>1.0.1-BUILD-SNAPSHOT</version>
</dependency>
<!-- WS dependencies -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${org.apache.cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${org.apache.cxf.version}</version>
</dependency>
<dependency>
<groupId>uk.ac.shef.wit</groupId>
<artifactId>simmetrics</artifactId>
<version>1.6.2</version>
</dependency>
<!-- TESTING -->
<!-- Spring Test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework.version}</version>
<scope>test</scope>
</dependency>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>simmetrics</id>
<url>http://maven.mse.jhu.edu/m2repository/</url>
</repository>
</repositories>
</project>
13.5.3
Log4j.properties
# Niveles de Log
log4j.rootLogger=TRACE, stdout
# Configuración del Appender de la consola
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold=INFO
# Patrón de salida
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p %-30.30c{1} %x - %m%n
# Excluyendo
log4j.logger.me.prettyprint.cassandra.connection.factory.HThriftClientFactoryImpl=WARN
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
219
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
log4j.logger.org.hibernate=WARN
log4j.logger.org.springframework=WARN
13.5.4
Database.properties
#POSTGRESQL
jdbc = jdbc:postgresql://localhost:5432/universidades
login = univ
pass = univ
driver = org.postgresql.Driver
13.5.5
Persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="swu-test-jpa">
<class>es.uniovi.innova.eadministracion.tramites.swu.model.Beca</class>
<class>es.uniovi.innova.eadministracion.tramites.swu.model.Solicitante</class>
<class>es.uniovi.innova.eadministracion.tramites.swu.model.Vicerrectorado</class>
<class>es.uniovi.innova.eadministracion.tramites.swu.model.University</class>
<class>es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper</
class>
<class>es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapp
er</class>
<class>es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapp
erDocument</class>
<properties>
<property name="hibernate.dialect"
value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="create" />
<property name="hibernate.show_sql" value="false" />
</properties>
</persistence-unit>
</persistence>
13.5.6
Orm.xml
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
version="2.0">
<!-- Queries -->
<named-query name="ModelWrapper.findByUniversityClazz">
<query>
select mw from ModelWrapper mw where mw.university = ?1 and mw.clazz= ?2
</query>
220
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
</named-query>
<named-query name="OperationWrapper.findByMatchAndUniversityId">
<query>
select ow from OperationWrapper ow where ow.match = ?1 and
ow.university.id = ?2
</query>
</named-query>
</entity-mappings>
13.5.7
Beans
13.5.7.1
Servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing
infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<mvc:annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving
up static resources in the ${webappRoot}/resources directory -->
<mvc:resources location="/resources/" mapping="/resources/**" />
<mvc:resources location="/images/" mapping="/images/**" />
<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/js/" mapping="/js/**" />
<mvc:resources location="/less/" mapping="/less/**" />
<mvc:resources location="/font/" mapping="/font/**" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources
in the /WEB-INF/views directory -->
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop
key="es.uniovi.innova.eadministracion.tramites.swu.exception.GenericException">
GenericExceptionPage
</prop>
</props>
</property>
</bean>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<context:component-scan basepackage="es.uniovi.innova.eadministracion.tramites.swu" />
<bean
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostPr
ocessor" />
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
221
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="language" />
</bean>
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandle
rMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor" />
</list>
</property>
</bean>
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages" />
</bean>
<import resource="persistence-beans.xml" />
</beans>
13.5.7.2
Persistence-beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:solr="http://www.springframework.org/schema/data/solr"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/data/solr
http://www.springframework.org/schema/data/solr/spring-solr.xsd">
<jpa:repositories
base-package="es.uniovi.innova.eadministracion.tramites.swu.persistence"
/>
<context:property-placeholder
location="/WEB-INF/spring/appServlet/database.properties" />
<context:annotation-config />
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${jdbc}" />
<property name="username" value="${login}" />
<property name="password" value="${pass}" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="swu-jpa" />
222
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<solr:repositories
base-package="es.uniovi.innova.eadministracion.tramites.swu.util.solr" />
<solr:solr-server id="solrServer" url="http://127.0.0.1:8983/solr/" />
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg index="0" ref="solrServer" />
</bean>
</beans>
13.5.7.3
Spring-context.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:solr="http://www.springframework.org/schema/data/solr"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/data/solr
http://www.springframework.org/schema/data/solr/spring-solr.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="ScholarshipServiceEndpoint"
implementor="#ScholarshipService" address="/ScholarshipService">
<jaxws:properties>
<entry key="mtom-enabled" value="true" />
</jaxws:properties>
</jaxws:endpoint>
<bean id="ScholarshipService"
class="es.uniovi.innova.eadministracion.tramites.swu.service.ScholarshipService"/>
<context:component-scan basepackage="es.uniovi.innova.eadministracion.tramites.swu" />
<jpa:repositories
base-package="es.uniovi.innova.eadministracion.tramites.swu.persistence"
/>
<context:property-placeholder location="/WEB-INF/database.properties" />
<context:annotation-config />
<tx:annotation-driven transaction-manager="transactionManager" />
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
223
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
<bean
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostPr
ocessor" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${jdbc}" />
<property name="username" value="${login}" />
<property name="password" value="${pass}" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="swu-jpa" />
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<solr:repositories
base-package="es.uniovi.innova.eadministracion.tramites.swu.util.solr" />
<solr:solr-server id="solrServer" url="http://127.0.0.1:8983/solr/" />
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg index="0" ref="solrServer" />
</bean>
</beans>
13.5.8
Publisher.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="ScholarshipService"
targetNamespace="http://innova.uniovi.es/ScholarshipService"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://innova.uniovi.es/ScholarshipService"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types>
<xs:schema xmlns:tns="http://innova.uniovi.es/ScholarshipService"
xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified"
targetNamespace="http://innova.uniovi.es/ScholarshipService" version="1.0">
<xs:element name="getBecasByParam" type="tns:getBecasByParam"/>
<xs:element name="getBecasByParamResponse" type="tns:getBecasByParamResponse"/>
<xs:complexType name="getBecasByParam">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="xs:anyType"/>
<xs:element minOccurs="0" name="arg1" type="xs:string"/>
<xs:element minOccurs="0" name="arg2" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getBecasByParamResponse">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="tns:beca"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="beca">
<xs:sequence>
224
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
<xs:element minOccurs="0"
<xs:element minOccurs="0"
<xs:element minOccurs="0"
<xs:element minOccurs="0"
<xs:element minOccurs="0"
<xs:element minOccurs="0"
type="xs:string"/>
<xs:element minOccurs="0"
</xs:sequence>
</xs:complexType>
name="asunto_convocatoria" type="xs:string"/>
name="cuantia_otorgada" type="xs:double"/>
name="curso_academico" type="xs:string"/>
name="destino" type="xs:string"/>
name="estado_solicitud" type="xs:string"/>
name="nombre_procedimiento_convocatoria"
name="solicitante" type="tns:solicitante"/>
<xs:complexType name="solicitante">
<xs:sequence>
<xs:element minOccurs="0" name="apellido1_solicitante" type="xs:string"/>
<xs:element minOccurs="0" name="apellido2_solicitante" type="xs:string"/>
<xs:element minOccurs="0" name="documento_identificativo" type="xs:string"/>
<xs:element minOccurs="0" name="estudios" type="xs:string"/>
<xs:element minOccurs="0" name="fecha_nacimiento" type="xs:int"/>
<xs:element minOccurs="0" name="nacionalidad" type="xs:string"/>
<xs:element minOccurs="0" name="nombre_solicitante" type="xs:string"/>
<xs:element minOccurs="0" name="sexo" type="xs:string"/>
<xs:element minOccurs="0" name="tipo_documento_identificativo" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="getBecasByParam">
<wsdl:part name="parameters" element="tns:getBecasByParam">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getBecasByParamResponse">
<wsdl:part name="parameters" element="tns:getBecasByParamResponse">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ScholarshipService">
<wsdl:operation name="getBecasByParam">
<wsdl:input name="getBecasByParam" message="tns:getBecasByParam">
</wsdl:input>
<wsdl:output name="getBecasByParamResponse" message="tns:getBecasByParamResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ScholarshipServiceSoapBinding" type="tns:ScholarshipService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getBecasByParam">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="getBecasByParam">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getBecasByParamResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ScholarshipService">
<wsdl:port name="ScholarshipServicePort"
binding="tns:ScholarshipServiceSoapBinding">
<soap:address location="http://localhost:9090/ScholarshipServicePort"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
225
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.6 Código Fuente
13.6.1 Define-tramites-servicios-web-unificadosbuscador
13.6.1.1
er
Es.uniovi.innova.eadministracion.tramites.swu.controll
13.6.1.1.1
ErrorController.java
package es.uniovi.innova.eadministracion.tramites.swu.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import es.uniovi.innova.eadministracion.tramites.swu.exception.GenericException;
/**
* Controlador que mapea los errores genéricos de la aplicación
*
* @author danielmf
*
*/
@Controller
public class ErrorController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
throw new GenericException("No se ha podido satisfacer su petición.");
}
}
13.6.1.1.2
HomeController.java
package es.uniovi.innova.eadministracion.tramites.swu.controller;
import
import
import
import
import
org.slf4j.Logger;
org.slf4j.LoggerFactory;
org.springframework.stereotype.Controller;
org.springframework.web.bind.annotation.RequestMapping;
org.springframework.web.bind.annotation.RequestMethod;
/**
* Controlador de la página inicial (Buscador)
*
* @author danielmf
*
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory
.getLogger(HomeController.class);
/**
226
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
* Filtra el tráfico inicial a la home
*
* @return
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home() {
logger.info("Entrando en la página principal...");
return "home";
}
/**
* Mapea las peticiones para el formulario de registro de los Servicios Web
* en la url /form
*
* @return
*/
@RequestMapping(value = "/form")
public String form() {
logger.info("Comenzando el proceso de registro...");
return "register";
}
/**
* Mapea las peticiones para la información del Recolector de Becas en la
* url /retriever
*
* @return
*/
@RequestMapping(value = "/retriever")
public String retriever() {
logger.info("Mostrando el recolector...");
return "retriever";
}
/**
* Mapea las peticiones para la página de información en la url /info
*
* @return
*/
@RequestMapping(value = "/info")
public String info() {
logger.info("Mostrando la información...");
return "info";
}
}
13.6.1.2
*.search
13.6.1.2.1
SearchEngineController.java
package es.uniovi.innova.eadministracion.tramites.swu.controller.search;
import javax.inject.Inject;
import
import
import
import
import
import
import
org.slf4j.Logger;
org.slf4j.LoggerFactory;
org.springframework.stereotype.Controller;
org.springframework.ui.Model;
org.springframework.web.bind.annotation.RequestMapping;
org.springframework.web.bind.annotation.RequestMethod;
org.springframework.web.bind.annotation.RequestParam;
import es.uniovi.innova.eadministracion.tramites.swu.view.ISearchView;
import es.uniovi.innova.eadministracion.tramites.swu.view.ISearchViewNoScript;
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
227
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
/**
* Controlador del componente Buscador. Atenderá las peticiones que sean de su
* responsabilidad mediante las direcciones filtradas en los métodos.
*
* @author danielmf
*
*/
@Controller
public class SearchEngineController {
@Inject
private ISearchView searchView;
@Inject
private ISearchViewNoScript searchViewNoScript;
private static Logger logger = LoggerFactory
.getLogger(SearchEngineController.class);
/**
* Filtra las peticiones del buscador que atiendan a la url /searchMin
*
* @param search
*
parametro que llega del formulario
* @param model
*
modelo para devolver la respuesta
*
* @return
*/
@RequestMapping(value = "/searchMin", method = RequestMethod.POST)
public String search(@RequestParam("search_text") String search, Model model) {
logger.info("[JS ON]Buscando: " + search);
return searchView.execute(search, model);
}
/**
* Filtra las peticiones del buscador con el JavaScript desactivado en la
* url /search
*
* @param search
*
parámetro que llega del formulario
* @param model
*
modelo para devolver la respuesta
*
* @return
*/
@RequestMapping(value = "/search", method = RequestMethod.POST)
public String searchNoScript(@RequestParam("search_text") String search,
Model model) {
logger.info("[JS OFF]Buscando: " + search);
return searchViewNoScript.execute(search, model);
}
}
228
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.6.1.3
*.university
13.6.1.3.1
BecaFormController.java
package es.uniovi.innova.eadministracion.tramites.swu.controller.university;
import java.util.List;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import
import
import
import
import
import
import
import
import
import
org.slf4j.Logger;
org.slf4j.LoggerFactory;
org.springframework.stereotype.Controller;
org.springframework.ui.Model;
org.springframework.validation.BindingResult;
org.springframework.web.bind.annotation.ModelAttribute;
org.springframework.web.bind.annotation.RequestMapping;
org.springframework.web.bind.annotation.RequestMethod;
org.springframework.web.bind.annotation.SessionAttributes;
org.springframework.web.bind.support.SessionStatus;
import
import
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.builder.BecaDirectorForm;
es.uniovi.innova.eadministracion.tramites.swu.business.WebServiceManagerService;
es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
es.uniovi.innova.eadministracion.tramites.swu.model.University;
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.BecaWrapper;
es.uniovi.innova.eadministracion.tramites.swu.view.IMatchBecaView;
/**
* Controlador del formulario del modelo {@link Beca}. Atenderá las peticiones
* que sean de su responsabilidad mediante las direcciones filtradas en los
* métodos.
*
* @author danielmf
*
*/
@Controller
@RequestMapping("/beca")
@SessionAttributes("beca")
public class BecaFormController {
private static Logger logger = LoggerFactory
.getLogger(BecaFormController.class);
@Inject
private IMatchBecaView becaView;
@Inject
private WebServiceManagerService webServiceService;
@Inject
private BecaDirectorForm builder;
/**
* Recoge la acción procesada al enviar el formulario del modelo
* {@link Beca}
*
* @param beca
*
Modelo que será mapeado por el formulario
* @param result
*
Resultado del mapeo del formulario
* @param status
*
estado de la sesión, en caso de que exista algo que no ocurra
*
como debiera
* @param request
* @param model
*
Model para realizar el binding
*
* @return vista donde se devolverá el control
*/
@RequestMapping(method = RequestMethod.POST)
public String submitForm(@ModelAttribute("beca") BecaWrapper beca,
BindingResult result, SessionStatus status,
HttpServletRequest request, Model model) {
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
229
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
logger.info("Envío de Formulario: " + beca);
return becaView.execute(request, beca, model, result);
}
/**
* Prepara el formulario de la {@link Beca} rellenando sus campos
* previamente con el modelo
*
* @param model
*
a rellenar previa ejecución del formulario
* @param request
* @return vista a devolver el control
*/
@RequestMapping(method = RequestMethod.GET)
public String setupForm(Model model, HttpServletRequest request) {
List<String> fields = webServiceService.getClassFields((String) request
.getSession().getAttribute("modelo"), ((University) request
.getSession().getAttribute("university")).getWsdl());
BecaWrapper beca = builder.build(fields);
logger.info("Setup form: " + beca);
model.addAttribute("beca", beca);
return "beca";
}
}
13.6.1.3.2
OperationsFormController.java
package es.uniovi.innova.eadministracion.tramites.swu.controller.university;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import
import
import
import
import
import
org.slf4j.Logger;
org.slf4j.LoggerFactory;
org.springframework.stereotype.Controller;
org.springframework.web.bind.annotation.RequestMapping;
org.springframework.web.bind.annotation.RequestMethod;
org.springframework.web.bind.annotation.RequestParam;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.view.IMatchOperationsView;
/**
* Controlador de gestión del formulario de Operaciones de los servicios web
*
* @author danielmf
*
*/
@Controller
@RequestMapping("/operations")
public class OperationsFormController {
private static Logger logger = LoggerFactory
.getLogger(OperationsFormController.class);
@Inject
private IMatchOperationsView matchOperationsView;
/**
* Recoge
* {@link
*
* @param
* @param
*
* @param
*
* @param
230
la acción procesada al enviar el formulario del modelo
OperationWrapper}
request
modelo
clase que emparejará con el modelo de referencia
VC
operacion para las becas del vicerrectorado
curso
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
*
operacion para las becas del curso
* @param alumno
*
operacion para las becas por alumno
* @return
*/
@RequestMapping(method = RequestMethod.POST)
public String submitForm(HttpServletRequest request,
@RequestParam("modelo") String modelo,
@RequestParam("VICERRECTORADO") String VC,
@RequestParam("CURSO") String curso,
@RequestParam("ALUMNO") String alumno) {
logger.info("Modelo: " + modelo + ", [VICERRECTORADO,CURSO,ALUMNO]: ["
+ VC + ", " + curso + ", " + alumno + "]");
return matchOperationsView.execute(request, modelo, VC, curso, alumno);
}
}
13.6.1.3.3
SolicitanteFormController.java
package es.uniovi.innova.eadministracion.tramites.swu.controller.university;
import java.util.List;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import
import
import
import
import
import
import
import
import
import
org.slf4j.Logger;
org.slf4j.LoggerFactory;
org.springframework.stereotype.Controller;
org.springframework.ui.Model;
org.springframework.validation.BindingResult;
org.springframework.web.bind.annotation.ModelAttribute;
org.springframework.web.bind.annotation.RequestMapping;
org.springframework.web.bind.annotation.RequestMethod;
org.springframework.web.bind.annotation.SessionAttributes;
org.springframework.web.bind.support.SessionStatus;
import
import
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.builder.BecaDirectorForm;
es.uniovi.innova.eadministracion.tramites.swu.business.WebServiceManagerService;
es.uniovi.innova.eadministracion.tramites.swu.model.Solicitante;
es.uniovi.innova.eadministracion.tramites.swu.model.University;
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.SolicitanteWrapper;
es.uniovi.innova.eadministracion.tramites.swu.view.ISaveProcessView;
/**
* Controlador de gestión del formulario de {@link Solicitante}
*
* @author danielmf
*
*/
@Controller
@RequestMapping("/solicitante")
@SessionAttributes("solicitante")
public class SolicitanteFormController {
private static Logger logger = LoggerFactory
.getLogger(SolicitanteFormController.class);
@Inject
private ISaveProcessView saveProcessView;
@Inject
private WebServiceManagerService webServiceService;
@Inject
private BecaDirectorForm builder;
/**
*
* @param solicitante
*
clase que se mapeará en el formulario
* @param result
*
resultado del mapeo
* @param status
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
231
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
*
estado para obtener los errores
* @param request
* @param model
* @return
*/
@RequestMapping(method = RequestMethod.POST)
public String submitForm(
@ModelAttribute("solicitante") SolicitanteWrapper solicitante,
BindingResult result, SessionStatus status,
HttpServletRequest request, Model model) {
logger.info("Enviando formulario: " + solicitante);
return saveProcessView.execute(request, solicitante, model, result);
}
/**
* Preparación del formulario del modelo para inyectar campos previamente
*
* @param model
* @param request
* @return
*/
@RequestMapping(method = RequestMethod.GET)
public String setupForm(Model model, HttpServletRequest request) {
List<String> fields = webServiceService.getClassFields((String) request
.getSession().getAttribute("modelo"), ((University) request
.getSession().getAttribute("university")).getWsdl());
SolicitanteWrapper solicitante = builder.buildSol(fields);
logger.info("Setup form: " + solicitante);
model.addAttribute("solicitante", solicitante);
return "solicitante";
}
}
13.6.1.3.4
UniversityController.java
package es.uniovi.innova.eadministracion.tramites.swu.controller.university;
import javax.inject.Inject;
import
import
import
import
org.springframework.stereotype.Controller;
org.springframework.ui.Model;
org.springframework.web.bind.annotation.PathVariable;
org.springframework.web.bind.annotation.RequestMapping;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.view.IDetailView;
/**
* Controlador de la {@link University}
*
* @author danielmf
*
*/
@Controller
public class UniversityController {
@Inject
private IDetailView detailView;
@Inject
private IDetailView detailViewFull;
/**
* Filtra las peticiones para el detalle de una universidad en caso de que
* se procese la petición mediante JavaScript
*
* @param id
*
de la {@link University}
232
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
* @param model
*
para devolver el resultado
*
* @return
*/
@RequestMapping(value = "/univ/{univ}/min")
public String detail(@PathVariable("univ") Long id, Model model) {
return detailView.execute(id, model);
}
/**
* Filtra las peticiones para el detalle de una universidad en caso de que
* la petición se ejecute sin JavaScript
*
* @param id
*
de la {@link University}
* @param model
*
para devolver el resultado
* @return
*/
@RequestMapping(value = "/univ/{univ}")
public String detailFull(@PathVariable("univ") Long id, Model model) {
return detailViewFull.execute(id, model);
}
}
13.6.1.3.5
UniversityFormController.java
package es.uniovi.innova.eadministracion.tramites.swu.controller.university;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import
import
import
import
import
import
import
import
import
import
org.slf4j.Logger;
org.slf4j.LoggerFactory;
org.springframework.stereotype.Controller;
org.springframework.ui.Model;
org.springframework.validation.BindingResult;
org.springframework.web.bind.annotation.ModelAttribute;
org.springframework.web.bind.annotation.RequestMapping;
org.springframework.web.bind.annotation.RequestMethod;
org.springframework.web.bind.annotation.SessionAttributes;
org.springframework.web.bind.support.SessionStatus;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.view.ICheckOperationsView;
/**
* Controlador del formulario del modelo {@link University}
*
* @author danielmf
*
*/
@Controller
@RequestMapping("/form")
@SessionAttributes("university")
public class UniversityFormController {
private static Logger logger = LoggerFactory
.getLogger(UniversityFormController.class);
@Inject
private ICheckOperationsView checkOperationsView;
/**
* Prepara el formulario inyectando los parámetros necesarios para rellenar
* los campos
*
* @param model
* @return
*/
@RequestMapping(method = RequestMethod.GET)
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
233
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
public String setupForm(Model model) {
University university = new University();
model.addAttribute("university", university);
logger.info("Preparando el formulario: " + university);
return "register";
}
/**
* Recoge los datos del fomulario y los valida para continuar con el
* registro del formulario
*
* @param university
*
objeto {@link University} rellena del formulario
* @param result
*
para devolver mensajes a la vista
* @param status
*
con el estado de la petición
* @param request
* @param model
* @return vista a la que quiere devolversele el control
*/
@RequestMapping(method = RequestMethod.POST)
public String submitForm(
@ModelAttribute("university") University university,
BindingResult result, SessionStatus status,
HttpServletRequest request, Model model) {
logger.info("Enviando el formulario: " + university);
university.setName(university.getName().toUpperCase());
return checkOperationsView.execute(request, university, model, result);
}
}
13.6.1.4
Es.uniovi.innova.eadministracion.tramites.swu.validate
13.6.1.4.1
BecaWrapperValidator.java
package es.uniovi.innova.eadministracion.tramites.swu.validate;
import javax.inject.Named;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.BecaWrapper;
/**
* Validador del formulario de la {@link Beca}
*
* @author danielmf
*
*/
@Named
public class BecaWrapperValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return BecaWrapper.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors,
"nombre_procedimiento_convocatoria", "form.error.field",
"Nombre procedimiento convocatoria es requerido");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "destino",
"form.error.field", "Destino es requerido");
234
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "cuantia_otorgada",
"form.error.field", "Cuantia otorgada es requerido");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "curso_academico",
"form.error.field", "Curso académico es requerido");
}
}
13.6.1.4.2
OperationsValidator.java
package es.uniovi.innova.eadministracion.tramites.swu.validate;
import javax.inject.Named;
import es.uniovi.innova.eadministracion.tramites.swu.exception.GenericException;
/**
* Validador del formulario de las operaciones
*
* @author danielmf
*
*/
@Named
public class OperationsValidator {
public void validate(String modelo, String curso, String alumno, String vc) {
boolean flag = false;
if (modelo == null || modelo.equalsIgnoreCase(""))
throw new GenericException("Debe introducir un modelo.");
if (!curso.contains("0"))
flag = true;
else if (!alumno.contains("0"))
flag = true;
else if (!vc.contains("0")) {
flag = true;
}
if (!flag) {
throw new GenericException("Debe soportar al menos una
operación.");
} else if ((!flag)
&& (curso.equalsIgnoreCase(alumno) && !curso.contains("0"))
|| (curso.equalsIgnoreCase(vc) && !curso.contains("0"))
|| (vc.equalsIgnoreCase(alumno) && !vc.contains("0"))) {
throw new GenericException("Cada operación debe de ser única");
}
}
}
13.6.1.4.3
SolicitanteWrapperValidator.java
package es.uniovi.innova.eadministracion.tramites.swu.validate;
import javax.inject.Named;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import es.uniovi.innova.eadministracion.tramites.swu.model.Solicitante;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.SolicitanteWrapper;
/**
* Validador del formulario para el modelo {@link Solicitante}
*
* @author danielmf
*
*/
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
235
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
@Named
public class SolicitanteWrapperValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return SolicitanteWrapper.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "nombre_solicitante",
"form.error.field", "Nombre del solicitante es requerido");
ValidationUtils.rejectIfEmptyOrWhitespace(errors,
"apellido1_solicitante", "form.error.field",
"Apellido1 es requerido");
ValidationUtils.rejectIfEmptyOrWhitespace(errors,
"documento_identificativo", "form.error.field",
"Documento identificativo es requerido");
ValidationUtils.rejectIfEmptyOrWhitespace(errors,
"tipo_documento_identificativo", "form.error.field",
"Tipo documento identificativo es requerido");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "estudios",
"form.error.field", "Estudios es requerido");
}
}
13.6.1.4.4
UniversityValidator.java
package es.uniovi.innova.eadministracion.tramites.swu.validate;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import es.uniovi.innova.eadministracion.tramites.swu.business.UniversityManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.business.WebServiceManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
/**
* Validador del formulario del modelo {@link University}
*
* @author danielmf
*
*/
@Named
public class UniversityValidator implements Validator {
@Inject
private UniversityManagerService universityService;
@Inject
private WebServiceManagerService webServiceService;
@Override
public boolean supports(Class<?> clazz) {
return University.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name",
"form.error.name", "Nombre es requerido");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "wsdl",
"form.error.wsdl", "WSDL es requerido");
University university = (University) target;
String wsdl = university.getWsdl();
236
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
String name = university.getName();
if (wsdl != null) {
if (universityService.findUniversityByWsdl(wsdl) != null) {
errors.rejectValue("wsdl", "form.error.wsdl.dup",
"Ya está registrado este WSDL");
}
List<String> l = webServiceService.getOperations(wsdl);
if (l == null || l.size() <= 0)
errors.rejectValue("wsdl", "form.error.wsd.inv",
"No se han podido conectar con el WSDL");
}
if (name != null) {
if (universityService.findUniversityByName(name) != null) {
errors.rejectValue("name", "form.error.name.dup",
"Ya está registrada esta Universidad");
}
}
}
}
13.6.1.5
Es.uniovi.innova.eadministracion.tramites.swu.view
13.6.1.5.1
ICheckOperationsView.java
package es.uniovi.innova.eadministracion.tramites.swu.view;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
/**
* Resuelve la vista del formulario de la {@link University}
*
* @author danielmf
*
*/
public interface ICheckOperationsView {
String execute(HttpServletRequest request, University university,
Model model, BindingResult result);
}
13.6.1.5.2
IDetailView.java
package es.uniovi.innova.eadministracion.tramites.swu.view;
import org.springframework.ui.Model;
/**
* Resuelve la vista del detalle de una universidad
*
* @author danielmf
*
*/
public interface IDetailView {
String execute(Long id, Model model);
}
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
237
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.6.1.5.3
IMatchBecaView.java
package es.uniovi.innova.eadministracion.tramites.swu.view;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.BecaWrapper;
/**
* Resuelve la vista del matcher de la {@link Beca}
*
* @author danielmf
*
*/
public interface IMatchBecaView {
String execute(HttpServletRequest request, BecaWrapper beca, Model model,
BindingResult result);
}
13.6.1.5.4
IMatchOperationsView.java
package es.uniovi.innova.eadministracion.tramites.swu.view;
import javax.servlet.http.HttpServletRequest;
/**
* Resuelve la vista de la selección de operaciones
*
* @author danielmf
*
*/
public interface IMatchOperationsView {
String execute(HttpServletRequest request, String modelo, String VC,
String curso, String alumno);
}
13.6.1.5.5
ISaveProcessView.java
package es.uniovi.innova.eadministracion.tramites.swu.view;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import es.uniovi.innova.eadministracion.tramites.swu.model.Solicitante;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.SolicitanteWrapper;
/**
* Resuelve la vista que finaliza el proceso de registro, además, es el del
* modelo {@link Solicitante}
*
* @author danielmf
*
*/
public interface ISaveProcessView {
String execute(HttpServletRequest request, SolicitanteWrapper solicitante,
Model model, BindingResult result);
238
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
}
13.6.1.5.6
ISearchView.java
package es.uniovi.innova.eadministracion.tramites.swu.view;
import org.springframework.ui.Model;
/**
* Resuelve la vista del buscador
*
* @author danielmf
*
*/
public interface ISearchView {
String execute(String search, Model model);
}
13.6.1.5.7
ISearchViewNoScript.java
package es.uniovi.innova.eadministracion.tramites.swu.view;
import org.springframework.ui.Model;
/**
* Resuelve la vista del detalle en caso de que no haya JavaScript activado
* (Solucionando problemas de AJAX)
*
* @author danielmf
*
*/
public interface ISearchViewNoScript {
String execute(String search, Model model);
}
13.6.1.6
*.search
13.6.1.6.1
SearchView.java
package es.uniovi.innova.eadministracion.tramites.swu.view.search;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.ui.Model;
import es.uniovi.innova.eadministracion.tramites.swu.business.SearchEngineService;
import es.uniovi.innova.eadministracion.tramites.swu.view.ISearchView;
/**
* Resuelve la vista del buscador mediante la implementación del patrón Command
*
* @author danielmf
*
*/
@Named
public class SearchView implements ISearchView {
@Inject
private SearchEngineService searchEngine;
public String execute(String search, Model model) {
if (search == null)
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
239
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
return "home";
else {
model.addAttribute("results",
searchEngine.searchOperations(search));
model.addAttribute("keyword", search);
}
return "searchResult";
}
}
13.6.1.6.2
SearchViewNoScript.java
package es.uniovi.innova.eadministracion.tramites.swu.view.search;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.ui.Model;
import es.uniovi.innova.eadministracion.tramites.swu.business.SearchEngineService;
import es.uniovi.innova.eadministracion.tramites.swu.view.ISearchViewNoScript;
/**
* Resuelve la vista del buscador en caso de que no haya JavaScript activado
* mediante la aplicación del patrón Command
*
* @author danielmf
*
*/
@Named
public class SearchViewNoScript implements ISearchViewNoScript {
@Inject
private SearchEngineService searchEngine;
@Override
public String execute(String search, Model model) {
if (search == null)
return "home";
else {
model.addAttribute("results",
searchEngine.searchOperations(search));
model.addAttribute("keyword", search);
}
return "searchResultFull";
}
}
13.6.1.7
*.university
13.6.1.7.1
CheckOperationsView.java
package es.uniovi.innova.eadministracion.tramites.swu.view.university;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import
import
import
import
org.slf4j.Logger;
org.slf4j.LoggerFactory;
org.springframework.ui.Model;
org.springframework.validation.BindingResult;
import es.uniovi.innova.eadministracion.tramites.swu.business.WebServiceManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.validate.UniversityValidator;
240
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
import es.uniovi.innova.eadministracion.tramites.swu.view.ICheckOperationsView;
/**
* Clase que implementa un patrón Command para resolver la vista de las
* operaciones
*
* @author danielmf
*
*/
@Named
public class CheckOperationsView implements ICheckOperationsView {
@Inject
private WebServiceManagerService webServiceManager;
@Inject
private UniversityValidator validator;
private static Logger logger = LoggerFactory
.getLogger(CheckOperationsView.class);
@Override
public String execute(HttpServletRequest request, University university,
Model model, BindingResult result) {
logger.info("Comprobando universidad: [" + university + "]");
validator.validate(university, result);
if (result.hasErrors()) {
model.addAttribute("university", university);
return "register";
}
request.getSession().setAttribute("university", university);
logger.info("Operaciones: "
+ webServiceManager.getOperations(university.getWsdl()));
model.addAttribute("ops",
webServiceManager.getOperations(university.getWsdl()));
return "operations";
}
}
13.6.1.7.2
DetailView.java
package es.uniovi.innova.eadministracion.tramites.swu.view.university;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.Model;
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.business.UniversityManagerService;
es.uniovi.innova.eadministracion.tramites.swu.exception.GenericException;
es.uniovi.innova.eadministracion.tramites.swu.model.University;
es.uniovi.innova.eadministracion.tramites.swu.view.IDetailView;
/**
* Resuelve la vista del detalle de la {@link University} mediante un Command
*
* @author danielmf
*
*/
@Named
public class DetailView implements IDetailView {
private static Logger logger = LoggerFactory.getLogger(DetailView.class);
@Inject
private UniversityManagerService universityService;
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
241
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
public String execute(Long id, Model model) {
logger.info("Detalle de la Universidad: " + id);
if (id == null)
return "home";
else {
University u = universityService.findUniversity(id);
if (u != null) {
model.addAttribute("university", u);
return "detail";
} else
throw new GenericException("La Universidad no está
disponible.");
}
}
}
13.6.1.7.3
DetailViewFull.java
package es.uniovi.innova.eadministracion.tramites.swu.view.university;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.Model;
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.business.UniversityManagerService;
es.uniovi.innova.eadministracion.tramites.swu.exception.GenericException;
es.uniovi.innova.eadministracion.tramites.swu.model.University;
es.uniovi.innova.eadministracion.tramites.swu.view.IDetailView;
/**
* Resuelve la vista del detalle de la {@link University} cuando no está
* habilitado el JavaScript
*
* @author danielmf
*
*/
@Named
public class DetailViewFull implements IDetailView {
private static Logger logger = LoggerFactory
.getLogger(DetailViewFull.class);
@Inject
private UniversityManagerService universityService;
@Override
public String execute(Long id, Model model) {
logger.info("Detail: " + id);
if (id == null)
return "home";
else {
University u = universityService.findUniversity(id);
if (u != null) {
model.addAttribute("university", u);
return "detailFull";
} else
throw new GenericException("La Universidad no está
disponible.");
}
}
}
242
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.6.1.7.4
MatchBecaView.java
package es.uniovi.innova.eadministracion.tramites.swu.view.university;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.BecaWrapper;
es.uniovi.innova.eadministracion.tramites.swu.validate.BecaWrapperValidator;
es.uniovi.innova.eadministracion.tramites.swu.view.IMatchBecaView;
/**
* Resuelve la vista para el matcheador de la beca mediante un Command
*
* @author danielmf
*
*/
@Named
public class MatchBecaView implements IMatchBecaView {
@Inject
private BecaWrapperValidator validator;
@Override
public String execute(HttpServletRequest request, BecaWrapper beca,
Model model, BindingResult result) {
Map<String, String> fields = putAttributes(beca);
validator.validate(beca, result);
if (result.hasErrors()) {
model.addAttribute("beca", beca);
return "beca";
}
request.getSession().setAttribute("beca_fields", fields);
return "redirect:solicitante";
}
/**
* Se encarga de meter en la session un Map con los atributos de la
* {@link Beca}
*
* @param beca
*
recogida del formulario
*
* @return Map con el campo y el emparejamiento recogido en el formulario
*/
private Map<String, String> putAttributes(BecaWrapper beca) {
Map<String, String> fields = new HashMap<String, String>();
fields.put("nombre_procedimiento_convocatoria",
beca.getNombre_procedimiento_convocatoria());
fields.put("asunto_convocatoria", beca.getAsunto_convocatoria());
fields.put("estado_solicitud", beca.getEstado_solicitud());
fields.put("destino", beca.getDestino());
fields.put("cuantia_otorgada", beca.getCuantia_otorgada());
fields.put("curso_academico", beca.getCurso_academico());
return fields;
}
}
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
243
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.6.1.7.5
MatchOperationsView.java
package es.uniovi.innova.eadministracion.tramites.swu.view.university;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import es.uniovi.innova.eadministracion.tramites.swu.util.Helper;
import es.uniovi.innova.eadministracion.tramites.swu.validate.OperationsValidator;
import es.uniovi.innova.eadministracion.tramites.swu.view.IMatchOperationsView;
/**
* Resuelve la vista para el emparejador de las operaciones
*
* @author danielmf
*
*/
@Named
public class MatchOperationsView implements IMatchOperationsView {
private static Logger logger = LoggerFactory
.getLogger(MatchOperationsView.class);
@Inject
private OperationsValidator operationsValidator;
public String execute(HttpServletRequest request, String modelo, String VC,
String curso, String alumno) {
logger.info("Operaciones: [" + VC + ", " + curso + ", " + alumno + "]");
operationsValidator.validate(modelo, curso, alumno, VC);
String packagge = " ";
Map<String, String> operations = new HashMap<String, String>();
packagge = setOperations(VC, curso, alumno, operations);
modelo = packagge + modelo;
logger.info("Modelo: " + modelo);
request.getSession().setAttribute("modelo", modelo);
request.getSession().setAttribute("operations", operations);
return "redirect:beca";
}
/**
* Comprueba y almacena en un Map las operaciones seleccionadas en el
* formulario
*
* @param VC
*
operación que relaciona con el Vicerrectorado
* @param curso
*
operación que relacion con el curso
* @param alumno
*
operación que relaciona con el alumno
* @param operations
*
mapa donde se almacenan las operaciones
*
* @return el nombre del paquete para recoger el modelo
*/
private String setOperations(String VC, String curso, String alumno,
Map<String, String> operations) {
boolean flag = false;
String packagge = "";
244
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
if (!VC.contains("0")) {
operations.put("VICERRECTORADO", VC);
if (!flag) {
packagge = Helper.retrieveCompleteName(VC);
flag = true;
}
}
if (!alumno.contains("0")) {
operations.put("ALUMNO", alumno);
if (!flag) {
packagge = Helper.retrieveCompleteName(alumno);
flag = true;
}
}
if (!curso.contains("0")) {
operations.put("CURSO", curso);
if (!flag) {
packagge = Helper.retrieveCompleteName(curso);
flag = true;
}
}
return packagge;
}
}
13.6.1.7.6
SaveProcessView.java
package es.uniovi.innova.eadministracion.tramites.swu.view.university;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import es.uniovi.innova.eadministracion.tramites.swu.business.MatcherManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.business.UniversityManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.model.Solicitante;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.SolicitanteWrapper;
import
es.uniovi.innova.eadministracion.tramites.swu.validate.SolicitanteWrapperValidator;
import es.uniovi.innova.eadministracion.tramites.swu.view.ISaveProcessView;
/**
* Resuelve la vista para el guardado del proceso de creación de una nueva
* universidad
*
* @author danielmf
*
*/
@Named
public class SaveProcessView implements ISaveProcessView {
@Inject
private UniversityManagerService universityService;
@Inject
private MatcherManagerService matcherService;
@Inject
private SolicitanteWrapperValidator validator;
@SuppressWarnings("unchecked")
@Override
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
245
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
@Transactional
public String execute(HttpServletRequest request,
SolicitanteWrapper solicitante, Model model, BindingResult result)
{
Map<String, String> fields = putAttributes(solicitante);
University u = (University) request.getSession().getAttribute(
"university");
String modelo = (String) request.getSession().getAttribute("modelo");
Map<String, String> fields_beca = (Map<String, String>) request
.getSession().getAttribute("beca_fields");
Map<String, String> operations = (Map<String, String>) request
.getSession().getAttribute("operations");
validator.validate(solicitante, result);
if (result.hasErrors()) {
model.addAttribute("solicitante", solicitante);
return "solicitante";
}
universityService.save(u);
setBeca(u, modelo, fields_beca);
setSolicitante(fields, u, modelo);
setOperations(u, operations);
return "success";
}
/**
* Guarda una beca recogida en el formulario
*
* @param university
* @param modelo
* @param fields_beca
*/
private void setBeca(University u, String modelo,
Map<String, String> fields_beca) {
for (String key : fields_beca.keySet()) {
if (joinable(fields_beca.get(key))) {
String[] values = split(fields_beca.get(key));
ModelWrapper mw = new ModelWrapper();
mw.setConcrete(values[0]);
mw.setMatch(key);
mw.setUniversity(u);
mw.setModelClazz("BECA");
mw.setClazz(modelo);
mw.setJoin(values[1]);
matcherService.save(mw);
ModelWrapper mw1 = new ModelWrapper();
mw1.setConcrete(values[1]);
mw1.setMatch(key);
mw1.setUniversity(u);
mw1.setModelClazz("BECA");
mw1.setClazz(modelo);
matcherService.save(mw1);
} else {
ModelWrapper mw = new ModelWrapper();
mw.setConcrete(fields_beca.get(key));
mw.setMatch(key);
246
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
mw.setUniversity(u);
mw.setModelClazz("BECA");
mw.setClazz(modelo);
matcherService.save(mw);
}
}
}
/**
* Comprueba si un match es compuesto
*
* @param key
*
match
*
* @return si es compuesto o no
*/
private boolean joinable(String key) {
String[] values = split(key);
if (values.length > 1)
return true;
return false;
}
/**
* Obtiene los campos de un match compuesto
*
* @param key
*
match
*
* @return un Array con los matches
*/
private String[] split(String key) {
String[] values = key.split(",");
return values;
}
/**
* Guarda un {@link Solicitante} recogido previamente en el formulario
*
* @param fields
*
map con los campos del solicitante
* @param university
* @param modelo
*
*/
private void setSolicitante(Map<String, String> fields, University u,
String modelo) {
for (String key : fields.keySet()) {
if (joinable(fields.get(key))) {
String[] values = split(fields.get(key));
ModelWrapper mw = new ModelWrapper();
mw.setConcrete(values[0]);
mw.setMatch(key);
mw.setUniversity(u);
mw.setModelClazz("SOLICITANTE");
mw.setClazz(modelo);
mw.setJoin(values[1]);
matcherService.save(mw);
ModelWrapper mw1 = new ModelWrapper();
mw1.setConcrete(values[1]);
mw1.setMatch(key);
mw1.setUniversity(u);
mw1.setModelClazz("SOLICITANTE");
mw1.setClazz(modelo);
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
247
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
matcherService.save(mw1);
} else if (fields.get(key) != "") {
ModelWrapper mw = new ModelWrapper();
mw.setConcrete(fields.get(key));
mw.setMatch(key);
mw.setUniversity(u);
mw.setModelClazz("SOLICITANTE");
mw.setClazz(modelo);
matcherService.save(mw);
}
}
}
/**
* Guarda las operaciones recogidas previamente en el formulario
*
* @param university
* @param operations
*
Map con las operaciones recogidas
*
*/
private void setOperations(University u, Map<String, String> operations) {
for (String key : operations.keySet()) {
OperationWrapper op = new OperationWrapper();
op.setUniversity(u);
op.setOp(operations.get(key));
op.setMatch(key);
matcherService.save(op);
}
}
/**
* Crea un Map con los atributos del {@link Solicitante}
*
* @param solicitante
*
recogido en el formulario
*
* @return el mapa con los atributos tras el match
*/
private Map<String, String> putAttributes(SolicitanteWrapper solicitante) {
Map<String, String> fields = new HashMap<String, String>();
fields.put("nombre_solicitante", solicitante.getNombre_solicitante());
fields.put("apellido1_solicitante",
solicitante.getApellido1_solicitante());
fields.put("apellido2_solicitante",
solicitante.getApellido2_solicitante());
fields.put("documento_identificativo",
solicitante.getDocumento_identificativo());
fields.put("tipo_documento_identificativo",
solicitante.getTipo_documento_identificativo());
fields.put("nacionalidad", solicitante.getNacionalidad());
fields.put("sexo", solicitante.getSexo());
fields.put("fecha_nacimiento", solicitante.getFecha_nacimiento());
fields.put("estudios", solicitante.getEstudios());
return fields;
}
}
248
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.6.1.8
Scripts.js
$(document).ready(function() {
$.ajaxSetup({
cache: false
});
$('[rel="tooltip"]').tooltip();
// Buscador
$(".container").on('click', '#searcher', function(evento) {
evento.preventDefault();
msg = "Buscando resultados...";
if($('input[id=query]').val() != null && $('input[id=query]').val() !=
""){
$(document).ajaxStart($.blockUI({message: msg,
css: {
border: 'none',
padding: '15px',
backgroundColor: '#000',
'-webkit-border-radius': '10px',
'-moz-border-radius': '10px',
opacity: .5,
color: '#fff'
} })).ajaxStop($.unblockUI);
$(".hero-unit").load("./searchMin", {
search_text : $('input[id=query]').val()
});
}else {
$("#search").append('<div class="alert alert-block"><a
class="close">×</a><h4 class="alert-heading">Alerta</h4><p>Debe introducir algún término
por el que buscar.</p></div>');
}
});
$(document).on('click', 'a.close', function(evento) {
evento.preventDefault();
$(".alert").remove();
});
$(".container").on('click','a.univ',function(e){
e.preventDefault();
msg = "Accediendo al detalle...";
$(document).ajaxStart($.blockUI({message: msg,
css: {
border: 'none',
padding: '15px',
backgroundColor: '#000',
'-webkit-border-radius': '10px',
'-moz-border-radius': '10px',
opacity: .5,
color: '#fff'
} })).ajaxStop($.unblockUI);
$(".hero-unit").load("./"+$(this).attr('href')+"/min");
});
$('#query').typeahead({source : ['Alumno','Vicerrectorado','Curso']});
});
function validateForm(){
var flag = false;
if($('input[id=modelo]').val() == null || $('input[id=modelo]').val() == ""){
$("#search").append('<div class="alert alert-block"><a
class="close">×</a><h4 class="alert-heading">Alerta</h4><p>Debe introducir un
modelo.</p></div>');
return false;
}
if($('input[id=CURSO]:checked').val() != "0")
flag = true;
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
249
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
else if($('input[id=ALUMNO]:checked').val()!= "0")
flag = true;
else if($('input[id=VICERRECTORADO]:checked').val() != "0"){
flag = true;
}
if(!flag){
$("#search").append('<div class="alert alert-block"><a
class="close">×</a><h4 class="alert-heading">Alerta</h4><p>Debe soportar al menos una
operación.</p></div>');
return false;
}else if( ($('input[id=CURSO]:checked').val() ==
$('input[id=ALUMNO]:checked').val() && $('input[id=CURSO]:checked').val() != "0") ||
($('input[id=CURSO]:checked').val() == $('input[id=VICERRECTORADO]:checked').val() &&
$('input[id=CURSO]:checked').val() != "0") ||
($('input[id=VICERRECTORADO]:checked').val() == $('input[id=ALUMNO]:checked').val() &&
$('input[id=CURSO]:checked').val() != "0")){
$("#search").append('<div class="alert alert-block"><a
class="close">×</a><h4 class="alert-heading">Alerta</h4><p>Cada operación debe de ser
única</p></div>');
return false;
}
return true;
}
13.6.2 Define-tramites-servicios-web-unificadosmodelo
13.6.2.1
Es.uniovi.innova.eadministracion.tramites.swu.model
13.6.2.1.1
Beca.java
package es.uniovi.innova.eadministracion.tramites.swu.model;
/**
* Modelo que representa una Beca
*
* @author danielmf
*
*/
public class Beca {
private
private
private
private
private
private
private
String nombre_procedimiento_convocatoria;
String asunto_convocatoria;
String estado_solicitud;
String destino;
Double cuantia_otorgada;
String curso_academico;
Solicitante solicitante;
public Beca() {
super();
}
public Beca(String nombre_procedimiento_convocatoria,
String asunto_convocatoria, String estado_solicitud,
String destino, Double cuantia_otorgada, String curso_academico,
Solicitante solicitante) {
super();
this.nombre_procedimiento_convocatoria =
nombre_procedimiento_convocatoria;
this.asunto_convocatoria = asunto_convocatoria;
this.estado_solicitud = estado_solicitud;
this.destino = destino;
this.cuantia_otorgada = cuantia_otorgada;
this.curso_academico = curso_academico;
this.solicitante = solicitante;
}
250
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
public String getNombre_procedimiento_convocatoria() {
return nombre_procedimiento_convocatoria;
}
public void setNombre_procedimiento_convocatoria(
String nombre_procedimiento_convocatoria) {
this.nombre_procedimiento_convocatoria =
nombre_procedimiento_convocatoria;
}
public String getAsunto_convocatoria() {
return asunto_convocatoria;
}
public void setAsunto_convocatoria(String asunto_convocatoria) {
this.asunto_convocatoria = asunto_convocatoria;
}
public String getEstado_solicitud() {
return estado_solicitud;
}
public void setEstado_solicitud(String estado_solicitud) {
this.estado_solicitud = estado_solicitud;
}
public String getDestino() {
return destino;
}
public void setDestino(String destino) {
this.destino = destino;
}
public Double getCuantia_otorgada() {
return cuantia_otorgada;
}
public void setCuantia_otorgada(Double cuantia_otorgada) {
this.cuantia_otorgada = cuantia_otorgada;
}
public String getCurso_academico() {
return curso_academico;
}
public void setCurso_academico(String curso_academico) {
this.curso_academico = curso_academico;
}
public Solicitante getSolicitante() {
return solicitante;
}
public void setSolicitante(Solicitante solicitante) {
this.solicitante = solicitante;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((curso_academico == null) ? 0 :
curso_academico.hashCode());
result = prime
* result
+ ((nombre_procedimiento_convocatoria == null) ? 0
:
nombre_procedimiento_convocatoria.hashCode());
result = prime * result
+ ((solicitante == null) ? 0 : solicitante.hashCode());
return result;
}
@Override
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
251
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Beca other = (Beca) obj;
if (curso_academico == null) {
if (other.curso_academico != null)
return false;
} else if (!curso_academico.equals(other.curso_academico))
return false;
if (nombre_procedimiento_convocatoria == null) {
if (other.nombre_procedimiento_convocatoria != null)
return false;
} else if (!nombre_procedimiento_convocatoria
.equals(other.nombre_procedimiento_convocatoria))
return false;
if (solicitante == null) {
if (other.solicitante != null)
return false;
} else if (!solicitante.equals(other.solicitante))
return false;
return true;
}
@Override
public String toString() {
return "Beca [nombre_procedimiento_convocatoria="
+ nombre_procedimiento_convocatoria + ",
asunto_convocatoria="
+ asunto_convocatoria + ", estado_solicitud="
+ estado_solicitud + ", destino=" + destino
+ ", cuantia_otorgada=" + cuantia_otorgada
+ ", curso_academico=" + curso_academico + ", solicitante="
+ solicitante + "]";
}
}
13.6.2.1.2
Solicitante.java
package es.uniovi.innova.eadministracion.tramites.swu.model;
public class Solicitante {
private
private
private
private
private
private
private
private
private
String nombre_solicitante;
String apellido1_solicitante;
String apellido2_solicitante;
String documento_identificativo;
String tipo_documento_identificativo;
String nacionalidad;
String sexo;
Integer fecha_nacimiento; // año
String estudios;
public Solicitante() {
super();
}
public Solicitante(String nombre_solicitante, String apellido1_solicitante,
String apellido2_solicitante, String documento_identificativo,
String tipo_documento_identificativo, String nacionalidad,
String sexo, Integer fecha_nacimiento, String estudios) {
super();
this.nombre_solicitante = nombre_solicitante;
this.apellido1_solicitante = apellido1_solicitante;
this.apellido2_solicitante = apellido2_solicitante;
this.documento_identificativo = documento_identificativo;
this.tipo_documento_identificativo = tipo_documento_identificativo;
this.nacionalidad = nacionalidad;
this.sexo = sexo;
252
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
this.fecha_nacimiento = fecha_nacimiento;
this.estudios = estudios;
}
public String getNombre_solicitante() {
return nombre_solicitante;
}
public void setNombre_solicitante(String nombre_solicitante) {
this.nombre_solicitante = nombre_solicitante;
}
public String getApellido1_solicitante() {
return apellido1_solicitante;
}
public void setApellido1_solicitante(String apellido1_solicitante) {
this.apellido1_solicitante = apellido1_solicitante;
}
public String getApellido2_solicitante() {
return apellido2_solicitante;
}
public void setApellido2_solicitante(String apellido2_solicitante) {
this.apellido2_solicitante = apellido2_solicitante;
}
public String getDocumento_identificativo() {
return documento_identificativo;
}
public void setDocumento_identificativo(String documento_identificativo) {
this.documento_identificativo = documento_identificativo;
}
public String getTipo_documento_identificativo() {
return tipo_documento_identificativo;
}
public void setTipo_documento_identificativo(
String tipo_documento_identificativo) {
this.tipo_documento_identificativo = tipo_documento_identificativo;
}
public String getNacionalidad() {
return nacionalidad;
}
public void setNacionalidad(String nacionalidad) {
this.nacionalidad = nacionalidad;
}
public String getSexo() {
return sexo;
}
public void setSexo(String sexo) {
this.sexo = sexo;
}
public Integer getFecha_nacimiento() {
return fecha_nacimiento;
}
public void setFecha_nacimiento(Integer fecha_nacimiento) {
this.fecha_nacimiento = fecha_nacimiento;
}
public String getEstudios() {
return estudios;
}
public void setEstudios(String estudios) {
this.estudios = estudios;
}
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
253
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime
* result
+ ((documento_identificativo == null) ? 0
: documento_identificativo.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Solicitante other = (Solicitante) obj;
if (documento_identificativo == null) {
if (other.documento_identificativo != null)
return false;
} else if (!documento_identificativo
.equals(other.documento_identificativo))
return false;
return true;
}
@Override
public String toString() {
return "Solicitante [nombre_solicitante=" + nombre_solicitante
+ ", apellido1_solicitante=" + apellido1_solicitante
+ ", apellido2_solicitante=" + apellido2_solicitante
+ ", documento_identificativo=" + documento_identificativo
+ ", tipo_documento_identificativo="
+ tipo_documento_identificativo + ", nacionalidad="
+ nacionalidad + ", sexo=" + sexo + ", fecha_nacimiento="
+ fecha_nacimiento + ", estudios=" + estudios + "]";
}
}
13.6.2.1.3
University.java
package es.uniovi.innova.eadministracion.tramites.swu.model;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import
import
import
import
import
import
import
import
javax.persistence.Column;
javax.persistence.Entity;
javax.persistence.FetchType;
javax.persistence.GeneratedValue;
javax.persistence.GenerationType;
javax.persistence.Id;
javax.persistence.OneToMany;
javax.persistence.Table;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
/**
* JavaBean que modela los datos recopilados de una Universidad
*
* @author danielmf
*
*/
@Entity
@Table(name = "TUNIVERSIDADES")
public class University {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
254
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
private Long id;
@Column(unique = true, nullable = false)
private String name;
@Column(nullable = false)
private String wsdl;
@Column(nullable = false)
private String personInCharge;
@OneToMany(mappedBy = "university", fetch = FetchType.EAGER)
private Set<OperationWrapper> operationsWrapper = new
HashSet<OperationWrapper>();
@OneToMany(mappedBy = "university", fetch = FetchType.EAGER)
private Set<ModelWrapper> modelsWrapper = new HashSet<ModelWrapper>();
public University() {
}
public University(String name, String wsdl, String personInCharge) {
this.name = name;
this.wsdl = wsdl;
this.personInCharge = personInCharge;
}
@Override
public String toString() {
return "University [id=" + id + ", name=" + name + ", wsdl=" + wsdl
+ ", personInCharge=" + personInCharge + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((wsdl == null) ? 0 : wsdl.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
University other = (University) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (wsdl == null) {
if (other.wsdl != null)
return false;
} else if (!wsdl.equals(other.wsdl))
return false;
return true;
}
public void addOperation(OperationWrapper o) {
o.setUniversity(this);
operationsWrapper.add(o);
}
public void addMW(ModelWrapper mw) {
mw.setUniversity(this);
modelsWrapper.add(mw);
}
public void removeOperation(OperationWrapper o) {
operationsWrapper.remove(o);
o.setUniversity(null);
}
public void removeModelWrapper(ModelWrapper mw) {
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
255
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
modelsWrapper.remove(mw);
mw.setUniversity(null);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWsdl() {
return wsdl;
}
public void setWsdl(String wsdl) {
this.wsdl = wsdl;
}
public String getPersonInCharge() {
return personInCharge;
}
public void setPersonInCharge(String personInCharge) {
this.personInCharge = personInCharge;
}
public Long getId() {
return id;
}
public Set<OperationWrapper> getOperationsWrapper() {
return Collections.unmodifiableSet(operationsWrapper);
}
public Set<ModelWrapper> getModelsWrapper() {
return Collections.unmodifiableSet(modelsWrapper);
}
}
13.6.2.1.4
Vicerrectorado.java
package es.uniovi.innova.eadministracion.tramites.swu.model;
/**
* Modelo que representa un Vicerrectorado
*
* @author danielmf
*
*/
public class Vicerrectorado {
private Long id;
private String nombre;
private String responsable;
public Vicerrectorado() {
super();
}
public Vicerrectorado(String nombre, String responsable) {
super();
this.nombre = nombre;
this.responsable = responsable;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
256
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getResponsable() {
return responsable;
}
public void setResponsable(String responsable) {
this.responsable = responsable;
}
@Override
public String toString() {
return "Vicerrectorado [id=" + id + ", nombre=" + nombre
+ ", responsable=" + responsable + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((nombre == null) ? 0 : nombre.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Vicerrectorado other = (Vicerrectorado) obj;
if (nombre == null) {
if (other.nombre != null)
return false;
} else if (!nombre.equals(other.nombre))
return false;
return true;
}
}
13.6.2.2
*.types
13.6.2.2.1
Constants.java
package es.uniovi.innova.eadministracion.tramites.swu.model.types;
/**
* Clase que define constantes que se utilizan a lo largo de la aplicación
*
* @author danielmf
*
*/
public class Constants {
// *********************** Cassandra ******************************
public static final String MATCH = "match";
public static final String MODELCLASS = "modelclass";
public static final String NOSQL = "/nosql.properties";
public static final String INDEX = "/index";
// *********************** Models ******************************
public static final String[] BECA = { "nombre_procedimiento_convocatoria",
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
257
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
"asunto_convocatoria", "estado_solicitud", "destino",
"cuantia_otorgada", "curso_academico" };
public static final String[] SOLICITANTE = { "nombre_solicitante",
"apellido1_solicitante", "apellido2_solicitante",
"documento_identificativo", "tipo_documento_identificativo",
"nacionalidad", "sexo", "fecha_nacimiento", "estudios" };
public static final String[] MODEL = { "BECA", "SOLICITANTE" };
public static final String[] OPS = { "ALUMNO", "CURSO", "VICERRECTORADO" };
public static final String MATCH_OPERATION_VICERRECTORADO = "VICERRECTORADO";
public static final String MATCH_OPERATION_ALUMNO = "ALUMNO";
public static final String MATCH_OPERATION_CURSO = "CURSO";
}
13.6.2.2.2
ModelWrapperKey.java
package es.uniovi.innova.eadministracion.tramites.swu.model.types;
import java.io.Serializable;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
/**
* Clave JPA de {@link ModelWrapper}
*
* @author danielmf
*
*/
public class ModelWrapperKey implements Serializable {
private static final long serialVersionUID = -1415030955602048569L;
String concrete;
String match;
String clazz;
public ModelWrapperKey(String concrete, String match, String clazz) {
this.concrete = concrete;
this.match = match;
this.clazz = clazz;
}
public ModelWrapperKey() {
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((clazz == null) ? 0 : clazz.hashCode());
result = prime * result
+ ((concrete == null) ? 0 : concrete.hashCode());
result = prime * result + ((match == null) ? 0 : match.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ModelWrapperKey other = (ModelWrapperKey) obj;
if (clazz == null) {
if (other.clazz != null)
return false;
} else if (!clazz.equals(other.clazz))
return false;
258
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
if (concrete == null) {
if (other.concrete != null)
return false;
} else if (!concrete.equals(other.concrete))
return false;
if (match == null) {
if (other.match != null)
return false;
} else if (!match.equals(other.match))
return false;
return true;
}
}
13.6.2.2.3
OperationWrapperKey.java
package es.uniovi.innova.eadministracion.tramites.swu.model.types;
import java.io.Serializable;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
/**
* Clave JPA de {@link OperationWrapper}
*
* @author danielmf
*
*/
public class OperationWrapperKey implements Serializable {
private static final long serialVersionUID = -4486027401624093144L;
String op;
University university;
String match;
public OperationWrapperKey(String op, University university, String match) {
this.op = op;
this.university = university;
this.match = match;
}
public OperationWrapperKey() {
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((match == null) ? 0 : match.hashCode());
result = prime * result + ((op == null) ? 0 : op.hashCode());
result = prime * result
+ ((university == null) ? 0 : university.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
OperationWrapperKey other = (OperationWrapperKey) obj;
if (match == null) {
if (other.match != null)
return false;
} else if (!match.equals(other.match))
return false;
if (op == null) {
if (other.op != null)
return false;
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
259
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
} else if (!op.equals(other.op))
return false;
if (university == null) {
if (other.university != null)
return false;
} else if (!university.equals(other.university))
return false;
return true;
}
}
13.6.2.3
*.wrapper
13.6.2.3.1
BecaWrapper.java
package es.uniovi.innova.eadministracion.tramites.swu.model.wrapper;
/**
* Envoltorio para utilizar Beca sin necesidad de utilizar sus agregados
*
* @author danielmf
*
*/
public class BecaWrapper {
private
private
private
private
private
private
String
String
String
String
String
String
nombre_procedimiento_convocatoria;
asunto_convocatoria;
estado_solicitud;
destino;
cuantia_otorgada;
curso_academico;
public BecaWrapper() {
super();
}
public BecaWrapper(String nombre_procedimiento_convocatoria,
String asunto_convocatoria, String estado_solicitud,
String destino, String cuantia_otorgada, String curso_academico) {
super();
this.nombre_procedimiento_convocatoria =
nombre_procedimiento_convocatoria;
this.asunto_convocatoria = asunto_convocatoria;
this.estado_solicitud = estado_solicitud;
this.destino = destino;
this.cuantia_otorgada = cuantia_otorgada;
this.curso_academico = curso_academico;
}
public String getNombre_procedimiento_convocatoria() {
return nombre_procedimiento_convocatoria;
}
public void setNombre_procedimiento_convocatoria(
String nombre_procedimiento_convocatoria) {
this.nombre_procedimiento_convocatoria =
nombre_procedimiento_convocatoria;
}
public String getAsunto_convocatoria() {
return asunto_convocatoria;
}
public void setAsunto_convocatoria(String asunto_convocatoria) {
this.asunto_convocatoria = asunto_convocatoria;
}
public String getEstado_solicitud() {
return estado_solicitud;
}
public void setEstado_solicitud(String estado_solicitud) {
260
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
this.estado_solicitud = estado_solicitud;
}
public String getDestino() {
return destino;
}
public void setDestino(String destino) {
this.destino = destino;
}
public String getCuantia_otorgada() {
return cuantia_otorgada;
}
public void setCuantia_otorgada(String cuantia_otorgada) {
this.cuantia_otorgada = cuantia_otorgada;
}
public String getCurso_academico() {
return curso_academico;
}
public void setCurso_academico(String curso_academico) {
this.curso_academico = curso_academico;
}
}
13.6.2.3.2
ModelWrapper.java
package es.uniovi.innova.eadministracion.tramites.swu.model.wrapper;
import
import
import
import
import
import
javax.persistence.Column;
javax.persistence.Entity;
javax.persistence.Id;
javax.persistence.IdClass;
javax.persistence.ManyToOne;
javax.persistence.Table;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.model.types.ModelWrapperKey;
/**
* Envoltorio para recoger los campos entre el modelo genérico y una
* {@link University}
*
* @author danielmf
*
*/
@Entity
@Table(name = "TMODELSWRAPPER")
@IdClass(ModelWrapperKey.class)
public class ModelWrapper {
@Id
private String
@Id
private String
@Column(name =
private String
@Id
private String
private String
concrete;
match;
"joins")
join;
clazz;
modelClazz;
@ManyToOne
private University university;
public ModelWrapper(String concrete, String match, String join,
String clazz, String modelClazz, University university) {
super();
this.concrete = concrete;
this.match = match;
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
261
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
this.join = join;
this.clazz = clazz;
this.modelClazz = modelClazz;
this.university = university;
}
public ModelWrapper(String concrete, String match, String join,
String clazz, String modelClazz) {
super();
this.concrete = concrete;
this.match = match;
this.join = join;
this.clazz = clazz;
this.modelClazz = modelClazz;
}
public ModelWrapper() {
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((concrete == null) ? 0 : concrete.hashCode());
result = prime * result + ((match == null) ? 0 : match.hashCode());
result = prime * result
+ ((university == null) ? 0 : university.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ModelWrapper other = (ModelWrapper) obj;
if (concrete == null) {
if (other.concrete != null)
return false;
} else if (!concrete.equals(other.concrete))
return false;
if (match == null) {
if (other.match != null)
return false;
} else if (!match.equals(other.match))
return false;
if (university == null) {
if (other.university != null)
return false;
} else if (!university.equals(other.university))
return false;
return true;
}
@Override
public String toString() {
return "ModelWrapper [concrete=" + concrete + ", match=" + match
+ ", join=" + join + ", clazz=" + clazz + ", modelClazz="
+ modelClazz + "]";
}
public String getMatch() {
return match;
}
public void setMatch(String match) {
this.match = match;
}
public String getJoin() {
return join;
}
262
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
public void setJoin(String join) {
this.join = join;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
public void setConcrete(String concrete) {
this.concrete = concrete;
}
public String getConcrete() {
return concrete;
}
public University getUniversity() {
return university;
}
public void setUniversity(University university) {
this.university = university;
}
public String getModelClazz() {
return modelClazz;
}
public void setModelClazz(String modelClazz) {
this.modelClazz = modelClazz;
}
}
13.6.2.3.3
OperationWrapper.java
package es.uniovi.innova.eadministracion.tramites.swu.model.wrapper;
import
import
import
import
import
import
javax.persistence.Column;
javax.persistence.Entity;
javax.persistence.Id;
javax.persistence.IdClass;
javax.persistence.ManyToOne;
javax.persistence.Table;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.model.types.OperationWrapperKey;
/**
* Modela una relación entre las operaciones de un wsdl y una {@link University}
*
* @author danielmf
*
*/
@Entity
@Table(name = "TOPERATIONSWRAPPER")
@IdClass(OperationWrapperKey.class)
public class OperationWrapper {
@Column(nullable = false)
@Id
private String op;
@Id
private String match;
@Id
@ManyToOne
private University university;
public OperationWrapper(String op) {
super();
this.op = op;
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
263
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
}
public OperationWrapper() {
super();
}
public OperationWrapper(String op, String match, University university) {
super();
this.op = op;
this.match = match;
this.university = university;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((match == null) ? 0 : match.hashCode());
result = prime * result + ((op == null) ? 0 : op.hashCode());
result = prime * result
+ ((university == null) ? 0 : university.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
OperationWrapper other = (OperationWrapper) obj;
if (match == null) {
if (other.match != null)
return false;
} else if (!match.equals(other.match))
return false;
if (op == null) {
if (other.op != null)
return false;
} else if (!op.equals(other.op))
return false;
if (university == null) {
if (other.university != null)
return false;
} else if (!university.equals(other.university))
return false;
return true;
}
@Override
public String toString() {
return "OperationWrapper [op=" + op + ", match=" + match + "]";
}
public String getOp() {
return op;
}
public String getMatch() {
return match;
}
public void setMatch(String match) {
this.match = match;
}
public void setOp(String op) {
this.op = op;
}
public University getUniversity() {
return university;
}
public void setUniversity(University university) {
264
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
this.university = university;
}
}
13.6.2.3.4
OperationWrapperDocument.java
package es.uniovi.innova.eadministracion.tramites.swu.model.wrapper;
import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.annotation.Id;
/**
* Envoltorio para las Operaciones de los servicios web
*
* @author danielmf
*
*/
public class OperationWrapperDocument {
@Id
@Field
private String id;
@Field
private String match;
@Field
private String op;
@Field
private String university_name;
@Field
private Integer university;
public OperationWrapperDocument(String id, String match, String op,
String university_name, Long university) {
super();
this.id = id;
this.match = match;
this.op = op;
this.university_name = university_name;
this.university = university.intValue();
}
public OperationWrapperDocument() {
super();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMatch() {
return match;
}
public void setMatch(String match) {
this.match = match;
}
public String getOp() {
return op;
}
public void setOp(String op) {
this.op = op;
}
public Integer getUniversity() {
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
265
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
return university;
}
public void setUniversity(Long university) {
this.university = university.intValue();
}
public String getUniversity_name() {
return university_name;
}
public void setUniversity_name(String university_name) {
this.university_name = university_name;
}
@Override
public String toString() {
return "OperationWrapperDocument [id=" + id + ", match=" + match
+ ", op=" + op + ", university=" + university + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
OperationWrapperDocument other = (OperationWrapperDocument) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
13.6.2.3.5
ParamsWrapper.java
package es.uniovi.innova.eadministracion.tramites.swu.model.wrapper;
import java.util.ArrayList;
import java.util.List;
/**
* Envoltorio que almacena el tipo de argumentos que recibe un método y el tipo
* del retorno
*
* @author danielmf
*
*/
public class ParamsWrapper {
private List<String> fields;
private String return_;
public ParamsWrapper() {
super();
fields = new ArrayList<String>();
}
@Override
public String toString() {
return "ParamsWrapper [fields=" + fields + ", return_=" + return_ + "]";
266
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
}
public void add(String field) {
if (!fields.add(field))
throw new RuntimeException("No se ha podido insertar " + field);
}
public void remove(String field) {
if (fields.remove(field))
throw new RuntimeException("No se ha podido borrar " + field);
}
public List<String> getFields() {
return fields;
}
public void setFields(List<String> fields) {
this.fields = fields;
}
public String getReturn_() {
return return_;
}
public void setReturn_(String return_) {
this.return_ = return_;
}
}
13.6.2.3.6
SolicitanteWrapper.java
package es.uniovi.innova.eadministracion.tramites.swu.model.wrapper;
/**
* Envoltorio para un Solicitante
*
* @author danielmf
*
*/
public class SolicitanteWrapper {
private
private
private
private
private
private
private
private
private
String
String
String
String
String
String
String
String
String
nombre_solicitante;
apellido1_solicitante;
apellido2_solicitante;
documento_identificativo;
tipo_documento_identificativo;
nacionalidad;
sexo;
fecha_nacimiento;
estudios;
public SolicitanteWrapper(String nombre_solicitante,
String apellido1_solicitante, String apellido2_solicitante,
String documento_identificativo,
String tipo_documento_identificativo, String nacionalidad,
String sexo, String fecha_nacimiento, String estudios) {
super();
this.nombre_solicitante = nombre_solicitante;
this.apellido1_solicitante = apellido1_solicitante;
this.apellido2_solicitante = apellido2_solicitante;
this.documento_identificativo = documento_identificativo;
this.tipo_documento_identificativo = tipo_documento_identificativo;
this.nacionalidad = nacionalidad;
this.sexo = sexo;
this.fecha_nacimiento = fecha_nacimiento;
this.estudios = estudios;
}
public SolicitanteWrapper() {
super();
}
public String getNombre_solicitante() {
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
267
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
return nombre_solicitante;
}
public void setNombre_solicitante(String nombre_solicitante) {
this.nombre_solicitante = nombre_solicitante;
}
public String getApellido1_solicitante() {
return apellido1_solicitante;
}
public void setApellido1_solicitante(String apellido1_solicitante) {
this.apellido1_solicitante = apellido1_solicitante;
}
public String getApellido2_solicitante() {
return apellido2_solicitante;
}
public void setApellido2_solicitante(String apellido2_solicitante) {
this.apellido2_solicitante = apellido2_solicitante;
}
public String getDocumento_identificativo() {
return documento_identificativo;
}
public void setDocumento_identificativo(String documento_identificativo) {
this.documento_identificativo = documento_identificativo;
}
public String getTipo_documento_identificativo() {
return tipo_documento_identificativo;
}
public void setTipo_documento_identificativo(
String tipo_documento_identificativo) {
this.tipo_documento_identificativo = tipo_documento_identificativo;
}
public String getNacionalidad() {
return nacionalidad;
}
public void setNacionalidad(String nacionalidad) {
this.nacionalidad = nacionalidad;
}
public String getSexo() {
return sexo;
}
public void setSexo(String sexo) {
this.sexo = sexo;
}
public String getFecha_nacimiento() {
return fecha_nacimiento;
}
public void setFecha_nacimiento(String fecha_nacimiento) {
this.fecha_nacimiento = fecha_nacimiento;
}
public String getEstudios() {
return estudios;
}
public void setEstudios(String estudios) {
this.estudios = estudios;
}
}
268
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.6.2.4
Es.uniovi.innova.eadministracion.tramites.swu.persiste
nce
13.6.2.4.1
HashDataService.java
package es.uniovi.innova.eadministracion.tramites.swu.persistence;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
/**
* Fachada que define las operaciones de la capa de persistencia relativa a la
* base de datos NoSQL.
*
* @author danielmf
*
*/
public interface HashDataService {
/**
* Carga el modelo inicial (solo se ejecuta una vez)
*/
public void init();
/**
* Guarda en la base de datos NoSQL un match con el modelo
*
* @param modelWrapper
*/
public void save(ModelWrapper modelWrapper);
/**
* Guarda en la base de datos NoSQL un match con una operación
*
* @param operationWrapper
*/
public void save(OperationWrapper operationWrapper);
/**
* Busca matches previos relativos a {@link ModelWrapper}
*
* @param field
* @param modelClazz
*
* @return null o el match
*/
public ModelWrapper queryModel(String field, String modelClazz);
/**
* Busca matches previos relativos a {@link OperationWrapper}
*
* @param operationWrapper
*
* @return null o el match
*/
public OperationWrapper queryOps(OperationWrapper operationWrapper);
}
13.6.2.4.2
ModelWrapperDataService.java
package es.uniovi.innova.eadministracion.tramites.swu.persistence;
import java.util.List;
import javax.inject.Named;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
269
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.model.types.ModelWrapperKey;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
/**
* Capa de persistencia que encapsula las operaciones de {@link ModelWrapper}
* mediante {@link CrudRepository}
*
* @author danielmf
*
*/
@Named
public interface ModelWrapperDataService extends
CrudRepository<ModelWrapper, ModelWrapperKey> {
@Query(name = "ModelWrapper.findByUniversityClazz")
public List<ModelWrapper> findByUniversityClazz(University university,
String clazz);
}
13.6.2.4.3
OperationsWrapperDataService.java
package es.uniovi.innova.eadministracion.tramites.swu.persistence;
import java.util.List;
import javax.inject.Named;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.model.types.OperationWrapperKey;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
/**
* Capa de persistencia que encapsula las operaciones de
* {@link OperationWrapper} mediante {@link CrudRepository}
*
* @author danielmf
*
*/
@Named
public interface OperationsWrapperDataService extends
CrudRepository<OperationWrapper, OperationWrapperKey> {
public List<OperationWrapper> findByMatch(String match);
public List<OperationWrapper> findByUniversity(University university);
@Query(name = "OperationWrapper.findByMatchAndUniversityId")
public List<OperationWrapper> findByMatchAndUniversityId(String mode,
Long id);
}
13.6.2.4.4
UniversityDataService.java
package es.uniovi.innova.eadministracion.tramites.swu.persistence;
import javax.inject.Named;
import org.springframework.data.repository.CrudRepository;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
/**
* Inferface que implementa {@link CrudRepository} para gestionar las CRUD con
* la base de datos del modelo {@link University}
*
* @author danielmf
*
270
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
*/
@Named
public interface UniversityDataService extends CrudRepository<University, Long> {
/**
* Busca universidades por nombre
*
* @param name
*
para identificar la Universidad
*
* @return
*/
public University findByName(String name);
/**
* Busca universidades por el WSDL
*
* @param wsdl
*
url donde se alojan los servicios
*
* @return
*/
public University findByWsdl(String wsdl);
}
13.6.2.5
*.nosql
13.6.2.5.1
CassandraMatcher.java
package es.uniovi.innova.eadministracion.tramites.swu.persistence.nosql;
import java.util.Arrays;
import javax.inject.Named;
import
import
import
import
import
import
import
import
import
import
import
import
import
me.prettyprint.cassandra.serializers.StringSerializer;
me.prettyprint.cassandra.service.ThriftKsDef;
me.prettyprint.cassandra.service.template.ColumnFamilyResult;
me.prettyprint.cassandra.service.template.ColumnFamilyTemplate;
me.prettyprint.cassandra.service.template.ColumnFamilyUpdater;
me.prettyprint.cassandra.service.template.ThriftColumnFamilyTemplate;
me.prettyprint.hector.api.Cluster;
me.prettyprint.hector.api.Keyspace;
me.prettyprint.hector.api.ddl.ColumnFamilyDefinition;
me.prettyprint.hector.api.ddl.ComparatorType;
me.prettyprint.hector.api.ddl.KeyspaceDefinition;
me.prettyprint.hector.api.exceptions.HectorException;
me.prettyprint.hector.api.factory.HFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.model.types.Constants;
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
es.uniovi.innova.eadministracion.tramites.swu.persistence.HashDataService;
es.uniovi.innova.eadministracion.tramites.swu.util.Helper;
/**
* Realiza operaciones sobre una base de datos Apache Cassandra
*
* @author danielmf
*
*/
@Named
public class CassandraMatcher implements HashDataService {
private static Logger logger = LoggerFactory
.getLogger(CassandraMatcher.class);
private ColumnFamilyTemplate<String, String> template;
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
271
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
public CassandraMatcher() {
logger.debug("Creando el conector de Cassandra");
template = connect();
}
@Override
public void init() {
setUpModel();
setUpOps();
}
@Override
public void save(ModelWrapper modelWrapper) {
ColumnFamilyUpdater<String, String> updater = template
.createUpdater(modelWrapper.getConcrete());
updater.setString(Constants.MATCH, modelWrapper.getMatch());
updater.setString(Constants.MODELCLASS, modelWrapper.getModelClazz());
template.update(updater);
logger.info(modelWrapper + " guardado correctamente");
}
@Override
public void save(OperationWrapper operationWrapper) {
String op = Helper.getClassName(operationWrapper.getOp());
ColumnFamilyUpdater<String, String> updater = template.createUpdater(op
.toLowerCase());
updater.setString(Constants.MATCH, operationWrapper.getMatch());
template.update(updater);
logger.info(operationWrapper + " guardado correctamente.");
}
@Override
public ModelWrapper queryModel(String field, String modelClazz) {
String match = null;
String modelclazz = null;
logger.info("Buscando: " + field);
try {
ColumnFamilyResult<String, String> res = template
.queryColumns(field);
match = res.getString(Constants.MATCH);
modelclazz = res.getString(Constants.MODELCLASS);
if (match != null && modelclazz != null
&& modelclazz.equalsIgnoreCase(modelClazz)) {
ModelWrapper modelWrapper = new ModelWrapper();
modelWrapper.setConcrete(field);
modelWrapper.setMatch(match);
modelWrapper.setModelClazz(modelclazz);
return modelWrapper;
}
} catch (HectorException e) {
logger.error(e.getMessage());
}
return null;
}
@Override
public OperationWrapper queryOps(OperationWrapper operationWrapper) {
272
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
String match = null;
logger.info("Buscando :" + operationWrapper.getOp());
try {
String op = Helper.getClassName(operationWrapper.getOp());
ColumnFamilyResult<String, String> res = template.queryColumns(op
.toLowerCase());
match = res.getString(Constants.MATCH);
if (match != null) {
operationWrapper.setMatch(match);
} else
return null;
} catch (HectorException e) {
logger.error(e.getMessage());
}
return operationWrapper;
}
/**
* Crea el Schema dentro del cluster que se le pasa por parámetro
*
* @param myCluster
*
{@link Cluster} Cluster de Cassandra sobre el que se creará el
*
Schema
*/
private void createSchema(Cluster myCluster) {
logger.info("Generando esquema para la base de datos Cassandra");
String repository = Helper.getProperty(Constants.NOSQL, "repository");
String schema = Helper.getProperty(Constants.NOSQL, "schema");
ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition(
repository, schema, ComparatorType.BYTESTYPE);
KeyspaceDefinition newKeyspace = HFactory.createKeyspaceDefinition(
repository, ThriftKsDef.DEF_STRATEGY_CLASS, 1,
Arrays.asList(cfDef));
myCluster.addKeyspace(newKeyspace, true);
}
/**
* Realiza la conexión con un cluster habilitado de Cassandra, además de
* conectarse a una base de datos concreta.
*
* @return {@link ColumnFamilyTemplate} template para utilizar la conexión
*
posteriormente.
*/
private ColumnFamilyTemplate<String, String> connect() {
logger.info("Conectando al cluster...");
String
String
String
String
cluster = Helper.getProperty(Constants.NOSQL, "cluster");
url = Helper.getProperty(Constants.NOSQL, "url");
repository = Helper.getProperty(Constants.NOSQL, "repository");
schema = Helper.getProperty(Constants.NOSQL, "schema");
Cluster myCluster = HFactory.getOrCreateCluster(cluster, url);
KeyspaceDefinition keyspaceDef = myCluster.describeKeyspace(repository);
if (keyspaceDef == null)
createSchema(myCluster);
Keyspace ksp = HFactory.createKeyspace(repository, myCluster);
ColumnFamilyTemplate<String, String> template = new
ThriftColumnFamilyTemplate<String, String>(
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
273
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
ksp, schema, StringSerializer.get(),
StringSerializer.get());
return template;
}
/**
* Carga las operaciones en Cassandra
*/
private void setUpOps() {
try {
logger.info("Inicializando las operaciones en Cassandra...");
ColumnFamilyUpdater<String, String> updater = template
.createUpdater("getbecasporalumno");
updater.setString(Constants.MATCH, "getBecasPorAlumno");
template.update(updater);
updater = template.createUpdater("getbecasporcurso");
updater.setString(Constants.MATCH, "getBecasPorCurso");
template.update(updater);
updater = template.createUpdater("getbecasporvicerrectorado");
updater.setString(Constants.MATCH, "getBecasPorVicerrectorado");
template.update(updater);
} catch (HectorException e) {
logger.error(e.getMessage());
e.printStackTrace();
}
}
/**
* Carga los modelos en Cassandra
*/
private void setUpModel() {
try {
logger.info("Inicializando modelos en Cassandra...");
ColumnFamilyUpdater<String, String> updater = template
.createUpdater("apellidos");
updater.setString(Constants.MATCH, "apellidos");
updater.setString(Constants.MODELCLASS, "ALUMNO");
template.update(updater);
updater = template.createUpdater("nombre");
updater.setString(Constants.MATCH, "nombre");
updater.setString(Constants.MODELCLASS, "ALUMNO");
template.update(updater);
updater = template.createUpdater("telefono");
updater.setString(Constants.MATCH, "telefono");
updater.setString(Constants.MODELCLASS, "ALUMNO");
template.update(updater);
updater = template.createUpdater("direccion");
updater.setString(Constants.MATCH, "direccion");
updater.setString(Constants.MODELCLASS, "ALUMNO");
template.update(updater);
updater = template.createUpdater("nif");
updater.setString(Constants.MATCH, "nif");
updater.setString(Constants.MODELCLASS, "ALUMNO");
template.update(updater);
} catch (HectorException e) {
logger.error(e.getMessage());
274
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
e.printStackTrace();
}
}
}
13.6.2.5.2
CassandraSetUp.java
package es.uniovi.innova.eadministracion.tramites.swu.persistence.nosql;
/**
* Clase que inicializa la Base de datos NoSQL con los datos iniciales del
* modelo definido por la entidad reguladora.
*
* @author danielmf
*
*/
public class CassandraSetUp {
public static void main(String[] args) {
new CassandraMatcher().init();
}
}
13.6.2.6
Es.uniovi.innova.eadministracion.tramites.swu.util
13.6.2.6.1
Helper.java
package es.uniovi.innova.eadministracion.tramites.swu.util;
import java.io.IOException;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Helper para cargar las configuraciones y otros métodos de utilidad
*
* @author danielmf
*
*/
public class Helper {
private static Logger logger = LoggerFactory.getLogger(Helper.class);
/**
* Obtiene una propiedad de un fichero de propiedades bajo una clave
*
* @param CONF_FILE
* @param key
*
* @return
*/
public static String getProperty(String CONF_FILE, String key) {
Properties properties = new Properties();
try {
logger.debug("Obtaining " + key);
properties.load(Helper.class.getResourceAsStream(CONF_FILE));
} catch (IOException e) {
logger.error(e.getMessage());
}
return properties.getProperty(key);
}
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
275
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
/**
* Obtiene el nombre de una clase sin el paquete
*
* @param classNameWithPackage
*
* @return
*/
public static String getClassName(String classNameWithPackage) {
String[] strs = classNameWithPackage.split("\\.");
return strs[strs.length - 1];
}
/**
* Obtiene el paquete base de una clase bajo un servicio web.
*
* @param clazzName
*
* @return
*/
public static String retrieveCompleteName(String clazzName) {
String[] name = clazzName.split("\\.");
String res = name[0] + ".";
for (int i = 1; i < name.length - 1; i++)
res += name[i] + ".";
return res;
}
}
13.6.2.7
*.solr
13.6.2.7.1
OperationsWrapperDocumentRepository.java
package es.uniovi.innova.eadministracion.tramites.swu.util.solr;
import java.util.List;
import javax.inject.Named;
import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;
import
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapperDocument;
/**
* Interface que resuelve las operaciones de Spring Data Solr para la
* funcionalidad del buscador.
*
* @author danielmf
*
*/
@Named
public interface OperationsWrapperDocumentRepository extends
SolrCrudRepository<OperationWrapperDocument, String> {
@Query("op:*?0* OR match:*?0* OR university_name:*?0*")
public List<OperationWrapperDocument> findByMatchOrOp(String keyword);
}
276
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.6.3 Define-tramites-servicios-web-unificadospublisher
13.6.3.1
Es.uniovi.innova.eadministracion.tramites.swu.service
13.6.3.1.1
IScholarshipService.java
package es.uniovi.innova.eadministracion.tramites.swu.service;
import java.util.List;
import es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
public interface IScholarshipService {
public List<Beca> getBecasByParam(Object param, String category,
String university);
}
13.6.3.1.2
ScholarshipService.java
package es.uniovi.innova.eadministracion.tramites.swu.service;
import java.util.List;
import
import
import
import
import
javax.inject.Inject;
javax.inject.Named;
javax.jws.WebMethod;
javax.jws.WebService;
javax.xml.ws.soap.MTOM;
import es.uniovi.innova.eadministracion.tramites.swu.business.WebServiceManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
@Named
@MTOM
@WebService(name = "ScholarshipService", serviceName = "ScholarshipService", portName =
"ScholarshipServicePort", targetNamespace =
"http://innova.uniovi.es/ScholarshipService")
public class ScholarshipService implements IScholarshipService {
@Inject
private WebServiceManagerService webServiceService;
@WebMethod(operationName = "getBecasByParam")
@Override
public List<Beca> getBecasByParam(Object param, String category,
String university) {
List<Beca> becas;
if (university != null) {
becas = webServiceService.getBecasByParam(param, category,
university.toUpperCase());
} else {
becas = webServiceService.getBecasByParam(param, category);
}
return becas;
}
}
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
277
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.6.4 Define-tramites-servicios-web-unificadosrecolector
13.6.4.1
Es.uniovi.innova.eadministracion.tramites.swu.presenta
tion
package es.uniovi.innova.eadministracion.tramites.swu.presentation;
/**
* Interface para la semi-implementación de un patrón Command para la capa de
* presentación (Siguiendo un modelo similar a Struts, por ejemplo)
*
* @author danielmf
*
*/
public interface Executable {
/**
* Método para asegurar que todas las clases de la capa de presentación
* pertenecen al Command
*/
public void execute();
}
13.6.4.2
*.ws
13.6.4.2.1
ShowBecasByAlumno.java
package es.uniovi.innova.eadministracion.tramites.swu.presentation.ws;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.business.WebServiceManagerService;
es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
es.uniovi.innova.eadministracion.tramites.swu.model.types.Constants;
es.uniovi.innova.eadministracion.tramites.swu.presentation.Executable;
/**
* Presenta las becas de la categoría de Alumno
*
* @author danielmf
*
*/
@Named
public class ShowBecasByAlumno implements Executable {
private static Logger logger = LoggerFactory
.getLogger(ShowBecasByAlumno.class);
private String dni;
private String universidad;
@Inject
private WebServiceManagerService webServiceService;
@Override
public void execute() {
List<Beca> becas;
278
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
if (universidad != null) {
becas = webServiceService
.getBecasByParam(dni,
Constants.MATCH_OPERATION_ALUMNO,
universidad.toUpperCase());
} else {
becas = webServiceService.getBecasByParam(dni,
Constants.MATCH_OPERATION_ALUMNO);
}
logger.debug(becas.toString());
logger.info("ShowBecasByAlumno ejecutado.");
}
public void setDni(String dni) {
this.dni = dni;
}
public void setUniversidad(String universidad) {
this.universidad = universidad;
}
}
13.6.4.2.2
ShowBecasByCurso.java
package es.uniovi.innova.eadministracion.tramites.swu.presentation.ws;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.business.WebServiceManagerService;
es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
es.uniovi.innova.eadministracion.tramites.swu.model.types.Constants;
es.uniovi.innova.eadministracion.tramites.swu.presentation.Executable;
/**
* Presenta las becas generadas por la categoría de curso
*
* @author danielmf
*
*/
@Named
public class ShowBecasByCurso implements Executable {
private static Logger logger = LoggerFactory
.getLogger(ShowBecasByCurso.class);
@Inject
private WebServiceManagerService webServiceService;
private int curso;
private String universidad;
@Override
public void execute() {
List<Beca> becas;
if (universidad != null) {
becas = webServiceService.getBecasByParam(curso,
Constants.MATCH_OPERATION_CURSO,
universidad.toUpperCase());
} else {
becas = webServiceService.getBecasByParam(curso,
Constants.MATCH_OPERATION_CURSO);
}
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
279
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
System.out.println(becas);
logger.info("ShowBecasByCurso ejecutado.");
}
public void setCurso(int curso) {
this.curso = curso;
}
public void setUniversidad(String universidad) {
this.universidad = universidad;
}
}
13.6.4.2.3
ShowBecasByVicerrectorado.java
package es.uniovi.innova.eadministracion.tramites.swu.presentation.ws;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.business.WebServiceManagerService;
es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
es.uniovi.innova.eadministracion.tramites.swu.model.Vicerrectorado;
es.uniovi.innova.eadministracion.tramites.swu.model.types.Constants;
es.uniovi.innova.eadministracion.tramites.swu.presentation.Executable;
/**
* Presenta las becas generadas por la categoría Vicerrectorado.
*
* @author danielmf
*
*/
@Named
public class ShowBecasByVicerrectorado implements Executable {
private static Logger logger = LoggerFactory
.getLogger(ShowBecasByVicerrectorado.class);
@Inject
private WebServiceManagerService webServiceService;
private Vicerrectorado vicerrectorado;
private String universidad;
@Override
public void execute() {
List<Beca> becas;
if (universidad != null) {
becas = webServiceService.getBecasByParam(vicerrectorado,
Constants.MATCH_OPERATION_VICERRECTORADO,
universidad.toUpperCase());
} else {
becas = webServiceService.getBecasByParam(vicerrectorado,
Constants.MATCH_OPERATION_VICERRECTORADO);
}
System.out.println(becas);
logger.info("ShowBecasByVicerrectorado ejecutado.");
}
public void setVicerrectorado(Vicerrectorado vicerrectorado) {
this.vicerrectorado = vicerrectorado;
}
280
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
public void setUniversidad(String universidad) {
this.universidad = universidad;
}
}
13.6.5 Define-tramites-servicios-web-unificadosregistrador
13.6.5.1
Es.uniovi.innova.eadministracion.tramites.swu.presenta
tion
13.6.5.1.1
CheckStatus.java
package es.uniovi.innova.eadministracion.tramites.swu.presentation;
import javax.inject.Inject;
import javax.inject.Named;
import es.uniovi.innova.eadministracion.tramites.swu.business.MatcherManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.business.UniversityManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
/**
* Clase que comprueba la postcondición de la aplicación para no dejar datos
* inconsistentes
*
* @author danielmf
*
*/
@Named
public class CheckStatus implements Executable {
@Inject
private UniversityManagerService universityService;
@Inject
private MatcherManagerService matcherService;
private University university;
@Override
public void execute() {
if (!matcherService.checkStatus(university))
universityService.remove(university);
}
public void setUniversity(University university) {
this.university = university;
}
}
13.6.5.1.2
Executable.java
package es.uniovi.innova.eadministracion.tramites.swu.presentation;
/**
* Interface para la semi-implementación de un patrón Command para la capa de
* presentación (Siguiendo un modelo similar a Struts, por ejemplo)
*
* @author danielmf
*
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
281
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
*/
public interface Executable {
/**
* Método para asegurar que todas las clases de la capa de presentación
* pertenecen al Command
*/
public void execute();
}
13.6.5.2
*.matcher
13.6.5.2.1
Builder.java
package es.uniovi.innova.eadministracion.tramites.swu.presentation.matcher;
import
import
import
import
import
import
java.io.BufferedReader;
java.io.IOException;
java.io.InputStreamReader;
java.util.Iterator;
java.util.Map;
java.util.Map.Entry;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import es.uniovi.innova.eadministracion.tramites.swu.business.MatcherManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.presentation.Executable;
/**
* Construye los resultados después de hacerse los matches
*
* @author danielmf
*
*/
@Named
public class Builder implements Executable {
private static Logger logger = LoggerFactory.getLogger(Builder.class);
private Map<String, Object> matches;
@Inject
private MatcherManagerService matcherService;
@Override
public void execute() {
Iterator<Entry<String, Object>> iterat = matches.entrySet().iterator();
iterat = matches.entrySet().iterator();
while (iterat.hasNext()) {
Entry<String, Object> entry = iterat.next();
ModelWrapper cwp = (ModelWrapper) entry.getValue();
if (cwp.getJoin() == null) {
String origin = cwp.getMatch();
Iterator<Entry<String, Object>> iterat2 =
matches.entrySet()
.iterator();
while (iterat2.hasNext()) {
Entry<String, Object> entry2 = iterat2.next();
if (entry2.getKey() == entry.getKey())
continue;
if (cwp.getConcrete() == ((ModelWrapper)
entry2.getValue())
.getJoin())
continue;
282
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
ModelWrapper cw3 = (ModelWrapper)
entry2.getValue();
if (origin.equalsIgnoreCase(cw3.getMatch())) {
System.out.println("¿Qué relación existe?");
System.out.println("1. " + cwp.getConcrete()
+ " + "
+ cw3.getConcrete());
System.out.println("2. " + cw3.getConcrete()
+ " + "
+ cwp.getConcrete());
System.out.println("3. ninguna");
String resp = null;
try {
resp = new BufferedReader(new
InputStreamReader(
System.in)).readLine();
} catch (IOException e) {
logger.error(e.getMessage());
}
if (Integer.parseInt(resp) == 1) {
cwp.setJoin(cw3.getConcrete());
matches.put(entry.getKey(), cwp);
} else if (Integer.parseInt(resp) == 2) {
cw3.setJoin(cwp.getConcrete());
matches.put(entry2.getKey(), cw3);
}
}
}
}
}
iterat = matches.entrySet().iterator();
while (iterat.hasNext()) {
ModelWrapper cw = (ModelWrapper) iterat.next().getValue();
matcherService.save(cw);
}
}
public Map<String, Object> getMatches() {
return matches;
}
public void setMatches(Map<String, Object> matches) {
this.matches = matches;
}
}
13.6.5.2.2
MatchFields.java
package es.uniovi.innova.eadministracion.tramites.swu.presentation.matcher;
import
import
import
import
java.io.BufferedReader;
java.io.IOException;
java.io.InputStreamReader;
java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.business.MatcherManagerService;
es.uniovi.innova.eadministracion.tramites.swu.model.University;
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
es.uniovi.innova.eadministracion.tramites.swu.presentation.Executable;
/**
* Desencadena el matching de campos con las técnicas de String Metrics
*
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
283
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
* @author danielmf
*
*/
@Named
public class MatchFields implements Executable {
private static Logger logger = LoggerFactory.getLogger(MatchFields.class);
private
private
private
private
private
String field;
University university;
Map<String, Object> matches;
String clazz;
String modelClazz;
@Inject
private MatcherManagerService matcherService;
@Override
public void execute() {
try {
ModelWrapper cw = new ModelWrapper(field, null, null, clazz,
modelClazz, university);
String match = matcherService.match(field, modelClazz);
if (match == "")
cw = null;
else
cw.setMatch(match);
if (cw != null) {
System.out.println(field + ": " + cw.getMatch());
System.out.println("¿Es correcto?(s,n)");
String resp = new BufferedReader(new InputStreamReader(
System.in)).readLine();
if (resp.equalsIgnoreCase("s"))
matches.put(field, cw);
}
} catch (IOException e) {
logger.error(e.getMessage());
}
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
public Map<String, Object> getMatches() {
return matches;
}
public void setMatches(Map<String, Object> matches) {
this.matches = matches;
}
public University getUniversity() {
return university;
}
public void setUniversity(University university) {
this.university = university;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
284
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
this.clazz = clazz;
}
public String getModelClazz() {
return modelClazz;
}
public void setModelClazz(String modelClazz) {
this.modelClazz = modelClazz;
}
}
13.6.5.2.3
MatchOtherFields.java
package es.uniovi.innova.eadministracion.tramites.swu.presentation.matcher;
import
import
import
import
java.io.BufferedReader;
java.io.IOException;
java.io.InputStreamReader;
java.util.Map;
import javax.inject.Named;
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.model.University;
es.uniovi.innova.eadministracion.tramites.swu.model.types.Constants;
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
es.uniovi.innova.eadministracion.tramites.swu.presentation.Executable;
/**
* Termina de mapear los campos que no se emparejaron mediante StringMetrics y
* la NoSQL
*
* @author danielmf
*
*/
@Named
public class MatchOtherFields implements Executable {
private
private
private
private
private
String field;
String clazz;
University university;
Map<String, Object> matches;
String modelClazz;
@Override
public void execute() {
String[] consts = null;
if (modelClazz.equalsIgnoreCase("BECA"))
consts = Constants.BECA;
else if (modelClazz.equalsIgnoreCase("SOLICITANTE"))
consts = Constants.SOLICITANTE;
int i = 0;
for (String key : consts) {
System.out.println(++i + ". " + key);
}
System.out.println("0. NINGUNO");
System.out.println("¿Con que campo conecta?: " + field);
String resp;
try {
resp = new BufferedReader(new InputStreamReader(System.in))
.readLine();
if (Integer.parseInt(resp) == 0)
return;
else {
ModelWrapper cw = new ModelWrapper(field,
consts[Integer.parseInt(resp) - 1], null,
clazz,
modelClazz, university);
matches.put(field, cw);
}
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
285
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
} catch (IOException e) {
e.printStackTrace();
}
}
public void setField(String field) {
this.field = field;
}
public Map<String, Object> getMatches() {
return matches;
}
public void setMatches(Map<String, Object> matches) {
this.matches = matches;
}
public void setModelClazz(String modelClazz) {
this.modelClazz = modelClazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
public void setUniversity(University university) {
this.university = university;
}
}
13.6.5.3
*.university
13.6.5.3.1
CreateUniversity
package es.uniovi.innova.eadministracion.tramites.swu.presentation.university;
import javax.inject.Inject;
import javax.inject.Named;
import es.uniovi.innova.eadministracion.tramites.swu.business.UniversityManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.presentation.Executable;
/**
* Crea una universidad en la base de datos
*
* @author danielmf
*
*/
@Named
public class CreateUniversity implements Executable {
private University university;
@Inject
private UniversityManagerService universityService;
@Override
public void execute() {
/*
* university = new University( "Universidad Concreta n2",
* "http://localhost:9090/Univ2Service/services/ServicesPort?wsdl",
* "Señor Reputado");
*/
university = new University(
"Universidad Concreta n1",
286
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
"http://localhost:9090/Univ1Service/services/ServiciosPort?wsdl",
"Fulano Fulánez");
System.out.println("Introduzca su wsdl: ");
System.out.println(university.getWsdl());
System.out.println("Introducza el nombre de su Universidad: ");
System.out.println(university.getName());
System.out.println("Responsable de la operación: ");
System.out.println(university.getPersonInCharge());
System.out.println("Recolectando información del WSDL: "
+ university.getWsdl() + " ...");
university = universityService.save(university);
}
public University getUniversity() {
return university;
}
public void setUniversity(University university) {
this.university = university;
}
}
13.6.5.4
*.ws
13.6.5.4.1
ListFields.java
package es.uniovi.innova.eadministracion.tramites.swu.presentation.ws;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import es.uniovi.innova.eadministracion.tramites.swu.business.WebServiceManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.presentation.Executable;
/**
* Lista los campos de una clase mediante introspección
*
* @author danielmf
*
*/
@Named
public class ListFields implements Executable {
private String clazzName;
private List<String> fields;
private String wsdl;
@Inject
private WebServiceManagerService webserviceService;
@Override
public void execute() {
fields = webserviceService.getClassFields(clazzName, wsdl);
}
public String getClazzName() {
return clazzName;
}
public void setClazzName(String clazzName) {
this.clazzName = clazzName;
}
public List<String> getFields() {
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
287
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
return fields;
}
public void setFields(List<String> fields) {
this.fields = fields;
}
public void setWSDL(String wsdl) {
this.wsdl = wsdl;
}
}
13.6.5.4.2
ListOperations.java
package es.uniovi.innova.eadministracion.tramites.swu.presentation.ws;
import
import
import
import
import
java.io.BufferedReader;
java.io.IOException;
java.io.InputStreamReader;
java.util.ArrayList;
java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import
import
import
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.business.MatcherManagerService;
es.uniovi.innova.eadministracion.tramites.swu.business.WebServiceManagerService;
es.uniovi.innova.eadministracion.tramites.swu.model.University;
es.uniovi.innova.eadministracion.tramites.swu.model.types.Constants;
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
es.uniovi.innova.eadministracion.tramites.swu.presentation.Executable;
es.uniovi.innova.eadministracion.tramites.swu.util.Helper;
/**
* Obtiene las operaciones de un wsdl y descarta las no interesantes para la
* aplicación
*
* @author danielmf
*
*/
@Named
public class ListOperations implements Executable {
private static Logger logger = LoggerFactory
.getLogger(ListOperations.class);
private
private
private
private
private
String choice;
String modelo;
University university;
List<String> ops;
List<OperationWrapper> operations;
@Inject
private WebServiceManagerService webserviceService;
@Inject
private MatcherManagerService matcherService;
@Override
public void execute() {
operations = new ArrayList<OperationWrapper>();
try {
ops = webserviceService.getOperations(university.getWsdl());
if (ops.size() != 0) {
List<Integer> choices = showOps(ops);
boolean flag = false;
288
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
for (int x : choices) {
for (OperationWrapper o : operations) {
if (ops.get(x - 1).contains(o.getOp()))
flag = true;
}
if (!flag) {
OperationWrapper ow = new OperationWrapper(
ops.get(x - 1));
lastTry(ow);
if (ow.getMatch() != null)
save(ow);
else
throw new RuntimeException(
"Debe seleccionar
alguna");
}
flag = false;
}
System.out.println("Modelo: ");
modelo = new BufferedReader(new
InputStreamReader(System.in))
.readLine();
modelo = Helper.retrieveCompleteName(ops.get(0)) + modelo;
}
} catch (IOException e) {
logger.error(e.getMessage());
}
}
private void save(OperationWrapper o) {
university.addOperation(o);
o = matcherService.save(o);
operations.add(o);
}
private void lastTry(OperationWrapper o) throws IOException {
String resp;
int i = 0;
for (String key : Constants.OPS) {
System.out.println(++i + ". " + key);
}
System.out.println("¿Con que operación conecta?: " + o.getOp());
resp = new BufferedReader(new InputStreamReader(System.in)).readLine();
if (Integer.parseInt(resp) == 0)
throw new RuntimeException(
"Tiene que conectar con alguna operación");
else {
o.setMatch(Constants.OPS[Integer.parseInt(resp) - 1]);
}
}
private List<Integer> showOps(List<String> ops) throws IOException {
int i = 1;
for (String op : ops) {
System.out.println(i + ". " + op);
i++;
}
System.out.println("-------------------------");
System.out
.println("¿Qué operaciones son de interés? (separe por
comas): ");
choice = new BufferedReader(new InputStreamReader(System.in))
.readLine();
return retrieveChoices(choice);
}
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
289
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
private static List<Integer> retrieveChoices(String choice) {
List<Integer> x = new ArrayList<Integer>();
String[] ch = choice.split(",");
for (String c : ch)
x.add(Integer.parseInt(c));
return x;
}
public University getUniversity() {
return university;
}
public void setUniversity(University university) {
this.university = university;
}
public List<OperationWrapper> getOperations() {
return operations;
}
public void setOperations(List<OperationWrapper> operations) {
this.operations = operations;
}
public List<String> getOps() {
return ops;
}
public void setOps(List<String> ops) {
this.ops = ops;
}
public String getModelo() {
return modelo;
}
}
13.6.6 Define-tramites-servicios-web-unificadosservice
13.6.6.1
Es.uniovi.innova.eadministracion.tramites.swu.builder
13.6.6.1.1
BecaBuilder.java
package es.uniovi.innova.eadministracion.tramites.swu.builder;
import es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.BecaWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.SolicitanteWrapper;
/**
* Constructor (Builder) en la jerarquía Builder, define las operaciones
* abstractas de construcción que implementarán los concretos.
*
* @author danielmf
*
*/
public abstract class BecaBuilder {
/**
* Devuelve la {@link Beca} construida
*
* @return beca
290
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
*/
public abstract Beca getBeca();
/**
* Devuelve la {@link BecaWrapper} construida, que interesa para hacer el
* match de campos
*
* @return beca
*/
public abstract BecaWrapper getBecaWrapper();
/**
* Devuelve el {@link SolicitanteWrapper} construido, que interesa para
* hacer el match de campos
*
* @return solicitante
*/
public abstract SolicitanteWrapper getSolicitante();
/**
* Establece la propiedad nombre_procedimiento_convocatoria
*
* @param nombre_procedimiento_convocatoria
*/
public abstract void setNombreProcedimientoConvocatoria(
String nombre_procedimiento_convocatoria);
/**
* Establece la propiedad asunto_convocatoria
*
* @param asunto_convocatoria
*/
public abstract void setAsuntoConvocatoria(String asunto_convocatoria);
/**
* Establece la propiedad nombre_solicitante
*
* @param nombre_solicitante
*/
public abstract void setNombreSolicitante(String nombre_solicitante);
/**
* Establece la propiedad apellido1_solicitante
*
* @param apellido1_solicitante
*/
public abstract void setApellido1Solicitante(String apellido1_solicitante);
/**
* Establece la propiedad apellido2_solicitante
*
* @param apellido2_solicitante
*/
public abstract void setApellido2Solicitante(String apellido2_solicitante);
/**
* Establece la propiedad documento_identificativo
*
* @param documento_identificativo
*/
public abstract void setDocumentoIdentificativo(
String documento_identificativo);
/**
* Establece la propiedad tipo_documento_identificativo
*
* @param tipo_documento_identificativo
*/
public abstract void setTipoDocumentoIdentificativo(
String tipo_documento_identificativo);
/**
* Establece la propiedad nacionalidad
*
* @param nacionalidad
*/
public abstract void setNacionalidad(String nacionalidad);
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
291
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
/**
* Establece la propiedad sexo
*
* @param sexo
*/
public abstract void setSexo(String sexo);
/**
* Establece la propiedad fecha_nacimiento
*
* @param fecha_nacimiento
*/
public abstract void setFechaNacimiento(Integer fecha_nacimiento);
/**
* Establece la propiedad estudios
*
* @param estudios
*/
public abstract void setEstudios(String estudios);
/**
* Establece la propiedad estado_solicitud
*
* @param estado_solicitud
*/
public abstract void setEstadoSolicitud(String estado_solicitud);
/**
* Establece la propiedad destino
*
* @param destino
*/
public abstract void setDestino(String destino);
/**
* Establece la propiedad cuantia_otorgada
*
* @param cuantia_otorgada
*/
public abstract void setCuantiaOtorgada(Double cuantia_otorgada);
/**
* Establece la propiedad curso_academico
*
* @param curso_academico
*/
public abstract void setCursoAcademico(String curso_academico);
}
13.6.6.1.2
BecaDirector.java
package es.uniovi.innova.eadministracion.tramites.swu.builder;
import java.lang.reflect.Field;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
/**
* Director de la jerarquía Builder en la construción de la {@link Beca}
*
* @author danielmf
*
*/
public class BecaDirector {
private static Logger logger = LoggerFactory.getLogger(BecaDirector.class);
292
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
private static BecaBuilder builder;
/**
* Dirige las operaciones de construcción por partes
*
* @param models
*
información en crudo
* @return {@link Beca} construida por partes
*/
public static Beca build(List<ModelWrapper> models, Object beca) {
logger.info("Building a Beca : " + beca);
builder = new ConcreteBecaBuilder();
for (ModelWrapper mw : models) {
switch (mw.getMatch()) {
case "nombre_procedimiento_convocatoria":
builder.setNombreProcedimientoConvocatoria((String) getter(
beca, mw));
break;
case "asunto_convocatoria":
builder.setAsuntoConvocatoria((String) getter(beca, mw));
break;
case "estado_solicitud":
builder.setEstadoSolicitud((String) getter(beca, mw));
break;
case "destino":
builder.setDestino((String) getter(beca, mw));
break;
case "cuantia_otorgada":
builder.setCuantiaOtorgada((Double) getter(beca, mw));
break;
case "curso_academico":
builder.setCursoAcademico((String) getter(beca, mw));
break;
case "nombre_solicitante":
builder.setNombreSolicitante((String) getter(beca, mw));
break;
case "apellido1_solicitante":
builder.setApellido1Solicitante((String) getter(beca, mw));
break;
case "apellido2_solicitante":
builder.setApellido2Solicitante((String) getter(beca, mw));
break;
case "documento_identificativo":
builder.setDocumentoIdentificativo((String) getter(beca,
mw));
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
293
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
break;
case "tipo_documento_identificativo":
builder.setTipoDocumentoIdentificativo((String)
getter(beca, mw));
break;
case "nacionalidad":
builder.setNacionalidad((String) getter(beca, mw));
break;
case "sexo":
builder.setSexo((String) getter(beca, mw));
break;
case "fecha_nacimiento":
builder.setFechaNacimiento((Integer) getter(beca, mw));
break;
case "estudios":
builder.setEstudios((String) getter(beca, mw));
break;
}
}
Beca b = builder.getBeca();
logger.info("Beca succesfully built: " + b);
return b;
}
/**
* Obtiene matches de dentro del objeto
*
* @param beca
*
sacada de la invocación del SW
* @param mw
*
para hacer el emparejamiento
*
* @return el valor de la beca del emparejamiento
*/
private static Object getter(Object beca, ModelWrapper mw) {
Field f;
Object o = null;
try {
f = beca.getClass().getDeclaredField(mw.getConcrete());
f.setAccessible(true);
o = f.get(beca);
f.setAccessible(false);
} catch (IllegalArgumentException | IllegalAccessException
| NoSuchFieldException | SecurityException e) {
logger.error(e.getMessage());
}
return o;
}
}
294
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.6.6.1.3
BecaDirectorForm.java
package es.uniovi.innova.eadministracion.tramites.swu.builder;
import java.util.List;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.business.MatcherManagerService;
es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.BecaWrapper;
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.SolicitanteWrapper;
/**
* Builder para construir el modelo del formulario
*
* @author danielmf
*
*/
@Component
public class BecaDirectorForm {
private static Logger logger = LoggerFactory
.getLogger(BecaDirectorForm.class);
private ConcreteFormBecaBuilder builder;
@Inject
private MatcherManagerService matcherManager;
/**
* Dirige las operaciones de construcción por partes
*
* @param fields
*
información en crudo
* @return {@link Beca} construida por partes
*/
public BecaWrapper build(List<String> fields) {
builder = new ConcreteFormBecaBuilder();
for (String field : fields) {
String match = matcherManager.match(field, "BECA");
switch (match) {
case "nombre_procedimiento_convocatoria":
builder.setNombreProcedimientoConvocatoria(field);
break;
case "asunto_convocatoria":
builder.setAsuntoConvocatoria(field);
break;
case "estado_solicitud":
builder.setEstadoSolicitud(field);
break;
case "destino":
builder.setDestino(field);
break;
case "cuantia_otorgada":
builder.setCuantiaOtorgada(field);
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
295
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
break;
case "curso_academico":
builder.setCursoAcademico(field);
break;
}
}
BecaWrapper b = builder.getBecaWrapper();
logger.info("Beca succesfully built: " + b);
return b;
}
public SolicitanteWrapper buildSol(List<String> fields) {
builder = new ConcreteFormBecaBuilder();
for (String field : fields) {
String match = matcherManager.match(field, "SOLICITANTE");
switch (match) {
case "nombre_solicitante":
builder.setNombreSolicitante(field);
break;
case "apellido1_solicitante":
builder.setApellido1Solicitante(field);
break;
case "apellido2_solicitante":
builder.setApellido2Solicitante(field);
break;
case "documento_identificativo":
builder.setDocumentoIdentificativo(field);
break;
case "tipo_documento_identificativo":
builder.setTipoDocumentoIdentificativo(field);
break;
case "nacionalidad":
builder.setNacionalidad(field);
break;
case "sexo":
builder.setSexo(field);
break;
case "fecha_nacimiento":
builder.setFechaNacimiento(field);
break;
case "estudios":
296
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
builder.setEstudios(field);
break;
}
}
SolicitanteWrapper b = builder.getSolicitante();
logger.info("Solicitante succesfully built: " + b);
return b;
}
}
13.6.6.1.4
ConcreteBecaBuilder.java
package es.uniovi.innova.eadministracion.tramites.swu.builder;
import
import
import
import
es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
es.uniovi.innova.eadministracion.tramites.swu.model.Solicitante;
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.BecaWrapper;
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.SolicitanteWrapper;
public class ConcreteBecaBuilder extends BecaBuilder {
private Beca beca;
private Solicitante solicitante;
public ConcreteBecaBuilder() {
beca = new Beca();
solicitante = new Solicitante();
}
@Override
public Beca getBeca() {
beca.setSolicitante(solicitante);
return beca;
}
@Override
public void setNombreProcedimientoConvocatoria(
String nombre_procedimiento_convocatoria) {
beca.setNombre_procedimiento_convocatoria(nombre_procedimiento_convocatoria);
}
@Override
public void setAsuntoConvocatoria(String asunto_convocatoria) {
beca.setAsunto_convocatoria(asunto_convocatoria);
}
@Override
public void setNombreSolicitante(String nombre_solicitante) {
solicitante.setNombre_solicitante(nombre_solicitante);
}
@Override
public void setApellido1Solicitante(String apellido1_solicitante) {
solicitante.setApellido1_solicitante(apellido1_solicitante);
}
@Override
public void setApellido2Solicitante(String apellido2_solicitante) {
solicitante.setApellido2_solicitante(apellido2_solicitante);
}
@Override
public void setDocumentoIdentificativo(String documento_identificativo) {
solicitante.setDocumento_identificativo(documento_identificativo);
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
297
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
}
@Override
public void setTipoDocumentoIdentificativo(
String tipo_documento_identificativo) {
solicitante
.setTipo_documento_identificativo(tipo_documento_identificativo);
}
@Override
public void setNacionalidad(String nacionalidad) {
solicitante.setNacionalidad(nacionalidad);
}
@Override
public void setSexo(String sexo) {
solicitante.setSexo(sexo);
}
@Override
public void setFechaNacimiento(Integer fecha_nacimiento) {
solicitante.setFecha_nacimiento(fecha_nacimiento);
}
@Override
public void setEstudios(String estudios) {
solicitante.setEstudios(estudios);
}
@Override
public void setEstadoSolicitud(String estado_solicitud) {
beca.setEstado_solicitud(estado_solicitud);
}
@Override
public void setDestino(String destino) {
beca.setDestino(destino);
}
@Override
public void setCuantiaOtorgada(Double cuantia_otorgada) {
beca.setCuantia_otorgada(cuantia_otorgada);
}
@Override
public void setCursoAcademico(String curso_academico) {
beca.setCurso_academico(curso_academico);
}
@Override
public BecaWrapper getBecaWrapper() {
return null;
}
@Override
public SolicitanteWrapper getSolicitante() {
return null;
}
}
13.6.6.1.5
ConcreteFormBecaBuilder.java
package es.uniovi.innova.eadministracion.tramites.swu.builder;
298
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
import es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.BecaWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.SolicitanteWrapper;
public class ConcreteFormBecaBuilder extends BecaBuilder {
private BecaWrapper beca;
private SolicitanteWrapper solicitante;
public ConcreteFormBecaBuilder() {
beca = new BecaWrapper();
solicitante = new SolicitanteWrapper();
}
@Override
public Beca getBeca() {
return null;
}
public BecaWrapper getBecaWrapper() {
return beca;
}
public SolicitanteWrapper getSolicitante() {
return solicitante;
}
@Override
public void setNombreProcedimientoConvocatoria(
String nombre_procedimiento_convocatoria) {
beca.setNombre_procedimiento_convocatoria(nombre_procedimiento_convocatoria);
}
@Override
public void setAsuntoConvocatoria(String asunto_convocatoria) {
beca.setAsunto_convocatoria(asunto_convocatoria);
}
@Override
public void setNombreSolicitante(String nombre_solicitante) {
solicitante.setNombre_solicitante(nombre_solicitante);
}
@Override
public void setApellido1Solicitante(String apellido1_solicitante) {
solicitante.setApellido1_solicitante(apellido1_solicitante);
}
@Override
public void setApellido2Solicitante(String apellido2_solicitante) {
solicitante.setApellido2_solicitante(apellido2_solicitante);
}
@Override
public void setDocumentoIdentificativo(String documento_identificativo) {
solicitante.setDocumento_identificativo(documento_identificativo);
}
@Override
public void setTipoDocumentoIdentificativo(
String tipo_documento_identificativo) {
solicitante
.setTipo_documento_identificativo(tipo_documento_identificativo);
}
@Override
public void setNacionalidad(String nacionalidad) {
solicitante.setNacionalidad(nacionalidad);
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
299
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
}
@Override
public void setSexo(String sexo) {
solicitante.setSexo(sexo);
}
public void setFechaNacimiento(String fecha_nacimiento) {
solicitante.setFecha_nacimiento(fecha_nacimiento);
}
@Override
public void setEstudios(String estudios) {
solicitante.setEstudios(estudios);
}
@Override
public void setEstadoSolicitud(String estado_solicitud) {
beca.setEstado_solicitud(estado_solicitud);
}
@Override
public void setDestino(String destino) {
beca.setDestino(destino);
}
public void setCuantiaOtorgada(String cuantia_otorgada) {
beca.setCuantia_otorgada(cuantia_otorgada);
}
@Override
public void setCursoAcademico(String curso_academico) {
beca.setCurso_academico(curso_academico);
}
@Override
public void setFechaNacimiento(Integer fecha_nacimiento) {
}
@Override
public void setCuantiaOtorgada(Double cuantia_otorgada) {
}
}
13.6.6.2
Es.uniovi.innova.eadministracion.tramites.swu.business
13.6.6.2.1
MatcherManagerService.java
package es.uniovi.innova.eadministracion.tramites.swu.business;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
/**
* Fachada que define las operaciones de los matchers NoSQL y StringMetrics
*
* @author danielmf
*
*/
public interface MatcherManagerService {
300
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
/**
* Inicializa la base de datos con los datos necesarios
*/
public void init();
/**
* Busca el campo más factible de casar con el modelo externo
*
* @param field
*
campo externo
*
* @return campo del modelo propio con el que casa
*/
public String match(String field, String modelClazz);
/**
* Guarda en la base de datos la relación para un campo
*
* @param modelWrapper
*
* @return modelWrapper con id
*/
public ModelWrapper save(ModelWrapper modelWrapper);
/**
* Guarda la Operacion en la base de datos
*
* @param operationWrapper
*
* @return operationWrapper con id
*/
public OperationWrapper save(OperationWrapper operationWrapper);
/**
* Comprueba si la base de datos tiene operaciones relativas a una
* {@link University} para temas de consistencia
*
* @param universidad
*
* @return
*/
public boolean checkStatus(University university);
/**
* Borra un match entre campos
*
* @param m
*/
public void delete(ModelWrapper m);
/**
* Borra un match entre operaciones
*
* @param op
*/
public void delete(OperationWrapper op);
}
13.6.6.2.2
OperationsWrapperService.java
package es.uniovi.innova.eadministracion.tramites.swu.business;
import java.util.List;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
import
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapperDocument;
/**
* Operaciones necesarias para Spring Data Solr y que alimentan al buscador
*
* @author danielmf
*
*/
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
301
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
public interface OperationsWrapperService {
/**
* Añade al indice una operación
*
* @param operationWrapper
*/
public void addToIndex(OperationWrapper operationWrapper);
/**
* Borra del índice una operación
*
* @param operationWrapper
*/
public void deleteFromIndex(OperationWrapper operationWrapper);
/**
* Realiza la busqueda en función de una palabra clave
*
* @param keyword
* @return
*/
public List<OperationWrapperDocument> search(String keyword);
}
13.6.6.2.3
SearchEngineService.java
package es.uniovi.innova.eadministracion.tramites.swu.business;
import java.util.List;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
/**
* Fachada que define las operaciones del Servicio de Buscador
*
* @author danielmf
*
*/
public interface SearchEngineService {
/**
* Busca operaciones en la base de conocimiento y en la base de datos
*
* @param search
*
servicio a buscar
*
* @return lista de operaciones y de operaciones relacionadas
*/
List<OperationWrapper> searchOperations(String search);
/**
* Busca universidades en la base de datos
*
* @param search
*
universidad a buscar
*
* @return lista de universidades relacionadas
*/
University searchUniversities(String search);
}
13.6.6.2.4
UniversityManagerService.java
package es.uniovi.innova.eadministracion.tramites.swu.business;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
/**
* Fachada que define las operaciones del modelo de la {@link University}
302
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
*
* @author danielmf
*
*/
public interface UniversityManagerService {
/**
* Almacena una {@link University} en la Base de Datos
*
* @param university
*
*/
public University save(University university);
/**
* Borra una {@link University} de la Base de Datos
*
* @param university
*/
public void remove(University university);
/**
* Obtiene una {@link University} por ID
*
* @param id
*
* @return
*/
public University findUniversity(Long id);
/**
* Obtiene una {@link University} a partir de un wsdl
*
* @param wsdl
* @return
*/
public University findUniversityByWsdl(String wsdl);
/**
* Obtiene una {@link University} a partir de un nombre
*
* @param name
* @return
*/
public University findUniversityByName(String name);
}
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
303
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.6.6.2.5
WebServiceManagerService.java
package es.uniovi.innova.eadministracion.tramites.swu.business;
import java.util.List;
import es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ParamsWrapper;
/**
* Fachada que define las operaciones relativas a interoperabilidad con
* Servicios Web
*
* @author danielmf
*
*/
public interface WebServiceManagerService {
/**
* Obtiene las operaciones de un Servicio Web
*
* @param wsdl
*
* @return Listado de operaciones
*
*/
public List<String> getOperations(String wsdl);
/**
* Realiza una inovcación genérica a un método definido en un WSDL.
*
* @param wsdl
* @param method
* @param args
*
array de objects
* @param classLoader
*
* @return
*
* @throws Exception
*/
public Object connect(String wsdl, String method, Object[] args,
ClassLoader classLoader) throws Exception;
/**
* Obtiene los parámetros de una clase (argumentos de entrada de un método
* del WSDL y el retorno).
*
* @param wsdl
* @param clazzName
*
completo con el paquete
*
* @return {@link ParamsWrapper} envoltorio con los parámetros
* @throws ClassNotFoundException
*/
public ParamsWrapper getOperationIOs(String wsdl, String clazzName)
throws ClassNotFoundException;
/**
* Obtiene los atributos de una clase dada
*
* @param clazzName
*
* @return Listado de strings con los atributos
*/
public List<String> getClassFields(String clazzName, String wsdl);
/**
* Invoca a los métodos de los Servicios Web recopilados en el recolector
* según el tipo de método
*
* @param param
*
Parámetro que se pasa al método del Servicio Web
* @param mode
*
tipo de método
*
304
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
* @return Listado de {@link Beca} recopiladas
*/
public List<Beca> getBecasByParam(Object param, String mode);
/**
* Invoca a lso métodos de los Servicios Web recopilados en el recolector
* según el tipo de método y la universidad
*
* @param param
*
Parámetro que se pasa al método del Servicio Web
* @param mode
*
Tipo de método
* @param university
*
Nombre de la universidad
*
* @return Listado de {@link Beca} recopiladas
*/
public List<Beca> getBecasByParam(Object param, String mode,
String university);
}
13.6.6.3
*.matcher
13.6.6.3.1
MatcherManager.java
package es.uniovi.innova.eadministracion.tramites.swu.business.matcher;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;
import uk.ac.shef.wit.simmetrics.similaritymetrics.AbstractStringMetric;
import uk.ac.shef.wit.simmetrics.similaritymetrics.ChapmanMatchingSoundex;
import uk.ac.shef.wit.simmetrics.similaritymetrics.MongeElkan;
import uk.ac.shef.wit.simmetrics.similaritymetrics.SmithWatermanGotoh;
import uk.ac.shef.wit.simmetrics.similaritymetrics.SmithWatermanGotohWindowedAffine;
import uk.ac.shef.wit.simmetrics.similaritymetrics.Soundex;
import es.uniovi.innova.eadministracion.tramites.swu.business.MatcherManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.business.OperationsWrapperService;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.model.types.Constants;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.persistence.HashDataService;
import
es.uniovi.innova.eadministracion.tramites.swu.persistence.ModelWrapperDataService;
import
es.uniovi.innova.eadministracion.tramites.swu.persistence.OperationsWrapperDataService;
/**
* Servicio que implementa la fachada {@link MatcherManagerService} para
* encapsular la lógica del matcher.
*
* @author danielmf
*
*/
@Named
public class MatcherManager implements MatcherManagerService {
private static Logger logger = LoggerFactory
.getLogger(MatcherManager.class);
@Inject
private HashDataService hashDataService;
@Inject
private ModelWrapperDataService modelWrapperDataService;
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
305
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
@Inject
private OperationsWrapperDataService operationsWrapperDataService;
@Inject
private OperationsWrapperService operationsWrapperService;
@Override
public void init() {
hashDataService.init();
}
@Override
public String match(String field, String modelClazz) {
ModelWrapper mw = hashDataService.queryModel(field, modelClazz);
if (mw == null) {
List<String> matches = new ArrayList<String>();
if (modelClazz.equalsIgnoreCase("BECA"))
matches = match(field, Constants.BECA);
else
matches = match(field, Constants.SOLICITANTE);
if (matches.size() > 0)
return matches.get(0);
} else
return mw.getMatch();
return "";
}
@Override
@Transactional
public ModelWrapper save(ModelWrapper modelWrapper) {
logger.info("Guardando Model Wrapper: " + modelWrapper);
modelWrapper = modelWrapperDataService.save(modelWrapper);
saveHash(modelWrapper);
return modelWrapper;
}
@Override
@Transactional
public OperationWrapper save(OperationWrapper operationWrapper) {
logger.info("Guardando Operation Wrapper: " + operationWrapper);
operationWrapper = operationsWrapperDataService.save(operationWrapper);
operationsWrapperService.addToIndex(operationWrapper);
saveHash(operationWrapper);
return operationWrapper;
}
@Override
public boolean checkStatus(University university) {
List<OperationWrapper> res = operationsWrapperDataService
.findByUniversity(university);
return (res != null && res.size() > 0);
}
@Override
public void delete(ModelWrapper m) {
modelWrapperDataService.delete(m);
}
@Override
306
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
public void delete(OperationWrapper op) {
operationsWrapperDataService.delete(op);
operationsWrapperService.deleteFromIndex(op);
}
/**
* Comprueba las probabilidades de que dos campos sean el mismo
*
* @param concrete
*
campo a comparar
* @param constants
*
constantes del modelo generico
*
* @return listado de campos que pueden coincidir
*/
private List<String> match(String concrete, String[] constants) {
logger.info("Matching: (" + concrete + ", " + constants.toString()
+ ")");
List<String> options = new ArrayList<String>();
for (String s : constants) {
if (checkProbabilities(s, concrete) >= 70)
options.add(s);
}
return options;
}
/**
* Aplica StringMetrics para comprobar dos cadenas de texto
*
* @param generic
* @param concrete
*
* @return porcentaje de parentesco
*/
private float checkProbabilities(String generic, String concrete) {
logger.info(generic + " vs " + concrete);
concrete = preProcessing(concrete);
generic = preProcessing(generic);
AbstractStringMetric metric;
float avg = 0F, result = 0F;
metric = new ChapmanMatchingSoundex();
result = metric.getSimilarity(generic, concrete);
formatter(result, metric);
avg += result;
metric = new Soundex();
result = metric.getSimilarity(generic, concrete);
formatter(result, metric);
avg += result;
metric = new SmithWatermanGotoh();
result = metric.getSimilarity(generic, concrete);
formatter(result, metric);
avg += result;
metric = new SmithWatermanGotohWindowedAffine();
result = metric.getSimilarity(generic, concrete);
formatter(result, metric);
avg += result;
metric = new MongeElkan();
result = metric.getSimilarity(generic, concrete);
formatter(result, metric);
avg += result;
int res = Math.round((avg / 5.0F) * 100.0F);
logger.info(res + "%");
return res;
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
307
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
}
/**
* Guarda un {@link ModelWrapper} en la NoSQL
*
* @param modelWrapper
*/
private void saveHash(ModelWrapper modelWrapper) {
logger.info("Guardando Hash Model Wrapper: " + modelWrapper);
hashDataService.save(modelWrapper);
}
/**
* Guarda un {@link OperationWrapper} en la NoSQL
*
* @param operationWrapper
*/
private void saveHash(OperationWrapper operationWrapper) {
logger.info("Guardando Hash Operation Wrapper: " + operationWrapper);
hashDataService.save(operationWrapper);
}
/**
* Formateador de cadenas para mostrar la técnica y el porcentaje
*
* @param result
*
Resultado obtenido
* @param metric
*
{@link AbstractStringMetric} métrica usada
*/
private static void formatter(final float result,
final AbstractStringMetric metric) {
logger.info("Usando la metrica " + metric.getShortDescriptionString()
+ " tenemos una puntuacion de " + (result * 100 / 1) +
"%");
}
/**
* Preprocesa el campo concreto para aumentar las probabilidades de hacer
* matching.
*
* @param concrete
*
Campo del modelo concreto
*
* @return Cadena procesada "sin impurezas"
*/
private String preProcessing(String concrete) {
concrete = concrete.replaceAll("[^\\p{Alpha}]", "");
concrete = concrete.toLowerCase();
concrete = concrete.trim();
return concrete;
}
}
308
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.6.6.4
*.searchengine
13.6.6.4.1
SearchEngineService.java
package es.uniovi.innova.eadministracion.tramites.swu.business.searchengine;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import es.uniovi.innova.eadministracion.tramites.swu.business.OperationsWrapperService;
import es.uniovi.innova.eadministracion.tramites.swu.business.SearchEngineService;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
import
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapperDocument;
import es.uniovi.innova.eadministracion.tramites.swu.persistence.UniversityDataService;
/**
* Service de las operaciones del buscador
*
* @author danielmf
*
*/
@Named
public class SearchEngineManager implements SearchEngineService {
private static Logger logger = LoggerFactory
.getLogger(SearchEngineManager.class);
@Inject
private UniversityDataService universityDataService;
@Inject
private OperationsWrapperService operationsWrapperService;
@Override
public List<OperationWrapper> searchOperations(String search) {
logger.info("Buscando Operacion: " + search);
List<OperationWrapperDocument> ows = operationsWrapperService
.search(search);
List<OperationWrapper> list = new ArrayList<OperationWrapper>();
for (OperationWrapperDocument ow : ows) {
list.add(new OperationWrapper(ow.getOp(), ow.getMatch(),
universityDataService.findOne((ow.getUniversity()
.longValue()))));
}
if (list.size() > 0)
return list;
else
return null;
}
@Override
public University searchUniversities(String search) {
logger.info("Buscando universidad: " + search);
return universityDataService.findByName(search);
}
}
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
309
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.6.6.5
*.solr
13.6.6.5.1
OperationsWrapperManager.java
package es.uniovi.innova.eadministracion.tramites.swu.business.solr;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import es.uniovi.innova.eadministracion.tramites.swu.business.OperationsWrapperService;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
import
es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapperDocument;
import
es.uniovi.innova.eadministracion.tramites.swu.util.solr.OperationsWrapperDocumentReposit
ory;
/**
* Implementa las operaciones de la interface {@link OperationsWrapperService}
* que se utilizan para funciones de buscador
*
* @author danielmf
*
*/
@Named
public class OperationsWrapperManager implements OperationsWrapperService {
@Inject
private OperationsWrapperDocumentRepository operationsWrapperDocumentRepository;
@Override
public void addToIndex(OperationWrapper operationWrapper) {
OperationWrapperDocument operationWrapperDocument = new
OperationWrapperDocument();
operationWrapperDocument.setId(operationWrapper.getUniversity().getId()
+ "-" + operationWrapper.getMatch() + "-"
+ operationWrapper.getOp());
operationWrapperDocument.setOp(operationWrapper.getOp());
operationWrapperDocument.setMatch(operationWrapper.getMatch());
operationWrapperDocument.setUniversity(operationWrapper.getUniversity()
.getId());
operationWrapperDocument.setUniversity_name(operationWrapper
.getUniversity().getName());
operationsWrapperDocumentRepository.save(operationWrapperDocument);
}
@Override
public List<OperationWrapperDocument> search(String keyword) {
return operationsWrapperDocumentRepository.findByMatchOrOp(keyword);
}
@Override
public void deleteFromIndex(OperationWrapper operationWrapper) {
operationsWrapperDocumentRepository.delete(operationWrapper
.getUniversity().getId()
+ "-"
+ operationWrapper.getMatch()
+ "-" + operationWrapper.getOp());
}
}
310
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
13.6.6.6
*.university
13.6.6.6.1
UniversityManager.java
package es.uniovi.innova.eadministracion.tramites.swu.business.university;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;
import es.uniovi.innova.eadministracion.tramites.swu.business.UniversityManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.persistence.UniversityDataService;
/**
* Servicio que implementa la fachada {@link UniversityManagerService} con las
* operaciones relativas al modelo {@link University}
*
* @author danielmf
*
*/
@Named
public class UniversityManager implements UniversityManagerService {
private static Logger logger = LoggerFactory
.getLogger(UniversityManager.class);
@Inject
private UniversityDataService universityDataService;
@Override
@Transactional
public University save(University university) {
logger.info("Guardando universidad: " + university);
university = universityDataService.save(university);
return university;
}
@Override
@Transactional
public void remove(University university) {
universityDataService.delete(university);
}
@Override
public University findUniversity(Long id) {
return universityDataService.findOne(id);
}
@Override
public University findUniversityByWsdl(String wsdl) {
return universityDataService.findByWsdl(wsdl);
}
@Override
public University findUniversityByName(String name) {
return universityDataService.findByName(name);
}
}
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
311
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
13.6.6.7
*.ws
13.6.6.7.1
WebServiceManager.java
package es.uniovi.innova.eadministracion.tramites.swu.business.ws;
import
import
import
import
import
import
import
java.lang.reflect.Field;
java.util.ArrayList;
java.util.HashMap;
java.util.Iterator;
java.util.LinkedList;
java.util.List;
java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
import
import
import
import
import
import
import
import
import
import
import
import
import
org.apache.commons.lang.StringUtils;
org.apache.cxf.endpoint.Client;
org.apache.cxf.endpoint.ClientImpl;
org.apache.cxf.endpoint.Endpoint;
org.apache.cxf.endpoint.dynamic.DynamicClientFactory;
org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
org.apache.cxf.service.model.BindingInfo;
org.apache.cxf.service.model.BindingMessageInfo;
org.apache.cxf.service.model.BindingOperationInfo;
org.apache.cxf.service.model.MessagePartInfo;
org.apache.cxf.service.model.ServiceInfo;
org.slf4j.Logger;
org.slf4j.LoggerFactory;
import es.uniovi.innova.eadministracion.tramites.swu.builder.BecaDirector;
import es.uniovi.innova.eadministracion.tramites.swu.business.WebServiceManagerService;
import es.uniovi.innova.eadministracion.tramites.swu.exception.GenericException;
import es.uniovi.innova.eadministracion.tramites.swu.model.Beca;
import es.uniovi.innova.eadministracion.tramites.swu.model.University;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ModelWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.OperationWrapper;
import es.uniovi.innova.eadministracion.tramites.swu.model.wrapper.ParamsWrapper;
import
es.uniovi.innova.eadministracion.tramites.swu.persistence.ModelWrapperDataService;
import
es.uniovi.innova.eadministracion.tramites.swu.persistence.OperationsWrapperDataService;
import es.uniovi.innova.eadministracion.tramites.swu.persistence.UniversityDataService;
import es.uniovi.innova.eadministracion.tramites.swu.util.Helper;
/**
* Servicio que implementa la fachada {@link WebServiceManagerService} con las
* operaciones relativas a la interoperabilidad con Servicios Web
*
* @author danielmf
*
*/
@Named
public class WebServiceManager implements WebServiceManagerService {
private static Logger logger = LoggerFactory
.getLogger(WebServiceManager.class);
private Map<String, List<String>> returns;
@Inject
private ModelWrapperDataService modelWrapperDataService;
@Inject
private OperationsWrapperDataService operationsWrapperDataService;
@Inject
private UniversityDataService universityDataService;
@Override
public List<String> getOperations(String wsdl) {
logger.info("Obteniendo operaciones del WSDL: " + wsdl);
List<String> l = new LinkedList<String>();
312
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
try {
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory
.newInstance();
Client client = factory.createClient(wsdl,
WebServiceManager.class.getClassLoader());
ClientImpl clientImpl = (ClientImpl) client;
Endpoint endpoint = clientImpl.getEndpoint();
ServiceInfo serviceInfo = endpoint.getService().getServiceInfos()
.get(0);
BindingInfo binding = serviceInfo.getBindings().iterator().next();
Iterator<BindingOperationInfo> it = binding.getOperations()
.iterator();
while (it.hasNext()) {
BindingOperationInfo boi = it.next();
BindingMessageInfo inputMessageInfo = boi.getInput();
List<MessagePartInfo> parts = inputMessageInfo
.getMessageParts();
MessagePartInfo partInfo = parts.get(0);
if (partInfo.getTypeClass() != null)
l.add(partInfo.getTypeClass().getCanonicalName());
}
if (l.size() == 0)
throw new GenericException(
"El WSDL proporcionado no es válido.");
logger.info("Operaciones obtenidas satisfactoriamente: " +
l.size());
} catch (Exception e) {
logger.error("WSDL no disponible.");
throw new GenericException("El WSDL proporcionado no es válido.");
}
return l;
}
@Override
public Object connect(String wsdl, String method, Object[] args,
ClassLoader classLoader) throws Exception {
logger.info("Invocando " + method + " en " + wsdl);
if (classLoader == null)
classLoader = WebServiceManager.class.getClassLoader();
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient(wsdl, classLoader);
Object[] res = client.invoke(method, args);
logger.info("Operación del Servicio Web invocada satisfactoriamente");
return res[0];
}
@Override
public ParamsWrapper getOperationIOs(String wsdl, String clazzName)
throws ClassNotFoundException {
logger.info("Invocando " + clazzName + " en " + wsdl);
if (returns == null)
returns = new HashMap<String, List<String>>();
ParamsWrapper pw = new ParamsWrapper();
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
dcf.createClient(wsdl, WebServiceManager.class.getClassLoader());
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
313
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
Object clazz = getInstance(clazzName);
if (clazz.getClass().getDeclaredFields().length > 0) {
for (Field m : clazz.getClass().getDeclaredFields()) {
pw.add(m.getType().getCanonicalName());
}
}
return pw;
}
@SuppressWarnings("unused")
@Override
public List<String> getClassFields(String clazzName, String wsdl) {
try {
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory
.newInstance();
Client client = factory.createClient(wsdl,
WebServiceManager.class.getClassLoader());
Class<?> c = Thread.currentThread().getContextClassLoader()
.loadClass(clazzName);
List<String> fields = new ArrayList<String>();
for (Field f : c.getDeclaredFields())
fields.add(f.getName());
return fields;
} catch (ClassNotFoundException e) {
logger.error("No se ha podido crear la clase: " + clazzName);
throw new GenericException("No se ha podido crear la clase: "
+ clazzName);
}
}
@Override
public List<Beca> getBecasByParam(Object param, String mode) {
logger.info("Obteniendo operaciones de: " + mode);
List<Beca> list = new ArrayList<Beca>();
List<OperationWrapper> operations = operationsWrapperDataService
.findByMatch(mode);
logger.info(operations.size() + " operaciones obtenidas con éxito.");
for (OperationWrapper operationWrapper : operations) {
logger.info("Invocando operacion: " + operationWrapper.getOp()
+ " en " +
operationWrapper.getUniversity().getWsdl());
invoke(param, list, operationWrapper);
}
return list;
}
@Override
public List<Beca> getBecasByParam(Object param, String mode,
String university) {
logger.info("Obteniendo operaciones de: " + mode);
List<Beca> list = new ArrayList<Beca>();
University u = universityDataService.findByName(university);
314
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo
Apéndices | Plataforma para Interoperabilidad de sistemas de información dentro de un
mismo ámbito organizativo
List<OperationWrapper> operations = operationsWrapperDataService
.findByMatchAndUniversityId(mode, u.getId());
logger.info(operations.size() + " operaciones obtenidas con éxito.");
for (OperationWrapper operationWrapper : operations) {
logger.info("Invocando operación : " + operationWrapper.getOp()
+ " en " +
operationWrapper.getUniversity().getWsdl());
invoke(param, list, operationWrapper);
}
return list;
}
/**
* Realiza la llamada dinámica a un servicio web
*
* @param param
*
con el que se llamará al método
* @param list
*
con las becas obtenidas
* @param operationWrapper
*
operación a llamar
*/
private void invoke(Object param, List<Beca> list,
OperationWrapper operationWrapper) {
try {
DynamicClientFactory dcf = DynamicClientFactory.newInstance();
Client client = dcf.createClient(operationWrapper.getUniversity()
.getWsdl(),
WebServiceManager.class.getClassLoader());
Object[] results = client.invoke(StringUtils.uncapitalize(Helper
.getClassName(operationWrapper.getOp())), param);
list.addAll(parseResult(results[0],
operationWrapper.getUniversity()));
} catch (Exception e) {
logger.error(e.getMessage());
}
}
/**
* Convierte la beca concreta en un genérica
*
* @param results
* @param university
* @return
*/
private List<Beca> parseResult(Object results, University university) {
List<Beca> becas = new ArrayList<Beca>();
Object[] result = (Object[]) results;
List<ModelWrapper> models = modelWrapperDataService
.findByUniversityClazz(university, result[0].getClass()
.getCanonicalName());
for (Object beca : result) {
becas.add(BecaDirector.build(models, beca));
}
return becas;
}
/**
* Genera una instancia para un nombre de clase dada
Máster en Ingeniería Web - Centro Internacional de Postgrado - Universidad de
Oviedo | Daniel Machado Fernández
315
Plataforma para Interoperabilidad de sistemas de información dentro de un mismo ámbito
organizativo | Apéndices
*
* @param clazzName
*
* @return Object
*/
private Object getInstance(String clazzName) {
logger.info("Instanciando " + clazzName);
Object clazz = null;
try {
clazz = Thread.currentThread().getContextClassLoader()
.loadClass(clazzName).newInstance();
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException e) {
logger.error(e.getMessage());
}
return clazz;
}
}
13.6.6.8
n
Es.uniovi.innova.eadministracion.tramites.swu.exceptio
13.6.6.8.1
GenericException.java
package es.uniovi.innova.eadministracion.tramites.swu.exception;
/**
* Excepción genérica para recogerla en las vistas del sitio web y mostrar
* mensajes personalizados de error
*
* @author danielmf
*
*/
public class GenericException extends RuntimeException {
private static final long serialVersionUID = 3408539344410962233L;
protected String msg;
public GenericException(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
316
Daniel Machado Fernández | Máster en Ingeniería Web - Centro Internacional de
Postgrado - Universidad de Oviedo