PFC David Grajal
PFC David Grajal
PFC David Grajal
TCO06010
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).
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
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
XIII
XIV ÍNDICE GENERAL
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.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
E. Licencias 105
E.1. Creative Commons Reconocimiento-CompartirIgual 2.5 . . . . . . . . . . . . 105
E.2. GNU General Public License (GPL) . . . . . . . . . . . . . . . . . . . . . . . 106
XVI ÍNDICE GENERAL
Bibliografía 149
XVIII ÍNDICE GENERAL
Índice de figuras
XIX
XX ÍNDICE DE FIGURAS
XXI
XXII ÍNDICE DE CUADROS
Capítulo 1
Introducción
1
2 CAPÍTULO 1. INTRODUCCIÓN
1.2. Objetivos
A continuación se listan los hitos que se deseaban conseguir en este trabajo.
Demostrar que las tecnologías de comunicación cada día convergen más hacia la red
Internet.
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.
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.
(pp 83) Instalación de Anthill: Pasos seguidos para la instalación del servidor de
builds
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.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.
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.
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
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
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.
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]
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.
Servicios presenciales
Mensajería instantánea
Mensajería unificada
Publicidad multimedia
Juegos multijugador
Streaming de video
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.
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
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
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.
"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:
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
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
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).
Permitir el acceso a los consumidores a servicios móviles más allá de límites geográficos,
de operadores y de los terminales.
"(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:
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.
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.
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
42
NGIN: Next Generation Intelligent Networks
43
SDP: Service Delivery Platforms
44
IMS: IP Multimedia SubSystems
Capítulo 3
25
26 CAPÍTULO 3. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN ERP
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.
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.
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.
Que todas las páginas de listados queden enlazadas entre sí mediante una interfaz simple.
3.2. INTERFAZ DE USUARIO 29
Creación de nuevo elemento: Nos lleva a la vista de edición del elemento correspon-
diente con todos los campos vacíos.
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.
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
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.
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
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.
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
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.
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
(pp 73) Subversion: Se usó un repositorio SVN local para el mantenimiento del código.
(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
(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 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
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.7. Planificación
3.7.1. Fase 0: Toma de contacto
11 Jul - 28 Jul: Documentación. Preparación de plataforma de desarrollo.
4 Aug - Revisión del trabajo. Lluvia de ideas sobre cómo modelar la lógica de la aplica-
ción.
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.
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
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.
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).
Tabla tipo_direcciones
Tabla direcciones
Tabla num_contacto
fax: autoexplicativo.
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
account_expired: BOOL.
account_locked: BOOL.
credentials_expired: BOOL.
Tabla role
Tabla user_role
cliente_id: Id del cliente al que se asocia la factura (Puede estar activo o inactivo)
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)
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
Tabla clientes
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.
titulo: formula de cortesia adecuada (Señor, señorita, señora, doctor, excelentisimo etc)
nombre,apellidos,nif_cif: autoexplicactivo
Tabla proveedores
Tabla pedidos
Tabla areas_de_negocio
pedido_id: Identificatido del pedido al que esta asociado. NO PUEDE SER NULL.
Tabla productos_desc_data
Tabla coste_productos
51
52 CAPÍTULO 4. CONSTRUCCIÓN DEL PROTOTIPO DE APLICACIÓN VOIP
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).
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.
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
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
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.
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.
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.
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
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.
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.
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:
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
Bibliografía:
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
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.
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.
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
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)
Lo mejor es añadir estas lineas al .bash_profile para que nos quede configurado al arrancar.
B.4. PostgreSQL
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
B.5. Mysql
B.5.1. PHPmyadmin
B.6.2. Anthill
Ver anexo C en la página 83.
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.5. 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
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
B.6.8. 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.2. 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
B.8.1. 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.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:
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
B.9.3. Twiki
B.9.4. Audacity
B.9.5. 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
83
84 APÉNDICE C. INSTALACIÓN 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.
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.
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.
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.
--
-- PostgreSQL database dump
--
--
-- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: dgrabla
--
--
-- Name: app_user; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
1
http://david.grajal.net
89
90 APÉNDICE D. LISTADO DEL CÓDIGO FUENTE
--
-- Name: areas_de_negocio; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: clientes; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: coste_productos; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: direcciones; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: direcciones_postales; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: facturas; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: hibernate_sequence; Type: SEQUENCE; Schema: public; Owner: root
--
--
-- Name: num_contacto; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: pedidos; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: productos; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: productos_desc_data; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: proveedores; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: role; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: tipo_direccion; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: user_role; Type: TABLE; Schema: public; Owner: root; Tablespace:
--
--
-- Name: app_user_email_key; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: app_user_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: app_user_username_key; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: areas_de_negocio_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: clientes_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: coste_productos_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: direcciones_email_key; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: direcciones_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: direcciones_postales_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: facturas_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: num_contacto_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: pedidos_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: productos_desc_data_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: productos_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
D.1. PRIMER PROTOTIPO 97
--
-- Name: proveedores_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: role_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: tipo_direccion_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: user_role_pkey; Type: CONSTRAINT; Schema: public; Owner: root; Tablespace:
--
--
-- Name: fk143bf46a550d0e4b; Type: FK CONSTRAINT; Schema: public; Owner: root
--
--
-- Name: fk143bf46aafe24a6b; Type: FK CONSTRAINT; Schema: public; Owner: root
--
98 APÉNDICE D. LISTADO DEL CÓDIGO FUENTE
--
-- Name: public; Type: ACL; Schema: -; Owner: dgrabla
--
--
-- PostgreSQL database dump complete
--
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
return true;
}
package prototipo2;
import java.util.HashSet;
import java.util.Set;
import java.util.ArrayList;
import java.util.List;
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);
}
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;
FacturaManager facturaManager;
List<Factura> facturas = new ArrayList<Factura>();
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;
// send the originate action and wait for a maximum of 30 seconds for Asterisk
// to send a reply
originateResponse = managerConnection.sendAction(originateAction, 30000);
System.out.println(originateResponse.getResponse());
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.
# 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
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
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
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
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:
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.
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 .
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
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.
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.
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)
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 :)
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.
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.
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
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
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
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...
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
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
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>
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
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
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
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.
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.
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.
Modificaciones al pom.xml. Le digo a jetty que arranque en el 18081 y le pongo los datos
de la base de datos.
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).
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 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.
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.
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.
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 !.
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
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 mandado un mail a pablo preguntando por jain slee ¿q coño es y es mejor q lo q voy
a usar yo?
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
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
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!!)
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
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
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
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)
Y las diferencias
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:
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
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.
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] ------------------------------------------------------------------------
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:
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:
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)
Y un fichero de mapeo
Y para lanzar el servidor. (Ojo, requiere la maquina de sun y en la version java 1.5)
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.
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
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:
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)
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.
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)
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.
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 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.
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)
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.
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
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:
Y podriamos interactuar:
He copiado el repositorio del svn a facultar/PFC. Sobre esta base empezaré a hacer los
cambios
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.
[3] David Ferry. JAIN SLEE 1.1 Specification, Public Review Draft. Sun Microsistems, Inc,
2007.
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