PFC David Grajal

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 173

UNIVERSIDAD ALFONSO X EL SABIO

Escuela Politecnica Superior


Ingenieria de Telecomunicación

PROYECTO FIN DE CARRERA

INTEGRACIÓN DE APLICACIONES EN REDES


TELEFÓNICAS IP

TCO06010

David Grajal Blanco


UNIVERSIDAD ALFONSO X EL SABIO

ESCUELA POLITECNICA SUPERIOR INGENIERIA DE


TELECOMUNICACIÓN

PROYECTO FIN DE CARRERA

INTEGRACIÓN DE APLICACIONES EN REDES


TELEFÓNICAS IP

CÓDIGO DEL PROYECTO: TCO06010


DIRECTOR: Ricardo Sosa

Vo Bo del Director del Proyecto AUTOR: David Grajal Blanco


Resumen

Este documento fue presentado por el autor para la obtención del título de Ingeniero superior
en Telecomunicaciones por la Escuela Politécnica de la Universidad Alfonso X el Sabio.
El trabajo que se ha querido desarrollar en este proyecto trata sobre la integración de la tecno-
logía de voz sobre IP en aplicaciones web convencionales. Primero se expondrán las diferencias
entre la telefonía IP y la telefonía tradicional y después un estudio de las diversas maneras de
construir una arquitectura para dar este tipo de servicios.
El planteamiento original del proyecto incluía la programación de un prototipo de aplicación.
La idea original era desarrollar un pequeño software de gestión con integración telefónica. En
el trabajo aquí expuesto se ha optado por simplificar y separar los dos componentes. Por un
lado se ha desarrollado un prototipo de aplicación de gestión, ilustrando cómo se construiría
una pequeña aplicación de gestión para una pyme. Este primer prototipo ilustra la arquitectura
moderna de una aplicación web. El segundo prototipo muestra algunas de las posibilidades de
la integración de la telefonía en las aplicaciones convencionales.

Palabras clave
VoIP, SIP, IAX, Jingle, IMS, Parlay, Java, Jain, JSLEE, Asterisk, Mobicents, Rhino, Appfuse,
Struts, Spring, Hibernate, SQL, IDEA, Eclipse, Anthill, Latex, Maven

V
VI
Agradecimientos

padres por confiar en mi y apoyarme en todo lo que me propongo, por saber darme
A MIS
cariño en la distancia durante los últimos años y mantenerme el ánimo para continuar
esforzandome. Ellos me han proporcionado todo lo que he necesitado y me han enseñado a ser
constante.
A Yannis Dimitriadis Damoulis por motivarme en la Universidad de Valladolid a dar mis
primeros pasos en la edición de textos con LATEXy a Sergio Fernández López por poner a dispo-
sición publica mediante una licencia creative commons su proyecto final de carrera «Swaml,
publicación de listas de correo en web semántica». La escritura de este proyecto se ha basado
en la estructura básica de su documento LATEX.
Gracias a todos los amigos que me han ayudado a pulir el proyecto. A Pablo Cristóbal
del Río de «Experience Ingeniería y Servicios », a Gustavo García Bernardo de la división
de Servicios de Comunicación en Tiempo Real de «Telefónica Investigación y Desarrollo »y
a Diego García Galiana de «Ericsson »por sus explicaciones sobre IMS y sobre Java JAIN
SLEE. Gracias también a Antonio Nó Rodriguez, Ignacio Herrán Redondo y Ignacio Clérigo
de Idatel Networks SL por darme la posibilidad de trabajar en el desarrollo de una aplicación
interna junto con Javier Nuño del Campo.
Gracias a mi director de proyecto Ricardo Sosa por la libertad que me ha brindado al pla-
nificar y desarrollar el proyecto y a sus buenos consejos y ayuda en momentos críticos.
Y para terminar también quiero dar las gracias a todos los amigos de la carrera, tanto en la
primera etapa en Valladolid como en Madrid. Este trabajo es la culminación de muchos años
de trabajo en que hemos compartido momentos y experiencias inolvidables.

VII
VIII
Licencia

Documento
El contenido de este documento se encuentra protegido por la licencia Creative Commons
Reconocimiento 2.5 (anexo E.1).

Código fuente
El código fuente (disponible en el anexo D) se encuentra licenciado bajo la licencia GNU
General Public License (GPL), versión 2 o superior (anexo E.2).

Uso comercial general del proyecto


El uso del PFC para fines que produzcan beneficios económicos, directa o indirectamente,
no requerirá el consentimiento expreso de sus autores, de los cuales en todo momento se hará
constar sus nombres.

Propiedad intelectual
La propiedad intelectual del PFC, en su conjunto o en cualquiera de sus partes, corresponde
en un 50 % al alumno y en el 50 % restante al director o directores, de tal modo que el PFC
se considera una obra de colaboración entre el alumno y el/los director/es de acuerdo con el
artículo 7 del Real Decreto Legislativo 1/1996 que establece el texto refundido de la Ley de la
Propiedad Intelectual.

IX
X
Historial de este documento

Fecha Versión Comentarios


Jun/2006 0.1 Anteproyecto
Abr/2007 0.2 Primer borrador
May/2007 0.3 Segundo borrador
Jun/2007 0.4 Tercer borrador. Primera versión revisada por el director de proyecto
Jun/2007 0.5 Cuarto borrador.
Jul/2007 0.6 Quinto borrador.
Jul/2007 1.0 Versión final entregada en la documentación

XI
XII
Índice general

1. Introducción 1
1.1. Motivación y justificación del proyecto . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3. ¿Cómo está estructurado este documento? . . . . . . . . . . . . . . . . . . . . 2

2. Integración de aplicaciones en redes telefónicas IP 5


2.1. Voz sobre IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.1. Ventajas de VoIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.2. Desventajas de VoIP . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.3. Funcionalidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.4. Arquitectura de la voz sobre IP . . . . . . . . . . . . . . . . . . . . . . 7
2.2. IMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2.1. Desarrollo de IMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.2. IMS contra la telefonía actual . . . . . . . . . . . . . . . . . . . . . . 12
2.2.3. Implantación de IMS . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3. Ejemplos de aplicaciones integradas en sistemas telefónicos IP . . . . . . . . . 13
2.3.1. Aplicaciones VoIP orientados a la web . . . . . . . . . . . . . . . . . . 13
2.3.2. Sistemas de mensajería integrada con soporte de VoIP . . . . . . . . . 14
2.3.3. Aplicaciones VoIP para dispositivos portátiles . . . . . . . . . . . . . . 15
2.4. Mercado de las aplicaciones web VoIP . . . . . . . . . . . . . . . . . . . . . . 15
2.5. Arquitectura de las aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.5.1. Organismos de estandarización . . . . . . . . . . . . . . . . . . . . . . 19
2.5.2. Comunicación HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.5.3. Comunicación SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.5.4. Comunicación propietaria . . . . . . . . . . . . . . . . . . . . . . . . 24

3. Construcción del prototipo de aplicación ERP 25


3.1. Especificaciones del cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.1.1. Funcionalidades presentes en el prototipo . . . . . . . . . . . . . . . . 26
3.1.2. Funcionalidades adicionales . . . . . . . . . . . . . . . . . . . . . . . 26
3.2. Interfaz de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.1. Login del usuario en la aplicación . . . . . . . . . . . . . . . . . . . . 29
3.2.2. Menú principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.3. Vista en listados de los contenidos . . . . . . . . . . . . . . . . . . . . 30
3.2.4. Vistas de edición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.5. Interfaz multilenguaje . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3. Casos de uso de la aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3.1. Creación de mayorista/proveedor/distribuidor . . . . . . . . . . . . . . 33

XIII
XIV ÍNDICE GENERAL

3.3.2. Creación de pedidos . . . . . . . . . . . . . . . . . . . . . . . . . . . 34


3.4. Arquitectura de la aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4.1. Aplicación web de modelo 2 / modelo vista controlador (MVC) . . . . 35
3.4.2. Persistencia de objetos en la base de datos . . . . . . . . . . . . . . . . 36
3.5. Definición del entorno de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.6. Metodología de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.7. Planificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.7.1. Fase 0: Toma de contacto . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.7.2. Fase 1: Creación de un prototipo base . . . . . . . . . . . . . . . . . . 38
3.7.3. Fase 2: Segunda quincena de agosto . . . . . . . . . . . . . . . . . . . 40
3.7.4. Fase 3: Finalización del prototipo . . . . . . . . . . . . . . . . . . . . 41
3.8. Estructura de la base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.8.1. Tablas de la base de datos de ámbito general . . . . . . . . . . . . . . . 41
3.8.2. Tablas de la base de datos relacionadas con los usuarios del sistema . . 43
3.8.3. Tablas de la base de datos relacionadas con la facturación . . . . . . . . 45
3.8.4. Tablas relacionadas con los productos . . . . . . . . . . . . . . . . . . 48
3.8.5. Tablas relacionadas con los empleados . . . . . . . . . . . . . . . . . . 50
3.8.6. Tablas relacionadas con los servicios . . . . . . . . . . . . . . . . . . 50

4. Construcción del prototipo de aplicación VoIP 51


4.1. Arquitectura de la aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2. Interfaz de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.3. Casos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.3.1. Click-to-call . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

5. Conclusiones 55
5.1. Cronograma temporal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.2. Hitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.3. Líneas de futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.4. Conclusiones personales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.5. Opiniones personales sobre el proyecto y sobre la telefonía IP . . . . . . . . . 58

A. Anteproyecto 59

B. Herramientas utilizadas para el desarrollo del proyecto 65


B.1. GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
B.2. Plataforma telefónica de código abierto Asterisk . . . . . . . . . . . . . . . . . 66
B.2.1. Librería Asterisk-Java . . . . . . . . . . . . . . . . . . . . . . . . . . 67
B.2.2. TrixBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
B.2.3. AsteriskNOW Beta5 0.9.5-x86 . . . . . . . . . . . . . . . . . . . . . . 68
B.3. Entorno Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
B.3.1. Configuración del entorno Java en Linux . . . . . . . . . . . . . . . . 70
B.3.2. Configuración del entorno Java en Windows . . . . . . . . . . . . . . . 70
B.4. PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
B.4.1. PhpPGadmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
B.5. Mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
B.5.1. PHPmyadmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
B.6. Aplicaciones usadas para el desarrollo de los prototipos . . . . . . . . . . . . . 73
B.6.1. Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
ÍNDICE GENERAL XV

B.6.2. Anthill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
B.6.3. Servidor de aplicaciones Tomcat . . . . . . . . . . . . . . . . . . . . . 73
B.6.4. Servidor de aplicaciones Jetty . . . . . . . . . . . . . . . . . . . . . . 73
B.6.5. Appfuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
B.6.6. Struts2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
B.6.7. Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
B.6.8. Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
B.6.9. Sitemesh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
B.6.10. Maven2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
B.6.11. Ant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
B.6.12. Festival . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
B.7. Softphones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
B.7.1. X-Lite 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
B.7.2. Ekiga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
B.7.3. Gizmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
B.7.4. Wengophone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
B.8. Documentación LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
B.8.1. JabRef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
B.8.2. Kile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
B.8.3. Rubber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
B.8.4. LATEXBeamer Class 3.07 . . . . . . . . . . . . . . . . . . . . . . . . . 79
B.8.5. Keyjnote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
B.9. Otras herramientas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
B.9.1. Dia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
B.9.2. Gimp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
B.9.3. Twiki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
B.9.4. Audacity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
B.9.5. Kpdf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

C. Instalación de Anthill 83
C.1. Instalación de Anthill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

D. Listado del código fuente 89


D.1. Primer prototipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
D.1.1. Estructura de la base de datos PostgreSQL . . . . . . . . . . . . . . . . 89
D.2. Segundo prototipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
D.2.1. Clase Factura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
D.2.2. Clase FacturaManager . . . . . . . . . . . . . . . . . . . . . . . . . . 100
D.2.3. Clase ListFacturasAction . . . . . . . . . . . . . . . . . . . . . . . . . 101
D.2.4. Clase LlamarExtensionAction . . . . . . . . . . . . . . . . . . . . . . 101
D.3. Otros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
D.3.1. Makefile (para la creación de la documentación) . . . . . . . . . . . . 103

E. Licencias 105
E.1. Creative Commons Reconocimiento-CompartirIgual 2.5 . . . . . . . . . . . . 105
E.2. GNU General Public License (GPL) . . . . . . . . . . . . . . . . . . . . . . . 106
XVI ÍNDICE GENERAL

F. Diario de trabajo del PFC 111


F.1. 9/jul/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
F.2. 8/jul/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
F.3. 7/jul/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
F.4. 6/jul/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
F.5. 5/jul/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
F.6. 4/jul/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
F.7. 3/jul/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
F.8. 2/jul/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
F.9. 1/jul/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
F.10. 30/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
F.11. 29/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
F.12. 28/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
F.13. 27/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
F.14. 26/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
F.15. 25/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
F.16. 24/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
F.17. 23/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
F.18. 22/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
F.19. 20/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
F.20. 13/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
F.21. 11/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
F.22. 10/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
F.23. 9/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
F.24. 8/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
F.25. 7/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
F.26. 6/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
F.27. 5/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
F.28. 4/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
F.29. 3/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
F.30. 2/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
F.31. 1/jun/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
F.32. 31/may/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
F.33. 21/abr/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
F.34. 20/abr/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
F.35. 18/abr/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
F.36. 17/abr/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
F.37. 13/abr/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
F.38. 29/mar/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
F.39. 28/mar/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
F.40. 27/mar/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
F.41. 12/mar/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
F.42. 29/dic/2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
F.43. 18/dic/2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
F.44. 17/dic/2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
F.45. 16/dic/2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
F.46. 14/dic/2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
F.47. 13/dic/2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
ÍNDICE GENERAL XVII

F.48. 17/nov/2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145


F.49. 15/nov/2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
F.50. 14/nov/2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
F.51. 13/nov/2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
F.52. 12/nov/2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

Bibliografía 149
XVIII ÍNDICE GENERAL
Índice de figuras

1.1. Estructura de documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.1. Accesos en una red IMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11


2.2. Logotipo de Jajah . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3. Clientes de mensajería con soporte de voz IP . . . . . . . . . . . . . . . . . . . 15
2.4. Logotipo de Fring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.5. Arquitectura de un sistema IMS . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.6. Logotipo de OpenID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.7. Arquitectura del sistema BT Wholesale Web Call Connect . . . . . . . . . . . 22
2.8. Logotipo de mobicents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3.1. Interfaz de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28


3.2. Pantalla de login en la aplicación . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.3. Menú principal de la aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.4. Listado de las áreas de negocio . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.5. Pantalla de edición de proveedores . . . . . . . . . . . . . . . . . . . . . . . . 32
3.6. Pantalla de login en inglés . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.7. Patrón de diseño modelo-vista-controlador . . . . . . . . . . . . . . . . . . . . 36
3.8. Componentes del prototipo de aplicación ERP . . . . . . . . . . . . . . . . . . 37

4.1. Arquitectura del prototipo de aplicación VoIP . . . . . . . . . . . . . . . . . . 52


4.2. Prototipo2 junio de 2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

5.1. Roadmap del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

B.1. Logotipo de Debian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66


B.2. Trixbox 2.2 interfaz web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
B.3. AsteriskNow beta 5 arrancado . . . . . . . . . . . . . . . . . . . . . . . . . . 69
B.4. AsteriskNow beta 5 interfaz de usuario web . . . . . . . . . . . . . . . . . . . 69
B.5. Logotipo de postgresql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
B.6. PhPPGadmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
B.7. PhPMysqladmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
B.8. Logotipo de Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
B.9. Logotipo de Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
B.10. Logotipo de Appfuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
B.11. Logotipo de Struts2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
B.12. Logotipo de Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
B.13. Logotipo de hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
B.14. X-lite 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
B.15. Lopotipo de Ekiga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

XIX
XX ÍNDICE DE FIGURAS

B.16. Captura de pantalla de wengophone . . . . . . . . . . . . . . . . . . . . . . . 77


B.17. JabRef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
B.18. Captura de pantalla de kile mientras edito este mismo texto . . . . . . . . . . . 79
B.19. Captura de pantalla de Dia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
B.20. Captura de pantalla de Gimp . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
B.21. Logotipo de Twiki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
B.22. Captura de pantalla de Audacity . . . . . . . . . . . . . . . . . . . . . . . . . 81
B.23. Captura de pantalla de Kpdf . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

C.1. Anthill nos solicita la ruta de instalación . . . . . . . . . . . . . . . . . . . . . 84


C.2. Pantalla principal de Anthill . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
C.3. Compilando proyecto de pruebas . . . . . . . . . . . . . . . . . . . . . . . . . 87
C.4. Compilando prototipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

F.1. Prototipo2 a 11 junio de 2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . 118


F.2. Proyecto abierto en IDEA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
F.3. Roadmap a 29 de diciembre del 2006 . . . . . . . . . . . . . . . . . . . . . . . 140
F.4. Componentes del prototipo 12/2006 . . . . . . . . . . . . . . . . . . . . . . . 147
F.5. Esquema VoIP 12/2006 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Índice de cuadros

3.1. Elementos de caso de uso crear mayorista . . . . . . . . . . . . . . . . . . . . 34


3.2. Escenario de caso de uso de creación de mayorista . . . . . . . . . . . . . . . 34
3.3. Elementos de caso de uso crear pedido . . . . . . . . . . . . . . . . . . . . . . 34
3.4. Escenario de caso de uso de creación de pedido . . . . . . . . . . . . . . . . . 35
3.5. Tabla direcciones_postales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6. Tabla tipo_direcciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.7. Tabla direcciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.8. Tabla num_contacto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.9. Tabla app_user . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.10. Tabla role . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.11. Tabla role . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.12. Tabla facturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.13. Tabla clientes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.14. Tabla proveedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.15. Tabla pedidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.16. Tabla areas_de_negocio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.18. Tabla productos_desc_data . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.19. Tabla coste_productos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

XXI
XXII ÍNDICE DE CUADROS
Capítulo 1

Introducción

Este proyecto fin de carrera es un estudio sobre la arquitectura de la telefonía IP y su integra-


ción con servicios de telecomunicaciones. Estas aplicaciones con funcionalidad telefónica son
un mercado en fuerte crecimiento (pp 15) y estarán cada vez más presentes en nuestras vidas a
medida que se popularice el uso de dispositivos portátiles capaces de navegar por internet.
El trabajo que se ha querido desarrollar en este proyecto trata sobre la integración de la tecno-
logía de voz sobre IP en aplicaciones web convencionales. Primero se expondrán los cambios
que presenta la telefonía IP respecto la telefonía tradicional y después presentaré un estudio
de las diversas maneras de construir una arquitectura para dar este tipo de servicios. Esta ar-
quitectura será capaz de establecer comunicaciones vocales o de datos independientemente del
método de acceso del usuario.
El planteamiento original del proyecto (pp 59) incluía la programación de un prototipo de
aplicación. La idea original era desarrollar un pequeño software de gestión con integración
telefónica. En el trabajo aquí expuesto se ha optado por simplificar y separar los dos compo-
nentes. Por un lado se ha desarrollado un prototipo de aplicación de gestión, ilustrando cómo
se construiría una pequeña aplicación de gestión para una pyme. Este primer prototipo ilustra
la arquitectura moderna de una aplicación web. El segundo prototipo muestra algunas de las
posibilidades de la integración de la telefonía en las aplicaciones convencionales.

1
2 CAPÍTULO 1. INTRODUCCIÓN

1.1. Motivación y justificación del proyecto


Las redes de comunicaciones tradicionales basadas en la conmutación de circuitos están
extinguiéndose. En el futuro las operadoras contarán con redes de conmutación de paquetes
enteramente IP. Este proyecto fin de carrera es un estudio sobre cómo será la arquitectura futura
de la telefonía IP y las nuevas funcionalidades que se hace posible al aproximar la telefonía al
mundo de internet. Conforme las operadoras telefónicas actualicen sus redes y equipamientos
asistiremos la fusión entre internet y las redes de circuitos tradicionales.
En el futuro, todas las aplicaciones dispondrán de la opción de realizar llamadas IP. Skype,
Free World Dialup, Google Talk, MSN Messenger y Yahoo! Messenger son algunos de los más
populares clientes VoIP que están rápidamente acercando la voz sobre IP al público general. La
evolución lógica de estas aplicaciones es una ola de nuevos servicios telefónicos que cualquiera
puede empezar a programar en su ordenador como si fuera una aplicación web.
Estamos a las puertas de una nueva revolución en internet, que acercará la red a nuestras
vidas y aumentara su funcionalidad. Si la web2.0 significó el despertar de las comunidades, la
integración de la telefonía con internet servirá para abrir nuevos mercados y para unir más a las
personas.

1.2. Objetivos
A continuación se listan los hitos que se deseaban conseguir en este trabajo.

Profundizar en el lenguaje de programación Java y dos de sus marcos de desarrollo más


populares: Spring (pp 74) y Struts2 (pp 74). Estudiar la arquitectura moderna de una
aplicación web y conceptos como la persistencia de objetos en las bases de datos.

Demostrar que las tecnologías de comunicación cada día convergen más hacia la red
Internet.

Profundizar en el conocimiento teórico de la telefonía IP. Estudio de las ventajas y des-


ventajas, la calidad de servicio, el direccionamiento y la señalización.

Estudiar las posibilidades de la plataforma telefónica de código abierto Asterisk.

Realizar un estudio de las diferentes alternativas a nivel técnico para construir una aplica-
ción con múltiples interfaces de usuario. En nuestro caso, una aplicación con una interfaz
web y otra interfaz telefónica voz sobre IP.

Enumerar funcionalidades que se podrán añadir a las aplicaciones convencionales gracias


a la integración con la telefonía IP y internet.

1.3. ¿Cómo está estructurado este documento?


A continuación se enumeran los capítulos que conforman este documento con un breve re-
sumen de su contenido.

1. (pp 1) Introducción: Es el capítulo en el que nos encontramos, en el que se explica en


qué consiste el proyecto, los objetivos marcados y la estructura del documento.
1.3. ¿CÓMO ESTÁ ESTRUCTURADO ESTE DOCUMENTO? 3

2. (pp 5) Integración de aplicaciones en redes telefónicas IP: Estudio de la telefonía IP,


los protocolos y el funcionamiento. Estudio de IMS, y de los organismos de estandariza-
ción de las telecomunicaciones. Estudio del mercado y de las diferentes arquitecturas a
alto nivel para la integración de la telefonía IP con el software convencional.

3. (pp 25) Construcción del prototipo de aplicación ERP: En este capítulo se explica
la arquitectura de una aplicación web moderna y se comentan las funcionalidades que
incorpora la aplicación desarrollada, la metodología y los problemas encontrados. Este
prototipo fue realizado usando el lenguaje Java (pp 69), con el marco de trabajo Spring
(pp 74), con Hibernate (pp 75) para la persistencia de objetos sobre una base de datos
PostgreSQL (pp 70).

4. (pp 51) Construcción del prototipo de aplicación VoIP: En este capítulo se explica el
prototipo de aplicación web java con soporte telefónico. El prototipo esta desarrollado
en Java usando como marco de trabajo Struts2 (pp 74) atacando a una plataforma te-
lefónica Asterisk (pp 66). También se explicarán sus funcionalidades, el click2call (pp
53) y la posibilidad de efectuar llamadas vocales o de mandar sms a los usuarios usando
indistintamente tanto la vía telefónica como la interfaz web.

5. (pp 55) Conclusiones: En este capítulo se hace un compendio de todo el trabajo realizado
y se comentan los problemas encontrados y las soluciones y compromisos que se han
tenido que asumir para llevar a buen puerto el proyecto.

6. Anexos: Documentos complementarios

(pp 59) Anteproyecto: Anteproyecto presentado en Julio 2006

(pp 65) Herramientas utilizadas para el desarrollo del proyecto: Descripción


del software usado para realizar el proyecto, desde la programación del prototipo
hasta la documentación.

(pp 83) Instalación de Anthill: Pasos seguidos para la instalación del servidor de
builds

(pp 89) Listado del código fuente

(pp 105) Licencias


4 CAPÍTULO 1. INTRODUCCIÓN

Figura 1.1: Estructura de documento


Capítulo 2

Integración de aplicaciones en redes


telefónicas IP

La telefonía IP1 , también llamada telefonía por internet es un servicio que permite realizar
comunicaciones de voz sobre redes basadas en el protocolo Internet. La principal diferencia
con la telefonía tradicional, que funciona mediante conmutación de circuitos es que la telefonía
IP hace uso de la conmutación de paquetes, esto es, transmite conversaciones como paquetes de
datos. Se trata de transportar la voz, previamente convertida a datos, entre dos puntos distantes.
Esto hace posible utilizar las redes de datos para efectuar las llamadas telefónicas y desarrollar
una única red convergente que se encargue de cursar todo tipo de comunicación, ya sea voz,
datos, vídeo o cualquier tipo de información. Además de reemplazar la funcionalidad de la
telefonía tradicional a un menor coste, compite con las redes de telefonía móvil ofreciendo
nuevas posibilidades de acceso a través de WiFi y WiMax.
El salto tecnológico que supone la telefonía IP ha llegado al mismo tiempo que los cambios
legislativos europeos que han propiciado la extinción de los monopolios en el mercado de
las telecomunicaciones y la aparición de múltiples operadores y redes. La infraestructura IT
también esta sufriendo cambios. Por ejemplo, los productos de software libre compiten cada
vez con mejor solvencia contra productos propietarios. Internet se ha vuelto a convertir en un
mercado atractivo para los inversores y se crean aplicaciones centradas en los usuarios que
interactúan con otros usuarios o con aplicaciones de terceros entre si a través de servicios web.
Por último han aparecido empresas que actúan como integradores de aplicaciones que hacen
uso de la red telefónica. En conjunto todos estos cambios han modificado drásticamente el
entorno de los operadores telefónicos tradicionales.
Por todo ello los operadores se enfrentan al reto de migrar sus redes y servicios a IP. Hacerlo
les posibilitará nuevas posibilidades de beneficio, nuevos servicios, un menor tiempo desde
que los productos son desarrollados hasta que llegan al mercado y enlazar a los operadores
telefónicos con las comunidades de desarrollo IT. La tecnología para hacerlo posible se basa en
un conjunto de estándares abiertos que forman un conjunto de APIs que permitirán la creación
de los servicios de nueva generación.
En las siguientes páginas estudiaremos el funcionamiento general de la telefonía IP y las
arquitecturas que los operadores telefónicos están construyendo para posibilitar la integración
de aplicaciones en sus redes.

1
IP: Internet Protocol

5
6 CAPÍTULO 2. INTEGRACIÓN DE APLICACIONES EN REDES TELEFÓNICAS IP

2.1. Voz sobre IP


La voz sobre IP es el método para transmitir conversaciones a través de internet o de cual-
quier otra red basada en IP. Las empresas que ofrecen servicios de VoIP son proveedores y los
protocolos que usan para transmitir las señales de voz a través de las redes IP son referidos
como protocolos de voz sobre IP.
La voz IP, no es en sí mismo un servicio, sino una tecnología que permite encapsular la
voz en paquetes para poder ser transportados sobre redes de datos sin necesidad de disponer
de los circuitos conmutados convencionales PSTN2 . La telefonía IP no utiliza circuitos para la
conversación, sino que envía múltiples comunicaciones codificadas a través de un único canal
en paquetes y flujos independientes. Cuando se produce un silencio en una conversación no se
transmite ningún paquete de ese flujo pero se aprovecha para transmitir paquetes de datos de
otras conversaciones. Esto implica un uso más eficiente de la red de telecomunicaciones.

2.1.1. Ventajas de VoIP


Hay ahorro de costes debido a utilizar una sola red que puede ser mantenida centralizadamen-
te para transmitir voz y datos, especialmente cuando los usuarios tienen redes infrautilizadas
que pueden usar para transportar la voz sobre IP sin un coste adicional. Las llamadas de VoIP
a VoIP internas hacen uso de la red de comunicaciones de datos y por tanto son gratuitas, con
lo que se puede ahorrar en las llamadas entre delegaciones o a trabajadores móviles. Solamente
las conexiones entre la red telefónica tradicional y la red VoIP pueden llevar asociado un coste.

2.1.2. Desventajas de VoIP


Es complicado diseñar una red que pueda asegurar fiabilidad y calidad de servicio para la
telefonía porque el protocolo de internet no fue diseñado para comunicaciones en tiempo real
y siempre existe la posibilidad de que los paquetes se pierdan en la red y no nunca lleguen al
destino o bien que lleguen demasiado tarde. También existen problemas de seguridad, ya que
los protocolos actuales no vienen de serie con seguridad más allá de la que provee el protocolo
de Internet. En una implementación de VoIP básica no es posible determinar el tiempo que lleva
el paquete dentro de la red ni su contenido, ni asegurar su integridad y es posible interceptar,
pinchar y interferir comunicaciones. Los delincuentes también pueden suplantar la identidad
de la persona que llama para cometer fraudes.
Por otro lado la voz sobre IP es una tecnología no regulada. Aunque se está empezando a
legislar al respecto, los usuarios aún están expuestos a algunas vulnerabilidades y al riesgo de
sufrir ciertos timos especializados. Por ejemplo, a través del telemarketing se puede utilizar la
comunicación VoIP para enviar grandes cantidades de locuciones publicitarias (pp 17).

2.1.3. Funcionalidad
La voz sobre IP puede hacer posibles tareas que son complicadas de conseguir con la red
telefónica tradicional.

Posibilidad de transmitir más de una llamada telefónica a través de una sola conexión a
internet de alta capacidad. Esto se puede usar como una manera sencilla de añadir una o
múltiples lineas telefónicas adicionales a una casa o oficina.
2
PSTN: Public switched telephone network es la red telefónica tradicional de conmutación de circuitos
2.1. VOZ SOBRE IP 7

Las llamadas entrantes pueden ser automáticamente redirigidas a un teléfono VoIP, inde-
pendientemente de dónde esté el teléfono. Por ejemplo puedes estar de viaje y allí donde
conectes a Internet puedes recibir llamadas entrantes.

Los centros de llamadas (call centers, soporte técnico) pueden establecerse en cualquier
sitio que disponga de una conexión a internet suficientemente rápida y estable.

Muchos servicios de voz sobre IP incluyen prestaciones de serie que normalmente los
operadores tradicionales sobre la red telefónica tradicional o no puede ofrecerlos o cobran
por ellos. Estos son servicios como la llamada a tres, el desvío de llamadas, la rellamada
automática y la identificación del número entrante.

Los teléfonos VoIP pueden integrarse con otros servicios disponibles en Internet, inclu-
yendo la videoconferencia, el envío de mensajes y de ficheros de forma paralela a la
conversación vocal.

2.1.4. Arquitectura de la voz sobre IP


Hay que distinguir entre los protocolos de señalizacion, los protocolos de transporte y los
datos transmitidos, que estarán codificados con un codec de audio/video estandarizado por los
organismos de estandarización (Por ejemplo G711, G729, GSM) o propietario (Por ejemplo
Skype).

Protocolos de señalización
Los sistemas VoIP actuales o bien hacen uso de un protocolo de señalización propietario
como Skype (pp 14) o bien utilizan alguno de los tres estándares VoIP. Entre ellos esta H.323,
el protocolo SIP y Jingle. H.323 fue el primer estándar, SIP es el más popular y Jingle es el más
moderno. Ninguno de los protocolos se ha convertido aún en «estándar de facto»y todos ellos
son usados en las herramientas que proporcionan a los proveedores la capacidad de construir
servicios multimedia y servicios de voz integrados con sus aplicaciones.

1. Protocolo H.323: H.323 forma parte de la familia H.32x. Esta familia es una recomen-
dación de la ITU-T3 y define los protocolos de comunicación audio/video dentro de una
red de paquetes. En la actualidad es usado por algunas aplicaciones de tiempo real usan-
do implementaciones H.323 propietarias o libres4 . H.323 fue diseñado ambiciosamente
para transportar comunicaciones multimedia sobre redes de área local pero hoy en día
se usa satisfaciendo las necesidades de las aplicaciones VoIP y su propósito es similar al
protocolo SIP.
La fuerza de H.323 esta en lo rápido que se prepararon los estándares, no solamente
definiendo el modelo de llamada básica sino definiendo un conjunto de servicios suple-
mentarios. H.323 fue el primer estándar de VoIP en adoptar el estándar RTP5 de la IETF6
para transportar audio y vídeo sobre redes IP.
3
ITU-T: ITU Telecommunication Standardization Sector
4
Por ejemplo, Ekiga hace uso de la implementación libre OpenH323
5
RTP: Real-time Transport Protocol RFC 3550
6
IETF: Internet Engineering Task Force. El organismo responsable de administrar y desarrollar los mecanismos
de comunicación en internet
8 CAPÍTULO 2. INTEGRACIÓN DE APLICACIONES EN REDES TELEFÓNICAS IP

Por ser el primero, H.323 ha posibilitado la aparición de casi todas las implementaciones
telefónicas VoIP. Por otro lado, H.323 ha sido la principal barrera para desplegar una
verdadera telefonía multioperador.
El problema de H.323 es precisamente uno de sus ventajas: su flexibilidad. Los fabri-
cantes podían manipular la especificación H.323 y desarrollar equipamiento compatible
H.323 que no puede comunicarse con un equipamiento compatible H.323 de otro fabri-
cante. En general H.323 tenia problemas de rendimiento y los fabricantes desarrollaron
sus propios algoritmos propietarios que mejoraban la calidad de voz y reducían la latencia
a costa de incompatibilizar sus productos con los de otros fabricantes.

2. Protocolo SIP: SIP7 es descrito como un reemplazo para el sistema de señalización de


H.323. Como se ha descrito en el apartado anterior, H.323 está definido por la ITU-T pero
SIP es de la IETF8 . H.323 fue diseñado para satisfacer las necesidades de las aplicaciones
multimedia, es complejo y requiere de múltiples mensajes para establecer una sesión de
comunicación. SIP fue desarrollado con objetivos menos ambiciosos y para establecer
una llamada sólo necesita tres mensajes.
SIP se puede usar para iniciar una sesión de voz o una sesión de videoconferencia o
vídeo en streaming. En un caso básico de sesión de voz con señalización SIP y paquetes
multimedia RTP, un terminal necesita al menos dos puertos (UDP o TCP). Uno para el
intercambio de mensajes de señalización y otro para el flujo RTP que contiene la voz.
Al contrario que H.323 es posible usar SIP atravesando redes NAT y cortafuegos me-
diante el uso de un servidor proxy, pero protocolos más modernos como IAX o Skype ni
siquiera requieren un servidor proxy. El éxito de SIP radica en su filosofía de simplicidad.
SIP especifica lo imprescindible para establecer sesiones y no se preocupa de los detalles.
Solamente inicia, termina y modifica las sesiones. Esta simplicidad hace que SIP escale
muy bien, que sea extensible y que se acomode fácilmente a diferentes arquitecturas e
implementaciones reales.
El presente de SIP: PoSIP
El protocolo SIP tradicional, también llamado PoSIP9 es un protocolo de tipo petición-
respuesta que se parece a otros protocolos de internet como HTTP y SMTP y se puede
integrar fácilmente con ellos.
PoSIP es un estándar abierto, en principio puede funcionar de extremo a extremo como
Skype pero su uso cada vez se centraliza más mediante SBC10 e IMS.
El futuro de SIP: P2P SIP
SIP ha ido creciendo y mejorándose poco a poco. En los últimos años la competencia
feroz de los protocolos propietarios como Skype ha dado pie a un nuevo tipo de pro-
tocolo SIP basado en tecnología P2P. P2P SIP es (será, ya que aún no hay un estándar
definido) otro estándar abierto, diseñado para ser usado de usuario a usuario y sin nin-
gún tipo de inteligencia centralizada (O muy rudimentaria). Un objetivo de diseño es la
autoconfiguración.

3. Jingle: Jingle es una extensión del protocolo Jabber/XMPP para permitir señalización
P2P en los flujos de datos multimedia. Ha sido diseñado por Google y la fundación XMPP
7
SIP: Session Initiation Protocol (RFC3261, rfc2543SIP)
8
IETF: Internet Engineering Task Force
9
Plain Old client-server SIP
10
SBC: Session border controller
2.1. VOZ SOBRE IP 9

y liberado (bajo licencia similar a la de BSD) tras la salida de Google Talk (pp 14) en
2006.
El propósito de Jingle es permitir comunicaciones de voz uno a uno entre entidades
XMPP, con la negociación sobre XMPP y el flujo de datos intercambiado mediante RTP
(pp 10), UDP11 y ICE12 que es lo que permite atravesar las conexiones NAT.
El propósito de Jingle no es sustituir a la tecnología SIP. Como es complicado construir
clientes con una pila de protocolos dual XMPP/SIP, Jingle ha sido diseñado puramente
como protocolo de señalización. Sin embargo Jingle esta diseñado para intercomunicarse
con SIP de forma que los clientes XMPP puedan añadirse sobre redes ya existentes VoIP
en vez de limitar a los usuarios XMPP a una red distinta.
Jingle esta diseñado de una manera modular de forma que los desarrolladores pueden aña-
dir fácilmente soporte para otros tipos de sesiones multimedia como videoconferencia,
compartición de aplicaciones, compartir ficheros y edición colaborativa. Los métodos de
transporte son también modulares, de forma que las implementaciones de Jingle pueden
usar cualquier protocolo de transporte multimedia, incluyendo métodos propietarios no
estandarizados por la fundación de estándares XMPP.
Jabber contra SIP

