DESARROLLO DE UNA APLICACIÓN DE CONTROL Y MONITOREO DE NIÑOS VÍA WEB, PARA EL CENTRO DE CUIDADOS MATERNO INFANTIL “POPEYE’S” DE LA CIUDAD DE QUITO Proyecto de fin de carrera previa a la obtención del título de Ingeniería en Sistemas Informáticos y Computación. AUTOR: Max Geovanny Morillo Aguilar DIRECTOR: Ing. Guido Riofrío Calderón LOJA - ECUADOR 2011 CERTIFICACIÓN Ing. Guido Riofrío Calderón CERTIFICA: Que el presente trabajo de investigación, previo a la obtención del título de INGENIERO EN SISTEMAS INFORMÁTICOS Y COMPUTACIÓN, ha sido dirigido, supervisado y revisado en todas sus partes, por lo mismo, cumple con los requisitos legales exigidos por la Universidad Técnica Particular de Loja, quedando autorizada su presentación. Loja, 01 de julio de 2011 Ing. Guido Riofrío Calderón CERTIFICACIÓN Ing. Alexander López CERTIFICA: Que el presente trabajo de investigación, previo a la obtención del título de INGENIERO EN SISTEMAS INFORMÁTICOS Y COMPUTACIÓN, ha sido dirigido, supervisado y revisado en todas sus partes, por lo mismo, cumple con los requisitos legales exigidos por la Universidad Técnica Particular de Loja, quedando autorizada su presentación. Loja, 01 de julio de 2011 Ing. Alexander López AUTORÍA El presente proyecto de tesis con cada una de sus observaciones, análisis, evaluaciones, conclusiones y recomendaciones emitidas, es de absoluta responsabilidad del autor. Además, es necesario indicar que la información de otros autores empleada en el presente trabajo, está debidamente especificada en fuentes de referencia y apartados bibliográficos. ………………………………... Max Geovanny Morillo Aguilar CESIÓN DE DERECHOS Yo, MAX GEOVANNY MORILLO AGUILAR, declaro ser autor del presente trabajo y eximo expresamente a la Universidad Técnica Particular de Loja y a sus representantes legales de posibles reclamos o acciones legales. Adicionalmente declaro conocer y aceptar la disposición del Art. 67 del Estatuto Orgánico de la Universidad Técnica Particular de Loja, que en su parte pertinente textualmente dice: “Forman parte del patrimonio de la Universidad la propiedad intelectual de investigaciones, trabajos científicos o técnicos y tesis de grado que se realicen a través, o con el apoyo financiero, académico o institucional (operativo) de la Universidad”. ………………………………... AUTOR AGRADECIMIENTOS Expreso mi sincero agradecimiento, a la Universidad Técnica Particular de Loja, principalmente a la Escuela de Informática, a sus directivos, personal administrativo y docentes, quienes supieron con paciencia entregarnos sus mejores conocimientos y experiencias para nuestro crecimiento académico y vivencial. Un especial agradecimiento al Ing. Guido Riofrío, que sin su guía y ayuda, hubiera sido difícil la terminación del presente tema de tesis. El Autor DEDICATORIA Este trabajo está dedicado en primer lugar a Dios, quien ha dado luz a mi camino. A mi esposa Alexandra y mi hija Wendy, quienes con su amor, apoyo incondicional y paciencia, me dieron un enorme impulso e inspiración. A mis padres Kleber y Angelita, una especial dedicatoria, ya que son ellos quienes han luchado y esforzado para darme el estudio y con ello ver al fin la terminación de una etapa de mi vida, de la cual se puedan sentir orgullosos del deber cumplido. A mis queridos hermanos Kleberito y Rubita, ejemplo para mí a seguir. A Gerson, Paúl y todos mis amigos y excompañeros, que con sus consejos y aliento desinteresados, me ayudaron e incentivaron. Max Geovanny Morillo Aguilar Tabla de Contenidos Contenido Introducción FASE 1. Investigación Preliminar e Identificación de características que deberá tener el aplicativo en el centro infantil. 1.1. Datos generales del Centro Infantil Popeye’s 1.2. Hallazgos del estudio preliminar 1.3. Requerimientos de ubicación de Cámara IP 1.4. Características que tendrá el aplicativo para el Centro Infantil 1.5. Ubicación física del centro infantil en la ciudad de Quito-Ecuador. 1.6. Investigación de funcionamiento de tecnología IP vía Web (manejo de cámaras IP). 1.6.1. Componentes de las cámaras IP 1.6.2. Requerimientos de conexión para una cámara IP en internet o LAN 1.6.3. Seguridad de Acceso a las cámaras IP 1.6.4. Características de audio y video emitido por las cámaras IP. 1.6.5. Selección de Cámara IP para el desarrollo de tesis 1.6.5.1. Descripción General de la cámara IP DLINK DCS-2102 1.6.5.2. Características físicas indicadas por el fabricante 1.7. Investigación y selección de metodología de desarrollo y herramientas tecnológicas para crear el aplicativo web. 1.7.1. Scrum, como metodología de implementación 1.7.1.1. Proceso de aplicación de metodología SCRUM 1.7.2. Liferay, como portal. 1.7.2.1. Esquema de funcionamiento de la solución con Liferay 1.7.2.2. Portlets (Aplicativos) 1.7.3. Eclipse, como Framework para desarrollo de Portlets FASE 2. Modelamiento y desarrollo del aplicativo 2.1. Perfil del Centro Infantil 2.2. Planificación del proyecto utilizando la metodología SCRUM 2.3. Análisis y Desarrollo del requerimiento: “Elaborar un portal para el Centro Infantil” 2.3.1. Análisis del Portal 2.3.2. Diseño del modelo conceptual del Portal 2.3.3. Diseño de pantallas del portal 2.3.3.1. Diseño de Pantalla “Inicio” 2.3.3.2. Diseño de Pantalla “Quienes Somos” 2.3.3.3. Diseño de Pantalla “Noticias” 2.3.3.4. Diseño de Pantalla “Sugerencias para Padres” 2.3.3.5. Diseño de Pantalla “Contáctenos” 2.3.3.6. Diseño de Pantalla “Monitoreo Web Cam” 2.3.3.7. Diseño de Pantalla “Administración Salones” 2.3.4. Desarrollo del portal utilizando Liferay Portal 2.3.4.1. Documentación de implantación de Liferay 2.3.4.1.1. Instalación de Java en CentOs 5.0 2.3.4.1.2. Instalación de Mysql en CentOs 2.3.4.1.3. Instalación de Liferay con JBoss en CentOs 5.0 2.3.4.2. Crear la página Web principal y opciones públicas con Liferay 2.3.4.2.1. Consideraciones previas a la creación de un sitio web con Liferay 2.3.4.2.1.1. Administración de Liferay 2.3.4.2.1.2. Agregación de páginas web 2.3.4.2.1.3. Agregación de Portlets (aplicativos) a las páginas Web 2.3.4.2.1.4. Disposición de Página Web Pág. 11 13 13 14 17 18 19 20 21 22 22 23 24 24 25 26 26 28 29 34 35 36 39 39 40 43 43 44 44 45 45 46 46 47 47 48 49 49 49 50 51 52 52 54 55 55 56 2.3.4.2.1.5. Edición de un portlet de contenido 2.3.4.2.1.6. Selección de Tema (Template) 2.3.4.2.1.7. Inserción de un “Logo” en el sitio Web 2.3.4.2.1.8. Creación de usuarios en liferay 2.3.4.2.1.9. Creación de grupos de usuarios en liferay 2.3.4.2.1.10. Creación de roles para asignación a grupos de usuarios en Liferay 2.3.4.3. Instalación de Cámara IP con conexión a Router inalámbrico Dlink DIR-600 2.4. Análisis y Desarrollo del requerimiento: “Crear un aplicativo de monitoreo de niños, para el portal del Centro Infantil” 2.4.1. Análisis del portlet de Monitoreo de niños 2.4.2. Modelo conceptual del portlet de Monitoreo de niños 2.4.3. Diseño de la tabla de datos 2.4.4. Modelo de Casos de Uso 2.4.5. Detalle de casos de Uso identificados 2.4.5.1. Desglose de los Casos de Uso encontrados 2.4.6. Diagramas de Clases 2.4.7. Configuración de Eclipse para la iteracción con Liferay 2.4.7.1. Carga y configuración de Plug-in de Liferay para eclipse 2.4.7.2. Creación del proyecto “CamaraIPPortlet” tipo “Portlet” en eclipse 2.4.7.3. Investigación para la generación de portlets utilizando la infraestructura de Liferay 2.4.8. Desarrollo del aplicativo utilizando la infraestructura Liferay 2.4.8.1. Generación de portlet mediante “Service Builder” de Liferay 2.4.8.2. Definición de entorno de variables previo al desarrollo del portlet en Liferay 2.4.8.3. Programación de métodos para almacenamiento y recuperación de datos 2.4.8.4. Programación de archivos Vista (View.jsp) para presentación de imágenes de cámara y de administración de salones 2.4.8.5. Programación de permisos para los portlets creados 2.4.8.6. Despliegue del proyecto en ambiente de desarrollo para pruebas de conexión 2.4.8.7. Despliegue del proyecto en ambiente de producción 2.4.8.8. Pruebas de funcionamiento de los portlets desplegados en producción FASE 3. Resultados del impacto de la solución en los padres de familia 3.1. Utilización de credenciales de acceso a Padres de Familia y análisis de resultados Conclusiones Recomendaciones Bibliografía Anexos Anexo 1. Encuestas preliminares de aceptación del proyecto a padres de familia Anexo 2. Descripción de la metodología de desarrollo SCRUM A2.1. Conceptos manejados en SCRUM A2.2. Estructuración de la metodología A2.3. Aplicación de la metodología para la implementación de la solución Anexo 3. Revisión general de liferay como portal Anexo 4. ECLIPSE, como framework para desarrollo de portlets Anexo 5. Hosting Anexo 6. Recursos a utilizar en el desarrollo de la solución Anexo 7. Encuestas de satisfacción de uso de monitoreo web Anexo 8. Código Fuente del Aplicativo Anexo 9. Paper 57 58 60 61 64 66 67 70 70 70 71 71 72 72 75 78 79 81 83 85 85 88 90 92 95 97 101 102 104 104 108 109 110 111 112 128 128 129 132 146 151 155 156 158 168 183 11 INTRODUCCIÓN Con el auge de las TICs (llamadas así a las Tecnologías de la Información y Comunicación), en la actualidad se han desarrollado aplicativos informáticos que generan una mejor calidad de vida a las personas. El desarrollo e inversión en las telecomunicaciones en nuestro país, ha provocado la mejora sustancial en el rendimiento de las mismas, lo que ha generado un uso más generalizado del Internet en nuestro medio. Al momento tanto las telecomunicaciones y el Internet, especialmente en las ciudades como Quito, Guayaquil y Cuenca, han sido beneficiadas con la mejora de velocidades y cobertura, lo que ha permitido la rápida expansión de nuevos servicios relacionados con las telecomunicaciones y tecnología. Aprovechando esta coyuntura en la ciudad de Quito, y ante una necesidad específica, nacida por experiencia propia (que no es ajena a la mayoría de parejas o matrimonios), propongo el tema: “Desarrollo de una aplicación de control y monitoreo de niños vía Web, para el centro de cuidados materno infantil “Popeye’s” de la ciudad de Quito”. 12 RESUMEN Con este tema se pretende crear un aplicativo Web, utilizando herramientas OpenSource, que permita “monitorear”, de alguna manera, el día a día de los niños en un centro de cuidados materno infantil, y que a su vez, se pueda medir cualitativamente el bienestar que puede aportar el uso de una herramienta de ese tipo tanto en padres de familia como en los niños. Esto implicará el desarrollo de un aplicativo (aplicación Web) con herramientas Open Source (con el objetivo de abaratar costos de licencias), así como la investigación y manejo de cámaras IP y toda su tecnología detrás de las mismas, para poder acoplarlas con el aplicativo. En la primera Fase del presente tema, se describe los hallazgos de la investigación preliminar de las necesidades del Centro de desarrollo Infantil, así como de un breve estudio de aceptación de la propuesta de monitoreo por parte de los padres. También se hace una identificación de las características que tendrá el aplicativo de acuerdo a los requerimientos del Centro Infantil. Posteriormente se muestra una revisión general de las diferentes tecnologías a aplicar para el desarrollo del presente tema. En la segunda Fase, se describe tanto el marco conceptual del cómo funcionará la solución, utilizando las tecnologías revisadas en la primera Fase, así como el detalle del proceso de desarrollo en sí, profundizando en cada una de las tecnologías a utilizar (modo de instalación, uso, etc.), y describiendo los resultados que se van obteniendo durante el proceso de desarrollo. También se puede ir observando los resultados de la utilización de la metodología de desarrollo. En la tercera Fase, se exponen los resultados de los estudios de impacto de la solución en los padres de familia que utilizarán el aplicativo. Finalmente se exponen en el apartado de Anexos, todos los documentos (encuestas, cuadros, resultados obtenidos, etc.), que sirvieron para la implementación de la solución. 13 FASE 1 INVESTIGACIÓN PRELIMINAR E IDENTIFICACIÓN DE CARACTERÍSTICAS QUE DEBERÁ TENER EL APLICATIVO EN EL CENTRO INFANTIL. 1.1. Datos generales del Centro Infantil Popeye’s: El centro de desarrollo infantil Popeye’s (CI), tiene como objetivo: “Contribuir técnica y profesionalmente para que los niños y niñas alcancen un desarrollo bio-psico-socio cultural espiritual adecuado, dentro de un marco afectivo y de valores respetando su ecosistema y su ideología”. Tiene a cargo el cuidado, control y enseñanza de destrezas en niños desde 1 hasta 5 años de edad. Su estructura de estudios para los niños está conformada de la siguiente manera: Inicial 1: Para niños de 1 - 2 años. Inicial 2: Para niños de 2 - 3 años. Inicial 3: Para niños de 3 - 4 años. Pre-Básica : Para niños de 4 - 5 años. En su infraestructura física, el centro infantil dispone de los siguientes espacios físicos: Área total: 285 m2 Área de construcción: 142,25 m2 Área exterior total: 142,25 m2 Las dependencias de las que consta el centro infantil son (Ver Figura 1.1. Plano de dependencias del CI): Juegos y módulos exteriores Espacios verdes Lavabos 14 Dependencias Generales del Centro Dirección Psicopedagógica Dormitorio. Figura 1.1. Plano de dependencias del CI (Tomado del CDI). 1.2. Hallazgos del estudio preliminar Luego de haber realizado las respectivas investigaciones con la directora del Centro Infantil (Lic. Tatiana González), se pudo constatar que la falta de control o monitoreo de los niños, especialmente de edades comprendidas entre 1 – 3 años (aunque no menos en niños de edades superiores a estas), crea niveles anormales de ansiedad en los padres. Esta “ansiedad” o “estress”, se incrementa más aún cuando los niños están con algún tipo de enfermedad que deba ser controlada con medicamentos (generalmente procesos gripales o respiratorios). También se puede notar que el impacto es mayor en mujeres (madres de esos niños), que en varones (padres). 15 Por experiencia propia, he podido determinar que ante este escenario se produce un incremento importante en las llamadas hacia el Centro Infantil para el seguimiento correspondiente, así como disminución en el rendimiento laboral, especialmente en áreas que requieren especial atención en temas de concentración (ej. Desarrollo de sistemas informáticos bancarios, financieros, etc.). De acuerdo a un estudio hecho por Forbes Woman (www.forbeswoman.com), de una encuesta realizada en una muestra de 2200 mujeres en los Estados Unidos, Forbes concluye que: 62% de las mujeres encuestadas manifestó que tener hijos puede tener un impacto negativo en sus carreras. En contraste, sólo el 30% de las madres que trabajan dijo que haber tenido niños, había afectado su vida laboral. Tomando en cuenta esas estadísticas, decidí hacer una encuesta de aceptación al proyecto (Ver Anexo A1. Encuestas preliminares de aceptación del proyecto a Padres de familia), para determinar las preferencias de monitoreo entre los padres de familia que inscriben a sus niños en el Centro Infantil, por lo que a continuación se muestran los resultados tabulados (los valores están expresados en porcentajes): 1.) Ud. Confía en los cuidados del centro infantil donde está su hijo(a): % Si 14 87,50 No 0 - No contesta 2 12,50 TOTAL 16 100,00 Tabla 1.1. Confianza en cuidados del CI. 2.) Cuando Ud. deja a su niño(a) pequeño(a) al cuidado de un centro infantil, considera que su rendimiento laboral se ha visto: % Disminuido 0 - Aumentado 11 68,75 16 Sigue igual 3 18,75 No se da cuenta 1 6,25 No contesta 1 6,25 TOTAL 16 100,00 Tabla 1.2. Rendimiento Laboral 3.) Considera que un sistema de monitoreo (con cámaras), donde Ud. pueda observar a su niño vía Internet, ayudaría: % Mucho 12 75,00 Poco 4 25,00 Nada 0 - TOTAL 16 100,00 Tabla 1.3. Monitoreo vía Web 4.) El monitoreo vía internet, mejoraría su desempeño laboral: % Mucho 4 25,00 Poco 8 50,00 4 25,00 Nada TOTAL 16 100,00 Tabla 1.4. Monitoreo vs. Desempeño laboral 5.) Ud. labora bajo relación de dependencia en una empresa o institución?: % Si 10 62,50 No 6 37,50 TOTAL 16 100,00 Tabla 1.5. Relación de dependencia laboral 6.) El lugar donde trabaja, permite a sus empleados el uso de internet?: % Todo el tiempo 12 75,00 Por horas 3 18,75 No permite 0 - No posee Internet 1 6,25 TOTAL 16 100,00 Tabla 1.6. Uso de Internet en trabajo 17 7.) Desearía que el centro infantil disponga de un servicio de monitoreo infantil vía web (internet)?: % Si 14 87,50 No 1 6,25 No contesta 1 6,25 TOTAL 16 100,00 Tabla 1.7. Consulta sobre Monitoreo en CI De lo observado en los resultados de las encuestas, se puede deducir que la mayoría de padres de familia: Relaciona el aumento de rendimiento laboral al cuidado de niños (68.75%) Cree que ayudaría mucho o poco el monitoreo (100% entre los 2 aspectos) Cree que mejoraría el rendimiento con el monitoreo con cámaras (75% entre los dos) Tienen acceso a internet (75%). Se inclina por un servicio de monitoreo vía web (87,50%). Tomando en cuenta los resultados anteriores, es altamente factible la implantación de una solución, como la propuesta en el presente tema. 1.3. Requerimientos de ubicación de Cámara IP De acuerdo a lo citado anteriormente, y en base a lo conversado con la directora del centro infantil, se determina que la cámara IP (para fines demostrativos y costos se instalará solo una cámara), se ubicará en el área de niños comprendidos entre 1-3 años (Ver Figura 1.2 Ubicación de cámara IP), que son los niños con más requerimiento de monitoreo por parte de los padres, tal como lo muestra el gráfico adjunto. 18 Cámara IP. Requerida para monitoreo de niños de 1-3 años. Figura 1.2. Ubicación de cámara IP 1.4. Características que tendrá el aplicativo para el Centro Infantil: Tomando en cuenta la naturaleza del centro infantil, la solución integral para cubrir con los objetivos del presente tema deberá constar de lo siguiente: Del Aplicativo Web: - Portal Web del centro infantil que contendrá la siguiente información: o Información General del Centro Infantil. o Menú de Opciones (Inicio, Acerca del centro, Horario de atención, Contáctenos) o Link para ingreso de usuarios registrados. o Link para acceso a ver video mediante cámara IP, para el cual deberá ser validado el usuario que ingresa. 19 - - Administración de usuarios (ingreso de padres de familia). Esta administración de Usuarios, correrá como parte del Portal seleccionado (Liferay), que en este caso se encargará del manejo de las seguridades. Creación del Portlet, para el monitoreo de las imágenes que emita la cámara IP. De los recursos necesarios para dicha implementación: - Adquisición de Hosting para albergar el sitio Web del Centro Infantil.- Para esto se utilizará el proveedor de hosting “sever4you (www.server4you.com)”, el cual es un proveedor con equipos aptos para implementar la solución, así como el soporte de las diferentes tecnologías (Liferay, Mysql, Java, etc.) a usar en el desarrollo del presente tema. - Cámara IP, que soporte Java (La selección de la cámara se detalla en el apartado “Investigación de funcionamiento de tecnología IP”). - Conexión a Internet tipo ADSL1 (proveedor TV-Cable), con velocidad superior a 1Mbit de transmisión. La fidelidad y resolución de las imágenes, dependerán de las pruebas de video en la etapa de desarrollo. 1.5. Ubicación física del centro infantil en la ciudad de Quito - Ecuador. A continuación se presentan las imágenes de la ubicación física del Centro de Desarrollo Infantil en la ciudad de Quito (Ver Figura 1.3.). Dirección: Calle Lugo E13-167 y Pasaje 3. Ciudad: Quito Sector: La Floresta 1 ADSL.- siglas en inglés Asymmetric Digital Suscriber Digital.Transmisión analógica de datos digitales. 20 Figura. 1.3. Ubicación física del Centro (Imagen tomada de GoogleMaps) 1.6. Investigación de funcionamiento de tecnología IP vía web (manejo de cámaras IP) Las Cámaras IP (también conocidas como cámaras Web o de Red), son cámaras de video especialmente diseñadas para enviar las señales de video, y en algunos casos audio, a través de Internet desde un navegador de internet (ej, Internet Explorer, Firefox, Crome, etc), o a través de concentrador (un HUB o un SWITCH) en una Red de Datos Local (LAN por sus siglas en inglés). Este tipo de cámaras (IP), puede integrarse aplicaciones para: detección de presencia o movimiento (inclusive se puede enviar correos automáticamente, si detectan presencia), grabación de imágenes o secuencias en equipos informáticos para almacenamiento (tanto en una red local o en una red externa (WAN), de tal forma que al analizar el movimiento se pueda grabar las imágenes correspondientes. A continuación se muestra un gráfico de la estructura física (Figura 1.4. Gráfico de la Estructura física de conexión IP), de la conexión de una cámara IP tanto en un entorno de Red de área local, como para internet, así: 21 ... switch / Internet Usuarios Figura. 1.4. Gráfico de la Estructura física de conexión IP En la actualidad, las cámaras IP están siendo utilizadas en un sinnúmero de entornos para la vigilancia o promoción (utilizando cualquier conexión a internet y un navegador), entre los cuales están: Hogar: " para vigilar " la casa, negocio, empresa, a personas mayores, a niños o bebés. Trabajo: puede utilizarse para controlar puntos del negocio a los cuales no hay acceso visual tanto dentro de la empresa como los locales externos, estacionamientos, entradas, puntos de venta, etc. Hosterías, restaurantes, centros deportivos, museos, control de animales, etc. En el caso concreto del desarrollo del presente tema de tesis, se la usará para vigilancia y monitoreo de los niños del centro de desarrollo infantil Popeye’s, de la ciudad de Quito. 1.6.1. Componentes de las cámaras IP Como se dijo anteriormente, las cámaras IP son cámaras de video, que a diferencia de una video cámara tradicional, dispone adicionalmente de: Componentes de una cámara de video tradicional (lentes, sensores, procesador digital de imagen, etc.) Un sistema de compresión de imagen (para poder comprimir las imágenes captadas por la cámara a formatos adecuados como MPEG4), de tal manera 22 que se disminuya el tiempo y el impacto en la utilización de ancho de banda de internet o LAN. Un sistema de procesamiento (CPU, FLASH, DRAM y un módulo Wireless ETHERNET/WIFI). Este sistema de procesamiento se encarga de: Gestión de las imágenes que incluye el envío de las mismas al módem, del movimiento de la cámara (si dispone de motor), de la detección de movimiento, etc. 1.6.2. Requerimientos de conexión para una cámara IP en internet o LAN. Debido a que uno de los objetivos de las cámaras IP es el envío de imágenes vía web, no cabe duda que es importante disponer de una conexión a Internet. Para ello se conecta la cámara IP a un Router2 ADSL , XDSL, o Cablemodem (o a un HUB) u otros sistemas de banda ancha. No es necesario IP fija, ya que en el caso de IP dinámica se puede acudir a sitios como www.no-ip.com o www.dyndns.org (algunas cámaras vienen con sitios de resolución dinámica de IP’s especiales ) para la resolución DNS. Una vez se disponga de lo anteriormente citado, únicamente se necesita conectar la cámara al Router ADSL y a la alimentación eléctrica, esto para el caso del acceso vía internet, caso contrario si el objetivo es usar la cámara en una red local, debemos conectar la misma a un HUB/SWITCH con lo que pasa a ser un equipo más que se comunica con el resto de nuestra LAN (si la LAN dispone de conexión a Internet, se podrá acceder desde el exterior a la red). 1.6.3. Seguridades de acceso a las cámaras IP. Un tema que ha llevado a preguntarse si es seguro utilizar cámaras IP, es justamente su accesibilidad, debido a que da la impresión de que una vez conectada a internet, un usuario con conocimientos específicos sobre tecnología, podría acceder a las imágenes que se están capturando. Bueno, esta duda cabe indicar que tiene una respuesta contundente, y es que, las cámaras IP, de la misma manera que los servidores de Vídeo (que hacen Streaming3 de video), dispone de un software interno 2 Router.- Término inglés para Enrutador. Dispositivo para interconexión de red de computadores, que opera en la capa 3 del modelo OSI. 3 Streaming.- Término inglés que indica la emisión de audio o video por la red. 23 para manejar el tema de seguridad, lo que permite establecer varios niveles de seguridad sobre el acceso a las mismas, y entre los cuales están: Nivel de Administrador: que sirve para poder configurar diferentes parámetros de la cámara, como lo es: manejo de direcciones IP, claves de acceso, etc. En este nivel se solicita nombre de usuario y una clave para accesar al mismo. Nivel de Usuario: que sirve para que el usuario pueda ver las imágenes que se están capturando, manejar la cámara así como el relé de salida. Igual que en el anterior nivel, se solicita un nombre y clave de usuario. Nivel Demo: este nivel está pensado para permitir un libre acceso a lo que emita la cámara por tiempos delimitados, por lo tanto no es necesario ningún tipo de identificación. Tomando en cuenta los accesos, se puede decir que la cantidad de accesos de usuarios de cualquier nivel que podría cubrir cada cámara IP, por lo general, es de aproximadamente entre 10 a 20 usuarios. 1.6.4. Características de audio y video emitido por las cámaras IP. Con respecto al audio, la mayoría de cámaras IP incorporan micrófonos de alta sensibilidad, con la finalidad de transmitir audio mediante el protocolo de conexión UDP4. En la parte de video, las cámaras IP poseen un sistema de compresión de imagen, el cual sirve para hacer que la información obtenida de la cámara (que es mucha información y de gran tamaño) ocupe la menor cantidad de tamaño, ajustando a los anchos de banda de los sistemas de transmisión, por lo que si no se comprime adecuadamente es imposible enviar la misma a través de una red Local (LAN) o de las líneas telefónicas. Al comprimir las imágenes enviadas, se evita adicionalmente que sufran pérdidas en la calidad o en la visualización. 4 UDP.- Siglas en inglés de User Datagram Protocol. Protocolo del nivel de transporte para envío de datagramas. 24 Los estándares de compresión actuales son el JPEG(Joint Picture Experts Group) y MPEG4 (Moving Picture Experts Group), este último es el más reciente y potente (Optmizado para videoteléfonos y PDA, maneja un bajo ancho de banda.). 1.6.5. Selección de Cámara IP para el desarrollo de tesis Para lograr realizar la captura de imágenes en el centro de desarrollo infantil Popeye’s, se seleccionó la cámara IP Dlink DCS-2102 (Ver Figura 1.5.), la cual tiene un soporte para JAVA, que permitirá realizar la implementación de la interfaz correspondiente para adaptarla al portal. A continuación se hace una breve descripción y características de la cámara: 1.6.5.1. Descripción General de la cámara IP DLINK DCS-2102 La cámara de vigilancia IP DCS-2102 de D-Link (Ver Figura 1.5. Imagen de cámara Dlink - DCS-2102) proporciona una solución de vigilancia versátil y única tanto para la pequeña oficina como el hogar. A diferencia de una cámara conectada a Internet estándar, la cámara IP DCS-2102 es un sistema completo de seguridad y vigilancia ya que incorpora una CPU interna y un servidor web que transmite imágenes de vídeo de alta calidad entregando en sus manos la posibilidad de mantener ambientes totalmente vigilados durante las 24 horas del día. La cámara de vigilancia IP DCS-2102 permite acceder a las imágenes en cualquier momento y controlar todas las funciones operativas de la cámara en forma remota desde cualquier PC o computador portátil, ya sea desde la red local como través de Internet utilizando de manera fácil rápida y sencilla su propio navegador web. Figura. 1.5. Imagen de cámara Dlink - DCS-2102 (tomada de la página web del fabricante) 25 1.6.5.2. Características físicas indicadas por el fabricante Entre las principales características que tiene la cámara IP Dlink a utilizar en el presente proyecto, están: Interfaces - 1 Puerto RJ-45 10/100 BASE-TX Auto-negociación MDI/MDIX Hardware - Sensor: 1/4"color CMOS sensor, 1.3 Mega pixel. SDRAM 64 MB Memoria Flash 8 MB Soporte Disparador Electrónico Automático Disparador Electrónico 1/60 – 1/15000 segundos. Video - Modos de salida de sensor VGA (640x480), XGA (1024x768) y SXGA (1280 x 1024). Flip & mirror Zoom digital hasta 4X Soporta ActiveX, Java Soporta compresión MPEG-4/MJPEG y JPEG para imágenes sin movimiento. Protocolos Soportados - IPV4, ARP, TCP, UDP, SMTP, ICMP,DHCP Cliente, NTP Cliente (D-Link), DNS Cliente, DDNS Cliente (D-Link), SMTP Cliente, FTP Cliente, HTTP Server, Samba Cliente, PPPoE, RTP, RTSP, RTCP, 3GPP, LLTD, SSL, SIP, UPnP-x, UPnP AV, 3GPP Administración y Upgrade - Configuración vía Web browser, notificación de alertas vía FTP e E-mail. Firmware upgrade vía TCP/IP 26 Sistema operativos soportados - Windows 2000, XP, Vista, 3GPP (3rd Generation Partnership Project) 1.7. Investigación y selección de metodología de desarrollo y herramientas tecnológicas para crear el aplicativo web. De las distintas metodologías de desarrollo, así como de tecnologías orientadas a internet que adicionalmente dan una versatilidad en la implementación de aplicaciones Web, se determinó que tanto la metodología de desarrollo así como las herramientas más útiles para poder realizar la implementación del proyecto planteado (tomando en cuenta las mejores herramientas de código abierto), son las siguientes: Scrum, como metodología de desarrollo. Liferay, como portal. Eclipse, como Framework para desarrollo de Portlets (Aplicativos web). A continuación se hará una breve descripción de cada una de las tecnologías seleccionadas, para las cuales también se ha elaborado un análisis comparativo de sus pares en cada una de ellas, para posteriormente en el capítulo de desarrollo ir indicando el uso específico de las mismas. 1.7.1. SCRUM, como metodología de desarrollo. Antes que nada, SCRUM (melé en inglés) como metodología de desarrollo ágil (ahora implementado para otras áreas), proviene de un término usado en el Rugby que se traduciría como “colaboración entre partes para alcanzar un objetivo”, por lo que a diferencia de otras herramientas no proviene de un término reducido por siglas como es costumbre en tecnología. Actualmente existen algunas metodologías de desarrollo de software, sin embargo, entre las metodologías que mejores resultados han generado, están las metodologías ágiles, las mismas que han logrado ajustarse a la dinámica del mercado, el cual “obliga” a la obtención de resultados rápidos, buenos y baratos. En la Tabla 1.8. (Cuadro comparativo de metodologías ágiles) se puede apreciar las características de 2 27 de las principales metodologías ágiles que destacan en la actualidad (Xtreme Programing XP y SCRUM). SCRUM como metodología, justamente ha sido la más adoptada por su facilidad de uso e implementación, por lo que al ser este proyecto de tesis, de tipo “rápido” en lo que se refiere a desarrollo, se optó por seleccionar esta metodología. Esto implica que, de acuerdo a la metodología, se pueden ir obteniendo resultados rápidamente, especialmente al utilizar otras tecnologías (como Liferay), que hacen que el desarrollo y obtención de resultados sea ágil y no tan costoso en cuestión de tiempos y recursos tanto humanos como materiales. Características XP Desarrollo iterativo e incremental SCRUM Desarrollo iterativo e incremental Pruebas unitarias contínuas Se basa en ciclos (iteraciones, sprints) Programación en parejas Pruebas por cada sprint Frecuente integración del equipo con el cliente Corrección de todos los errores antes de continuar con nuevos requerimientos Desarrollo en grupos de hasta máximo 8 personas Interacción contínua con el cliente Refactorización del código Adaptabilidad a los cambios frecuentes Simplicidad del código Propiedad del código Trabaja en función de la previsión Fortalezas Retroalimentación Equipos auto-organizados e incentivados Disminución al máximo de errores Entrega de resultados de alta calidad en tiempos cortos Simplicidad Debilidades Usado generalmente para proyectos pequeños Orientado más a procesos que a desarrollo de software Dificultad para determinar costo del proyecto Posibles retrasos para la entrega de proyecto Pueden haber errores no detectados a tiempo Se debe pensar el proyecto anticipadamente, lo que dificulta la adaptabilidad a cambios Tabla 1.8. Cuadro comparativo de metodologías ágiles En el Anexo 2. (Descripción de la metodología SCRUM), se detalla la historia del cómo se creó esta metodología, así como los conceptos manejados por la misma. 28 Por lo tanto, y tomando en cuenta lo que indica la teoría de la metodología en cuestión, tenemos que, los elementos que componen a la estructura de la metodología SCRUM de acuerdo al proyecto planteado, son (ver Tabla 1.9. Integrantes para aplicación de metodología SCRUM): ELEMENTO SCRUM Scrum Master Product Owner Team Product Backlog Sprint Backlog Sprint Definición de cada Elemento Director del Proyecto de tesis Persona(s) involucrada(s) Ing. Guido Riofrío Dueño del producto. Directora del Lic. Tatiana González CI. Grupo de desarrollo. Para este Max Morillo caso, solo una persona. Pila de requisitos a implementar. Max Morillo Ver Tabla 1.9. Pila de requisitos por cada Max Morillo elemento del product backlog. Ver Tabla 1.10. Tiempo definido para el Product Backlog Tabla 1.9. Integrantes para aplicación de metodología SCRUM 1.7.1.1. Proceso de aplicación de metodología SCRUM. Con los datos de la investigación preliminar, se puede hacer un acercamiento detallado de cómo funcionará la metodología SCRUM para el presente tema. Cabe indicar que esta metodología está pensada en la colaboración entre miembros de desarrollo para lograr obtener un resultado óptimo en el menor tiempo, por lo que al ser este tema de implementación unipersonal, se tratará de enfocar los puntos que señala la metodología haciendo énfasis en la colaboración de todas las personas involucradas. A continuación se detallan como ejemplo, algunos de los requerimientos observados de acuerdo al estudio preliminar (Ver cuadro Tabla 1.10. Pila de requerimientos priorizados (Product Backlog) ): 29 Requerimientos Elaborar un portal para el Centro Infantil Prioridad Estimación del Valor (Rango 1- 7) Estimación del Esfuerzo Inicial (Rango 1- 25) 1 5 12 Crear un aplicativo de monitoreo de niños embebido en el portal del Centro infantil. 2 6 Tabla 1.10. Pila de requerimientos priorizados (Product Backlog) 15 De acuerdo al cuadro anterior (Tabla 1.10.), se desprenden los “Sprint Backlogs”, que no son otra cosa que tareas agrupadas y asignadas al desarrollador (a mi persona, en este caso por ser un tema unipersonal) con una estimación del valor, para la evacuación de los mismos (Ver Anexo 2. Apartado A2.3.), así se tiene el siguiente cuadro ejemplo (Tabla 1.11. Sprint Backlog.): Product Backlog (pila de requerimientos) Sprint Task (Tareas por Sprint) Elaborar un portal para el - Crear página Web principal con Centro Infantil Liferay Portal. Desarrollador Tiempo de duración estimado Max Morillo 2 semanas …. - Manejar roles de usuarios, etc. ………. … …. 1 día ……….. … … Tabla 1.11. Sprint Backlog. En el Anexo 2. (Descripción de la metodología SCRUM), se mostrará la aplicación de la metodología completa y su aplicabilidad al desarrollo del aplicativo del tema en cuestión. 1.7.2. LIFERAY, como portal. Una definición aproximada de Portal, de acuerdo a la experiencia personal en la utilización de Portales es: “Sitio WEB que proporciona a las personas el acceso a información, aplicaciones y procesos de negocios. Todo esto, desde un único punto de entrada”. En la actualidad existen un sinnúmero de empresas o marcas, que han desarrollado Portales o manejadores de portales, tendientes a dar facilidad en la implementación de este tipo de soluciones. Tal es así, que empresas de renombre como: IBM, Oracle, Jboss, etc, han desarrollado sus propios “aplicativos” orientados a este tipo de 30 soluciones, entre los cuales tenemos: Websphere Portal, Oracle Portal, Jboss Portal, etc, respectivamente. La mayoría de estas empresas, por sus características, desarrollan aplicaciones o herramientas “propietarias”, sin embargo, las herramientas Open Source, han ido ganando terreno, por lo que han proliferado un sinnúmero de ellas por sus ventajas económicas y técnicas. Tomando en cuenta las diferentes opciones que se tienen en el mundo de los portales OpenSource, y al ser uno de los objetivos del desarrollo del presente tema el hecho de utilizar este tipo de herramientas, se ha seleccionado a Liferay (Ver Anexo.3. Revisión General de Liferay como Portal) por las siguientes razones: - Está basado100% en Java, por lo tanto, se puede adaptar cualquier aditamento hecho o por desarrollar en el mismo lenguaje. - Se puede instalar sobre cualquier plataforma o SO, por lo que se hace fácil su mantenimiento e instalación. - Es OpenSource (en su versión Community), lo que facilita la personalización e incorporación de cualquier cambio que se requiera, sin la necesidad de estar atados a las especificaciones del fabricante. - Facilita a cualquier usuario, ya sea este principiante o experto, el manejo y administración del portal. En el caso del presente tema, el portal debe permitir el fácil manejo de la administración al grupo de usuarios “Administrador”, que en este caso será la directora del Centro Infantil o a quien delegue tal acción. - Se puede manejar un motor de base de datos independiente al que viene por defecto (HSQL), por lo que es posible conectar a la base de datos seleccionada para este caso (MYSQL). Con esto se posibilita el almacenamiento de la información relacionada a por ejemplo: Usuarios, Grupos de usuarios, etc. - Se pueden “construir” aplicaciones (Portlets), para adaptarlas al portal, sin ningún tipo de modificación a la estructura de Liferay. En el caso específico del presente tema, se deberá crear una aplicación o portlet para el manejo de las imágenes que genere la cámara IP conectada en el Centro Infantil. - Posee “potentes” formas de dar seguridad al acceso de usuarios, lo que hace fácil el manejo de la autenticación de usuarios. - También es factible realizar enlaces con otras aplicaciones (servidores LDAP), otros CMS como Alfresco, etc. 31 A continuación se muestra un cuadro general comparativo de las fortalezas y debilidades (Tabla 1.12. Fortalezas y debilidades de los portales) entre 3 proveedores de Portales (JbossPortal, eXo y LIFERAY), de los cuales sin duda, se destaca además de las razones anteriormente expuestas, por lo siguiente: JBOSS Fortalezas Licencia Source eXo Open Variedad en opciones mantenimiento ofrecidas por empresa Debilidades Sólo utiliza servidor aplicación Jboss las de Variedad herramientas colaborativas LIFERAY de Distribuido junto a un elevado número de portlets funcionales Licencia Open Source Temas y plantillas de aspecto desarrollados por la comunidad Abierto a distintos servidores de aplicación Complejidad del desarrollo de componentes para el portal Licencia Open Source la el de Necesarios conocimientos avanzados de J2EE (JEE), para el desarrollo de componentes del portal Tabla 1.12. Fortalezas y debilidades de los portales Una de las funcionalidades interesantes que tiene liferay entre otras y que sin duda es uno de los dolores de cabeza de cualquier desarrollador de sistemas, es lo referente al manejo de seguridades. Para este punto, Liferay opera con diferentes tipos de manejo de seguridades como: General LDAP (Lightweight Directory Access Protocol) CAS (Central Authentication Service) NTLM (NT Lan Manager) OPEN SSO (Single Sign On) Para el desarrollo del presente tema se seleccionará el manejo de seguridades General, que es el que contemplan la mayoría de Portales, incluído Liferay. 32 Además de las seguridades, Liferay al ser un producto de código abierto, se puede explotar una característica importante y que refiere a la implementación y puesta en marcha de Portlets (aplicaciones pequeñas) en “caliente”, es decir, se puede aplicar un portlet determinado y el o los usuarios del portal lo verán inmediatamente desplegado (siempre que tengan acceso para su visualización, claro está). En la Figura 1.8. se puede apreciar el modelo de funcionamiento de Liferay, donde podemos observar lo referente al manejo, tanto de usuarios como de su salida (layout), donde se incluyen los portlets mencionados. 33 Figura. 1.8. Modelo de funcionamiento de Liferay 34 1.7.2.1. Esquema de funcionamiento de la solución con Liferay Tomando en cuenta las características indicadas tanto en la Figura 1.8 (Modelo de funcionamiento de liferay), así como las fortalezas del mismo, para el presente tema de desarrollo se tiene que funcionaría bajo el siguiente esquema (Ver Figura 1.9. Esquema general de funcionamiento de solución con Liferay): LIFERAY PORTAL Manejo de Seguridades “General” Usuario autenticado Roles y Permisos BDD Administración de Portlets Figura. 1.9. Esquema general de funcionamiento de la solución con Liferay En la fase 2 de “diseño del modelo”, se especificará a profundidad toda la estructura del modelo a seguir para la implementación de la solución. Sin embargo, como veremos en el siguiente apartado de “Portlets”, éstos al ser aplicaciones que se las puede desarrollar y personalizar de acuerdo a las necesidades de los usuarios, se podrá observar cómo se facilita el desarrollo de un portlet utilizando “Eclipse” como framework de desarrollo del portlet del manejo de video de la cámara IP. 35 1.7.2.2. Portlets (Aplicativos) Como se había mencionado anteriormente, Portlet hace referencia a un pequeño programa web que corre en un portal. Liferay (al igual que otros Portales) al trabajar con Portlets, hace que cada uno de ellos se comporte como una aplicación. Para la implementación de Portlets, se debe tomar en cuenta el estándar JSR-2865, que es un modelo de programación conveniente para los desarrolladores de portlets en Java. Este nuevo modelo JSR-286 que se creó posterior al modelo JSR-168 es una versión mejorada, y es la versión 2.0 de Java Portlet Specification, desarrollada según el JCP(Java Community Process) y creada en alineación con la versión 2.0 de Servicios Web para Portlets Remotos (en inglés Web Services for Remote Portlets WSRP). Entre las características principales de este estándar están: Comunicación entre Portlets a través de eventos y renderización de parámetros públicos. Entregar recursos generados dinámicamente de forma directa mediante los portlets. Entregar datos de AJAX6 o JSON7 de forma directa mediante los portlets. Introducción de filtros y escuchas de portlets. Tomando en cuenta la Fig 1.9 (Esquema general de funcionamiento de solución con Liferay), se puede observar el proceso “Administración de Portlets”, el cual es manejado enteramente por el portal en sí (LIFERAY), como se pudo observar en la figura 1.8. (Modelo de funcionamiento de Liferay). Por lo tanto, fácilmente se puede deducir la gran facilidad de administración de portlets, tanto los propios o “nativos” del portal, como de los portlets definidos por el usuario. 5 JSR-286.- Del inglés Java Specification Request. Estándar para la implementación de portlets, desarrollado para mejorar las deficiencias de la versión 1.0 de la especificación JSR-168. 6 AJAX.- Siglas del inglés Asynchronous Javascript And Xml. Técnicas de desarrollo para crear aplicaciones interactivas. 7 JSON.- Acrónimo de JavaScript Object Notation. Formato ligero para intercambio de datos. 36 El siguiente gráfico (Figura 1.10. Esquema de administración de Portlets), ilustra el funcionamiento macro de cómo tanto la utilización del código abierto de Liferay (SDK de Liferay), como del framework correspondiente (Eclipse en este caso), se puede obtener una aplicación o portlet que sea fácilmente ser insertado dentro del portal. Cabe anotar que esta facilidad de desarrollo se da por la ya anotada característica de Liferay que es 100% basada en java. LIFERAY Navegador Aplicación Web del Portal “Centro Infantil Popeyes” Portlet A Contenedor de PORTLETS Portlet B . . . Portlet “Monitoreo Web Cam” Otros Portales Productor WSRP Figura. 1.10. Esquema de administración de Portlets 1.7.3. ECLIPSE, como Framework para desarrollo de Portlets. En la actualidad existen muchas herramientas para desarrollo e implementación de código, entre las cuales y las más destacadas por su utilización a nivel mundial están: Eclipse (Fundación Eclipse) y Netbeans (patrocinado por Sun Microsystems). En la tabla 1.13 (Características de los dos principales entornos de trabajo), se hace una explicación resumida de las bondades de los dos frameworks antes mencionados. Cabe señalar que no existe una característica especial que haga la gran diferencia entre los dos entornos de desarrollo, por lo que generalmente se aplica la familiaridad y 37 adaptabilidad para trabajar, por parte de un desarrollador, como factores que hagan inclinarse hacia una u otro entorno de trabajo. NETBEANS Basado en asistentes (wizards) ECLIPSE Compilación en tiempo real Dispone de editor de texto con revisión de sintaxis. Dispone de editor de texto con resaltado de Sintaxis Se puede administrar las interfases y configuraciones de usuario Integración con ANT Basado en sistema de proyectos de ANT Se pueden realizar pruebas unitarias con Junit Control de versiones Control de versiones con CVS8 Refactoring Integración con Hibernate Maneja varios lenguajes, JAVA incluido. Dispone de asistentes (wizards), para creación de proyectos, clases, etc. Soporta Plug-ins Refactoring Soporta agregación de Plug-ins Maneja varios lenguajes, entre los cuales está JAVA Tabla 1.13. Características de los dos principales entornos de trabajo Para el caso específico del presente proyecto de tesis, se seleccionó Eclipse como entorno de trabajo, debido a que Liferay (Portal) ya dispone de un Plug-in para este framework, y adicionalmente por la familiaridad con este framework (entorno de trabajo). Finalmente Eclipse al igual que Netbeans, también maneja muy bien Java como lenguaje de programación, por lo que es un punto importante a tomar, en la selección del framework antes mencionado. En la figura 1.10 (Esquema de administración de Portlets), se puede observar cómo Eclipse se adapta para el desarrollo de los portlets, y en el caso de este tema de tesis, para la implementación del portlet “Monitoreo de Web Cam”. Por lo tanto Eclipse (Ver ANEXO 4. ECLIPSE, como Framework para desarrollo de Portlets), será la herramienta a utilizar para el desarrollo del portlet correspondiente al manejo del video que emitirá la cámara Web, el mismo que dará la funcionalidad requerida por el Centro de Desarrollo Infantil Popeye’s, además, que se puede aprovechar el código fuente de Liferay para su debida implementación. 8 CVS.- del inglés Concurrent Versioning System. Aplicación que permite controlar las versiones del código o software desarrollado 38 A continuación se muestra el diagrama de representación de cómo eclipse interactuará con liferay (SDK9 de liferay), para la implementación del portlet correspondiente. (Ver Figura 1.11. Esquema de trabajo con Eclipse) LIFERAY Plug-In A Aplicación Web del Portal “Centro Infantil Popeyes” Plug-In B Portlet “Monitoreo Web Cam” . . . Plug-In LIFERAY SDK API Web Cam Internet Web Cam Figura. 1.11. Esquema de trabajo con Eclipse 9 SDK.- Siglas del ingés Software Developement Kit. Conjunto de herramientas de desarrollo que ayudan a un programador a crear aplicaciones. 39 FASE 2 MODELAMIENTO Y DESARROLLO DEL APLICATIVO Una vez se ha realizado tanto la investigación preliminar, como la selección de las herramientas adecuadas para el desarrollo del presente proyecto, en esta fase se determinará el modelo a seguir y su inmediata implementación, tomando en cuenta toda la información recopilada, la cual se ha consolidado para modelar la solución. A continuación se muestra un resumen de lo que es el Centro Infantil, para seguir con el proceso de análisis y desarrollo del presente tema. 2.1. Perfil del Centro Infantil. El Centro Infantil, se dedica al cuidado, educación y atención de niños en edades comprendidas entre el 1 año hasta los 6 años de edad. Tiene como objetivo: “Contribuir técnica y profesionalmente para que los niños y niñas alcancen un desarrollo bio-psicosocio cultural-espiritual adecuado, dentro de un marco afectivo y de valores respetando su ecosistema y su ideología”10. Tomando en cuenta lo expuesto en la primera fase (Ver apartado 1.1. Datos generales del Centro Infantil Popeye’s), el Centro Infantil (CI) requiere de una solución web para facilitar a sus clientes (padres de familia) obtener información de lo que el Centro Infantil hace, así como facilitar un acceso seguro para el monitoreo sus niños vía internet. De lo indicado anteriormente, se puede concluir que específicamente el CI necesita: 1. Un Portal Web para el CI, en el que los usuarios puedan acceder a la información del mismo, y que contendrá lo siguiente: 10 Objetivo tomado del documento de creación del CDI Popeyes. 40 o Información General del Centro Infantil. o Administración de usuarios o Creación de un aplicativo de captura de imágenes digitales, para posterior monitoreo de niños a usuarios autenticados. Para la creación del Portal, así como la administración de usuarios, se utilizará LIFERAY, del cual se reutilizará toda la lógica interna para el manejo tanto de la administración del portal, como la administración de usuarios. 2.2. Planificación del proyecto utilizando la metodología SCRUM Como primer punto de partida en esta fase, se tiene la especificación del Product Backlog (“pila de requerimientos”) completo (Ver. Tabla. 2.1. Product Backlog inicial), esto tomando en cuenta la metodología SCRUM. En esta “pila de requerimientos”, se ha detallado los requerimientos fundamentales implicados en el presente proyecto. Requerimientos Elaborar un portal para el Centro Infantil Crear un aplicativo de monitoreo de niños embebido en el portal del Centro infantil. Prioridad Estimación Estimación del del Valor Esfuerzo Inicial Rango (1-7) Rango (1-25) 1 2 Tabla 2.1. Product Backlog inicial 5 12 6 15 De acuerdo a la tabla anterior, se puede observar que se tiene únicamente dos requerimientos que englobarán las diferentes tareas o actividades, las cuales se las detalla en la tabla de Sprint BackLog (Ver. Tabla 2.2.). De acuerdo a la metodología, la tabla de Sprint Backlog, contiene todas las tareas a realizar y las cuales tienen un peso así como un tiempo estimado de desarrollo. En el proceso de “desarrollo” de cada una de las tareas, el miembro del equipo de desarrollo se encarga de cada una de las tareas. El término “Sprint” comúnmente utilizado en las carreras de autos, se debe justamente a su derivación de “velocidad”, donde cada tarea se la realiza en el menor tiempo posible. A continuación se detalla la lista de tareas (Sprint Backlog) a realizar en el presente proyecto (ver Tabla 2.2. Sprint Backlog): 41 Elemento de la Pila del Producto Tareas por Sprint Analizar y obtener requerimientos del cliente para el portal del CI 1 Estimación del Esfuerzo Inicial Rango (17) 4 Diseñar el modelo conceptual del portal 1 5 Diseñar pantallas de portal de acuerdo al modelo conceptual del mismo 1 4 Consultar en diferentes fuentes la documentación sobre instalación de Liferay Portal. (Adquirir bibliografía de autores experimentados en la herramienta). 2 7 Instalar y configurar java jdk en servidor Linux CentOs 5. 2 3 Instalar y configurar Mysql en servidor CentOs 5. Incluye creación de instancia de BDD para interacción con Liferay. 2 3 Descargar la versión libre de Liferay 6.0.5. Versión Community + Jboss AS 2 1 Configurar el servidor de aplicaciones Jboss embebido en Liferay Portal. 2 6 3 3 3 5 Crear usuarios en liferay, de acuerdo a listado entregado por la Directora del CI. 4 4 Crear grupos de usuarios en liferay, para asignación de usuarios. 4 4 Crear roles para asignación a grupos de usuarios y sus permisos correspondientes. 4 4 Definir restricciones de acceso a opción de "Monitoreo Web Cam." 4 3 Instalar Cámara con conexión a Router Inalámbrico Dlink DIR-600 5 6 Crear un DNS dinámico para conexión remota de cámara IP Dlink. (ver alojamiento Dinámico gratis DYNDNS.ORG) Investigar la forma de emisión de video de la cámara, para captura de imágenes desde el portlet a crear. 5 5 5 7 Realizar pruebas de funcionamiento del portal 5 5 Elaborar un portal para el Centro Infantil Definir plantilla de temas (Template) para el portal, y disposiciones (Layouts) de cada página. Crear página Web principal y opciones públicas, con Liferay Portal. Voluntario Max Morillo Sprint 42 Crear un aplicativo de monitoreo de niños, embebido en el portal del Centro Infantil Analizar y obtener requerimientos del modelo del aplicativo de monitoreo de niños 6 4 Diseñar el modelo conceptual del portlet para el monitoreo de niños 6 5 Diseñar el modelo de Casos de Uso del aplicativo de monitoreo 6 5 Descargar plug-in de Liferay con Tomcat, para Eclipse. 7 1 Cargar y configurar Plug-in de Liferay SDK para Eclipse en ambiente de desarrollo. 7 5 Crear un nuevo proyecto Plug-in Portlet llamado CamaraIPPortlet 7 6 Investigar la forma de generación de portlets con framework de Liferay. 7 7 Crear archivo "service.xml", con definiciones de tabla de datos para la generación vía ServiceBuilder de Liferay, del modelo, servicio y persistencia de datos. Definir entorno de variables para desarrollo de portlet de acuerdo a especificaciones de Liferay. 8 3 8 2 Programar métodos para almacenamiento y recuperación de datos 8 3 Programar View.jsp de presentación de imagen de cámara IP 8 5 Programar View.jsp de administración de Salones 8 5 Programar métodos de administración de Permisos para los portlets creados 8 5 Desplegar proyecto en ambiente de desarrollo para pruebas de conexión. 8 3 Desplegar proyecto en ambiente de producción. 9 5 Realizar pruebas de funcionamiento de los portlets desplegados en producción 9 4 Observación de impacto de la solución en Padres de familia con acceso a portal 9 4 Documentar y digitar marco teórico de tesis 10 7 Tabla 2.2. Sprint Backlog. 43 Para el desarrollo del presente proyecto, se irá especificando cada tarea del Sprint Backlog de su correspondiente requerimiento, así como toda la documentación de implantación o desarrollo de la misma, se la puede observar en el Anexo 2 (Descripción de metodología de desarrollo SCRUM). 2.3. Análisis y Desarrollo del requerimiento: “Elaborar un portal para el Centro Infantil”. Una vez que se han definido los 2 requerimientos globales que conforman la documentación del Product Backlog (Pila de requerimientos) para el presente tema de tesis, se empezará con el desarrollo del requerimiento de la elaboración del portal para el Centro Infantil. Para el desarrollo de este requerimiento, se realizará una especificación detallada de cada una de las tareas que se definieron en la tabla 2.2. (Sprint Backlog), cuya documentación completa de la aplicación de la metodología se podrá observar en el Anexo 2. (Descripción de metodología de desarrollo SCRUM) 2.3.1. Análisis del Portal El portal del CI debe permitir lo siguiente: 1. 2. 3. 4. 5. Mostrar la información general del Centro Infantil. Realizar encuestas a Padres de Familia. Ingresar usuarios con roles de Padres de Familia al sistema. Ingresar y Mostrar noticias de interés. Ocultar opciones de monitoreo de niños a usuarios Invitados. Una vez que se ha definido el alcance del portal, se puede especificar el esquema general que tendrá el mismo. 44 2.3.2. Diseño del modelo conceptual del Portal Como se podrá observar en la figura 2.2. (Estructura del portal del CI), existirán 7 opciones principales dentro del portal del CI. En cada una de las opciones se puede apreciar cada uno de los tipos de usuarios que podrán tener acceso a dicha información. El monitoreo de niños, por lo tanto, debe ser únicamente para los Padres de Familia y Administrador del Portal, por cuestiones obvias de seguridad. Accesos Home Inicio (Guest) Quienes Somos (Guest) Noticias (Guest) (Guest) Sugerencias para padres (Guest) Contáctenos Monitoreo Web Cam (Padre de Familia) Administración Salones (Administrador) Figura. 2.2. Estructura del portal del CI 2.3.3. Diseño de pantallas del portal Para la construcción del portal, y tomando en cuenta el modelo de la figura 2.2. (Estructura del portal del CI), se tendrán los siguientes diseños de pantallas. 45 2.3.3.1. Diseño de Pantalla “Inicio” Login: * LOGO Inicio Quiénes Somos Noticias Sugerencias para Padres Contáctenos Monitoreo Web Cam Administración Salones Publicidad o Fotos del CI PORTLET DE NOTICIAS DEL CI PORTLET DE INFORMACIÓN GENERAL DEL CI Navegación Link de Horarios Link de Instalaciones Link de Fotografías …. Figura. 2.3. Diseño de Página “Inicio” del CI 2.3.3.2. Diseño de Pantalla “Quienes Somos” Login: * LOGO Inicio Quiénes Somos Noticias Sugerencias para Padres Contáctenos Monitoreo Web Cam Misión: Objetivo del Centro Infantil Visión: Visión: Figura 2.4. Diseño de Página “Quiénes Somos” Administración Salones 46 2.3.3.3. Diseño de Pantalla “Noticias” Login: * LOGO Inicio Quiénes Somos Noticias Sugerencias para Padres Contáctenos Monitoreo Web Cam Administración Salones NOTICIAS Entradas Figura 2.5. Diseño de Página “Noticias” 2.3.3.4. Diseño de Pantalla “Sugerencias para Padres” Login: * LOGO Inicio Quiénes Somos Noticias Sugerencias para Padres Contáctenos Monitoreo Web Cam NOTICIAS Entradas Figura 2.6. Diseño de Página “Sugerencias para Padres” Administración Salones 47 2.3.3.5. Diseño de Pantalla “Contáctenos” Login: * LOGO Inicio Quiénes Somos Noticias Sugerencias para Padres Contáctenos Monitoreo Web Cam Administración Salones Datos de teléfono, Dirección, e-mail del Centro Infantil Mapa del centro Figura 2.7. Diseño de Página “Contáctenos” 2.3.3.6. Diseño de Pantalla “Monitoreo Web Cam” Login: * LOGO Inicio Quiénes Somos Noticias Sugerencias para Padres Contáctenos Monitoreo Web Cam Salón: Menores de 2 años V de 2 Fecha Emisión: ___________ Hora Emisión:_______ IMAGEN NO DISPONIBLE Figura 2.8. Diseño de Página “Monitoreo Web Cam” Administración Salones 48 2.3.3.7. Diseño de Pantalla “Administración Salones” Login: * LOGO Inicio Quiénes Somos Noticias Sugerencias para Padres Contáctenos Monitoreo Web Cam Administración Salones Id: Nombre: Menores de 2 años Ip. Cámara: 192.168.1.2 Puerto: 800 URL: /video/mpeg.cgi Guardar Id . Nombre Salón Ip. Cámara Puerto URL Acciones Editar/Borrar/ Figura 2.9. Diseño de Página “Administración Salones” 2.3.4. Desarrollo del portal utilizando Liferay Portal La primera etapa del desarrollo del portal implica una serie de acciones que se describen en los apartados siguientes y que permitirán tener el entorno de Liferay operativo para desarrollar el contendio del portal e iniciar el desarrollo del aplicativo propuesto. Liferay al ser una herramienta de código abierto, tanto el servicio técnico, así como el soporte y documentación están en cierta medida restringidos al público en general, por lo que la mayoría de desarrolladores que utilizan esta herramienta debe revisar un sinnúmero de foros y documentación de comunidades para dicha implantación. Obviamente existe un servicio pagado que permite una instalación sin complicaciones, esta versión se la denomina “Enterprise”, pero para este caso, se utilizará la información y documentación del grupo “COMMUNITY”. Avanzando en el proceso de instalación de Liferay para la implementación del portal, se tiene que para dicho proceso es necesario contar con los siguientes pre-requisitos: 49 1. Servidor de Hosting con mínimo 2GB de Memoria y 250GB de disco, con Sistema Operativo CentOs 5.0. 2. Instalación de JDK de java 5.0 o superior. (De preferencia v. 6.0.22). 3. Instalación de base de datos MySql en CentOs. 4. Acceso vía Putty al servidor como administrador o “root”. 5. Paquete de Liferay 6.0 para su instalación. En el sitio oficial de Liferay (http://www.liferay.com), existe un link que deriva a los foros (ej. http://www.liferay.com/es/community) de discusión tanto de la instalación como de los diferentes problemas que se presentan en la instalación de Liferay, especialmente con los “bundles” o servidores de aplicaciones embebidos o que vienen con alguna distribución. Para este caso se tomará la distribución: “Liferay Portal Community Edition bundled with JBoss”, es decir la versión de Liferay con Jboss como servidor de aplicaciones. Los recursos a utilizarse con sus correspondientes valoraciones, se las puede observar en el Anexo 6. (Recursos a utilizar en el desarrollo de la solución). 2.3.4.1. Documentación de implantación de Liferay Tomando en cuenta los pre-requisitos, así como la información recopilada tanto del sitio oficial como de la documentación existente en otros foros y libros editados por expertos en Liferay, a continuación se detalla la documentación del proceso de implantación de Liferay Portal. 2.3.4.1.1. Instalación de Java en CentOs 5.0 Una vez que se ha contratado el hosting (Ver Anexo 5. Hosting), se deberá realizar la instalación en primer lugar del JDK de java. Para esto se deberán realizar los siguientes pasos: 1. Bajar la versión de JDK (disponible en el sitio oficial https://cds.sun.com). Para la versión de CentOs 5.0, se deberá obtener el JDK mediante el comando: $ wget –c jdkADescargar 2. Una vez realizado el “download” o descarga del JDK, se deberá realizar la instalación del mismo. Ej. $ sudo ./ jdk.rmp.bin 50 3. Luego de la instalación se deber realizar la declaración de las variables de ambiente. En el caso de CentOs, se deberá definir la variable JAVA_HOME, así: $ export JAVA_HOME=/home/jdk $ export PATH=/home/jdk/bin:$PATH $ echo $JAVA_HOME --> para verificar la instalación de la variable. 2.3.4.1.2. Instalación de Mysql en CentOs Para la instalación de Liferay es necesario disponer de una base de datos, aunque no es “indispensable”, debido a que trae internamente preinstalada una base “Hsql”. Para este caso, se utilizará Mysql, por lo que a continuación se detalla los pasos para dicha instalación: 1. Obtener la versión de Mysql (del sitio oficial http://dev.mysql.com). 2. Instalar la versión descargada de mysql. 3. Una vez instalada la versión de Mysql, se debe ingresar y crear la instancia correspondiente para Liferay, así: $ mysql –unombreusuario –ppassword Si las credenciales son correctas, mostrará un mensaje como el que sigue: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 119 Server version: 5.1.37-1ubuntu5 (Ubuntu) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 4. Crear la instancia para liferay una vez se esté dentro de mysql, así: mysql> create database lportal character set utf8; Una vez que se ha configurado la instancia de Liferay (en este caso “lportal”), se tiene listo el ambiente previo a la instalación y configuración del Portal. En el siguiente apartado, se muestra la implantación de Liferay en el servidor en cuestión. 51 2.3.4.1.3. Instalación de Liferay con JBoss en CentOs 5.0 La versión de Liferay a instalar será la que viene con el “bundle Jboss” como servidor de aplicaciones. Para dicha instalación, se deberán realizar los siguientes pasos: 1. Obtener la versión de Liferay con bundle Jboss (en el sitio oficial de Liferay http://www.liferay.com/es/downloads/liferay-portal/available-releases). 2. Desempaquetar en un directorio, de preferencia del “/home”. Posteriormente se deberá configurar el archivo “/liferay/jboss…/bin/run.conf”, donde se deberá determinar la cantidad de memoria que utilizará el servidor de aplicaciones. 3. Crear el archivo “portal-ext.properties” en el directorio raíz de liferay (esto para la versión 6.0.5), donde constará la conexión a la base de datos Mysql, así: “# MySQL # jdbc.default.driverClassName=com.mysql.jdbc.Driver jdbc.default.url=jdbc:mysql://localhost/lportal?useUnicode=true&characterEncodin g=UTF-8&useFastDateParsing=false jdbc.default.username=admin jdbc.default.password=cholismoquis portal.ctx=/” 4. Borrar los accesos a la base de datos original “hsql” y el directorio “sevencogs*”, ya que si no se realiza este paso, Liferay tomará como inicio la base hsql, la cual no es recomendada en ambientes de implantación reales, según indicación del mismo fabricante. 5. Configurar el archivo “httpd.conf”, donde se configurará el puerto, así: 6. Configurar el archivo “/liferay/jboss../server/default/desplegar/jboss.sar/WEBINF/server.xml”, donde se pondrá el puerto 80 en vez del 8080, para que el portal responda al nombre de dominio contratado. 7. Arrancar el servidor de aplicaciones “jboss”, con el comando: “sudo nohup ./run.sh –b 0.0.0.0 &” El servidor mostrará el siguiente mensaje de carga completada: “01:57:34,487 INFO [ServerImpl] JBoss (Microcontainer) [5.1.0.GA (build: SVNTag=JBoss_ 5_1_0_GA date=200905221053)] Started in 39s:811ms” 8. En un “browser” o navegador, colocar la dirección del dominio contratado, para la verificación del correcto funcionamiento de liferay con Jboss. La Figura 2.10 (Pantalla inicio Liferay), muestra la página inicial de Liferay cuando el proceso de instalación es correcto. 52 Figura 2.10. Pantalla de Inicio de Liferay 2.3.4.2. Crear la página Web principal y opciones públicas con Liferay. Una vez que se ha realizado el diseño tanto de la estructura del portlet, así como el diseño de las pantallas que integrarán la página web del CI, a continuación se muestra el funcionamiento de Liferay para el desarrollo del sitio Web propuesto. 2.3.4.2.1. Consideraciones previas a la creación de un sitio web con Liferay En la Figura 2.10. (Pantalla inicio Liferay) anterior, se mostró la inicialización de Liferay, una vez que se han instalado todos los pre-requisitos mencionados en los puntos anteriores. Por lo tanto, a continuación se muestran algunas de las opciones que se deben tener en cuenta, antes de iniciar con el desarrollo de la página como tal para el CI. Para ingresar al ambiente de Liferay es necesario autenticarse. Por defecto (una vez que se ha instalado correctamente) el usuario de ingreso es “test” con su clave de igual manera “test”, tal como lo muestra la figura Figura 2.11. (Autenticación inicial en Liferay). 53 Figura 2.11. Autenticación inicial en Liferay Una vez autenticado correctamente, el usuario administrador, posteriormente podrá acceder a las diferentes opciones para administración del sitio correspondiente. En la figura Figura 2.12. (Opciones de administración para usuario autenticado), se muestran las diferentes opciones que visualiza un usuario con roles de administrador. En los siguientes apartados, se detallará de mejor manera el funcionamiento de la autenticación en Liferay, con su respectivo manejo de usuarios. 54 Figura 2.12. Opciones de administración para usuario autenticado 2.3.4.2.1.1. Administración de Liferay En la siguiente figura Figura 2.13. (Opciones de administración de Liferay Portal), se puede observar el detalle de las distintas opciones que dispone Liferay. 55 Figura 2.13. Opciones de administración de Liferay Portal Específicamente para el desarrollo de un sitio web, es necesario tomar en cuenta algunos “conceptos” que Liferay maneja para desarrollar un sitio Web: a. Liferay, dispone de Páginas (“Pages” en inglés), lugar donde se podrán colocar o poner los diferentes contenidos, b. Liferay, maneja portlets (aplicativos), que pueden tener contenido dinámico o estático. Estos portlets pueden ser administrados (insertados, borrados, modificados) por usuario(s) autenticados, y se pueden colocar en una o varias páginas del portal. Lo indicado anteriormente es particularmente interesante, desde el punto de vista del desarrollador o administrador del sitio, ya que se tiene la “gran ventaja” de poder “crear” o agregar un aplicativo (portlet), sin tener que modificar la codificación de la página (a nivel html, etc.). Claro está, que el portal deberá manejar el protocolo WSRP11, sin el cual no se puede lograr el comportamiento “plug and play” de los portlets. 2.3.4.2.1.2. Agregación de páginas web Con los conceptos anteriormente anotados, se puede ver en el primer bloque de la figura Figura 2.13. (Opciones de administración de Liferay Portal), la opción “Página” (Page), que hace referencia, a que con ella se podrá agregar páginas al sitio Web, tal como lo muestra la Figura 2.14. (Agregar Páginas): 11 WSRP. (Web Services for Remote Portlets por sus siglas en inglés), Protocolo que suministra un estándar de servicios web, para permitir el "plug-and-play" de portlets en ejecución remotos desde fuentes dispares. 56 Figura 2.14. Agregar Páginas Indistintamente del “Template” (Plantilla) que se verá luego, como se puede observar, la creación de páginas es amigable y sencilla, de tal manera que no se codifica absolutamente nada. 2.3.4.2.1.3. Agregación de Portlets (aplicativos) a las páginas Web Una vez que se ha creado la página (Inicio en este caso), se puede agregar distintos elementos, aplicativos o “portlets”, tal como se puede observar en la siguiente figura (Figura 2.15. Agregar portlets): Figura 2.15. Agregar portlets En la figura 2.16. (Figura 2.16. Incorporación de portlets a página), se puede observar que con solo arrastrar la aplicación correspondiente, se puede incorporar al contenido de la página, para posteriormente realizar las “adecuaciones” o modificaciones, de acuerdo a lo que requiera el portal o página. 57 Figura 2.16. Incorporación de portlets a página 2.3.4.2.1.4. Disposición de Página Web Algo que es importante mencionar, es el tema de la “Disposición de la página”, para el caso de la ubicación de los aplicativos o portlets dentro de la página web creada. Es así que, en las opciones de Liferay para administración (Ver segundo bloque de Figura 2.13. Opciones de Liferay), existe una opción referente a “Disposición de Página” (Layout), donde se puede observar que es factible seleccionar cualquier formato de página, de tal manera que lo que se vaya agregando como portlets, tomen el formato escogido (ver Figura 2.17. Disposición de Página). 58 Figura 2.17. Disposición de Página Una vez definidos la “disposición” de la página y los portlets o aplicaciones que irán en la misma, se debe personalizar cada uno de los portlets, para colocar la información que se requiera. 2.3.4.2.1.5. Edición de un portlet de contenido Cada una de las aplicaciones que tiene disponibles Liferay, tiene un objetivo distinto, por lo que se hablará de uno de los portlets más comunes y utilizados en esta herramienta. Se trata del portlet “Visor de Contenido Web” (“Web Content Display”por su correspondiente en inglés), en el cual se puede colocar contenido ya sea texto, imágenes, animaciones flash, links, e incluso se puede editar el contenido en html. En la figura siguiente, se puede mostrar dicha personalización (ver Figura2.18. Personalización de un Web Content Display): 59 Figura2.18. Personalización de un Web Content Display Como complemento a la explicación de la incorporación tanto de páginas como de aplicaciones o portlets, es necesario conocer dos aspectos si bien no esenciales, pero si importantes para la “presentación” de una página. Estos dos puntos son los relacionados a la ubicación de un “logo”(imagen) y un “template”(tema) o tema para la página Web. 2.3.4.2.1.6. Selección de Tema (Template) Respecto al “template” (tema), es necesario hacer referencia a la opción “Página” del segundo bloque (Administración) de la figura Figura 2.13. (Opciones de administración de Liferay Portal), mediante la cual se puede realizar la incorporación de “templates”(temas o plantillas) propios de liferay. Es factible sin embargo, “crear” un tema personalizado, aunque ese punto podrá ser revisado en la documentación de liferay (link de comunidad de liferay). 60 Como se puede apreciar en la figura 2.19 (Administración de página web), es factible realizar diferentes adecuaciones a cada página o a un conjunto de páginas. La opción a la que estamos haciendo referencia en la Figura 2.19, es la correspondiente a “Look and Feel” o “Apariencia”, la cual permite (como se muestra en la figura 2.20. “Selección de Tema”) realizar la selección del “tema” (Theme en inglés) que por defecto trae Liferay. Es posible así mismo, agregar otros temas que están a la disposición de la comunidad, a través de la importación de los mismos. Figura 2.19. Administración de Página Web Figura 2.20. Selección de Tema 61 2.3.4.2.1.7. Inserción de un “Logo” en el sitio Web. La inserción de un “logo”12 en la página web, va de la mano con respecto a la “apariencia” de la página, ya que dependiendo del diseño de la página (ya sea personalizado o importado desde liferay), será la ubicación de un logo personalizado dentro de la página web. Tomando en cuenta esto, entonces, para poder ingresar un logo, se puede hacerlo mediante la opción “Configuración” del segundo bloque de la Figura 2.13 (Opciones de administración de Liferay Portal), donde se puede ingresar un logo mediante la importación de un archivo gráfico (jpg, gif, png, etc.), tal como lo muestra la figura 2.21. (Agregación de un logo). Figura 2.21. Agregación de un logo Tomando en cuenta todos los temas expuestos anteriormente, referentes a la creación de una página, por lo tanto, se podrá ya dar un bosquejo general de lo que será el sitio web para el Centro Infantil. Es necesario entonces, retomar la estructura del portal (Ver Figura 2.2. Estructura del portal), para poder crear el sitio con las páginas correspondientes, y adicionalmente tomar en cuenta el diseño de cada una de las páginas establecido en las figuras (2.3. a 2.9. ). Por lo tanto la página diseñada quedaría como lo muestra la figura 2.22 (Figura 2.22. Sitio Web creado para el CI). 12 Logo.- Contracción de Logotipo. Elemento gráfico que identifica a una persona, empresa, institución o producto. 62 Figura 2.22. Sitio Web creado para el CI 2.3.4.2.1.8. Creación de usuarios en liferay Debido a que el tema central es el monitoreo de los niños del centro infantil, por lo tanto es imprescindible un buen manejo de usuarios por parte de la herramienta correspondiente, que en este caso es Liferay. Como se había mencionado en la justificación del uso de este portal de portales, uno de los puntos importantes es el manejo de usuarios, de tal manera que la autenticación sea segura. 63 Para la creación de usuarios, por lo tanto, es necesario empezar con la opción correspondiente para el ingreso de usuarios, la cual es “Panel de Control (Control Panel)”, que se muestra en el segundo bloque (Administración) de la figura 2.13. (Opciones de Liferay). En la figura 2.23 (Opciones del Panel de Control de Liferay), se muestra cada una de las opciones para la administración del Portal. Lo que interesa de estas opciones es la correspondiente a “Usuarios” (Users). Figura 2.23. Opciones del Panel de Control de Liferay El ingreso de usuarios no tiene ninguna complicación en Liferay, tal como lo muestra la figura 2.24. (Pantalla de manejo de usuarios), de tal manera que únicamente se deberá tener en cuenta los nombres de usuarios y sus correspondientes claves de acceso. 64 Figura 2.24. Pantalla de manejo de usuarios Como se puede observar en la figura anterior, la administración de usuarios parte de un listado de usuarios que pueden accesar a los recursos del portal. Cada uno de los usuarios puede ser así mismo modificado, eliminado, etc., de tal manera que ese manejo queda a discreción del administrador del portal o dueño del portal. En la figura 2.25 (Ingreso de usuarios), se puede observar los campos necesarios para el ingreso de datos de los usuarios. Figura 2.25. Ingreso de usuarios 65 Una vez que se han ingresado los diferentes usuarios al sistema, éstos pueden ser agrupados para un mejor control de sus accesos y de qué lugares del sitio pueden accesar. 2.3.4.2.1.9. Creación de grupos de usuarios en liferay La creación de grupos, al igual que de los usuarios es bastante sencilla en Liferay, tal como lo ilustra la figura 2.26 (Creación de grupos de usuarios). Es necesario hacer énfasis, en que tanto la creación de usuarios, roles, grupos, etc., se basa en el esquema de organización de recursos que Liferay maneja, tal como se lo puede observar en la figura A3.2 (Gráfico Organización de Recursos de Liferay) del Anexo 3. Figura 2.26. Creación de grupos de usuarios Una vez que el grupo ha sido creado, se puede posteriormente realizar varias acciones como la asignación de permisos, usuarios y páginas. Es en este lugar donde se pueden poner las restricciones de acceso a los diferentes usuarios que se creen. En las figura 2.27. (Opciones de administración de grupos) y 2.28 (Permisos por grupo), se pueden observar las diferentes acciones que el administrador del portal puede realizar con el grupo creado. 66 Figura 2.27. Opciones de administración de grupos En la siguiente pantalla, se puede distinguir la asignación de permisos a un grupo creado. En este caso y para el presente tema de tesis, se tendrá 2 grupos de usuarios para el monitoreo y administración de imágenes a través de cámaras Web: Administradores y Padres de Familia. Figura 2.28. Permisos por grupo 67 2.3.4.2.1.10. Creación de roles para asignación a grupos de usuarios en Liferay Los roles en Liferay, sirven para delimitar la acción de un grupo de usuarios o también de usuarios individuales. Como en este caso ya se ha fijado que los grupos de usuarios serán dos (Administrador y Padres de Familia), por lo tanto, se delimitará el acceso de acuerdo al siguiente criterio: 1. Administrador: persona encargada de la gestión del portal, y quien manejará el ingreso, modificación o eliminación de los datos de la o las cámaras IP que estarán instaladas en el Centro Infantil. 2. Padre de Familia: quien podrá únicamente observar las imágenes transmitidas desde la cámara seleccionada, de acuerdo al listado de cámaras que pueda ingresar el administrador del portal. Con estas puntualizaciones, en las figuras 2.29 (Ingreso de Roles) y 2.30 (Asignación de permisos al rol), se puede observar la simplicidad de creación de roles, para su posterior utilización en la asignación de permisos a cada grupo de usuarios creados. Figura 2.29. Ingreso de Roles 68 Figura 2.30. Asignación de permisos al rol 2.3.4.3. Instalación de Cámara IP con conexión a Router inalámbrico Dlink DIR-600. Una de las partes principales y motivo del presente tema de tesis, es la interacción con las imágenes emitidas desde una cámara Ip a través del internet, todo esto mediante la incorporación de ese video en vivo en el portal o sitio del centro infantil. Ya se ha visto en los puntos anteriores, cómo se pueden crear páginas, agregar portlets o aplicativos a cada una de las páginas, así mismo la asignación de permisos mediante roles para la visualización de cierta información a los diferentes usuarios y grupos creados para el efecto. En este punto se indicará la forma de instalación de la cámara IP Dlink DCS-2102 seleccionada, y se hará referencia a la forma de interacción con el router inalámbrico DLink DIR-600, como paso previo al desarrollo en sí del aplicativo que nos permitirá interactuar entre la cámara IP y el sitio o portal del Centro Infantil. A continuación se puntualizan cada uno de los pasos para dicha instalación: 69 1. 2. 3. 4. 5. 6. La cámara IP Dlink, deberá ser conectada físicamente a un puerto del router (en este caso el router DIR-600). Este dispositivo será el puente entre la conexión a internet de un proveedor de internet (ISP13). Una vez conectada la cámara, se deberá dar una dirección IP fija con su respectivo puerto de acceso. Esto permitirá dar seguridad a la conexión y emisión del video vía internet. Para este caso, se ha definido el puerto 800 para la cámara. Respecto a la autenticación del usuario administrador de la cámara, se la puede realizar a través del software que viene con la misma cámara. Debido a que la restricción de acceso se dará mediante Liferay, no es necesario dicha autenticación a nivel de cámara. Una vez que se han parametrizado las direcciones ip, puertos y conexiones, tanto de router como de cámara, es necesario publicar en un dominio de direcciones IP dinámico. Para esto, se ha utilizado el sitio de direcciones dinámicas gratis correspondiente a DynDns14 (Ver figura 2.31. Sitio DynDns). Este registro de nuestra dirección dinámica, permitirá a la cámara IP, emitir las imágenes sin importar qué dirección IP provea el ISP, debido a que pueden existir cambios de dichas direcciones, lo que provocaría que las imágenes no puedan ser vistas por los Padres de Familia. El registro creará un nombre de dominio para nuestra cámara. Con el dominio de nuestra cámara registrado en Dyndns, se puede configurar a nivel del software del router, mediante la opción de Dynamic DNS del setup del equipo (Ver figura 2.32 Asignación de dominio para DDNS del router). Finalmente se deberá configurar en el router, lo referente al “port forwarding” (Ver figura 2.33 Redireccionamiento de puerto para la cámara), para que la cámara pueda ser vista por el aplicativo que se desarrollará para la captura de imágenes y su posterior monitoreo en el portal. Figura 2.31. Sitio DynDns 13 14 ISP (Internet Service Provider) por sus siglas en Ingles. www.dyndns.com .- Sitio para registro de direcciones dinámicas públicas. 70 Figura 2.32. Asignación de dominio para DDNS del router Figura 2.33. Redireccionamiento de puerto para la cámara 71 2.4. Análisis y Desarrollo del requerimiento: “Crear un aplicativo de monitoreo de niños, para el portal del Centro Infantil”. Una vez que se ha realizado la parte “gráfica” del sitio web del Centro Infantil, en este punto se analizará el desarrollo del portlet para el monitoreo, motivo del presente tema de tesis. 2.4.1. Análisis del portlet de Monitoreo de niños. El sistema o el aplicativo debe estar en capacidad de: 1. 2. 3. 4. Registrar nuevos salones de monitoreo, para el centro infantil. Eliminar salones del centro infantil. Editar los salones del centro infantil. Monitorear un salón seleccionado del centro infantil. 2.4.2. Modelo conceptual del portlet de Monitoreo de niños. Tomando en cuenta el análisis de lo que debe realizar el portlet, se desprende que se tiene el concepto “Salón”, que sobresale de todos los requerimientos. Para identificar dicho concepto y establecer una estandarización para este tema de tesis, al concepto “Salón”, se lo denominará “WCPSalon” (siglas de Web Cam Portlet Salon). De este concepto se desprende el modelo siguiente (Figura2.34 Modelo Conceptual del aplicativo): class impl WCPSalon - ipCamara: char nombreSalon: char puertoCamara: int salonId: int urlStreaming: char Figura 2.34. Modelo Conceptual del aplicativo. 72 2.4.3. Diseño de la tabla de datos A partir del modelo definido para el aplicativo, se puede obtener un diseño de la tabla de datos (ver Tabla 2.3) que intervendrá para el registro de datos de salones en los cuales estará la cámara IP instalada. Nombre de Tabla: WCPSalon (Nombre derivado de Web Cam Portlet Salon) Campo Tipo Longitud Descripción salonId Integer 10 Campo de identificación único. nombreSalon Varchar 75 Nombre del salón a monitorear ipCamara Varchar 15 Dirección IP de cámara Web, situada en el salón. puertoCamara Integer 4 Puerto de la cámara Web. urlStreaming Varchar 75 Dirección del streaming de video Tabla 2.3. Descripción de Tabla para almacenamiento de datos de Salones 2.4.4. Modelo de Casos de Uso. Para el desarrollo del presente tema de tesis, se identificaron los siguientes casos de uso que parten del análisis de los requerimientos descubiertos inicialmente (Ver Figura 2.35. Diagrama de casos de uso): uc Casos de uso principales Límite del sistema Administrar Salones Administrador Monitorear Salones Padres de Familia Figura 2.35. Diagrama de casos de uso 73 Como se puede observar en la Figura 2.35 (Diagrama de casos de uso), se han identificado dos actores (Administrador y Padre de Familia), que son quienes interactuarán con el sistema. El actor Administrador, es quien se encargará de la gestión de los datos de Salones, es decir incluye todas las tareas de: Ingreso, Modificación y Eliminación de los datos correspondientes a Salones y los respectivos datos de la cámara instalada. Por su parte, el actor Padre de Familia, es quien realizará el monitoreo vía cámara IP al salón, previo a una autenticación en el portal (una vez ingresados los datos del salón a monitorear) y a la selección del “Salón” que desea observar. 2.4.5. Detalle de casos de Uso identificados Con la finalidad de obtener un detalle más preciso del modelo a implementar, a continuación se desglosan los casos de uso identificados, así: Código Caso de Uso Nombre del Caso de Uso Actor involucrado CS0100 Administrar Salón Administrador CS0200 Monitorear Salón Padre de Familia Tabla 2.4. Listado de casos de uso identificados 2.4.5.1. Desglose de los Casos de Uso encontrados Código CU: CS0100 Nombre: Administrar Salón Actores: Administrador 74 Descripción: Permite realizar el ingreso, modificación o eliminación de salones a visualizar en el monitoreo de cámaras instaladas. Precondición: Autenticarse con código de usuario y contraseña válidos en el Portal. Postcondición: Los datos almacenados mostrarán la imagen de la cámara IP en el Portlet de Web Cam a visualizar. Flujo Normal de Eventos 1. 1. 2. 3. 5. El administrador selecciona la página de Administración de salones. El sistema crea un nuevo salón y muestra la pantalla de ingreso de salones. El administrador ingresa la información del salón y presiona el botón de grabar de la pantalla de ingreso de salones El sistema valida que se han ingresado todos los campos del salón y guarda el salón. El caso de uso finaliza Flujo alterno de eventos: No se ingresaron datos para los campos del Salón 1. El sistema muestra el mensaje “La información del salón está incompleta” y el caso de uso continúa en el paso 3 Flujo alterno de eventos: Se desea eliminar un salón 2. El administrador presiona el botón “acciones” de fila de lista de salones, del portlet o pantalla de administración de salones. El administrador selecciona la opción “eliminar” salón, de la lista de salones, en el portlet de administración de salones. El sistema solicita la confirmación de la acción Borrar salón. El administrador presiona el botón de “Ok” para confirmar el borrado. El sistema elimina el salón del listado de salones y muestra un mensaje de acción realizada satisfactoriamente y el caso de uso finaliza 3. 4. 5. 3. 4. Flujo alterno de eventos: Se desea editar un salón 1. 2. 3. 2. 6. El administrador presiona el botón “acciones” de fila de lista de salones, del portlet o pantalla de administración de salones. El sistema despliega las opciones del menú disponibles El administrador selecciona la opción “Editar”. El sistema muestra los datos del salón seleccionado en la sección Salón de la pantalla Administrar Salones El caso de uso continúa en el paso 3 del curso básico. Tabla 2.5. Caso de uso “Agregar Salon” El diagrama de la Figura 2.36. (Diagrama representativo del caso de uso “Administrar Salon”), muestra la representación gráfica del flujo de eventos del caso de uso “Administrar Salón”. 75 Figura 2.36. Diagrama representativo del caso de uso “Administar Salon” Código CU: CS0200 Nombre: Monitorear Salón Actores: Padres de Familia Descripción: Permite realizar el monitoreo de imágenes de salones donde se encuentra una cámara ip instalada. Precondición: Autenticarse con código de usuario y contraseña válidos en el Portal. Postcondición: Ninguna Flujo Normal de Eventos 1. 2. 3. 4. 5. Flujo alterno de 3. El Padre de familia ingresa a la pantalla web “Monitoreo Web Cam” del portal del CI. El sistema muestra el portlet de “Visualizar imágenes de Cámara”. El Padre de familia, selecciona el salón a monitorear imágenes. El sistema realiza la conexión con los datos de la cámara asociada al salón y muestra las imágenes que están emitiendo ese momento. El padre de familia sale de la pantalla web “Monitoreo Web Cam” del portal del CI. En caso de que el sistema no pueda conectarse con la cámara asociada al salón, 76 el sistema presentará un mensaje de “No se puede obtener imagen”. eventos Tabla 2.8. Caso de uso “Monitorear Salon” El diagrama de la Figura 2.37. (Diagrama representativo del caso de uso “Monitorear Salon”), muestra la representación gráfica del flujo de eventos del caso de uso “Agregar Salón”. Salón: de 2 Salón patio posterior V No se puede obtener imagen Salón: Seleccionar Salón V Salón: de 2 Menores de 2 años Fecha Emisión: ___________ Hora Emisión:_______ EMISION DE IMAGEN Figura 2.37. Diagrama representativo del caso de uso “Monitorear Salon” 2.4.6. Diagramas de Clases V 77 Una vez definidos los casos de uso que intervienen en el proceso del desarrollo del portlet de visualización de imágenes y su derivado de administración de salones, se tiene los siguientes diagramas de clases que conforman el diseño. Cabe indicar que debido a que el desarrollo se lo hará utilizando la infaestructura de liferay, la implementación del código correspondiente está ligada a lo que el entorno liferay tiene especificado por defecto. La definición de clases con la implementación adicional que efectúa Liferay, quedaría de la siguiente manera (para fines de estandarización, se ha definido la implementación de métodos en idioma Inglés), ver Figura 2.38 (Definición de clases para el modelo): class Modelo de clases «interface» WCPSalon WCPSalonImpl BaseModelImpl + WCPSalonImpl() WCPSalonModelImpl -_wcpSalon BaseModelImpl WCPSalonClp - _companyId: long _groupId: long _ipCamara: String _nombreSalon: String _puertoCamara: long _salonId: long _urlStreaming: String + + + + + + + + + + + + + + + + + + + + + + + + + clone() : Object compareTo(WCPSalon) : int equals(Object) : boolean getCompanyId() : long getGroupId() : long getIpCamara() : String getNombreSalon() : String getPrimaryKey() : long getPrimaryKeyObj() : Serializable getPuertoCamara() : long getSalonId() : long getUrlStreaming() : String hashCode() : int setCompanyId(long) : void setGroupId(long) : void setIpCamara(String) : void setNombreSalon(String) : void setPrimaryKey(long) : void setPuertoCamara(long) : void setSalonId(long) : void setUrlStreaming(String) : void toEscapedModel() : WCPSalon toString() : String toXmlString() : String WCPSalonClp() BaseModel «interface» WCPSalonModel WCPSalonWrapper - _wcpSalon: WCPSalon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + clone() : java.lang.Object compareTo(com.centroinfantilpopeyes.webcamportlet.model.WCPSalon) : int getCompanyId() : long getExpandoBridge() : com.liferay.portlet.expando.model.ExpandoBridge getGroupId() : long getIpCamara() : java.lang.String getNombreSalon() : java.lang.String getPrimaryKey() : long getPrimaryKeyObj() : java.io.Serializable getPuertoCamara() : long getSalonId() : long getUrlStreaming() : java.lang.String getWrappedWCPSalon() : WCPSalon hashCode() : int isCachedModel() : boolean isEscapedModel() : boolean isNew() : boolean setCachedModel(boolean) : void setCompanyId(long) : void setEscapedModel(boolean) : void setExpandoBridgeAttributes(com.liferay.portal.service.ServiceContext) : void setGroupId(long) : void setIpCamara(java.lang.String) : void setNew(boolean) : void setNombreSalon(java.lang.String) : void setPrimaryKey(long) : void setPuertoCamara(long) : void setSalonId(long) : void setUrlStreaming(java.lang.String) : void toEscapedModel() : com.centroinfantilpopeyes.webcamportlet.model.WCPSalon toString() : java.lang.String toXmlString() : java.lang.String WCPSalonWrapper(WCPSalon) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + clone() : Object compareTo(WCPSalon) : int getCompanyId() : long getExpandoBridge() : ExpandoBridge getGroupId() : long getIpCamara() : String getNombreSalon() : String getPrimaryKey() : long getPrimaryKeyObj() : Serializable getPuertoCamara() : long getSalonId() : long getUrlStreaming() : String hashCode() : int isCachedModel() : boolean isEscapedModel() : boolean isNew() : boolean setCachedModel(boolean) : void setCompanyId(long) : void setEscapedModel(boolean) : void setExpandoBridgeAttributes(ServiceContext) : void setGroupId(long) : void setIpCamara(String) : void setNew(boolean) : void setNombreSalon(String) : void setPrimaryKey(long) : void setPuertoCamara(long) : void setSalonId(long) : void setUrlStreaming(String) : void toEscapedModel() : WCPSalon toString() : String toXmlString() : String - _companyId: long _expandoBridge: ExpandoBridge _groupId: long _ipCamara: String _nombreSalon: String _puertoCamara: long _salonId: long _urlStreaming: String + + + + + + + + + + + + + + + + + + + + + + + + + + + clone() : Object compareTo(WCPSalon) : int equals(Object) : boolean getCompanyId() : long getExpandoBridge() : ExpandoBridge getGroupId() : long getIpCamara() : String getNombreSalon() : String getPrimaryKey() : long getPrimaryKeyObj() : Serializable getPuertoCamara() : long getSalonId() : long getUrlStreaming() : String hashCode() : int setCompanyId(long) : void setExpandoBridgeAttributes(ServiceContext) : void setGroupId(long) : void setIpCamara(String) : void setNombreSalon(String) : void setPrimaryKey(long) : void setPuertoCamara(long) : void setSalonId(long) : void setUrlStreaming(String) : void toEscapedModel() : WCPSalon toString() : String toXmlString() : String WCPSalonModelImpl() Figura 2.38. Definición de clases para el Modelo 78 Debido a que Liferay genera sus propias clases para la creación de portlets, las implementaciones de los métodos que contienen la lógica para realizar las tareas correspondientes deben realizarse en uno de los archivos generado, que se especifican de acuerdo a la generación del “Service Builder” de Liferay. A continuación se muestra la forma cómo se realizará la implementación de clases basado en el framework manejado por liferay (Ver Figura 2.39. Definición de clases para la implementación personalizada): class impl Generación de Service Builder de Liferay «interface» serv ice::WCPSalonLocalServ ice #wcpSalonLocalService base::WCPSalonLocalServiceBaseImpl Implementación personalizada WCPSalonLocalServ iceImpl + + + + addSalon(WCPSalon, long) : WCPSalon deleteSalon(long) : void deleteSalon(WCPSalon, long) : void getSalones(long) : List<WCPSalon> Figura 2.39. Definición de clases para la implementación personalizada Liferay a través de su generador “ServiceBuilder” para portlets y en base a la definición de la “tabla de datos” (Ver Tabla 2.3. Descripción de Tabla para almacenamiento de datos de Salones), generará sus respectivas interfaces y clases propias, por lo que es necesario realizar la construcción clases y métodos personalizados, para la administración de los datos del portlet a construir. Como se observa en la Figura 2.39. (Definición de clases para la implementación personalizada), la implementación de métodos se la realizará en la clase WCPSalonLocalServiceImpl (que deberá autogenerar Service Builder de Liferay), que a su vez extiende la clase WCPSalonLocalServiceBaseImpl, para esta última implementar la interfaz WCPSalonLocalService. 79 A continuación se muestra la definición de clases que se obtendrán con la generación del “Service Builder” de Liferay (Figura 2.40. Clases que implementará Service Builder de Liferay), donde se muestra la clase WCPSalonLocalServiceImpl con sus respectivos métodos a personalizar, además de las extensiones e implementaciones a las clases mostradas en la Figura 2.39. (Definición de clases para la implementación personalizada): class serv ice base::WCPSalonLocalServiceBaseImpl impl::WCPSalonLocalServ iceImpl + + + + + + + + + + + + + + + + + + + + + + + + # + + + + + + + + + + + addSalon(WCPSalon, long) : WCPSalon deleteSalon(long) : void deleteSalon(WCPSalon, long) : void getSalones(long) : List<WCPSalon> «interface» WCPSalonLocalServ ice + + + + + + + + + + + + + + + + + addSalon(com.centroinfantilpopeyes.webcamportlet.mo... addWCPSalon(com.centroinfantilpopeyes.webcamportlet... createWCPSalon(long) : com.centroinfantilpopeyes.webc... #wcpSalonLocalService deleteSalon(long) : void deleteSalon(com.centroinfantilpopeyes.webcamportlet.... deleteWCPSalon(long) : void deleteWCPSalon(com.centroinfantilpopeyes.webcamport... dynamicQuery(com.liferay.portal.kernel.dao.orm.Dynami... dynamicQuery(com.liferay.portal.kernel.dao.orm.Dynami... dynamicQuery(com.liferay.portal.kernel.dao.orm.Dynami... dynamicQueryCount(com.liferay.portal.kernel.dao.orm.Dy... -_service getSalones(long) : java.util.List<com.centroinfantilpopey... getWCPSalon(long) : com.centroinfantilpopeyes.webcam... getWCPSalons(int, int) : java.util.List<com.centroinfantil... getWCPSalonsCount() : int updateWCPSalon(com.centroinfantilpopeyes.webcampor... updateWCPSalon(com.centroinfantilpopeyes.webcampor... addWCPSalon(WCPSalon) : WCPSalon createWCPSalon(long) : WCPSalon deleteWCPSalon(long) : void deleteWCPSalon(WCPSalon) : void dynamicQuery(DynamicQuery) : List dynamicQuery(DynamicQuery, int, int) : List dynamicQuery(DynamicQuery, int, int, Ord... dynamicQueryCount(DynamicQuery) : long getCounterLocalService() : CounterLocalS... getResourceLocalService() : ResourceLoca... getResourcePersistence() : ResourcePersist... getResourceService() : ResourceService getUserLocalService() : UserLocalService getUserPersistence() : UserPersistence getUserService() : UserService getWCPSalon(long) : WCPSalon getWCPSalonLocalService() : WCPSalonL... getWCPSalonPersistence() : WCPSalonPer... getWCPSalons(int, int) : List<WCPSalon> getWCPSalonsCount() : int runSQL(String) : void setCounterLocalService(CounterLocalServi... setResourceLocalService(ResourceLocalSe... setResourcePersistence(ResourcePersistenc... setResourceService(ResourceService) : void setUserLocalService(UserLocalService) : void setUserPersistence(UserPersistence) : void setUserService(UserService) : void setWCPSalonLocalService(WCPSalonLoca... setWCPSalonPersistence(WCPSalonPersist... updateWCPSalon(WCPSalon) : WCPSalon updateWCPSalon(WCPSalon, boolean) : ... WCPSalonLocalServ iceUtil -_wcpSalonLocalService WCPSalonLocalServ iceWrapper + + + + + + + + + + + + + + + + + + + addSalon(com.centroinfantilpopeyes.webcamportlet.model.WCPSalon, long) : com.ce... addWCPSalon(com.centroinfantilpopeyes.webcamportlet.model.WCPSalon) : com.cent... createWCPSalon(long) : com.centroinfantilpopeyes.webcamportlet.model.WCPSalon deleteSalon(long) : void deleteSalon(com.centroinfantilpopeyes.webcamportlet.model.WCPSalon, long) : void deleteWCPSalon(long) : void deleteWCPSalon(com.centroinfantilpopeyes.webcamportlet.model.WCPSalon) : void dynamicQuery(com.liferay.portal.kernel.dao.orm.DynamicQuery) : java.util.List dynamicQuery(com.liferay.portal.kernel.dao.orm.DynamicQuery, int, int) : java.util.List dynamicQuery(com.liferay.portal.kernel.dao.orm.DynamicQuery, int, int, com.liferay.port... dynamicQueryCount(com.liferay.portal.kernel.dao.orm.DynamicQuery) : long getSalones(long) : java.util.List<com.centroinfantilpopeyes.webcamportlet.model.WCP... getWCPSalon(long) : com.centroinfantilpopeyes.webcamportlet.model.WCPSalon getWCPSalons(int, int) : java.util.List<com.centroinfantilpopeyes.webcamportlet.model.... getWCPSalonsCount() : int getWrappedWCPSalonLocalService() : WCPSalonLocalService updateWCPSalon(com.centroinfantilpopeyes.webcamportlet.model.WCPSalon) : com.c... updateWCPSalon(com.centroinfantilpopeyes.webcamportlet.model.WCPSalon, boolea... WCPSalonLocalServiceWrapper(WCPSalonLocalService) WCPSalonLocalServ iceClp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + addSalon(com.centroinfantilpopeyes.webcamportlet.model.WCPSalon, l... addWCPSalon(com.centroinfantilpopeyes.webcamportlet.model.WCPSa... clearService() : void createWCPSalon(long) : com.centroinfantilpopeyes.webcamportlet.mod... deleteSalon(long) : void deleteSalon(com.centroinfantilpopeyes.webcamportlet.model.WCPSalo... deleteWCPSalon(long) : void deleteWCPSalon(com.centroinfantilpopeyes.webcamportlet.model.WCP... dynamicQuery(com.liferay.portal.kernel.dao.orm.DynamicQuery) : java.ut... dynamicQuery(com.liferay.portal.kernel.dao.orm.DynamicQuery, int, int) :... dynamicQuery(com.liferay.portal.kernel.dao.orm.DynamicQuery, int, int, ... dynamicQueryCount(com.liferay.portal.kernel.dao.orm.DynamicQuery) : l... getSalones(long) : java.util.List<com.centroinfantilpopeyes.webcamportl... getService() : WCPSalonLocalService getWCPSalon(long) : com.centroinfantilpopeyes.webcamportlet.model.... getWCPSalons(int, int) : java.util.List<com.centroinfantilpopeyes.webca... getWCPSalonsCount() : int setService(WCPSalonLocalService) : void updateWCPSalon(com.centroinfantilpopeyes.webcamportlet.model.WC... updateWCPSalon(com.centroinfantilpopeyes.webcamportlet.model.WC... addSalon(com.centroinfantilpopeyes.webcamportlet.mod... addWCPSalon(com.centroinfantilpopeyes.webcamportlet.... createWCPSalon(long) : com.centroinfantilpopeyes.webc... deleteSalon(long) : void deleteSalon(com.centroinfantilpopeyes.webcamportlet.m... deleteWCPSalon(long) : void deleteWCPSalon(com.centroinfantilpopeyes.webcamportl... dynamicQuery(com.liferay.portal.kernel.dao.orm.Dynamic... dynamicQuery(com.liferay.portal.kernel.dao.orm.Dynamic... dynamicQuery(com.liferay.portal.kernel.dao.orm.Dynamic... dynamicQueryCount(com.liferay.portal.kernel.dao.orm.Dy... getClassLoaderProxy() : ClassLoaderProxy getSalones(long) : java.util.List<com.centroinfantilpopey... getWCPSalon(long) : com.centroinfantilpopeyes.webcam... getWCPSalons(int, int) : java.util.List<com.centroinfantilp... getWCPSalonsCount() : int updateWCPSalon(com.centroinfantilpopeyes.webcamport... updateWCPSalon(com.centroinfantilpopeyes.webcamport... WCPSalonLocalServiceClp(ClassLoaderProxy) Figura 2.40. Clases que implementará Service Builder de Liferay 2.4.7. Configuración de Eclipse para la iteracción con Liferay 80 Para el desarrollo, se hará uso de Eclipse como framework de desarrollo, tomando en cuenta que para ello es necesario utilizar la lógica que maneja Liferay. Por lo tanto se deberá utilizar el plug-in de Liferay para Eclipse (versión Helios), con la finalidad de proceder con el desarrollo del portlet propuesto. 2.4.7.1. Carga y configuración de Plug-in de Liferay para eclipse. Liferay como portal, ha creado un plug-in para Eclipse, mediante el cual es posible la creación de portlets, temas, hooks, etc. La versión disponible al momento del plug-in, es el que viene con Tomcat como servidor de aplicaciones y para la versión “Helios” de Eclipse. Dicho plug-in se lo puede descargar de la página principal del fabricante (www.liferay.com sección comunidad). Una vez que ha sido descargado, deberá abrirse el framework Eclipse, para realizar las adecuaciones y configuraciones que se detallan a continuación: 1. Para instalar, se debe abrir una instancia de Eclipse Helios e ir a Help → Eclipse Marketplace y buscar por la palabra clave "Liferay". Figura 2.41. Instalación de Plug-in 2. Para la carga del Plug-In, se debe seleccionar la opción (Window / Preferences) y se deberá filtrar por la palabra “Liferay”, como lo que muestra la siguiente pantalla (Figura 2.42): 81 Figura 2.42. Carga de Plug-in 3. Tomando en cuenta que ya se realizó el “download” del plug-in, se lo deberá cargar a la configuración pulsando en “Add”. (Ver. Figura 2.43): Figura 2.43. Carga manual de Plug-in 4. Una vez cargado el plug-in, se deberá configurar el servidor de aplicaciones para poder ejecutar y depurar los proyectos de Liferay. Para esto se debe seleccionar la opción (Window / Preferences), luego escoger (Server / Runtime Environment), pulsar “Add” y se deberá seleccionar (“Liferay, Inc.” / Liferay v6.0 (Tomcat 6.0)), tal como se muestra en la figura 2.44. 82 Figura 2.44. Configuración de Servidor de aplicaciones para LiferayPlug-in 5. Finalmente, se deberá registrar el servidor en Eclipse, por lo que se debe abrir la ventana “Servers” (Window / Show View / Other / Server / Servers). Con el botón derecho dentro de esa ventana se selecciona (New / Server ), que muestra la pantalla donde se deberá escoger el tipo de servidor a agregar (en este caso será el de Liferay), se dará un nombre del host (localhost), nombre a la instancia de servidor (Liferay + Tomcat 6.0) y por último se seleccionará la instancia del servidor que se ha creado en el apartado anterior. (ver figura 2.45. Registro del servidor Liferay en Eclipse) Figura 2.45. Registro del Servidor Liferay en Eclipse Para comprobar el correcto funcionamiento de la instalación del plug-in, se deberá en Eclipse seleccionar la ejecución del servidor Liferay instalado, comprobando la conexión a la dirección http://localhost:8080 de un navegador cualquiera. 83 2.4.7.2. Creación del proyecto “CamaraIPPortlet” tipo “Portlet” en eclipse. Luego de la instalación del plug-in de liferay en eclipse, y una vez que se ha probado el correcto funcionamiento del mismo, se puede empezar a crear diversos tipos de aplicaciones, las que pueden ser desde “portlets” hasta “hooks” y “temas”. En este apartado se verá la forma de cómo crear un aplicativo tipo “portlet”, utilizando las herramientas descritas. A continuación se detallan cada uno de los pasos para la creación de un portlet: 1. En el ambiente del framework (Eclipse), seleccionar la opción (File / New / Project / Liferay / Liferay Plug-in Project) y presionar “Next”. A continuación se deberá poner un nombre del proyecto y un nombre que se utilizará para mostrarse. En la sección “Configuration” tenemos que seleccionar el SDK que vamos a utilizar y la instancia de Liferay donde lo vamos a ejecutar (Ver Figura 2.46 y Figura 2.47). De igual manera, se deberá seleccionar el tipo de aplicación que el plugin deberá crear (portlet, hook, ext, layout y theme). Figura 2.46. Creación de un nuevo Proyecto 84 Figura 2.47. Creación de un nuevo Portlet 2. Una vez que se ha creado el proyecto, se podrá crear el aplicativo, lo cual se verá en el siguiente apartado. En la figura 2.48, se puede observar cómo queda la estructura general de la creación de un portlet, mediante el plug-in instalado en eclipse. Figura 2.48. Estructura de un proyecto Portlet mediante Plug-in Liferay en Eclipse 2.4.7.3. Investigación para la generación de portlets utilizando la infraestructura de Liferay. 85 Además de la creación del proyecto del portlet, Liferay tiene un framework específico para la creación de portlets que trabaja de la mano con Eclipse. Por lo tanto a continuación se hará una breve revisión de la forma de cómo opera dicho framework, y cómo ayuda la creación de portlets para ser desplegados en el entorno de liferay. 1.- Entorno de trabajo para desarrollo de liferay Liferay posee una potente herramienta de desarrollo de diferentes tipos de aplicativos (portlets, hooks, etc.), que se denomina “SERVICE BUILDER”. Esta herramienta hace que el desarrollador ahorre tiempo, en la creación de aplicaciones, mediante la creación en un solo paso de: Configuración de Hibernate15 con la cual trabaja para la persistencia de datos, Configuración de Spring16 para la Inyección de instancias, Creación de métodos de búsqueda Capa de Modelo Creación de clases con sentencias SQL de todas las tablas que se requieren en el proyecto Creación completa de la capa DAO17 (Data Access Object) Así mismo, esta herramienta realiza la generación de código, permitiendo de esta manera manipular fácilmente las tablas mediante operaciones de administración de datos (Inserciones, Actualizaciones, Borrado), incluso la persistencia interna que tiene Liferay, es generada mediante Service Builder. En la figura 2.49, se puede observar gráficamente la interacción de esta herramienta con las tecnologías indicadas. CÓDIGO DE PORTLET SERVICE BUILDER SPRING 15 HIBERNATE Hibernate.- Herramienta de mapeo Objeto Relacional (ORM) para la plataforma Java Spring.- Alternativa y sustituto del modelo de Enterprise JavaBean 17 DAO.- Data Access Object. Objeto que provee una BDD interfaz abstracta para algún tipo de base de datos o mecanismo de persistencia 16 86 Figura 2.49. Operación de herramienta de creación de Liferay Para la generación de código mediante la utilización del Service Builder de Liferay, es necesaria la creación de un archivo XML, donde conste la información correspondiente de las tablas que se crearán en el proyecto. Este archivo xml se denominará “service.xml”, y deberá ser creado en la raíz del directorio “/docroot/WEB-INF/”, del proyecto del portlet creado en Eclipse, y que se mencionó en el apartado anterior “Creación del proyecto “CamaraIPPortlet” ”. La generación del código a partir del archivo mencionado, simplemente se la realiza utilizando la construcción vía ANT18 que dispone Eclipse. Una vez que el Service Builder genera el código, crea dos capas (layers) de código: la capa de Interfase (interface layer), y la capa de Implementación (implementation layer). En la capa de Interfase, estará todo el código que el Service Builder genere automáticamente, por lo que el desarrollador no deberá utilizar el código allí creado. Con lo que el programador podrá interactuar y personalizar código, será en la capa de implementación, la cual se crea así mismo vía Service Builder, pero únicamente contiene un esqueleto de codificación, lo que permite al desarrollador implementar cualquier personalización que requiera el proyecto. 2.4.8. Desarrollo del aplicativo utilizando la infraestructura Liferay Luego de conocer la forma de cómo opera Liferay con su framework “Service Builder” en la generación de código, en este apartado se realizará la generación del portlet a partir de la tabla definida para el aplicativo de monitoreo de niños así como la personalización de clases necesarias para lograr el objetivo planteado. 18 ANT.- Software para automatización de procesos de compilación y construcción de aplicaciones. Proyecto Open Source creado por Apache Software Foundation. 87 Antes de iniciar con la generación del portlet como tal, es necesario considerar algunos puntos, como lo son: generación de portlet mediante Service Builder y la definición de las variables iniciales, de acuerdo a lo que Liferay necesita. 2.4.8.1. Generación de portlet mediante “Service Builder” de Liferay De acuerdo a lo indicado en el apartado anterior, el framework de Liferay, para la generación del código correspondiente a la aplicación, es necesario crear un archivo xml, el cual contendrá la información referente a la tabla de datos y los métodos “finder” que se deseen implementar. La definición de los datos que contendrá el archivo, se derivan de la especificación de la tabla hecha en el apartado (2.1.3.2.3. Diseño de la tabla de datos), por lo tanto el archivo deberá contener la siguiente declaración (Ver Listado 2.1. Archivo service.xml): <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 6.0.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_6_0_0.dtd"> <service-builder package-path="com.centroinfantilpopeyes.webcamportlet"> <author>Max Morillo</author> <namespace>WCP</namespace> <entity name="WCPSalon" local-service="true" remote-service="false"> <column name="salonId" type="long" primary="true" /> <column name="nombreSalon" type="String" /> <column name="ipCamara" type="String" /> <column name="puertoCamara" type="long" /> <column name="urlStreaming" type="String" /> <column name="companyId" type="long" /> <column name="groupId" type="long" /> <order by="asc"> <order-column name="nombreSalon" /> </order> <finder name="NS" return-type="Collection"> <finder-column name="groupId" /> <finder-column name="nombreSalon" /> </finder> <finder name="IP" return-type="Collection"> <finder-column name="groupId" /> <finder-column name="ipCamara" /> </finder> <finder name="GroupId" return-type="Collection"> <finder-column name="groupId" /> </finder> 1 2 3 4 88 <finder name="CompanyId" return-type="Collection"> <finder-column name="companyId" /> </finder> </entity> </service-builder> Listado 2.1. Archivo service.xml Del listado anterior se tiene que: #1 Identifica el paquete en el cual Service Builder generará el código #2 Define la Entidad de Base de datos #3 Define la(s) columna(s) de la entidad #4 Define los métodos de búsqueda de datos Una vez que se ha definido el archivo “service.xml”, se podrá generar el código mediante la construcción vía ANT del mismo archivo, presionando el botón “service builder”, tal como lo muestra la figura 2.50 (Construcción del código). Figura 2.50. Construcción del código Luego de la generación del código, la estructura del portlet queda como muestra la figura 2.51., donde adicional a la estructura que crea el plugin de liferay (indicado en la figura 2.48. Estructura de un proyecto Portlet mediante Plug-in Liferay en Eclipse), se tiene todo lo generado por el Service Builder de Liferay. 89 Figura 2.51. Generación del código mediante Service Builder 2.4.8.2. Definición de entorno de variables previo al desarrollo del portlet en Liferay. Para continuar con las configuraciones previas a la generación de código mediante Service Builder de Liferay, es necesario tomar en cuenta la definición de ciertos archivos iniciales, los cuales contendrán una serie de configuraciones iniciales. A continuación se describe lo requerido: portlet.xml .- Este archivo contiene la información y configuración del portlet. Se deberá por lo tanto especificar que el portlet implementará los modos edit y view (de acuerdo al estándar JSR-28619), tal como lo indica la porción de código siguiente de la etiqueta <supports>: <supports> <mime-type>text/html</mime-type> <portlet-mode>view</portlet-mode> <portlet-mode>edit</portlet-mode> </supports> 19 JSR-286.- Java Specification Request. Estándar 2.0 para creación de Portlets. 90 También se debe especificar en la etiqueta <init-param> del mismo archivo, la definición del parámetro de inicialización, así: <init-param> <name>edit-jsp</name> <value>/edit.jsp</value> </init-param> Debido a que para el desarrollo del presente tema, se necesitarán 2 portlets (uno de administración, y otro de monitoreo de cámaras), por lo tanto quedará especificado de la siguiente manera, dentro del portlet.xml como sus respectivos parámetros (<init-param>) para cada uno de los portlets, así (ver Listado 2.2.): <?xml version="1.0"?> <portlet-app version="2.0" xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" > <portlet> <portlet-name>CamaraIPPortlet</portlet-name> <display-name>Visualizar Imagenes de Camara</display-name> <portlet-class> com.centroinfantilpopeyes.webcamportlet.registrosalon.SalonAdminPortlet </portlet-class> <init-param> <name>view-jsp</name> <value>/view.jsp</value> </init-param> <init-param> <name>edit-jsp</name> <value>/edit.jsp</value> </init-param> <expiration-cache>0</expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>view</portlet-mode> <portlet-mode>edit</portlet-mode> </supports> <resource-bundle>content.Language</resource-bundle> <portlet-info> <title>Visualizar Imagenes de Camara</title> <short-title>CamaraIPPortlet</short-title> <keywords>CamaraIPPortlet</keywords> </portlet-info> <security-role-ref> <role-name>administrator</role-name> </security-role-ref> <security-role-ref> <role-name>guest</role-name> </security-role-ref> <security-role-ref> <role-name>power-user</role-name> </security-role-ref> <security-role-ref> 91 <role-name>user</role-name> </security-role-ref> <supported-public-render-parameter> supported-public-render-parameter </supported-public-render-parameter> </portlet> <portlet> <portlet-name>salon-admin</portlet-name> <display-name>Administrar Salones</display-name> <portlet-class> com.centroinfantilpopeyes.webcamportlet.registrosalon.SalonAdminPortlet </portlet-class> <init-param> <name>view-jsp</name> <value>/admin/view.jsp</value> </init-param> <init-param> <name>add-process-action-success-action</name> <value>false</value> </init-param> <expiration-cache>0</expiration-cache> <supports> <mime-type>text/html</mime-type> </supports> <resource-bundle>content.Language</resource-bundle> <portlet-info> <title>adminSalones</title> <short-title>adminSalones</short-title> <keywords>adminSalones</keywords> </portlet-info> <security-role-ref> <role-name>administrator</role-name> </security-role-ref> <security-role-ref> <role-name>guest</role-name> </security-role-ref> <security-role-ref> <role-name>power-user</role-name> </security-role-ref> <security-role-ref> <role-name>user</role-name> </security-role-ref> </portlet> </portlet-app> Listado 2.2. Definición de variables en Portlet.xml Como se puede observar en el listado anterior, han sido creadas dos definiciones de “portlets”, uno con nombre “CamaraIPPortlet” y otro “Salon-admin”, cada uno de los cuales así mismo tiene el parámetro (<init-param>) con dos modos de implementación (edit, y view) con una diferencia, la cual es que en el segundo portlet dichos modos están en otra ubicación, tal como lo muestra el listado. 2.4.8.3. Programación de métodos para almacenamiento y recuperación de datos. 92 Luego de las configuraciones iniciales de los archivos vistos en los apartados anteriores, corresponde ahora programar los métodos para almacenamiento y recuperación de datos. Para ello, se debe tomar en cuenta la clase “WCPSalonLocalService”, la cual fue generada mediante la utilización del “Service Builder” de Java. En dicha clase, como se había mencionado, se harán las adecuaciones de personalización de lo que se requiere tanto para el ingreso de datos como para la recuperación de los mismos. Es así que, de acuerdo al diseño de clases visto anteriormente, se tiene que existirán 4 métodos creados para el efecto (el código completo de dicha clase se lo puede ver en el Anexo 8. Código Fuente.): 1. addSalon .- Método creado para el almacenamiento de la información de la cámara Ip por salón ingresado. 2. deleteSalon .- Método que permite el borrado de información de salón. 3. getSalones .- Método para recuperación de datos de un determinado salón. Es necesario recalcar, que Liferay maneja el concepto de MVC20 para portlets, o lo que se denomina MVCPortlet. Esto hace que Liferay otorgue una fácil forma de desarrollar al programador mediante la utilización de clases de portlet, haciendo que los enlaces (links) o cuando se utilice URLs21, puedan manejar fácilmente métodos para realizar cualquier tarea que se desee personalizar. Para lograr este objetivo, es necesario crear los archivos correspondientes que manejen la parte frontal del aplicativo (front-end) y los métodos personalizados, entre los cuales están: Archivo Inicio (Init.jsp).- que maneja todas las importaciones (imports), declaraciones de librerías e inicializaciones de variables. Archivos Vista (View.jsp) .- manejan la parte frontal de la visualización web (frontend web). Clase de manejo de Utilidades (ActionUtil) .- que contiene métodos para recuperar objetos tipo “Salon”. Clase de manejo de datos(SalonAdminPortlet).- que contiene los métodos para administración de datos de salones para el portlet. Clase de control de errores (SalonRegValidator).- que contiene métodos para validación de datos a ingresar en el registro de salones. 20 21 MVC.- Sigla de Modelo Vista Controlador. URL .- Sigla en inglés de Uniform Resource Locator 93 Por lo tanto, adicional a la clase “WCPSalonLocalService”, que maneja la administración de datos, se tendrá las clases anteriormente puntualizadas (la codificación de cada uno de ellas se detalla en el Anexo 8. Código Fuente). A continuación se indicarán los métodos que cada una de las clases contiene para el manejo de información y su almacenamiento: Clase “ActionUtil” : getSalones.- Obtiene un objeto salones. salonFromRequest.- Obtiene un objeto salón de acuerdo a un parámetro de solicitud. Clase “SalonAdminPortlet”: addSalon.- Agrega un salón editSalon.- Crea un objeto salón para pasar a un parámetro, con la finalidad de poder modificar datos. updateSalon.- Actualiza los datos modificados en el objeto salón. deleteSalon.- Borra un salón. viewSalon.- Método para visualización de datos. Clase “SalonRegValidator”: validateSalon .- Valida datos para el ingreso de salones. 2.4.8.4. Programación de archivos Vista (View.jsp) para presentación de imágenes de cámara y de administración de salones. Para la implementación de los archivos Vista (View) necesarios en Liferay para la interacción con el usuario, es necesario en primer lugar tomar en cuenta el API22 de etiquetas AlloyUI que Liferay ha creado. Estas etiquetas tienen como finalidad, evitar al 22 API.- siglas en inglés Application Programming Interface. Conjunto de funciones, procedimientos/métodos que ofrece una biblioteca para el uso de otro software. 94 desarrollador la tarea de tener que especificar componentes HTML, CSS23 y JavaScript por separado, permitiendo en una sola API combinar lo mejor de esas tres tecnologías. Por lo tanto en la creación de los archivos Vista, y que son los que muestran información con un formato amigable al usuario, se utilizará el API mencionada. Las “etiquetas” (o “markups”) se diferencian del resto de etiquetas ya conocidas con la definición inicial de “aui:”. En el siguiente listado (ver listado 2.4) se muestra una porción de código del archivo Vista (view) con la implementación de dichas marcas: <aui:form name="fm" action="<%= addSalonURL.toString() %> "method="post"> <aui:fieldset> <aui:input name="nombreSalon" size="45" /> <aui:input name="ipCamara" size="45" /> <aui:input name="puertoCamara" size="4" /> <aui:input name="urlStreaming" size="45" /> <aui:button-row> <aui:button type="submit" /> </aui:button-row> </aui:fieldset> </aui:form> Listado 2.3. Código donde se utiliza API AlloyUI de Liferay Con lo indicado previamente, se debe indicar que existen dos archivos Vista que se deben crear, uno para la visualización de las imágenes de la cámara IP, y el otro para la administración de salones donde constarán los datos de la o las cámaras que se vayan a instalar. En el listado 2.2. del apartado 2.1.3.2.8.2. (Definición de entorno de variables previo al desarrollo del portlet en Liferay.), se mencionó que existirán 2 portlets en la definición del archivo “portlet.xml”, y se hacía referencia a que cada uno de ellos tendría sus propias variables de inicio. Pues, esas variables de inicio, indican que cada uno de los portlets tiene 23 CSS.- siglas en inglés de Cascade Style Sheets. Lenguaje para definir la presentación de un documento estructurado escrito en HTML o XML. 95 sus propios archivos Vista (view), y que serán los que muestren la parte frontal del portlet (fron-end web). Dicho esto, en el listado 2.4 se puede observar la implementación del archivo view para la administración de salones, donde se muestra la utilización del archivo “init.jsp” como recipiente de las librerías a utilizar por las vistas, y adicionalmente la utilización de etiquetas AlloyUI y la interacción con los métodos implementados en las clases señaladas en el apartado anterior, así: 96 <% /** * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ %> <%@include file="/init.jsp" %> <liferay-ui:success key="salonSaved" message="salon-saved-successfully" /> <liferay-ui:success key="salonDeleted" message="salonDeleted" /> <liferay-ui:success key="salonUpdated" message="salonUpdated" /> <liferay-ui:error key="fields-required" message="fields-required" /> <liferay-ui:error key="error-deleting" message="error-deleting" /> <liferay-ui:error key="error-updating" message="error-updating" /> <portlet:actionURL name="addSalon" var="addSalonURL"/> <aui:form name="fm" action="<%= addSalonURL.toString() %>" method="post"> <aui:fieldset> <aui:input name="nombreSalon" size="45" /> <aui:input name="ipCamara" size="45" /> <aui:input name="puertoCamara" size="4" /> <aui:input name="urlStreaming" size="45" /> <aui:button-row> <aui:button type="submit" /> </aui:button-row> </aui:fieldset> </aui:form> <liferay-ui:search-container emptyResultsMessage="there-are-no-salons" delta="5"> <liferay-ui:search-container-results> <% List<WCPSalon> tempResults = ActionUtil.getSalones(renderRequest); results = ListUtil.subList(tempResults, searchContainer.getStart(), searchContainer.getEnd()); total = tempResults.size(); pageContext.setAttribute("results", results); pageContext.setAttribute("total", total); %> </liferay-ui:search-container-results> Listado 2.4. Implementación del archivo view.jsp para la administración de salones 97 El archivo “view.jsp” anterior, es el que manejará la parte administrativa de los salones, y deberá estar ubicado en la ruta “/docroot/admin/view.jsp”, tal como lo indica la parametrización del archivo “portal.xml”, con la finalidad de poder distribuir mejor la implementación. 2.4.8.5. Programación de permisos para los portlets creados. Una vez que se tenga lista la implementación de la visualización de los portlets, corresponde ahora implementar la forma en la que cada portlet se pueda asignar los permisos de acceso correspondiente. Esto es importante, en la medida en que se puede programar la forma de controlar permisos en la misma manera que lo hace Liferay, dentro de su manejo de permisos, teniendo de esta manera, un manejo uniforme y estandarizado de realizar esta tarea. En liferay para realizar esto, se debe tomar la generación de dos archivos necesarios para este manejo: Archivo “portlet.properties”.- Archivo leído por Liferay automáticamente, y que contiene las indicaciones con las cuales opera el portlet. Archivo “default.xml” .- Indicaciones o “directivas” que proporcionan el listado de permisos que se otorgarán al portlet. En el archivo “porltet.properties”, deberá constar el archivo con las definiciones de permisos (default.xml) y la ruta donde estará localizado, así para este caso estaría en: “resource.actions.configs=resource-actions/default.xml” La línea anterior indica que el archivo estará ubicado en la carpeta “resource-actions”, por lo que se deberá crear dicha carpeta y agregar el archivo “default.xml”, el cual contendrá lo mostrado en el listado 2.5., así: 98 <?xml version="1.0" encoding="UTF-8"?> <resource-action-mapping> <portlet-resource> <portlet-name>CamaraIPPortlet</portlet-name> <permissions> <supports> <action-key>ADD_SALON</action-key> <action-key>VIEW</action-key> </supports> <community-defaults> <action-key>VIEW</action-key> </community-defaults> <guest-defaults> <action-key>VIEW</action-key> </guest-defaults> <guest-unsupported> <action-key>ADD_SALON</action-key> </guest-unsupported> </permissions> </portlet-resource> <model-resource> <modelname>com.centroinfantilpopeyes.webcamportlet.model.WCPSalon </model-name> <portlet-ref> <portlet-name>salon-admin</portlet-name> </portlet-ref> <permissions> <supports> <action-key>DELETE</action-key> <action-key>PERMISSIONS</action-key> <action-key>UPDATE</action-key> <action-key>VIEW</action-key> </supports> <community-defaults> <action-key>VIEW</action-key> </community-defaults> <guest-defaults> <action-key>VIEW</action-key> Listado 2.5. Definición de permisos de portlets en archivo “default.xml” Como se puede observar en el listado anterior, existen 2 bloques explícitamente delimitados como: “portlet-resource” y “model-resource”. El “portlet-resource”, hace referencia a la definición de qué usuarios pueden realizar la acción de agregar salones (add-salon), mientras que la opción “vista” (view), se ha fijado para los usuarios “guest”(invitados) y el grupo “comunidad” (community). 99 Mientras que el segundo bloque “model-resource”, indica qué tipo de permisos manejará Liferay para el portlet indicado. En este caso se ha puesto que podrá manejarse las opciones: “DELETE”, “PERMISSIONS”, “UPDATE” y “VIEW”. 2.4.8.6. Despliegue del proyecto en ambiente de desarrollo para pruebas de conexión Luego de todas las codificaciones y configuraciones necesarias para la construcción del portlet, materia del presente tema de tesis, finalmente se debe realizar el “despliegue” (deploy) del proyecto. Para realizar esta tarea, es necesario indicarle a Eclipse, qué proyecto o en este caso, qué portlet se desplegará. Figura 2.52. Configuración en eclipse para despliegue de aplicación En la figura 2.52., se muestra la pantalla, en donde, en el servidor Liferay se debe pulsar el botón derecho del ratón, con lo que se obtiene un listado de opciones, de las cuales se deberá escoger “Add and Remove” (Agregar y Quitar), para poder finalmente colocar el proyecto o aplicación que se desee desplegar (Ver Figura 2.53.): 100 Figura 2.53. Opción para agregar proyecto o aplicación a desplegar en Eclipse. Finalmente una vez que se hace la “compilación y construcción” (Build) con ANT, se tendrá listo el aplicativo o proyecto y listo para su prueba de funcionamiento. Con el servidor Liferay de eclipse en ejecución, y luego de que se ha ingresado a un navegador (Mozilla para este caso), se deberá ingresar localmente a la url “http://localhost:8080”, donde liferay estará corriendo y con lo cual se mostrará la pantalla de inicio de liferay. Para poder probar los portlts implementados, se ha creado dos páginas de prueba, la una para el monitoreo de la emisión de imágenes de la cámara IP, y la otra página para pruebas de la administración de datos de salones. Tal como se lo mencionó en los apartados de creación de una página en liferay, se deberá ingresar como un usuario con privilegios de administrador, con la finalidad de poder realizar las operaciones de creación de páginas y agregación de portlets. En la figura 2.54. (Despligue de Portlets creados en listado de aplicaciones de Liferay), se puede observar que en el despliegue de las aplicaciones (portlets) que dispone Liferay, ya se encuentra la categoría “CI Popeyes Admin”, con la cual se identificó para este proyecto. Así mismo se pueden observar las dos aplicaciones (“Visualizar Imágenes de Camara” y “Administrar Salones”), lo cual nos indica que las mismas ya pueden ser utilizadas en las páginas de pruebas creadas para el efecto. 101 Figura. 2.54. Despligue de Portlets creados en listado de aplicaciones de Liferay En la figura 2.55. (Pantalla de administración de salones creado), se puede observar la administración de datos para salones, con los datos respectivos de la cámara IP, con la que se trabajará para la emisión de imágenes. Como se puede notar, cada uno de los registros ingresados, tienen las mismas características que cualquier otro aplicativo (portlet) de liferay. Figura 2.55. Pantalla de administración de salones creado 102 En la figura 2.56.( Edición de datos del portlet creado), se puede observar la edición de campos para el ingreso de salones, de acuerdo al diseño esbozado en el desarrollo del primer requerimiento del presente tema. Así mismo se puede observar las características heredadas a Liferay para la presentación de un “portlet”. Figura. 2.56. Edición de datos del portlet creado Para el monitoreo de las imágenes de la cámara, con los datos ingresado en la administración de salones, la figura 2.57. (Visualización de imágenes en portlet de monitoreo creado) muestra la emisión de imágenes del salón seleccionado. Figura 2.57. Visualización de imágenes en portlet de monitoreo creado 103 2.4.8.7. Despliegue del proyecto en ambiente de producción Una vez que se ha comprobado la funcionalidad del proyecto en ambiente de desarrollo, se puede realizar el despliegue en el ambiente de producción, en el servidor contratado para el efecto (ver Anexo 5. Hosting.). Para la instalación del proyecto en el ambiente de producción es necesario ingresar al servidor contratado, vía conexión FTP24 (en este caso se ha utilizado CoreFTP25), para de esta manera poder transferir el proyecto generado en Eclipse. Al proyecto generado deberá ser colocado en el directorio del servidor “/liferay../ jboss5.1.0/server/default/deploy”. De esta manera se desplegará el proyecto en el servidor Liferay-jboss ya configurado anteriormente. En la figura 2.58 (Portlets creados y desplegados en ambiente de producción) se puede observar que ya los portlets creados, se encuentran en el listado de aplicaciones disponibles en Liferay instalado en ambiente de producción. Figura 2.58. Portlets creados y desplegados en ambiente de producción 24 25 FTP.- Siglas en inglés de File Transfer Protocol. Protocolo de red para transferencia de archivos. CoreFTP.- Programa libre para conexión segura vía FTP para Sistema Operativo Windows. 104 2.4.8.8. Pruebas de funcionamiento de los portlets desplegados en producción Una vez que se ha comprobado el despliegue de las aplicaciones (portlets) en ambiente de producción, es necesario realizar las pruebas de funcionamiento correspondientes en dicho ambiente, por lo que a partir del diseño de pantallas, se crearán las páginas correspondientes, con sus respectivos permisos, etc. En la figura 2.59. (Portlet de administración de salones en producción), se puede observar el funcionamiento del portlet para la administración de salones, donde se deberá ingresar los datos correspondientes al salón a monitorear. Figura 2.59. Portlet de administración de salones en producción Es necesario indicar que para que las imágenes de la cámara IP puedan ser vistas en el portal de producción, es necesario utilizar como URL la definición hecha en la creación de una dirección dinámica (ver Figura 2.31). En la figura 2.60 (Ingreso de datos de cámara IP en producción), se puede observar la definición indicada, y con lo cual se debería tener señal de las imágenes emitidas por la cámara IP. 105 Figura 2.60. Ingreso de datos de cámara IP en producción Finalmente, para comprobar la emisión de imágenes con la configuración vista en la figura anterior, se deberá observar el funcionamiento del portlet para monitoreo o visualización de imágenes en la página web creada para el caso (ver Figura 2.61. Emisión de imágenes en ambiente de producción). Figura 2.61. Emisión de imágenes en ambiente de producción 106 FASE 3 RESULTADOS DEL IMPACTO DE LA SOLUCIÓN EN LOS PADRES DE FAMILIA Una vez concluido el proceso de desarrollo e implantación de la solución al tema propuesto, es necesario hacer la evaluación del cómo afectó o qué incidencia tiene el mismo en los padres de familia que harán uso del portal y el correspondiente monitoreo de sus niños. 3.1. Utilización de credenciales de acceso a Padres de Familia y análisis de resultados En el apartado (2.3.4.2.1.8. Creación de usuarios en liferay), se indicó el proceso de ingreso de usuarios para la utilización del portal Liferay, por lo que se han ingresado un total de diez padres de familia, con los permisos correspondientes para accesar a la página de monitoreo de niños, tal como se ha diseñado en el portal. Con la finalidad de ir recogiendo información, respecto al grado de satisfacción de padres de familia al usar el portal del CI y su correspondiente monitoreo de niños vía internet, se ha realizado una encuesta a cada uno de ellos (Ver Anexo 7. Encuestas de satisfacción de uso del monitoreo Web). Estas encuestas han sido tabuladas, por lo que los resultados de las mismas son los siguientes: 1.) Considera que el monitoreo vía internet de su hijo(a), le ha proporcionado más confianza en el CDI?: Si No No contesta TOTAL 14 0 0 14 % 100,00 100,00 Tabla 3.1. Nivel de confianza al CDI con Monitoreo 107 2.) Con el monitoreo de su hijo(a) vía cámaras web en línea, cree que su rendimiento laboral ha mejorado?: Si No No contesta TOTAL 10 0 0 10 % 100,00 100,00 Tabla 3.2. Rendimiento laboral de Padres vs. Monitoreo de niños 3.) Cree que el uso del monitoreo vía web de su hijo(a), interfiere o quita tiempo en su trabajo o labores diarias?: % Si No No contesta TOTAL 0 10 0 10 100,00 100,00 Tabla 3.3. Incidencia de tiempo vs. Monitoreo de niños 4.) Cree Ud. que el ingreso a monitorear a su niño(a) a través del portal del Centro Infantil, es ágil y ayuda para el cuidado de su hijo? : Si No No contesta TOTAL 10 0 0 10 % 100,00 100,00 Tabla 3.4. Cualificación de portal por padres de familia 5.) Ha tenido inconvenientes laborales cuando ha ingresado al portal del CDI para monitorear a su hijo(a)?: Si No No contesta TOTAL 1 9 0 10 % 10,00 90,00 100,00 Tabla 3.5. Problemas de acceso a monitoreo via internet 108 6.) Desearía que el CDI continúe con el servicio de monitoreo vía cámaras web a su niño(a)?: Si No No contesta TOTAL 10 0 0 10 % 100,00 100,00 Tabla 3.6. Seguimiento de Monitoreo 7.) Estaría dispuesto(a) a pagar un valor adicional por el servicio de monitoreo por internet? Si No No contesta TOTAL 10 0 0 10 % 100,00 100,00 Tabla 3.7. Aceptación de cargos por monitoreo De acuerdo a los resultados tabulados anteriormente por cada pregunta realizada a cada uno de los padres de familia, en resumen se puede concluir que: El 100% de los padres de familia encuestados confirman una mejora sustancial, respecto a la confianza en el cuidado de sus hijos por parte del CDI, una vez instalada la solución. En promedio, de acuerdo a lo indicado por los padres de familia, existe un 59,5% de mejora en el rendimiento laboral de los padres. Esto debido a que se disminuyen o eliminan sensaciones como: Angustia, Preocupación, Intranquilidad, falta de control. Ningún padre de familia indica problemas de “pérdida de tiempo” o interferencia en las labores normales. Se observa una clara tendencia a ocupar los “tiempos muertos” en las labores, para el monitoreo de sus niños. 109 Se observa que hay desconocimiento de los padres de familia, respecto a los tiempos de respuesta del aplicativo. Únicamente ven beneficio respecto al monitoreo. La mayoría concuerda que no existe problema al utilizar el aplicativo desde sus trabajos, ya que ingresan por períodos muy cortos de tiempo. El 100% de los encuestados desearía que el CDI cuente en forma contínua con el servicio de monitoreo de sus niños vía Internet. En promedio, los padres de familia podrían destinar para el pago del monitoreo un valor de $17.5USD. 110 CONCLUSIONES El aplicativo para el monitoreo de niños vía Web, instalado en el Centro de Desarrollo Infantil (CDI) Popeye’s, de la ciudad de Quito, cubre las expectativas de control y vigilancia que tienen los padres de familia con respecto a sus hijos que asisten a dicho centro. La solución instalada ha solventado la necesidad de control y monitoreo de niños, y ha generado una mayor tranquilidad en los padres de familia que tienen a sus niños en el Centro Infantil, incidiendo positivamente y de una manera directa, en el rendimiento laboral de los padres de familia que trabajan en sectores apartados del CDI. Debido a que el monitoreo de niños en el CDI, podría descubrir ciertas “falencias” en el cuidado, éste puede provocar cierto rechazo de utilización en los diferentes centros de cuidado infantil. Liferay es una poderosa herramienta para crear portales web, aunque la utilización de la versión “community” (comunidad), no presta las facilidades para una rápida instalación y explotación, al no existir mucha documentación disponible para tal fin. La creación de portlets, utilizando el API de Liferay, es rápida y se evidencia una gran ventaja de poder interactuar con otras herramientas OpenSource (ej. Alfresco), así como también permite trabajar con diferentes tipos de Bases de datos. El desarrollo de aplicaciones que utilicen imágenes emitidas por cámaras IP, se ve restringida por la marca de las cámaras, ya que la mayoría de fabricantes no dispone de versiones de equipos que manejen Java. El ancho de banda destinado para el uso de emisión de video por internet, es un factor determinante para disponer de una imagen clara para monitoreo remoto. La utilización de SCRUM como metodología de desarrollo ágil, facilita la elaboración de proyectos de software en los cuales se deben ir obteniendo resultados rápidos, aunque no es muy útil en proyectos unipersonales. 111 RECOMENDACIONES Para evitar rechazo en la utilización de sistemas de monitoreo vía cámaras IP, en los centros de desarrollo infantil, es conveniente que se realice un previo estudio previo a la instalación del aplicativo. Al utilizar tecnologías Open Source, se debe tomar en cuenta el tiempo de aprendizaje de las mismas, debido a la poca documentación, especialmente en herramientas con versiones tipo “Community”. Para obtener mejores resultados en la emisión de imágenes de cámaras IP vía internet, es preferible tener como mínimo 512 kbps de velocidad en los modelos de cámaras Dlink. Se recomienda utilizar metodologías ágiles de desarrollo de proyectos, tipo SCRUM, especialmente en proyectos orientados a la obtención rápida de resultados o que tengan una gran cantidad de cambios en el transcurso del desarrollo. 112 BIBLIOGRAFÍA Sezov, Richard Jr. Liferay http://www.manning.com/sezov/ in Action. Manning Publications. Falkner, James. Liferay Essentials Ref Card. http://refcardz.dzone.com LIFERAY. http://www.liferay.com/es/community/welcome/dashboard Sezov, Richard Jr. Inter-portlet communication using Portlet 2.0. Manning Publications. http://www.manning.com/sezov/ Sarin, Ashish. Portlets in http://www.manning.com/sarin/ Action. SÁNCHEZ, María A., Metodologías http://www.informatizate.net, 2004. De Manning Desarrollo Publications. De Software, WIRWIN, Metodología SCRUM para la dirección de proyectos informáticos, http://ejecucion.wordpress.com/2009/06/10/metodologia-scrum-para-la-direccionde-proyectos-informaticos/, 2009. 113 ANEXOS 114 ANEXO 1. ENCUESTAS PRELIMINARES DE ACEPTACIÓN DEL PROYECTO A PADRES DE FAMILIA. A continuación se adjuntan las encuestas realizadas a los padres de familia, previo al inicio del desarrollo del proyecto de tesis. 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 ANEXO 2. DESCRIPCIÓN DE LA METODOLOGÍA DE DESARROLLO SCRUM. Históricamente, SCRUM nació en 1986 con Hirotaka Takeuchi e Ikujiro Nonaka, como un proyecto para mejorar la flexibilidad y rapidez en el desarrollo de productos comerciales. Posteriormente en 1991 Peter DeGrace y Leslie Stahl, utilizaron por primera vez el término Scrum, para luego en 1995 por intermedio de Schwaber y Sutherland utilizar públicamente el término conjuntamente con las mejores prácticas de la industria. Finalmente en 2001, Schwaber y Mike Beedle describieron la metodología completa en el libro “Agile Software Development with Scrum” (Desarrollo Ágil de Software con SCRUM). Por lo tanto, Scrum al ser una metodología ágil de desarrollo tipo “transversal”, se entiende que es apropiado para equipos de trabajo o de desarrollo (como recomendación hasta máximo grupos de 8 personas). No es 100% apropiado para todo tipo de proyecto, así como no lo es ninguna otra metodología. Scrum también se lo puede catalogar como un modelo de referencia que define un conjunto de prácticas y roles, y que puede tomarse como punto de partida para definir el proceso de desarrollo que se ejecutará durante un proyecto. A2.1. Conceptos manejados en SCRUM La metodología utiliza una serie de tecnicismos para referirse a determinados artefactos, roles y actividades (desde el punto de vista de la terminología RUP “Rational Unified Process”), stakeholders y demás: Product Backlog: documento en el cual se detallan, de forma priorizada, los requisitos del sistema. Sprint: cada una de las iteraciones de que se compone el desarrollo con Scrum. Si existe razón de suficiente peso, puede abortarse el sprint y comenzar uno nuevo. Sprint Backlog: “trozo” de backlog que nos comprometemos a implementar de forma satisfactoria en el sprint (iteración) actual. ScrumMaster: que mantiene los procesos y trabaja de forma similar al director de proyecto. ProductOwner (Dueño del producto): que representa a los stakeholders (clientes externos o internos). 131 Team (Grupo): que incluye a los desarrolladores. Burn down Chart .- Es una gráfica que muestra las funcionalidades pendientes del proyecto al comienzo de cada Sprint y demuestra el avance en función del tiempo para así poder manejar el proyecto. Este modelo se lo usa en lugar de un diagrama de PERT26. Cabe señalar que en esta metodología existen dos roles “peculiares”, y que dan forma a Scrum, los cuales son: cerdos (pigs) y gallinas (chicken). Esta “graciosa” denominación de roles, está dada por un popular “chiste” el cual se describe a continuación: Un cerdo y una gallina se encuentran en la calle. La gallina mira al cerdo y dice: “Cerdo, ¿por qué no abrimos un restaurante?” El cerdo mira a la gallina y le dice: “Buena idea, ¿cómo se llamaría el restaurante?” La gallina piensa un poco y contesta: “¿Por qué no lo llamamos “Huevos con jamón?” “Lo siento pero no”, dice el cerdo, “Yo estaría comprometido pero tú solamente estarías involucrada”. En Scrum, el rol de los “cerdos” (aquellos que están comprometidos de forma seria con el proyecto), son desempeñados por los subroles: Team, ScrumMaster y ProductOwner. El rol “gallina” está constituido por otros clientes y stakeholders (ejecutivos, etc.). Al final, todos los roles “cerdo” son gestores (managers), desde el momento en el que se dice que están comprometidos con el proyecto. A2.2. Estructuración de la metodología La metodología Scrum tiene tres fases fundamentales, así: - Fase de planificación.- Donde se realizan labores básicas de planificación que incluye: visión general del proyecto (estimación muy general, y la viabilidad del sistema) y construcción del Backlog, por un lado y por otro el desarrollo de la arquitectura al detalle. 26 PERT.- del inglés Program Evaluation and Review Technique. Modelo para administración y gestión de proyectos. 132 - Fase de desarrollo.- En la cual se utilizan los llamados “Sprints” (Sinónimo de carrera de velocidad en inglés), que es la fase más importante en términos de interés para el proyecto. - Fase Final de entrega y balance de los éxitos y fracasos logrados. Como se mencionó, la fase de Sprint es la más importante ya que las otras dos no difieren mucho de las fases de Planificación y Entrega de otras metodologías. El desarrollo en la fase Sprint es iterativo en uno o más Sprints, hasta que el proyecto se da por finalizado por el ProductOwner. La cantidad de Sprints dependerá de la necesidad del proyecto y del desarrollo en sí (Ver Figura A2.1. Proceso SCRUM) Con la revisión periódica y la generación de Sprints, se cubre el problema de la variabilidad de los requisitos, ya que al no haber una estimación prematura fiable donde los requisitos probablemente cambiarán, la metodología se ajusta a la perfección para cubrir ese inconveniente. Además de las fases que manejan la estructura de la metodología como tal, también se deben tomar en cuenta las reuniones, para la toma de decisiones. Existen cuatro tipos de reuniones que se realizan durante el desarrollo de un proyecto con Scrum, por lo que a continuación se hará una breve descripción de los mismos con sus tiempos estimados de duración, así: Reunión de Planificación (tiempo de duración, aprox. 4 horas): Al inicio de un Sprint, se decide qué parte del Backlog global del proyecto se implementará en este Sprint. Una vez decididas las funcionalidades a implementar, en base a estimaciones de tamaño, tiempo, esfuerzo, etc., el Sprint Backlog no se toca durante todo el Sprint, bajo ninguna circunstancia. En caso de que algo fallara, el ScrumMaster podrá cancelar el Sprint y empezar otro. Reunión Diaria (tiempo de duración, aprox. 15 minutos): Consiste en una rápida reunión diaria del equipo de unos 15 minutos, para responder individualmente a 3 preguntas básicas que son: o ¿qué hiciste ayer? o ¿qué vas a hacer hoy? 133 o ¿qué te está impidiendo alcanzar tus objetivos? De esta manera se realiza el control del proyecto, así como el seguimiento de los posibles riesgos. Reunión de Revisión (tiempo de duración, aprox. 4 horas): Consiste en la reunión del final del Sprint, con el ProductOwner y otros clientes (gallinas), con la finalidad de exponer la funcionalidad desarrollada junto con las posibles preguntas y ampliaciones del Backlog, que se les pueda ocurrir a los diferentes stakeholders (clientes+ejecutivo). Con esto logramos un “feedback”(Retroalimentación) con el cliente, que ve cómo el producto progresa. Reunión de Retrospección (tiempo de duración, aprox. 4 horas): Es una reunión entre el ScrumMaster con el Team (Grupo), para revisar cómo se desarrolló el Sprint, es decir descubrir, qué se consiguió realizar bien y cómo se podría mejorar. En resumen, esta reunión no es más, que una revisión de lecciones aprendidas y una forma de recabar información histórica del propio proyecto (Software Estimation, Steve McConnell), útil para futuras estimaciones y Sprints. Figura A2.1. Proceso SCRUM 134 A2.3. Aplicación de la metodología para la implementación de la solución. Tomando en cuenta que la metodología SCRUM hace referencia a toda las actividades que el “Team” (grupo) realizará para alcanzar la solución a los requerimientos obtenidos, por lo tanto, adicionalmente a los requerimientos del centro infantil, se deberán incluir los requerimientos que implican la utilización de las herramientas seleccionadas. En este punto se abordará cada uno de los elementos del “Product Backlog”(Pila de Requerimientos) con sus respectivos Sprint Backlogs (Pila de actividades), y documentación del proceso de desarrollo inmerso en cada actividad del Sprint. Se iniciará el proceso con la pila de requerimientos priorizados (Product Backlog), detallados en la tabla 2.1.(Product Backlog) del apartado 2.2. (Planificación del proyecto utilizando la metodología SCRUM) de la segunda fase del presente proyecto. De acuerdo a la metodología, por cada uno de estos elementos del product backlog, se debe tener una estimación del valor y del esfuerzo inicial. De la estimación del valor deberá encargarse el Dueño del Producto (Product Owner), quien a su vez coloca una valoración a cada uno de dichos elementos de acuerdo al peso que observa dentro del proyecto. Por otro lado, para la estimación del esfuerzo inicial, se debe encargar el Scrum Manager, de acuerdo a las reuniones con el Team, para delimitar el esfuerzo requerido. Así mismo en la tabla 2.1. de la Fase 2, se puede apreciar la asignación del esfuerzo incial requerido para cada uno de los 2 requerimientos señalados. Esto es especialmente importante, para poder tener una idea clara de cuáles actividades serán las que más recursos humanos demandarán. La metodología señala que éstas estimaciones se las cuantifica de acuerdo a un criterio del SCRUM Master, por lo que para la presente tesis se tiene que las escalas para dichas estimaciones son: 135 Estimación de Valor: Escala de 1 – 7. Estimación del Esfuerzo inicial: Escala de 1 – 25. Una vez definida la Pila de Requerimientos (Product Backlog) con sus respectivas valoraciones, se debe especificar por cada uno de los elementos (requerimientos), las correspondientes acciones o tareas a realizar o lo que en Scrum se denomina “Sprint Backlog”. En el apartado 2.2. (Planificación del proyecto utilizando la metodología SCRUM), de la Fase 2, se presentó la tabla completa del Sprint Backlog, que contiene todas las tareas a realizar en el presente proyecto. Definidas la pila de requerimientos y las tareas a realizar, se procederá a realizar la documentación referente a la aplicación de la metodología, por cada uno de los sprints. 136 A2.3.1. SPRINT 1. Elemento del Product Backlog Elaborar un portal para el Centro Infantil Tareas Analizar y obtener requerimientos del cliente para el portal del CI Voluntario Diseñar el modelo conceptual del portal Max Morillo Diseñar pantallas de portal de acuerdo al modelo conceptual del mismo Total Estimación de Esfuerzo Inicial Nuevo Esfuerzo Estimado (al final del día) 4 3 3 2 2 1 1 0 5 5 5 5 5 4 4 4 3 2 1 0 4 4 4 4 4 4 4 4 4 4 3 3 2 1 0 13 12 12 11 11 9 9 8 7 6 4 3 2 1 0 Tabla A2.1. Desarrollo de Sprint 1. A2.3.1.1. BURNDOWN CHART. 14 12 10 8 6 4 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Figura A2.2. Burndown Chart de Sprint 1 137 A2.3.2. SPRINT 2. Elemento del Product Backlog Estimación de Esfuerzo Voluntario Inicial Tareas Consultar en diferentes fuentes la documentación sobre instalación de Liferay Portal. (Adquirir bibliografía de autores experimentados en la herramienta). Instalar y configurar java jdk en servidor Linux CentOs 5. Elaborar un portal para el Instalar y configurar Mysql en servidor Centro Infantil CentOs 5. Incluye creación de instancia de BDD para interacción con Liferay. Max Morillo Descargar la versión libre de Liferay 6.0.5. Versión Community + Jboss AS Configurar el servidor de aplicaciones Jboss embebido en Liferay Portal. Total Nuevo Esfuerzo Estimado (al final del día) 7 6 6 6 6 6 5 5 5 4 4 3 3 2 2 1 1 0 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 1 1 0 3 3 3 3 3 3 3 3 3 3 3 3 2 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 3 3 2 2 1 0 20 18 17 17 17 17 16 16 16 15 15 14 12 10 10 7 7 4 3 3 2 2 1 0 Tabla A2.2. Desarrollo de Sprint 2. A2.3.2.1. BURNDOWN CHART 25 20 15 10 5 0 1 3 5 7 9 11 13 15 17 19 21 23 Figura A2.3. Burndown Chart de Sprint 2 138 A2.3.3. SPRINT 3. Elemento del Product Backlog Elaborar un portal para el Centro Infantil Tareas Definir plantilla de temas (Template) para el portal, y disposiciones (Layouts) de cada página. 3 2 Estimación de Esfuerzo Nuevo Esfuerzo Inicial Estimado (al final del día) Voluntario Max Morillo Crear página Web principal y opciones públicas, con Liferay Portal. Total 3 3 2 1 0 5 4 4 3 3 2 2 1 0 8 7 6 4 3 2 2 1 0 8 9 Tabla A2.3. Desarrollo de Sprint 3. A2.3.3.1. BURNDOWN CHART 9 8 7 6 5 4 3 2 1 0 1 2 3 4 5 6 7 Figura A2.4. Burndown Chart de Sprint 3 139 A2.3.4. SPRINT 4. Elemento del Product Backlog Tareas Voluntario Estimación de Esfuerzo Inicial Crear usuarios en liferay, de acuerdo a listado entregado por la Directora del CI. Crear grupos de usuarios en liferay, para asignación de usuarios Crear roles para asignación a grupos de usuarios y sus permisos correspondientes. Elaborar un portal para el Definir restricciones de acceso a opción de Centro Infantil "Monitoreo Web Cam." Max Morillo Total Nuevo Esfuerzo Estimado (al final del día) 4 3 2 1 0 4 3 3 2 1 0 4 3 3 3 2 1 0 3 2 2 2 2 1 0 15 11 10 8 5 2 0 Tabla A2.4. Desarrollo de Sprint 4. A2.3.4.1. BURNDOWN CHART 16 14 12 10 8 6 4 2 0 1 2 3 4 5 Figura A2.5. Burndown Chart de Sprint 4 6 7 140 A2.3.5. SPRINT 5. Elemento del Product Backlog Tareas Voluntario Instalar Cámara con conexión a Router Inalámbrico Dlink DIR-600 Crear un DNS dinámico para conexión remota de cámara IP Dlink. (ver alojamiento Dinámico gratis DYNDNS.ORG) Elaborar un portal para el Centro Infantil Investigar la forma de emisión de video de la cámara, para captura de imágenes desde el portlet a crear. Realizar pruebas de funcionamiento del portal Total Max Morillo Estimación de Esfuerzo Inicial Nuevo Esfuerzo Estimado (al final del día) 6 5 5 5 4 4 4 3 3 2 2 1 1 0 0 0 0 0 0 5 4 4 4 4 4 4 4 4 3 3 3 2 2 1 0 0 0 0 7 6 6 6 6 6 6 6 6 6 5 5 5 4 4 3 3 2 1 1 0 5 4 4 4 3 3 3 2 2 2 1 1 0 0 0 0 0 0 0 0 0 23 19 19 19 17 17 17 15 15 13 11 10 8 6 5 3 3 2 1 1 0 Tabla A2.5. Desarrollo de Sprint 5. A2.3.5.1. BURNDOWN CHART 25 20 15 10 5 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Figura A2.6. Burndown Chart de Sprint 5 141 A2.3.6. SPRINT 6. Elemento del Product Backlog Elaborar un portal para el Centro Infantil Tareas Analizar y obtener requerimientos del modelo del aplicativo de monitoreo de niños Voluntario Diseñar el modelo conceptual del portlet para el monitoreo de niños Diseñar el modelo de Casos de Uso del aplicativo de monitoreo Max Morillo Total Estimación de Esfuerzo Inicial Nuevo Esfuerzo Estimado (al final del día) 4 4 4 4 4 4 3 3 2 2 2 1 1 0 5 5 5 5 5 5 5 5 5 5 5 4 4 4 3 3 2 1 1 1 0 5 5 4 4 3 3 2 1 0 5 5 5 5 5 5 5 4 5 5 5 5 5 14 14 14 14 14 14 13 12 12 12 12 10 10 9 8 7 6 4 4 3 1 0 Tabla A2.6. Desarrollo de Sprint 6. A2.3.6.1. BURNDOWN CHART 16 14 12 10 8 6 4 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Figura A2.7. Burndown Chart de Sprint 6 142 A2.3.7. SPRINT 7. Elemento del Product Backlog Tareas Descargar plug-in de Liferay con Tomcat, para Eclipse. Cargar y configurar Plug-in de Elaborar un Liferay SDK para Eclipse en portal para ambiente de desarrollo. el Centro Infantil Estimación de Esfuerzo Inicial Voluntario Max Morillo Crear un nuevo proyecto Plug-in Portlet llamado CamaraIPPortlet Investigar la forma de generación de portlets con framework de Liferay. Total Nuevo Esfuerzo Estimado (al final del día) 1 1 0 5 5 4 4 3 2 1 0 4 3 3 3 2 2 1 0 6 6 6 6 5 5 5 5 5 4 4 3 3 2 2 1 0 7 7 7 7 7 7 7 7 7 7 7 7 6 6 6 5 5 4 4 3 3 3 2 2 1 1 0 19 19 17 17 15 14 13 12 16 14 14 13 11 10 9 6 5 4 4 3 3 3 2 2 1 1 0 Tabla A2.7. Desarrollo de Sprint 7. A2.3.7.1. BURNDOWN CHART 20 15 10 5 0 1 3 5 7 9 11 13 15 17 19 21 23 25 27 Figura A2.8. Burndown Chart de Sprint 7 143 A2.3.8. SPRINT 8. Elemento del Product Backlog Elaborar un portal para el Centro Infantil Tareas Voluntario Crear archivo "service.xml", con definiciones de tabla de datos para la generación vía ServiceBuilder de Liferay, del modelo, servicio y persistencia de datos. Definir entorno de variables para desarrollo de portlet de acuerdo a especificaciones de Liferay. Programar métodos para almacenamiento y recuperación de datos Max Morillo Programar View.jsp de presentación de imagen de cámara IP Programar View.jsp de administración de Salones Programar métodos de administración de Permisos para los portlets creados Desplegar proyecto en ambiente de desarrollo para pruebas de conexión. Total Estimació n de Esfuerzo Inicial Nuevo Esfuerzo Estimado (al final del día) 2 1 0 3 3 3 2 2 1 0 6 6 6 6 6 6 5 5 5 4 4 4 3 3 3 2 2 1 1 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 3 3 2 1 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 4 3 3 2 1 0 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 3 2 1 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 1 1 1 0 29 28 27 26 26 25 23 23 23 22 22 22 21 21 21 18 18 16 16 11 10 8 5 3 2 0 Tabla A2.8. Desarrollo de Sprint 8 144 A2.3.8.1. BURNDOWN CHART 35 30 25 20 15 10 5 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Figura A2.9. Burndown Chart de Sprint 8 145 A2.3.9. SPRINT 9. Elemento del Product Backlog Elaborar un portal para el Centro Infantil Tareas Desplegar proyecto en ambiente de producción. Realizar pruebas de funcionamiento de los portlets desplegados en producción Observación de impacto de la solución en Padres de familia con acceso a portal Total Voluntario Max Morillo Estimación de Esfuerzo Inicial 5 4 1 0 4 4 4 4 3 3 2 1 0 4 4 4 4 4 4 3 3 3 3 2 2 2 1 1 0 13 12 9 8 7 7 5 4 3 3 2 2 2 1 1 0 Tabla A2.9. Desarrollo de Sprint 9. A2.3.9.1. BURNDOWN CHART Nuevo Esfuerzo Estimado (al final del día) 146 14 12 10 8 6 4 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Figura A2.10. Burndown Chart de Sprint 9 A2.3.10. SPRINT 10. Elemento del Product Backlog Tareas Elaborar un portal para el Centro Infantil Documentar y digitar marco teórico de tesis Total Voluntario Estimación de Esfuerzo Inicial Nuevo Esfuerzo Estimado (al final del día) Max Morillo 7 7 7 7 7 7 7 7 7 6 6 6 6 5 5 5 4 4 4 4 3 3 2 2 1 1 0 7 7 7 7 7 7 7 7 7 6 6 6 6 5 5 5 4 4 4 4 3 3 2 2 1 1 0 Tabla A2.10. Desarrollo de Sprint 10. A2.3.10.1. BURNDOWN CHART 147 8 7 6 5 4 3 2 1 0 1 3 5 7 9 11 13 15 17 19 21 23 25 27 Figura A2.11. Burndown Chart de Sprint 10 148 ANEXO 3. REVISIÓN GENERAL DE LIFERAY COMO PORTAL Una definición aproximada de lo que es un Portal, en el mundo del desarrollo de software, es la que hace referencia a: “sitio web que proporciona a las personas el acceso a información, aplicaciones y procesos de negocios. Todo ello desde un único punto de entrada”. Un portal provee de mecanismos de integración, inicio único de sesión SSO (Single Sign On), seguridad, contenido personalizado, preferencias a medida de los usuarios, gestión de contenidos, opciones de colaboración entre personas, acceso desde múltiples dispositivos, opciones de búsqueda y navegación entre aplicaciones. Los portales trabajan con una serie de “Portlets”, los cuales son pequeñas aplicaciones web que se ejecutan en una parte de una página, sin importar el manejo de seguridades u otros “detalles”, de los cuales se hace cargo el portal como tal. Los ejemplos más conocidos de lo que es un portal, serían los sitios web: Yahoo!, MSN, o Terra, los cuales, desde una misma pantalla de inicio, ofrecen noticias, enlaces a servicios, acceso a correo electrónico, etc. La diferencia entre un portal y una simple página Web, es que a más de las características ya anotadas anteriormente (seguridad, preferencias a medida de los usuarios, etc.), los portales se vuelven una necesidad tomando en cuenta lo siguiente: Cuando existe la necesidad de personalizar servicios: es decir, cuando se quiere brindar conjuntos distintos de aplicaciones a los usuarios, de acuerdo al área y/o al rol que cumplen en la organización. En el caso del presente tema de desarrollo, existirán varios roles de los Usuarios, por lo que esta tecnología se puede aplicar y adaptar fácilmente. Cuando existe multitud de aplicaciones aisladas entre sí: que es el escenario clásico de una empresa que cuenta con aplicaciones para cada una de sus actividades, y entre las cuales no hay intercambio de datos. En este caso, un portal es una opción a considerar cuando se requiere integrar múltiples aplicaciones. 149 Cuando existe demasiada información en la empresa: donde la información requerida por el personal no es fácil de encontrar o simplemente no está disponible, por lo cual se tiene que gastar tiempo en buscar a la persona o el departamento que puede contar con ella. Un portal busca contar con un control centralizado y configurable de acceso a los servicios o contenido de información. ¿Qué es Liferay Portal? Liferay Portal, o más conocido mundialmente como Liferay, es una plataforma web empresarial para construir aplicaciones de negocios y es Open Source (de código abierto) basado en Java. Fue diseñado para facilitar (a los miembros de una empresa o usuarios externos autorizados), el acceso a las distintas aplicaciones o contenido de información institucional que se desee administrar bajo un Entorno de Trabajo Unificado. El proyecto Liferay Portal se inició en el año 2000, y actualmente se constituye en la principal aplicación para el desarrollo de portales de licencia abierta, teniendo como rivales a Websphere Portal, Oracle Portal, JBoss Portal, Jetspeed, etc. Liferay también es utilizado a nivel mundial, para el desarrollo de sitios web públicos, con funcionalidades de administrador de contenidos (Content Management System, CMS), Intranets, Extranets, plataformas de colaboración y aplicaciones para la Web. Finalmente, Liferay como portal, es una poderosa herramienta que ayuda a organizar los usuarios, dándoles a estos los accesos para el contenido que necesitan. Se puede crear: - Comunidades Organizaciones Roles Grupos de usuarios A todos estos tipos mencionados, se puede hacer que se otorgue los permisos correspondientes, permitiendo de esta manera restringir y proteger el contenido únicamente a los usuarios que pueden acceder a los datos. 150 Fundamentos de Liferay Figura A3.1. Pantalla de inicio de Liferay Las funcionalidades de Liferay podrían agruparse en dos características principales: - Por un lado, se tiene que la configuración estándar de Liferay, permite administrar las funcionalidades más básicas en cuanto a usuarios, grupos de usuarios, roles, organizaciones y comunidades (Ver Figura A3.2. Gráfico Organización de Recursos de Liferay). Estas funcionalidades, aunque a simple vista aparenten ser simples, hacen posible la personalización del portal de acuerdo al usuario, llegando incluso a considerar roles con privilegios sumamente específicos. 151 Figura A3.2. Gráfico Organización de Recursos de Liferay - Por otra parte, Liferay provee un conjunto predefinido de herramientas denominado Liferay Collaboration Suite, que es un juego de aplicaciones que pueden utilizarse para construir comunidades de usuarios que utilicen intensivamente el portal. Esta suite contiene: blogs, calendarios, mensajería instantánea (chat), correo electrónico (para servidores ya existentes y que soporten IMAP), tablero de anuncios (foros) y wikis. Adicionalmente, Liferay cuenta con la posibilidad de incorporar plugins para extender las funcionalidades básicas: Porlets (pequeñas aplicaciones web que se ejecutan en una parte de una página web), temas de diseño, distribución de elementos de páginas, y módulos web en Java EE. Algunos de estos plugins ya vienen incorporados por defecto en la instalación estándar. A continuación se muestra gráficamente el manejo de portales (pueden ser varios) que pueden ejecutarse en una instancia de Liferay (Ver. Figura A3.3. Manejo de instancia). Como se puede observar pueden haber uno o más portales para una instancia, y cada portal puede tener: Grupos de Usuarios, Usuarios, Roles por usuarios, Organizaciones, Comunidades y Web Pages por cada una de estas, etc. 152 Figura A3.3. Manejo de instancia Finalmente, la selección de esta herramienta como Portal (Liferay y no las otras mencionadas al inicio), se hace específicamente por la facilidad de manejo de todo el entramado de seguridades, permisos, usuarios, etc., además que es la mejor herramienta Open Source del mercado. Así mismo facilita el manejo y construcción de portlets específicos, que ayudarán a la colocación de la imagen de la captura de la cámara IP. 153 ANEXO 4. ECLIPSE, COMO FRAMEWORK PARA DESARROLLO DE PORTLETS. Eclipse es un entorno de desarrollo integrado (IDE por sus siglas en inglés), de código abierto y multiplataforma, para desarrollar lo que el proyecto llama "Aplicaciones de Cliente Enriquecido", opuesto a las aplicaciones "Cliente-liviano" basadas en navegadores. La definición que da el proyecto Eclipse acerca de su software es: "una especie de herramienta universal - un IDE abierto y extensible para todo y nada en particular". Esta plataforma, típicamente ha sido usada para desarrollar entornos de desarrollo integrados, como el IDE de Java llamado Java Development Toolkit (JDT) y el compilador (ECJ) que se entrega como parte de Eclipse (y que son usados también para desarrollar el mismo Eclipse). Sin embargo, también se puede usar para otros tipos de aplicaciones cliente, como Bit Torrent Azereus. Eclipse es también una comunidad de usuarios, extendiendo constantemente las áreas de aplicación cubiertas. Un ejemplo es el recientemente creado Eclipse Modeling Project, cubriendo casi todas las áreas de Model Driven Engineering. Eclipse fue desarrollado originalmente por IBM como el sucesor de su familia de herramientas para VisualAge. Eclipse es ahora desarrollado por la Fundación Eclipse, una organización independiente sin ánimo de lucro que fomenta una comunidad de código abierto y un conjunto de productos complementarios, capacidades y servicios. A4.1. Arquitectura La base para Eclipse es la Plataforma de cliente enriquecido (del Inglés Rich Client Platform RCP). Los siguientes componentes constituyen la plataforma de cliente enriquecido: Plataforma principal - inicio de Eclipse, ejecución de plugins 154 OSGi- una plataforma para bundling estándar. El Standard Widget Toolkit (SWT) – Un widget toolkit portable. JFace - manejo de archivos, manejo de texto, editores de texto El Workbench de Eclipse - vistas, editores, perspectivas, asistentes Los widgets (Programas pequeños) de Eclipse están implementados por una herramienta de widget para Java llamada SWT (Standard Widget Toolkit), a diferencia de la mayoría de las aplicaciones Java, que usan las opciones estándar Abstract Window Toolkit (AWT) o Swing. La interfaz de usuario de Eclipse también tiene una capa GUI intermedia llamada JFace, la cual simplifica la construcción de aplicaciones basadas en SWT. El entorno de desarrollo integrado (IDE) de Eclipse emplea módulos (en inglés plugin), para proporcionar toda su funcionalidad al frente de la plataforma de cliente rico, a diferencia de otros entornos monolíticos donde las funcionalidades están todas incluidas, las necesite el usuario o no. Este mecanismo de módulos es una plataforma ligera para componentes de software. Adicionalmente permite a Eclipse extenderse usando otros lenguajes de programación como son C/C++ y Python, también es factible trabajar con lenguajes para procesado de texto como LaTeX, aplicaciones en red como Telnet y Sistema de gestión de base de Datos. La arquitectura utilizando Plugins permite escribir cualquier extensión deseada en el ambiente, como sería Gestión de la configuración. Se provee soporte para Java y CVS en el SDK de Eclipse. Y no tiene por qué ser usado únicamente para soportar otros lenguajes de programación. En cuanto a las aplicaciones clientes, eclipse provee al programador con frameworks muy ricos para el desarrollo de aplicaciones gráficas, definición y manipulación de modelos de software, aplicaciones web, etc. Por ejemplo, GEF (Graphic Editing Framework - Framework para la edición gráfica) es un plugin de Eclipse para el desarrollo de editores visuales que pueden ir desde procesadores de texto wysiwyg hasta editores de diagramas UML, interfaces gráficas para el usuario (GUI), etc. Dado que los editores realizados con GEF "viven" dentro de Eclipse, además de poder ser usados conjuntamente con otros plugins, hacen uso de su interfaz gráfica personalizable y profesional. 155 El SDK de Eclipse incluye las herramientas de desarrollo de Java, ofreciendo un IDE con un compilador de Java interno y un modelo completo de los archivos fuente de Java. Esto permite técnicas avanzadas de refactorización y análisis de código. El IDE también hace uso de un espacio de trabajo, en este caso un grupo de metadata en un espacio para archivos plano, permitiendo modificaciones externas a los archivos en tanto se refresque el espacio de trabajo correspondiente. El 28 de junio de 2005 fue liberada la versión 3.1 que incluye mejoras en el rendimiento, el soporte de Java 5.0, mejor integración con Ant (incluido debugger) y CVS. Eclipse dispone de un Editor de texto con resaltado de sintaxis. La compilación es en tiempo real. Tiene pruebas unitarias con JUnit, control de versiones con CVS, integración con Ant, asistentes (wizards) para creación de proyectos, clases, tests, etc., y refactorización. Asimismo, a través de "plugins" libremente disponibles es posible añadir control de versiones con Subversion e integración con Hibernate. Se seleccionó esta herramienta, debido a que se debe realizar la implementación de Portlets, para el monitoreo del video emitido por la cámara Web. Estos portlets, darán la funcionalidad requerida por el Centro de Desarrollo Infantil Popeye’s, además, que se puede aprovechar el código fuente de Liferay para su debida implementación. 156 ANEXO 5. HOSTING. Para la instalación del portal Liferay en ambiente de producción, se hace necesario la contratación de un servidor Web para albergar toda la herramienta y sus configuraciones. Luego de hacer las revisiones a diferentes sitios de “Hosting” (Hospedaje de páginas web), se determinó que de acuerdo a las características del portal (Liferay) y el servidor de aplicaciones que se utilizará (JBoss), el más conveniente incluyendo costos de alojamiento, es el que provee el sitio “Server4You” (www.server4you.com). En la figura A5.1. (Datos de dominio contratado), se puede observar los datos referentes al sitio “contratado”, para albergar la página web, objeto del presente tema de tesis. Figura. A5.1. Datos de dominio contratado 157 El servidor contratado es del tipo VirtualServer27 (vServer Plus X4), y tiene como características las siguientes: Servidor Virtual dedicado. 50 GB de espacio Web 3 GB de memoria RAM, y 6 GB de memoria FlexRam 4 Ghz de velocidad en CPU. Basado en sistema operativo Linux CentOs 5.0 Control total del servidor a nivel de root. Acceso a root vía ftp. 27 Virtual Server.- Servidor virtual, es una partición dentro de un servidor que habilita varias máquinas virtuales por medio de diferentes tecnologías. 158 ANEXO 6. RECURSOS A UTILIZAR EN EL DESARROLLO DE LA SOLUCIÓN Para la realización del presente tema de tesis, se utilizarán los siguientes recursos: A6.1. Recursos Intangibles (o lógicos): - Hosting: para alojamiento del Portal (Liferay). Se contrató el proveedor de hosting “Server4You” ( http://www.server4you.com ), el cual contiene las facilidades correspondientes para instalar Liferay Portal V.6.0, Java, y Mysql. Este Hosting está basado en servidores con sistema operativo CentOs 5. El dominio a utilizarse será www.centroinfantilpopeyes.com - Liferay Portal V.6.0.5: para la implementación del sitio Web del Centro Infantil. Aquí se hará la administración completa del portal, que incluye: o Creación de Usuarios o Creación de Grupos de Usuarios o Definición de políticas de acceso o Definición de las aplicaciones a utilizarse en el Portal (ej. Wiki, blogs, noticias, etc.). - JBOSS: Servidor de aplicaciones que interactuará con Liferay. Actualmente la versión de Liferay 6.0.5, contiene un Jboss A.S. embebido (“Embeded”) con el cual se trabajará en la implementación de la solución. - Java JDK: Para la ejecución de Liferay, ya que éste Portal es “Basado en Java”. - Eclipse 3.6.1.: Framework para el desarrollo del Portlet (aplicación), que se agregará al sitio Web, por intermedio de Liferay. - Mysql: como motor de persistencia, para el almacenamiento de información generada por Liferay. - Conexión a Internet Banda ancha. Para pruebas del sistema se tomará en cuenta la velocidad de 1.2 Mbps. 159 A6.2. Recursos Físicos o Tangibles: - Cámara IP Dlink DCS-2102. Router (Advantek) Computador (Para el desarrollo del tema de tesis). A continuación se detalla un presupuesto estimado requerido para cubrir los recursos de los puntos anteriormente citados (Tabla A6.2. Presupuesto aproximado requerido): Nro. Recursos Cant. V. Unit. V. Total 1 Hosting (anual) 1 90.00 90.00 2 Liferay Portal V.6.0.5 * 1 0.00 0.00 3 JBOSS * 1 0.00 0.00 4 Java JDK * 1 0.00 0.00 5 Eclipse 3.6.1 * 1 0.00 0.00 6 Mysql * 1 0.00 0.00 7 Cámara IP Dlink DCS-2102. 1 180.00 180.00 8 Router (Advantek) 1 60.00 60.00 9 Bibliografía (e-books) 2 50.00 100.00 TOTAL APROX. PRESUPUESTO 430.00 Tabla A6.1. Presupuesto aproximado requerido para cubrir recursos * Versiones descargables basadas en licencias GNU/GPL (General Public Licence) de los fabricantes. Como se puede observar, en lo referente a costos, se nota el bajo nivel de inversión para el presente proyecto. 160 ANEXO 7. ENCUESTAS DE SATISFACCIÓN DE USO DE MONITOREO WEB A continuación se adjuntan las encuestas realizadas a los padres de familia: 161 162 163 164 165 166 167 168 169 170 ANEXO 8. CÓDIGO FUENTE DEL APLICATIVO A continuación se adjunta las principales clases y scripts (.jsp), con las cuales se ha implementado la solución, objeto del presente tema de tesis. package com.centroinfantilpopeyes.webcamportlet.registrosalon; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.PortletException; import javax.portlet.PortletPreferences; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.centroinfantilpopeyes.webcamportlet.model.WCPSalon; import com.centroinfantilpopeyes.webcamportlet.model.impl.WCPSalonImpl; import com.centroinfantilpopeyes.webcamportlet.service.WCPSalonLocalServiceUtil; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.servlet.SessionErrors; import com.liferay.portal.kernel.servlet.SessionMessages; import com.liferay.portal.kernel.util.Http.Response; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.theme.ThemeDisplay; import com.liferay.util.bridges.mvc.MVCPortlet; /** * This portlet is used to maintain the Salones that * Popeyes allows users to register for. * * @author Max Morillo */ public class SalonAdminPortlet extends MVCPortlet { /** * This Action adds a salon to the database. * @param request * @param response * @throws java.lang.Exception */ public void addSalon(ActionRequest request, ActionResponse response) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(WebKeys.THEME_DISPLAY); WCPSalon salon = ActionUtil.salonFromRequest(request); ArrayList<String> errors = new ArrayList<String>(); if (SalonRegValidator.validateSalon(salon, errors)) { WCPSalonLocalServiceUtil.addSalon(salon, themeDisplay.getUserId()); SessionMessages.add(request, "salon-saved-successfully"); } else { SessionErrors.add(request, "fields-required"); 171 } } /** * This Action gets a salon from the database and puts it into the * request. It also sets the "jspPage" parameter to "editSalon" so that * processing is forwarded to edit_salon.jsp. * * @param request * @param response * @throws java.lang.Exception */ public void editSalon(ActionRequest request, ActionResponse response) throws Exception { long salonKey = ParamUtil.getLong(request, "resourcePrimKey"); if (Validator.isNotNull(salonKey)) { WCPSalon salon = WCPSalonLocalServiceUtil.getWCPSalon(salonKey); request.setAttribute("salon", salon); response.setRenderParameter("jspPage", editSalonJSP); } } /** * This Action updates an existing salon with values that were entered * into the edit_salon.jsp. * @param request * @param response * @throws java.lang.Exception */ public void updateSalon(ActionRequest request, ActionResponse response) throws Exception { long salonKey = ParamUtil.getLong(request, "resourcePrimKey"); ArrayList<String> errors = new ArrayList<String>(); if (Validator.isNotNull(salonKey)) { WCPSalon salon = WCPSalonLocalServiceUtil.getWCPSalon(salonKey); WCPSalon requestSalon = ActionUtil.salonFromRequest(request); if (SalonRegValidator.validateSalon(requestSalon, errors)) { salon.setNombreSalon(requestSalon.getNombreSalon()); salon.setIpCamara(requestSalon.getIpCamara()); salon.setPuertoCamara(requestSalon.getPuertoCamara()); salon.setUrlStreaming(requestSalon.getUrlStreaming()); WCPSalonLocalServiceUtil.updateWCPSalon(salon); SessionMessages.add(request, "salonUpdated"); } else { for (String error : errors) { SessionErrors.add(request, error); } } } else { SessionErrors.add(request, "error-updating"); } } /** * This Action deletes a salon from the database. 172 * @param request * @param response * @throws java.lang.Exception */ public void deleteSalon(ActionRequest request, ActionResponse response) throws Exception { long salonKey = ParamUtil.getLong(request, "resourcePrimKey"); if (Validator.isNotNull(salonKey)) { WCPSalonLocalServiceUtil.deleteSalon(salonKey); SessionMessages.add(request, "salonDeleted"); } else { SessionErrors.add(request, "error-deleting"); } } /** * This Action shows a salon from the database. * @param request * @param response * @throws java.lang.Exception */ public void viewSalon(RenderRequest request, RenderResponse response) throws IOException, PortletException { String ipCamara = new String(); long puertoCamara = 0; String urlStreaming = new String(); //long salonKey = ParamUtil.getLong(request, "resourcePrimKey"); response.setContentType("text/html"); PrintWriter writer = response.getWriter(); writer.write("Hello World!"); writer.close(); } protected String editSalonJSP = "/admin/edit_salon.jsp"; } Listado A8.1. Clase SalonAdminPortlet * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 173 * SOFTWARE. */ package com.centroinfantilpopeyes.webcamportlet.registrosalon; import com.centroinfantilpopeyes.webcamportlet.model.WCPSalon; import com.liferay.portal.kernel.util.Validator; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; /** * This class is responsible for validating salon themselves. * * @author Max Morillo */ public class SalonRegValidator { /** * Validates a Salon object * @param salon * @param errors * @return boolean */ public static boolean validateSalon (WCPSalon salon, List<String> errors) { boolean valid = true; if (Validator.isNull(salon.getNombreSalon())) { errors.add("salon-name-required"); valid = false; } if (Validator.isNull(salon.getIpCamara())) { errors.add("ip-camara-required"); valid = false; } if (Validator.isNull(salon.getUrlStreaming())) { errors.add("url-streaming-required"); valid = false; } if (Validator.isNull(salon.getUrlStreaming())) { errors.add("puerto-camara-required"); valid = false; } if (Validator.isNull(salon.getCompanyId())) { errors.add("missing-company-id"); valid = false; } if (Validator.isNull(salon.getGroupId())) { errors.add("missing-group-id"); valid = false; } return valid; } } Listado A8.2. Clase SalonRegValidator 174 package com.centroinfantilpopeyes.webcamportlet.registrosalon; import java.util.Collections; //import java.util.Date; import java.util.List; import javax.portlet.ActionRequest; import javax.portlet.RenderRequest; //import org.apache.jasper.tagplugins.jstl.core.Param; import com.centroinfantilpopeyes.webcamportlet.model.WCPSalon; import com.centroinfantilpopeyes.webcamportlet.model.impl.WCPSalonImpl; import com.centroinfantilpopeyes.webcamportlet.service.WCPSalonLocalServiceUtil; //import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.theme.ThemeDisplay; //import com.liferay.portal.util.PortalUtil; /** * * @author Max Morillo * */ public class ActionUtil { /** * Used by the view.jsp to grab the salones from the database. * @param request * @return */ public static List<WCPSalon> getSalones(RenderRequest request) { ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY); long groupId = themeDisplay.getScopeGroupId(); List<WCPSalon> tempResults; try { tempResults = WCPSalonLocalServiceUtil.getSalones(groupId); } catch (SystemException ex) { tempResults = Collections.emptyList(); } return tempResults; } /** * Creates a WCSalon object out of values from the request. * @param request * @return */ public static WCPSalon salonFromRequest (ActionRequest request) { ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY); WCPSalon salon = new WCPSalonImpl(); salon.setCompanyId(themeDisplay.getCompanyId()); 175 salon.setGroupId(themeDisplay.getScopeGroupId()); salon.setNombreSalon(ParamUtil.getString(request, "nombreSalon")); salon.setIpCamara(ParamUtil.getString(request, "ipCamara")); salon.setPuertoCamara(ParamUtil.getLong(request, "puertoCamara")); salon.setUrlStreaming(ParamUtil.getString(request, "urlStreaming")); return salon; } } Listado A8.3. Clase ActionUtil /** * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.centroinfantilpopeyes.webcamportlet.service.impl; import java.util.List; import com.centroinfantilpopeyes.webcamportlet.NoSuchSalonException; import com.centroinfantilpopeyes.webcamportlet.model.WCPSalon; import com.centroinfantilpopeyes.webcamportlet.service.base.WCPSalonLocalServiceBaseImpl; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.model.ResourceConstants; import com.liferay.portlet.softwarecatalog.ProductEntryAuthorException; /** * The implementation of the w c p salon local service. * * <p> * All custom service methods should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link com.centroinfantilpopeyes.webcamportlet.service.WCPSalonLocalService} interface. * </p> * * <p> * Never reference this interface directly. Always use {@link com.centroinfantilpopeyes.webcamportlet.service.WCPSalonLocalServiceUtil} to access the w c p salon local service. * </p> * * <p> * This is a local service. Methods of this service will not have security checks based on the propagated JAAS credentials because this service can only be accessed from within the same VM. * </p> * * @author Max Morillo * @see com.centroinfantilpopeyes.webcamportlet.service.base.WCPSalonLocalServiceBaseImpl * @see com.centroinfantilpopeyes.webcamportlet.service.WCPSalonLocalServiceUtil */ public class WCPSalonLocalServiceImpl extends WCPSalonLocalServiceBaseImpl { public WCPSalon addSalon (WCPSalon newSalon, long salonId) throws SystemException, PortalException { 176 WCPSalon salon wcpSalonPersistence.create(counterLocalService.increment(WCPSalon.class.getName())); resourceLocalService.addResources(newSalon.getCompanyId(), WCPSalon.class.getName(), salon.getPrimaryKey() , false, true, true); salon.setNombreSalon(newSalon.getNombreSalon()); salon.setIpCamara(newSalon.getIpCamara()); salon.setPuertoCamara(newSalon.getPuertoCamara()); salon.setUrlStreaming(newSalon.getUrlStreaming()); salon.setCompanyId(newSalon.getCompanyId()); salon.setGroupId(newSalon.getGroupId()); return wcpSalonPersistence.update(salon, false); } = newSalon.getGroupId(), salonId, public void deleteSalon(long salonId) throws NoSuchSalonException, SystemException, PortalException { WCPSalon salon = wcpSalonPersistence.findByPrimaryKey(salonId); deleteSalon(salon, salonId); } public void deleteSalon(WCPSalon salon, long salonId) throws NoSuchSalonException, SystemException, PortalException { resourceLocalService.deleteResource(salonId, WCPSalon.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL, salon.getPrimaryKey()); wcpSalonPersistence.remove(salon); } public List<WCPSalon> getSalones(long groupId) throws SystemException { List<WCPSalon> salones = wcpSalonPersistence.findByGroupId(groupId); return salones; } } Listado A8.4. Clase WCPSalonLocalServiceImpl /** * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.centroinfantilpopeyes.webcamportlet.service.impl; import java.util.List; import com.centroinfantilpopeyes.webcamportlet.NoSuchSalonException; import com.centroinfantilpopeyes.webcamportlet.model.WCPSalon; import com.centroinfantilpopeyes.webcamportlet.service.base.WCPSalonLocalServiceBaseImpl; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.model.ResourceConstants; import com.liferay.portlet.softwarecatalog.ProductEntryAuthorException; /** * The implementation of the w c p salon local service. * 177 * <p> * All custom service methods should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link com.centroinfantilpopeyes.webcamportlet.service.WCPSalonLocalService} interface. * </p> * * <p> * Never reference this interface directly. Always use {@link com.centroinfantilpopeyes.webcamportlet.service.WCPSalonLocalServiceUtil} to access the w c p salon local service. * </p> * * <p> * This is a local service. Methods of this service will not have security checks based on the propagated JAAS credentials because this service can only be accessed from within the same VM. * </p> * * @author Max Morillo * @see com.centroinfantilpopeyes.webcamportlet.service.base.WCPSalonLocalServiceBaseImpl * @see com.centroinfantilpopeyes.webcamportlet.service.WCPSalonLocalServiceUtil */ public class WCPSalonLocalServiceImpl extends WCPSalonLocalServiceBaseImpl { public WCPSalon addSalon (WCPSalon newSalon, long salonId) throws SystemException, PortalException { WCPSalon salon = wcpSalonPersistence.create(counterLocalService.increment(WCPSalon.class.getName())); resourceLocalService.addResources(newSalon.getCompanyId(), newSalon.getGroupId(), salonId, WCPSalon.class.getName(), salon.getPrimaryKey() , false, true, true); salon.setNombreSalon(newSalon.getNombreSalon()); salon.setIpCamara(newSalon.getIpCamara()); salon.setPuertoCamara(newSalon.getPuertoCamara()); salon.setUrlStreaming(newSalon.getUrlStreaming()); salon.setCompanyId(newSalon.getCompanyId()); salon.setGroupId(newSalon.getGroupId()); return wcpSalonPersistence.update(salon, false); } public void deleteSalon(long salonId) throws NoSuchSalonException, SystemException, PortalException { WCPSalon salon = wcpSalonPersistence.findByPrimaryKey(salonId); deleteSalon(salon, salonId); } public void deleteSalon(WCPSalon salon, long salonId) throws NoSuchSalonException, SystemException, PortalException { resourceLocalService.deleteResource(salonId, WCPSalon.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL, salon.getPrimaryKey()); wcpSalonPersistence.remove(salon); } public List<WCPSalon> getSalones(long groupId) throws SystemException { List<WCPSalon> salones = wcpSalonPersistence.findByGroupId(groupId); return salones; } } Listado A8.4. Clase WCPSalonLocalService /** * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * 178 * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.centroinfantilpopeyes.webcamportlet.service.base; import com.centroinfantilpopeyes.webcamportlet.model.WCPSalon; import com.centroinfantilpopeyes.webcamportlet.service.WCPSalonLocalService; import com.centroinfantilpopeyes.webcamportlet.service.persistence.WCPSalonPersistence; import com.liferay.counter.service.CounterLocalService; import com.liferay.portal.kernel.annotation.BeanReference; import com.liferay.portal.kernel.dao.jdbc.SqlUpdate; import com.liferay.portal.kernel.dao.jdbc.SqlUpdateFactoryUtil; import com.liferay.portal.kernel.dao.orm.DynamicQuery; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.service.ResourceLocalService; import com.liferay.portal.service.ResourceService; import com.liferay.portal.service.UserLocalService; import com.liferay.portal.service.UserService; import com.liferay.portal.service.persistence.ResourcePersistence; import com.liferay.portal.service.persistence.UserPersistence; import java.util.List; import javax.sql.DataSource; /** * The base implementation of the w c p salon local service. * * <p> * This implementation exists only as a container for the default service methods generated by ServiceBuilder. All custom service methods should be put in {@link com.centroinfantilpopeyes.webcamportlet.service.impl.WCPSalonLocalServiceImpl}. * </p> * * <p> * Never modify or reference this class directly. Always use {@link com.centroinfantilpopeyes.webcamportlet.service.WCPSalonLocalServiceUtil} to access the w c p salon local service. * </p> * * @author Max Morillo * @see com.centroinfantilpopeyes.webcamportlet.service.impl.WCPSalonLocalServiceImpl * @see com.centroinfantilpopeyes.webcamportlet.service.WCPSalonLocalServiceUtil * @generated */ public abstract class WCPSalonLocalServiceBaseImpl implements WCPSalonLocalService { /** * Adds the w c p salon to the database. Also notifies the appropriate model listeners. * * @param wcpSalon the w c p salon to add * @return the w c p salon that was added * @throws SystemException if a system exception occurred */ public WCPSalon addWCPSalon(WCPSalon wcpSalon) throws SystemException { wcpSalon.setNew(true); return wcpSalonPersistence.update(wcpSalon, false); } /** * Creates a new w c p salon with the primary key. Does not add the w c p salon to the database. * * @param salonId the primary key for the new w c p salon 179 * @return the new w c p salon */ public WCPSalon createWCPSalon(long salonId) { return wcpSalonPersistence.create(salonId); } /** * Deletes the w c p salon with the primary key from the database. Also notifies the appropriate model listeners. * * @param salonId the primary key of the w c p salon to delete * @throws PortalException if a w c p salon with the primary key could not be found * @throws SystemException if a system exception occurred */ public void deleteWCPSalon(long salonId) throws PortalException, SystemException { wcpSalonPersistence.remove(salonId); } /** * Deletes the w c p salon from the database. Also notifies the appropriate model listeners. * * @param wcpSalon the w c p salon to delete * @throws SystemException if a system exception occurred */ public void deleteWCPSalon(WCPSalon wcpSalon) throws SystemException { wcpSalonPersistence.remove(wcpSalon); } /** * Performs a dynamic query on the database and returns the matching rows. * * @param dynamicQuery the dynamic query to search with * @return the matching rows * @throws SystemException if a system exception occurred */ @SuppressWarnings("rawtypes") public List dynamicQuery(DynamicQuery dynamicQuery) throws SystemException { return wcpSalonPersistence.findWithDynamicQuery(dynamicQuery); } /** * Performs a dynamic query on the database and returns a range of the matching rows. * * <p> * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. * </p> * * @param dynamicQuery the dynamic query to search with * @param start the lower bound of the range of model instances to return * @param end the upper bound of the range of model instances to return (not inclusive) * @return the range of matching rows * @throws SystemException if a system exception occurred */ @SuppressWarnings("rawtypes") public List dynamicQuery(DynamicQuery dynamicQuery, int start, int end) throws SystemException { return wcpSalonPersistence.findWithDynamicQuery(dynamicQuery, start, end); } /** * Performs a dynamic query on the database and returns an ordered range of the matching rows. * * <p> * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. 180 Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. * </p> * * @param dynamicQuery the dynamic query to search with * @param start the lower bound of the range of model instances to return * @param end the upper bound of the range of model instances to return (not inclusive) * @param orderByComparator the comparator to order the results by * @return the ordered range of matching rows * @throws SystemException if a system exception occurred */ @SuppressWarnings("rawtypes") public List dynamicQuery(DynamicQuery dynamicQuery, int start, int end, OrderByComparator orderByComparator) throws SystemException { return wcpSalonPersistence.findWithDynamicQuery(dynamicQuery, start, end, orderByComparator); } /** * Counts the number of rows that match the dynamic query. * * @param dynamicQuery the dynamic query to search with * @return the number of rows that match the dynamic query * @throws SystemException if a system exception occurred */ public long dynamicQueryCount(DynamicQuery dynamicQuery) throws SystemException { return wcpSalonPersistence.countWithDynamicQuery(dynamicQuery); } /** * Gets the w c p salon with the primary key. * * @param salonId the primary key of the w c p salon to get * @return the w c p salon * @throws PortalException if a w c p salon with the primary key could not be found * @throws SystemException if a system exception occurred */ public WCPSalon getWCPSalon(long salonId) throws PortalException, SystemException { return wcpSalonPersistence.findByPrimaryKey(salonId); } /** * Gets a range of all the w c p salons. * * <p> * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. * </p> * * @param start the lower bound of the range of w c p salons to return * @param end the upper bound of the range of w c p salons to return (not inclusive) * @return the range of w c p salons * @throws SystemException if a system exception occurred */ public List<WCPSalon> getWCPSalons(int start, int end) throws SystemException { return wcpSalonPersistence.findAll(start, end); } /** * Gets the number of w c p salons. * * @return the number of w c p salons * @throws SystemException if a system exception occurred */ 181 public int getWCPSalonsCount() throws SystemException { return wcpSalonPersistence.countAll(); } /** * Updates the w c p salon in the database. Also notifies the appropriate model listeners. * * @param wcpSalon the w c p salon to update * @return the w c p salon that was updated * @throws SystemException if a system exception occurred */ public WCPSalon updateWCPSalon(WCPSalon wcpSalon) throws SystemException { wcpSalon.setNew(false); return wcpSalonPersistence.update(wcpSalon, true); } /** * Updates the w c p salon in the database. Also notifies the appropriate model listeners. * * @param wcpSalon the w c p salon to update * @param merge whether to merge the w c p salon with the current session. See {@link com.liferay.portal.service.persistence.BatchSession#update(com.liferay.portal.kernel.dao.orm.Session, com.liferay.portal.model.BaseModel, boolean)} for an explanation. * @return the w c p salon that was updated * @throws SystemException if a system exception occurred */ public WCPSalon updateWCPSalon(WCPSalon wcpSalon, boolean merge) throws SystemException { wcpSalon.setNew(false); return wcpSalonPersistence.update(wcpSalon, merge); } /** * Gets the w c p salon local service. * * @return the w c p salon local service */ public WCPSalonLocalService getWCPSalonLocalService() { return wcpSalonLocalService; } /** * Sets the w c p salon local service. * * @param wcpSalonLocalService the w c p salon local service */ public void setWCPSalonLocalService( WCPSalonLocalService wcpSalonLocalService) { this.wcpSalonLocalService = wcpSalonLocalService; } /** * Gets the w c p salon persistence. * * @return the w c p salon persistence */ public WCPSalonPersistence getWCPSalonPersistence() { return wcpSalonPersistence; } /** * Sets the w c p salon persistence. * * @param wcpSalonPersistence the w c p salon persistence */ public void setWCPSalonPersistence(WCPSalonPersistence wcpSalonPersistence) { this.wcpSalonPersistence = wcpSalonPersistence; 182 } /** * Gets the counter local service. * * @return the counter local service */ public CounterLocalService getCounterLocalService() { return counterLocalService; } /** * Sets the counter local service. * * @param counterLocalService the counter local service */ public void setCounterLocalService(CounterLocalService counterLocalService) { this.counterLocalService = counterLocalService; } /** * Gets the resource local service. * * @return the resource local service */ public ResourceLocalService getResourceLocalService() { return resourceLocalService; } /** * Sets the resource local service. * * @param resourceLocalService the resource local service */ public void setResourceLocalService( ResourceLocalService resourceLocalService) { this.resourceLocalService = resourceLocalService; } /** * Gets the resource remote service. * * @return the resource remote service */ public ResourceService getResourceService() { return resourceService; } /** * Sets the resource remote service. * * @param resourceService the resource remote service */ public void setResourceService(ResourceService resourceService) { this.resourceService = resourceService; } /** * Gets the resource persistence. * * @return the resource persistence */ public ResourcePersistence getResourcePersistence() { return resourcePersistence; } /** * Sets the resource persistence. * 183 * @param resourcePersistence the resource persistence */ public void setResourcePersistence(ResourcePersistence resourcePersistence) { this.resourcePersistence = resourcePersistence; } /** * Gets the user local service. * * @return the user local service */ public UserLocalService getUserLocalService() { return userLocalService; } /** * Sets the user local service. * * @param userLocalService the user local service */ public void setUserLocalService(UserLocalService userLocalService) { this.userLocalService = userLocalService; } /** * Gets the user remote service. * * @return the user remote service */ public UserService getUserService() { return userService; } /** * Sets the user remote service. * * @param userService the user remote service */ public void setUserService(UserService userService) { this.userService = userService; } /** * Gets the user persistence. * * @return the user persistence */ public UserPersistence getUserPersistence() { return userPersistence; } /** * Sets the user persistence. * * @param userPersistence the user persistence */ public void setUserPersistence(UserPersistence userPersistence) { this.userPersistence = userPersistence; } /** * Performs an SQL query. * * @param sql the sql query to perform */ protected void runSQL(String sql) throws SystemException { try { DataSource dataSource = wcpSalonPersistence.getDataSource(); 184 SqlUpdate sqlUpdate = SqlUpdateFactoryUtil.getSqlUpdate(dataSource, sql, new int[0]); sqlUpdate.update(); } catch (Exception e) { throw new SystemException(e); } } @BeanReference(type = WCPSalonLocalService.class) protected WCPSalonLocalService wcpSalonLocalService; @BeanReference(type = WCPSalonPersistence.class) protected WCPSalonPersistence wcpSalonPersistence; @BeanReference(type = CounterLocalService.class) protected CounterLocalService counterLocalService; @BeanReference(type = ResourceLocalService.class) protected ResourceLocalService resourceLocalService; @BeanReference(type = ResourceService.class) protected ResourceService resourceService; @BeanReference(type = ResourcePersistence.class) protected ResourcePersistence resourcePersistence; @BeanReference(type = UserLocalService.class) protected UserLocalService userLocalService; @BeanReference(type = UserService.class) protected UserService userService; @BeanReference(type = UserPersistence.class) protected UserPersistence userPersistence; } Listado A8.4. Clase WCPSalonLocalServiceBaseImpl 185 ANEXO 9. PAPER Uso de metodologías de desarrollo ágil Universidad Técnica Particular de Loja, Ingeniería en Sistemas Informáticos y Computación Ing. Guido Riofrío Calderón Correo-e: geriofrio@utpl.edu.ec Max Geovanny Morillo Aguilar Correo-e: mgmorillo@hotmail.com Resumen.- El desarrollo de software es una tarea compleja, para la cual se han creado un sinnúmero de normas y metodologías para su seguimiento y control, estableciendo en algunos casos verdaderas camisas de fuerza donde el resultado final no necesariamente es el satisfactorio para el cliente. Sin embargo, el mercado actual requiere de soluciones tecnológicas “eficientes y rápidas”, que se adapten a nuevas propuestas de cambio. Ante este requerimiento de cambio en el mercado, surgen las nuevas metodologías ágiles de desarrollo de software donde se valora más al individuo, a la colaboración con el cliente y al desarrollo incremental de aplicaciones en iteraciones muy pequeñas. Las metodologías ágiles han revolucionado la forma de ver el desarrollo de software, y han sido adaptadas por un sinnúmero de empresas que han logrado grandes desarrollos con aplicaciones que están siendo utilizadas a nivel mundial. En el presente trabajo, se exponen estas metodologías, la comparación con sus pares tradicionales, y se hace un especial énfasis en SCRUM como metodología adoptada por el autor, en el desarrollo de un aplicativo web para monitoreo de niños utilizando un cámara IP en un Centro de Desarrollo Infantil de la ciudad de Quito – Ecuador. PALABRAS CLAVE. Procesos de Software, Metodologías Ágiles, SCRUM. I. Introducción En las dos últimas décadas se desarrollaron un sinnúmero de notaciones de modelado así como herramientas que prometían el éxito para el desarrollo del software, pero desafortunadamente para los amantes del desarrollo, esto quedó en nada más que promesas. Conforme han pasado los años, las empresas han requerido cada vez más, la elaboración de software que se adapte al cambiante mundo de los requerimientos. Tal es así que aplicaciones como Facebook, Twitter, Google, etc., empezaron como pequeños proyectos, y en un muy corto tiempo han logrado crear unos verdaderos gigantes de la industria del software, y esto se debió al crecimiento de nuevas tendencias en lo que a metodología de desarrollo se refiere. Estas tendencias llamadas “Ágiles”, no son nada más que metodologías que se adaptan a los cambios cada vez más exigentes del mercado, y explotan de manera rápida el resultado de un producto. En la actualidad, existen algunas metodologías ágiles, las cuales han logrado ajustarse a la dinámica del mercado, el cual “obliga” a la obtención de resultados rápidos, buenos y baratos, a diferencia de las metodologías tradicionales, que han sido consideradas como burocráticas y “pesadas” (ej. CMMI28, SPICE29, etc.). Entre las metodologías ágiles más relevantes está SCRUM [1], la cual no solo ha sido adoptada para el desarrollo de proyectos de software, sino también como parte de elaboración y seguimiento de proyectos, para empresas de todo tipo. Este artículo está organizado de la siguiente manera. En la sección 2, se indican las principales características de las metodologías ágiles, las cuales son recopiladas en el 28 29 CMMI..- siglas de Capability Maturity Model Integration. SPICE .- de sus siglas en inglés Software Process Improvement Capability Determination. Estándar ISO/IEC 15504. 186 manifiesto ágil. También se establecerá las diferencias con las metodologías tradicionales de desarrollo de software, y una descripción de SCRUM como metodología adoptada. II. Estado del Arte A. METODOLOGÍAS ÁGILES DESARROLLO DE SOFTWARE. El objetivo principal de este grupo fue esbozar los valores y principios que deberían permitir a los equipos desarrollar software rápidamente y respondiendo a los cambios que puedan surgir a lo largo del proyecto. Es así que se creó la Agile Alliance30, organización sin fines de lucro, cuyo objetivo fue la ayuda a las organizaciones para que adopten la nueva filosofía ágil, definida en un compendio llamado “Manifiesto Ágil”31. B. MANIFIESTO ÁGIL. El manifiesto ágil muestra una serie de valores, los cuales se recopilaron en cuatro grupos y que hacen énfasis en lo siguiente: A los individuos y su interacción, por encima de los procesos y las herramientas. Donde, las personas son el principal factor de éxito de un proyecto. Esto implica que es más importante armar un buen equipo que construir el entorno, donde la mayoría de veces se comete el error de construir primero el entorno y luego se espera que el equipo se adapte sin ningún tipo de consideración de las repercusiones. El software que funciona, por encima de la documentación exhaustiva. La mayoría de veces se pretende seguir estrictamente documentaciones, por lo que este valor objeta esa rigidez y pondera la no elaboración de documentos a menos que sean necesarios de forma inmediata para tomar una decisión importante. 31 www.agilealliance.com agilemanifesto.org La respuesta al cambio, por encima del seguimiento de un plan. Se refiera a la respuesta a los cambios que puedan surgir a en un proyecto (ej. los requisitos, tecnología, equipo, etc.), que incidirá en el éxito o fracaso del mismo. En este caso la planificación no debe ser estricta sino flexible y abierta. DE En marzo de 2001 en Estados Unidos, se reúnen 17 expertos de los modelos de mejora del desarrollo de software, con la finalidad de tratar sobre nuevas técnicas y procesos para el desarrollo de software. Aquí nace por primera vez el término “Agil”, el cual se contrapone al sistema rígido de elaboración tradicional de programas. 30 La colaboración con el cliente, por encima de la negociación contractual. Esto implica una interacción constante entre el cliente y el equipo de desarrollo. Esta colaboración es sumamente importante para la marcha del proyecto y su éxito. De los valores anteriormente citados, se desprenden doce principios que caracterizan a una metodología ágil de una tradicional. Estos principios[8] son: I. La prioridad es satisfacer al cliente mediante tempranas y continuas entregas de software que le aporte un valor. II. Dar la bienvenida a los cambios. Se capturan los cambios para que el cliente tenga una ventaja competitiva. III. Entregar frecuentemente software que funcione desde un par de semanas a un par de meses, con el menor intervalo de tiempo posible entre entregas. IV. La gente del negocio y los desarrolladores deben trabajar juntos a lo largo del proyecto. V. Construir el proyecto en torno a individuos motivados. Darles el entorno y el apoyo que necesitan y confiar en ellos para conseguir finalizar el trabajo. VI. El diálogo cara a cara es el método más eficiente y efectivo para comunicar información dentro de un equipo de desarrollo. VII. El software que funciona es la medida principal de progreso. VIII. Los procesos ágiles promueven un desarrollo sostenible. Los promotores, desarrolladores y usuarios deberían ser capaces de mantener una paz constante. IX. La atención continua a la calidad técnica y al buen diseño mejora la agilidad. X. La simplicidad es esencial. XI. Las mejores arquitecturas, requisitos y diseños surgen de los equipos organizados por sí mismos. XII. En intervalos regulares, el equipo reflexiona respecto a cómo llegar a ser más efectivo, y según esto ajusta su comportamiento. COMPARACIÓN DE TRADICIONALES Y ÁGILES. METODOLOGÍAS En el siguiente cuadro (Tabla 1. Cuadro comparativo de metodologías [8]), se establece una diferenciación entre las metodologías ágiles y tradicionales, no solo desde el punto 187 de vista del proceso, sino también respecto al capital humano que está involucrado. Metodologías Ágiles Metodologías Tradicionales Basadas en heurísticas provenientes Basadas en normas provenientes de de prácticas de producción de estándares seguidos por el entorno código de desarrollo Especialmente preparados cambios durante el proyecto para Cierta resistencia a los cambios Impuestas internamente (por el Impuestas externamente equipo) Proceso menos controlado, con Proceso mucho más controlado, pocos principios con numerosas políticas/normas No existe contrato tradicional o al Existe un contrato prefijado menos es bastante flexible El cliente es parte del equipo de El cliente interactúa con el equipo desarrollo de desarrollo mediante reuniones Grupos pequeños (<10 integrantes) Grupos grandes y posiblemente y trabajando en el mismo sitio distribuidos Pocos artefactos Más artefactos Pocos roles Más roles Menos énfasis en la arquitectura del La arquitectura del software es software esencial y se expresa mediante modelos La metodología SCRUM, maneja un proceso iterativo e incremental para el desarrollo de proyectos, productos y aplicaciones que no solo se enfoca en productos de software. Está compuesto de ciclos de trabajo llamados “Sprints” que son iteraciones de 1 a 4 semanas, que se van ejecutando una tras otra. Los Sprints tienen una duración fija (terminan en una fecha específica aunque no se haya terminado el trabajo), y nunca se alargan, es decir hay una limitante en tiempo. Al comienzo de cada sprint, un equipo multi-funcional selecciona los elementos (requisitos del cliente) de una lista priorizada. Se comprometen a terminar los elementos al final del Sprint. Durante el Sprint no se pueden cambiar los elementos elegidos. Todos los días el equipo se reúne brevemente para informar del progreso, y actualizan unas gráficas sencillas que les orientan sobre el trabajo restante. Al final del Sprint, el equipo revisa el Sprint con los interesados en el proyecto, y les enseña lo que han construido. La gente obtiene comentarios y observaciones que se puede incorporar al siguiente Sprint. Scrum pone el énfasis en productos que funcionen al final del Sprint que realmente estén “hechos”; en el caso del software significa que el código esté integrado, completamente probado y potencialmente para entregar. Tabla 1. Cuadro comparativo de metodologías C. SCRUM COMO METODOLOGÍA DESARROLLO ÁGIL. DE SCRUM nació en 1986 con Hirotaka Takeuchi e Ikujiro Nonaka, como un proyecto para mejorar la flexibilidad y rapidez en el desarrollo de productos comerciales. Posteriormente en 1991 Peter DeGrace y Leslie Stahl, utilizaron por primera vez el término Scrum, para luego en 1995 por intermedio de Schwaber y Sutherland utilizar públicamente el término conjuntamente con las mejores prácticas de la industria. Finalmente en 2001, Schwaber y Mike Beedle describieron la metodología completa en el libro “Agile Software Development with Scrum” (Desarrollo Ágil de Software con SCRUM). SCRUM al ser una metodología ágil de desarrollo, tipo “transversal”, se entiende que es apropiado para equipos de trabajo o de desarrollo (como recomendación hasta máximo grupos de 8 personas). I. Proceso y conceptos manejados en SCRUM Tomando en cuenta el proceso descrito anteriormente, a continuación se detallan los diferentes elementos que contempla la metodología, así: Product Backlog (Pila de producto): documento en el cual se detallan, de forma priorizada, los requisitos del sistema. Sprint (Iteración): cada una de las iteraciones de que se compone el desarrollo con Scrum. Si existe razón de suficiente peso, puede abortarse el sprint y comenzar uno nuevo. Sprint Backlog: “trozo” de backlog que nos comprometemos a implementar de forma satisfactoria en el sprint (iteración) actual. ScrumMaster: que mantiene los procesos y trabaja de forma similar al director de proyecto. ProductOwner (Dueño del producto): que representa a los stakeholders (clientes externos o internos). Team (Grupo): que incluye a los desarrolladores. Burndown Chart: Es una gráfica que muestra las funcionalidades pendientes del proyecto al comienzo de cada Sprint y demuestra el avance en función del tiempo para así poder manejar el 188 proyecto. Este modelo se lo usa en lugar de un diagrama de PERT. estudio del negocio, modelado funcional, diseño y construcción, e implementación. Las tres últimas son iterativas, además de existir retroalimentación a todas las fases. Los diferentes roles, artefactos y eventos principales se muestran en la Figura 1 (Proceso SCRUM). Adaptive Software Development (ASD) [5]. (Jim Highsmith). Metodología que tiene como características: ser iterativo, orientado a los componentes software más que a las tareas y tolerante a los cambios. El ciclo de vida consta de tres fases: especulación, colaboración y aprendizaje. En la primera se inicia el proyecto y se planifican las características del software; en la segunda se desarrollan las características y finalmente en la tercera se revisa su calidad, y se entrega al cliente. La revisión de los componentes sirve para aprender de los errores y volver a iniciar el ciclo de desarrollo. Figura 1. Proceso SCRUM [7] Feature Driven Development (FDD) [6]. (Jeff De Luca y Peter Coad). Proceso iterativo que consta de 5 pasos, con ciclos cortos (hasta 2 semanas). Se centra en las fases de diseño e implementación del sistema, partiendo de una lista de características del software a crear. D. OTRAS METODOLOGÍAS ÁGILES. Si bien es cierto que los principios y valores propuestos en el manifiesto ágiles son universales, eso no implica que todas las metodologías ágiles creadas tengan iguales componentes, por lo que cada una de ellas tiene sus propias características. A continuación se detalla las otras metodologías y sus propias particularidades: Lean Development (LD). Creada por Bob Charettes, a partir de su experiencia en proyectos con la industria automotriz japonesa (años 80) y utilizada en numerosos proyectos de telecomunicaciones en Europa. En esta metodología los cambios que se consideran riesgos, pueden traducirse en oportunidades, con un manejo adecuado, que mejoren la productividad del cliente. Su principal característica es introducir un mecanismo para implementar dichos cambios. Xtreme Programming (XP) [2], metodología desarrollada por Kent Beck, que es quien hizo la primera diferenciación con las metodologías tradicionales, principalmente porque pone más énfasis en la adaptabilidad que en la previsibilidad. Crystal Methodologies [3]. Conjunto de metodologías para el desarrollo de software creadas por Alistair Cockburn. Se centra en las personas que componen el equipo y la máxima reducción del número de artefactos producidos. El equipo de desarrollo es un factor clave, por lo que se deben invertir esfuerzos en mejorar sus habilidades y destrezas, así como tener políticas de trabajo en equipo claramente definidas. Dynamic Systems Development Method (DSDM) [4]. Creada en 1994 con el objetivo de crear una metodología RAD32 unificada. Sus principales características son: proceso iterativo e incremental y trabajo conjunto del equipo de desarrollo y el usuario. Contiene cinco fases: estudio viabilidad, 32 RAD. del inglés Rapid Application Development. III. APLICACIÓN DE LA METODOLOGÍA EN DESARROLLO DE TESIS. Tomando en cuenta las diferentes metodologías ágiles de desarrollo de software, se adoptó SCRUM porque posee características más flexibles cuando existen cambios o incorporación de nuevas funcionalidades a un proyecto. Adicionalmente, se adapta fácilmente al curso normal del desarrollo de aplicaciones en la actualidad, especialmente a tecnologías orientadas a la Web, donde metodologías tradicionales no arrojan resultados esperados. 189 IV. [8] Canó, José H., Letelier, Patricio y Penadés, Ma. Carmen. Metodologías Ágiles en el Desarrollo de Software. http://www.willydev.net/descargas/prev/TodoAgil.pdf CONCLUSIONES La aplicación de metodologías ágiles de desarrollo de software, favorecen la creación de aplicaciones orientadas a la WEB. La metodología SCRUM se adapta mejor en el desarrollo de aplicaciones con alto cambio de requerimientos y mejoras del software y está siendo adoptado por la mayoría de portales orientados a la gestión de contenidos, como en el caso de Google, Myspace, Yahoo. SCRUM no es de fácil adaptación a proyectos unipersonales, ya que el fin de esta metodología es la interacción entre un grupo de desarrolladores. Además se hace necesaria una férrea disciplina para llevar a cabo las reuniones de planificación diarias, así como el cumplimiento de las tareas en el tiempo estipulado. Referencias [1] Schwaber K., Beedle M., Martin R.C. .Agile Software Development with SCRUM.. Prentice Hall. 2001. [2] Beck, K.. .Extreme Programming Explained. Embrace Change., Pearson Education, 1999. Traducido al español como: .Una explicación de la programación extrema. Aceptar el cambio., Addison Wesley, 2000. [3] Fowler, M., Beck, K., Brant, J. .Refactoring: Improving the Design of Existing Code.. Addison-Wesley. 1999. [4] Tuffs, Stapleton, West, Eason Inter-operability of DSDM with the Rational Unified Process, DSDM Consortium, 1999. [5] Agile Project http://www.adaptivesd.com. Management. [6] Feature Driven Development and Agile Modeling. http://www.agilemodeling.com/essays/fdd.htm [7] Deemer, Pete y otros. Información Básica de SCRUM. http://www.goodagile.com/scrumprimer