La autenticación es opcional en SIP


Jabber no tiene virus ni spammers
Los paquetes de Jabber son más pequeños que los SIP

Jingle se puede convertir en una pieza clave en el futuro de la VoIP. Es un estándar ya


aceptado, con la fuerza de impulso de Google, con todas las ventajas técnicas de los
protocolos propietarios y la sencillez y compatibilidad de SIP.
Respecto a su implantación, clientes de mensajería instantánea como Google Talk y Coc-
cinella ya implementan este protocolo mientras que otros clientes Jabber como Jabbin,
Pidgin o Psi están aún en proceso de implementación. No existen aún teléfonos físicos
que hagan uso de Jingle.

4. IAX2:13
El protocolo IAX2 puede atravesar fácilmente cortafuegos y conexiones NAT. Además
es más eficiente que SIP por dos razones. Por un lado, los mensajes son binarios mientras
que en SIP son texto plano y por otro lado, los paquetes de señalización IAX pueden
llevar una carga de datos RTP.
Respecto a su uso, IAX esta ganando popularidad al mismo tiempo que la plataforma
telefónica Asterisk (pp 66) ya que es el protocolo de facto para intercomunicar entre sí
estas plataformas.
11
User Datagram Protocol RFC 768
12
ICE: Interactive Connectivity Establishment. ICE provee un mecanismo para atravesar conexiones NAT usan-
do diversas técnicas. Se usa en la nueva especificación de SIP (P2P SIP) y en Jingle para atravesar los cortafuegos
que pueden existir entre dos usuarios remotos.
13
Normalmente llamado IAX, inter-Asterisk eXchange version 2
10 CAPÍTULO 2. INTEGRACIÓN DE APLICACIONES EN REDES TELEFÓNICAS IP

Protocolo de transporte multimedia RTP


RTP son las siglas de Real-time Transport Protocol (Protocolo de Transporte de Tiempo
real). Es un protocolo utilizado para la transmisión de información en tiempo real, como por
ejemplo audio y vídeo en una videoconferencia. Está desarrollado por el grupo de trabajo de
transporte de Audio y Video del IETF, publicado por primera vez como estándar en 1996 como
la RFC 1889, y actualizado posteriormente en 2003 en la RFC 3550.

Otros protocolos: Skype


Skype es el servicio VoIP con mayor número de usuarios que existe. Si diéramos importancia
a los protocolos por el número de despliegues reales, es decir, el número de gente que lo usa
diariamente, Skype estaría en el primer lugar de la lista.
Los componentes de Skype son propietarios. Técnicamente son muy buenos porque atravie-
san cortafuegos y NAT con facilidad, permitiendo a los usuarios usar el servicio en situaciones
donde una implementación tradicional de SIP (PoSIP) fallaría. Además la latencia y la calidad
de audio es muy buena en relación al ancho de banda que usa.
El protocolo de Skype hace uso de los ordenadores de los usuarios y los convierte en nodos
o supernodos de su red. Esto no ha detenido su popularidad. Además soporta vídeo desde la
versión 2.0.
Productos propios como Skype In y Skype Out permiten a los usuarios llamar a números
de la red telefónica tradicional pero no parece que el protocolo de Skype vaya a ser adoptado
masivamente por las operadoras.

2.2. IMS
Como se ha expuesto en el apartado anterior, los operadores de telefonía y las empresas rela-
cionadas con Internet tratan de adaptar sus redes actuales para soportar las nuevas prestaciones
demandadas por los consumidores. En general los cambios se están introduciendo para permitir
tecnologías que ofrezcan movilidad, transmisión de voz con alta calidad y acceso a cualquier
tipo de información.
En este contexto se ha desarrollado un estándar llamado IMS14 , que define una arquitectura
genérica para ofrecer Voz sobre IP y servicios multimedia. Además, especifica cómo se debe
realizar la interoperabilidad entre los sistemas, así como el roaming. IMS es una evolución hacia
IP no porque las operadoras tengan intención de abrir sus redes hacia Internet, sino porque
desarrollar servicios IP es mucho menos costoso y tiene menor time-to-market que hacerlo
sobre circuitos.
Los sistemas basados en IMS soportan control, transferencia de datos y seguridad en las co-
municaciones y ofrecen a los operadores la oportunidad de expandir sus servicios ofreciendo
comunicaciones multimedia y servicios avanzados de datos. A esta integración de servicios
se la denomina convergencia y a través de ella se ofrecen gran variedad de tipos de servicios
multimedia, múltiples puntos de acceso y múltiples estrategias para conseguir aunar las co-
municaciones entre varias máquinas de distintas redes o, incluso, modelar las comunicaciones
internas de una sola máquina.
Una arquitectura IMS esta diseñada para ser una red IP segura y fiable, multi-servicio, y
multi-acceso.
14
IMS: Internet multimedia subsistem, también denominado Multimedia Telephony
2.2. IMS 11

Multi-servicio: Se proporciona todo tipo de servicios a través del núcleo de la red sopor-
tando diferentes niveles de calidad de servicio.

Multi-acceso: toda red de acceso de banda ancha, fija y móvil, podrá conectarse a IMS.
IMS no es una única red sino diferentes redes que interaccionan gracias a distintos acuer-
dos de roaming IMS fijo-fijo, fijo-móvil, móvil-móvil.

"IMS is a technology that will merge Internet with cellular world."


M IGUEL A NGEL C AMARILLO , A DV. S IGNALLING R ESEARCH , E RICSSON

IMS es en teoría independiente de la red de acceso. IMS lo ha definido 3GPP15 y actual-


mente se ha especificado el acceso desde redes móviles (GPRS, UMTS, EDGE). Por otro
lado, TISPAN16 lo ha trasladado a accesos xDSL.

Figura 2.1: IMS es la plataforma que permite la comunicación independientemente del tipo
de acceso e independientemente de si los usuarios son clientes de los mismos o de diferentes
operadores[1]

2.2.1. Desarrollo de IMS


IMS es un sistema que permite la convergencia entre dispositivos portátiles y la telefonía
fija. El sistema IMS fue estandarizado en la versión 7 de 3GPP. con el objetivo de sustituir
los servicios de conmutación de circuitos en la telefonía fija y móvil. IMS controla la sesión
y encamina las comunicaciones multimedia independientemente del medio de acceso y de los
operadores involucrados[1]
La telefonía multimedia es comunicación enteramente IP basada en SIP que usa IMS como
plano de control. IMS ofrece independencia del método de acceso y ofrece una sencilla integra-
ción con los terminales tradicionales mediante el uso de SIP. SIP establece, modifica y finaliza
las sesiones multimedia. El mecanismo usado para describir la sesión es SDP17 . SDP lleva la
15
3GPP: Un foro internacional responsable de la estandarización de los sistemas GSM y UMTS
16
TISPAN: Telecoms and Internet converged Services and Protocols for Advanced Networks es el cuerpo es-
tandarizador de la ETSI (European Telecommunications Standards Institute)
17
SDP: Session Description Protocol. Es un formato para describir los parámetros de los flujos de datos multi-
media
12 CAPÍTULO 2. INTEGRACIÓN DE APLICACIONES EN REDES TELEFÓNICAS IP

descripción de la sesión, que se distribuye entre los potenciales participantes de una sesión IMS
mediante SIP.
IMS aunque vaya sobre IP, no es una arquitectura abierta, sino que es una arquitectura de
operador, donde el operador controla desde el acceso hasta los servicios. Solamente se conciben
dos excepciones:

Roaming: el usuario accede desde un core IMS visitado a su core IMS home.

Llamadas interoperador.

Este comportamiento de IMS recuerda mucho a los negocios GSM18 .

2.2.2. IMS contra la telefonía actual


La diferencia más clara entre la telefonía IMS y la basada en conmutación de circuitos desde
el punto de vista del usuario final es el aumento de la flexibilidad. Los usuarios de la telefonía
IMS pueden añadir y quitar componentes en cualquier momento de la sesión. Una persona
puede establecer una comunicación de voz con otra y cuando ya llevan un rato charlando, uno
de ellos puede mostrar al otro el entorno que le rodea mediante la cámara de su terminal móvil.
Luego ambos se pueden poner de acuerdo y establecer una videoconferencia y en un momento
dado enviarse archivos de audio al mismo tiempo que mantienen la conversación. IMS no esta
limitado a estos tipos de servicios, servicios adicionales podrían ser compartir aplicaciones o
diversos tipos de juegos pero IMS es el sustituto natural de la telefonía tradicional basada en
conmutación de circuitos y por eso los primeros servicios claramente definidos han sido todos
aquellos los que son posibles con las redes tradicionales.
Algunas de las posibles aplicaciones de IMS son:

Servicios presenciales

Telefonía y videoconferencia full duplex

Mensajería instantánea

Mensajería unificada

Publicidad multimedia

Juegos multijugador

Streaming de video

Servicios Push-to, como push-to-talk, push-to-view, push-to-video

2.2.3. Implantación de IMS


IMS es un sustituto directo de las redes basadas en conmutación de circuitos incluyendo las
funciones de las redes inteligentes que ya funcionan con IP. Un sistema IMS es complicado. Es-
ta basado en estándares abiertos y tiene el problema de que los operadores pueden implementar
funciones adicionales que no están contempladas en el estándar original.
18
GSM: Global System for Mobile communications es un estándar mundial para teléfonos móviles digitales.
2.3. EJEMPLOS DE APLICACIONES INTEGRADAS EN SISTEMAS TELEFÓNICOS IP13

Todos los operadores europeos están en proceso de migrar sus redes hacia IMS de forma
trasparente para el usuario. La excepción es British Telecom que impulsa esta migración de
forma comercial, haciendo público su esfuerzo por integrar IMS en su red de nueva generación
21CN «The 21st Century Network», en la que tienen intención de reemplazar todos sus sistemas
con un núcleo IMS. Según sus publicaciones comerciales, para el año 2010 la red de BT será
100 % SIP, y únicamente habrá VoIP viajando por el núcleo de la red. Obviamente, tendrán que
existir algunos dispositivos compatibles con sistemas anteriores para poder dar soporte a los
clientes que no hayan actualizado sus terminales a IP. BT planea crear «Metro Nodes», donde
terminan las tecnologías no compatibles para convertirlas a IP. Por tanto, tecnologías desde una
línea de teléfono analógico hasta una linea E119 pasando por SS720 convivirán en los «Metro
Node», permitiendo al núcleo dedicarse a ser puro IP.
En implantaciones reales en producción IMS aún no existe. Están las ideas, las especifica-
ciones más antiguas son de 2005, los fabricantes de equipos de red trabajan sobre implemen-
taciones parciales, los terminales IMS son raros, y los servicios que se están ofreciendo son
casi todos de pre-producción. Lo que esta funcionando ahora son servicios IP que se ya se
habían desplegado hace tiempo y que están evolucionando hacia IMS, de cara a ser en un fu-
turo interconectables con otros operadores IMS. IMS está en pañales pero es el futuro de la
telefonía.

2.3. Ejemplos de aplicaciones integradas en sistemas telefó-


nicos IP
2.3.1. Aplicaciones VoIP orientados a la web
Jajah

Figura 2.2: Logotipo de Jajah

Jajah21 es un ejemplo de integración entre la web y la telefonía. Jajah permite que dos
personas establezcan una conversación de voz sin necesidad de instalar ninguna aplica-
ción en sus ordenadores ni realizar extrañas configuraciones. Simplemente deben poner
su número de teléfono y el número de teléfono de la persona a la que quieran llamar
en un formulario en una página web y Jajah se encarga de llamar a ambos a través de
la red telefónica tradicional y ponerles en contacto. Lo único que necesitan los usuarios
son los propios terminales. El uso de JaJah elimina la necesidad de teléfonos IP, software
instalado en el ordenador o una conexión de banda ancha pero es necesario tener acceso
a internet para rellenar los formularios e iniciar la llamada. El sistema funciona de la
siguiente manera:
1. Introduces tu número y el de la persona a la que quieres llamar en una web a través
del navegador de tu ordenador o de tu móvil.
19
E1 es un formato de transmisión digital
20
Sistema de señalización por canal común no 7 habitualmente usado en las redes telefónicas por conmutación
de circuitos
21
http://www.jajah.com/
14 CAPÍTULO 2. INTEGRACIÓN DE APLICACIONES EN REDES TELEFÓNICAS IP

2. El teléfono de tu amigo suena.


3. Si la persona coge la llamada, escucha un mensaje «Estas siendo conectado».
4. Tu teléfono suena. Coges la llamada y ya puedes empezar la conversación.
5. Entre teléfonos fijos en un conjunto de países es gratuito.

El modelo de negocio de JaJah es innovador y recientemente Sequoia Capital y Deutsche


Telekom han invertido gran cantidad de dinero en él. Es la primera vez que una gran
operadora invierte en una empresa de VoIP. Jajah aún tiene defectos como permitir la
posibilidad de introducir números de personas que no conoces o que sabes que no se
llevan bien o no se hablan.

Twitter: Twitter es otro ejemplo de integración de la web con la telefonía. Twitter es


un servicio de presencia en el cual los usuarios escriben breves reseñas de lo que están
haciendo en cada momento. Lo pueden hacer mediante el uso de la web, mediante una
API o mediante telefonía enviando mensajes de texto o correos electrónicos a twitter.
Posteriormente twitter envía las actualizaciones de los estados a todos los usuarios que
estén siguiendo a esa persona, y si los usuarios lo tienen activado, pueden recibir las
notificaciones mediante SMS.

2.3.2. Sistemas de mensajería integrada con soporte de VoIP


Son aplicaciones que permiten unificar diversas maneras de comunicarse. Proveen de infor-
mación y entretenimiento a sus usuarios. Normalmente unifican los siguientes servicios: VoIP
en lineas múltiples y conferencias web, conferencias a números de la red telefónica tradicional,
soporte de uno o varios protocolos de mensajería instantánea, envió de SMS, de archivos y de
correo electrónico.
Skype:22 Skype es un software propietario que hace uso de un protocolo no estándar
con una API abierta (Ver página 10). Técnicamente tiene mucha calidad, es P2P y se
transmite de usuario a usuario. Es muy sencillo de usar y su plataforma aglutina el mayor
número de usuarios VoIP del mundo. Hace uso de los recursos de los ordenadores de los
usuarios para construir su red.

OpenWengo:23 Clon de Skype pero usando estándar P2P SIP (pp 8) y con un cliente
abierto y software libre.

Gizmo:24 Clon de Skype pero usando los estándares abiertos P2P SIP (pp 8) y Jingle
(pp 8) para la señalización y gestión de llamadas. No obstante utiliza codecs de audio
propietários y como Skype el cliente Gizmo es propietario.

Raketu:25 Clon de Skype, cerrado y de protocolo propietario P2P pero que no hace uso
de los recursos de los ordenadores de los usuarios para construir su red

Google Talk:26 Clon de Skype menos ambicioso en funcionalidades. Hace uso de la red
Jabber y para VoIP utiliza el protocolo Jingle (pp 8).
22
http://www.openwengo.com/
23
http://www.openwengo.com/
24
http://www.gizmoproject.com/
25
http://www.raketu.com
26
http://www.google.es/talk
2.4. MERCADO DE LAS APLICACIONES WEB VOIP 15

Otros sistemas: MSN, AOL, ICQ

Figura 2.3: Clientes de mensajería con soporte de voz IP

2.3.3. Aplicaciones VoIP para dispositivos portátiles


Fring

Figura 2.4: Logotipo de Fring

Fring es una aplicación para móviles basados en el sistema operativo Simbian y PocketPC
que ofrece una integración total de los diversos sistemas de mensajería instantánea. Fring
permite efectuar llamadas VoIP SIP y Google Talk usando conexiones de datos indepen-
dientemente del método de transporte usado finalmente por el móvil. Si el móvil tiene
una red WiFi transmitirá los paquetes por ella saltándose totalmente al operador móvil
tradicional. En caso de que no haya una red WiFi disponible el móvil enviará los paquetes
de datos IP a través de la red UMTS (3G) o HSPA (3.5G) disponible por el operador.

2.4. Mercado de las aplicaciones web VoIP


El mercado de la VoIP es distinto en las diferentes partes del mundo. La principal diferencia
es que en Europa las operadoras tradicionales están jugando un papel importante en el desarro-
llo de la VoIP mientras que en América las operadoras están tratando de pararlo.
En 2006 las operadoras europeas perdieron 10 millones de lineas fijas. Se crearon 14 millo-
nes de lineas VoIP de las cuales 3 millones fueron de las operadoras. En Estados Unidos se
perdieron 4.5 millones de lineas fijas y se crearon 4.4 millones de lineas VoIP de las cuales
solamente 300000 pertenecen a las operadoras tradicionales.
Además en Estados Unidos la VoIP tiene la misma apariencia de cara al usuaruio que el
teléfono fijo. Los mayores proveedores son los operadores de cable y no tienen incentivos
para competir con las empresas de telecomunicaciones. Solamente tienen que hacer de la VoIP
un servicio igual de fiable y ligeramente más barato. En Europa la VoIP exprime todas sus
16 CAPÍTULO 2. INTEGRACIÓN DE APLICACIONES EN REDES TELEFÓNICAS IP

posibilidades. Se ofrecen paquetes de llamadas gratuitas a paquetes de países o se ofrecen


servicios de libretas de direcciones online.
Todas estas diferencias vienen por existir mayor competencia en Europa. La legislación per-
mite a los proveedores de internet de banda ancha pagar precios competitivos para usar las
lineas de las operadoras dominantes para ofrecer sus propios servicios. En Estados Unidos no
existe esta legislación porque el gobierno lo ve como un obstáculo para que las operadoras
inviertan en sus despliegues de fibra hasta los hogares.
Lo que si es común en todo el mundo es que cada vez hay más interés en la convergencia de
las aplicaciones VoIP. La opinión general es que la VoIP en las empresas aumenta la producti-
vidad y hace que sean más competitivas en un mercado habitualmente saturado. En un estudio
recientemente publicado por IDC27 se describe que el mercado de la voz sobre IP, valorado en
195 millones de dólares en 2006, se espera que crezca hasta los 2250 millones en 2011, con un
índice de crecimiento anual28 del 63.1 %. En ese estudio también comentan:

"Despite the evangelization that has been done and is still going on with regards to
VoIP applications in Western Europe by network equipment vendors the market for
this technology is still fragmented and in its early stages, nevertheless the growth
potential of this market for the coming years is huge,"
ROGIER M OL , SENIOR ANALYST, E UROPEAN VO IP I NFRASTRUCTURE .

Los expertos prevén que el crecimiento del mercado de VoIP vendrá impulsado por las si-
guientes áreas:

Aplicaciones de comunicación unificadas

Aplicaciones móviles unidas a centralitas IP

Aplicaciones de orientación vertical y otras aplicacoines funcionando sobre centralitas y


teléfonos IP.

Aplicaciones empresariales unidas a centralitas IP.

VoIP es un gran negocio para las empresas pero dónde existe un mayor crecimiento es en
los hogares. Hay que recordar que SIP no es el protocolo VoIP dominante. Es Skype, que
cuenta con cerca del 45 % del tráfico VoIP en estados unidos. Skype tiene 18 millones de
suscriptores y los usuarios de Skype hicieron 5000 millones de minutos de llamadas sólamente
durante el último cuatrimestre del año 2005. Por eso no son las operadoras tradicionales las
más importantes en el sector VoIP sino que el crecimiento real de la VoIP viene de la mano de
comunidades online como Skype y Google talk.
Un factor importante es que son servicios sencillos de instalar y baratos, pero además las
comunidades online son virales. Esto quiere decir que cuando un usuario contrata una linea
SIP, es un proceso trasparente y el único efecto visible es que ese usuario reduce su factura
telefónica. Sin embargo cuando un usuario se inscribe en servicios como Skype o Google Talk
tiende a enviar mensajes para que sus amigos también se suscriban para ahorrar dinero.
27
Western European VoIP Applications Forecast and Analysis 2007-2011
28
CAGR
2.4. MERCADO DE LAS APLICACIONES WEB VOIP 17

Retos actuales de la voz sobre IP


Spam en VoIP: también denominado SPIT29 . SPIT pronto significará el 40-70 % de las
llamadas, saturando los buzones de voz y los teléfonos de la misma manera que el SPAM
satura las cuentas de correo. Sin embargo hay empresas que están desarrollando siste-
mas para detectar SPIT mirando la dirección IP de procedencia de la llamada o incluso
responder llamadas automáticamente y rechazándolas si es un mensaje pregrabado.

Fraude telefónico: El «Phishing»llega a un nuevo nivel con la VoIP y se denomina «Vis-


hing». Se trata de hacer llamadas VoIP para extraer información bancaria.

Aumento de la regulación: En Estados Unidos se está estudiando hacer obligatorio que


las redes VoIP ofrezcan los servicios de emergencia y que las operadoras VoIP ingresen
dinero en el fondo de servicio universal.

Falta de estandarización: El sistema que promete estandarizar todas las comunicaciones


SIP a través de IP esta aún a 5 o 7 años de su implantación real30 , y eso sólo tras una
fuerte inversión en consultoría entre los desarrolladores de equipos, los fabricantes y las
operadoras. Además existen iniciativas como la de Microsoft y Nortel que recientemente
firmaron un acuerdo para arreglar el problema de que el empleado medio recibe unos 50
mensajes diarios y usa hasta siete dispositivos y aplicaciones diferentes para gestionarlos.

29
SPIT: Spam over Internet Telephony
30
Es la opinión de Russell Shaw, un especialista en arquitecturas de código abierto, redes inalámbricas y crea-
ción de contenidos multimedia
18 CAPÍTULO 2. INTEGRACIÓN DE APLICACIONES EN REDES TELEFÓNICAS IP

2.5. Arquitectura de las aplicaciones


La arquitectura a alto nivel para la integración de aplicaciones Web y los servicios de teleco-
municaciones está formada por dos componentes:

1. Una aplicación o servicio: La aplicación puede estar desarrollada en cualquier lenguaje


de programación. Nuestra aplicación podría ser cualquiera de las aplicaciones que antes
se han descrito en la sección 2.3.1. En este PFC se ha programado con el lenguaje java
un prototipo de servicio telefónico VoIP web (pp 51).

2. Una plataforma que gestiona las comunicaciones: En el futuro la plataforma formará


parte de un sistema completo IMS y la proveerá un operador telefónico. La alternativa
usada en este PFC es construir una plataforma telefónica mediante Asterisk31 .

Figura 2.5: Arquitectura de un sistema IMS

La comunicación entre ambos componentes puede usar tres tipos diferentes de tecnologías
dependiendo del grado de integración con la telefonía que deseamos implementar en nuestra
aplicación.

1. (pp 21) HTTP: Es el caso más limpio y sencillo para que las empresas de la industria del
software introduzcan funcionalidad telefónica a sus aplicaciones. El operador nos provee
totalmente la plataforma y nos ofrece una API a través de protocolos de la familia de
HTTP. En el futuro todos los operadores nos ofrecerán una interfaz HTTP para interactuar
con sus plataformas IMS. Un ejemplo de comunicación HTTP es el estándar Parlay-X
(pp 20).
31
Una descripción detallada de Asterisk se encuentra en la sección B.2 página 66
2.5. ARQUITECTURA DE LAS APLICACIONES 19

2. (pp 22) SIP: Es el protocolo de comunicación estándar dentro de los sistemas IMS. Usan-
do SIP nuestra aplicación habla directamente con los sistemas IMS de la operadora. Para
la gestión de SIP dentro de las aplicaciones podemos usar diversos marcos de trabajo
que tienen la forma de middleware32 entre nuestra aplicación y la operadora. Entre ellos
podemos destacar el estándar JAIN SLEE.

3. (pp 24) Propietario: Nuestra aplicación puede usar su propia plataforma telefónica y
usar un mecanismo de control específico. Es el caso que usaremos en este PFC para
construir un prototipo independizado de la operadora telefónica (pp 51). Usaremos Aste-
risk como plataforma de comunicaciones y la comunicación entre nuestra aplicación y la
plataforma la efectuaremos mediante el gestor de Asterisk y su API AGI propietaria (pp
66).

2.5.1. Organismos de estandarización


Liberty
Liberty Alliance fue formada en diciembre del año 2001 para convertirse en el más importan-
te consorcio industrial de empresas de gestión de identidad de redes y servicios. Trabaja para
definir estándares en el espacio de la gestión de la identidad personal. Sus objetivos son asegu-
rar la compatibilidad, la privacidad y promover la adopción de sus especificaciones. La alianza
ha crecido desde sus 20 empresas originales a más de 160 con presencia en todo el mundo y
en mercados tan dispares como instituciones educativas y financieras, empresas tecnológicas y
proveedores wireless.
Su trabajo se ha publicado en diferentes fases para permitir que se fueran desarrollando
productos que implementaran los estándares. La alianza sacó su primer conjunto de especifica-
ciones para la gestión de identidad en el año 2002.
El producto más famoso dentro de los productos de las empresas que apoyan su conjunto
de especificaciones es OpenID. OpenID es un sistema de autenticación digital descentralizado,
con el que un usuario puede identificarse en una página web a través de una URL (o un XRI en
la versión actual) y puede ser verificado por cualquier servidor que soporte el protocolo.

Figura 2.6: Logotipo de OpenID

Respecto a las fases de estandarización de la Liberty Alliance:

La fase 1 permite una gestión de la identidad de forma federada. Proporciona estándares


para el login centralizado33 y la fusión de cuentas dispersas. En esta fase, un negocio
puede permitir a sus usuarios hacer login y navegar por varios sitios dentro del grupo sin
necesidad de volver a hacer login.
32
El Middleware es un software de conectividad que ofrece un conjunto de servicios que hacen posible el fun-
cionamiento de aplicaciones distribuidas sobre plataformas heterogéneas. Funciona como una capa de abstracción
de software distribuida, que se sitúa entre la capa de aplicación y las capas inferiores
33
SSO: Single Sing-On
20 CAPÍTULO 2. INTEGRACIÓN DE APLICACIONES EN REDES TELEFÓNICAS IP

La fase 2 mejora el entorno de identidad federada y permite la interoperatividad entre


varios servicios web. A esta fase se la denomina Liberty Alliance’s Identity Web Services
Framework (ID-WSF).

La fase 3 y posteriores desarrollarán especificaciones de servicios personalizados basa-


dos en el entorno IS-WSF. Este tipo de especificaciones son llamadas Liberty Alliance’s
Service Interface Specifications (ID-SIS).

OMA: Open mobile alliance


OMA fue formada el 12 de junio del año 2002 después de varios meses de discusiones por
cerca de 200 empresas incluyendo a los grandes operadores, los fabricantes de terminales y de
productos de red, empresas de IT y proveedores de contenidos y servicios. OMA se ha diferen-
ciado del resto de organizaciones34 que promulgan estándares porque en OMA esta represen-
tada la cadena completa de valor y su enfoque se centra en la interoperatividad de servicios en
vez de en una pila de protocolos.
La idea de OMA es ofrecer la tecnología necesaria para desplegar servicios de alto ren-
dimiento relevantes. OMA es el foco del desarrollo de las especificaciones de los servicios
móviles. Sus objetivos son:

Permitir el acceso a los consumidores a servicios móviles más allá de límites geográficos,
de operadores y de los terminales.

Definir un marco de trabajo para construir, desplegar y gestionar de forma efectiva y


fiable los servicios.

Establecer un foro para la industria y convertirlo en la fuerza para crear la interoperativi-


dad a nivel de servicios.

Proveer de especificaciones abiertas de alta calidad basadas en los requerimientos del


mercado.

Asegurar la interoperatividad entre los diferentes dispositivos, proveedores de servicio,


operadores y redes.

Convertirse en el catalizador en la consolidación e implantación de los estándares desde


el punto de vista de los usuarios.

Proporcionar valor y beneficios a los miembros de la OMA.

OSA/Parlay-X Web Services


El grupo OSA/Parlay es un consorcio técnico fundado en 1998 que especifica APIs para la
red telefónica. Estas APIs permiten la creación de servicios por organizaciones dentro y fuera
del entorno de la operadora tradicional. En el futuro se espera que puedan ser servicios creados
y mantenidos por desarrolladores IT, no por ingenieros expertos en telefonía.
Las APIs de Parlay definen cómo los teléfonos realizan llamadas, cómo hacen una petición
de localización de un terminal y cómo tarifican la descarga de un tono de móvil. Otros usos
de Parlay incluyen el control de llamadas, la conferencia múltiple, la interacción del usuario
34
Tradicionalmente las especificaciones de servicios móviles las promulgaban o los fabricantes o las grandes
operadoras
2.5. ARQUITECTURA DE LAS APLICACIONES 21

mediante audio y texto y la tarificación de los servicios. Las especificaciones de Parlay/OSA


definen una API, pero no dicen cómo debe ser implementada. porque el objetivo fundamental de
la API es ser independientes de la tecnología telefónica subyacente, ya sea VoIP como CDMA
como GSM como SS735 y ser independiente de la tecnología de programación usada para crear
los servicios. El resultado de esta forma de pensar es que la API está especificada en UML36 . No
obstante hay un conjunto de realizaciones o mapeos para diversos entornos como CORBA/IDL
(El uso de CORBA permite un acceso remoto entre la pasarela Parlay y la aplicación), Java y
WSDL37 .
En mayo del año 2003 Parlay publicó un nuevo conjunto de servicios web llamados Parlay-
X version 1. Son un conjunto mucho más simple de APIs pensadas para ser usadas por una
comunidad más general y menos especializada de desarrolladores. Los servicios web Parlay
X version 1 incluyen el control de la llamada a terceros, envío y recepción de SMS, envíos y
recepción de mensajes, tarificación, control de estado del usuario y localización. Esta especifi-
cación simple de Parlay X se complementa con las complejas y poderosas APIs generales de
Parlay. Implementaciones en uso de Parlay están en uso comercial por BT, Korea Telecom y
Sprint.
Parlay X Version 2 fue publicada por el ETSI38 en marzo de 2005. Especificaciones similares
son parte de 3GPP Release 6. Las especificaciones Parlay X Version 3.0 y las de Parlay-X
Version 2.2 (mantenimiento de la rama 2.x) están actualmente (Jul/2007) en desarrollo.
Parlay-X es la forma más convencional de que terceras empresas desarrollen servicios de
telecomunicación para las operadoras. Es una interfaz basada en servicios web, y se utiliza en
los servicios de datos típicos de GPRS (En España estos servicios se ofrecen con los nombres
de eMoción, Vodafone Live! y Orange World). Como es una tecnología conocida y se ha com-
probado que funciona, en el futuro se fomentará el uso de Parlay para acceder a servicios en
IMS de forma «transparente»a las terceras empresas proveedoras de servicios. De hecho exis-
ten sistemas ya implantados de Parlay-X Web services en uso por BT y por Sprint. Los veremos
en profundidad en el siguiente apartado.

2.5.2. Comunicación HTTP


Para construir un servicio de telecomunicación o una aplicación que integre una cierta fun-
cionalidad telefónica podemos usar las APIs que las operadoras telefónicas proporcionan como
punto de entrada a su red. Estos accesos están definidos mediante alguno de los estándares de
los organismos de estandarización anteriormente citados. Por ejemplo podemos hacer uso de
las interfaces Parlay-X como integradores entre los dos mundos. A continuación vemos varios
ejemplos de estas plataformas.

SDK Web Services de BT


British Telecom tiene en producción desde el 2005 una API para permitir el acceso de apli-
caciones de terceros. El sistema de BT hace uso de Parlay-x web services en el contexto de su
red de nueva generación llamada 21st century network.
35
SS7: Sistema de señalización número 7
36
UML: Lenguaje Unificado de Modelado es el lenguaje de modelado de sistemas de software más conocido y
utilizado en la actualidad. Es un lenguaje gráfico para visualizar, especificar, construir y documentar un sistema
de software.
37
WSDL: Web Services Description Language, un formato XML que se utiliza para describir servicios Web.
38
ETSI: European Telecommunications Standards Institute o Instituto Europeo de Normas de Telecomunica-
ciones es una organización de estandarización de la industria de las telecomunicaciones
22 CAPÍTULO 2. INTEGRACIÓN DE APLICACIONES EN REDES TELEFÓNICAS IP

"(BT is going to) create—and let customers, from a single individual to giant cor-
porations, create—a menu of services and capabilities tailored to the Web 2.0 era
of mashups, remixes, and user-generated content."
O M M ALIK , B USINESS 2.0 M AGAZINE SENIOR WRITER

El sistema de BT tiene una aplicación de ejemplo en la forma del servicio servicio BT Whole-
Sale Web Call Connect que sirve para conectar dos personas. Puede ser usado para implementar
un servicio de «Haz click para llamar»(Click-to-call, pp 53) dentro de una página web o un bo-
tón «llámame»en un correo electrónico. El sistema tiene una arquitectura similar a la siguiente:

Figura 2.7: Arquitectura del sistema BT Wholesale Web Call Connect

BT ofrece públicamente un SDK de desarrollo en la dirección web http://sdk.bt.com/

Sprint Business Mobility Framework

En Estados Unidos Sprint también proporciona un conjunto de servicios web basados en


Parlay-X que permiten a las aplicaciones y a los servicios de telecomunicación acceder a los
recursos de la red telefónica.

2.5.3. Comunicación SIP


Para integrar nuestro servicio de telecomunicaciones con la red telefónica mediante SIP po-
demos hacerlo de dos maneras. Por un lado podemos integrar esta funcionalidad directamente
en nuestra aplicación programando directamente los sockets o haciendo uso de las librerías SIP
que tienen todos los lenguajes de programación.
2.5. ARQUITECTURA DE LAS APLICACIONES 23

Por otro lado podemos usar una capa de middleware entre la aplicación y la red telefónica.
Para definir las interfaces de esta capa intermedia existe el estándar JAIN SLEE. De esta ma-
nera solamente es necesario hacer que nuestra aplicación hable con el servidor de aplicaciones
JSLEE SIP.

Capa de middleware JSLEE


Un SLEE39 es un concepto bien conocido en la industria de las telecomunicaciones. Se trata
de un entorno de procesado de alta capacidad y baja latencia. JSLEE40 es el estándar java para
SLEE.
La iniciativa JAIN[4] representa a una comunidad de expertos que definen las interfaces java
necesarias como extensión del núcleo de la plataforma Java para migrar redes de comunicación
propietarias a redes basadas en estándares abiertos.
La especificación JAIN SLEE[3] supone una auténtica revolución en el desarrollo de «Ser-
vicios de Valor Añadido de nueva generación»(NGIN), ya que permite la portabilidad total y
transparente de «Servicios de Red Inteligente»entre plataformas de diferentes fabricantes, algo
impensable con las plataformas propietarias desplegadas en la actualidad.
Ventajas de hacer uso de una capa de middleware

La aplicación hablaría con el servidor JSLEE y se abstraería de la gestión de la llamada.


De esta manera el middleware JSLEE podría conectarse con una operadora, con platafor-
mas telefónicas independientes como Asterisk y con otro tipo de centralitas o gateways
como pasarelas XMPP/Google Talk y establecer llamadas mediante Jingle (pp 8)

Abstraería a la aplicación de gestionar servicios como el envío de sms porque los servi-
dores de aplicaciones JSLEE tienen adaptadores para SMPP.

Es la manera más óptima de gestionar llamadas entrantes.

JAIN SLEE puede ser la posible solución de un broker de servicios en IMS. JAIN no está
basado en SIP, es más bien un marco de desarrollo de aplicaciones y servicios al estilo de J2EE,
pero ideado para aplicaciones dirigidas por eventos, no dirigidas a transacciones como puede
ser HTTP. Una aplicación clara de JAIN sería componer servicios SIP.
El modelo de programación de JAIN SLEE es independiente de los protocolos, basado en
componentes y hace uso de las buenas maneras en el desarrollo del software como la orienta-
ción a objetos y el soporte de transacciones.
Expongo a continuación algunos de los más reconocidos servidores JSLEE

1. Rhino: Rhino es el servidor de aplicaciones de Opencloud41 para ofrecer servicios con-


vergentes. Rhino forma un paquete completo IMS y el núcleo es un contenedor de apli-
caciones en estándar JAIN SLEE que soporta, gestiona y ejecuta servicios de telecomu-
nicación para las operadoras.
Rhino fue el primer producto en acatar la norma JAIN SLEE 1.0 y en implementar todas
las prestaciones de la especificación, incluidas las opcionales.
39
SLEE: Service Logic Execution Environment
40
Java Service Logic Execution Environment (También conocido como JAIN SLEE debido a su concepción
original dentro del programa JAIN)
41
http://www.opencloud.com/
24 CAPÍTULO 2. INTEGRACIÓN DE APLICACIONES EN REDES TELEFÓNICAS IP

2. Mobicents: Mobicents es el servidor de aplicaciones certificado de JAIN SLEE 1.0. Es


de código abierto y con el se pueden construir aplicaciones telefónicas. Mobicents es
una plataforma profesional de middleware VoIP que suministra a los desarrolladores de
aplicaciones de telecomunicaciones lo que J2EE proporciona a los desarrolladores de
aplicaciones web empresariales.

Figura 2.8: Logotipo de mobicents

En el ámbito de las redes inteligentes de nueva generación42 , Mobicents encaja como un


motor de alto rendimiento para SDP43 y IMS44

2.5.4. Comunicación propietaria


En la comunicación propietaria la aplicación habla directamente con la plataforma telefónica
VoIP. Actualmente el mercado cada vez tiende más a estándares y a abandonar soluciones
propietarias pero en ocasiones es preferible una comunicación directa con la plataforma.
La ventaja es que es la manera más sencilla de implementar los servicios de telecomunica-
ción. Es más fácil de desarrollar porque se trabaja a más bajo nivel y se puede gestionar con
más precisión el servicio. La desventaja es que se necesita acceso directo a la plataforma tele-
fónica y eso nunca lo van a proveer las operadoras. Además al programar directamente sobre la
plataforma en vez de usar un estándar como JAIN atamos nuestro servicio a un tipo específico
de plataforma telefónica lo que puede costar muy caro en futuras migraciones o adaptaciones
de la aplicación para uso en otras operadoras que usen otras plataformas telefónicas diferentes.
En el capítulo 4 (pp 51) se explica cómo se ha construido un prototipo de aplicación VoIP
usando la plataforma telefónica Asterisk y integrando la lógica de la aplicación con la platafor-
ma telefónica mediante la comunicación no estándar propietaria de Asterisk.

42
NGIN: Next Generation Intelligent Networks
43
SDP: Service Delivery Platforms
44
IMS: IP Multimedia SubSystems
Capítulo 3

Construcción del prototipo de aplicación


ERP

El anteproyecto original (pp 59) plantea el diseño y la programación de una aplicación de


gestión web para profundizar en el funcionamiento de una aplicación compleja en java. Este
objetivo del proyecto original paso a convertirse en secundario cuando a finales del año 2006 el
proyecto se reorientó hacia la telefonía. En aquel momento la aplicación estaba prácticamente
acabada y me interesé por dotarle funcionalidad telefónica. Finalmente se ha preferido desarro-
llar un prototipo independiente que sirva de prueba de concepto. El prototipo de aplicación de
gestión,de facturación y de control de pedidos y de inventario aquí presentado fue desarrollado
entre julio y noviembre de 2006 y esta programado en Java 5 (pp 69) usando el entorno de
trabajo Spring (pp 74) y usando Hibernate (pp 75) para la persistencia de objetos sobre una
base de datos PostgreSQL (pp 70).
Junto a la documentación entregada en el proyecto se incluye un vídeo que ilustra el funcio-
namiento de la aplicación de cara al usuario.

25
26 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

3.1. Especificaciones del cliente


En este apartado se definen las funcionalidades de la aplicación solicitadas por el cliente

3.1.1. Funcionalidades presentes en el prototipo


1. Control de acceso: Debe existir un control de usuarios mediante login y contraseña. No
hace falta un sistema de niveles de permisos, si un usuario es autorizado tendrá el control
de toda la aplicación.

2. Operaciones de listado, creación, consulta e edición de forma sencilla introduciendo da-


tos en formularios predefinidos

De clientes y proveedores
De productos
De categorías o áreas de negocio
De los pedidos realizados a los mayoristas/proveedores
De facturas

3. Soporte multilenguaje de forma que todos los campos sean traducibles externamente.
El prototipo funciona en castellano y en inglés y seria muy fácil añadir otros idiomas
incluidas las lenguas con caracteres UTF8 (ruso, chino, japonés)

4. Interfaz de usuario moderna con hojas de estilo y HTML visible en todos los navegadores.

5. Auto ordenación en los listados. En el prototipo, al tener un listado, al pulsar en uno de


los campos de cabecera se ordena la tabla respecto al valor de ese campo.

6. Exportación de los datos a formatos CSV, Excel, Xml y PDF

7. Sesiones. El prototipo tiene un sistema de sesiones para permanecer conectado y no ser


necesario volver a hacer login nunca.

3.1.2. Funcionalidades adicionales


Estas funcionalidades fueron solicitadas por el cliente pero no están presentes en el prototipo
y se dejan como una linea futura de desarrollo.

1. Servicios: En el prototipo sólo se podrán facturar productos comprados a nuestros pro-


veedores. No se podrán crear productos que modelen servicios. La interfaz no deja abierta
esta opción en ningún caso.

2. Control de Stock: El prototipo no tiene en cuenta el stock de productos de la empresa.


No muestra un listado de productos en stock. No emite avisos cuando el producto lleva
demasiado tiempo sin vender.

3. Fotos o imágenes: No se almacenarán fotos o imágenes de los productos. En las facturas


no habrá imágenes.

4. Devoluciones: El programa no contempla la posibilidad de devolver productos


3.2. INTERFAZ DE USUARIO 27

5. Estadísticas: El prototipo no genera estadísticas de ventas/beneficio de ningún tipo.

6. Lógica en la introducción de datos: El prototipo cuenta con formularios sin lógica.


En el futuro seria interesante que la aplicación comprobase la información introducida e
incluir cierta lógica para realizar ciertos cálculos automáticamente

7. Búsquedas: El prototipo no incluye ningún motor de búsquedas.

8. Filtro de resultados: Los listados se muestran en orden volcando todos los datos alma-
cenados en la base de datos. No se parten los listados en varias páginas.

3.2. Interfaz de usuario

Para el diseño de la interfaz de usuario se ha usado (X)HTML y CSS2. Las imágenes se


almacenan en formato JPG para las fotos y PNG con transparencia para los elementos de la
interfaz de usuario (botoneras, fondos y sombras).
La aplicación es compatible con los navegadores modernos que soportan estas tecnologías.
La aplicación se ha probado en los siguientes motores:

1. Gecko v1.8.1+ (Firefox, Seamonkey, Camino)

2. Trident v5+ (Internet Explorer 7)

3. Presto (Opera 9+)

4. KHTML/Webcore (Safari, Konqueror)


28 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

Figura 3.1: Interfaz de usuario

La interfaz de usuario incluye lo siguiente

Una cabecera con una botonera que forma el menú principal de la aplicación y que per-
mite navegar de una sección a otra y nos posibilita acceder a la vista de listado de las
facturas, clientes, categorías, clientes, pedidos y mayoristas.

Una pantalla de presentación y de autorización de entrada al sistema

Que aparezcan listados de los contenidos almacenados.

Que se puedan editar todos y cada uno de los recursos.

Que todas las páginas de listados queden enlazadas entre sí mediante una interfaz simple.
3.2. INTERFAZ DE USUARIO 29

3.2.1. Login del usuario en la aplicación

Figura 3.2: Pantalla de login en la aplicación


30 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

3.2.2. Menú principal

Figura 3.3: Menú principal de la aplicación

3.2.3. Vista en listados de los contenidos


Las pantallas más importantes de la aplicación son las páginas que listan elementos.
Cada listado tiene una sección en la aplicación. En las vistas de los listados hay un subme-
nú que permite seleccionar funcionalidades globales e iconos asociados a cada elemento que
permiten realizar operaciones asociadas exclusivamente al elemento.
Desde el submenú se debe poder realizar las siguientes operaciones:

Creación de nuevo elemento: Nos lleva a la vista de edición del elemento correspon-
diente con todos los campos vacíos.

A cada elemento se le debe poder efectuar las siguientes operaciones:

Vista expandida: Conduce a una página en la que se muestra toda la información alma-
cenada sobre el elemento.

Edición: Debe llevar a la vista de edición donde se pueden editar todos los campos
almacenados sobre el elemento.

Eliminación: Debe eliminar el elemento. Debe existir una confirmación en forma de


ventana emergente en javascript.
3.2. INTERFAZ DE USUARIO 31

Figura 3.4: Listado de las áreas de negocio

3.2.4. Vistas de edición

En la vista de edición se pueden editar todos los campos almacenados sobre el elemento.
Se llega a esta pantalla en caso de crear elementos nuevos o de editarlos, en cuyo caso los
formularios aparecerán previamente rellenados con las opciones presentes en la base de datos.

En el prototipo la edición se realizará mediante formularios sin lógica. Tan sólo deben com-
probar que los campos requeridos son introducidos. En el futuro sería interesante que se com-
probase la información introducida e incluir cierta lógica para calcular automáticamente precios
finales.
32 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

Figura 3.5: Pantalla de edición de proveedores

3.2.5. Interfaz multilenguaje

El prototipo soporta multilenguaje aunque solamente esta implementado inglés y castellano.


3.3. CASOS DE USO DE LA APLICACIÓN 33

Figura 3.6: Pantalla de login en inglés

3.3. Casos de uso de la aplicación


En los siguientes casos de uso1 mostramos cómo se comporta el sistema y cómo los acto-
res consiguen realizar sus tareas y cumplir sus metas. Al describir los casos de uso también
mostraremos los requerimientos

3.3.1. Creación de mayorista/proveedor/distribuidor


Este caso de uso detalla cómo se comporta el sistema para crear un nuevo mayorista2 y es un
caso de uso prácticamente idéntico a los casos de uso de creación de un producto asociado a un
pedido, una categoría, un cliente o un pedido.

Descripción en formato narrativo del caso de uso


El usuario se ha hecho cliente de un nuevo proveedor y desea incluirlo en la aplicación.
Una vez incluido el mayorista podrá crear un pedido y los productos asociados al pedido. Para
crear el mayorista el usuario debe ir a la sección de listado de mayoristas y pulsar el botón de
1
El formato de casos de uso sigue el estilo descrito en el libro Writing Effective Use Cases[2]
2
Para el prototipo los conceptos de mayorista, proveedor y distribuidor son sinonimos
34 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

nuevo mayorista. Esto le llevará a una vista de edición desde la cual puede introducir los datos
del nuevo mayorista. Cuando envíe el formulario el sistema procesará el sistema y volverá a
mostrar la vista del listado, pero esta vez ya aparecerá el nuevo mayorista.

Objetivo Añadir un mayorista al sistema


Acción Alguien necesita añadir un mayorista al sistema
Actor principal Usuario con permisos de administración
Cuadro 3.1: Elementos de caso de uso crear mayorista

Paso Acción
1 El usuario va a la sección de proveedores pulsando el botón correspondiente
2 El usuario pulsa la opción de crear nuevo proveedor y el sistema le muestra una vista
de edición con formularios para rellenar los datos del nuevo mayorista.
3 El usuario envía el formulario y el sistema comprueba que todos los datos requeridos
hayan sido introducidos. Si falta alguno, vuelve a la vista anterior avisando de los
campos incompletos.
4 El sistema acepta los datos y crea el nuevo mayorista en la base de datos. El usuario
vuelve a la vista de listado de mayoristas donde ya aparece el recién creado.
Cuadro 3.2: Escenario de caso de uso de creación de mayorista

3.3.2. Creación de pedidos


Este caso de uso detalla cómo se comporta el sistema para crear nuevos pedidos.

Descripción en formato narrativo del caso de uso

El usuario quiere crear un pedido. Para ello previamente debe haber creado los productos
correspondientes y debe existir el proveedor. Para crear el pedido el usuario debe ir a la sección
de listado de pedidos y pulsar el botón de nuevo pedido. Esto le llevará a una vista de edición
desde la cual puede introducir los datos del nuevo pedido. Cuando envíe el formulario el sistema
procesará el sistema y volverá a mostrar la vista del listado, pero esta vez ya aparecerá el nuevo
pedido.

Objetivo Añadir un nuevo pedido al sistema


Acción Se necesita añadir un pedido al sistema
Actor principal Usuario con permisos de administración
Cuadro 3.3: Elementos de caso de uso crear pedido
3.4. ARQUITECTURA DE LA APLICACIÓN 35

Paso Acción
1 Lo primero es crear si no existe el mayorista al que vamos a hacer el pedido y los
productos asociados al pedido. El caso de uso de crear mayorista esta en la sección
3.3.1 en la página 33)
2 El usuario va a la sección de pedidos pulsando el botón correspondiente
3 El usuario pulsa la opción de crear nuevo pedido y el sistema le muestra una vista de
edición con formularios para rellenar los datos del nuevo pedido
4 El usuario envía el formulario y el sistema comprueba que todos los datos requeridos
hayan sido introducidos. Si falta alguno, vuelve a la vista anterior avisando de los
campos incompletos.
5 El sistema acepta los datos y crea el nuevo pedido en la base de datos. El usuario
vuelve a la vista de listado de pedidos donde ya aparece el recién creado.
Cuadro 3.4: Escenario de caso de uso de creación de pedido

3.4. Arquitectura de la aplicación

3.4.1. Aplicación web de modelo 2 / modelo vista controlador (MVC)

Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que separa los
datos de una aplicación, la interfaz de usuario, y la lógica de control en tres componentes
distintos. Esta arquitectura se ve frecuentemente en aplicaciones complejas web donde hay que
mostrar mucha información al usuario. Permite cambiar la interfaz de usuario sin modificar la
gestión de los datos desacoplando la capa de acceso y la lógica de la aplicación de la capa de
presentación e interacción con el usuario.
De esta manera la estructura del patrón MVC tiene tres clases distintas, la vista que es la
página HTML y el código que provee de datos dinámicos a la página, el controlador es el
Sistema de Gestión de Base de Datos y el modelo es el modelo de datos.

Modelo: define los datos y la lógica de la aplicación. El modelo accede a la capa de


almacenamiento de datos (el modelo normalmente es independiente del sistema de alma-
cenamiento). El modelo define las reglas de negocio (la funcionalidad del sistema).

Vista: muestra la información del modelo al usuario en una interfaz de usuario adecuada
para interactuar.

Controlador: gestiona los eventos del sistema y las acciones del usuario. El controlador
invoca cambios en el modelo y en la vista.
36 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

Figura 3.7: Patrón de diseño modelo-vista-controlador

3.4.2. Persistencia de objetos en la base de datos


La persistencia de objetos3 o mapeo objeto-relacional es una técnica de programación para
convertir información entre las bases de datos y los lenguajes de programación orientados a
objetos. Al usarlo se crea una base de datos orientada a objetos virtual sobre la base de datos
relacional que puede ser usada desde dentro del lenguaje de programación. Esto posibilita el uso
de las características propias de la orientación a objetos (básicamente herencia y polimorfismo).
En una base de datos orientada a objetos, la información se representa mediante objetos en
la programación orientada a objetos. Cuando se integra las características de una base de datos
con las de un lenguaje de programación orientado a objetos, el resultado es un sistema gestor
de base de datos orientada a objetos (ODBMS, object database management system).
Los ODBMS proporcionan los costes de desarrollo más bajos y el mejor rendimiento gracias
a que almacenan objetos en disco y tienen una integración transparente con el programa escrito
en un lenguaje de programación orientado a objetos, al almacenar exactamente el modelo de
objeto usado a nivel aplicativo, lo que reduce los costes de desarrollo y mantenimiento.

3.5. Definición del entorno de trabajo


Herramientas de desarrollo

(pp 73) Subversion: Se usó un repositorio SVN local para el mantenimiento del código.

Eclipse: Se usó una instalación básica de Eclipse como entorno de desarrollo. No se


instaló ningún plugin y los despliegues se realizaban desde linea de comandos mediante
Ant.

(pp 76) Ant: Para facilitar las tareas repetitivas y el despliegue de los servlets.

TRAC: Trac es un wiki y un sistema de control de cambios para el desarrollo del softwa-
re. En este proyecto se ha usado TRAC para visualizar el repositorio SVN del proyecto.

(pp 73) Anthill: Para poder hacer la integración continua en forma de «nighty releases»y
los test unitarios.

(pp 80) Dia: Herramienta para el modelado UML y los diagramas de clases
3
ORM: Object-relational mapping, también llamado O/RM, y O/R mapping
3.5. DEFINICIÓN DEL ENTORNO DE TRABAJO 37

Figura 3.8: Componentes del prototipo de aplicación ERP

Módulos del programa:

(pp 74) Appfuse: AppFuse es un entorno de desarrollo web Java EE. Facilita el rápido
desarrollo de aplicaciones debido a su integración con Spring, Struts y Hibernate. El nú-
cleo de Appfuse es un esqueleto similar al que se genera automáticamente en los entornos
de desarrollo al crear nuevos proyectos.

• (pp 74) Spring: Es un entorno de trabajo open source Java. Se ha convertido en una
alternativa sustitutiva del modelo de los JavaBean. Por diseño, el entorno ofrece
una gran libertad a los desarrolladores a la vez que provee de soluciones sencillas
de usar y bien documentadas para los problemas típicos. Spring se ha usado en el
prototipo para constituir el modelo vista controlador.
• (pp 75) Hibernate: Es una solución open source para el mapeo de objetos en una
base de datos. Hibernate nos proporciona un entorno de trabajo sencillo de usar que
libra al programador del trabajo de la persistencia de objetos en la base de datos.

(pp 73) Tomcat 5.5.x: Como servidor de aplicaciones

(pp 75) Sitemesh: Como decorador. Se ha usado JSP4 para la separación entre la interfaz
gráfica y el programa java

Log4j: Log4j es una librería open source desarrollada en Java por la Apache Software
Foundation que permite a los desarrolladores de software elegir la salida y el nivel de
granularidad de los mensajes de log en tiempo de ejecución y no a tiempo de compilación
como es comúnmente realizado.

JUnit: JUnit es un conjunto de librerías que son utilizadas en programación para hacer
pruebas unitarias de aplicaciones Java.
4
En JSP se escribe el texto HTML que va a ser devuelto en la salida incluyendo código java dentro de él, para
poder modificar o generar contenido dinámicamente. El código java se se le denomina scriptlet y se incluye dentro
de las marcas de etiqueta < % y %>
38 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

Otros componentes software del sistema:


(pp 70) PostgreSQL: Es un motor de base de datos liberado bajo la licencia BSD. El
prototipo no ataca a la base de datos directamente. La aplicación establece la comunica-
ción entre la base de datos y Hibernate y a partir de ese momento todas las consultas las
realizaremos a través de Hibernate en su propio lenguaje o en SQL

Prototype: Para realizar una interfaz de usuario dinámica. El prototipo no incluye aún
ninguna funcionalidad dinámica pero lo soporta y es una posible linea futura de desarro-
llo. A medida que la aplicación madure, la interfaz irá evolucionando hacia una aplica-
ción web2.0 mediante el uso de AJAX. El objetivo será entonces aumentar la usabilidad
y la facilidad de uso de manera que hacer uso de la aplicación sea una experiencia más
agradable.

3.6. Metodología de desarrollo


Para la aplicación se ha seguido una metodología de desarrollo de software ágil. Se marcaron
cortos periodos temporales y se llamaron iteraciones. Cada iteración duró dos semanas y fue
como un proyecto software en miniatura que incluía todas las tareas necesarias para aumentar
la funcionalidad a cada paso: planificación, análisis de requerimientos, diseño, programación,
testeo y documentación. Al final de cada iteración el software fue evaluado y se analizaron las
posibles mejoras en forma de aumentos de prestaciones o de soluciones a los errores.

3.7. Planificación
3.7.1. Fase 0: Toma de contacto
11 Jul - 28 Jul: Documentación. Preparación de plataforma de desarrollo.

24 Jul - 28 Jul - Escritura especificaciones cliente. Fin periodo documentación.

28 Jul - Lluvia de ideas sobre cómo modelar la aplicación.

3.7.2. Fase 1: Creación de un prototipo base


31 Jul - 4 Aug - Modelo de datos. Vistas preliminares.

4 Aug - Revisión del trabajo. Lluvia de ideas sobre cómo modelar la lógica de la aplica-
ción.

7 Aug - 11 Aug - Lógica de la aplicación.

11 Aug - Revisión del prototipo. Brainstorming (Mejoras)

Esta fue la fase más intensa de desarrollo y donde se hizo la mayor parte del trabajo. Durante
esta fase se empezó a trabajar sobre el repositorio SVN y se empezó a hacer las clases básicas
del programa. Al finalizar la primera semana ya se había diseñado un prototipo muy básico
3.7. PLANIFICACIÓN 39

capaz de mostrar los objetos POJO5 almacenados en la base de datos y de modificarlos. Durante
los últimos días de esta fase se trabajó sobre la lógica del sistema.
En vez de hacer todos y cada una de las clases necesarias y creadas a mano con el tutorial,
se siguió la filosofía de Appfuse y se generó el código dinámicamente a partir de los objetos
POJO. Durante los primeros días se modelaron los objetos POJO que se reflejan directamente
como tablas aisladas en la base de datos.

Guía para la construcción de objetos POJO simples en Appgen


1. Construir la tabla en la base de datos. Definir en papel cómo es la base de datos. Crear la
tabla y documentar el SQL.

2. Configuramos el fichero de mapeo para el POJO en applicationContext-hibernate.xml.


Este paso previo es necesario porque Middlegen (El software que se encarga de crear
el POJO desde la tabla de la base de datos y almacenado en /extras/middlegen) lo deja
pendiente para el usuario.
1 <value>com/idatel/model/TipoUser.hbm.xml</value>
2 <!-- TipoEquipo: Hibernate implementation -->
3 <bean id="tipouserDAO" class="com.idatel.dao.hibernate.TipoUserDAOHibernate">
4 <property name="sessionFactory" ref="sessionFactory"/>
5 </bean>

3. Vamos al directorio extras/appgen y ejecutamos Ant. Nos pregunta si se quiere generar el


código desde un POJO o desde una tabla en la base de datos. Ahora vamos a crear desde
la tabla así que introducimos la tabla a la que esta asociada el POJO.

4. Se introduce un nombre para el paquete.

5. Para instalar los ficheros generados, se ejecuta install-detailed. (ant install-detailed


-Dappgen.type=pojo -Dobject.name=tipouser).

Guía para la construcción de los objetos POJO complicados


Se hicieron los POJO construidos mediante relaciones de tablas en la base de datos. En
principio las relaciones las construiremos como «Tablas por subclase ». Esto es un caso más
complicado que el anterior y ya no es posible generar todo desde la tabla de la base de datos.
Tendremos que crear el objeto POJO y desde ahí crear todo lo demás.
Para hacer el objeto POJO es necesario hacer que XDoclet6 sea consciente de las relaciones
entre las tablas de la base de datos. Para ello fue necesario revisar los siguientes tutoriales:

XDoclet/Hibernate (Appfuse)7

XDoclet/Hibernate (General)8
5
POJO (acrónimo de Plain Old Java Object) es una clase del lenguaje de programación Java. Este nombre se
les da a las clases que no son de algún tipo especial (EJBs, Java Beans, etc) y no cumplen ningún otro rol ni
implementan alguna interfaz especial.
6
XDoclet es un motor de generación de código libre. Permite la programación orientada a atributos en java,
dotaando de mayor significado al código añadiendo meta información (atributos) al código fuente java en forma
de tags de JavaDoc.
7
http://www.raibledesigns.com/wiki/Wiki.jsp?page=HibernateRelationships
8
http://www.downside.ch/blog/?page_id=37
40 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

Hibernate9

Pasos para la creación de los objetos:

1. Creamos el POJO en el directorio model

a) Definimos los atributos y creamos los getter y setter


b) Añadimos las etiquetas XDoclet en los getters para generar el fichero de mapeo de
hibernate
1) @hibernate.class (Antes de la declaración de la clase)
2) @hibernate.id (Llave primaria)
3) @hibernate.property (El resto de atributos)

2. Editamos el fichero /src/com/idatel/dao/hibernate/applicationContext-hibernate.xml e in-


dicamos el lugar del nuevo objeto

3. Usamos AppGen para crear los DAOs10 , los test de control para JUnit y los JSP desde
los POJOs
1 cd extras/appgen
2 ant -Dmodel.name=Facturas -Dmodel.name.lowercase=facturas
3 ant install-detailed

Con esto ya tendremos todas las clases necesarias. Sólo nos queda verificar que todo esta OK
pasando los test.

1 setup-db
2 ant test-dao -Dtestcase=Facturas
3 ant test-web -Dtestcase=Facturas (crea el FacturasForm?.class)
4 ant test-all
5 ant deploy

Revisión de la fase 1
Durante la primera fase el proyecto se retrasó mucho por las vacaciones y por que estuve un
tiempo enfermo. Además se comenzó el trabajo en un momento muy malo porque la versión
de Appfuse 1.9.2 se publicó con muchos muchos bugs y errores graves y sabría que tendría que
pasar una dolorosa migración mezclando ramas en el SVN hacia la 1.9.3. Al final de la fase el
SVN acabo roto, la aplicación compilaba adecuadamente, pero Tomcat no quería arrancar la
aplicación.

3.7.3. Fase 2: Segunda quincena de agosto


Primera semana
Se inició un proceso de recuperación para revisar que es lo que había desarrollado y lo que
faltaba. Me doy cuenta que los volcados de la base de datos no se pueden recuperar y paso
9
http://www.froses.com/Assets/Files/Articles/Hibernate_Introduccion_es.pdf y
http://www.raibledesigns.com/wiki/Wiki.jsp?page=HibernateRelationshipsUI
10
DAO: Data Access Object (Objeto de Acceso a Datos). Es un componente de software que suministra una
interfaz común entre la aplicación y uno o más dispositivos de almacenamiento de datos, tales como una Base de
datos o un archivo.
3.8. ESTRUCTURA DE LA BASE DE DATOS 41

los siguientes días tratando de generar adecuadamente los volcados. También aprovecho para
terminar de definir la base de datos y especificar los tipos de datos.
El SVN estaba definitivamente roto y se inició un procedimiento para intentar recuperarlo.
Primero intentar salvarlo buscando errores (imposible). Luego actualizándolo a Appfuse 1.9.3
a mano (muy tedioso y sin resultados). Al final se volvió a importar una copia de desarrollo
funcional. El SVN se acabo recuperando el día 24 de agosto mediante mezcla de las dos ramas.

Última semana

Se prescinde de la tabla «usuarios»para usar en su lugar las tablas que vienen de serie para
control de los usuarios autorizados con Appfuse (app_user, role, role_user).

3.7.4. Fase 3: Finalización del prototipo


En septiembre se detuvo el desarrollo del proyecto para tener tiempo para estudiar exámenes
en la convocatoria de septiembre. En octubre y noviembre estuve trabajando en el diseño de
la aplicación, editando las hojas de estilo y el HTML de la interfaz de usuario y empezando a
documentar el proyecto.

3.8. Estructura de la base de datos


3.8.1. Tablas de la base de datos de ámbito general
Tabla direcciones_postales

Campo Tipo de dato


id bigint PRIMARY KEY
direccion_1 char var(100)
direccion_2 char var(100)
ciudad char var(50)
provincia char var(50)
cp char var(10)
fecha_mod timestamp
Cuadro 3.5: Tabla direcciones_postales

ID: Campo auto incremental

direccion_1,direccion_2: Primera y segunda linea de la direccion

ciudad, provincia, cp: autoexplicativo

fecha_mod: Fecha y hora de la ultima modificacion


42 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

Tabla tipo_direcciones

Campo Tipo de dato


id bigint
tipo_direccion char var(100)
fecha_mod timestamp
Cuadro 3.6: Tabla tipo_direcciones

ID: Campo auto incremental


tipo_direccion: El tipo de direccion, facturación, envio, empresa, direccion fisica etc
fecha_mod: Fecha y hora de la ultima modificacion

Tabla direcciones

Campo Tipo de dato


id bigint PRIMARY KEY
direccion_postal_id char var(100)
tipo_id bigint REFERENCES tipo_direcciones(id)
url char var(200)
email char var(200) NOT NULL UNIQUE
fecha_mod timestamp
Cuadro 3.7: Tabla direcciones

ID: Campo auto incremental


direccion_postal_id: La ID de la direccion postal asociada a la direccion
tipo_id: El tipo de dirección
url: la direccion en internet
email: la direccion de correo electrónico
fecha_mod: Fecha y hora de la ultima modificacion

Tabla num_contacto

Campo Tipo de dato


id bigint PRIMARY KEY
telefono_1 char var(20)
telefono_2 char var(20)
fax char var(20)
fecha_mod timestamp
Cuadro 3.8: Tabla num_contacto
3.8. ESTRUCTURA DE LA BASE DE DATOS 43

ID: Campo auto incremental

telefono_1, telefono_2: Telefonos de contacto

fax: autoexplicativo.

fecha_mod: Fecha y hora de la ultima modificacion

3.8.2. Tablas de la base de datos relacionadas con los usuarios del sistema
Aqui se almacena la información de los usuarios que pueden acceder a Idages. La base de
datos diferencia entre el rol de administrador, que puede hacer cualquier cosa y el rol de usuario
básico o cliente que sólo tiene permisos para visualizar sus propias facturas y sin posibilidad de
modificarlas. El prototipo presentado en este PFC hace caso omiso de los niveles de permisos.
Si el usuario tiene cuenta en el sistema, puede hacer uso de todas las funcionalidades por
completo.

Tabla app_user

Campo Tipo de dato


id bigint NOT NULL PRIMARY KEY
version integer NOT NULL
username char var(50) NOT NULL UNIQUE
password char var(255) NOT NULL
first_name char var(50) NOT NULL
last_name char var(50) NOT NULL
adress char var(150)
city char var(50) NOT NULL
province char var(100)
country char var(100)
postal_code char var(15) NOT NULL
email char var(15) NOT NULL
phone_number char var(255)
website char var(255)
password_hint char var(255)
account_enabled char(1) NOT NULL
account_expired char(1) NOT NULL
account_locked char(1) NOT NULL
credentials_expired char(1) NOT NULL
Cuadro 3.9: Tabla app_user

id: Campo auto incremental

username: Login del usuario

password: contraseña de acceso


44 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

first_name, last_name, adress, city, province, country, postal_code, email, phone_number,


website

password_hint: Pregunta para identificar al usuario y recordarle la contraseña.

account_enabled: BOOL. Si TRUE la cuenta esta activa

account_expired: BOOL.

account_locked: BOOL.

credentials_expired: BOOL.

Tabla role

Campo Tipo de dato


id bigint NOT NULL PRIMARY KEY
name char var(20)
description char var(64)
Cuadro 3.10: Tabla role

id: Campo autoincremental

name: nombre del rol

description: descripción del rol

Tabla user_role

Campo Tipo de dato


user_id bigint NOT NULL PRIMARY KEY REFERENCES app_user(id)
role_id role_id NOT NULL PRIMARY KEY REFERENCES role(id)
Cuadro 3.11: Tabla role
3.8. ESTRUCTURA DE LA BASE DE DATOS 45

3.8.3. Tablas de la base de datos relacionadas con la facturación


Tabla facturas

Campo Tipo de dato


id bigint PRIMARY KEY
categoria_id bigint REFERENCES areas_de_negocio(id)
numero_id char var(15)
cliente_id bigint REFERENCES clientes(id)
notas_adicionales text
fecha_creacion timestamp
fecha_oficial timestamp
fecha_emision timestamp
fecha_pago timestamp
emitida char(1)
pagada char(1)
fecha_mod timestamp
Cuadro 3.12: Tabla facturas

ID: Campo auto incremental

categoria_id: Id de la categoria a la que pertenece la factura

numero_id: Numero autoincremental que corresponde al siguiente número de factura-


ción de la categoria. El identificativo de la factura para hacienda se construye como Pre-
fijoCategoria+numero_id(de la factura correspodiente)

cliente_id: Id del cliente al que se asocia la factura (Puede estar activo o inactivo)

fecha_creacion: fecha de creación de la factura

fecha_oficial: fecha que se muestra en la factura (Es la única que se pide al usuario, para
que la modifique a su an tojo)

fecha_emision: fecha en que la factura fue emitida

fecha_pago: fecha en que la factura fue pagada

emitida: BOOL Si esta emitida significa que el cliente ya tiene la factura en su poder y
por lo tanto la factura ya no se puede modificar

pagada: BOOL Si la factura esta pagada se pone a TRUE este flag.

fecha_mod: Fecha y hora de la ultima modificacion


46 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

Tabla clientes

Campo Tipo de dato


id bigint PRIMARY KEY
activo char(1)
fecha_creación timestamp
título char var(200)
nombre char var(20)
apellidos char var(20)
nif_cif char var(15)
dirección_id bigint REFERENCES direcciones(id)
num_contacto_id bigint REFERENCES num_contacto(id)
email_promo char(1)
contacto char var(100)
notas_adicionales text
fecha_mod timestamp
Cuadro 3.13: Tabla clientes

ID: Campo auto incremental

activo: BOOL. Si el cliente esta activo (TRUE), se muestra en los campos SELECT a
la hora de hacer facturas. Si no esta activo (FALSE) el cliente no sale en los campos
de SELECT pero el cliente SIGUE en el sistema. Un cliente se DESACTIVA cuando se
EDITA. Al editar un cliente realmente se crea uno nuevo y se mantiene el antiguo en la
BD pero DESACTIVADO. De esta manera una factura se puede generar dinámicamente
y mostrar la información que tenia en el momento de su creación.

fecha_creacion: Coincide con la de modificacion por lo dicho anteriormente

titulo: formula de cortesia adecuada (Señor, señorita, señora, doctor, excelentisimo etc)

nombre,apellidos,nif_cif: autoexplicactivo

direccion_id: ID de la dirección (tabla direcciones) asociada con el contacto

num_contacto_id: ID de los numeros de contacto (tabla num_contacto) asociados con


el cliente.

email_promo: BOOL Si TRUE el cliente acepta recibir promociones por email

contacto: nombre de la persona de contacto

notas_adicionales: Campo para escribir notas

fecha_mod: Fecha y hora de la ultima modificacion


3.8. ESTRUCTURA DE LA BASE DE DATOS 47

Tabla proveedores

Campo Tipo de dato


id bigint PRIMARY KEY
fecha_creacion timestamp
nif_cif char var(50)
direccion_id char var(15)
num_contacto_id bigint REFERENCES direcciones(id)
contacto char var(100)
notas_adicionales text
fecha_mod timestamp
Cuadro 3.14: Tabla proveedores

ID: Campo auto incremental


fecha_creacion: Coincide con la de modificacion por lo dicho anteriormente
nombre,nif_cif: Autoexplicativos
direccion_id: Id de la dirección asociada con el proveedor
num_contacto_id: ID de los numeros de contacto (tabla num_contacto) asociados con
el proveedor
contacto: nombre de la persona de contacto
notas_adicionales: Campo para escribir notas
fecha_mod: Fecha y hora de la ultima modificacion

Tabla pedidos

Campo Tipo de dato


id bigint PRIMARY KEY
proveedor_id bigint REFERENCES proveedores(id)
fecha_pedido timestamp
notas_adicionales text
fecha_mod timestamp
Cuadro 3.15: Tabla pedidos

ID: Campo autoincremental


proveedor_id: Identificador del proveedor al que se ha hecho el pedido
fecha_pedido: fecha en la que se ha hecho el pedido
notas_adicionales: bloque de texto para poder comentar cosas del pedido
fecha_mod: Fecha y hora de la ultima modificacion
48 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

Tabla areas_de_negocio

Campo Tipo de dato


id bigint PRIMARY KEY
nombre char var(50)
prefix char var(5)
iva integer
notas_adicionales text
fecha_mod timestamp
Cuadro 3.16: Tabla areas_de_negocio

ID: Campo autoincremental

nombre: Nombre del área de negocio

prefix: prefijo que se añadirá al nombre de factura

iva: impuesto asociado al tipo de actividad

notas_adicionales: bloque de texto para poder comentar cosas de la categoria

fecha_mod: Fecha y hora de la ultima modificacion

3.8.4. Tablas relacionadas con los productos


Tabla productos
Un producto es único y sólo puede facturarse una única vez. No obstante su descripción
puede compartirla con muchos: Podemos hacer un pedido de 20 monitores y cada uno de ellos
es un producto diferente aunque comparten la misma descripción. A la hora de hacer el pedido
se nos pide a información del número de productos que hacemos. En la base de datos se modela
como un conjunto de productos diferentes que apuntan a una misma descripción. El precio de
venta va asociado al producto porque solo se puede vender una vez y además podemos vender
cada producto a un precio diferente dependiendo de la demanda o del tiempo que lleva en stock.
Sin embargo los costes van en una tabla aparte porque un mismo producto puede tener va-
rios costes asociados a si mismo. Por ejemplo, un producto normal puede tener 3 o 4 costes
asociados: el precio del mayorista, el precio de los costes de envio hasta nuestras instalacio-
nes, el precio de los costes de envio hasta las instalaciones del cliente y el coste en llamadas
telefónicas para realizar el pedido.

ID: Campo autoincremental

factura_id: Identificativo de la factura a la que esta asociada. Si es NULL se considera


que el producto esta en stock.

pedido_id: Identificatido del pedido al que esta asociado. NO PUEDE SER NULL.

desc_data_id: Identificativo de la descripción al que esta asociado

eur_venta: Precio al que hemos vendido finalmente el producto


3.8. ESTRUCTURA DE LA BASE DE DATOS 49

fecha_creación: fecha en la que se creó el producto

num_serie: Numero de serie del producto.

notas_adicionales: Bloque de texto para poder comentar cosas sobre el producto

fecha_mod: Fecha y hora de la ultima modificacion

Tabla productos_desc_data

Campo Tipo de dato


id bigint PRIMARY KEY
titulo_select char var(100)
titulo char var(150)
descripcion text
descripcion_ext text
referencia_fab char var(50)
referencia_idatel char var(50)
garantia bigint
fecha_mod timestamp
Cuadro 3.18: Tabla productos_desc_data

ID: Campo autoincremental

titulo_select: Es el título identificador que se muestra en los cajetines SELECT en la


interfaz de usuario

titulo: Es la linea que aparece en negrita en la factura y es el nombre que tendra el


producto para el cliente

descripcion: Es la descripción en HTML que acompaña a la factura

descripcion_ext: Es la descripcion en HTML que acompaña a la factura en texto mas


pequeño.

referencia_fab: referencia que tiene el fabricante del producto

referencia_idatel: referencia que tenemos nosotros del producto

garantia: en días desde la fecha de compra del producto.

fecha_mod: Fecha y hora de la ultima modificacion


50 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP

Tabla coste_productos

Campo Tipo de dato


id bigint PRIMARY KEY
producto_id bigint REFERENCES productos(id)
concepto char var(50)
eur bigint
fecha_mod timestamp
Cuadro 3.19: Tabla coste_productos

ID: Campo autoincremental

producto_id: Producto al que esta asociado el coste

concepto: descripción del coste

eur: coste en euros

fecha_mod: Fecha y hora de la ultima modificacion

3.8.5. Tablas relacionadas con los empleados


(El prototipo no implementa funcionalidad relacionada con los comerciales. No es necesario
modelar la tabla)

3.8.6. Tablas relacionadas con los servicios


(El prototipo no implementa funcionalidad relacionada con los servicios. No es necesario
modelar la tabla)
Capítulo 4

Construcción del prototipo de aplicación


VoIP

Durante el desarrollo del proyecto se ha desarrollado un prototipo de aplicación web con


soporte de VoIP. Para hacerlo se ha hecho uso del entorno de trabajo Struts2 (pp 74) y del
servidor de aplicaciones Jetty (pp 73). Como plataforma VoIP se ha usado Asterisk (pp 66) y la
comunicación entre Asterisk y la aplicación web se ha realizado con la API Asterisk-Java (pp
67) haciendo uso del manager de Asterisk.
La funcionalidad del prototipo simula un servicio de click-to-call (pp 53) directo e indirecto.
La aplicación muestra un listado de facturas y al pulsar botones se ejecutan acciones capaces
de mandar mensajes de texto y locuciones vocales a los clientes para avisarles del estado de la
facturación o de poner en contacto a dos personas.
Junto a la documentación entregada en el proyecto se incluye un vídeo que ilustra el funcio-
namiento de la aplicación de cara al usuario.

51
52 CAPÍTULO 4. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN VOIP

4.1. Arquitectura de la aplicación

La aplicación esta programada en Java 1.6 (pp 69) sobre un entorno de trabajo Struts2 (pp
74) y corriendo sobre el servidor de aplicaciones Jetty (pp 73). Para compilar y ejecutar la
aplicación se utiliza Maven2 (pp 75). La plataforma telefónica la provee Asterisk (pp 66) y la
comunicación entre la aplicación y Asterisk se hace usando las librerías libres Asterisk-Java
(pp 67). Como sintetizador de voz en tiempo real se ha usado Festival (pp 76).

Figura 4.1: Arquitectura del prototipo de aplicación VoIP

La arquitectura de este sistema es similar a la expuesta en la página 18 al explicar la es-


tructura de un servicio IMS. A pesar de ser parecidos, el prototipo no se puede considerar una
plataforma IMS porque en IMS los terminales están en el lado del cliente. Aquí el cliente es
una aplicación que unidireccionalmente establece las comunicaciones y por lo tanto el cliente
es web, es decir, no hay sesiones SIP establecidas con el terminal.
4.2. INTERFAZ DE USUARIO 53

4.2. Interfaz de usuario

Figura 4.2: Prototipo2 junio de 2007

Al pulsar el botón «emitir factura»se inicia un proceso de click-to-call (pp 53) automático
en el cual se origina una llamada hacia una extensión prefijada. Cuando el receptor descuelga,
se transmite una locución previamente grabada o bien una locución generada en tiempo real
mediante un sintetizador de voz. Este caso de uso es el que se puede ver en el vídeo que
acompaña al PFC.

4.3. Casos de uso


4.3.1. Click-to-call
Click-To-Call o CTC es un servicio que permite a los usuarios pulsar un botón en una página
web y inmediatamente hablar con un comercial de la empresa en cuestión o otro usuario. CTC
también describe un tipo de anuncios que ofrece a los usuarios con dispositivos portátiles y a
los usuarios de ordenadores de sobremesa la posibilidad de pulsar un número telefónico dentro
del anuncio para hacer una llamada al anunciante.
Internet se esta convirtiendo cada vez más en un enorme centro comercial donde los clien-
tes potenciales saltan rápidamente de una tienda online a otra. La competencia en precio y
características es feroz y es difícil para las tiendas mantener a los usuarios en su sitio web y
convencerles que compren. Esas empresas necesitan herramientas que ayuden a sus clientes
durante el proceso de compra para que se sientan como si estuvieran en una tienda real.
Las páginas web siempre han sido mudas. El problema es que muchas veces resolveríamos
nuestras dudas preguntando a alguien, y si no hay nadie a quien preguntar o no sabemos cómo
hacerlo simplemente nos olvidamos del tema y seguimos navegando.
Al igual que las tiendas online cualquier tipo de empresa que haga negocios en internet se
podría aprovechar de un sistema click-to-call en su sitio web. Es una solución al problema
porque ayuda a las empresas a tener nuevos clientes y hace sentir a los actuales que la empresa
se preocupa por ellos.
54 CAPÍTULO 4. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN VOIP

Click-to-call automático
Un caso de uso funcional en el prototipo es un click-to-call automático. En este modo, al
pulsar un botón en la página web, Asterisk establece una comunicación con una extensión
telefónica y cuando el terminal descuelga, reproduce una locución previamente grabada o bien
genera en tiempo real una locución a partir de texto.
Este tipo de servicio se podría usar para avisar a los clientes de una empresa cuándo se les
emiten las facturas y su importe.

Click-to-call indirecto
Otro caso de uso es el click-to-call indirecto. En este modo, al pulsar un botón en la página
web, Asterisk origina una llamada con una extensión telefónica interna y cuando el terminal
descuelga, establece una comunicación con otra extensión. Una vez que este terminal es des-
colgado, pone en comunicación a ambos terminales.
Este tipo de servicio es similar al ofrecido por Jajah (pp 13) o el BT WholeSale Web Call
Connect (pp 21) y se podría usar como una manera sencilla de llamar a los clientes o a los
comerciales de la empresa sin necesidad de marcar el número correspondiente.

Click-to-call directo
Un caso de uso no implementado en el prototipo es el click-to-call directo. En este modo, al
pulsar un botón en la página web, se abre un terminal SIP dentro del navegador1 que origina
directamente una llamada a una extensión predeterminada. Una vez que el terminal asocia-
do a esa extensión sea descolgado el usuario podría hablar directamente a través del teléfono
integrado en el navegador.

1
Un softphone integrado en el navegador se puede implementar mediante un control ActiveX, mediante un
applet Java o mediante flash. En cualquier caso el desarrollo y la implementación de un softphone web esta fuera
del ámbito de este PFC
Capítulo 5

Conclusiones

5.1. Cronograma temporal

Figura 5.1: Roadmap del proyecto

55
56 CAPÍTULO 5. CONCLUSIONES

En la figura de la página anterior se puede apreciar que el desarrollo del proyecto ha sido un
trabajo constante durante un año completo. La progresión en el trabajo ha sido continua y se
ha seguido la planificación inicial. El trabajo solamente se detenía en periodo de exámenes o
en momentos intermedios en que había que dejar un aspecto del proyecto para profundizar en
otro.
El único parón importante fue la época a finales del año 2006. En ese momento no tenia
acceso a Internet en mi casa y el desarrollo del proyecto se resintió mucho por que cada vez que
me atascaba en algún punto debía ir a la universidad a consultar en Internet posibles soluciones.
Yo estaba acostumbrado a un método de trabajo en que al encontrar el mínimo problema, podía
hacer una búsqueda y encontrar de forma instantánea la solución. Al tener que esperar horas o
días para encontrar posibles soluciones a los problemas planteados a veces me desesperaba y
dejaba varios días el proyecto abandonado.
Por otro lado, hasta diciembre del 2006 no paré de hacer cada vez más ambicioso el objeto del
proyecto. Como se puede ver en el anteproyecto (pp 59) Al principio era una simple aplicación
web de gestión pero luego se complico todo en varios ordenes de magnitud al querer incorporar
la funcionalidad telefónica porque me tuve que introducir en un mundo que desconocía.
Por culpa de hacer un proyecto muy grande no he conseguido pulir todo lo que hubiera
deseado el proyecto pese a mi determinación para terminar el proyecto y la enorme ventana
temporal. No obstante estoy muy contento con el trabajo realizado porque he conseguido com-
pletar todas las metas del proyecto. En las siguientes páginas comentaré los objetivos que se
han cumplido y que lineas quedan abiertas que seria interesante desarrollar en el futuro.

5.2. Hitos
En el desarrollo de este proyecto se han cumplido todos los objetivos marcados originalmente
(pp 2) y se han conseguido los siguientes hitos:

1. Desarrollo de software

Entre junio y diciembre de 2006 se ha desarrollado un prototipo de aplicación web


con funciones de gestión para una pequeña empresa. Ha sido programada en Java
1.5 con el marco de trabajo Spring (pp 74) y usando Hibernate (pp 75) para la
persistencia de objetos en una base de datos PostgreSQL
Entre mayo y julio de 2007 se ha desarrollado un prototipo de aplicación web con
funciones telefónicas. Ha sido programada en Java 1.6 con el marco de trabajo
Struts2 (pp 74) y la plataforma telefónica Asterisk (pp 66).
Se ha hecho uso de los patrones de diseño de MVC (pp 35) y de persistencia de
objetos (pp 36)
Se ha usado los tres entornos de desarrollo más importantes, Netbeans, Eclipse y
IntelliJIDEA. No obstante la mayor parte del trabajo se ha realizado con editores
simples.

2. Entre enero y julio de 2007 se ha profundizado en el estado del arte de la arquitectura de


las aplicaciones telefónicas IP y se ha hecho un estudio de su arquitectura (pp 7) y de los
organismos de estandarización (pp 19) involucrados.
5.3. LÍNEAS DE FUTURO 57

5.3. Líneas de futuro


El trabajo realizado deja campos pendientes de explorar que abren las puertas a posibles
trabajos que seria interesante abarcar en el futuro.

1. Fusionar los prototipos: la linea de futuro más evidente es fusionar los dos prototipos y
dotar a la aplicación de gestión de funcionalidad telefónica, aumentando su versatilidad
y valor real.

2. Desarrollar el prototipo de aplicación de gestión: se podría trabajar en las lineas de


funcionalidades adicionales descritas en la página 26.

3. Otras funciones telefónicas: únicamente se ha hablado de que la aplicación inicie los


eventos llamando o mandando mensajes al usuario pero seria sencillo desarrollar un sis-
tema en el cual los usuarios pudieran llamar a una extensión y acceder a la aplicación a
través de una interfaz de usuario basada en un sistema de IVR (secretaria virtual) para
por ejemplo, consultar o protestar sobre la facturación.

4. Mejorar la voz sintetizada en tiempo real: aparte de usar festival se puede usar MBRO-
LA para mejorar la calidad de la voz generada.

5. Interfaz de usuario dinámica web2.0: se podría hacer mediante el uso de librerías como
Dojo o Prototype. De hecho Dojo viene de serie en struts2 pero no se ha hecho uso de
ella.

5.4. Conclusiones personales


Este proyecto me ha supuesto grandes beneficios a nivel personal y profesional.
Me ha brindado la oportunidad de aprender mejor Java como lenguaje de programación así
como a conocer de los marcos de desarrollo más populares en la actualidad, Spring (pp 74) y
Struts2 (pp 74). He aprendido conceptos como la persistencia de objetos en la base de datos
mediante Hibernate (pp 75) y he aprendido a construir aplicaciones web de modelo 2 (pp 35),
modulares y capaces de escalar con facilidad.
Además el proyecto me ha permitido profundizar en el mundo de la telefonía IP y de te-
ner una excusa para jugar con un montón de herramientas y aplicaciones relacionadas con la
telefonía en Internet.
Por otro lado he aprendido a desarrollar documentación extensa mediante LATEX(pp 78). Fue
un poco complicado al principio pero al final ha valido la pena. Escribir este proyecto habría
sido mucho más costoso con un software de edición de textos wysiwyg1
Personalmente he aprendido mucho sobre organización personal y gestión de proyectos. Hay
que valorar el tiempo que cada uno dispone en su vida y saber planificar su trabajo y el de los
demás de forma adecuada.
1
WYSISYG: What you see is what you get. Se aplica a los procesadores de texto y otros editores de texto con
formato (como los editores de HTML) que permiten escribir un documento viendo directamente el resultado final
58 CAPÍTULO 5. CONCLUSIONES

5.5. Opiniones personales sobre el proyecto y sobre la telefo-


nía IP
1. Sobre los modelos de negocio de las operadoras de voz sobre IP El modelo de negocio
de Jajah y las plataformas VoIP como Skype es sumamente frágil: operan sobre la red
que ofrece su competidor (la operadora tradicional), requieren operaciones en el terminal
cuya configuración provee casi siempre la operadora y no hacen nada que la operadora
no pueda ofrecer a medio plazo. Su vocación es ser el segundo servicio de telefonía
de los usuarios y dependen de que los grandes del sector, los que tienen redes, sigan
manteniéndolas.

2. Sobre el software utilizado Para el desarrollo del proyecto he usado una gran diversidad
de software, siendo la mayor parte de las herramientas usadas software libre. He apren-
dido a manejar una base de datos y he mejorado mis conocimientos del sistema operativo
GNU/Linux. Además he aprendido a escribir documentos con Latex.
Por otro lado he aprendido la lección de no usar software inestable sobre todo si no
conoces bien la tecnología. Durante el desarrollo del proyecto he perdido mucho tiempo
jugando con Appfuse2, una plataforma que a día de hoy (julio, 2007) no esta madura
todavía y que presenta muchos errores. Si a los errores de la plataforma le sumamos
que las capas abstracción nos alejan de los procesos que están ocurriendo muchas veces
perdía la noción de qué es lo que estaba pasando realmente y se complicaba mucho el
desarrollo.

3. Integración de la voz en aplicaciones complejas La voz sobre IP por si misma es útil


pero hay un mercado abierto sin explotar de integración de pequeños servicios de teleco-
municación con las aplicaciones normales. En grandes proyectos con mucha funcionali-
dad telefónica es mejor basarse en estándares que implementen todas las funcionalidades.
Por ejemplo en proyectos que consistan en construir aplicaciones completas de telefonía
yo recomiendo el uso de mobicents que es la implementación libre de JSLEE. Por ejem-
plo podemos usar JSLEE para construir una centralita VoIP.
No obstante para pequeñas aplicaciones con funcionalidad voz IP como el segundo pro-
totipo desarrollado en este proyecto es mas práctico desarrollarlo con pequeñas APIs en
Java, PHP, Ruby, Python y TCL que con entornos complicados JSLEE.

4. Sobre los entornos de desarrollo Programar en java es mucho más sencillo con un
entorno de desarrollo que libre al programador de tareas repetitivas y le asista al escribir
el código. Sobre la opinión que me merece cada uno, Eclipse es muy lento, complicado
de usar y además para dotarle de funcionalidad hay que añadirle un montón de plugins
de terceros, algunos de los cuales son comerciales. IntelliJIDEA es el editor que se ha
convertido en mi favorito. Es rápido y es sencillo de usar. Es comercial pero creo que
para un uso profesional valdría la pena.
Apéndice A

Anteproyecto

El anteproyecto mostrado en las siguientes páginas fue presentado y aceptado por el direc-
tor del proyecto (Ricardo Sosa) durante el mes de Junio de 2006. Es un anteproyecto muy
distanciado del resultado final ya que presentaba unos objetivos poco ambiciosos en el qué úni-
camente se pretencia construir el prototipo de aplicación de intranet Java para gestión de una
pyme. Fue a finales del año 2007 cuando comencé a pensar en añadir una cierta funcionalidad
VoIP, aspecto que finalmente acabó centrando el tema del proyecto.

59
60 APÉNDICE A. ANTEPROYECTO

Universidad Alfonso X El Sabio


Escuela Politécnica
Anteproyecto

Desarrollo de aplicación de gestión en


Java,Spring y Hibernate

Autor
David Grajal Blanco 43118
[email protected] +34653332061

Julio de 2006
61

Título:
Desarrollo de aplicación de gestión en Java5,Spring y Hibernate

Autor:
David Grajal Blanco

Tutor:
Ricardo Sosa

Keywords:
JSP, servlets, JavaScript, DOM, Velocity, J2EE, Web Services, Spring, Hibernate, Tomcat,
PostgreSQL, Prototype, HTML, CSS2, DOM, Velocity

Breve descripción:
El proyecto se plantea como un caso práctico de diseño, análisis, desarrollo e
implementación de una aplicación J2EE haciendo uso del framework Spring. En vez de
realizar un estudio extenso sobre J2EE se realizará el proyecto con el objetivo de
desarrollar un prototipo software funcional. Por el camino se obtendrá un ámplio
conocimiento de las tecnologías involucradas.

Metodología y fases de desarrollo:

1. Documentación, construcción de la plataforma de pruebas e integración de


tecnologías.

En esta fase aprenderemos los necesario para poner en marcha el proyecto. La idea es ir
aproximándonos de forma progresiva desde un sistema operativo recién instalado a la
plataforma de desarrollo real.

• Instalación de Java y Ant.


• Instalación básica de Tomcat: Cómo es la estructura de directorios. Variables de
entorno JAVA_HOME y ANT_HOME y cuales los los ficheros XML de configuración
importantes. Manager de Tomcat.
• Funcionamiento de Ant. Ficheros build.properties y build.xml
• Patrones: Modelo-vista-controlador (MVC), Inversion de control (IOC), Aspect
Oriented Programming (AOC), Data Access Object (DAO), SessionFacade,
• Aplicaciones web de modelo 2 (MVC). Estructura de directorios de una aplicación
MVC.
• Lógica de negocio en el controlador
• Control de logs con log4j
• JSP. Ficheros de cabecera JSP. Etiquetas JSP Spring
• Creación de DAOs (Objetos de Acceso a Datos)
• Tests de integridad con JUnit

• Aproximación a los editores (Netbeans y Eclipse)


• Instalación de la base de datos postgreSQL. Comunicación entre java y la base de
datos.

2. Definición de las especificaciones del cliente

Se mantendrá una reunión con el cliente en la que se definirán los objetivos de la


aplicación. Se concretará un paquete de funcionalidades básicas y uno de prestaciones
adicionales. Se marcarán unas lineas generales para la interfaz de usuario.
62 APÉNDICE A. ANTEPROYECTO

3. Brainstorming y planificación de la primera fase de análisis, diseño e


implementación.

Para la aplicación seguiremos una metodología de desarrollo de software ágil.


Marcaremos cortos periodos temporales y los llamaremos iteraciones. Cada iteración
durará dos semanas y será como un proyecto software en miniatura que incluirá todas las
tareas necesarias para aumentar la funcionalidad a cada paso: planificación, análisis de
requerimientos, diseño, programación, testeo y documentación. Al final de cada iteración
el software es evaluado y se analizan las posibles mejoras en forma de aumentos de
prestaciones o de soluciones a los errores.

4. Presentación del prototipo preliminar al cliente y feedback

Las dos semanas de desarrollo serán suficientes para desarrollar un prototipo funcional.
Una vez que este terminado el prototipo, se presentará al cliente y con el feedback
recibido se realizará un nuevo brainstorming para solucionar posibles defectos, para
preparar vistas más atractivas y la interfaz de usuario de la aplicación. Después del
brainstorming haremos una nueva planificación para continuar el desarrollo otras dos
semanas.

5. Prototipo avanzado

Una vez que el cliente este satisfecho con el prototipo básico, se plantearán nuevos
objetivos. Entre las posibles mejoras está aumentar la funcionalidad general de la
aplicación haciendo uso del paquete de funcionalidades adicionales, aumentar la facilidad
de uso de la aplicación convirtiéndola en una aplicación dinámica mediante javascript y
DOM y aumentar la escalabilidad para que soporte un numero de usuarios simultáneos
elevado.

Medios a utilizar:

Módulos de la aplicación Java


• Appfuse: Como paquete integrador.
• Spring: Nos proveerá del modelo vista controlador
• Hibernate: Nos proveerá de persistencia de objetos en la base de datos
• Tomcat 5.5.17: Como servidor de aplicaciones
• JSTL/Freemarker/Velocity: Separación entre la interfaz gráfica y el programa java
• Sitemesh: Como decorador
• Log4j: como loggeador
• Junit: Para construir los módulos test de prueba

Otros componentes del sistema


• PostgreSQL: Como base de datos. En principio no la usaremos directamente, solo
estableceremos la comunicación entre la base de datos y Hibernate y a partir de
ese momento todas las consultas las realizaremos a través de Hibernate en su
propio lenguaje o en SQL
• Prototype: Para realizar una interfaz de usuario dinámica.

Herramientas de desarrollo
• SVN: Para mantenimiento de un repositorio de código.
• Eclipse: Como editor de texto. No se necesitará la integración con Tomcat ni con
63

SVN. Los despliegues se realizarán desde linea de comandos mediante Ant .


• Ant: Para facilitar el despliegue de los servlets.
• TRAC: Para seguimiento de bugs y visualizar el repositorio SVN del proyecto.
• Poseidon/Rational Rose/Dia: Modelado de software.

Bibliografía:

● Artículo “Agile, Multidisciplinary Teamwork” por Gautam Gosh


● Artículo “Iterative and Incremental Development:A Brief History” Larman, Craig
and Basili, Victor R. IEEE Computer, June 2003
● Artículo “What I Learned Teaching XP” Tomek, Ivan.
● Libro “Spring Live!” Matt Raible
● Libro “Pro Spring” Rob Harrop, Jan Machacek.
64 APÉNDICE A. ANTEPROYECTO
Apéndice B

Herramientas utilizadas para el desarrollo


del proyecto

Es interesante comentar que desde que la máquina virtual java de SUN fue liberada, todas
las aplicaciones utilizadas para el desarrollo del proyecto y para la documentación del proyecto
son software libre a excepción de IntelliJ IDEA, del programa de edición de video no lineal
con el que se han hecho los vídeos que ilustran el funcionamiento de los prototipos y de las
librerias de SUN que aún no han sido liberadas como software libre.
En el año 2004 un conjunto de auditores y expertos en internet recomendaron al estado
de California en USA que considerara software libre y VoIP como dos medidas para recortar
gastos. Era una señal de que el software libre y la VoIP irán de la mano los próximos años y
unidos, comerán parte del mercado de las telecomunicaciones a nivel global.

65
66APÉNDICE B. HERRAMIENTAS UTILIZADAS PARA EL DESARROLLO DEL PROYECTO

B.1. GNU/Linux

Figura B.1: Logotipo de Debian

Linux es la denominación de un sistema operativo unix y el nombre de un núcleo de siste-


ma operativo. Es uno de los paradigmas más prominentes del software libre y del desarrollo
del código abierto, cuyo código fuente está disponible públicamente, para que cualquier per-
sona puede libremente usarlo, estudiarlo, redistribuirlo y, con los conocimientos informáticos
adecuados, modificarlo.
Este proyecto se ha realizado mayoritariamente sobre un sistema operativo GNU/Linux De-
bian Etch 4.0 y se ha usado muchas de las herramientas de código abierto que acompañan al
sistema.

B.2. Plataforma telefónica de código abierto Asterisk


Asterisk es una plataforma telefónica completa. Puede ser usada como centralita telefónica
(PBX) pero realmente es un software de conectividad entre distintas tecnologías telefónicas
(SIP,H.323,IAX,PSTN) y aplicaciones vinculadas a la telefonía, como por ejemplo, las confe-
rencias, transferencia de llamadas, llamdas a tres, buzones de voz, etc. Como centralita, permite
que cualquier número de extensiones se llamen entre sí y puede ser usada como pasarela entre
los teléfonos internos y la red telefónica tradicional.
Asterisk esta disponible con una licencia dual, por un lado la licencia GPL y por el otro una
licencia propietaria que permite el uso de código patentado, como el codec de audio G.729.
Debido a la naturaleza libre del software, multitud de programadores han contrubuido con
mejoras y nuevas funcionalidades. Asterisk fue originalmente desarrollado para el sistema ope-
rativo GNU/Linux, pero también funciona en BSD, MacOSX, Solaris y Microsoft Windows,
aunque la plataforma nativa (GNU/Linux) es la mejor soportada de todas.
Los canales de comunicación pueden ser SIP (pp 8), Jingle (pp 8) o IAX2 (pp 8) en comuni-
caciones de voz sobre IP o bien ZAP1 , ISDN2 , PRI3 o BRI4 para las comunicaciones que hacen
uso de hardware específico que permite a Asterisk conectarse a la PSTN5 .
El creador de Asterisk es Mark Spencer, también fundador de Digium, que es la empresa
motor del desarrollo de Asterisk y de su expansión comercial. Asterisk incluye muchas ca-
racterísticas sólo disponibles en caros sistemas propietarios PBX: buzón de voz, conferencias,
1
ZAP son las tarjetas para PCs que permiten conectar las redes telefónicas con redes de datos
2
ISDN: RDSI, Red Digital de Servicios Integrados.
3
PRI: Primary rate interface. Estandar de telecomunicaciones
4
BRI: Basic Rate Interface. Una configuración de RDSI
5
PSTN: Public switched telephone network. Es la red telefónica por conmutación de cirtuitos tradicional
B.2. PLATAFORMA TELEFÓNICA DE CÓDIGO ABIERTO ASTERISK 67

IVR, distribución automática de llamadas, y otras muchas más. Los usuarios o terceras empre-
sas pueden crear nuevas funcionalidades e integrar sus servicios de telecomunicación a través
de las siguientes interfaces:

1. AGI/FastAGI
La primera interfaz se denomina AGI6 , que permite a una aplicación externa ser ejecutada
para permitir accesos a datos externos o para incluir lógica en la gestión de las llamadas
entrantes y salientes. La aplicación AGI puede ser escrita en prácticamente cualquier
lenguaje (Perl, PHP, C/C++, Java, Pascal, Bash, etc) y acceder a casi cualquier base de
datos (ODBC, MySQL, Postgres, Oracle, etc). Ejemplos de uso de AGI podrian ser el
abrir un nuevo ticket en un centro de asistencia técnica al recibir una llamada o integrar
sistemas de sintetizado de voz en tiempo real7 .
Muy parecido a AGI es FastAGI, que permite ejecutar una aplicación AGI a través de un
socket TCP situada en otro servidor. Esto permite descargar a Asterisk de carga extra.

2. Manager API
El Manager es una interfaz que permite controlar la plataforma Asterisk por aplicaciones
de terceros, conectándose a través de una conexión telnet o TCP para ejecutar acciones
como originar llamadas, monitorización de las llamadas y de eventos, grabación de las
llamadas etc.

3. Aynchronous Javascript Asterisk Manager (AJAM)


AJAM es una tecnología reciente (disponible desde Asterisk 1.4) que permite a los nave-
gadores, a las páginas web o a otras aplicaciones HTTP acceder directamente a la interfaz
Manger (AMI) via HTTP.

B.2.1. Librería Asterisk-Java


Asterisk-Java es la librería de intercomunicación entre Java y Asterisk. Soporta toda la fun-
cionalidad de Asterisk 1.4, incluido la comunicación a través del gestor de Asterisk y del AGI.
La última versión de Asterisk-Java tambien soporta la nueva API LIVE de Asterisk 1.4.
Para construir el prototipo usaremos Asterisk-Java porque nos simplifica el modelo y permite
un desarrollo más rápido de la aplicación. Para casos de uso más completos o para construir una
plataforma de comunicaciones completa seria mejor usar JSLEE con mobicents. JSLEE puede
ser usado como una capa de middleware entre la aplicación web y asterisk en proyectos que
requieran mucha funcionalidad telefónica pero una aplicación como la que se ha desarrollado
en este prototipo únicamente necesita funcionalidades básicas como registrarse en un canal, y
recoger y efectuar llamadas en ese canal.

B.2.2. TrixBox
Trixbox es una distribución de Linux que una vez instalada puede satisfacer todas las ne-
cesidades telefónicas de pequeñas y medianas empresa. Internamente esta basada en CentOS,
una version de linux libre de Red Hat Enterprise Linux. La interfaz de usuario de TrixBox era
6
AGI: Application Gateway Interface
7
TTS: Text to speech
68APÉNDICE B. HERRAMIENTAS UTILIZADAS PARA EL DESARROLLO DEL PROYECTO

FreePBX hasta la versión 2.2 donde ha empezado a usar la interfaz de administración web de
asterisk. Trixbox viene de serie con una aplicacion de CRM llamada SugarCRM.
En el PFC trixbox fue usado para las primeras pruebas con Asterisk pero rápidamente fue
descartado porque de serie es una distribución compleja con demasiadas opciones y yo nece-
sitaba una instalación limpia de Asterisk para saber exactamente que es lo que pasaba en cada
momento.

Figura B.2: Trixbox 2.2 interfaz web

B.2.3. AsteriskNOW Beta5 0.9.5-x86

Instalada en junio de 2007 como imagen de VMWare para probar las novedades de Asterisk
1.4 respecto a la versión 1.2 que es con la que se ha desarrollado el proyecto. AsteriskNow
es una distribución oficial de Asterisk porque viene directamente de Digium8 . A diferencia de
trixbox, no lleva la aplicación SugarCRM.
Como trixbox, en el desarrollo del proyecto AsteriskNow únicamente se usó para hacer prue-
bas hasta que se decidió usar un Asterisk limpio.

8
Digium, Inc. es una empresa americana especializada en el desarrollo de productos de telefonía. La empresa
es el principal desarrollador de Asterisk, la plataforma telefónica libre.
B.3. ENTORNO JAVA 69

Figura B.3: AsteriskNow beta 5 arrancado

Figura B.4: AsteriskNow beta 5 interfaz de usuario web

B.3. Entorno Java


Java es un lenguaje de programación orientado a objetos desarrollado por Sun Microsystems
a principios de los años 1990. Las aplicaciones Java están típicamente compiladas en un by-
tecode, aunque la compilación en código máquina nativo también es posible. En el tiempo de
ejecución, el bytecode es normalmente interpretado o compilado a código nativo para la ejecu-
ción, aunque la ejecución directa por hardware del bytecode por un procesador Java también es
posible.
70APÉNDICE B. HERRAMIENTAS UTILIZADAS PARA EL DESARROLLO DEL PROYECTO

En el proyecto se ha usado Java 1.5 para el desarrollo del primer prototipo (capítulo 3 pp 25)
y Java 1.6 para el desarrollo del segundo prototipo (capítulo 4 pp 51)

B.3.1. Configuración del entorno Java en Linux


Lo primero es descargar las ultimas versiones del JDK de java, de tomcat y de ant.
Una vez descomprimidos es necesario definir las variables de entorno $JAVA_HOME, $CA-
TALINA_HOME y $ANT_HOME de la siguiente manera
1 export JAVA\_HOME=/java/jdk1.5.0/ export CATALINA\_HOME=/www/tomcat/tomcat/ export ANT\_HOME=~/java/ant/ant/

Además es necesario añadir al path los ficheros ejecutables


1 export PATH=\$PATH:\$JAVA\_HOME/bin:\$ANT\_HOME

Lo mejor es añadir estas lineas al .bash_profile para que nos quede configurado al arrancar.

B.3.2. Configuración del entorno Java en Windows


1. Para establecer las variables de entorno en Windows hay que ir a Panel de Control >Sis-
tema, o Mi PC >Propiedades.
2. Seleccionar la pestaña Opciones Avanzadas y seleccionar Variables de entorno.
3. Entroducimos las siguientes variables:
HOME = c:\Source
SDKS_HOME = c:\SDKs
TOOLS_HOME = c:\Tools
JAVA_HOME = SDKS_HOME\j2sdk-1.6.1
ANT_HOME = TOOLS_HOME\apache-ant-1.6.2
CATALINA_HOME = TOOLS_HOME\jakarta-tomcat-5.5.17
Añada a la variable PATH: JAVA_HOME\bin;ANT_HOME\bin;
CATALINA_HOME\bin;MYSQL_HOME\bin

B.4. PostgreSQL

Figura B.5: Logotipo de postgresql


B.4. POSTGRESQL 71

PostgreSQL es un motor de base de datos, es servidor de base de datos relacional libre,


liberado bajo la licencia BSD.

Cómo exportar el esquema de la base de datos


Es necesario hacer un dump. Se hace con el comando "pg_dump [base de datos]". Tiene una
opción -create que sirve para incluir las sentencias necesarias para crear la BD en el dump.
El siguiente ejemplo es un dump de la base de datos sin tablas ni objetos.

1 dgrabla@alderaan:~/www/pgsql/bin\$ ./pg_dump --create idagesPFC


2 --
3 -- PostgreSQL database dump
4 --
5
6 SET client_encoding = ’LATIN1’;
7 SET check_function_bodies = false;
8 SET client_min_messages = warning;
9
10 --
11 -- Name: idagesdb; Type: DATABASE; Schema: -; Owner: root
12 --
13
14 CREATE DATABASE idagesdb WITH TEMPLATE = template0 ENCODING = ’LATIN1’;
15
16
17 ALTER DATABASE idagesPFC OWNER TO root;
18
19 \connect idagesPFC
20
21 SET client_encoding = ’LATIN1’;
22 SET check_function_bodies = false;
23 SET client_min_messages = warning;
24
25 --
26 -- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: dgrabla
27 --
28
29 COMMENT ON SCHEMA public IS ’Standard public schema’;
30
31
32 --
33 -- Name: public; Type: ACL; Schema: -; Owner: dgrabla
34 --
35
36 REVOKE ALL ON SCHEMA public FROM PUBLIC;
37 REVOKE ALL ON SCHEMA public FROM dgrabla;
38 GRANT ALL ON SCHEMA public TO dgrabla;
39 GRANT ALL ON SCHEMA public TO PUBLIC;
40
41
42 --
43 -- PostgreSQL database dump complete
44 --

Cómo recuperar un dump


Una vez tengamos un dump en el formato adecuado se puede insertar en la BD muy fa-
cilmente con el comando pg_restore. Usaremos -c (clean) si la base de datos ya existe y -C
(create) si no existe.

1 pg\_dump -Ft -b db >db.tar


2 pg\_restore -d db db.tar

B.4.1. PhpPGadmin
phppgadmin es una herramienta escrita en PHP para gestionar la administración de un servi-
dor PostgreSQL.
72APÉNDICE B. HERRAMIENTAS UTILIZADAS PARA EL DESARROLLO DEL PROYECTO

Figura B.6: PhPPGadmin

B.5. Mysql

MySQL es un sistema de gestión de base de datos relacional, multihilo y multiusuario.


MySQL se ofrece como software libre en un esquema de licenciamiento dual. Por un lado
se ofrece bajo la GNU GPL, pero, empresas que quieran incorporarlo en productos comerciales
pueden comprar a la empresa una licencia que les permita ese uso.
En este proyecto se usó durante las primeras fases del prototipo de aplicación de gestión
hasta que fue sustituido por PostgreSQL.

B.5.1. PHPmyadmin

phpMyAdmin es una herramienta escrita en PHP para gestionar la administración de un


servidor Mysql.

Figura B.7: PhPMysqladmin


B.6. APLICACIONES USADAS PARA EL DESARROLLO DE LOS PROTOTIPOS 73

B.6. Aplicaciones usadas para el desarrollo de los prototipos


B.6.1. Subversion

Figura B.8: Logotipo de Subversion

Subversion es un software de sistema de control de versiones diseñado específicamente para


reemplazar al popular CVS, el cual posee varias deficiencias. Es software libre bajo una licencia
de tipo Apache/BSD y se lo conoce también como svn por ser ese el nombre de la herramienta
de línea de comandos.

B.6.2. Anthill
Ver anexo C en la página 83.

B.6.3. Servidor de aplicaciones Tomcat

Figura B.9: Logotipo de Tomcat

Tomcat es un servidor web con soporte de servlets y JSPs. Incluye el compilador Jasper, que
compila JSPs convirtiéndolas en servlets. Tomcat puede funcionar como servidor web por sí
mismo. En sus inicios existió la percepción de que el uso de Tomcat de forma autónoma era
sólo recomendable para entornos de desarrollo y entornos con requisitos mínimos de velocidad
y gestión de transacciones. Hoy en día ya no existe esa percepción y Tomcat es usado como
servidor web autónomo en entornos con alto nivel de tráfico y alta disponibilidad.
Dado que Tomcat fue escrito en Java, funciona en cualquier sistema operativo que disponga
de la máquina virtual Java.

B.6.4. Servidor de aplicaciones Jetty


Jetty es un servidor HTTP y contenedor de aplicaciones de código abierto, basado en estan-
dares y de gran funcionalidad implementado completamente en Java. Su licencia es la Apache
2.0 y su primera versión de 1995. Jetty se usa en proyectos como los servidores de aplicacio-
nes JBoss y Geronimo. El desarrollo de Jetty está enfocado en crear un servidor web pequeño,
sencillo y eficiente. Debido a su pequeño tamaño, Jetty es adecuado para ofrecer servicios web
en aplicaciones Java integradas. En este prototipo se usa Jetty en vez de tomcat como en el
primero por su sencillez y rapidez.
74APÉNDICE B. HERRAMIENTAS UTILIZADAS PARA EL DESARROLLO DEL PROYECTO

B.6.5. Appfuse

Figura B.10: Logotipo de Appfuse

Appfuse es un marco de trabajo para Java EE. Permite a los desarrolladores comenzar rápi-
damente un proyecto integrando tecnologias como Spring, Hibernate y Struts.

B.6.6. Struts2

Figura B.11: Logotipo de Struts2

Struts es un entorno de desarrollo de aplicaciones Web bajo el patrón MVC bajo la platafor-
ma J2EE (Java 2, Enterprise Edition). Struts esta enfocado a reducir el tiempo de desarrollo.
Struts29 es tambien llamado WebWork2. WebWork es un entorno de desarrollo independiente
especificamente diseñado para mejorar la productividad. En el año 2005 el equipo de desarrollo
de WebWork se unió al de Struts para trabajar en un entorno de trabajo de forma conjunta. Se
partió de la base de WebWork 2.2 y se adopto como la versión 2.0 de Struts.
Struts2 se ha usado en este proyecto como marco de desarrollo del prototipo VoIP (pp 51)

B.6.7. Spring

Figura B.12: Logotipo de Spring

El Spring Framework (también conocido simplemente como Spring) es un framework de


código abierto de desarrollo de aplicaciones para la plataforma Java. La primera versión fue
escrita por Rod Jonhson, quien lo lanzó primero con la publicación de su libro Expert One-on-
One Java EE Design and Development10 . También hay una versión para la plataforma .NET,
Spring.net.
El framework fue lanzado inicialmente bajo Apache 2.0 License en junio de 2003. El primer
gran lanzamiento hito fue la versión 1.0, que apareció en marzo de 2004 y fue seguida por otros
hitos en septiembre de 2004 y marzo de 2005.
9
Struts2: http://struts.apache.org/2.x/
10
Wrox Press, octubre 2002
B.6. APLICACIONES USADAS PARA EL DESARROLLO DE LOS PROTOTIPOS 75

A pesar de que Spring Framework no obliga a usar un modelo de programación en particular,


se ha popularizado en la comunidad de programadores en Java al considerársele una alterna-
tiva y sustituto del modelo de Enterprise JavaBean. Por su diseño el framework ofrece mucha
libertad a los desarrolladores en Java y soluciones muy bien documentadas y fáciles de usar,
prácticas comunes en la industria.

B.6.8. Hibernate

Figura B.13: Logotipo de hibernate

Hibernate es una capa de persistencia objeto/relacional que se coloca entre la base de datos
y nuestra aplicación. Permite diseñar objetos persistentes que podrán incluir polimorfismo,
relaciones, colecciones, y un gran número de tipos de datos. Uno de los posibles procesos de
desarrollo consiste en, una vez tengamos el diseño de datos realizado, mapear este a ficheros
XML siguiendo la DTD de mapeo de Hibernate. Desde estos podremos generar el código de
nuestros objetos persistentes en clases Java y también crear BBDD independientemente del
entorno escogido.

B.6.9. Sitemesh
SiteMesh es un marco de trabajo para maquetar los contenidos de una aplicación web com-
pleja para sitios web muy grandes. Con sitemesh es facil crear sitios web muy grandes con una
apariencia, una navegación y una estructura consistente.

B.6.10. Maven2
Maven es una herramienta software para la gestión de proyectos Java. Estaba integrado den-
tro del proyecto Jakarta pero ahora ya es un proyecto de nivel superior de la Apache Software
Foundation.
En la versión 1, basándose en un fichero de configuración en XML (project.xml) y una serie
de plugins, esta herramienta puede compilar el proyecto Java, ejecutar tests, generar paquetes
(jars, wars, ears o distribuciones en zip) y generar una serie de informes. La versión 2 usa
también un fichero de configuración en XML llamaddo pom.xml. Su funcionalidad es parecida
a Apache Ant de manera que permite compilar, ejecutar test o realizar distribuciones pero
con la diferencia que trata de forma automática las dependencias del proyecto. Una de las más
importantes características es su actualización en línea mediante servidores repositorios. Maven
es capaz de descargar nuevas actualizaciones de las bibliotecas de las que depende el proyecto y
de igual manera subir una nueva distribución a un repositorio de versiones, dejandola al acceso
de todos los usuarios.
Maven2 se ha usado en este proyecto para la gestión de la compilación del prototipo de
aplicación VoIP (pp 51)
76APÉNDICE B. HERRAMIENTAS UTILIZADAS PARA EL DESARROLLO DEL PROYECTO

B.6.11. Ant
Apache Ant es una herramienta usada en programación para la realización de tareas mecáni-
cas y repetitivas, normalmente durante la fase de compilación y construcción (build). Es similar
a Make pero sin las engorrosas dependencias del sistema operativo.
Esta herramienta, hecha en Java, tiene la ventaja de no depender de las órdenes de shell de
cada sistema operativo, sino que se basa en archivos de configuración XML y clases Java para
la realización de las distintas tareas, siendo idónea como solución multi-plataforma.
Ant se ha usado en este proyecto para la gestión de la compilación del prototipo de aplicación
de gestión (pp 25)

B.6.12. Festival
Festival es un sintetizador de voz en tiempo real de código abierto que se ha usado en el
segundo prototipo para hacer TTS (Text-to-speech)

B.7. Softphones
Un Softphone (en inglés combinación de Software y de Telephone) es un programa que hace
una simulación de teléfono convencional en un ordenador. Permite usar la computadora para
hacer llamadas telefónicas con los protocolos de voz sobre IP a través de una red de datos.

B.7.1. X-Lite 3.0

Figura B.14: X-lite 3.0

X-Lite es un softphone propietario SIP desarrollador por CounterPath. En este proyecto se ha


usado para hacer pruebas en windows ya que es el mejor softphone gratuito que he conseguido
encontrar.
B.7. SOFTPHONES 77

B.7.2. Ekiga

Figura B.15: Lopotipo de Ekiga

Ekiga, anteriormente llamado GnomeMeeting, es una aplicación de software libre para reali-
zar videoconferencias y telefonía por IP para GNOME. Usa el hardware o software compatible
con H.323 (como Microsoft Netmeeting) y se libera bajo licencia GPL.
En este proyecto se ha usado para hacer pruebas en Linux ya que en mi opinión es el mejor
softphone que existe para este sistema operativo.

B.7.3. Gizmo
Gizmo es el cliente SIP propietario de la red de mensajeria instantánea y VoIP de mismo
nombre que fué ya descrita en la página 14.

B.7.4. Wengophone

Figura B.16: Captura de pantalla de wengophone


78APÉNDICE B. HERRAMIENTAS UTILIZADAS PARA EL DESARROLLO DEL PROYECTO

En la página 14 ya hablamos de Wengo. WengoPhone Classic es el softphone SIP de Open-


Wengo que promete hacer llamadas a otros usuarios de softphone SIP y también a teléfonos
convencionales independientemente del proveedor. Es un software libre bajo la licencia GNU
GPL.

B.8. Documentación LATEX

TEX/LATEXes sin duda el sistema de edición de documentos más potente en la actualidad. La


presente documentación ha sido escrita utilizando LATEX 2ε con la ayuda de tres herramientas:

B.8.1. JabRef

Figura B.17: JabRef

JabRef11 es una aplicación para gestionar la bibliografía en formato BibTeX. Jabref propor-
ciona una interfaz sencilla para editar los archivos de BibTex, para importar información desde
bases de datos científicas y para gestionar y buscar archivos BibTex. Esta escrita en Java con
una licencia libre y tiene soporte para Windows, Linux y MacOS X.

11
http://jabref.sourceforge.net/
B.8. DOCUMENTACIÓN LATEX 79

B.8.2. Kile

Figura B.18: Captura de pantalla de kile mientras edito este mismo texto

Kile12 es un entorno integrado para la edición de LATEX. Kile tiene una interfaz amigable para
editar el codigo fuente LATEX. Hay versión para MacOS X y para Linux usando el escritorio
KDE.

B.8.3. Rubber
Rubber13 es un programa para gestionar todas las tareas relacionadas con la compilación de
documentos en LATEX. Esto incluye compilar el documento en si mismo tantas veces como sea
necesario para que todas las referencias queden definidas y ejecutar bibtex para gestionar las
referencias bibliográficas.

B.8.4. LATEXBeamer Class 3.07


La clase beamer14 se ha usado para crear la presentación en PDF.

B.8.5. Keyjnote
KeyJnote15 es el programa usado para hacer la presentación y defensa del PFC. Utiliza dia-
positivas PDF pero es capáz de hacer efectos gráficos entre las páginas del PDF.
Para ver la presentación lanzamos Keyjnote con el siguiente comando:

keyjnote -g 1024x768 presentacion.pdf


12
http://kile.sourceforge.net/
13
http://www.pps.jussieu.fr/~beffara/soft/rubber/
14
http://latex-beamer.sourceforge.net/
15
http://keyjnote.sourceforge.net/
80APÉNDICE B. HERRAMIENTAS UTILIZADAS PARA EL DESARROLLO DEL PROYECTO

B.9. Otras herramientas


B.9.1. Dia

Figura B.19: Captura de pantalla de Dia

Dia es una aplicación gráfica para GNU/Linux de propósito general para la creación de dia-
gramas, desarrollada como parte del proyecto GNOME. Está concebido de forma modular, con
diferentes paquetes de formas para diferentes necesidades.
Dia está diseñado como un sustituto de la aplicación comercial Visio de Microsoft. Se puede
utilizar para dibujar diferentes tipos de diagramas. Actualmente se incluyen diagramas entidad-
relación, diagramas UML, diagramas de flujo, diagramas de redes, diagramas de circuitos eléc-
tricos, etc. Nuevas formas pueden ser fácilmente agregadas, dibujándolas con un subconjunto
de SVG e incluyéndolas en un archivo XML.
En este proyecto se ha usado dia para crear todos los diagramas de la documentación.

B.9.2. Gimp

Figura B.20: Captura de pantalla de Gimp


B.9. OTRAS HERRAMIENTAS 81

GIMP (GNU Image Manipulation Program) es un programa de manipulación de imágenes


del proyecto GNU. Se publica bajo la licencia GNU General Public License.
Es la alternativa más firme del software libre al popular programa de retoque fotográfico Pho-
toshop. La primera versión se desarrolló para sistemas Unix y fue pensada especialmente para
GNU/Linux, sin embargo actualmente (versión 2.2) existen versiones totalmente funcionales
para Windows y para Mac OS X.

B.9.3. Twiki

Figura B.21: Logotipo de Twiki

TWiki es un wiki estructurado, tipicamente usado en plataformas colaborativas. En el des-


arrollo del proyecto se ha usado para hacer las primeras versiones de la documentación ya que
es mucho más cómodo para escribir y unir ideas sin necesidad de aplicar formato al texto.

B.9.4. Audacity

Figura B.22: Captura de pantalla de Audacity

Audacity es un programa multiplataforma de grabación y edición de sonidos fácil de usar, de


libre uso y de código abierto distribuido bajo licencia GPL. Debido a su calidad ha sido intro-
ducido en numerosas distribuciones GNU/Linux al ser uno de los programas libres de edición
de sonido más fiable y avanzado que existe actualmente. En este proyecto se ha usado para
editar el audio de los videos que ilustran el funcionamiento de los prototipos y que acompañan
al proyecto.
82APÉNDICE B. HERRAMIENTAS UTILIZADAS PARA EL DESARROLLO DEL PROYECTO

B.9.5. Kpdf

Figura B.23: Captura de pantalla de Kpdf

KPDF es un lector libre de PDF integrado en el entorno de escritorio KDE y basado en Xpdf.
Apéndice C

Instalación de Anthill

AntHill es una herramienta que proporciona un proceso de compilación y promueve el co-


nocimiento compartido dentro de una organización. AntHill realiza un checkout de la última
versión existenten en el repositorio SVN antes de tratar de compilar y marca con una etiqueta
despues de cada intento. Anthill además actualiza una página web en la intranet con comenta-
rios del último proceso de compilación. Anthill es una extensión del proyecto ApacheAnt y es
compatible con las versiones 1.3, 1.4 y 1.5 de Ant. Anthill es OpenSource y se distribuye bajo
una licencia compatible con Mozilla.

C.1. Instalación de Anthill


1. Instalar subversion
Instalamos subversion ya que es la tecnología que usamos en el repositorio.

2. Instalar Java y Tomcat en el build server


Descomprimimos el JDK en /usr/local/java/java. Es el $JAVA_HOME Descomprimimos
tomcat en /usr/local/java/tomcat. Es el $CATALINA_HOME
Instalamos un nuevo script de inicio en /etc/init.d/david_java_tomcat

3. Bajamos la versión GPL de AntHill de su página web y lo descomprimimimos.

1 bob:/usr/local/java/anthill# tar -xzf anthill-1.8.1.303.tar.gz

4. Copiamos el war al directorio raiz de tomcat

1 bob:/usr/local/java/anthill# cp dist/anthill.war /usr/local/java/tomcat/webapps/

Y vemos que el servidor arranca adecuadamente

1 bob:/usr/local/java# /usr/local/java/tomcat/bin/catalina.sh run


2 Using CATALINA_BASE: /usr/local/java/tomcat/
3 Using CATALINA_HOME: /usr/local/java/tomcat/
4 Using CATALINA_TMPDIR: /usr/local/java/tomcat//temp
5 Using JRE_HOME: /usr/local/java/java/
6 Jul 23, 2006 1:10:01 PM org.apache.catalina.core.AprLifecycleListener lifecycleE
7 vent
8 INFO: The Apache Tomcat Native library which allows optimal performance in produ
9 ction environments was not found on the java.library.path: /usr/local/java/jdk1.
10 5.0_07/jre/lib/i386/client:/usr/local/java/jdk1.5.0_07/jre/lib/i386:/usr/local/j
11 ava/jdk1.5.0_07/jre/../lib/i386

83
84 APÉNDICE C. INSTALACIÓN DE ANTHILL

12 Jul 23, 2006 1:10:01 PM org.apache.coyote.http11.Http11BaseProtocol init


13 INFO: Initializing Coyote HTTP/1.1 on http-8080
14 Jul 23, 2006 1:10:01 PM org.apache.catalina.startup.Catalina load
15 INFO: Initialization processed in 2902 ms
16 Jul 23, 2006 1:10:02 PM org.apache.catalina.core.StandardService start
17 INFO: Starting service Catalina

5. Ahora ya podemos ir a http://10.58.1.5:8080/anthill/ y ver la pantalla de de Anthill. La


primera vez que entremos nos pide una configuración. En concreto nos pide la ruta donde
se encuentra Anthill

Figura C.1: Anthill nos solicita la ruta de instalación

Ahora podemos ver la pantalla principal de anthill


C.1. INSTALACIÓN DE ANTHILL 85

Figura C.2: Pantalla principal de Anthill

6. Lo primero es entrar en las propiedades de anthill y modificar el host por el nombre del
nuestro. (Si no, al hacer el refresco perderemos la pantalla)

7. Vamos a comprobar que todo funciona adecuadamente forzando una build del programa
de prueba. Este se bajará un proyecto software de ejemplo de la web de la empresa que
desarrolla anthill y trata de pasarle los test.
Pulsamos en build y en la siguiente pantalla forzamos la build y seguimos adelante.
En los logs de tomcat veremos mucho movimiento mientras Anthill se baja del reposito-
rio los cambios y trata de compilar y pasar los test.

1 The ’ characters around the executable and arguments are


2 not part of the command.
3
86 APÉNDICE C. INSTALACIÓN DE ANTHILL

4 WorkingDir: none
5
6 Executing: cd /usr/local/java/anthill/work
7 Executing: cvs -d :pserver:[email protected]:/usr/local/anthill-test check
8 out -A Anthill-Example
9 cvs checkout: warning: failed to open /root/.cvspass for reading: No such file or directory
10 cvs server: Updating Anthill-Example
11 cvs server: Updating Anthill-Example/build
12 U Anthill-Example/.cvsignore
13 U Anthill-Example/ivy.xml
14 U Anthill-Example/build/build.bat
15 U Anthill-Example/build/build.ivy.xml
16 U Anthill-Example/build/build.sh
17 U Anthill-Example/build/build.xml
18 U Anthill-Example/build/buildscript.bat
19 U Anthill-Example/build/buildscript.sh
20 U Anthill-Example/build/cpappend.bat
21 U Anthill-Example/build/makefile
22 U Anthill-Example/build/testExitValue.xml
23 cvs server: Updating Anthill-Example/lib
24 U Anthill-Example/lib/junit-3.8.1.jar
25 U Anthill-Example/lib/log4j-1.2.5.jar
26 cvs server: Updating Anthill-Example/lib/build
27 U Anthill-Example/lib/build/j2h.jar
28 U Anthill-Example/lib/build/jdepend-frames.xsl
29 U Anthill-Example/lib/build/xalan.jar
30 U Anthill-Example/lib/build/xdoclet.jar
31 cvs server: Updating Anthill-Example/source
32 cvs server: Updating Anthill-Example/source/java
33 cvs server: Updating Anthill-Example/source/java/example
34 U Anthill-Example/source/java/project.version
35 U Anthill-Example/source/java/example/Widget.java
36 cvs server: Updating Anthill-Example/source/test
37 cvs server: Updating Anthill-Example/source/test/example
38 U Anthill-Example/source/test/example/WidgetTestCase.java
39 cvs server: Updating Anthill-Example/tests
40 (...)
41 U Anthill-Example/source/test/example/WidgetTestCase.java
42 cvs server: Updating Anthill-Example/tests
43 U Anthill-Example/tests/Anthill-Example.run-tests.xml
44 13:20:25:003 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.BuildManager - step
45 2) is project up to date?
46 13:20:25:004 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.BuildManager - step
47 3) Increment version:
48 13:20:25:005 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.adapter.ProjectPrope
49 rtyFileVersionAdapter - Branch from the repository adapter:
50 13:20:25:006 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.adapter.ProjectPrope
51 rtyFileVersionAdapter - Incrementing version: 1.0.2
52 13:20:25:007 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.BuildManager - New
53 version: 1.0.3
54 13:20:25:009 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.BuildManager - Step
55 4) Tag project (if set to all):
56 13:20:25:010 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.BuildManager - Step
57 5) Build Project:
58 13:20:25:027 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.BuildManager - Buil
59 d Project:
60 13:20:25:029 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.adapter.CVSRepositor
61 yAdapter - repository root: :pserver:[email protected]:/usr/local/anthill
62 -test
63 13:20:25:030 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.adapter.CVSRepositor
64 yAdapter - Module: Anthill-Example
65 13:20:25:031 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.adapter.CVSRepositor
66 yAdapter - Branch: null
67 13:20:25:031 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.adapter.CVSRepositor
68 yAdapter - Work directory: /usr/local/java/anthill/work
69 13:20:25:032 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.adapter.CVSRepositor
70 yAdapter - Local project directory: /usr/local/java/anthill/work/Anthill-Example
71 13:20:25:034 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.BuildManager - Buil
72 d Command: /usr/local/java/anthill/lib/ant1.6.2/bin/ant -DdeployDir=/usr/local/java/anthill
73 /publishDir/CVS_Anthill-Example -Dversion=1.0.3 -Dkit=1.0.3 -buildfile /usr/local/java/anth
74 ill/work/Anthill-Example/build/build.xml -logfile /usr/local/java/anthill/publishDir/CVS_An
75 thill-Example/buildLogs/CVS_Anthill-Example-1.0.3-build.log
76 13:20:25:079 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.BuildManager - Expl
77 icity set environment variables:
78 13:20:25:080 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.BuildManager - ANT_
79 HOME=/usr/local/java/anthill/lib/ant1.6.2
80 13:20:25:081 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.BuildManager - Exec
81 ute:Java13CommandLauncher: Executing ’/usr/local/java/anthill/lib/ant1.6.2/bin/ant’ with ar
82 guments:
83 ’-DdeployDir=/usr/local/java/anthill/publishDir/CVS_Anthill-Example’
84 ’-Dversion=1.0.3’
85 ’-Dkit=1.0.3’
86 ’-buildfile’
C.1. INSTALACIÓN DE ANTHILL 87

87 ’/usr/local/java/anthill/work/Anthill-Example/build/build.xml’
88 ’-logfile’
89 ’/usr/local/java/anthill/publishDir/CVS_Anthill-Example/buildLogs/CVS_Anthill-Example-1.0.3
90 -build.log’
91
92 The ’ characters around the executable and arguments are
93 not part of the command.
94
95 WorkingDir: /usr/local/java/anthill/work/Anthill-Example/build
96
97 Buildfile: /usr/local/java/anthill/work/Anthill-Example/build/build.xml
98 13:20:46:593 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.BuildManager - Step
99 6) Tag project (if set to success):
100 13:20:46:593 [Thread - AnthillBuildDaemon] INFO com.urbancode.anthill.BuildManager - Step
101 7) Publish Project:

Si ahora refrescamos la página principal veremos que nos marca el proyecto como en
verde, osea que todo esta OK.

Figura C.3: Compilando proyecto de pruebas

8. Ahora vamos configurar una nueva build. Para ello primero vamos a limpiar toda la pá-
gina eliminando todos los ejemplos excepto el stoppedSchedule.
Pulsamos en Çreate New project.anthill.project.name=idages anthill.version.adapter=com.urbancode.anth
Pulsamos en la configuracion de este parámetro y decimos que el fichero de version es
./version. El contenido inicial de este fichero en el SVN será
1 dgrabla@alderaan:~/svn/idages\$ cat version
2 Idages-1.0.0.0

Cada vez que anthill haga una nighty build incrementará en uno el número de versión.
Ojo pq el SVN no esta documentado!! Ahora modificamos anthill.repository.adapter a
com.urbancode.anthill.adapter.SubversionRepositoryAdapter. En las propiedades deci-
mos que el directorio de trabajo es work. Tambien ponemos la ruta a nuestro repositorio
SVN y decimos cual es el usuario y la contraseña.
anthill.build.script build.xml anthill.build.tag never
88 APÉNDICE C. INSTALACIÓN DE ANTHILL

Ahora añadimos los emails a los que llegarán los reportes: anthill.users David Grajal
[email protected]
Aceptamos los cambios y intentamos hacer una build de prueba.
Fallará.
El problema es que necesitamos acceder una primera vez en modo interactivo para que
svn pueda coger el fingerprint del servidor y a partir de ese momento se "fie"de él.
Por lo tanto hacemos la primera vez el checkout a mano desde el directorio work de
anthill. Podemos cojer el comando q lanza en el log de tomcat y quitarle el modo –no-
interactivo.
Una vez que todo funcione, podemos hacer los build periódicos. En nuestro caso quere-
mos que haga nighty builds.

1 Set up the nightly schedule


2 To schedule a nightly build, we must complete two tasks: First, we must create a nightly schedule.
3 Second, we associate that schedule with our project. Making a schedule is easy-click on the Create
4 Schedule link on the main build page. Name your schedule and set the time interval between builds
5 to 1,440 minutes (one day). Set your start time (2:00 for 2 a.m.) and you are done. Hit Update to
6 return to the main build page. Now click on the Edit link next to your project. You return to your
7 Project Properties page. Down at the bottom, simply select the nightly schedule for the
8 anthill.schedule field. That’s it. You now have a nightly build system.

9. Proyecto Idages configurado. Todos los dias a las 2am hace un checkout del svn y hace
los test. Aqui vemos que los pasa correctamente.

Figura C.4: Compilando prototipo


Apéndice D

Listado del código fuente

El proyecto se acompaña de un CD con el código fuente completo junto con la documenta-


ción en formato LATEXy PDF. Además tanto la documentación como el prototipo será posible
descargarlo desde el sitio web del autor1 .

D.1. Primer prototipo


D.1.1. Estructura de la base de datos PostgreSQL

--
-- PostgreSQL database dump
--

SET client_encoding = ’LATIN1’;


SET check_function_bodies = false;
SET client_min_messages = warning;

--
-- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: dgrabla
--

COMMENT ON SCHEMA public IS ’Standard public schema’;

SET search_path = public, pg_catalog;

SET default_tablespace = ’’;

SET default_with_oids = true;

--
-- Name: app_user; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE app_user (


id bigint NOT NULL,
version integer NOT NULL,
username character varying(50) NOT NULL,

1
http://david.grajal.net

89
90 APÉNDICE D. LISTADO DEL CÓDIGO FUENTE

"password" character varying(255) NOT NULL,


first_name character varying(50) NOT NULL,
last_name character varying(50) NOT NULL,
address character varying(150),
city character varying(50) NOT NULL,
province character varying(100),
country character varying(100),
postal_code character varying(15) NOT NULL,
email character varying(255) NOT NULL,
phone_number character varying(255),
website character varying(255),
password_hint character varying(255),
account_enabled character(1),
account_expired character(1) NOT NULL,
account_locked character(1) NOT NULL,
credentials_expired character(1) NOT NULL
);

ALTER TABLE public.app_user OWNER TO root;

--
-- Name: areas_de_negocio; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE areas_de_negocio (


id bigint NOT NULL,
nombre character varying(50) NOT NULL,
prefix character varying(5) NOT NULL,
iva bigint NOT NULL,
notas_adicionales character varying(500),
fecha_mod date NOT NULL
);

ALTER TABLE public.areas_de_negocio OWNER TO root;

--
-- Name: clientes; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE clientes (


id bigint NOT NULL,
activo boolean NOT NULL,
fecha_creacion date NOT NULL,
titulo character varying(200),
apellidos character varying(20) NOT NULL,
nif_cif character varying(15) NOT NULL,
num_contacto_id bigint NOT NULL,
email_promo boolean NOT NULL,
contacto character varying(100) NOT NULL,
notas_adicionales character varying(500),
fecha_mod date NOT NULL,
nombre character varying(20),
direccion_id bigint
);
D.1. PRIMER PROTOTIPO 91

ALTER TABLE public.clientes OWNER TO root;

--
-- Name: coste_productos; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE coste_productos (


id bigint NOT NULL,
producto_id bigint NOT NULL,
concepto character varying(50) NOT NULL,
eur bigint NOT NULL,
fecha_mod date NOT NULL
);

ALTER TABLE public.coste_productos OWNER TO root;

--
-- Name: direcciones; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE direcciones (


id bigint NOT NULL,
direccion_postal_id bigint NOT NULL,
tipo_id bigint NOT NULL,
url character varying(200),
email character varying(20) NOT NULL,
fecha_mod date NOT NULL,
cliente_id bigint,
proveedor_id bigint
);

ALTER TABLE public.direcciones OWNER TO root;

--
-- Name: direcciones_postales; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE direcciones_postales (


id bigint NOT NULL,
direccion1 character varying(100) NOT NULL,
direccion2 character varying(100),
ciudad character varying(50) NOT NULL,
provincia character varying(50) NOT NULL,
cp bigint NOT NULL,
fecha_mod date NOT NULL
);

ALTER TABLE public.direcciones_postales OWNER TO root;

--
-- Name: facturas; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE facturas (


id bigint NOT NULL,
92 APÉNDICE D. LISTADO DEL CÓDIGO FUENTE

categoria_id bigint NOT NULL,


cliente_id bigint NOT NULL,
fecha_creacion date NOT NULL,
fecha_oficial date NOT NULL,
fecha_emision date,
fecha_pago date,
emitida boolean NOT NULL,
pagada boolean NOT NULL,
fecha_mod date NOT NULL,
numero_id character varying(15) NOT NULL,
notas_adicionales character varying(500)
);

ALTER TABLE public.facturas OWNER TO root;

--
-- Name: hibernate_sequence; Type: SEQUENCE; Schema: public; Owner: root
--

CREATE SEQUENCE hibernate_sequence


INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;

ALTER TABLE public.hibernate_sequence OWNER TO root;

--
-- Name: num_contacto; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE num_contacto (


id bigint NOT NULL,
telefono1 character varying(20) NOT NULL,
telefono2 character varying(20),
fax character varying(20),
fecha_mod date NOT NULL
);

ALTER TABLE public.num_contacto OWNER TO root;

--
-- Name: pedidos; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE pedidos (


id bigint NOT NULL,
proveedor_id bigint NOT NULL,
fecha_pedido date,
notas_adicionales character varying(500),
fecha_mod date NOT NULL
);

ALTER TABLE public.pedidos OWNER TO root;


D.1. PRIMER PROTOTIPO 93

--
-- Name: productos; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE productos (


id bigint NOT NULL,
factura_id bigint,
pedido_id bigint NOT NULL,
desc_data_id bigint NOT NULL,
eur_venta bigint,
fecha_creacion date NOT NULL,
num_serie character varying(200),
notas_adicionales character varying(500),
fecha_mod date NOT NULL,
porcentaje_beneficio smallint,
coste_id bigint
);

ALTER TABLE public.productos OWNER TO root;

--
-- Name: productos_desc_data; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE productos_desc_data (


id bigint NOT NULL,
titulo_select character varying(100) NOT NULL,
titulo character varying(150) NOT NULL,
descripcion character varying(5000) NOT NULL,
descripcion_ext character varying(5000) NOT NULL,
referencia_fab character varying(50) NOT NULL,
referencia_idatel character varying(50) NOT NULL,
garantia integer NOT NULL,
fecha_mod date NOT NULL
);

ALTER TABLE public.productos_desc_data OWNER TO root;

--
-- Name: proveedores; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE proveedores (


id bigint NOT NULL,
fecha_creacion date NOT NULL,
nombre character varying(50) NOT NULL,
nif_cif character varying(15) NOT NULL,
direccion_id bigint,
num_contacto_id bigint NOT NULL,
contacto character varying(100) NOT NULL,
notas_adicionales character varying(500),
fecha_mod date NOT NULL
);
94 APÉNDICE D. LISTADO DEL CÓDIGO FUENTE

ALTER TABLE public.proveedores OWNER TO root;

--
-- Name: role; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE role (


id bigint NOT NULL,
name character varying(20),
description character varying(64)
);

ALTER TABLE public.role OWNER TO root;

--
-- Name: tipo_direccion; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE tipo_direccion (


id bigint NOT NULL,
t_direccion character varying(100) NOT NULL,
fecha_mod date NOT NULL
);

ALTER TABLE public.tipo_direccion OWNER TO root;

--
-- Name: user_role; Type: TABLE; Schema: public; Owner: root; Tablespace:
--

CREATE TABLE user_role (


user_id bigint NOT NULL,
role_id bigint NOT NULL
);

ALTER TABLE public.user_role OWNER TO root;

--
-- Name: app_user_email_key; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY app_user


ADD CONSTRAINT app_user_email_key UNIQUE (email);

ALTER INDEX public.app_user_email_key OWNER TO root;

--
-- Name: app_user_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY app_user


ADD CONSTRAINT app_user_pkey PRIMARY KEY (id);
D.1. PRIMER PROTOTIPO 95

ALTER INDEX public.app_user_pkey OWNER TO root;

--
-- Name: app_user_username_key; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY app_user


ADD CONSTRAINT app_user_username_key UNIQUE (username);

ALTER INDEX public.app_user_username_key OWNER TO root;

--
-- Name: areas_de_negocio_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY areas_de_negocio


ADD CONSTRAINT areas_de_negocio_pkey PRIMARY KEY (id);

ALTER INDEX public.areas_de_negocio_pkey OWNER TO root;

--
-- Name: clientes_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY clientes


ADD CONSTRAINT clientes_pkey PRIMARY KEY (id);

ALTER INDEX public.clientes_pkey OWNER TO root;

--
-- Name: coste_productos_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY coste_productos


ADD CONSTRAINT coste_productos_pkey PRIMARY KEY (id);

ALTER INDEX public.coste_productos_pkey OWNER TO root;

--
-- Name: direcciones_email_key; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY direcciones


ADD CONSTRAINT direcciones_email_key UNIQUE (email);

ALTER INDEX public.direcciones_email_key OWNER TO root;

--
-- Name: direcciones_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY direcciones


ADD CONSTRAINT direcciones_pkey PRIMARY KEY (id);
96 APÉNDICE D. LISTADO DEL CÓDIGO FUENTE

ALTER INDEX public.direcciones_pkey OWNER TO root;

--
-- Name: direcciones_postales_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY direcciones_postales


ADD CONSTRAINT direcciones_postales_pkey PRIMARY KEY (id);

ALTER INDEX public.direcciones_postales_pkey OWNER TO root;

--
-- Name: facturas_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY facturas


ADD CONSTRAINT facturas_pkey PRIMARY KEY (id);

ALTER INDEX public.facturas_pkey OWNER TO root;

--
-- Name: num_contacto_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY num_contacto


ADD CONSTRAINT num_contacto_pkey PRIMARY KEY (id);

ALTER INDEX public.num_contacto_pkey OWNER TO root;

--
-- Name: pedidos_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY pedidos


ADD CONSTRAINT pedidos_pkey PRIMARY KEY (id);

ALTER INDEX public.pedidos_pkey OWNER TO root;

--
-- Name: productos_desc_data_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY productos_desc_data


ADD CONSTRAINT productos_desc_data_pkey PRIMARY KEY (id);

ALTER INDEX public.productos_desc_data_pkey OWNER TO root;

--
-- Name: productos_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
D.1. PRIMER PROTOTIPO 97

ALTER TABLE ONLY productos


ADD CONSTRAINT productos_pkey PRIMARY KEY (id);

ALTER INDEX public.productos_pkey OWNER TO root;

--
-- Name: proveedores_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY proveedores


ADD CONSTRAINT proveedores_pkey PRIMARY KEY (id);

ALTER INDEX public.proveedores_pkey OWNER TO root;

--
-- Name: role_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY role


ADD CONSTRAINT role_pkey PRIMARY KEY (id);

ALTER INDEX public.role_pkey OWNER TO root;

--
-- Name: tipo_direccion_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY tipo_direccion


ADD CONSTRAINT tipo_direccion_pkey PRIMARY KEY (id);

ALTER INDEX public.tipo_direccion_pkey OWNER TO root;

--
-- Name: user_role_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--

ALTER TABLE ONLY user_role


ADD CONSTRAINT user_role_pkey PRIMARY KEY (user_id, role_id);

ALTER INDEX public.user_role_pkey OWNER TO root;

--
-- Name: fk143bf46a550d0e4b; Type: FK CONSTRAINT; Schema: public; Owner: root
--

ALTER TABLE ONLY user_role


ADD CONSTRAINT fk143bf46a550d0e4b FOREIGN KEY (user_id) REFERENCES app_user(id);

--
-- Name: fk143bf46aafe24a6b; Type: FK CONSTRAINT; Schema: public; Owner: root
--
98 APÉNDICE D. LISTADO DEL CÓDIGO FUENTE

ALTER TABLE ONLY user_role


ADD CONSTRAINT fk143bf46aafe24a6b FOREIGN KEY (role_id) REFERENCES role(id);

--
-- Name: public; Type: ACL; Schema: -; Owner: dgrabla
--

REVOKE ALL ON SCHEMA public FROM PUBLIC;


REVOKE ALL ON SCHEMA public FROM dgrabla;
GRANT ALL ON SCHEMA public TO dgrabla;
GRANT ALL ON SCHEMA public TO PUBLIC;

--
-- PostgreSQL database dump complete
--

D.2. Segundo prototipo


D.2.1. Clase Factura

package prototipo2;

/**
* Created by IntelliJ IDEA.
* User: dgrabla
* Date: 10-jun-2007
* Time: 16:04:59
* To change this template use File | Settings | File Templates.
*/
public class Factura {

Long id;
String name; //Nombre del cliente
String lastName; //Apellido del cliente
String cost; //Coste total de la factura
String commit_date; //Fecha en la que se emite la factura
String phone_number; //Numero de telefono
String mobile_number; //Numero de telefono

public Factura() {
}

public Factura(Long id, String name, String lastName, String cost, String commit_date, String phone_nu
this.id = id;
this.name = name;
this.lastName = lastName;
this.cost =cost;
this.commit_date=commit_date;
this.phone_number=phone_number;
this.mobile_number=mobile_number;
}
D.2. SEGUNDO PROTOTIPO 99

public Long getId() {


return id;
}
public void setId(Long id) {
this.id = id;
}

public String getName() {


return name;
}

public void setName(String name) {


this.name = name;
}

public String getLastName() {


return lastName;
}

public String getCost() {


return cost;
}

public void setCost(String cost) {


this.cost = cost;
}

public String getCommit_date() {


return commit_date;
}

public void setCommit_date(String commit_date) {


this.commit_date = commit_date;
}

public String getPhone_number() {


return phone_number;
}

public void setPhone_number(String phone_number) {


this.phone_number = phone_number;
}

public String getMobile_number() {


return mobile_number;
}

public void setMobile_number(String mobile_number) {


this.mobile_number = mobile_number;
}

public void setLastName(String lastName) {


this.lastName = lastName;
}

public boolean equals(Object o) {


if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
100 APÉNDICE D. LISTADO DEL CÓDIGO FUENTE

final Factura factura = (Factura) o;

if (id != null ? !id.equals(factura.id) : factura.id != null) return false;

return true;
}

public int hashCode() {


return (id != null ? id.hashCode() : 0);
}
public String toString() {
return "Factura{" +
"id=" + id +
", name=’" + name + ’\’’ +
", lastName=’" + lastName + ’\’’ +
’}’;
}

D.2.2. Clase FacturaManager

package prototipo2;

import java.util.HashSet;
import java.util.Set;
import java.util.ArrayList;
import java.util.List;

public class FacturaManager {


private static List facturas = new ArrayList(5);
private static long COUNT = 5;

static {
Factura f1 = new Factura((long) 1, "David", "Grajal", "310", "0", "102", "653332061");
Factura f2 = new Factura((long) 2, "Ricardo", "Sosa", "100", "0", "101", "");
Factura f3 = new Factura((long) 3, "Lorena", "Garcia", "1021", "0", "101", "");
Factura f4 = new Factura((long) 4, "Leyre", "Gonzalez", "202","0", "101", "");
Factura f5 = new Factura((long) 5, "Laura", "Gondomar", "34","0", "101", "");
facturas.add(f1);
facturas.add(f2);
facturas.add(f3);
facturas.add(f4);
facturas.add(f5);
}

public void createFactura(Factura factura) {


factura.setId(++COUNT);
facturas.add(factura);
}

public void updateFactura(Factura factura) {


facturas.add(factura);
D.2. SEGUNDO PROTOTIPO 101

public List getFacturas() {


return facturas;
}

D.2.3. Clase ListFacturasAction

package prototipo2;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
import org.apache.struts2.config.Result;
import org.apache.struts2.views.freemarker.FreemarkerResult;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;

public class ListFacturasAction extends ActionSupport {

FacturaManager facturaManager;
List<Factura> facturas = new ArrayList<Factura>();

public void setFacturaManager(FacturaManager facturaManager) {


this.facturaManager = facturaManager;
}

public String execute() throws Exception {


//facturas.equals(facturaManager.getFacturas());
//facturas = facturaManager.getFacturas();
facturas.addAll(facturaManager.getFacturas());
return SUCCESS;
}

public List getFacturas() {


return facturas;
}

public int getFacturasCount() {


return facturas.size();
}
}

D.2.4. Clase LlamarExtensionAction

package prototipo2;
102 APÉNDICE D. LISTADO DEL CÓDIGO FUENTE

import org.asteriskjava.manager.AuthenticationFailedException;
import org.asteriskjava.manager.ManagerConnection;
import org.asteriskjava.manager.ManagerConnectionFactory;
import org.asteriskjava.manager.TimeoutException;
import org.asteriskjava.manager.action.OriginateAction;
import org.asteriskjava.manager.response.ManagerResponse;

import java.io.IOException;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
import org.apache.struts2.config.Result;
import org.apache.struts2.views.freemarker.FreemarkerResult;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;

public class LlamarExtensionAction extends ActionSupport {


private ManagerConnection managerConnection;
private String ext;

public LlamarExtensionAction() throws IOException


{
ManagerConnectionFactory factory = new ManagerConnectionFactory("localhost", "manager", "password"
this.managerConnection = factory.createManagerConnection();
}

public String getExt() {


return ext;
}
public void setExt(String ext) {
this.ext = ext;
}

public String execute() throws IOException, AuthenticationFailedException, TimeoutException


{
OriginateAction originateAction;
ManagerResponse originateResponse;

originateAction = new OriginateAction();


originateAction.setChannel("SIP/103");
originateAction.setContext("default");
originateAction.setExten("901");
originateAction.setPriority(new Integer(1));
// originateAction.setTimeout(new Integer(30000));

// connect to Asterisk and log in


managerConnection.login();

// send the originate action and wait for a maximum of 30 seconds for Asterisk
// to send a reply
originateResponse = managerConnection.sendAction(originateAction, 30000);

// print out whether the originate succeeded or not


D.3. OTROS 103

System.out.println(originateResponse.getResponse());

// and finally log off and disconnect


managerConnection.logoff();
return SUCCESS;
}

D.3. Otros
Además del código fuente propiamente dicho, como apoyo al desarrollo del proyecto se han
escrito una serie de pequeños scripts que han sido de gran utilidad para desempeñar labores
repetitivas.

D.3.1. Makefile (para la creación de la documentación)

# PFC Makefile

DESTDIR =

NAME = pfc

PDFVIEWER = kpdf

DIAGRAMS= diagrams/componenes_software2.eps \
diagrams/componentes_software_prototipo_erp.eps \
diagrams/componenes_software.eps \
diagrams/voip1.eps \
diagrams/estructura_documento_22_jun.eps \
diagrams/convergencia_ims.eps \
diagrams/BT_wholesale_web_call_connect.eps \
diagrams/arquitectura_ims.eps \
diagrams/modelo_vista_controlador.eps \
diagrams/p1_user_interface.eps \
diagrams/roadmap.eps

all: $(NAME).pdf

$(NAME).pdf: $(DIAGRAMS)
#umbrello --export png --directory images/uml/ uml/p1-clases.xmi 2> /dev/null
rubber --pdf $(NAME).tex

fast:
rubber --pdf $(NAME).tex

%.eps: %.dia
dia -t eps $?

view:
$(PDFVIEWER) $(NAME).pdf &

src:
104 APÉNDICE D. LISTADO DEL CÓDIGO FUENTE

python2.4 python2text.py ../../swaml/trunk/*.py #output dir?

jabref:
~/java/jdk1.6.0/bin/java -jar ~/facultad/PFC/software/JabRef-2.2.jar bibliografia.bib &

clean:
rm -f $(DIAGRAMS)
rm -f *.aux *.log *.dvi *.toc *.pdf *.bbl *.blg *.lof *.bak *.lot *.out
rm -f ‘find . -name "*.backup"‘
rm -f ‘find . -name "*~"‘
rm -f images/uml/*
Apéndice E

Licencias

E.1. Creative Commons Reconocimiento-CompartirIgual 2.5


C REATIVE C OMMONS
R ECONOCIMIENTO 2.5 E SPAÑA
http://creativecommons.org/licenses/by/2.5/es/

Usted es libre de:

copiar, distribuir y comunicar públicamente la obra

hacer obras derivadas

hacer un uso comercial de esta obra

Bajo las condiciones siguientes:

Reconocimiento. Debe reconocer los créditos de la obra de la manera especificada por el


autor o el licenciador.

Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de
esta obra.

Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los
derechos de autor

Los derechos derivados de usos legítimos u otras limitaciones reconocidas por ley no se ven
afectados por lo anterior.

105
106 APÉNDICE E. LICENCIAS

E.2. GNU General Public License (GPL)


Version 2, June 1991
Copyright 1989, 1991 Free Software Foundation, Inc.
c

51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA

Everyone is permitted to copy and distribute verbatim copies of this license document, but
changing it is not allowed.

http://www.gnu.org/licenses/gpl.html

P REAMBLE
The licenses for most software are designed to take away your freedom to share and change
it. By contrast, the GNU General Public License is intended to guarantee your freedom to share
and change free software—to make sure the software is free for all its users. This General Public
License applies to most of the Free Software Foundation’s software and to any other program
whose authors commit to using it. (Some other Free Software Foundation software is covered
by the GNU Library General Public License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public
Licenses are designed to make sure that you have the freedom to distribute copies of free
software (and charge for this service if you wish), that you receive source code or can get it if
you want it, that you can change the software or use pieces of it in new free programs; and that
you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone to deny you these
rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities
for you if you distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must
give the recipients all the rights that you have. You must make sure that they, too, receive or
can get the source code. And you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and (2) offer you this
license which gives you legal permission to copy, distribute and/or modify the software.
Also, for each author’s protection and ours, we want to make certain that everyone unders-
tands that there is no warranty for this free software. If the software is modified by someone
else and passed on, we want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original authors’ reputations.
Finally, any free program is threatened constantly by software patents. We wish to avoid the
danger that redistributors of a free program will individually obtain patent licenses, in effect
making the program proprietary. To prevent this, we have made it clear that any patent must be
licensed for everyone’s free use or not licensed at all.
The precise terms and conditions for copying, distribution and modification follow.
E.2. GNU GENERAL PUBLIC LICENSE (GPL) 107

GNU G ENERAL P UBLIC L ICENSE


T ERMS AND C ONDITIONS F OR C OPYING , D ISTRIBUTION
AND M ODIFICATION

1. This License applies to any program or other work which contains a notice placed by the
copyright holder saying it may be distributed under the terms of this General Public Li-
cense. The “Program”, below, refers to any such program or work, and a “work based on
the Program” means either the Program or any derivative work under copyright law: that
is to say, a work containing the Program or a portion of it, either verbatim or with mo-
difications and/or translated into another language. (Hereinafter, translation is included
without limitation in the term “modification”.) Each licensee is addressed as “you”.
Activities other than copying, distribution and modification are not covered by this Li-
cense; they are outside its scope. The act of running the Program is not restricted, and
the output from the Program is covered only if its contents constitute a work based on
the Program (independent of having been made by running the Program). Whether that
is true depends on what the Program does.

2. You may copy and distribute verbatim copies of the Program’s source code as you re-
ceive it, in any medium, provided that you conspicuously and appropriately publish on
each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty; and give any other
recipients of the Program a copy of this License along with the Program.
You may charge a fee for the physical act of transferring a copy, and you may at your
option offer warranty protection in exchange for a fee.

3. You may modify your copy or copies of the Program or any portion of it, thus forming
a work based on the Program, and copy and distribute such modifications or work under
the terms of Section 1 above, provided that you also meet all of these conditions:

a) You must cause the modified files to carry prominent notices stating that you chan-
ged the files and the date of any change.
b) You must cause any work that you distribute or publish, that in whole or in part
contains or is derived from the Program or any part thereof, to be licensed as a
whole at no charge to all third parties under the terms of this License.
c) If the modified program normally reads commands interactively when run, you must
cause it, when started running for such interactive use in the most ordinary way, to
print or display an announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide a warranty) and that
users may redistribute the program under these conditions, and telling the user how
to view a copy of this License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on the Program is
not required to print an announcement.)

These requirements apply to the modified work as a whole. If identifiable sections of that
work are not derived from the Program, and can be reasonably considered independent
and separate works in themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you distribute the same
108 APÉNDICE E. LICENCIAS

sections as part of a whole which is a work based on the Program, the distribution of the
whole must be on the terms of this License, whose permissions for other licensees extend
to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work
written entirely by you; rather, the intent is to exercise the right to control the distribution
of derivative or collective works based on the Program.
In addition, mere aggregation of another work not based on the Program with the Program
(or with a work based on the Program) on a volume of a storage or distribution medium
does not bring the other work under the scope of this License.

4. You may copy and distribute the Program (or a work based on it, under Section 2) in
object code or executable form under the terms of Sections 1 and 2 above provided that
you also do one of the following:

a) Accompany it with the complete corresponding machine-readable source code, whi-


ch must be distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three years, to give any third
party, for a charge no more than your cost of physically performing source distri-
bution, a complete machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium customarily
used for software interchange; or,
c) Accompany it with the information you received as to the offer to distribute corres-
ponding source code. (This alternative is allowed only for noncommercial distribu-
tion and only if you received the program in object code or executable form with
such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making modifica-
tions to it. For an executable work, complete source code means all the source code for
all modules it contains, plus any associated interface definition files, plus the scripts used
to control compilation and installation of the executable. However, as a special excep-
tion, the source code distributed need not include anything that is normally distributed
(in either source or binary form) with the major components (compiler, kernel, and so
on) of the operating system on which the executable runs, unless that component itself
accompanies the executable.
If distribution of executable or object code is made by offering access to copy from
a designated place, then offering equivalent access to copy the source code from the
same place counts as distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

5. You may not copy, modify, sublicense, or distribute the Program except as expressly pro-
vided under this License. Any attempt otherwise to copy, modify, sublicense or distribute
the Program is void, and will automatically terminate your rights under this License. Ho-
wever, parties who have received copies, or rights, from you under this License will not
have their licenses terminated so long as such parties remain in full compliance.

6. You are not required to accept this License, since you have not signed it. However, not-
hing else grants you permission to modify or distribute the Program or its derivative
E.2. GNU GENERAL PUBLIC LICENSE (GPL) 109

works. These actions are prohibited by law if you do not accept this License. Therefo-
re, by modifying or distributing the Program (or any work based on the Program), you
indicate your acceptance of this License to do so, and all its terms and conditions for
copying, distributing or modifying the Program or works based on it.

7. Each time you redistribute the Program (or any work based on the Program), the recipient
automatically receives a license from the original licensor to copy, distribute or modify
the Program subject to these terms and conditions. You may not impose any further res-
trictions on the recipients’ exercise of the rights granted herein. You are not responsible
for enforcing compliance by third parties to this License.

8. If, as a consequence of a court judgment or allegation of patent infringement or for any


other reason (not limited to patent issues), conditions are imposed on you (whether by
court order, agreement or otherwise) that contradict the conditions of this License, they do
not excuse you from the conditions of this License. If you cannot distribute so as to satisfy
simultaneously your obligations under this License and any other pertinent obligations,
then as a consequence you may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by all those who
receive copies directly or indirectly through you, then the only way you could satisfy
both it and this License would be to refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under any particular cir-
cumstance, the balance of the section is intended to apply and the section as a whole is
intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property
right claims or to contest validity of any such claims; this section has the sole purpose
of protecting the integrity of the free software distribution system, which is implemented
by public license practices. Many people have made generous contributions to the wide
range of software distributed through that system in reliance on consistent application
of that system; it is up to the author/donor to decide if he or she is willing to distribute
software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence
of the rest of this License.

9. If the distribution and/or use of the Program is restricted in certain countries either by pa-
tents or by copyrighted interfaces, the original copyright holder who places the Program
under this License may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among countries not thus ex-
cluded. In such case, this License incorporates the limitation as if written in the body of
this License.

10. The Free Software Foundation may publish revised and/or new versions of the General
Public License from time to time. Such new versions will be similar in spirit to the present
version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies a version
number of this License which applies to it and “any later version”, you have the option of
following the terms and conditions either of that version or of any later version published
by the Free Software Foundation. If the Program does not specify a version number of this
License, you may choose any version ever published by the Free Software Foundation.
110 APÉNDICE E. LICENCIAS

11. If you wish to incorporate parts of the Program into other free programs whose distribu-
tion conditions are different, write to the author to ask for permission. For software which
is copyrighted by the Free Software Foundation, write to the Free Software Foundation;
we sometimes make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and of promoting the
sharing and reuse of software generally.

N O WARRANTY
12. B ECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE , THERE IS NO WARRANTY
FOR THE PROGRAM , TO THE EXTENT PERMITTED BY APPLICABLE LAW. E XCEPT
WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND / OR OTHER
PARTIES PROVIDE THE PROGRAM “AS IS ” WITHOUT WARRANTY OF ANY KIND , EIT-
HER EXPRESSED OR IMPLIED , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRAN -
TIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE . T HE ENTI -
RE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU .
S HOULD THE PROGRAM PROVE DEFECTIVE , YOU ASSUME THE COST OF ALL NECES -
SARY SERVICING , REPAIR OR CORRECTION .

13. I N NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING


WILL ANY COPYRIGHT HOLDER , OR ANY OTHER PARTY WHO MAY MODIFY AND / OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE , BE LIABLE TO YOU FOR DA -
MAGES , INCLUDING ANY GENERAL , SPECIAL , INCIDENTAL OR CONSEQUENTIAL DA -
MAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM ( INCLUDING
BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO
OPERATE WITH ANY OTHER PROGRAMS ), EVEN IF SUCH HOLDER OR OTHER PARTY
HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES .

E ND OF T ERMS AND C ONDITIONS


Apéndice F

Diario de trabajo del PFC

El diario describe el trabajo realizado desde noviembre del 2006. Antes de esa fecha no
apuntaba el diario realizado porque todo el trabajo se centraba en el desarrollo del prototipo de
aplicación ERP y iba siguiendo la planificación descrita en el apartado 3.7 página 38.
El contenido de este capítulo se incluye únicamente como posible ayuda en caso de que algún
alumno desee continuar con el trabajo iniciado en este proyecto. Es un contenido adicional
del PFC ya que son mis notas personales y en ningún momento durante su escritura pensé que
fueran a formar parte finalmente del proyecto.

F.1. 9/jul/2007
Encuadernación del proyecto

F.2. 8/jul/2007
Pequeñas correcciones de ortografía por todo el documento

F.3. 7/jul/2007
Correcciones ortográficas y de redacción

Ampliadas algunas secciones. Nuevos textos en la parte de la interfaz de usuario del


prototipo ERP. Reordenación de los protocolos de VoIP. Integración de todo el software
usado al anexo correspondiente y colocadas referencias por todo el documento apuntando
a esas secciones.

F.4. 6/jul/2007
Hoy he ido a Madrid y he estado con Ricardo hablando del PFC.

He ampliar algunas secciones que están cojas y he empezado a hacer correcciones orto-
gráficas y de redacción.

111
112 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

F.5. 5/jul/2007
He terminado de escribir la seccion de conclusiones.

Voy a empezar a pulir un poco los anexos. Hay que pulir el anexo D, de los listados de
código fuente y el anexo B del software utilizado en el PFC.

F.6. 4/jul/2007
He estado trabajando en el capítulo del prototipo voip. Ha quedado un poco pobre, quizá
los próximos dias lo complete un poco más.

He estado trabajando en el capítulo de conclusiones. He arreglado la estructura, que aun


estaba con la estructura preliminar de marzo :).

He estado completando el roadmap con lo que ha pasado de diciembre a julio.

Me he dado cuenta que lo que hice hace un tiempo de pasar las imagenes a eps y que
se generaran dinámicamente en el makefile es un error. KPDF no tiene problema pero el
acrobat reader no puede verlas bien y se niega a imprimir las páginas que contienen esas
imágenes. La solución es pasar todo a PNG.

F.7. 3/jul/2007
Trabajo en el capítulo del prototipo ERP.

Necesito hacer unas capturas de pantalla del prototipo para mostrar la interfaz de usuario
asi que he ido a arrancar la aplicación y... ALARMA tomcat no quiere arrancarla! Me
mosqueo y digo... bueno de todas maneras es hora de actualizar asi que he instalado
y configurado tomcat 5.5.23. Pero TAMPOCO funcionaba con una instlaacion limpia.
Luego me he acordado de que no habia lanzado postgreSQL. He lanzado postgreSQL y
ya tomcat ha arrancado la aplicacion normalmente.

Me he puesto a hacer screenshots pero me he dado cuenta que en noviembre ya habia


hecho una bateria completa de pantallazos asi que voy a incluir esos.

He creado un diagrama con la interfaz de usuario

He reestructurado el capítulo y lo he ordenado de una forma más lógica.

He creado un diagrama para el modelo vista controlador y he reescrito ese apartado

He creado nuevos casos de uso y me he tirado un buen rato para hacer el wrap de texto
en las tablas de latex (se hace definiendo la anchura de la columna en el entorno tabular,
con el atributo p)

He pasado con aspell la corrección ortografica al capítulo del prototipo ERP


F.8. 2/JUL/2007 113

F.8. 2/jul/2007
He ido a mirar como hacer el tema de la encuadernacion. Tengo que llevar la portada
para que puedan hacer la plancha con el grabado y luego me lo hacen en 3 dias.

F.9. 1/jul/2007
Ayer lo habia puesto en on-hold pero hoy he vuelto a la carga. Ya sé como hacer las co-
sas. Primero grabo el screencast con recordmydesktop, luego paso el ogg en theora a avi
(quiza no hace falta) pero sobre todo la clave esta en q el fichero que genera recordmy-
desktop no esta sano y es necesario hacer una pasada por mencoder con un mencoder
-ovc lavc –force-idx video1.avi. Esto NO esta documentado en ningun sitio y lo he saca-
do por prueba y error. Eso arregla el video y el fichero ya se puede abrir en lo editores
no lineales. He probado el vegas7 (sony, para windows) y me ha gustado mucho, pero
mucho mas que premiere. Lo que he hecho al final es cojer el video arreglado con men-
coder en linux , la pista de audio que grabé en plan provisional. El título del video ya
lo tenia hecho con la herramienta de creación de videos de premiere pero claro, no hay
manera de importar eso en vegas y premiere solo exporta video en resoluciones bajas. Lo
que he hecho es una captura de pantalla del titulo en premiere y luego he abierto Gimp y
he reconstruido el título con la base del título de premiere. Luego se ha exportado a tif y
lo he importado dentro de vegas. En vegas he añadido un texto sobreimpresionado (da-
vid.grajal.net) y luego lo he renderizado como mpeg2 (ocupa muchisimo el video, unos
40 megas) y en Mpeg4 con AAC (audio) y H.264 (AVC) en video. He visto que quedaba
bastante bien y entonces he editado el audio con audacity para añadirle silencios en al-
gunos puntos para quitar ruidos y he recomprimido en MP3H264 pero con dos pasadas.
El resultado es el p2_video.mp4. He creado tambien un avi en XVID a una pasada con
audio en oggvorbis pero ocupaba mucho más asi que lo he acabado eliminando. He crea-
do un video a 320x240 en mp4 también y luego en linux he pasado el video a 320x240
por ffmpeg para crear un FLV para poder verlo en la web.

F.10. 30/jun/2007
He puesto en on-hold el tema del screencast porque me urge mucho mas terminar lo
que es el texto del PFC porque tengo que terminarlo, darselo a Ricardo y que me de un
visto bueno y ir a encuadernarlo (tardan 7 dias asi que como tarde lo tengo que llevar a
encuadernar el jueves). Una vez dado a encuardernar me centrare en la presentacion y
volvere al tema del screencast.

F.11. 29/jun/2007
He probado el pinnacle studio 11 (win), el imovie (mac), kino (linux), premiere 1.5 (win)
y con ninguno puedo abrir el video para hacer la edición.
114 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

F.12. 28/jun/2007
Trato de hacer un screencast de la demo para colgar en el blog y para incluirlo en el
PFC y hacer una demo en la presentación. Despues de probar con diferentes softwares,
lo que hago es grabar el video con recordmydesktop y el audio por separado haciendo
una llamada a asterisk y dejando que me grabe la llamada (El teléfono es el único micro
que tengo a mano) Problema: Recordmydesktop comprime en theora y eso parece que
no lo soporta ninguna herramienta de edición lineal de video. Trato de convertirlo a
avi/mpeg4/xvid o a mjpeg pero los programas de NLE siguen sin tragar el formato.

F.13. 27/jun/2007
Demo a Ricardo del PFC.

F.14. 26/jun/2007
Gabiola me ha dicho que de usar mis portadas nada, que me tengo que ajustar a lo que
el dice, que no es una recomendacion, es una norma. Asi que nada, habra que rehacerlas
(bof). Tambien me ha dicho un sitio en madrid bueno para encuadernar que encima esta
a lado de Francos Rodriguez asi que me viene perfecto.
He hecho la portada del PFC, la primera página y la portada del CD directamente desde
MS Word. Las he puesto en pfc/oficial para que quede claro que no me gustan nada :)
Para hacer la corrección ortográfica del primer y segundo capítulo no puedo usar Ispell
porque resulta que no entiende UTF8. El programa sucesor de ispell, que se llama aspell
si que lo hace pero NO lo tengo instalado en el sistema y no puedo hacer un apt-get pq
estoy tras el proxy de la universidad.
Ya en casa he instalado aspell luego por la tarde lo pruebo
He probado nuevos softphones. Kphone es una mierda, no consigo ni que se registre.
Twinkle esta muy bien funciona super rapido y hace llamadas. El problema es que se
cuelga cuando el softphone suena. Asi que nada, otro descartado. Voy a dar una nueva
oportunidad a ekiga pero para eso tengo que cambiar el puerto de escucha, pq por defecto
esta en el 5060 y ese puerto lo usa asterisk. Para cambiarlo hay q instalar gconf-edir y
cambiar los listen port de H.323 y sip. Lo he ambiado al 5080 y funciona de lujo. Mejor
que el wengophone que el otro dia en la presentacion con ricardo me dejo tirado. Ahora
convierto a ekiga en el softphone oficial del PFC :)
He probado la aplicacion demo del manager y funciona OK. Al ajecutarla llama prime-
ro al 101, y si lo coje, llama al 102. Una vez que ambos desuelgan, se establece una
comunicacion.
Para llamar a aspell en UTF-8 en modo corregir: aspell –encoding=utf-8 -c introduc-
cion.tex
He corregido las faltas de los primeros capítulos pero quedo pendiente de imprimirlos (se
me ha acabado la tinta de la impresora) porque creo que es la única manera de corregir
los (enormes) fallos de redacción.
F.15. 25/JUN/2007 115

Ya se como hacer (probablemente de una manera muy cutre pero bueno) a través del
manager que asterisk llame a una extension y la meta una locución. Lo que hay que
hacer es lo mismo que en el ejemplo del manager pero diciendo a la aplicación que
enlace con una extensión en la que suene una locución. Y las extensiones esas ya las
tengo preparadas de cuando hacia que sonara musica en espera asi que ya solo tengo que
integrarlo en la web. Para eso tengo que crear un acción en struts que haga la conexión
con asterisk... vamos a ver como hacer esto...

Cuando cree el proyecto con maven, se incorporaron todas las librerias a usar. Luego
añadi al proyecto asterisk-java y maven se encargo de incluirlo al compilar pero NO de
meterla en el proyecto. He cogido el fichero IMS de definición del proyecto de idea y he
añadido a pelo la libreria de asterisk-java desde los repositorios del home .m2 de maven.
Funciona perfectamente :)

He añadido la action call.action y funciona perfectamente. Al llamar la accion desde el


navegador, ekiga recibe una llamada y si la coje, empeiza a sonar un mp3 :) ¡Ya funciona!

He cambiado el nombre de la accion por LlamarExtension :)

F.15. 25/jun/2007
Hoy he terminado de reescribir el segundo capítulo. Ahora voy a imprimir los dos pri-
meros capítulos y revisaré las faltas gordas de redacción y de ortografía. He mandado un
email a felipe para ver si me puede corregir el capítulo para ver si todo esta OK. Una
vez que haya limpiado el capítulo de faltas de redacción y le haya echo una pasada con
el corrector ortográfico ispell se lo pasaré a alguien que controle de ortografía para que
lo eche un vistazo y me de su impresión. Tambien se lo mandaré a gustavo, a pablo y a
diego para que se lo miren y me digan su opinión.

Le he hecho una demo a ricardo del PFC y hemos solucionado el problema de que no
encontrara la clase al ejecutar el programa del manager. El problema es que no metia
bien el classpath porque tenia que meter a la vez el directorio actual (para que cogiera el
fichero class compilado) y el jar de la libreria de asterisk-java. Eso se hace asi: java -cp
.:asterisk-java-0.3-20070425.010844-22.jar HelloManager. Ahora el programa hace algo
aunque no he probado a ver si se conecta bien a asterisk y efectua la llamada. A ricardo
le he hehco la demo del programa ERP y de lo que tengo de la app telefónica. Me ha
dicho que ok.

Para el capítulo de ERP, que es en el que centrare el esfuerzo a partir de ahora debo hacer
un diagrama de tablas mostrando las relaciones entre ellas. Tambien debo hacer OK los
casos de uso y en general pulir el capítulo.

Tengo que ir a hablar con gabiola para que me diga si las portadas actuales estan OK o
debo convertirlas al formato oficial de la uax.

F.16. 24/jun/2007
Mas reescritura del segundo capítulo
116 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

F.17. 23/jun/2007
He continuado reescribiendo el segundo capítulo. Además he añadido el código del pro-
yecto a la portada exterior y a la interior del PFC.

F.18. 22/jun/2007
Modificado el diagrama del primer capítulo para ajustarse a la nueva estructura.

Reescritura del segundo capítulo.

F.19. 20/jun/2007
Ahora que he terminado las asignaturas de la carrera es momento de volver a ponerme
con el proyecto, ya con vistas a presentarlo en Julio. He modificado un poco los agradeci-
mientos y como he pasado una nueva etapa, a partir de ahora empiezo el cuarto borrador.

He cambiado la portada interior para que sólo salga uno de los escudos de la universidad
como en el grabado del tomo.

He reescrito el capitulo uno practicamente entero y ahora esta mucho mejor.

F.20. 13/jun/2007
He recibido un monton de feedback de la mano de diego y pablo sobre IMS y servicios
telefónicos que he estado integrando en el proyecto. Ademas lo he cambiado de nombre
de nuevo, ahora es ‘Integración de aplicaciones en redes telefónicas IP

He quitado el anexo de emails.

Comenzamos a hacer la integracion. Primero activamos el manager de asterisk en el puer-


to 5038 (Es el puerto por defecto) y creamos un usuario manager de password password:

1 cat manager.conf
2 ;
3 ; Asterisk Call Management support
4 ;
5
6 ; By default asterisk will listen on localhost only.
7 [general]
8 enabled = yes
9 port = 5038
10 bindaddr = 127.0.0.1
11
12 ; No access is allowed by default.
13 ; To set a password, create a file in /etc/asterisk/manager.d
14 ; use creative permission games to allow other serivces to create their own
15 ; files
16 #include "manager.d/*.conf"
17
18 [manager]
19 secret=password
20 permit=0.0.0.0/0.0.0.0
21 read=system,call,log,verbose,agent,command,user
22 write=system,call,log,verbose,agent,command,user

Se podra ver la comunicación con un comando como ngrep -s 1500 port 5038 -T
F.21. 11/JUN/2007 117

He creado un directorio de pruebas para el manager y he creado un nuevo makefile. He


bajado asterisk-java 0.3m2 (hasta ahora habia usado la m1) y he compilado el HelloMa-
nager.java del tutorial de asterisk-java.

El fichero del tutorial esta mal.

1 javac -Xlint:deprecation -cp asterisk-java-0.3-m2.jar HelloManager.java


2 HelloManager.java:33: warning: [deprecation] setTimeout(java.lang.Integer) in org.asteriskjava.manager.action.Originate
3 originateAction.setTimeout(new Integer(30000));

La documentacion dice que hay que usar setVariables

public void setVariables(java.util.Map<java.lang.String,java.lang.String>variables)

Sets the variables to set on the originated call.

No consigo hacerlo funcionar, siempre me sale el mismo error del que no encuentro
ninguna referencia en internet. Le mando el reporte a Ricardo a ver si a el con otro
entorno y con mayor experiencia en java le pasa lo mismo. El error

1 dgrabla@alderaan:~/facultad/PFC/p2/pruebas-manager-asterisk\$ java HelloManager


2 Exception in thread "main" java.lang.NoClassDefFoundError: org/asteriskjava/manager/action/ManagerAction

F.21. 11/jun/2007
He instalado la máquina virtual de java versión 6 update 1 a ver si asi se solucionaba el
problema con el CRUD de struts. Sigue sin funcionar. Sin embargo he desempaquetado
el showcase y ese si funciona bien, lo que me lleva a pensar que quiza sea problema de
otra cosa...

Efectivamente era otra cosa. Me faltaba una linea en el applicationContext.xml. El pro-


blema es que no se para que diablos sirve ese fichero...

1 <bean id="facturaManager" class="prototipo2.FacturaManager" singleton="true"/>

Esto es un reporte final del dia: Hoy me he pasado por lo menos 14 horas delante del
monitor haciendo funcionar a struts2 y preparando el prototipo para añadirle la funcio-
nalidad telefónica. El resultado final se puede ver en la siguietne figura:
118 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

Figura F.1: Prototipo2 a 11 junio de 2007

Al final no uso ni base de datos ni persistencia de objetos ni nada. La tabla se construye


con 5 objetos Factura que se almacenan en un arraylist gestionado por FacturaManager.
Hay una sola acción llamada listFacturas que se encarga de coger todas las facturas ges-
tionadas por FacturaManager y pasarselas a la VISTA. La vista se construye con una
plantilla de freemaker y genera la tabla. La cabecera y el footer se construyen mediante
sitemesh. El diseño es una copia del del primer prototipo pero deslucido porque le faltan
imágenes.

Respecto a struts2, he hecho la base del sistema. Y respecto a maven2, aparte de que por
fin he conseguido entender para que vale y cómo usarlo (Es terriblemente potente y util)
he añadido los plugins de control de tomcat para poder hacer los undeploys y deploys.
Además he añadido a maven el java-asterisk que empezaré a usarlo mañana para dotar al
prototipo de la funcionalidad telefónica.

¿Qué falta? Hay que crear una nueva vista emitirFactura que haga uso del MANAGER de
asterisk. En principio no va a hacer control de eventos, sólamente va a efectuar llamadas
y o bien decir dinámicamente o bien locuciones pregeneradas. Ojo porque va con el
MANAGER y no con el AGI que parece mucho más limitado.

El pom.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <project>
4 <modelVersion>4.0.0</modelVersion>
5 <groupId>prototipo2</groupId>
6 <artifactId>prototipo2</artifactId>
7 <packaging>war</packaging>
8 <version>1.0-SNAPSHOT</version>
9 <name></name>
10 <url>http://david.grajal.net</url>
11 <description>Prototipo2 del PFC de Davdi Grajal</description>
12
13 <dependencies>
14 <!-- Junit -->
15 <dependency>
16 <groupId>junit</groupId>
17 <artifactId>junit</artifactId>
18 <version>3.8.1</version>
19 <scope>test</scope>
F.21. 11/JUN/2007 119

20 </dependency>
21
22 <!-- Struts 2 -->
23 <dependency>
24 <groupId>org.apache.struts</groupId>
25 <artifactId>struts2-core</artifactId>
26 <version>2.0.6</version>
27 </dependency>
28 <dependency>
29 <groupId>org.apache.struts</groupId>
30 <artifactId>struts2-sitemesh-plugin</artifactId>
31 <version>2.0.6</version>
32 </dependency>
33 <dependency>
34 <groupId>org.apache.struts</groupId>
35 <artifactId>struts2-spring-plugin</artifactId>
36 <version>2.0.6</version>
37 </dependency>
38
39 <!-- Servlet & Jsp -->
40 <dependency>
41 <groupId>javax.servlet</groupId>
42 <artifactId>servlet-api</artifactId>
43 <version>2.4</version>
44 <scope>provided</scope>
45 </dependency>
46 <dependency>
47 <groupId>javax.servlet</groupId>
48 <artifactId>jsp-api</artifactId>
49 <version>2.0</version>
50 <scope>provided</scope>
51 </dependency>
52
53 <!-- Jakarta Commons -->
54 <dependency>
55 <groupId>commons-fileupload</groupId>
56 <artifactId>commons-fileupload</artifactId>
57 <version>1.1.1</version>
58 </dependency>
59
60 <!-- Dwr -->
61 <dependency>
62 <groupId>uk.ltd.getahead</groupId>
63 <artifactId>dwr</artifactId>
64 <version>1.1-beta-3</version>
65 </dependency>
66
67 <!-- Asterisk-Java -->
68 <dependency>
69 <groupId>org.asteriskjava</groupId>
70 <artifactId>asterisk-java</artifactId>
71 <version>0.3-m2</version>
72 </dependency>
73
74 </dependencies>
75
76 <build>
77 <finalName>prototipo2</finalName>
78 <plugins>
79 <plugin>
80 <artifactId>maven-compiler-plugin</artifactId>
81 <configuration>
82 <source>1.5</source>
83 <target>1.5</target>
84 </configuration>
85 </plugin>
86 <plugin>
87 <groupId>org.mortbay.jetty</groupId>
88 <artifactId>maven-jetty-plugin</artifactId>
89 <version>6.0.1</version>
90 <configuration>
91 <scanIntervalSeconds>10</scanIntervalSeconds>
92 </configuration>
93 </plugin>
94 <plugin>
95 <groupId>org.codehaus.mojo</groupId>
96 <artifactId>tomcat-maven-plugin</artifactId>
97 <configuration>
98 <url>http://localhost:18080/manager</url>
99 <server>tomcat-local</server>
100 </configuration>
101 </plugin>
102 </plugins>
120 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

103 </build>
104 </project>

La clase factura
1 package prototipo2;
2
3 /**
4 * Created by IntelliJ IDEA.
5 * User: dgrabla
6 * Date: 10-jun-2007
7 * Time: 16:04:59
8 * To change this template use File | Settings | File Templates.
9 */
10 public class Factura {
11
12 Long id;
13 String name; //Nombre del cliente
14 String lastName; //Apellido del cliente
15 String cost; //Coste total de la factura
16 String commit_date; //Fecha en la que se emite la factura
17 String phone_number; //Número de teléfono
18 String mobile_number; //Número de teléfono
19
20 public Factura() {
21 }
22
23 public Factura(Long id, String name, String lastName, String cost, String commit_date, String phone_number, String
24 this.id = id;
25 this.name = name;
26 this.lastName = lastName;
27 this.cost =cost;
28 this.commit_date=commit_date;
29 this.phone_number=phone_number;
30 this.mobile_number=mobile_number;
31 }
32
33 public Long getId() {
34 return id;
35 }
36 public void setId(Long id) {
37 this.id = id;
38 }
39
40 public String getName() {
41 return name;
42 }
43
44 public void setName(String name) {
45 this.name = name;
46 }
47
48 public String getLastName() {
49 return lastName;
50 }
51
52 public String getCost() {
53 return cost;
54 }
55
56 public void setCost(String cost) {
57 this.cost = cost;
58 }
59
60 public String getCommit_date() {
61 return commit_date;
62 }
63
64 public void setCommit_date(String commit_date) {
65 this.commit_date = commit_date;
66 }
67
68 public String getPhone_number() {
69 return phone_number;
70 }
71
72 public void setPhone_number(String phone_number) {
73 this.phone_number = phone_number;
74 }
75
76 public String getMobile_number() {
F.21. 11/JUN/2007 121

77 return mobile_number;
78 }
79
80 public void setMobile_number(String mobile_number) {
81 this.mobile_number = mobile_number;
82 }
83
84 public void setLastName(String lastName) {
85 this.lastName = lastName;
86 }
87
88 public boolean equals(Object o) {
89 if (this == o) return true;
90 if (o == null || getClass() != o.getClass()) return false;
91
92 final Factura factura = (Factura) o;
93
94 if (id != null ? !id.equals(factura.id) : factura.id != null) return false;
95
96 return true;
97 }
98
99 public int hashCode() {
100 return (id != null ? id.hashCode() : 0);
101 }
102 public String toString() {
103 return "Factura{" +
104 "id=" + id +
105 ", name=’" + name + ’\’’ +
106 ", lastName=’" + lastName + ’\’’ +
107 ’}’;
108 }
109
110 }

La clase FacturaManager

1 package prototipo2;
2
3 import java.util.HashSet;
4 import java.util.Set;
5 import java.util.ArrayList;
6 import java.util.List;
7
8 public class FacturaManager {
9 private static List facturas = new ArrayList(5);
10 private static long COUNT = 5;
11
12
13 static {
14 Factura f1 = new Factura((long) 1, "David", "Grajal", "310", "0", "102", "653332061");
15 Factura f2 = new Factura((long) 2, "Ricardo", "Sosa", "100", "0", "101", "");
16 Factura f3 = new Factura((long) 3, "Lorena", "Garcia", "1021", "0", "101", "");
17 Factura f4 = new Factura((long) 4, "Leyre", "Gonzalez", "202","0", "101", "");
18 Factura f5 = new Factura((long) 5, "Laura", "Gondomar", "34","0", "101", "");
19 facturas.add(f1);
20 facturas.add(f2);
21 facturas.add(f3);
22 facturas.add(f4);
23 facturas.add(f5);
24 }
25
26 public void createFactura(Factura factura) {
27 factura.setId(++COUNT);
28 facturas.add(factura);
29 }
30
31 public void updateFactura(Factura factura) {
32 facturas.add(factura);
33 }
34
35 public List getFacturas() {
36 return facturas;
37 }
38 }

Y el listFacturas.action
122 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

1 package prototipo2;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Set;
6 import java.util.HashSet;
7 import org.apache.struts2.config.Result;
8 import org.apache.struts2.views.freemarker.FreemarkerResult;
9 import com.opensymphony.xwork2.ActionSupport;
10 import com.opensymphony.xwork2.Preparable;
11
12 public class ListFacturasAction extends ActionSupport {
13
14 FacturaManager facturaManager;
15 List facturas = new ArrayList();
16
17 public void setFacturaManager(FacturaManager facturaManager) {
18 this.facturaManager = facturaManager;
19 }
20
21 public String execute() throws Exception {
22 //facturas.equals(facturaManager.getFacturas());
23 //facturas = facturaManager.getFacturas();
24 facturas.addAll(facturaManager.getFacturas());
25 return SUCCESS;
26 }
27
28 public List getFacturas() {
29 return facturas;
30 }
31
32 public int getFacturasCount() {
33 return facturas.size();
34 }
35 }

Como detalle decir que la aplicación funciona correctamente en jetty haciendo un mvn
jetty:run pero no hay manera de hacer que se despliegue correctamente en tomcat. Y lo
raro es que simplemente, en un momento dado dejo de dejarse desplegar sin hacer ningun
cambio. Por eso lo estoy ignorando. No es la primera vez que tomcat me hace tonterias.
Seguramente algun dia que reinicie todo el sistema (mañana es buen candidato pq quiero
hacer un backup del /home) tomcat empiece a funcionar OK de nuevo.

F.22. 10/jun/2007
Ayer me lei un libro entero de struts2, el Starting Struts2. Hoy voy a comenzar a desarro-
llar sobre struts. Para ello he cojido el blanck proyect de struts2 y lo he unzippeado (un
war no es mas que un zip). Luego he ido al directorio de webapps de tomcat y he enlazado
simbolicamente al directorio PFC/p2/p2 que es donde voy a construir el prototipo.

He estado jugando con maven. Es una maravilla de herramienta. Es super sencillo hacer
cosas como crear proyectos para idea, para eclipse, para instalar las apps o para lanzar
jetty.

He configurado el plugin tomcat de maven2. he tenido que añadir al pom.xml una peque-
ña configuración porque yo no arranco tomcat en el 8080 si no en el 18080

1 <plugin>
2 <groupId>org.codehaus.mojo</groupId>
3 <artifactId>tomcat-maven-plugin</artifactId>
4 <configuration>
5 <url>http://localhost:18080/manager</url>
6 <server>tomcat-local</server>
7 </configuration>
8 </plugin>
F.23. 9/JUN/2007 123

El tomcat-local lo tengo que poner de identificador para que maven2 sepa cual es el login
y passwrod del manager de tomcat. Esto se configura en el /.m2/settings.xml

1 dgrabla@alderaan:~/.m2\$ cat settings.xml


2 <servers>
3 <server>
4 <id>tomcat-local</id>
5 <username>admin</username>
6 <password>tomcat</password>
7 </server>
8 </servers>

Ahora al hacer un tomcat:deploy ya se instala solo en el webapps de tomcat y es accesible


desde localhost:18080/aplicacion. Para volverlo a deployar pues mvn tomcat:redeploy

He estado tratando de hacer una aplicación CRUD mostrando solo las facturas pero no
hay manera de hacerlo funcionar. Al final he copiado un ejemplo de struts2 pero TAM-
POCO funciona lo que me da que pensar que igual es un problema por usar java6. Quedo
pendiente pobar con java5 a ver si asi funciona.

F.23. 9/jun/2007
He seguido puliendo el capitulo de servicios sobre voip

He avanzado algo con el prototipo2. He estado mirando el video de cómo crear PO-
JOs/entities con struts2 y he abierto IDEA, creado un nuevo packete model, una nueva
clase facturas siguiendo el tutorial de persistencia de appfuse. He generado los getters
y setters con IDEA. Pulso ctl+shift+N para abrir un nuevo fichero, el hibernate.cfg.xml
(Lo del ctl+shift+n lo he tenido q sacar de una referencia de keymap de la web de idea)
El hibernate.cfg.xml queda asi:
1 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
2 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
3
4 <hibernate-configuration>
5 <session-factory>
6 <mapping class="org.appfuse.model.User"/>
7 <mapping class="org.appfuse.model.Role"/>
8 <mapping class="es.grajal.factura"></mapping>
9 </session-factory>
10 </hibernate-configuration>

Y el factura.java asi (dentro de main/java/es/grajal):


1 package es.grajal.model;
2
3 import org.appfuse.model.BaseObject;
4 //import javax.persistence.Entity;
5 import javax.persistence.GenerationType;
6 //import javax.persistence.Id;
7 import javax.persistence.GeneratedValue;
8 //import javax.persistence.Column;
9
10 public class factura extends BaseObject {
11 private Long id;
12 private String costeTotal;
13 private String concepto;
14 private String NombreUsuario;
15 private String NumeroTelefono;
16 private bool emitida;
17 private timestamp fechaEmision;
18
19
20 public Long getId() {
124 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

21 return id;
22 }
23
24 public void setId(Long id) {
25 this.id = id;
26 }
27
28 public String getCosteTotal() {
29 return costeTotal;
30 }
31
32 public void setCosteTotal(String costeTotal) {
33 this.costeTotal = costeTotal;
34 }
35
36 public String getConcepto() {
37 return concepto;
38 }
39
40 public void setConcepto(String concepto) {
41 this.concepto = concepto;
42 }
43
44 public String getNombreUsuario() {
45 return NombreUsuario;
46 }
47
48 public void setNombreUsuario(String nombreUsuario) {
49 NombreUsuario = nombreUsuario;
50 }
51
52 public String getNumeroTelefono() {
53 return NumeroTelefono;
54 }
55
56 public void setNumeroTelefono(String numeroTelefono) {
57 NumeroTelefono = numeroTelefono;
58 }
59
60 public bool getEmitida() {
61 return emitida;
62 }
63
64 public void setEmitida(bool emitida) {
65 this.emitida = emitida;
66 }
67
68 public timestamp getFechaEmision() {
69 return fechaEmision;
70 }
71
72 public void setFechaEmision(timestamp fechaEmision) {
73 this.fechaEmision = fechaEmision;
74 }
75 }

Ahora hacemos un mvn appfuse:gen. Da errores. El problema nos lo dan con los tipos
de datos bool y timestamp. Como es un prototipo y me viene a dar igual el tipo de datos,
cambio el flag bool por un int y el timestamp por otro string. Ademas appfuse se queja
de la uqe la clase no es abstracta y no tiene todas las funciones de baseobject, con toda la
razon del mundo. Uso IDEA para generar el toString() hashcode() y equals(). Queda asi:

1 package es.grajal.model;
2
3 import org.appfuse.model.BaseObject;
4 //import javax.persistence.Entity;
5 import javax.persistence.GenerationType;
6 //import javax.persistence.Id;
7 import javax.persistence.GeneratedValue;
8 //import javax.persistence.Column;
9
10 public class factura extends BaseObject {
11 private Long id;
12 private String costeTotal;
13 private String concepto;
14 private String NombreUsuario;
15 private String NumeroTelefono;
16 private int emitida;
F.23. 9/JUN/2007 125

17 private String fechaEmision;


18
19
20 public Long getId() {
21 return id;
22 }
23
24 public void setId(Long id) {
25 this.id = id;
26 }
27
28 public String getCosteTotal() {
29 return costeTotal;
30 }
31
32 public void setCosteTotal(String costeTotal) {
33 this.costeTotal = costeTotal;
34 }
35
36 public String getConcepto() {
37 return concepto;
38 }
39
40 public void setConcepto(String concepto) {
41 this.concepto = concepto;
42 }
43
44 public String getNombreUsuario() {
45 return NombreUsuario;
46 }
47
48 public void setNombreUsuario(String nombreUsuario) {
49 NombreUsuario = nombreUsuario;
50 }
51
52 public String getNumeroTelefono() {
53 return NumeroTelefono;
54 }
55
56 public void setNumeroTelefono(String numeroTelefono) {
57 NumeroTelefono = numeroTelefono;
58 }
59
60 public int getEmitida() {
61 return emitida;
62 }
63
64 public void setEmitida(int emitida) {
65 this.emitida = emitida;
66 }
67
68 public String getFechaEmision() {
69 return fechaEmision;
70 }
71
72 public void setFechaEmision(String fechaEmision) {
73 this.fechaEmision = fechaEmision;
74 }
75
76
77 public String toString() {
78 return null; //To change body of implemented methods use File | Settings | File Templates.
79 }
80
81 public int hashCode() {
82 return 0; //To change body of implemented methods use File | Settings | File Templates.
83 }
84
85 public boolean equals(Object o) {
86 return false; //To change body of implemented methods use File | Settings | File Templates.
87 }
88 }

Ok ahora SI pregunta por el nombre del PoJO. Pongo factura. Me da error porque dice
que en el appfuse.cfg.xml no encuentra el fichero es.grajal.factura. Tiene razón, tiene que
ser es.grajal.model.factura. Ok ahora ya no da errores

Hago mvn appfuse:install -Dentity=factura


126 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

No funciona. Me doy cuenta que me faltaban las anotaciones JPA. Edito de nuevo el
fichero

1 package es.grajal.model;
2
3 import org.appfuse.model.BaseObject;
4 //import javax.persistence.Entity;
5 import javax.persistence.GenerationType;
6 //import javax.persistence.Id;
7 import javax.persistence.GeneratedValue;
8 import javax.persistence.Entity;
9 import javax.persistence.Id;
10 //import javax.persistence.Column;
11
12 @Entity
13 public class factura extends BaseObject {
14 private Long id;
15 private String costeTotal;
16 private String concepto;
17 private String NombreUsuario;
18 private String NumeroTelefono;
19 private int emitida;
20 private String fechaEmision;
21
22 @Id
23 public Long getId() {
24 return id;
25 }
26
27 public void setId(Long id) {
28 this.id = id;
29 }
30
31 public String getCosteTotal() {
32 return costeTotal;
33 }
34
35 public void setCosteTotal(String costeTotal) {
36 this.costeTotal = costeTotal;
37 }
38
39 public String getConcepto() {
40 return concepto;
41 }
42
43 public void setConcepto(String concepto) {
44 this.concepto = concepto;
45 }
46
47 public String getNombreUsuario() {
48 return NombreUsuario;
49 }
50
51 public void setNombreUsuario(String nombreUsuario) {
52 NombreUsuario = nombreUsuario;
53 }
54
55 public String getNumeroTelefono() {
56 return NumeroTelefono;
57 }
58
59 public void setNumeroTelefono(String numeroTelefono) {
60 NumeroTelefono = numeroTelefono;
61 }
62
63 public int getEmitida() {
64 return emitida;
65 }
66
67 public void setEmitida(int emitida) {
68 this.emitida = emitida;
69 }
70
71 public String getFechaEmision() {
72 return fechaEmision;
73 }
74
75 public void setFechaEmision(String fechaEmision) {
76 this.fechaEmision = fechaEmision;
77 }
78
79
F.24. 8/JUN/2007 127

80 public String toString() {


81 return null; //To change body of implemented methods use File | Settings | File Templates.
82 }
83
84 public int hashCode() {
85 return 0; //To change body of implemented methods use File | Settings | File Templates.
86 }
87
88 public boolean equals(Object o) {
89 return false; //To change body of implemented methods use File | Settings | File Templates.
90 }
91 }

Ahora el mvn appfuse:install -Dentity=factura

1 [INFO] [appfuse:install]
2 [INFO] [AppFuse] Installing generated files (pattern: **/*.java)...
3 [INFO] [AppFuse] Installing sample data for DbUnit...
4 [INFO] [AppFuse] Installing Spring bean definitions...
5 [INFO] [AppFuse] Installing Struts views and configuring...
6 [INFO] [AppFuse] Installing generated files (pattern: **/model/*.xml)...
7 [INFO] [AppFuse] Installing generated files (pattern: **/webapp/action/*.xml)...
8 [INFO] [AppFuse] Installing i18n messages...
9 [INFO] [AppFuse] Installing menu...
10 [INFO] [AppFuse] Installing UI tests...
11 [INFO] ------------------------------------------------------------------------
12 [INFO] BUILD SUCCESSFUL
13 [INFO] ------------------------------------------------------------------------
14 [INFO] Total time: 12 seconds
15 [INFO] Finished at: Sat Jun 09 14:53:18 GMT 2007
16 [INFO] Final Memory: 14M/29M
17 [INFO] ------------------------------------------------------------------------

Ok parece que todos los ficheros se han creado OK. Ahora hago un mvn jetty:run-war...

Da errores por todos los lados... me estoy empezando a cansar de appfuse2, pensaba que
estaba mas o menos depurada pero veo que tiene demasiados errores. No necesito toda
la complejidad de appfuse asi que voy a hacer un nuevo prototipo de 0 con struts2.

F.24. 8/jun/2007
Me he estado leyendo un monton de documentación sobre IMS y he reescrito y comple-
tado algunas de las secciones sobre voIP. De hecho ese capítulo ha cambiado de nombre
y ahora se llama servicios telefónicos orientados a la web. Resulta que hay un español
que es toda una autoridad en la materia, estaria bien mandarle un email comentandole
como funciona mi plataforma (el prototipo) y preguntarle si eso se puede considerar un
servicio o una pltaforma IMS.

He hecho un diagrama copiado del libro[1].

F.25. 7/jun/2007
Me he dado cuenta que el capitulo de voip esta hecho un desbarajuste porque en ningun
momento hablo de IMS y eso es una cagada monumental porque IMS es el core de todo
esto. Lo he apuntado como aviso y he empezado a trabajar en arreglarlo: He hecho un
nuevo diagrama en la página 18 donde empiezo a contar la arquitectura de la aplicación
IMS.
128 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

He empezado a desarrollar el índice alfabético del final con el paquete makeidx, poniendo
makeindex al principio del documento (antes del begin) y poniendo sentencias index
desperdigadas por el documento.

He ajustado el tamaño de varias imagenes y he creado la nueva imagen de los compo-


nentes del prototipo ERP de la página 37. Ojo porque en EPS queda muy mal porque no
convierte bien las imagenes asi que esta incluida como png.

He hecho un nuevo diagrama para el prototipo VoIP. Esta en la página 52

He empezado el desarrollo del prototipo2

1 dgrabla@alderaan:~/facultad/PFC/prototipo2\$ mvn archetype:create -DarchetypeGroupId=org.appfuse -DarchetypeArtifactId=

Como hice unos dias para la M4 pasamos el proyecto a postgresql


1 dgrabla@alderaan:~/facultad/PFC/prototipo2/prototipo2\$ mvn integration-test -Ppostgresql
2 [INFO] Scanning for projects...
3 Downloading: http://static.appfuse.org/repository/org/appfuse/maven-warpath-plugin/1.0-m5/maven-warpath-plugin-1.0-m5.p
4 3K downloaded
5 Downloading: http://static.appfuse.org/repository/org/appfuse/appfuse/2.0-m5/appfuse-2.0-m5.pom
6 22K downloaded
7 Downloading: http://static.appfuse.org/repository/org/appfuse/maven-warpath-plugin/1.0-m5/maven-warpath-plugin-1.0-m5.j
8 9K downloaded
9 [INFO] ----------------------------------------------------------------------------
10 [INFO] Building AppFuse Struts 2 Application
11 [INFO] task-segment: [integration-test]
12 [INFO] ----------------------------------------------------------------------------
13 (...)
14 [INFO] ------------------------------------------------------------------------
15 [ERROR] BUILD ERROR
16 [INFO] ------------------------------------------------------------------------
17 [INFO] Error resolving version for ’org.codehaus.mojo:appfuse-maven-plugin’: Plugin requires Maven version 2.0.6
18 [INFO] ------------------------------------------------------------------------
19 [INFO] For more information, run Maven with the -e switch
20 [INFO] ------------------------------------------------------------------------
21 [INFO] Total time: 11 seconds
22 [INFO] Finished at: Thu Jun 07 15:13:52 GMT 2007
23 [INFO] Final Memory: 5M/10M
24 [INFO] ------------------------------------------------------------------------

Vaya, pide maven 2.0.6 y yo tengo maven 2.0.5. Instalamos la nueva version y volvemos
a probar. Ahora ya funciona OK.

He creado la base de datos prototipo2 con phppgadmin

Modificaciones al pom.xml. Le digo a jetty que arranque en el 18081 y le pongo los datos
de la base de datos.

Ahora la hacer el mvn integration-test -Ppostgresql ya funciona ok, aunque da un error


de uno de los test. Me imagino que sera un porblema de la M5.

No hay manera de levantar a jetty y me parece que es por la BD. Supongo que sera un
tema de ma M5 asi que voy a probar con lo que la usa todo el mundo, con mysql.

He bajado mysql 5.0.41 y la he instalado y he creado una base de datos prototipo2 con
ayuda de phpmysqladmin

He configurado el pom.xml de nuevo para decirle a jetty que cargue en el puerto 18080

Ahora SI funciona OK sin dar fallos mi problemas. Esto significa que la M5 debe tener
problemas con postgresql y que salvo algo raro, desarrollare el prototipo2 sobre mysql
F.26. 6/JUN/2007 129

F.26. 6/jun/2007
Ayer no termine de convertir todas las tablas realmente, lo he terminado hoy. Ya no hay
sidewaystables (que pena, con lo que me costo hacerlas).

He hecho un boceto del primer caso de uso, el de creación de mayoristas

He reordenado la sección de planificación del prototipo ERP y he creado una nueva


sección para la interfaz de usuario. La idea es explicar cómo funciona la aplicación y lo
que hace cada uno de los botones. Creo que lo explicaré usando un diagrama sobre un
par de capturas de pantallas. Una captura para la parte de login, otra para la vista general
de la aplicación y otra más para las vistas de edición.

F.27. 5/jun/2007
Trabajando en el tema de arquitecturas, me he dado cuenta que estoy poniendo a JSLEE
y a SIP-servlets como si fueran capas de middleware pero en realidad pueden ser usados
para construir en si mismos una plataforma completa voIP. Es decir, se puede usar JSLEE
para hacer la centralita voIP. Voy a mandar un email a gustavo para que me aclare esto.

el primer y el segundo prototipo son muy distintos y no creo que me de tiempo a uni-
ficar el tema de la telefonia con la aplicación de ERP. Voy a seguir escribiendo la parte
del prototipo como fueran independientes con vista de a una posible separación en dos
capitulos separados.

Nada no hay manera de cuadrar las cosas, mejor lo separo en dos capitulos y dos pro-
totipos independientes. He cambiado el nombre al antiguo prototipo y ahora se llama
prototipo_erp.tex En ese capítulo sólo voy a hablar del primer prototipo. Luego he crea-
do un nuevo prototipo_voip en el que explicare como funciona el prototipo que por cierto,
tengo pendiente de programar aún :).

He mandado el changelog desde su sitio original en el prototipo a un anexo porque en


el changelog voy escribiendo todo lo que hago relacionado con el proyecto, desde la
documentación en latex a la configuracion de asterisk pasando por el primer y segundo
prototipos.

He cambiado el nombre a memoria.tex por voip.tex.

He pensado que quizas sea buena idea crear un capítulo de introducción a las aplica-
ciones Java. Asi el PFC tendria una forma mas coherente: Presentación - introduccion
aplicaciones java - prototipo erc - introduccion voip - aplicaciones voip - construccion
del prototipo voip - conclusiones -anexos. Habria que modificar muchas cosas pero me
gusta mucho más esta estructura.

Me he cargado el apartado de funcionalidades del proyecto ERP. En la introducción ya


digo lo que hace la aplicación y lo vuelvo a repetir en el apartado de especificaciones del
cliente.

Arreglando fallitos del PFC me he vuelto a encontrar con las tablas de la base de datos.
La última vez que estuve con ellas tenia problemas por que las rotaba y al rotarlas se
iban a la ultima página y aun asi no quedaban nada bien. Se me ha ocurrido una idea
130 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

super lógica que es en vez de hacer tablas de 2 filas y tropocientas columnas, hacerlas de
tropocientas filas y dos columnas. Ahora queda mucho mejor y he convertido todas las
tablas al nuevo formato.

F.28. 4/jun/2007
He continuado escribiendo el PFC, secciones y documentación añadida por aqui y por
alla y cosas y secciones eliminadas o simplificadas. Se me ha ocurrido separar el tema de
VoIP en dos capitulos independientes, uno de instroducción a la VoIP y otro explicando
las arquitecturas de voIP en web. No lo he separado aún.

F.29. 3/jun/2007
He continuado escribiendo el PFC, secciones y documentación añadida por aqui y por
alla y cosas y secciones eliminadas o simplificadas. El PFC aún esta patas arriba pero
poco a poco va tomando una forma sólida.

He bajado la nueva version de trixbox (esta ya por la 2.2 estable y yo la última que prove
fue una beta de la 2.0) y de asterisknow beta 5. Esta última no la habia probado nunca
porque la primera version que salio fue en noviembre del 2006. Ha sido la primera en ser
probada. He hecho un par de capturas que empiezan en la página 69. La he configurado
con un sólo usuario en la extensión 600 y un service provider:Todas las llamadas externas
son enrutadas via voipcheap. Luego he tratado de configurar el SPA921 para enganchar al
asterisk pero mientras lo hacia el asteriskNOW ha empezado a dar errores ‘set_rtc_mmss:
can’t update from 2 to 59‘ o tb 1 to 58 o 1 to 59. Como no tengo muy claro a santo de
que viene pero me da que es problema de la máquina virtual lo que he hecho es pasar a
trixbox para ver si ha mejorado en todos estos meses.

He arrancado trixbox2.2 y el router aun tenia la IP guardada en el servidor DHCP. Le


ha asignado la misma IP que le dio la última vez que lo arranqué. Trixbox ha mejorado
MUCHISIMO, pero vamos una barbaridad. Es muchisimo más bonito usable y completo.
Vamos a ver si funciona...

Esta muy bien pero tiene el mismo problema que me daba hace 6 meses. Llega un punto
en que no hay manera de efectuar una llamada. Sale un mensaje de error que no entiendo
y no hay manera de solucionarlo, ni siquiera reiniciandolo.

Como no me voy a quedar a medias he rearrancado el asterisk nativo en alderaan.

Necesitaba un softphone sip para probar la centralita (para llamar de una extensión a otra
en local) asi que he estado probando gizmo (un bonito softphone pero que no funciona
porque no es puro, todas las llamadas pasan por el servidor de gizmo y no consigo que
se registre en mi servidor tras 2 NATs) y wengophone que es con el que me he quedado
porque funciona muy bien (Una vez que configuras el sistema de sonido claro). Me he
quedado con ganas de probar Kcall, Kphone y twinkle.

Lo que no consigo es que llame a través de voipcheap... vamos a pelearnos un poco más...
F.30. 2/JUN/2007 131

Conseguido
He añadido al extensions.conf:
1 exten => _+.,1,Dial(SIP/\${EXTEN}@voipcheap,60,Ttr)
2 exten => _+.,2,Hangup

Y al sip.conf
1 register => david.grajal:[email protected]

En la parte [global]
Y
1 [voipcheap]
2 type=peer
3 host=sip1.voipbuster.com
4 username=david.grajal
5 fromuser=david.grajal
6 secret=PASSWORD

Como nuevo dispositivo SIP. Ojo porque en la documentacion que se encuentra por in-
ternet hay MUCHAS mas lineas para el sip.conf pero si se ponen, no funciona.
Esto de tener la centralita de nuevo en marcha es un hito en el PFC. Por primera vez
voy haciendo la documentación a la vez que juego con las cosas. Además ahora tengo 2
telefónos para probar (un hardphone, el sipura y un softphone el wengophone) y puedo
hacer llamadas salientes.
Recordatorio: Para arrancar la consola de gestion de asterisk, una vez arrancado el servi-
dor asterisk -vvvvr.
Un ejemplo de programa en AGI con PHP para gestionar un envio de SMS por asterisk
Sobre seguridad en VoIP http://www.minisip.org/publications.html

F.30. 2/jun/2007
Me he dado cuenta que los diagramas les estaba insertando como ficheros PNG cuando
puedo aprovechar latex para insertar directamente formatos vectoriales EPS. He hecho la
prueba con el diagrams/estructura_documento del capítulo de introducción y la verdad es
que queda MUCHO mejor en un formato vectorial. Luego he cambiado el makefile para
crear los EPS al hacer un make all y he cambiado los ficheros para incluir los EPS en vez
de los PNG (Simplemente borro los PNG y quito la extensión en los ficheros de texto
para que por defecto genere un PDF desde el EPS y incluya la imagen). El problema es
que creo que no exporta bien a eps porque los bitmap de las imágenes aparecen cortados
asi que tal vez retorne a los PNG normales. (Pero para diagramas de solo lineas, solo
texto sin bitmaps queda mucho mejor en vectorial)
He visto que la semana pasada ha salido la M5 de appfuse2.0. Creo que va siendo hora de
preparar el nuevo prototipo. Si, nuevo prototipo. Llevo un tiempo pensando que lo mejor
para que me de tiempo a acabar el proyecto es hacer un nuevo prototipo más simplificado
exclusivamente para el tema de la telefonía. La integración con la aplicacición ERP queda
para más adelante como una linea futura de desarrollo.
132 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

He estado jugando con el paquete color, con los comandos fcolorbox y colorbox. Los
pretendia usar para hacer recuadros con las anotaciones en ROJO y fondo amarillo para
que se note bien que son marcas de edicion que no estaran en el texto definitivo. fcolorbox
sirve para poner el fondo y un borde de un pixel de diferentes colores y el colorbox sólo
para definir el fondo. Al final he pasado del recuadro porque al usarlo, no hay manera de
partirlo en varias lineas. Usaré texto en rojo penetrante para marcar las notas de edición.

Nuevos textos, nuevas secciones. Escritura de algunos textos por todo el PFC.

F.31. 1/jun/2007
He empezado a migrar la documentación de las tablas de la base de datos del wiki a
latex. He tenido que incluir el paquete usepackage{rotating} para poder rotar las tablas.
No me caben de otra manera!. Lo que no he conseguido es posicionarlas donde quiero,
lo mejor que he conseguido es no especificando ninguna posición porque entonces al
menos las tablas se quedan en la misma página donde las he creado. Si las digo h se
van a una página de elementos flotantes al final del capítulo. Se supone que diciendo h!
latex deberia plantar la tabla donde yo quiera bajo mi responsabilidad pero al menos mi
version de latex (texlive) pasa del !.

Ya he encontrado la manera de decir que QUIERO AQUI mi figura o tabla. Se hace


usando el paquete float y usando como posicionador H (con mayuscula).

F.32. 31/may/2007
He terminado de hacer todas las prácticas y memorias de las asignaturas. Aún tengo
que hacer 2 exámenes pero voy a empezar a dedicar mucho tiempo al proyecto para
poder acabarlo en julio. Hoy he empezado a reescribir la documentación, a recordar como
funcionaba el makefile y el entorno de desarrollo que hacia mucho tiempo que nolo
tocaba. También he empezado a migrar contenidos del Wiki Twiki a la documentación
en latex del PFC, en concreto el changelog.

F.33. 21/abr/2007
He conseguido incluir el anteproyecto dentro del PFC. Lo he hecho insertando cada una
de las páginas como si fueran imágenes PDF. Latex Powa!
El anteproyecto.tex queda asi:

1 \chapter{Anteproyecto\label{sec:anteproyecto}}
2
3 El anteproyecto mostrado en las siguientes páginas fue presentado al director del proyecto (\DirectorPFC) durante el me
4
5 El anteproyecto aqui presentado por tanto es meramente orientativo y se incluye como extra :) ¿?¿?
6
7 \newpage
8 \includegraphics[scale=0.8, page=1]{../anteproyecto/anteproyecto_david_grajal_43118.pdf}
9 \newpage
10 \includegraphics[scale=0.8, page=2]{../anteproyecto/anteproyecto_david_grajal_43118.pdf}
11 \newpage
12 \includegraphics[scale=0.8, page=3]{../anteproyecto/anteproyecto_david_grajal_43118.pdf}
13 \newpage
14 \includegraphics[scale=0.8, page=4]{../anteproyecto/anteproyecto_david_grajal_43118.pdf}
F.34. 20/ABR/2007 133

He estado trabajando y desarrollando la sección de... agradecimientos! creo que agradez-


co a todo el mundo ya smile

He añadido la sección de propiedad intelectual dentro de licencia.

F.34. 20/abr/2007
He definido una estructura un poco más avanzada de cómo estructurar la aplicación y he
hecho un nuevo diagrama.

He añadido la generación automática del png desde el dia en el makefile

He pulido errores en el makefile : Jabref en background

He añadido una referencia nueva (JAIN-SLEE)

He mandado un mail a pablo preguntando por jain slee ¿q coño es y es mejor q lo q voy
a usar yo?

Hoy me he dado cuenta de la existenca de JAIN SLEE y lo he asociado a una conferencia


de NETSPIRE a la que acudí hace unos meses. Netspire es una startup española que
fue comprada por ericsson y que desarrollo una implementacion de centralita o algo asi
en JAIN SLEE. Ahora me voy a poner las pilas a ver de q coño va jain y para conocer
mobicents (un servidor de aplicaciones de eventos jain slee open source) -rhino es otro
pero este es comercial.

He instalado latex-beamer para usarlo para hacer las diapositivas de la presentación del
PFC
Me he complicado mucho la vida pero al final me he dado cuenta que soy tonto pq tiene
paquete en debianvim be

1 apt-get install latex-beamer

He tenido que instalar tambien un paquete de fuentes brutal de latex (de 120mb descom-
primido) para poder usar la plantilla q mola de beamer

he creado un directorio /presentacion y he hecho un makefile sencillo, y un presenta-


cion.tex q enlaza con un presentacion_style.tex y un presentacion_body.tex. En el body
estan las definiciones de las diaposiitvas y en el style la apariencia general. Copiare lo que
pueda de la presentacion de ejemplo que me gusta que pone el titulo de las diapositivas
en la barra lateral.

presentacion.pdf: primer boceto de la presentacion del pfc

F.35. 18/abr/2007
Hoy me he puesto a avanzar un poco la documentación. Como finalmente voy a usar
LATEX para la edición del proyecto me tengo que poner al día.
134 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

Voy a usar KILE para editar los ficheros de texto y la codificación será UTF8 (Ojo no es
broma, luego puede dar problemas!!)

Para el manejo de la bibliografia usaré JabRef?. El texto no va a tener muchas referencias


pero bueno, siempre ses bueno aprender a usar una herramienta más.

He solucionado el problema con bibtex, he solucionado el problema de los acentos y de


las imágenes.

He hecho una estructura preliminar ya con la estética requerida por la UAX y he creado
un documento preliminar inicial.

Dejo pendiente hacer una estructura definitiva del proyecto y luego... a comenzar a do-
cumentar

Como curiosidad el entorno de desarrollo es el siguiente: Dejamos una xterm abierta, por
un lado kile editando los ficheros .tex y por otro lado Kpdf viendo el pdf resultante. Po-
demos editar los ficheros y hacer un "make fast.en la xterm lo que generará el fichero pdf
muy rápido mediante rubber. Y lo mejor es que kpdf se AUTOACTUALIZA volviendo
a abrir el pdf pero manteniendo la página en la que te encontrabas. Esto es muy potente
y es una forma muy rápida de ir incorporando los cambios. (Latex rules!)

F.36. 17/abr/2007
He terminado de incorporar todos los ficheros al repositorio del SVN.

Como ya esta expandido el arbol no podemos hacer un mvn jetty:run-war. Debemos hacer
un mvn jetty:run

1 [INFO] Jetty server exiting.


2 [INFO] ------------------------------------------------------------------------
3 [ERROR] BUILD ERROR
4 [INFO] ------------------------------------------------------------------------
5 [INFO] Failure

No funciona pq no he especiicado el puerto y el 8080 que es el que intenta esta ocupado


por apache. Para cambiarlo nos vamos al pom.xml y en la configuracion de jetty añadimos
un conector:
1 <connectors>
2 <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
3 <port>19090</port>
4 <maxIdleTime>60000</maxIdleTime>
5 </connector>
6 </connectors>

Por ultimo hay que borrar dos cosas (esta en los foros de appfuse)

1 rm -r src/main/webapp/WEB-INF/lib
2 rm src/main/webapp/WEB-INF/classes/struts.xml

Ahora al hacer un mvn jetty:run ya funciona y se peude ver la página en localhost:19090


Mañana trataré de ver las diferencias entre el arbol de la actual aplicación y esto y tratare
de hacer una migración ráida a ver que pasa.
F.37. 13/ABR/2007 135

F.37. 13/abr/2007
Me he leido un monton de documentación sobre maven: http://today.java.net/pub/a/today/2007/03/01/bui
web-applications-with-maven-2.html http://www.javaworld.com/javaworld/jw-05-2006/jw-
0529-maven.html

He hecho mi primer mvn jetty:run-war pero no funciona porque trata de arrancarlo en el


puerto 8080 que esta en uso

Para ahcer un mvn war:inplace es necesario correrlo sobre un sistema de control de ver-
siones asi que el proximo paso sera hacer un repositorio svn

Creación del repo SVN: Creo el directorio SVN y dentro de el creamos un repositorio
para las pruebas con appfuse2 (pruebas-appfuse2)

1 svnadmin create --fs-type bdb pruebas-appfuse2

Luego importamos una version inicial del repo.

1 svn import ~/facultad/PFC/pruebas-appfuse2/ file:///home/dgrabla/facultad/PFC/svn/pruebas-appfuse2/


2 (...)
3 Añadiendo /home/dgrabla/facultad/PFC/pruebas-appfuse2/idages/idages.iml
4 Añadiendo /home/dgrabla/facultad/PFC/pruebas-appfuse2/idages/idages.iws
5 Añadiendo /home/dgrabla/facultad/PFC/pruebas-appfuse2/idages/velocity.log
6
7 Commit de la revisión 1.

Y ahora ya podemos bajarnos la version HEAD

1 svn checkout file:///home/dgrabla/facultad/PFC/svn/pruebas-appfuse2/


2 (...)
3 dgrabla@alderaan:~/facultad/PFC$ cd pruebas-appfuse2
4 dgrabla@alderaan:~/facultad/PFC/pruebas-appfuse2$ ls
5 idages
6 dgrabla@alderaan:~/facultad/PFC/pruebas-appfuse2$ ls -lsah
7 total 512
8 0 drwxr-xr-x 4 dgrabla dgrabla 96 2007-04-13 22:16 .
9 512 drwxrwxrwx 11 dgrabla dgrabla 560 2007-04-13 22:16 ..
10 0 drwxr-xr-x 5 dgrabla dgrabla 304 2007-04-13 22:17 idages
11 0 drwxr-xr-x 6 dgrabla dgrabla 208 2007-04-13 22:17 .svn
12 dgrabla@alderaan:~/facultad/PFC/pruebas-appfuse2$

Ahora ya podemos hacer un mvn war:explore

1 dgrabla@alderaan:~/facultad/PFC/pruebas-appfuse2/idages$ mvn war:inplace


2 [INFO] Scanning for projects...
3 [INFO] Searching repository for plugin with prefix: ’war’.
4 [INFO] ----------------------------------------------------------------------------
5 [INFO] Building AppFuse Struts 2 Application
6 [INFO] task-segment: [war:inplace]
7 [INFO] ----------------------------------------------------------------------------
8 [INFO] [war:inplace]
9 [INFO] Generating webapp in source directory... /home/dgrabla/facultad/PFC/pruebas-appfuse2/idages/src/main/webapp
10 [INFO] Exploding webapp...
11 [INFO] Assembling webapp idages in /home/dgrabla/facultad/PFC/pruebas-appfuse2/idages/src/main/webapp
12 [INFO] Overlaying 2 war(s).
13 [INFO] ------------------------------------------------------------------------
14 [INFO] BUILD SUCCESSFUL
15 [INFO] ------------------------------------------------------------------------
16 [INFO] Total time: 20 seconds
17 [INFO] Finished at: Fri Apr 13 22:34:03 CEST 2007
18 [INFO] Final Memory: 6M/12M
19 [INFO] ------------------------------------------------------------------------
20 dgrabla@alderaan:~/facultad/PFC/pruebas-appfuse2/idages$
136 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

Y las diferencias

1 dgrabla@alderaan:~/facultad/PFC/pruebas-appfuse2/idages$ svn status


2 ? src/main/webapp/clickstreams.jsp
3 ? src/main/webapp/viewstream.jsp
4 ? src/main/webapp/styles
5 ? src/main/webapp/error.jsp
6 ? src/main/webapp/scripts
7 ? src/main/webapp/common
8 ? src/main/webapp/META-INF
9 ? src/main/webapp/403.jsp
10 ? src/main/webapp/index.jsp
11 ? src/main/webapp/404.jsp
12 ? src/main/webapp/login.jsp
13 ? src/main/webapp/logout.jsp
14 ? src/main/webapp/decorators
15 ? src/main/webapp/images
16 ? src/main/webapp/template
17 ? src/main/webapp/WEB-INF/pages
18 ? src/main/webapp/WEB-INF/sitemesh.xml
19 ? src/main/webapp/WEB-INF/decorators.xml
20 ? src/main/webapp/WEB-INF/appfuse.tld
21 ? src/main/webapp/WEB-INF/lib
22 ? src/main/webapp/WEB-INF/security.xml
23 ? src/main/webapp/WEB-INF/applicationContext-struts.xml
24 ? src/main/webapp/WEB-INF/resin-web.xml
25 ? src/main/webapp/WEB-INF/dwr.xml
26 ? src/main/webapp/WEB-INF/classes
27 M idages.iws
28 dgrabla@alderaan:~/facultad/PFC/pruebas-appfuse2/idages$

Ok ahora ya casi tenemos todo configurado, solo que yo no quiero usar jetty como servi-
dor porque para algo tengo ya tomcat corriendo!

F.38. 29/mar/2007
Me he dado cuenta que ayer me mando un email el sistema:

1 Date: Wed, 28 Mar 2007 11:55:07 -0700 (PDT)


2 From: Mail Delivery Subsystem <[email protected]>
3 Subject: Delivery Status Notification (Failure)
4 To: [email protected]
5 X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,NO_RELAYS
6 autolearn=ham version=3.1.7-deb
7
8 This is an automatically generated Delivery Status Notification
9
10 Delivery to the following recipient failed permanently:
11
12 [email protected]
13
14 Technical details of permanent failure:
15 PERM_FAILURE: SMTP Error (state 9): 550 5.1.1 No such user s7si1359590uge
16 ...
17 Test Name ha creado una cuenta para usted. Su usuario y contrase=F1a son lo=
18 s siguientes.
19
20 Username: newuser
21 Password: test
22
23 Login at: http://localhost:18081/idages-1.0-SNAPSHOT
24
25
26 ----- End of message -----

El rollo esta que en que uno de los integration-test crea un nuevo usuario y los datos estan
en el web-tests.xml dentro del srt/test/resources. Lo he cambiado a [email protected].
Ahora ya estamos en condiciones de preparar la aplicación para que se lance desde el
tomcat que ya teniamos instalado.
F.39. 28/MAR/2007 137

F.39. 28/mar/2007
He instalado maven 2.0.5
He instalado un appfuse2-m4 en modo básico en pruebas en /facultad/PFC/pruebas-
appfuse2 mediante maven2 usando el comando "mvn archetype:create -DarchetypeGroupId=org.appfuse
-DarchetypeArtifactId=appfuse-basic-struts -DremoteRepositories=http://static.appfuse.org/repository
-DarchetypeVersion=2.0-m4 -DgroupId=es.grajal -DartifactId=idages"
1 [INFO] Archetype created in dir: /home/dgrabla/facultad/PFC/pruebas-appfuse2/idages
2 [INFO] ------------------------------------------------------------------------
3 [INFO] BUILD SUCCESSFUL
4 [INFO] ------------------------------------------------------------------------
5 [INFO] Total time: 1 minute 7 seconds
6 [INFO] Finished at: Wed Mar 28 12:33:07 CEST 2007
7 [INFO] Final Memory: 5M/9M
8 [INFO] ------------------------------------------------------------------------

El arquetipo viene predefinido para trabajar en struts2+Hibernate (ok) pero con mysql5.
Uno de los requisitos básicos es usar postgresql. Despues de un buen rato rebuscando
en el pom.xml y en la documentacion de maven, hay que modificar el proyecto de la
siguiente manera:
1 dgrabla@alderaan:~/facultad/PFC/pruebas-appfuse2/idages$ mvn integration-test -Ppostgresql
2 [INFO] Scanning for projects...
3 [INFO] ----------------------------------------------------------------------------
4 [INFO] Building AppFuse Struts 2 Application
5 [INFO] task-segment: [integration-test]
6 [INFO] ----------------------------------------------------------------------------
7 Downloading: http://repo1.maven.org/maven2/postgresql/postgresql/8.1-407.jdbc3/postgresql-8.1-407.jdbc3.pom
8 681b downloaded
9 Downloading: http://static.appfuse.org/repository/net/sf/ehcache/ehcache/1.3.0-beta/ehcache-1.3.0-beta.jar
10 [WARNING] Unable to get resource ’net.sf.ehcache:ehcache:jar:1.3.0-beta’ from repository appfuse (http://static.appfuse
11 Downloading: http://repo1.maven.org/maven2/net/sf/ehcache/ehcache/1.3.0-beta/ehcache-1.3.0-beta.jar
12 222K downloaded
13 Downloading: http://repo1.maven.org/maven2/javax/servlet/jsp-api/2.0/jsp-api-2.0.jar
14 49K downloaded
15 Downloading: http://static.appfuse.org/repository/commons-logging/commons-logging/1.1/commons-logging-1.1.jar
16 51K downloaded
17
18 ...
19
20
21 [WARNING] 1 errors occurred while performing <hbm2ddl>.
22 [ERROR] Error #1: org.postgresql.util.PSQLException: Conexión rechazada. Verifique que el nombre del Host y el puerto s
23 [INFO] [compiler:testCompile]
24 [INFO] Nothing to compile - all classes are up to date
25 [INFO] [dbunit:operation {execution: test-compile}]
26 [INFO] ------------------------------------------------------------------------
27 [ERROR] BUILD ERROR
28 [INFO] ------------------------------------------------------------------------
29 [INFO] Error executing database operation: CLEAN_INSERT
30
31 Embedded error: Conexión rechazada. Verifique que el nombre del Host y el puerto sean correctos y que postmaster este a
32 Connection refused
33 [INFO] ------------------------------------------------------------------------
34 [INFO] For more information, run Maven with the -e switch
35 [INFO] ------------------------------------------------------------------------
36 [INFO] Total time: 14 seconds
37 [INFO] Finished at: Wed Mar 28 13:02:28 CEST 2007
38 [INFO] Final Memory: 13M/27M
39 [INFO] ------------------------------------------------------------------------

Supongo que el error se debe a que no he configurado la conexión con la base de datos.
Se configuran en el jdbc.username jdbc.password del profile postgresql del pom.xml.
Tambien hay que cambiar la BD por defecto. He creado una nueva BD llamada ida-
ges_appfuse2 para realizar las pruebas y he cambiado la BD en el pom.xml en el jdbc.url
1 ...
2 [INFO] ------------------------------------------------------------------------
138 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

3 [ERROR] BUILD ERROR


4 [INFO] ------------------------------------------------------------------------
5 [INFO] Error executing ant tasks
6
7 Embedded error: The following error occurred while executing this line:
8 /home/dgrabla/facultad/PFC/pruebas-appfuse2/idages/src/test/resources/web-tests.xml:23: Canoo Webtest: R_1454.
9 Test failed.
10 Test step steps (/home/dgrabla/facultad/PFC/pruebas-appfuse2/idages/src/test/resources/web-tests.xml:25: ) null failed
11 [INFO] ------------------------------------------------------------------------
12 [INFO] For more information, run Maven with the -e switch
13 [INFO] ------------------------------------------------------------------------
14 [INFO] Total time: 5 minutes 17 seconds
15 [INFO] Finished at: Wed Mar 28 19:08:57 CEST 2007
16 [INFO] Final Memory: 18M/33M
17 [INFO] ------------------------------------------------------------------------

Esto da problemas pero no tengo muy claro porque razon... Voy a pasar de esto pro ahora.

He instalado IntelliJ? IDEA 6.0.4 que sera el IDE con el que continuaré el proyecto.

1 dgrabla@alderaan:~/facultad/PFC/pruebas-appfuse2/idages$ mvn idea:idea


2 ...
3 [INFO] jdkName is not set, using [java version1.6.0] as default.
4 [INFO] ------------------------------------------------------------------------
5 [INFO] BUILD SUCCESSFUL
6 [INFO] ------------------------------------------------------------------------
7 [INFO] Total time: 6 minutes 50 seconds
8 [INFO] Finished at: Wed Mar 28 20:11:01 CEST 2007
9 [INFO] Final Memory: 13M/24M
10 [INFO] ------------------------------------------------------------------------

He instalado los plugins maven-2-integration y Maven reloaded como recomiendan en la


página de appfuse dedicada a IDEA: http://www.appfuse.org/display/APF/IDEA.

Ahora ya se puede abrir el proyecto en IDEA ->abrir proyecto ipr...


F.40. 27/MAR/2007 139

Figura F.2: Proyecto abierto en IDEA

Creo que ya atino porque el integratios-test falla: El test arranca tomcat en el 8080 pero
en el 8080 yo ya tengo apache corriendo. Le voy a decir a tomcat que arranque en otro
puerto. En el pom.xml cambio el cargo.prot a 18081
1 run-all-tests:
2 [INFO] Executed tasks
3 [INFO] ------------------------------------------------------------------------
4 [INFO] BUILD SUCCESSFUL
5 [INFO] ------------------------------------------------------------------------
6 [INFO] Total time: 2 minutes 55 seconds
7 [INFO] Finished at: Wed Mar 28 20:55:16 CEST 2007
8 [INFO] Final Memory: 46M/63M
9 [INFO] ------------------------------------------------------------------------

Ok ahora ya funciona OK. Ya estamos encaminados.

F.40. 27/mar/2007
El día 24 ha salido Appfuse 2.0 Milestone 4 y es la plataforma a la voy a migrar porque ya
parece maduro. La migracion va aser muy dura porque voy a migrar de Spring+Hibernate
en Eclipse a Struts2+Hibernate en IDEA. Primero porque struts parece un standard mas
importante en la industria y struts2 viene a ser webwork que era sencillo de usar. Asi me
hare una idea de como funcionan todos los frameworks java.
He instalado java 6 (jdk 1.6.0)
140 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

F.41. 12/mar/2007
El desarrollo ha estado parado en los ultimos meses por que no tenia internet en villa-
nueva de la cañada y eso dificulta mucho la buqueda de ls documentación y la busqueda
de soluciones a los problemas. Además de que he estado ocupado con los exámenes de
febrero. Ahora voy a empezar de nuevo a trabajar en el proyecto.
Appfuse2 esta a punto de salir y es un cambio radical respecto a las viejas versiones 1.9.x.
Por ahora, voy a esperar a que salga la primera versión estable de Appfuse2 y entonces
comenzaré a migrar la aplicación a la nueva plataforma.
Hoy he actualizado el cacho de entorno de desarrollo que no usa java, por ejemplo lo que
uso para escribir esta documentación. Ahora uso Apache 2.2.4 con PHP 5.2.1.
Por otro lado, hoy he configurado el sipura921 (Tania 10.58.x.201) con la cuenta SIP de
voipcheap y he hecho mi primera llamada SIP totalmente gratuita a la linea telefónica
tradicional, llamando a mi abuela de forma que ella no se ha dado cuenta del cambio.
Esto no pasa con Skype o usando voipcheap mediante los programas software lo que
demuestra que mi intuición de que es mejor usar un hardware especializado para voip
por el uso de los filtros hardware que se pueden usar.

F.42. 29/dic/2006
Se me han ocurrido nuevas funcionalidades:
Integrar el programa de gestión con la VoIP? para ofrecer información detallada de pedi-
dos, pagos pendientes y demás datos sobre la persona que nos está llamando
Los usuarios que quieran hablar con alguien de la empresa solamente tendrán que picar
un hipervinculo en la web
He desarrollado la primera versión del roadmap del PFC, indicando las novedades de los
ultimos dias (la liberacion de java como GPL por parte de SUN, asterisk release 1.4.0) y
los puntos clave del desarrollo actual.
Roadmap a dia 29/12/2006:

Figura F.3: Roadmap a 29 de diciembre del 2006


F.43. 18/DIC/2006 141

F.43. 18/dic/2006
He cambiado de tetex a texlive en la debian y usando la base de macros del repositorio de
swaml, he creado el primer pdf de la documentación. No respeta el estilo de la UAX ni
tiene aún un índice de contenidos pero es un avance bastante grande. Hay un screenshot
del momento del primer PDF. Hay problemas con los acentos que tratare de resolverlos
como hice hace 2 años con la práctica de AO que hice en LaTEX?.
Se me olvidar incluir esto ayer:

1 alderaan:/home/dgrabla# cat /etc/festival.scm


2 ;; Any site-wide Festival initialization can be added to this file.
3 ;; It is marked as a configuration file, so your changes will be saved
4 ;; across upgrades of the Festival package.
5
6 ;; Enable access to localhost (needed by debian users)
7 (set! server_access_list ’("localhost\\.localdomain" "localhost"))
8
9 ;; set italian voice (comment the following 2 lines to use british_american)
10 ;(language_spanish)
11 (set! voice_default ’voice_el_diphone)
12
13 ;;; Command for Asterisk begin
14 (define (tts_textasterisk string mode)
15 (utt.send.wave.client (utt.wave.resample (utt.wave.rescale (utt.synth
16 (eval (list ’Utterance ’Text string))) 5) 8000))
17 )
18 ;;; Command for Asterisk end

He decidido que usaré PROSPER para hacer las diapositivas para cañón de la documen-
tación.

Primera aplicación AGI. Usando asterisk-java-0.3 milestone 1. Ojo porque casi toda la
documentacion esta desactualizada, incluidos los tutoriales.
He añadido una nueva extensión
1 exten => 300,1,Agi(agi://localhost/hello.agi)

He creado una clase


1 alderaan:/home/dgrabla/facultad/PFC/idages-asterisk# cat HelloAGIScript.java
2
3 // import net.sf.asterisk.fastagi.AGIChannel;
4 // import net.sf.asterisk.fastagi.AGIException;
5 // import net.sf.asterisk.fastagi.AGIRequest;
6 // import net.sf.asterisk.fastagi.AbstractAGIScript;
7
8
9 import org.asteriskjava.fastagi.AgiChannel;
10 import org.asteriskjava.fastagi.AgiException;
11 import org.asteriskjava.fastagi.AgiRequest;
12 import org.asteriskjava.fastagi.BaseAgiScript;
13
14 public class HelloAGIScript extends BaseAgiScript {
15 public void service(AgiRequest request, AgiChannel channel) throws AgiException
16 {
17 answer();
18 streamFile("pfc/hola_mundo_primer_script_agi");
19 hangup();
20 }
21 }

Y un fichero de mapeo

1 alderaan:/home/dgrabla/facultad/PFC/idages-asterisk# cat fastagi-mapping.properties


2 hello.agi = HelloAGIScript
142 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

Para compilar la clase

1 alderaan:/home/dgrabla/facultad/PFC/idages-asterisk# javac -cp asterisk-java-0.3-m1.jar HelloAGIScript.java

Y para lanzar el servidor. (Ojo, requiere la maquina de sun y en la version java 1.5)

1 alderaan:/home/dgrabla/facultad/PFC/idages-asterisk# /home/dgrabla/java/jdk1.5.0_06/bin/java -cp asterisk-java-0.3-m1.j

Al lanzar el servidor...
1 alderaan:/home/dgrabla/facultad/PFC/idages-asterisk# /home/dgrabla/java/jdk1.5.0_06/bin/java -cp asterisk-java-0.3-m1.j
2 17-dic-2006 5:38:07 org.asteriskjava.util.internal.JavaLoggingLog info
3 INFO: Thread pool started.
4 17-dic-2006 5:38:07 org.asteriskjava.util.internal.JavaLoggingLog info
5 INFO: Listening on *:4573.

y cuando llamamos a la extension 300 la consola de asterisk muestra...

1 -- Executing AGI("SIP/101-08187500", "agi://localhost/hello.agi") in new stack


2 == Spawn extension (pfc, 300, 1) exited non-zero on ’SIP/101-08187500’

Y la consola del servidor


1 17-dic-2006 5:39:34 org.asteriskjava.util.internal.JavaLoggingLog info
2 INFO: Received connection from /127.0.0.1
3 17-dic-2006 5:39:34 org.asteriskjava.util.internal.JavaLoggingLog info
4 INFO: Begin AgiScript HelloAGIScript on daemonPool-1-thread-2
5 17-dic-2006 5:39:40 org.asteriskjava.util.internal.JavaLoggingLog info
6 INFO: End AgiScript HelloAGIScript on daemonPool-1-thread-2

Y se oye el mensaje adecuadamente. He creado mediante grabaciones desde el teléfono


los archivos pfc/ del directorio sounds de asterisk. Ahi es donde metere los archivos
necesarios para el PFC.

1 alderaan:/home/dgrabla/facultad/PFC/idages-asterisk/sounds/pfc# ls -lsh
2 total 196K
3 8,0K -rw-r--r-- 1 root root 7,3K 2006-12-17 05:50 hola_mundo_primera_grabacion.gsm
4 72K -rw-r--r-- 1 root root 71K 2006-12-17 05:49 hola_mundo_primera_grabacion.wav
5 12K -rwxrwxrwx 1 root root 11K 2006-12-17 05:51 hola_mundo_primer_script_agi.gsm
6 104K -rwxrwxrwx 1 dgrabla dgrabla 104K 2006-12-17 05:51 hola_mundo_primer_script_agi.wav

Los archivos les he pasado de wav a gsm usando sox.

He escrito un Makefile preliminar para facilitarme la vida un poco

1 # Makefile para java AGI


2
3 ASTERISK_SOUNDS = /usr/share/asterisk/sounds/pfc
4
5 all:
6 make src
7 make sounds
8 make launch
9
10 src:
11 javac -cp asterisk-java-0.3-m1.jar HelloAGIScript.java
12
13 launch:
14 /home/dgrabla/java/jdk1.5.0_06/bin/java -cp asterisk-java-0.3-m1.jar:. org.asteriskjava.fastagi.DefaultAgiServe
15
16 sounds:
17 cp -R pfc $(ASTERISK_SOUNDS)
F.44. 17/DIC/2007 143

He probado las funciones sayAlpha y sayPhonetic. La primera lee caracter por caracter
el mensaje y la siguiente lee las letras en plan ECO ALPHA CHARLIE. Ninguna de
las dos usa el sintetizador de voz festival y creo que asterisk-java no esta pensado para
sintetizar la voz. Supongo que tendré que hacer el workaround de usar text2wave por
detras y generar el fichero wav o gsm y luego hacer que asterisk lo utilice.

F.44. 17/dic/2007
TrixBox? esta muy bien pero prefiero usar un asterisk limpio, mas cómodo que tener los
programas en una máquina virtual y sobre todo para poder usar sólo un ordenador para
trabajar. He instalado asterisk en debian y (despues de un par de horas perdidas hasta que
me he dado cuenta que el xlite en linux estaba ocupando el puerto 5060 donde queda a la
espera sip en asterisk) ya funciona ok:

1 alderaan:/home/dgrabla# asterisk -vvvvvvvvvvvvvvvvvvvr


2 == Parsing ’/etc/asterisk/asterisk.conf’: Found
3 == Parsing ’/etc/asterisk/extconfig.conf’: Found
4 Asterisk 1.2.13, Copyright (C) 1999 - 2006 Digium, Inc. and others.
5 Created by Mark Spencer <[email protected]>
6 Asterisk comes with ABSOLUTELY NO WARRANTY; type ’show warranty’ for details.
7 This is free software, with components licensed under the GNU General Public
8 License version 2 and other licenses; you are welcome to redistribute it under
9 certain conditions. Type ’show license’ for details.
10 =========================================================================
11 Connected to Asterisk 1.2.13 currently running on alderaan (pid = 31818)
12 Verbosity was 7 and is now 19
13 -- Registered SIP ’102’ at 10.58.2.60 port 12104 expires 3600
14 -- Saved useragent "X-Lite release 1006e stamp 34025" for peer 102
15 -- Registered SIP ’101’ at 10.58.2.201 port 5060 expires 3600
16 -- Saved useragent "Linksys/SPA921-4.1.15" for peer 101
17 -- Executing Dial("SIP/101-0818a038", "SIP/102") in new stack
18 -- Called 102
19 -- SIP/102-08192198 is ringing

Mi dial plan

1 [general]
2 static=yes
3 writeprotect=no
4 autofallthrough=yes
5 clearglobalvars=no
6 priorityjumping=no
7
8 [globals]
9
10 [default]
11 include => pfc
12
13 [pfc]
14 exten => 101,1,Dial(SIP/101)
15 exten => 102,1,Dial(SIP/102)
16 exten => 103,1,Dial(SIP/103)
17 exten => 104,1,Dial(SIP/104)
18 exten
19 exten => 105,1,Echo()
20 exten => 106,1,Playback(/usr/share/asterisk/mohmp3/01)
21 exten => 107,1,Playback(/usr/share/asterisk/mohmp3/02)
22 exten => 108,1,Playback(/usr/share/asterisk/mohmp3/03)
23 exten => 109,1,Background(enter-ext-of-person)
24 exten => 110,1,Playback(digits/1)
25 exten => 111,1,Answer()
26 exten => 111,2,Festival(Hola\ esta\ es\ la\ centralita\ del\ proyecto\ sintetizando\ la\ voz\ en\ tiempo\ real.)
27 exten => 111,3,Hangup()
28 exten => i,1,Playback(pbx-invalid)

Es mucho mas rápido trabajar en mi propio ordenador. He configurado festival, abriendo


el /etc/festival.scm y configurandolo para que acepte conexiones de localhost y que por
144 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

defecto, utilice la voz castellana. Suena muy robotizada pero por ahora, nos vale. En el
futuro me puedo plantear usar un sintetizador mejor o bien grabar directamente las voces.
Al llamar a la extensión 111

1 -- Executing Festival("SIP/101-08190170", "Hola esta es la centralita del proyecto sintetizando la voz en tiempo re
2 == Parsing ’/etc/asterisk/festival.conf’: Found
3 -- Executing Hangup("SIP/101-08190170", "") in new stack
4 == Spawn extension (pfc, 111, 3) exited non-zero on ’SIP/101-08190170’
5 alderaan*CLI>
6
7 alderaan:/home/dgrabla# festival --server
8 server Sat Dec 16 20:05:11 2006 : Festival server started on port 1314
9 client(1) Sat Dec 16 20:05:15 2006 : accepted from localhost.localdomain
10 client(1) Sat Dec 16 20:05:15 2006 : disconnected
11 client(2) Sat Dec 16 20:05:26 2006 : accepted from localhost.localdomain
12 client(2) Sat Dec 16 20:05:27 2006 : disconnected
13 client(3) Sat Dec 16 20:08:16 2006 : accepted from localhost.localdomain
14 client(3) Sat Dec 16 20:08:16 2006 : disconnected

Para convertir de mp3 a gsm hay que pasar antes por wav. Si no, el sox se hace un lio. Con
estos comandos convertimos a wav, y luego convertimos de wav a gsm pasando a mono y
resampleando a 8000 muestras por segundo. Suena bastante mal, pero... ahorramos ancho
de banda y se ahorra CPU. Si no hicieramos la conversion tendria que hacerla asterisk
en tiempo real (Trixbox lo hace) OJO PQ EL TEMA DE TENER 1 SOLO CANAL ES
MUY IMPORTANTE, SI NO, NO FUNCIONA.

1 mplayer 02.mp3 -ao pcm


2 mv audiodump.wav 02.wav
3 sox -V 02.wav -r 8000 -c 1 01.gsm resample -ql

El astDB no funciona. No devuelve nunca ningún resultado. No sé si habra que cargarlo


como un módulo adicional pero no me preocupa mucho. A partir de ahora trabajaré en
hacer funcionar el AGI.

F.45. 16/dic/2006
He instalado el RAGI con gems y he imprimido el tutorial de RAGI. He decidido hacer
una primera implementacion en ruby del programa y si eso, hacer una segunda imple-
metacion en java si veo que es posible integrarla en la estructura java de idages como un
módulo más.

Por otro lado ya me he instruido de casi todo lo que hace falta enterarse sobre VoIP? ya
que practicamente me he leido todo el libro de asterisk.

He pensado en hacer el PFC en Latex y he visto gente que ya lo ha hecho asi y que man-
tiene un repositorio con la informacion. Cuando llegue a valladolid y tenga una conexion
a internet decente me bajare el repositorio y lo usaré como base para empezar a escribir
la documentación. Http://svn.berlios.de/wsvn/swaml

Asterisk-VoipBuster: http://www.voip-info.org/wiki/view/Asterisk+VoIPBuster
F.46. 14/DIC/2006 145

F.46. 14/dic/2006
Ya se usar el voicemail.

Tengo el mismo problema que tenia con la trixbox 1.2.3. Llega un punto que desde mi
extensión no puedo llamar a otras!

F.47. 13/dic/2006
En las últimas semanas he detenido el desarrollo de la aplicación y he empezado a pro-
funcizar en el tema de la VoIP?.

He instalado una distribución trixbox en una maquina virtual (Primero instalé la trixbox
1.2.3 pero da problemas con las extensiones, asi que instale una trixbox 2beta2 que ya
funciona correctamente)

Ahora ya tengo el teléfono SIP de linksys/sipura SPA921

Me he documentado sobre como funciona asterisk, sobre VoIP? y sobre como hacer un
dialplan

En los proximos dias el reto es hacer mi primera aplicación AGI para intercomunicar
asterisk con la aplicación. La implementación ideal seria hacer una comunicación AGI
en java e integrar las clases en la aplicación pero primero voy a hacer una implementación
sucia en ruby o php o python para conectar directamente asterisk con la BD pasando de
la aplicación. Una vez que consiga hacer eso, terminare la aplicación, esto es, hare que
funcione correctamente y luego pensare si vale la pena hacer el webservice o dejo la
implementación sucia como la definitiva.

F.48. 17/nov/2006
He añadido las banderas francesa y española y he añadido a la UI la opcion de cambiar
el idioma a ES,EN,FR,DE,IT y NL.

He ajustado los elementos en la hoja de estilo para que quede más compacto todo.

He añadido un icono al título .areas de negocios"

F.49. 15/nov/2006
Ya he averiguado pq no conseguia nunca hacer login con el usuario dgrabla de password
dgrabla. Resulta que se me habia olvidad incluir en el fichero de sample-data.xml las
instrucciones para rellenar una fila en la tabla de role_user indicando los permisos del
usuario. Ahora ya funciona ok.

He añadido la opción de logout en la navegación principal.


146 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

He modificado el /pages/viewAreasDeNegocio para que ahora se muestren los campos de


la BD como texto en vez de estar insertados en formularios. Tiene un aspecto mucho me-
jor. Además he añadido a los ficheros de traducción los campos necesarios para traducir
todo a castellano y a inglés. He hecho un par de screenshots mostrando los cambios.

He empezado a acoplar el menu lateral del prototipo de ruby on rails del 2005 a la apli-
cación. He hecho screenshot de como va la adaptación. Hay un problema pq no consigo
mostrar la imagen new.png. Creo que es porque esa imagen esta en el directorio de the-
mes y no en el images principal.

He arreglado el problema de la traduccion de los campos de la base de datos. Al hacer el


viewAreasDeNegocio habia creado unas nuevas etiquetas en los ficheros de lenguaje de
la forma dgrabla.tablaenlabasededatos.campo. El problema es que en la apliación se usa
a menudo la equiteta tablaenlabasededatos.campo asi que he eliminado el dgrabla. inicial
y el resultado es que en las etiquetas definidas ahora se traduce correctamente.

Ya se como comentar código en java. Se hace con < %– Comentario – %>. Esto me ha
permotido comentar los campos de AreasDeNegocioList que no quiero que aparezcan en
el listado general (Los campos de ID y de fecha de modificación)

He eliminado el directorio de images del theme y he copiado su contenido al images


general de la aplicación. Ya se ven correctamente las imágenes.

He creado en el menu lateral el "nueva categoria el "Volver al menu principal he aña-


2 2

dido sus etiquetas al fichero de traducciones

Me he cargado la botonera (Add,Done )por defecto

Falta hacer cambios en el layout para que se vea correctamente. Lo dejare para otra
ocasión. He hecho una nueva screenshot.

F.50. 14/nov/2006
Caso de uso de la aplicación: Encuestas automáticas. El propio ordenador a través de una
centralita asterisk llama a la gente y va rellenando encuestas de satisfacción de forma
automática. Habria que añadir a la aplicación el soporte de encuestas de satisfacción.

Hay que crear el idages /web/WEB-INF/classes/displaytag_en.properties para ver si se


traduce los campos de las tablas

F.51. 13/nov/2006
Comienzo a recordar el viejo código ecrito en el verano.

Arreglado y editado el texto de la barra superior. Aparecian dos bordes inferiores porque
en realidad habia dos . He eliminado una de ellas y he cambiado el texto por: "PFC -
David Grajal Blanco 43118 - Universidad Alfonso X El Sabioçon enlaces a mi página y
a la web de la universidad.
F.52. 12/NOV/2006 147

He arreglado el footer y cambiadas las etiquetas a: "Version Noviembre/2006 | Validador


XHTML | Validador CSS | Iniciado como: Tomcat User c 2006 David Grajal "

Ya me he enterado de cómo funciona el sistema multilenguaje y he creado las etiquetas


básicas de la aplicación en inglés y castellano. Tengo intención de traducir la aplicación
a todos los lenguajes que tenga disponibles, esto son castellano, inglés, francés (miguel),
gallego (xoel), vasco (amanda), italiano y si puedo, aleman (patu). No estaria tambien
dejar habilitado el japonés para demostrar que la aplicación esta preparada de forma
seria para ser multilenguaje.
He adecentado un poco el estilo general de la aplicación, aunque aún queda mucho tra-
bajo por delante.
He mirado que tiene y que le falta a la aplicación. El único bug o prestación que parece
que falta es la de añadir los productos a las facturas, lo que es sin duda lo más chungo
con mucha diferencia de hacer. Todo lo demás funciona.
Lo siguiente a trabajar deberia ser la presentación en vista de información de los produc-
tos, mayoristas, clientes y productos. La vista de factura la dejaremos para más adelante.
El problema con la edición de facturas también para más adelante. También hay que
trabajar en la presentación de la información de las tablas. Hay que añadir botoneras bo-
nitas y hay que editar el estilo para que se parezcan a las definidas en el documento de
requisitos del cliente.
Hay que hacer un diagrama UML desde la tabla SQL
He hecho screenshots de la aplicación para poder seguir la evolución.

F.52. 12/nov/2006
Comienzo de nuevo con el desarrollo del PFC. En los últimos días he decidido ampliar
el PFC para dar cabida a la VOIP. Lo que tengo pensado es añadir a la aplicación un
webservice de forma que una PBX asterisk se pueda conectar a ella y interactuar. De esta
manera un usuario podria establecer una comunicación de voz con asterisk y a través de
selecccion en menús a través de los dígitos multifrecuencia, poder consultar datos de la
aplicación.
Nos quedaria un modelo software asi:

Figura F.4: Componentes del prototipo 12/2006


148 APÉNDICE F. DIARIO DE TRABAJO DEL PFC

Y podriamos interactuar:

Figura F.5: Esquema VoIP 12/2006

He copiado el repositorio del svn a facultar/PFC. Sobre esta base empezaré a hacer los
cambios

He creado la nueva BD idatelPFC

Nuevo proyecto y contexto en tracks para la organización y planificación del PFC. Pri-
meras tareas añadidas
Bibliografía

[1] Shyam Chakraborty, Tomas Frankkila, Janne Peisa, and Per Synnergren. IMS Multimedia
Telephony over Cellular Systems. John Wiley & Sons, Ltd, 2007.

[2] Alistair Cockburn. Writing Effective Use Cases.

[3] David Ferry. JAIN SLEE 1.1 Specification, Public Review Draft. Sun Microsistems, Inc,
2007.

[4] Sun. JAIN and Java in Communications. Sun, 2004.

149
Índice alfabético

3gpp, 10 keyjnote, 79
kile, 79
agi, 67 kpdf, 82
ajam, 67
ant, 36, 76 latex, 78
anthill, 36, 73 Linux, 66
appfuse, 37, 74 log4j, 37
arquitectura voip, 7
asterisk, 3, 51, 52, 66 manager, 67
asterisk-java, 51, 52, 67 maven2, 51, 52, 75
asterisknow, 68 mvc, 35
audacity, 81 mysql, 72

beamer, 79 orm, 36

click-to-call, 3, 53 p2psip, 8
Parlay-X, 20
dia, 36, 80 persistencia de objetos, 36
phpmyadmin, 72
eclipse, 36 phppgadmin, 71
ekiga, 77 POJO, 38
fastagi, 67 posgresql, 3
festival, 52, 76 posip, 8
fring, 15 postgresql, 38, 70
prototype, 38
gimp, 80
gizmo, 14, 77 raketu, 14
google talk, 14 rtp, 7, 8, 10
rubber, 79
h.323, 7
hibernate, 3, 37, 75 sdp, 10
sip, 8, 10, 22
iax, 9 sip2, 8
ice, 8 sitemesh, 37, 75
ims, 10 skype, 10, 14
interfaz de usuario, 53 SPIT, 17
spring, 3, 37, 74
jabref, 78 struts2, 3, 51, 52, 74
jajah, 13 subversion, 36, 73
java, 3, 52, 69
jetty, 51, 52, 73 telefonia ip, 5
jingle, 8, 14 tomcat, 37, 73
junit, 37 trac, 36

150
ÍNDICE ALFABÉTICO 151

trixbox, 67
twiki, 81
twitter, 14

voip, 5

wengo, 14, 77
wimax, 5

x-lite, 76

También podría gustarte