234
API DE COMUNICACIONES PARA POCKET PC BASADO EN LA PROGRAMACIÓN ORIENTADA A ASPECTOS PAULO ANDRÉS BURGOS HEREDIA JESÚS ALBERTO PINZON ORTIZ PONTIFICIA UNIVERSIDAD JAVERIANA FACULTAD DE INGENIERIA CARRERA DE INGENIERIA DE SISTEMAS SANTAFÉ DE BOGOTA D.C. JUNIO DE 2005

API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

PROGRAMACIÓN ORIENTADA A ASPECTOS

PAULO ANDRÉS BURGOS HEREDIA

JESÚS ALBERTO PINZON ORTIZ

PONTIFICIA UNIVERSIDAD JAVERIANA

FACULTAD DE INGENIERIA

CARRERA DE INGENIERIA DE SISTEMAS

SANTAFÉ DE BOGOTA D.C.

JUNIO DE 2005

Page 2: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

PROGRAMACIÓN ORIENTADA A ASPECTOS

PAULO ANDRÉS BURGOS HEREDIA

JESÚS ALBERTO PINZON ORTIZ

Proyecto de grado presentado para optar el título de

INGENIERO DE SISTEMAS

DIRECTOR

JUAN PABLO GARZÓN

Ingeniero de Sistemas

PONTIFICIA UNIVERSIDAD JAVERIANA

FACULTAD DE INGENIERIA

CARRERA DE INGENIERIA DE SISTEMAS

SANTAFÉ DE BOGOTA D.C.

JUNIO DE 2005

Page 3: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

PONTIFICIA UNIVERSIDAD JAVERIANA

FACULTAD DE INGENIERIA

CARRERA DE INGENIERIA DE SISTEMAS

Rector Magnífico:

Padre Gerardo Remolina Vargas S.J.

Decano Académico Facultad de Ingeniería:

Ingeniero Francisco Javier Rebolledo Muñoz

Decano del Medio Universitario Facultad de Ingeniería:

Padre José Sarmiento Nova S.J.

Director Carrera de Ingeniería de Sistemas:

Ingeniera Hilda Cristina Chaparro López

Director Departamento de Ingeniería de Sistemas:

Ingeniero Germán Alberto Chavarro Flórez

Page 4: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

Nota de Aceptación

___________________

___________________

___________________

__________________________

Director del Proyecto

__________________________

Jurado

__________________________

Jurado

Mes y Año

Page 5: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

DEDICATORIA

Dedicamos especialmente a Deogracias, Edgar Rodrigo, Julia Consuleo,

Maria Consuelo, Graciela, Ana Julia, Ricardo, Cony, Laura Jimena,

Sebastian y José David nuestros padres y familiares quienes hicieron

posible este gran logro en nuestras vidas.

Page 6: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

AGRADECIMIENTOS

Agradecemos a Dios por brindarnos la oportunidad de realizar este gran

trabajo; por la salud, paciencia, perseverancia y sabiduría que fue el

motor de esta misión.

Agradecemos a Juan Pablo Garzón por la guía y apoyo continuo en el

desarrollo de esta investigación.

Agradecemos a nuestras familias, amigos y a quienes queremos de

corazón por la paciencia y fe impuesta en nosotros, que nos impulso a

seguir adelante en esta ardua tarea.

Agradecemos a Jaime Alberto y su hermano Juan David por brindarnos

su contribución en esta tesis.

Agradecemos a nuestros profesores y compañeros quienes de una u otra

forma nos apoyaron en esta investigación.

Page 7: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

Artículo 23 de la Resolución No. 1 de Junio de 1946

“La Universidad no se hace responsable de los conceptos emitidos por

sus alumnos en sus proyectos de grado. Sólo velará porque no se

publique nada contrario al dogma y la moral católica y porque no

contengan ataques o polémicas puramente personales. Antes bien, que

se vean en ellos el anhelo de buscar la verdad y la Justicia”

Page 8: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

TABLA DE CONTENIDO

1 INTRODUCCIÓN..................................................................................... 1 2 OBJETIVOS ........................................................................................... 2

2.1 OBJETIVO GENERAL ............................................................................... 2 2.2 OBJETIVOS ESPECÍFICOS ....................................................................... 2

3 PROBLEMA U OPORTUNIDAD................................................................... 3 4 ESTADO DEL ARTE ................................................................................. 4

4.1 PROGRAMACIÓN ORIENTADA A ASPECTOS ............................................... 4 4.1.1 Historia ......................................................................................... 4 4.1.2 ¿Qué es un Aspecto?....................................................................... 5 4.1.3 ¿Qué es la Programación Orientada a Aspectos? ................................. 5 4.1.4 Los aspectos en el diseño ................................................................ 6

4.1.4.1 AspectJ................................................................................... 7 4.1.4.2 JBoss 4.0 ................................................................................ 7 4.1.4.3 Cool ....................................................................................... 8 4.1.4.4 Aspectos en .NET..................................................................... 8

4.2 COMUNICACION ENTRE PARES ................................................................ 8 4.2.1 Definición ...................................................................................... 9 4.2.2 Ventajas........................................................................................ 9

4.2.2.1 Kazaa..................................................................................... 9 4.2.2.2 JXTA ...................................................................................... 9

4.3 CARACTERÍSTICAS DE LOS DISPOSITIVOS MÓVILES ............................... 10 4.3.1 Pocket PC .................................................................................... 10 4.3.2 Framework de desarrollo ............................................................... 11

4.3.2.1 J2ME .................................................................................... 11 4.3.2.2 Compact Framework .............................................................. 11

4.3.3 Emuladores.................................................................................. 12 5 MARCO TEÓRICO ................................................................................. 13

5.1 CONCEPTOS BÁSICOS DE LA PROGRAMACIÓN ORIENTADA A ASPECTOS.... 13 5.2 PROGRAMACIÓN ORIENTADA A ASPECTOS ............................................. 14

5.2.1 Análisis ....................................................................................... 15 5.2.2 Diseño ........................................................................................ 16

5.3 SOPORTE DE LA PROGRAMACIÓN ORIENTADA A ASPECTOS EN .NET.......... 17 5.3.1 Aspectos en C#............................................................................ 17

5.3.1.1 RAPIER-LOOM.NET [RLOM]: .................................................... 18 5.3.1.2 ASPECT# [ASP#]:.................................................................. 18 5.3.1.3 ADD-IN DE MESALEM [ADDM]:................................................ 19

5.3.2 Aspectos en Compact Framework ................................................... 19 5.3.2.1 El Namespace SYSTEM.REFLECTION.EMIT................................. 19 5.3.2.2 RAPIER-LOOM.NET................................................................. 20 5.3.2.3 ASPECT# .............................................................................. 20 5.3.2.4 ADD-IN DE MESALEM ............................................................. 21

5.4 HERRAMIENTA PARA EL DESARROLLO DE APLICACIONES BASADAS EN ARQUITECTURAS P2P PARA DISPOSITIVOS MÓVILES ............................... 21

5.4.1 JXME........................................................................................... 21 6 PROCESO DE DESARROLLO................................................................... 24

6.1 ETAPA DE ANÁLISIS ............................................................................. 24

Page 9: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

6.2 REQUERIMIENTOS FUNCIONALES .......................................................... 24 6.2.1 Conectar a la Red P2P ................................................................... 25 6.2.2 Publicar Servicio........................................................................... 26 6.2.3 Buscar Servicio............................................................................. 28 6.2.4 Consumir Servicio......................................................................... 29 6.2.5 Desconectar de la Red................................................................... 30 6.2.6 Enviar Datos ................................................................................ 30

6.3 REQUERIMIENTOS NO FUNCIONALES ..................................................... 31 7 ARQUITECTURAS PROPUESTAS.............................................................. 33

7.1 CRITERIOS PARA ESCOGER Y EVALUAR LAS DIFERENTES ARQUITECTURAS 33 7.2 OPCIONES DE ARQUITECTURAS PARA IMPLEMENTAR P2P EN DISPOSITIVOS

MÓVILES............................................................................................. 34 7.2.1 Arquitectura Basada en Relays ....................................................... 35 7.2.2 P2P Pura...................................................................................... 36

7.3 INTEGRACIÓN DE LAS ARQUITECTURAS P2P........................................... 38 7.3.1 P2P Puntos Comunicados por Relay................................................. 39 7.3.2 P2P con Servidor de Índices con Puntos Comunicados por Relay......... 41 7.3.3 P2P Servidor Índices ..................................................................... 43 7.3.4 P2P con Servidor de Índices y Búsquedas ........................................ 44 7.3.5 P2P con Servidor de Índices y sin Búsquedas ................................... 45

7.4 MÉTODO PARA ESCOGER LA ARQUITECTURA DEL API DE COMUNICACIONES 45

7.5 DISEÑO DE LA ARQUITECTURA.............................................................. 47 7.5.1 Diseño de Paquetes ...................................................................... 47 7.5.2 Paquete del Cliente:...................................................................... 48 7.5.3 Paquete de Índices ....................................................................... 48 7.5.4 Paquete Comunicaciones ............................................................... 49 7.5.5 Paquete de Tipos .......................................................................... 49 7.5.6 Paquete de Servicios..................................................................... 50

8 ETAPA DE IMPLEMENTACIÓN DEL API..................................................... 51 8.1 EL TRABAJO DESARROLLADO EN MÁQUINAS VIRTUALES DE JAVA PARA

POCKET PC.......................................................................................... 51 8.1.1 Máquinas Virtuales de Java para Pocket PC ...................................... 51 8.1.2 Trabajo Desarrollado en JXME ........................................................ 52

8.2 MODELOS DE IMPLEMENTACIÓN............................................................ 52 8.2.1 Desarrollo Basado en Sockets, Mutihilos, Flujos Distribuidos y

Serialización de Objetos ................................................................ 53 8.2.2 Desarrollo Basado en Servicios Web................................................ 58

8.3 ADAPTACIÓN DE LA ARQUITECTURA DEL API .......................................... 59 8.3.1 Arquitectura del API...................................................................... 60

8.4 IMPLEMENTACIÓN DEL API.................................................................... 62 8.4.1 Implementación de los Aspectos..................................................... 63

8.4.1.1 Funcionamiento de los Aspectos en el API ................................. 65 8.4.2 Implementación del Cliente............................................................ 70 8.4.3 Implementación del Relay.............................................................. 72 8.4.4 Implementación del Directorio........................................................ 73 8.4.5 Implementación de las Clases Utilitarias .......................................... 74

9 ETAPA DE EVALUACIÓN ........................................................................ 77 9.1 ALCANCE ............................................................................................ 77 9.2 ÍTEMS A PROBAR ................................................................................. 77

9.2.1 VARIABLES.................................................................................. 77

Page 10: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

9.3 ESTRATEGIA........................................................................................ 77 9.4 RECURSOS.......................................................................................... 78 9.5 IMPLEMENTACIÓN DEL API BASADO EN POO........................................... 78 9.6 ARQUITECTURAS A PROBAR.................................................................. 79 9.7 ESCENARIOS....................................................................................... 80 9.8 CONVENCIONES .................................................................................. 80

10 PLAN DE PRUEBAS ............................................................................... 81 10.1 ANALISIS DE LAS PRUEBAS................................................................... 82 10.2 ANALISIS DE IMPACTO DE POA ............................................................. 86

10.2.1 METRICAS PARA POA .................................................................... 86 10.2.1.1 RESULTADO DE LAS METRICAS ............................................... 88

10.2.2 COMPARACIONES DE LINEAS DE CODIGO ....................................... 89 11 CONCLUSIONES................................................................................... 93 12 GLOSARIO .......................................................................................... 96 13 REFERENCIAS.................................................................................... 104 14 REFRENCIAS DE PAGINAS DE INTERNET............................................... 107 15 ANEXOS............................................................................................ 113

Page 11: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

ÍNDICE DE GRAFICAS Gráfica 1 Descomposición de conceptos, Analogía del Prisma [LADD] ...................... 16 Gráfica 2 Arquitectura de JXME [AROR] ............................................................... 23 Gráfica 3 Diagrama de Casos de Uso................................................................... 25 Gráfica 4 Diagrama de Arquitectura Basada en Relays........................................... 35 Gráfica 5 Diagrama de Secuencia Arquitectura Basada en Relays............................ 36 Gráfica 6 Diagrama de Arquitectura P2P Puro....................................................... 36 Gráfica 7 Diagrama de Secuencia Arquitectura P2P Puro........................................ 37 Gráfica 8 Diagrama de Arquitectura P2P Puntos Comunicados por Relay .................. 39 Gráfica 9 Diagrama de Secuencia Arquitectura P2P Puntos Comunicados por Relay ... 40 Gráfica 10 Diagrama de Arquitectura P2P con Servidor de Índices con Puntos

Comunicados por Relay ...................................................................... 41 Gráfica 11 Diagrama de Secuencia Arquitectura P2P con Servidor de Índices con Puntos

Comunicados por Relay ...................................................................... 42 Gráfica 12 Diagrama de Arquitectura P2P Servidor Índices ................................. 43 Gráfica 13 Diagrama de Secuencia Arquitectura P2P con Servidor de Índices y

Búsquedas........................................................................................ 44 Gráfica 14 Diagrama de Secuencia Arquitectura P2P con Servidor de Índices y sin

Búsquedas........................................................................................ 45 Gráfica 15 Diagrama de Componentes del API de Comunicaciones.......................... 47 Gráfica 16 Diagrama de Componentes Paquete de La Interfaz del Cliente ................ 48 Gráfica 17 Diagrama de Componentes Paquete de el Servidor de Índices................. 48 Gráfica 18 Diagrama de Componentes Paquete de Comunicaciones......................... 49 Gráfica 19 Diagrama de Componentes Paquete de Interfaces ................................. 49 Gráfica 20 Diagrama de Componentes Paquete de Aspectos................................... 50 Gráfica 21 Inicio del Servidor de Índices y adición de un nuevo Nodo...................... 53 Gráfica 22 Inicio del Relay y adición de un nuevo Nodo ......................................... 53 Gráfica 23 Pantalla principal del Cliente ............................................................... 54 Gráfica 24 Carga de un servicio .......................................................................... 54 Gráfica 25 Mensaje de adición de servicios en el Relay .......................................... 55 Gráfica 26 Mensaje de adición de servicios en el Servidor de Índices....................... 55 Gráfica 27 Mensaje de búsqueda en el Servidor de Índices .................................... 55 Gráfica 28 Mensaje de búsqueda en el Relay........................................................ 55 Gráfica 29 Presentación de los resultados obtenidos en el Cliente .......................... 56 Gráfica 30 Presentación prestación de servicios en el Servidor de Índices ................ 56 Gráfica 31 Error presentado por la serialización de objetos .................................... 57 Gráfica 32 Comunicaciones entre los Elementos de la red P2P ................................ 60 Gráfica 33 Diagrama de Distribución ................................................................... 61 Gráfica 34 Diagrama de Componentes................................................................. 62 Gráfica 35 Paquete de Aspectos.......................................................................... 64 Gráfica 36 Relación entre la clase y el aspecto...................................................... 66 Gráfica 37 Tejido de un objeto y un aspecto......................................................... 67 Gráfica 38 Ejecución del proceso de tejido ........................................................... 68 Gráfica 39 Vista de la clase tejida ....................................................................... 68 Gráfica 40 Clases independientes luego de la ejecución ......................................... 69 Gráfica 41 Relación de Aspectos y Clases en tiempo de ejecución ........................... 69 Gráfica 42 Paquete cliente ................................................................................. 71 Gráfica 43 Paquete Relay Servicio Web................................................................ 72 Gráfica 44 Paquete Lógica Relay......................................................................... 72

Page 12: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

Gráfica 45 Paquete Directorio Servicio Web.......................................................... 73 Gráfica 46 Paquete Lógica Directorio ................................................................... 74 Gráfica 47 Paquete Tipos ................................................................................... 76 Gráfica 48 Arquitectura a probar con aspectos...................................................... 79 Gráfica 49 Arquitectura a probar sin aspectos ...................................................... 79 Gráfica 50 Plan de Pruebas ................................................................................ 81 Gráfica 51 Código con aspectos, función búsqueda ............................................... 90 Gráfica 52 Código sin aspectos, función búsqueda ................................................ 91

Page 13: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

ÍNDICE DE TABLAS

Tabla 1 Comparación entre los paradigmas [ASTE] ............................................... 13 Tabla 2 Selección de Arquitectura a Implementar. ................................................ 46 Tabla 3 Rangos de Calificación ........................................................................... 46 Tabla 4 Convenciones para métricas de complejidad ............................................. 87 Tabla 5 Resultados obtenidos con la herramienta CCMetrics................................... 88 Tabla 6 Resultados obtenidos con la herramienta devMetrics.................................. 88 Tabla 7 Métricas de Beneficio y Limpieza ............................................................. 88 Tabla 8 Clases adicionales para los aspectos ........................................................ 89 Tabla 9 Total líneas de código por aspecto ........................................................... 89 Tabla 10 Total líneas de código por clase a tejer................................................... 90

Page 14: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

ÍNDICE DE ANEXOS Anexo 1. Comunicación con el soporte de la herramienta Rapier-Loom.Net .......... 113 Anexo 2. Comunicación con el Soporte de la herramienta AspectC# .................... 114 Anexo 3. Comunicación con Mesalem, creador de un Add-in para Visual Studio para el

tejido de aspectos............................................................................ 115 Anexo 4. Migración del add-in de aop en .net con el Ejemplo Observer Pattern ..... 116 Anexo 5. Investigation sobre Desarrollo de .net Compact Framework Aspect Sharp

(aspectsharp.sourceforge.net)........................................................... 119 Anexo 6. Ejemplo desarrollado en Rapier Loom.Net........................................... 121 Anexo 7. Diagramas de Secuencia................................................................... 123

7.1 Caso de Uso: Atender Solicitud.......................................................... 123 7.2 Caso de Uso: Búsqueda Servicios ...................................................... 124 7.3 Caso de Uso: Conectar ..................................................................... 125 7.4 Caso de Uso: Desconectar ................................................................ 126 7.5 Caso de Uso: Enviar Datos................................................................ 127 7.6 Caso de Uso: Publicación de Servicios ................................................ 128 7.7 Caso de Uso: Solicitar Servicio .......................................................... 129

Anexo 8. Especificación del API....................................................................... 130 Anexo 9. Resultados de las Pruebas ................................................................ 210

9.1 Pruebas a los APIs Equipo 1 .............................................................. 210 9.2 Pruebas a los APIs Equipo 2 .............................................................. 211 9.3 Pruebas a los APIs entre los nodos..................................................... 212 9.4 Análisis de Varianza y Media de los resultados..................................... 213 9.5 Gráficas de Resultados de las pruebas................................................ 214

Page 15: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

1

1 INTRODUCCIÓN En la actualidad el desarrollo de sistemas de información se construyen a partir de dos componentes. Estos son los requerimientos funcionales y los requerimientos no funcionales. En el desarrollo de soluciones de sistemas de software se presenta un problema muy frecuente, el cual es, la mezcla entre los módulos que hacen parte de la lógica del negocio y los que corresponden a las necesidades inherentes de la tecnología. La Programación Orientada a Objetos (POO) nos ayuda a modelar e implementar la lógica del negocio de forma muy cercana a la realidad, por lo que ayuda a que el proceso de desarrollo sea más fácil de elaborar, ya que la funcionalidad puede ser expresada fácilmente en objetos que se componen de propiedades y métodos. Pero el inconveniente de la POO es aquellos aspectos que se entrecruzan en varios conceptos a lo largo del sistema, lo cual hace muy complejo su desarrollo. Estos aspectos normalmente están relacionados con los requerimientos no funcionales (Ejemplo: tiempos de respuesta, manejo de memoria, seguridad, auditoria, etc.). La Programación Orientada a Aspectos (POA) es un paradigma que plantea una forma alterna para el modelamiento e implementación de estos aspectos. Para el desarrollo de esta investigación se quiso mostrar la factibilidad del desarrollo de un sistema con requerimientos funcionales y no funcionales, y que fuera analizado, modelado e implementado con la ayuda de POA. El escenario escogido es un API de comunicaciones entre dispositivos móviles. En la primera parte el documento se enuncia los objetivos, tanto el general, como los específicos, que persigue la investigación. Luego se muestra la importancia de la investigación y su porqué. Seguido a esto se hace una breve reseña del estado del arte en materia de POA y del escenario escogido; después se realiza un acercamiento al marco teórico necesario para mostrar las bases teóricas de la investigación. El siguiente aspecto que se trata son las arquitecturas propuestas para el escenario, el desarrollo que se construyó, las pruebas y resultados que se obtuvieron. Y finalmente se enuncian las conclusiones a las que se llegaron y las posibles extensiones de esta investigación.

Page 16: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

2

2 OBJETIVOS Para el desarrollo de este Proyecto de Investigación se han definido una serie de objetivos, partiendo de uno general, que aclara la finalidad de la investigación, el cual se logrará cumpliendo los objetivos específicos.

2.1 OBJETIVO GENERAL

Diseñar un API (Interfaz de Programación de Aplicaciones) de comunicaciones, usando POA basado en Microsoft .NET Compact Framework y comparar el desempeño con el API de JXTA para J2ME.

2.2 OBJETIVOS ESPECÍFICOS

Analizar la viabilidad del desarrollo del API basado en POA y generar las conclusiones respectivas. Crear una aplicación P2P usando el API desarrollado y comparar el desempeño con una aplicación equivalente usando el API de JXTA para J2ME, basados en métricas y mediciones haciendo uso de un estándar de pruebas tipo Benchmark donde se comparen en términos de tiempos de respuesta y la utilización de recursos del dispositivo. Las métricas usadas serán comerciales o se definirán unas propias de ser necesario. Plantear conclusiones del desarrollo de una aplicación nativa en .NET sobre Pocket PC.

Page 17: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

3

3 PROBLEMA U OPORTUNIDAD La tendencia en la informática muestra claramente una inclinación a convertir las herramientas tecnológicas en dispositivos mucho más fáciles de usar, de programar y de portar. La respuesta a esto son los dispositivos móviles, los cuales aportan estas ventajas entre muchas otras, haciendo que el mercado las explote y se creen aplicaciones útiles e innovadoras a un ritmo acelerado. La comunidad de desarrolladores ha tomado en serio los dispositivos móviles, brindando herramientas de programación que permiten crear tanto, las mismas aplicaciones de escritorio, como un mundo nuevo de aplicaciones basándose en sus ventajas, como por ejemplo la transmisión de datos de forma inalámbrica. El paradigma de POA es un concepto que se concibió en la década de los 90 como solución a algunas falencias de POO y a pesar de llevar más de diez años se considera un concepto novedoso. Este paradigma es poco difundido actualmente, se encuentran muy pocas aplicaciones en el mercado que estén basados en él. POA ofrece ventajas adicionales sobre POO, las cuales se pueden aprovechar en desarrollo de aplicaciones en Pocket PC ya que estos dispositivos brindan recursos de memoria y procesamiento limitados. Este nuevo concepto de programación provee una separación transparente entre la arquitectura del sistema y la aplicación desarrollada. El proceso de desarrollo iterativo se vuelve más fluido, como también se pueden hacer más tarde en el ciclo de vida, las decisiones de diseño sin modificar una sola línea de código [JBAO]. El auge de las aplicaciones basadas en arquitecturas de comunicación punto a punto (P2P) también hace parte de una propuesta interesante para las Pocket PC, ya que brindar las ventajas de P2P en forma inalámbrica, es algo novedoso y apenas tratado, en los dispositivos móviles. . La idea de trabajar con la arquitectura P2P es muy interesante puesto que es un modelo donde cada componente es un cliente y servidor al tiempo, lo que permite que se prueben cada componente como parte fundamental de un sistema. Es así como surge la oportunidad de esta investigación, de la combinación de los elementos anteriormente nombrados: POA, dispositivos móviles y la arquitectura P2P.

Page 18: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

4

4 ESTADO DEL ARTE A continuación se presenta una breve introducción a un nuevo paradigma de programación, POA. Se reseñará su historia y se describirán los conceptos elementales, así como ejemplos vigentes de aplicaciones de software que la utilizan. Luego se muestra en que consiste la arquitectura de comunicaciones P2P, sus ventajas frente a las demás y algunos de los ejemplos actuales, tanto herramientas de programación como aplicaciones. Finalmente se describe el estado actual de los dispositivos móviles, sus principales características y las herramientas que existen para programar en estos.

4.1 PROGRAMACIÓN ORIENTADA A ASPECTOS

Usualmente, en el desarrollo de software es necesario encriptar datos, acceder a una base de datos o mostrar un mensaje de texto en pantalla, estos requerimientos no funcionales se traducen en líneas de código repetidas y diseminadas en todo la aplicación. POA, por lo tanto nace de la necesidad de separar la lógica funcional y encapsular la lógica no funcional en aspectos, haciendo que el código de un programa de software sea más fácil de entender, mantener y expandir. A continuación se describe en que consiste POA.

4.1.1 Historia A principios de los años 90, se iniciaron investigaciones sobre reflection y variant strains. Esta investigación involucró casi 10 años de experiencia en el desarrollo de sistemas orientados a objetos, mostrando las limitaciones que trae éste en el desarrollo de sistemas complejos, distribuidos y sistemas donde la flexibilidad es crítica. En el Centro de Investigaciones de Palo Alto PARC de Xerox, un grupo liderado por Gregor Kiczales que empezó con investigaciones en reflection y protocolos de meta objetos fue abarcando las falencias de la POO; esto los fue envolviendo en el desarrollo y conceptualización de POA [SLAU] que junto con la colaboración de Cristina Lopes y Karl J.

Page 19: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

5

Lieberherr [REIN] permitió a los programadores modularizar estructuras transversales en sus códigos. El trabajo de Kiczales y su grupo en AspecJ (extensión de Java que soporta aspectos) comenzó en 1997, el primer usuario externo fue en 1998 y la primera versión de AspectJ fue publicada en el año 2001 [KIC2].

4.1.2 ¿Qué es un Aspecto? “Un Aspecto es una unidad modular que se disemina por la estructura de otras unidades funcionales. Los aspectos existen tanto en la etapa de diseño como en la de implementación. Un aspecto de diseño es una unidad modular que se entremezcla en la estructura de otras partes del diseño. Un aspecto de programa o de código es una unidad modular del programa que aparece en otras unidades modulares del programa” según Kiczales. Un aspecto es una funcionalidad que es factorizada del modulo del cliente y es ejecutada sin mayor conocimiento de la parte del cliente, dónde los métodos se dedican a hacer lo que deben hacer y no incurren en otros aspectos como persistencia, sincronización o seguridad [GARS].

4.1.3 ¿Qué es la Programación Orientada a Aspectos? Es un paradigma de programación, su idea principal es la de separar los aspectos de los componentes, estableciendo toda una metodología para abstraer aspectos en el diseño y desarrollo, con la intención de mejorar la reutilización y encapsulamiento del modulo objetivo y la invocación arbitraria de código. POA puede ser considerada una quinta generación entre los paradigmas de programación “POA es un desarrollo que sigue al paradigma de la orientación a objetos, y como tal, soporta la descomposición orientada a objetos, además de la procedimental y la descomposición funcional. Pero, a pesar de esto, POA no se puede considerar como una extensión de la POO, ya que puede utilizarse con los diferentes estilos de programación“[GARS]. Otros beneficios que trae POA ante sus predecesores son [GARS]:

Page 20: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

6

• Un código menos enredado, más natural y reducido. • La facilidad en la depuración (respecto a la lógica funcional) y

modificación del código. • Un conjunto grande de modificaciones que tiene un impacto mínimo

en el sistema. • Se tiene un código más reusable y que se puede acoplar y desacoplar

cuando sea necesario. • Una mayor facilidad para razonar sobre los requerimientos, ya que

están separadas y tienen una dependencia mínima. Para lograr todo lo anterior POA se basa en las técnicas de reflexión, con el fin de cargar clases en tiempo de ejecución y emitir nuevos objetos producto de la unión de Objetos y Aspectos. Además se debe definir interfaces entre los objetos y los aspectos, las cuales se denominan puntos de corte, estas sirven para indicar el lugar donde entra a actuar el Aspecto. Para mezclarse con los objetos, este proceso es posible gracias a una tercera entidad encargada de hacer el tejido entre Aspectos y Objetos en tiempo de ejecución, denominada tejedor (weaver). “El tejedor se encarga de mezclar los diferentes mecanismos de abstracción y composición que aparecen en los lenguajes de aspectos y componentes ayudándose de los puntos de enlace.” [GARS]

4.1.4 Los aspectos en el diseño La idea es identificar desde el diseño los aspectos; esto genera un grupo de ventajas [YASU].

• Facilita la creación de la documentación y el aprendizaje. • Permite que los desarrolladores tengan una visión de más alto

nivel y ayudando así a que los diseñadores de aspectos y los principiantes puedan aprender y documentar los modelos de aspectos de un modo más intuitivo, pudiendo incluso utilizar herramientas CASE para tener representado el modelado en forma visual

• La facilidad de documentación y aprendizaje influye en la reutilización de la información de los aspectos. Al saber cómo se diseña y cómo afecta a otras clases, es más fácil ver cómo se pueden utilizar de otra forma, lo que incrementaría la reutilización de los aspectos.

Page 21: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

7

La propuesta que se realiza en la denominada UXF (UML Exchange Format, Aspect expansion) es extender el lenguaje para tener en cuenta a los aspectos en la fase de diseño. Esta consiste en añadir nuevos elementos al lenguaje, los cuales representan los aspectos y los puntos de corte, reutilizando elementos ya existentes para la relación clase-aspecto. Actualmente se pueden encontrar en el mercado programas y herramientas de desarrollo para POA. A continuación se presenta algunos de los más importantes.

4.1.4.1 AspectJ

AspectJ extiende al lenguaje Java con una nueva clase de módulos agrupados bajo el paquete “aspecto”. Los aspectos entrecruzan el código descrito en las clases, las interfaces y a otros aspectos. Estos mejoran la separación de requerimientos haciendo posible localizar de forma limpia los puntos de corte. En AspectJ, los aspectos son constructores que trabajan cortando de forma transversal la modularidad de las clases de forma transparente y cuidadosamente diseñada. “Por lo tanto, un aspecto puede afectar a la implementación de un número de métodos en un número de clases, lo que permite capturar la estructura de corte modular de este tipo de conceptos de forma limpia” [GARS].

4.1.4.2 JBoss 4.0

JBoss AOP, es el framework que soporta POA en la versión 4.0. Esta herramienta provee la habilidad de definir y unir los servicios de capa media (Middleware) transparente e implícitamente a POJOs (Plain old Java objects), lo cual se constituye como el plan a largo plazo de JBoss Group [JBOS].

Page 22: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

8

4.1.4.3 Cool

COOL es un lenguaje creado por Xerox, cuya finalidad es la sincronización de hilos concurrentes. El lenguaje base que utiliza es una versión restringida de Java, ya que se han de eliminar los métodos wait, notify y notifyAll, y la palabra clave synchronized para evitar que se produzcan situaciones de duplicidad al intentar sincronizar los hilos en el aspecto y en la clase. En COOL, la sincronización de los hilos se especifica de forma declarativa y, por lo tanto, más abstracta que la correspondiente codificación en Java. COOL proporciona mecanismos para trabajar con la exclusión mutua de hilos de ejecución, el estado de la sincronización, la suspensión con guardas, y la notificación de forma separada de las clases. COOL esta basado totalmente en una implementación de POA, propia de Xerox.

4.1.4.4 Aspectos en .NET

En el framework de .NET existen varias propuestas para incluir extensiones a C# que majen POA ya que Common Lenguaje Runtime (máquina virtual de .net) soporta la introspección y la retrospección, condiciones necesarias para poder construir aplicaciones basadas en aspectos [SCHU], como son el caso de Aspect C#, Rapier LOOM.net, entre otras.

4.2 COMUNICACION ENTRE PARES

La arquitectura P2P, es similar a la tradicional arquitectura cliente-servidor, con la diferencia que los clientes son servidores y los servidores son clientes, además no existe un único servidor. Estas características son explotadas actualmente en Internet con herramientas de intercambio de archivos como Emule, Kazaa, Morpheus, Gnutella etc. A Continuación se describe esta arquitectura y se exponen algunos ejemplos.

Page 23: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

9

4.2.1 Definición La tecnología P2P permite que cualquier dispositivo habilitado para conectarse a la red, pueda dar servicios a otro dispositivo en las mismas condiciones, dando acceso a cualquier recurso que tenga a su disposición. P2P es una extensión del concepto de robustez a través de la descentralización en Internet.

4.2.2 Ventajas La principal ventaja es que P2P distribuye la responsabilidad de proveer servicios entre todos los puntos de la red, además, P2P permite la comunicación mediante una variedad de rutas de la red, reduciendo la congestión y permite prestar servicios con una alta disponibilidad. Los siguientes, son algunos ejemplos de aplicaciones que trabajan con P2P.

4.2.2.1 Kazaa

Kazaa es un programa de difusión gratuita en Internet, con el cual se pueden compartir archivos de música, video y demás. Tiene como base la tecnología P2P y utiliza nodos comunes y supernodos (los cuales sirven para detectar y encontrar archivos por sectores y hacer búsquedas más grandes a nivel mundial). En el mercado existen otros programas que se basan en el mismo principio, por ejemplo: Grokster, Morpheus, LimeWare, eMule, etc.

4.2.2.2 JXTA

JXTA es un conjunto de protocolos para P2P (el nombre es derivado de la palabra "juxtapose", en inglés). Este soporta varios aspectos, como son el descubrimiento de otros dispositivos, servicios y la habilidad de intercambiar información o invocar servicios.

Page 24: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

10

JXTA tiene como lenguaje de implementación Java. JXTA también ha sido implementado para J2ME para crear aplicaciones P2P en dispositivos móviles [JXPR] que incluyen la máquina virtual de java como los celulares de última tecnología y las PDA que utilizan el sistema operativo PALM OS.

4.3 CARACTERÍSTICAS DE LOS DISPOSITIVOS MÓVILES

Los dispositivos móviles hacen parte de la gran familia de los computadores. Normalmente se clasifican como computadores de bolsillo. Sus principales características principales son: • Tamaño: Actualmente existen tres tipos de tamaños promedio entre

estos dispositivos: los que se parecen a un portátil pequeño (Clamshell), los que caben en la palma de la mano (Palm size) y los que cuentan con la funcionalidad de un celular.

• Memoria: Los dispositivos móviles no tienen un disco duro físico,

almacenan la información en tarjetas de memoria RAM y ROM. Dependiendo del tipo de dispositivos, la memoria es más o menos grande, pero limitada en comparación de un computador de escritorio o un portátil.

• Forma de introducir los datos: Algunos funcionan con un esfero, teclado, almohadilla táctil o pantalla de contacto (dependiendo del modelo)

• Sistema operativo: Existen varias familias, Windows, Palm OS y las exclusivas del fabricante.

• Funcionalidad: Pueden guardar información personal, recibir y

enviar correos electrónicos, navegar en Internet, tomar fotos, grabar videos y reproducir música [ENT1].

4.3.1 Pocket PC Entre los PDA existe la familia de los Pocket PC, estos PDA tienen unas particularidades que los diferencian de las otras familias y esas particularidades son:

Page 25: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

11

Tienen mayor velocidad de procesador y aunque su memoria es pequeña en comparación a los computadores, tienen la capacidad de expandirla con tarjetas CompactFlash y Multimedia, donde pueden alcanzar tamaños apropiados para el manejo de aplicaciones medianas. Además poseen tanto procesador como un sistema operativo estándar [ENT2]

4.3.2 Framework de desarrollo Entre los entornos para el desarrollo de aplicaciones en dispositivos móviles se destacan J2ME y Compact Framework.

4.3.2.1 J2ME El entorno de desarrollo de Java, presenta una serie de clases ya implementadas que hacen posible el desarrollo de aplicaciones sobre cualquier dispositivo móvil, ya que es independiente de la plataforma sobre la cual se desarrolla. El principal inconveniente de este Framework es su ineficiencia frente a su competidor Microsoft Compact Framework .NET, pues como J2ME debe ajustarse al sistema operativo donde se este utilizando las aplicaciones (lenguaje interpretado), requiere más tiempo de procesamiento en el dispositivo móvil [SLIW].

4.3.2.2 Compact Framework Este entorno es propiedad de Microsoft. Los programas que son desarrollados en este Framework requieren tener el sistema operativo Windows CE o Windows Mobile 2003. El entorno .NET Compact Framework emplea una versión aproximada de la versión completa de Microsoft .NET (para desarrollo de aplicaciones en computadores de escritorio). Se puede implementar aplicaciones en lenguajes C#, Visual Basic, Visual C, C++.

Page 26: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

12

4.3.3 Emuladores Existen programas que puede imitar el comportamiento de los dispositivos móviles y estos se utilizan en el desarrollo de aplicaciones, pues es mucho más práctico probar inicialmente en estos y luego en el dispositivo físico. Los emuladores se pueden configurar para que tengan las disposiciones de memoria y procesador cercanas a los dispositivos, pero es muy común, que en el emulador corra de mejor forma un programa que el dispositivo real.

Page 27: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

13

5 MARCO TEÓRICO A continuación se describen las bases teóricas de POA y sus etapas para la implementación. Adicionalmente se muestran las herramientas encontradas para el trabajo de POA sobre Microsoft .NET y en el Compact Framework. También se expone la herramienta para implementar aplicaciones P2P en dispositivos móviles JXME, modelo basado en JXTA.

5.1 CONCEPTOS BÁSICOS DE LA PROGRAMACIÓN ORIENTADA A

ASPECTOS

Tabla 1 Comparación entre los paradigmas [ASTE]

POA tiene sus inicios en la Programación Adaptativa, la cual se basa en la separación de conceptos (según Walter Hürsch y Cristina Lopes es un nuevo paradigma), que nacen de la necesidad de satisfacer requerimientos especiales de una aplicación, como lo son tiempo real, persistencia y distribución, entre otros; o también cuando se desea optimizar los algoritmos básicos de computación, como el control de

Page 28: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

14

localización o la distribución [LOPE]. La mayoría de los artículos que hablan de las fases de análisis y diseño de POA utilizan la separación de conceptos o (Separation of Concerns) para identificar los aspectos que entrecruzan (crosscutting) una aplicación desarrollada bajo este paradigma [CLAR], así entonces, se puede decir que los aspectos se clasifican en conceptos específicos [LOPE]. “Las ‘6 C’, de Mehmet Aksit, hacen referencia a los seis características cuyos nombres en inglés comienzan con la letra ‘c’ y que son los siguientes: Entrecruzado: Un concepto se entrecruza con varias partes del sistema. Canónico: Brindar una implementación estable para los conceptos. Composición: Proveer factores de calidad, como adaptabilidad, reusabilidad y extensibilidad. Clausura: Mantener los factores de calidad del diseño en la etapa de implementación. Computabilidad: Crear un software ejecutable. Certificabilidad: evaluar y controlar la calidad de los modelos de diseño e implementación. Las “4 S” hacen referencia a conceptos sobre separación exitosa, de Harold Ossher, y corresponden a: Simultáneo: La coexistencia de diferentes composiciones son importantes. Auto-Contenido: Cada módulo debe declarar sus dependencias, para poder entenderlo individualmente. Simétrico: No debe haber distinción en la forma en que los diferentes módulos encapsulan los conceptos, para obtener una mayor confiabilidad en la composición. Espontaneidad: Debe ser posible identificar y encapsular nuevos conceptos, y aún nuevas formas de conceptos que se presenten durante el ciclo de vida del software.”[ASTE]

5.2 PROGRAMACIÓN ORIENTADA A ASPECTOS

El paradigma de POA no solo tiene impactos en la etapa de implementación de un proyecto de software, sino que también cambia la

Page 29: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

15

manera de analizar y diseñar. A continuación, se exponen las etapas de análisis y diseño en el ciclo de vida de un proyecto de software.

5.2.1 Análisis Para identificar los aspectos que inciden en un sistema podemos basarnos en las preposiciones de Walter Hürsch y Cristina Lopes, quienes exponen como identificar y visualizar los conceptos; para esto, se tienen dos clases: Los Conceptos Básicos que se deben separar de los otros conceptos ya que representan el dominio de la aplicación y proveen la funcionalidad del sistema, por tal motivo deben estar separados de otros aspectos de la computación como la persistencia, la seguridad, alta disponibilidad, entre otros. Los Conceptos de Propósito Especial son usados para administrar y optimizar los Conceptos Básicos [LOPE]. Muchas veces los Conceptos de Propósito Especial satisfacen requerimientos no funcionales que se entremezclan en el código y traen problemas como baja reutilización y difícil mantenimiento. Es así como los aspectos se pueden clasificar dentro de los Conceptos de Propósito Especial y los componentes (objetos, métodos, procedimientos) en los Conceptos Básicos. Un componente puede ser claramente encapsulado en un procedimiento generalizado, mientras que un aspecto no [KICZ] Un procedimiento generalizado según Gregor Kickzales y su grupo, brinda un marco adecuado que facilita y clarifica la definición de un aspecto. Lo que propone es agrupar los lenguajes orientados a objetos, los proceduales y funcionales como lenguajes de procedimiento generalizado (LPG), ya que sus mecanismos claves de abstracción y composición pueden verse como agrupados bajo una misma raíz. Esa raíz tendría la forma de un procedimiento generalizado [ASTE]. Entonces, el análisis busca primero identificar los conceptos, luego clasificarlos en Básicos o de Propósito Especial. Con los conceptos de Propósito Especial se identifican los aspectos que entrecruzan el sistema.

Page 30: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

16

Gráfica 1 Descomposición de conceptos, Analogía del Prisma [LADD]

La gráfica 1 muestra la analogía de un haz de luz, en este caso, los requerimientos de un sistema que pasan a través de un prisma identificador de conceptos y se descompone en cada uno de los conceptos que debe brindar el sistema (seguridad, autenticación, persistencia, lógica del negocio). De esta forma, se ilustra el proceso de desarrollo de conceptos [LADD].

5.2.2 Diseño En el Lenguaje de Modelado Unificado (UML por sus siglas en inglés) ofrece una Separación de Conceptos con la descomposición del sistema entre cuatro principales dimensiones: funcional (modelo de casos de uso), estática (diagramas de clases y paquetes), dinámica (diagramas de secuencia, colaboración, actividad y estado) y física (diagramas de componentes y despliegue) [MIHO]. En UML, los diagramas de interacción (diagramas de secuencia y colaboración) son usados para modelar los aspectos dinámicos de un sistema, modelando (en muchas situaciones) el flujo de control de un escenario en particular [BOOC]. Por tal motivo son los sugeridos a la hora de mostrar el diseño del sistema frente a los aspectos que entrecruzan el diseño (lógica no funcional). Una implementación basada en POA consiste en: [KICZ] [ASTE]

• El lenguaje base o componente para programar la funcionalidad. • Uno o más lenguajes de aspectos para especificar los aspectos

mismos. • Un tejedor de aspectos para la combinación de los lenguajes (base

y aspectos).

Page 31: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

17

• El programa escrito en el lenguaje componente que implementa los componentes.

• Uno o más programas de aspectos que implementan los aspectos mismos.

Diseñar un sistema con base en los aspectos, requiere entender qué se debe incluir en el lenguaje base, qué se debe incluir dentro de los lenguajes de aspectos y qué debe compartir entre ambos lenguajes. El lenguaje componente debe proveer la forma de implementar la funcionalidad básica y asegurar que los programas escritos en ese lenguaje componente, no interfieran con los aspectos. Los lenguajes de aspectos tienen que proveer los medios para implementar los aspectos deseados de una manera intuitiva, natural y concisa [KICZ] [ASTE]. Adicionalmente el diseño debe especificar los puntos de corte y como el tejedor de aspectos combina los dos conceptos. Esta tarea se hace mediante reflexión, por tal motivo el tejedor de aspecto debe estar implementado con un lenguaje que utilice una máquina virtual.

5.3 SOPORTE DE LA PROGRAMACIÓN ORIENTADA A ASPECTOS

EN .NET

AspectJ es conocido como el principal API para la implementación de aspectos, esta basado en java y ha venido evolucionando desde el año 2001. Microsoft .NET no posee un proyecto de la trayectoria de AspectJ, pero cuenta con varias herramientas las cuales serán detalladas a continuación.

5.3.1 Aspectos en C# Existen varios proyectos y herramientas que intentan dar soporte a POA, los cuales pueden ser utilizados junto con el Framework de Microsoft.Net. Estos proyectos brindan soporte para declarar los Aspectos, puntos de corte y mecanismos de tejido; este últimos se puede hacer de manera dinámica o estática. Se basan en declaraciones en XML o en meta data, a través de atributos. Por lo general todos estos proyectos permiten implementar Aspectos en cualquier lenguaje soportado por el Framework de Miscrosoft.Net.

Page 32: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

18

Durante el transcurso de esta investigación se han abordado los siguientes proyectos:

5.3.1.1 RAPIER-LOOM.NET [RLOM]:

Es un framework de desarrollo que soporta tejido dinámico y estático. Un tejido estático sucede cuando un aspecto teje por completo un objeto sin discriminar métodos, mientras que un tejido dinámico se permite seleccionar que métodos se desea interceptar para luego tejer. La principal ventaja de Rapier-Loom.NET es que no necesita un compilador adicional y no se necesita aprender una sintaxis específica. Esta basado en carga de propiedades en tiempo de ejecución, mediante el uso de la librería System.Reflection.Emit. La principal desventaja de Rapier-Loom.Net es que no se cuenta con un código fuente sino con assemblies dll. Un ejemplo que se desarrollo en el proyecto para probar RAPIER-LOOM .NET para probar su funcionalidad se anexa en la parte 6 Para codificar aspectos con C#.Net se debe referenciar la librería Loom al proyecto asociado, y se debe decir en qué lugar del programa (en este caso un método) se van a hacer los puntos de corte. Luego se declara un objeto que implementa la clase “Aspecto” (que provee Loom) y al instanciar las clases que tienen puntos de corte se hace una petición a una tejedora para obtener el objeto tejido, esto se realiza construyendo proxys dinámicos (apoderado construido en tiempo de ejecución) que capturan las llamadas al objeto y, según se especifique, llaman al aspecto antes o después de realizar la acción sobre el método.

5.3.1.2 ASPECT# [ASP#]: Al igual que Rapier-Loom, Aspect# es un framework de desarrollo que soporta tejido estático, su principal ventaja es que no necesita un compilador adicional y no se necesita aprender una sintaxis especifica. Trabaja la implementación de Proxies Dinámicos de Avalon, Primera implementación de DinamicProxy en .Net., los cuales están construidos con System.Reflection.Emit. Otras de las ventajas significativas de Aspect# es que, a diferencia de Rapier-Loom.Net, se puede utilizar el código fuente para extender su funcionalidad.

Page 33: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

19

En los dos proyectos anteriores es necesario proveer una interfaz que defina los métodos en donde se realizarán los cortes, debido a que el Aspecto se relaciona con las interfaces y no con objetos concretos. Adicionalmente se debe hacer explícito en qué parte se encuentra el Aspecto. Para tener un mejor entendimiento del manejo de éste framework para aspectos, se hace una explicación en el anexo #5 acerca del desarrollo del ejemplo de ASPECT#.

5.3.1.3 ADD-IN DE MESALEM [ADDM]:

Es un plugg-in para Visual Studio.Net que permite crear clases de tipo Aspecto y un descriptor de éste, en formato XML. Provee un compilador adicional que se encarga de hacer el tejido según lo indique el Archivo descriptor, el cual debe ser único para todos los aspectos. Además es posible agregar métodos o miembros en tiempo de ejecución. Su principal desventaja es que no se cuenta con un código fuente, sino con assemblies dll, debe utilizar un compilador adicional y esta acoplado al IDE de Microsoft. Un ejemplo que se desarrollo con el Add-in de Messalem para probar su funcionalidad se anexa en la parte 4

5.3.2 Aspectos en Compact Framework Compact Framework es las versión de Microsoft .NET para dispositivos móviles, que tiene base en el mismo conjunto de librerías del Framework .NET, sin embargo librerías importantes como Remoting, para el manejo de procesos distribuidos y Emit para emisión de código en tiempo de ejecución, no fueron incluidas. A continuación analizaremos el impacto de la librería EMIT (System.Reflection.Emit) en la implementación de aspectos y tejedoras en Pocket PC.

5.3.2.1 El Namespace SYSTEM.REFLECTION.EMIT

Según Microsoft, el Namespace (agrupación lógica de clases) System.Reflection contiene clases e interfaces que proporcionan una vista administrada de los campos, métodos y los tipos cargados, con la

Page 34: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

20

posibilidad de crear e invocar tipos dinámicamente mediante la emisión de meta datos y el Lenguaje intermedio de Microsoft (MSIL). Éste namespace facilita el manejo de reflexión en aplicaciones implementadas con la tecnología de .Net. Estos conjuntos de clases hacen de la implementación de soluciones basadas en reflexión, más fáciles de construir, por tal motivo las herramientas que soportan aspectos en .Net utilizan System.Reflection.Emit frecuentemente, ya sea para generar Proxies dinámicos, que capturen llamados en tiempo de ejecución, o para manipular dinámicamente el meta data.

5.3.2.2 RAPIER-LOOM.NET

Según el Soporte de Rapier-Loom.Net [KAIK]. (ver anexo #1), Compact Framework no puede soportar Rapier-Loom.net ya que su implementación esta fuertemente basada en el Namespace System.Reflection.Emit el cual no es soportado actualmente por Compact Framework. La utilización de Rapier-Loom.Net depende directamente de la arquitectura que se vaya a emplear, ya que si utilizamos alguna arquitectura que delegué la responsabilidad de los aspectos, sería posible adaptar el API bajo algunos criterios expuestos más adelante. Las pruebas realizadas y los cometarios en Internet [RLOM] hacen de ésta una herramienta madura y robusta.

5.3.2.3 ASPECT#

Este Framework utiliza el Proyecto de Avalon, el cual se basa en el Namespace System.Reflection.Emit. Al igual que Rapier-Loom.Net, la utilización de ASPECT# depende directamente de la arquitectura, ya que si el manejo de aspectos reside directamente en los dispositivos Pocket PC no es posible emplear ASPECT# en el API de comunicaciones.

Page 35: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

21

5.3.2.4 ADD-IN DE MESALEM

Según Mesalem (Ver Anexo #3), no hay ningún problema a la hora de implementar aspectos con el add-in. Se desarrolló una aplicación para probar la estructura de Mesalem en una Pocket PC, el resultado fue satisfactorio, sin embargo esta aplicación era bastante sencilla. La aplicación que se desarrollo sobre una Pocket PC consistía en imprimir un mensaje de “Hola Mundo” (este mensaje es un servicio encapsulado en un aspecto) antes de realizar una operación de copiado entre una caja de texto y otra. Luego se implementó una aplicación con manejo de hilos y sockets, la cual no funcionó, no se pudo resolver los errores ya que no es una herramienta comercial y su soporte es precario, adicionalmente se comprobó que no es estable ya que posee muchos bugs, por ejemplo no muestra ni los errores de compilación ni los del archivo descriptor.

5.4 HERRAMIENTA PARA EL DESARROLLO DE APLICACIONES

BASADAS EN ARQUITECTURAS P2P PARA DISPOSITIVOS

MÓVILES

Entre los proyectos de arquitecturas P2P se destaca el API de JXTA, dedicado a implementar soluciones basadas en la comunicación directa entre nodos de una red. A continuación veremos la descripción de JXME, su arquitectura se puede convertir en un modelo a adoptar en los API de comunicaciones para dispositivos móviles.

5.4.1 JXME JXME es la implementación de JXTA también para J2ME que permite crear aplicaciones P2P en dispositivos móviles que soporten la máquina virtual de Java. El propósito del proyecto JXTA para J2ME es proporcionar funcionalidades compatibles de JXTA en los dispositivos móviles, usando Connected Limited Device Configuration (CLDC) y el Mobile Information Device Profile (MIDP). La gama de dispositivos que se incluyen están desde los teléfonos menos potentes hasta las PDA’s más

Page 36: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

22

potentes. Usando JXTA para J2ME, cualquier dispositivo de MIDP puede participar en actividades de P2P con otros dispositivos de MIDP. Igualmente, un dispositivo de MIDP puede participar, con algunas restricciones, en actividades P2P con los pares de JXTA que funcionan en computadores, estaciones de trabajo y servidores. J2ME provee perfiles especiales diseñados para soportar los recursos limitados de los dispositivos móviles. Uno es el CDLC y el MIDP. Las anteriores son el núcleo de librería de clases y APIs especialmente diseñadas para trabajar en ambientes (limitados) de dispositivos móviles. Así que estos dos perfiles brindan las herramientas necesarias para crear poderosas aplicaciones del mundo Java [AROR]. Las falencias de MDIP radica en librerías limitadas, como reducción en los parsers de XML, solamente permite http de salida, no hay soporte para la seguridad. Estas limitaciones influyen en JXME ya que los dispositivos móviles actúan como pares o puntos finales que utilizan proxies para tener interoperabilidad con los protocolos de JXTA, desarrollan actividades de crear grupos y descubrir pares para los dispositivos conectados a él, igualmente para hacer parte de ellos, filtrar el trafico de JXTA y optimizar los anuncios. Su funcionamiento radica en un punto Wireless1 que envía una petición de descubrimiento a su correspondiente JXTA Relay. Éste a su vez propaga el mensaje por JXTA actuando como un proxy. Todas las respuestas son recolectadas por el Relay, el cual ajusta o compacta éstas para optimizar la transferencia, ya que estos dispositivos poseen un bajo ancho de banda, mientras tanto el par Wireless1 periódicamente le pregunta al Relay por respuestas. El Relay de JXME no es una implementación novedosa, ya son usados para acceder a JXTA a través de un firewall. Y no es lo mismo que un cliente servidor, ya que no existe una relación estática entre el punto y el Relay. Para que se comuniquen dos puntos, no es necesario que hagan parte del mismo Relay. Adicionalmente, un punto Wireless1 puede dinámicamente cambiar su Relay o tener múltiples Relays.

Page 37: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

23

Gráfica 2 Arquitectura de JXME [AROR]

Page 38: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

24

6 PROCESO DE DESARROLLO La investigación utilizó un proceso de desarrollo en cascada, pasando por las etapas de análisis, diseño, implementación y pruebas. En la etapa de diseño, fue necesario seleccionar una arquitectura para soportar la tecnología de Servicios Web (Web Services) en el API, ya que las demás tecnologías de manejo de procesos distribuidos no tienen soporte en Compact Framework. Para expresar cada uno de los artefactos del proceso de desarrollo, se empleó UML como lenguaje de modelado. En la etapa de análisis se emplearon los casos de uso, los que facilitan el entendimiento de los 7.requerimientos funcionales del API. Con esto se evita que se confunda el fin de un aspecto (que es encapsular la lógica no funcional del sistema) con el de un objeto (el cual debe representar la lógica funcional). En la etapa de diseño se utilizaron los diagramas de arquitectura, distribución, clases y de secuencia para la definición del desarrollo que se implementará. Finalmente en la etapa de pruebas se comparó el desempeño del API desarrollado en esta investigación, contra un API sin aspectos.

6.1 ETAPA DE ANÁLISIS

El API de comunicaciones para dispositivos móviles Pocket PC, es una investigación que busca mezclar nuevas tendencias en el mundo de la tecnología, poniendo en prueba bajo un contexto específico a POA. Se describen los requerimientos que deben satisfacer el API, con el fin de que futuros desarrollos puedan utilizarlo bajo la arquitectura P2P, así mismo como los requerimientos no funcionales descritos.

6.2 REQUERIMIENTOS FUNCIONALES

A continuación, se hará un análisis de cada uno de los casos de uso identificados en el levantamiento de los requerimientos funcionales del API para comunicaciones P2P. Esta documentación establecerá la interacción entre el actor y el sistema.

Page 39: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

25

Conectar a la redP2P

Publicar Servicio

Buscar Servicio

Desconectar de laRed

Nodo

Consumir Servicio

Enviar Datos

«extends»

«extends»

«extends»

«extends»

«uses»

«uses»

Gráfica 3 Diagrama de Casos de Uso

Como se puede observar en la gráfica 3, el actor principal sobre el cual se muestra la especificación de los requerimientos funcionales, es el nodo que hace parte de la red P2P. El sistema inicia su funcionamiento partiendo desde el caso de uso “Conectar a la Red”. Luego el usuario del sistema, en este caso un Nodo de la red P2P, puede realizar varias acciones: “Buscar Servicio”, “Desconectar de la Red”, “Publicar Servicio” y “Consumir Servicio”. Estos dos últimos casos de uso permiten extender su funcionalidad para pasar al evento de “Enviar Datos” entre los Nodos. A continuación la descripción de cada uno de éstos.

6.2.1 Conectar a la Red P2P Breve Descripción El nodo se conecta para poder utilizar los servicios que le ofrece la red. Flujo de Eventos Paso 1: Iniciador del Caso de Uso Nodo Pocket PC. Paso 2 El nodo le pide al Relay se le autorice el acceso a la red P2P. Mandándole como parámetro la dirección del dispositivo móvil en la red.

Page 40: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

26

Paso 3 El sistema registra el nuevo nodo en la red P2P. Tanto el Relay como el Directorio deben actualizar sus registros de nodos. Paso 4 El Relay le informa al nodo el resultado exitoso del ingreso a la red. Flujos Alternativos Primer Flujo Alternativo En caso en que el nodo no pueda establecer una comunicación con el Relay, se informará del error al usuario. Segundo Flujo Alternativo En caso en que el Relay no pueda establecer una comunicación con el Servidor de Índices, le informará el error al usuario. Requerimientos Especiales El nodo debe tener conexión con su Relay, del mismo modo, debe estar sujeto a una red TCP/IP. Precondiciones No Tiene alguna. Poscondiciones El nodo es creado y tiene a su disposición los servicios de la red P2P. Puntos de Extensión Cuando el nodo se encuentre conectado, este puede llamar a algunos de los siguientes casos de uso:

• Publicar Servicio • Buscar Servicio • Consumir Servicio • Desconectar de la Red

6.2.2 Publicar Servicio Breve descripción El nodo ofrece un servicio que puede ser consultado y consumido por cualquier nodo de la red.

Page 41: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

27

Flujo de Eventos Paso 1: Iniciador del Caso de Uso Nodo Pocket PC. Paso 2 El nodo le pide al Sistema por medio del Relay que sea publicado un servicio que reside en el nodo, éste debe tener una descripción, la cual es necesaria para poder ejecutar búsquedas sobre ese servicio Paso 3 El Sistema ingresa en el Directorio el nuevo servicio, actualizando la lista de servicios que ofrecen los nodos de la red P2P. Paso 4 El Sistema le envía un mensaje de éxito al nodo. Flujos Alternativos Primer Fluido Alternativo En caso en que el nodo no pueda establecer una comunicación con el Relay, se informará del error al usuario. Segundo Flujo Alternativo En caso en que el relay no pueda establecer una comunicación con el Servidor de Índices, le informará el error al usuario. Tercer Flujo Alternativo En caso en que el nodo quiera publicar un servicio que ya se encuentra registrado, el sistema descartará este evento. Requerimientos Especiales Primer Requerimiento Especial El nodo debe tener conexión con su Relay, así mismo, debe estar sujeto a una red TCP/IP. Segundo Requerimiento Especial El servicio deberá estar en disposición de uso de cualquier componente de la red P2P para su atención.

Page 42: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

28

Precondiciones El nodo previamente debe estar conectado a la red P2P. Poscondiciones El nodo ofrece un servicio que es conocido por la red P2P Puntos de Extensión No tiene alguna.

6.2.3 Buscar Servicio Breve Descripción El nodo realiza la búsqueda de un servicio según su descripción. Flujo de Eventos Paso 1: Iniciador del Caso de Uso Nodo Pocket PC. Paso 2 El nodo le pide al Sistema por medio del Relay, buscar los nodos que prestan un servicio, a partir de una descripción contenida en el nombre del servicio. Paso 3 El Sistema realiza la búsqueda de los nodos que prestan el servicio. Paso 4 El Sistema le envía la información de los nodos que prestan servicios que contienen esa descripción en el nombre. Flujos Alternativos Primer Fluido Alternativo En caso en que el nodo no pueda establecer una comunicación con el Relay, se informará del error al usuario. Segundo Flujo Alternativo En caso en que el Relay no pueda establecer una comunicación con el Servidor de Índices, se le informará el error al usuario. Tercer Flujo Alternativo En caso que no se encuentren resultados, el sistema informará al usuario de este evento.

Page 43: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

29

Requerimientos Especiales El nodo debe tener conexión con su Relay, así mismo, debe estar sujeto a una red TCP/IP. Precondiciones El nodo previamente debe estar conectado a la red P2P. Poscondiciones El nodo obtiene los resultados de la búsqueda, donde se muestran los nodos que prestan los servicios buscados. Puntos de Extensión No tiene alguna.

6.2.4 Consumir Servicio Breve Descripción El nodo consume el servicio prestado por otro nodo en la red. Flujo de Eventos Paso 1: Iniciador del Caso de Uso Nodo Pocket PC. Paso 2 Una vez el nodo tenga la información de la ubicación del servicio que es solicitando en la red, el nodo le pide a su par el servicio deseado. Paso 3 El par que posee el servicio, le provee, del servicio al nodo solicitante. Flujos Alternativos En caso en que el nodo no pueda establecer conexión con el par, el sistema le informará del error. Requerimientos Especiales El nodo solicitante debe tener conexión con el par en una red TCP/IP. Precondiciones El nodo par u oferente al igual que el nodo solicitante debe estar previamente conectado a la red P2P. Poscondiciones El nodo solicitante consume el servicio ofrecido por el nodo oferente.

Page 44: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

30

Puntos de Extensión No tiene alguno.

6.2.5 Desconectar de la Red Breve Descripción El nodo se desconecta de la red y el sistema elimina su referencia del directorio de búsquedas. Flujo de Eventos Paso 1: Iniciador del Caso de Uso Nodo Pocket PC. Paso 2 El nodo le pide al sistema que sea desconectado de la red. Paso 3 El sistema elimina las referencias y los servicios ofrecidos por el nodo. Flujos Alternativos En caso en que el nodo no pueda establecer conexión con el Relay, el sistema le informará del error. Requerimientos Especiales No tiene alguno. Precondiciones El nodo debe estar previamente conectado a la red P2P. Poscondiciones El sistema libera las relaciones con el nodo desconectado. Puntos de Extensión No tiene alguno.

6.2.6 Enviar Datos Breve Descripción El nodo servidor le envía al nodo cliente datos mediante un canal.

Page 45: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

31

Flujo de Eventos Paso 1: Iniciador del Caso de Uso Nodo Pocket PC. Paso 2 El nodo servidor le envía al nodo cliente los datos solicitados. Paso 3 El nodo cliente recibe los datos enviados por el nodo servidor y los procesa. Flujos Alternativos En caso que exista un error en la comunicación de los datos, el sistema despliega un error para el nodo cliente y para el nodo servidor. Requerimientos Especiales El nodo cliente y servidor debe tener establecido un canal TCP/IP sobre el cual viajarán los datos. Precondiciones El nodo cliente debe informar previamente al nodo servidor que datos específicos desea que se le envíen. Poscondiciones El nodo cliente recibe los datos enviados por el nodo servidor Puntos de Extensión No tiene alguno.

6.3 REQUERIMIENTOS NO FUNCIONALES

Se entiende como lógica no funcional la escalabilidad, transparencia en la localización de servicios, soporte, concurrencia, disponibilidad, seguridad, rendimiento, tiempos de respuesta; requerimientos que inciden directamente en el desarrollo de un sistema. Los requerimientos descritos a continuación se seleccionaron a partir de las necesidades que debe suplir el API, y que no se cubren con los requerimientos funcionales. Los requerimientos no funcionales que se desarrollarán para esta investigación, son:

Page 46: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

32

• Auditoria de Mensajes: Este requerimiento busca crear un Log de

sucesos de la red P2P, con el fin de que el administrador de la red pueda contar con esta herramienta para diagnosticar problemas y formular posibles soluciones, así mismo, puede hacer mediciones sobre la carga de la red, las horas de tráfico pesado y estadísticas sobre los servicios que se solicitan de forma más frecuente.

• Optimización de búsquedas: Es necesario que las búsquedas de

servicios que realizan los nodos de la red sean eficientes en tiempos de respuesta, adicionalmente, es deseable que las máquinas servidor gasten pocos recursos.

• Controlar El periodo de inactividad de los nodos: Si un cliente

está inactivo en la red, el sistema debe desconectar el nodo para evitar que consuma recursos de los servidores.

• Encriptación: Es necesario utilizar algoritmos de encriptación de los

datos que garanticen la privacidad de la información que viaja en la red P2P.

Page 47: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

33

7 ARQUITECTURAS PROPUESTAS P2P es una arquitectura de comunicación que puede ser implementada de diferentes maneras. Por ejemplo, JXME exige que se incorpore un Relay que actué como Proxy de un conjunto de dispositivos móviles, con el fin de delegar procesamiento a un servidor y no agotar los recursos del dispositivo móvil. A continuación se muestran los criterios para escoger la arquitectura adecuada para el caso de estudio y cuales opciones surgen, expresadas en un diagrama de arquitectura y en uno de secuencia. Al finalizar esta sección se escoge una arquitectura, la cual se implementará en el desarrollo del API.

7.1 CRITERIOS PARA ESCOGER Y EVALUAR LAS DIFERENTES

ARQUITECTURAS

Como objetivo especifico de la primera etapa del Proyecto de Investigación, se pretende establecer el diseño de la arquitectura y del API de comunicaciones. Para escoger y evaluar la decisión que se va a tomar, se cuenta con los siguientes criterios:

• Posible disponibilidad de un código abierto para la implementación de los aspectos, pues nos ayudaría a independizar esta parte con el API en concreto.

• Flexibilidad en la forma de la creación de servicios y fácil

extensibilidad del API para futuras implementaciones. • Baja complejidad en la construcción y futuro mantenimiento del

API. • Agilidad en la adquisición de conocimientos en la curva de

aprendizaje. • Uso de recursos físicos (memoria, procesador) donde se

implementarán los servicios del API.

Page 48: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

34

• El uso de la comunicación y del canal de red, distribución de la carga, y flujo de paquetes.

• Parte técnica: qué existe en POA que sea soportado por Compact

Framework para brindar servicios de comunicación.

7.2 OPCIONES DE ARQUITECTURAS PARA IMPLEMENTAR P2P EN

DISPOSITIVOS MÓVILES

Existe una forma conocida para implementar soluciones P2P en dispositivos móviles y es la planteada por JXME, la cual es basada en Relays. Según el documento de MSDN Magazine. “NET P2P: Writing Peer-to-Peer Networked Apps with the Microsoft .NET Framework” [OLSN] las maneras de implementar P2P son: • P2P puro. • P2P con servidor de descubrimiento simple. • P2P con servidor de descubrimiento y búsquedas. • P2P con servidor de descubrimiento, búsquedas y contenido. A continuación se describirá cada una de las opciones de implementación de la arquitectura P2P. JXME es una implementación P2P pura, sin embargo, la comunicación entre la red y los dispositivos móviles se hace a través de Relays. Con lo cual no se quiere decir que es la única manera de montar P2P en dispositivos móviles.

Page 49: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

35

7.2.1 Arquitectura Basada en Relays

Puntos Wireless Red P2P Puntos Wireless

Relay Relay

Aplicación Servidor conServicios Basados en Aspectos

Aplicaciones Cliente

Aplicaciones Cliente

Gráfica 4 Diagrama de Arquitectura Basada en Relays Un patrón Proxy provee un sustituto u objeto que asume el lugar de otro, que controla el acceso al objeto el cual se esta reemplazando [GAMM]. Esta es la filosofía de los Relay, en donde reside los servicios que resultarían pesados (en términos de recursos de máquina) en los dispositivos móviles.

Page 50: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

36

Gráfica 5 Diagrama de Secuencia Arquitectura Basada en Relays

El anterior diagrama de secuencia muestra la comunicación entre dos puntos de la red P2P. El primer punto busca el servicio en la red preguntando a los demás puntos, a través de su Relay, una vez que se ha encontrado el servicio el punto que los posee se le retorna.

7.2.2 P2P Pura

Red P2P

Gráfica 6 Diagrama de Arquitectura P2P Puro

Page 51: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

37

Gráfica 7 Diagrama de Secuencia Arquitectura P2P Puro

Una arquitectura P2P pura es aquella que descubre de manera dinámica los demás puntos, de esta forma consigue los servicios que se desea, para ello es usual utilizar una comunicación broadcast. En el diagrama de secuencias anterior se muestra como un punto se desea conectar a la red P2P, para esto el punto tiene la responsabilidad de recorrer la red buscando a cada uno de los puntos notificándoles su llegada. Los demás deben actualizar su caché con el nuevo punto, igualmente el punto que se acaba de conectar actualiza su caché. Luego, cuando el punto desea buscar un servicio, éste debe recorrer el caché para obtener la dirección de los demás puntos e ir a preguntarle a cada punto si posee el servicio. Una vez encontrado servicio se obtiene directamente entre los dos puntos. Esta solución elimina los Relay lo que implica que los servicios van a residir en los dispositivos móviles. Como los servicios que se pretenden

Page 52: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

38

prestar van a estar tejidos con aspectos, la implementación de esta arquitectura utilizando Compact Framework no es posible, debido a las limitantes tecnológicas. Por ejemplo, la ausencia del Namespace System.Reflection.Emit.

7.3 INTEGRACIÓN DE LAS ARQUITECTURAS P2P

A continuación se analizarán las ventajas y desventajas de cada una de las posibles arquitecturas que podría adoptar el API de comunicaciones, basados en los criterios expuestos anteriormente en este documento y en los modelos P2P para dispositivos móviles (Arquitectura basada en Relays y P2P pura) Se prescindió de la arquitectura basada en servidores de contenido, ya que es bastante ineficiente. Esto se debe a que el servidor es el encargado de obtener cada uno de los servicios que se van a publicar; lo que implica que cada vez que se conecta un punto al servidor, éste debe descargar todos los servicios que va publicar. Si estos servicios fueran archivos, en algún momento el servidor se desbordaría en su capacidad, lo que implica que esta solución está limitada por la capacidad del servidor.

Page 53: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

39

7.3.1 P2P Puntos Comunicados por Relay

Red P2P

RelayRelay

Gráfica 8 Diagrama de Arquitectura P2P Puntos Comunicados por Relay

Esta arquitectura implementa una solución P2P pura, pero la comunicación entre los dispositivos móviles y la red P2P se hace a través de Relays, estos liberarán de servicios pesados (en términos de recursos de máquina) a los dispositivos móviles.

Page 54: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

40

Gráfica 9 Diagrama de Secuencia Arquitectura P2P Puntos Comunicados por

Relay Cuando un dispositivo móvil se desea conectar a la red P2P debe notificar a su Relay, éste se encarga de notificar a los demás puntos utilizando los protocolos P2P establecidos y brindándole al mensaje servicios de conexión, transmisión, búsquedas y seguridad entre otros. Una vez se ha notificado a todos los puntos de la red que se ha conectado el dispositivo móvil, estos actualizan su caché y finalmente el dispositivo móvil también debe actualizar su caché. Cuando el dispositivo móvil quiere hacer una búsqueda en la red, éste debe recorrer cada una de las direcciones almacenadas en el caché y con la ayuda del Relay preguntar a los demás puntos si posee el servicio, una vez encuentre el punto con el servicio se procede a hacer la transmisión de datos.

Page 55: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

41

El hecho de utilizar Relays hace que la implementación del API tenga que preocuparse por el canal de comunicación entre el Relay y los dispositivos móviles; además el P2P no es muy escalable y el trafico de red es alto; adicionalmente implementar una solución dinámica implica utilizar (en principio) comunicación broadcast lo cual puede ser costoso en términos de desarrollo, seguridad y demás [OLSN]. La tecnología disponible a implementar POA para esta solución específica es sencilla, lo que es una ventaja en la curva de aprendizaje. Al utilizar un Relay los servicios residen en este, optimizando el uso de recursos de máquina del dispositivo móvil, razón por la cual el proyecto JXME emplea Relays.

7.3.2 P2P con Servidor de Índices con Puntos Comunicados por Relay

Red P2P

RelayRelay

Servidor de Indices

Gráfica 10 Diagrama de Arquitectura P2P con Servidor de Índices con Puntos

Comunicados por Relay Esta arquitectura implementa una solución al utilizar un servidor en el cual se publican las direcciones de todos los puntos de la red,

Page 56: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

42

adicionalmente cuando un punto hace una búsqueda le pide a este servidor que le retorne la lista de los puntos que poseen el servicio. Este modelo es bastante eficiente ya que optimiza el tráfico de red, adicionalmente es un modelo escalable a bajo costo en tiempo de desarrollo [OLSN]. La comunicación entre los dispositivos móviles y la red P2P se hace a través de Relays, estos liberarán de servicios pesados (en términos de recursos de máquina) a los dispositivos móviles.

Gráfica 11 Diagrama de Secuencia Arquitectura P2P con Servidor de Índices

con Puntos Comunicados por Relay Cuando un dispositivo móvil desea obtener un servicio, le pide al Relay que realice una búsqueda en el servidor de índices. El servidor de índices posee una lista con la dirección y los servicios que tiene publicado cada punto, una vez encuentre los servicios, el servidor retorna una o todas las direcciones de los puntos al Relay. El Relay le comunica al dispositivo móvil la dirección del servicio y éste empieza a establecer la comunicación directa a través de los protocolos P2P que provee el Relay. Esta arquitectura nos brinda la posibilidad de implementar servicios basados en POA y contar con implementaciones robustas y que proveen un código abierto, por consiguiente la implementación de servicios es bastante flexible y conveniente. El hecho utilizar Relays hace que la implementación del API tenga que preocuparse por el canal de comunicación entre el Relay y los dispositivos móviles. La tecnología disponible a implementar POA para esta solución específica es sencilla, lo que es una ventaja en la curva de

Page 57: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

43

aprendizaje. Al utilizar un Relay los servicios residen en este, optimizando el uso de recursos de máquina del dispositivo móvil, razón por la cual el proyecto JXME emplea Relays. El soporte de Compact Framework para crear una aplicación cliente que se comunique con el Relay no es un problema, principalmente porque los aspectos no van a residir en los dispositivos móviles sino en el Relay.

7.3.3 P2P Servidor Índices

Red P2P

Servidor de Indices

Gráfica 12 Diagrama de Arquitectura P2P Servidor Índices

Esta arquitectura implementa una solución utilizando un servidor en el cual se publican las direcciones de todos los puntos de la red, adicionalmente cuando un punto hace una búsqueda le pide a este servidor que le vuelva la lista de los puntos que poseen el servicio. Este modelo es bastante eficiente ya que optimiza el tráfico de red,

Page 58: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

44

adicionalmente es un modelo escalable a bajo costo en tiempo de desarrollo [OLSN]. Esta solución elimina los Relay lo que implica que los servicios van a residir en los dispositivos móviles. Estos servicios van a estar tejidos con aspectos y por tanto la implementación de esta arquitectura utilizando Compact Framework no es posible.

7.3.4 P2P con Servidor de Índices y Búsquedas

Gráfica 13 Diagrama de Secuencia Arquitectura P2P con Servidor de Índices y

Búsquedas Cuando un dispositivo móvil desea obtener un servicio, le pide al servidor de índices la dirección de los puntos que poseen el servicio. El servidor de índices posee una lista con la dirección y los servicios que tiene publicado cada punto, una vez encuentre los servicios, el servidor retorna una o todas las direcciones de los puntos al dispositivo móvil, luego éste empieza a establecer la comunicación directa con el punto seleccionado. Esta solución elimina los Relay lo que implica que los servicios van a residir en los dispositivos móviles. Estos servicios van a estar tejidos con algunos aspectos y lo por tanto la implementación de esta arquitectura se haría utilizando Compact Framework lo cual no es posible.

Page 59: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

45

7.3.5 P2P con Servidor de Índices y sin Búsquedas

Gráfica 14 Diagrama de Secuencia Arquitectura P2P con Servidor de Índices y

sin Búsquedas Esta solución no explota en su totalidad el servidor de índices, debido a que las búsquedas las realiza cada nodo por separado, por tal motivo fue descartada como arquitectura para implementar el API de comunicaciones.

7.4 MÉTODO PARA ESCOGER LA ARQUITECTURA DEL API DE

COMUNICACIONES

Para escoger entre todas las diferentes arquitecturas mencionadas anteriormente se utilizará el método descrito por Kinnear [KINN]. En el cual basados en los criterios planteados, se hará una cuantificación de las arquitecturas para escoger la que mejor se acomode al proyecto de investigación. Cada criterio posee un peso, que indica la importancia dentro del desarrollo del API de comunicaciones. Al multiplicar éste peso por la calificación que obtuvo cada arquitectura en determinado criterio y sumándolas se obtiene la calificación total de la arquitectura.

Page 60: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

46

Los pesos de los criterios fueron establecidos de acuerdo a la experiencia en desarrollar aplicaciones distribuidas y van en una escala de 1 a 10. La calificación de la arquitectura en cada criterio está valuada por: Malo: con calificación de 1 Regular: con calificación de 3 Bueno: con calificación de 5 Los pesos de los criterios indican la relevancia frente al API, en una escala de 1 a 5.

Código Abierto

Flexibilidad

Creación nuevos

servicios

Baja complejidad Implementación

Agilidad en la curva

aprendizaje

Recursos máquina

PPC

Comunicación distribución de carga y envío de paquetes

Soporte CF Total

Pesos De los Criterios 2 3 2 2 5 5 4

P2P con Puntos comunicados por Relay

5 5 3 5 5 1 5 91

P2P con servidor de indices(sin búsquedas) y puntos comunicado por Relays

5 3 3 5 3 1 5 75

P2P con servidor de indices(con búsquedas) y puntos comunicado por Relays

5 5 5 5 5 3 5 105

P2P pura con servidor de indices (sin búsquedas)

1 3 3 3 1 3 3 55

P2P pura con servidor de indices (con búsquedas)

1 3 3 3 1 5 3 65

Tabla 2 Selección de Arquitectura a Implementar.

Bueno 5Regular 3Malo 1

Tabla 3 Rangos de Calificación Como se puede observar, la arquitectura que obtuvo un mejor resultado en la comparación fue “P2P con servidor de índices (con búsquedas) y puntos comunicado por Relays”, por tal motivo, es la arquitectura

Page 61: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

47

escogida para el desarrollo de esta investigación y su diseño se describe a continuación.

7.5 DISEÑO DE LA ARQUITECTURA

El diseño de los paquetes del API, están distribuidos de la siguiente forma:

7.5.1 Diseño de Paquetes

Gráfica 15 Diagrama de Componentes del API de Comunicaciones

Paquete del Cliente: En éste paquete se busca agrupar la implementación del la interfaz del usuario en la Pocket PC y los componentes de comunicación con el Relay. Paquete de Tipos: Se busca mantener las interfaces de los componentes que crean la funcionalidad del API con el fin de mantener una relación de estos, sin crear dependencias directas. Paquete de Servicios: Agrupa los servicios necesarios para crear una red P2P, además mantiene los servicios que entrecruzan la aplicación encapsulados en los Aspectos.

Page 62: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

48

Paquete de Índices Contiene la implementación del Servidor de índices, basado en un patrón Observer con el fin de desacoplar los clientes del servidor. Paquete de comunicaciones Establece las conexiones directas utilizando el protocolo TCP, permitiendo una comunicación P2P y la comunicación con el Servidor de Índices.

7.5.2 Paquete del Cliente:

Gráfica 16 Diagrama de Componentes Paquete de La Interfaz del Cliente

Paquete del Relay Reside la lógica del Relay basado en el Patrón Proxy, ya que el Relay hace las veces de un punto en la Red P2P. Paquete de GUI Representa la lógica que reside en la Pocket PC y el conjunto de herramientas para implementar una aplicación sobre el API.

7.5.3 Paquete de Índices

IServidorIndiceServidorIndices

-iPuntosVector:Vector

+attach:void+detach:void+inform:void+iPuntos:Enumeration

Gráfica 17 Diagrama de Componentes Paquete de el Servidor de Índices

Page 63: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

49

Basado en el concepto de un patrón Observer, el servidor de índices mantiene una lista de los puntos que tiene conectados facilitando las notificaciones de eventos en el servidor a un bajo acoplamiento.

7.5.4 Paquete Comunicaciones

Gráfica 18 Diagrama de Componentes Paquete de Comunicaciones

Cliente TCP establece una comunicación P2P con otros puntos de la Red a través del Relay; mientras que el ServidorTCP lanza un hilo, representado por la clase ServidorHiloTCP, que atiende a los llamados de los clientes en el servidor de índices.

7.5.5 Paquete de Tipos

Gráfica 19 Diagrama de Componentes Paquete de Interfaces

Page 64: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

50

Posee las interfaces de las clases más importantes de la implementación, manteniendo una relación sin crear dependencias. Estas clases modelan el comportamiento del API y la manera de cómo se deben implementar las aplicaciones.

7.5.6 Paquete de Servicios

Gráfica 20 Diagrama de Componentes Paquete de Aspectos

Los Servicios 1,2 y 3 son la lógica funcional del API. En el Paquete de Aspectos, se almacenan los aspectos que entrecruzan los servicios.

Page 65: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

51

8 ETAPA DE IMPLEMENTACIÓN DEL API En este punto se ilustra como se desarrolló el proceso de implementación del API.

8.1 EL TRABAJO DESARROLLADO EN MÁQUINAS VIRTUALES DE

JAVA PARA POCKET PC

A continuación se detalla el trabajo que se desarrolló en la plataforma de desarrollo Java en los dispositivos móviles. Se ilustran las máquinas virtuales con las cuales se trabajó, el API de JXME y finalmente se plantean conclusiones al respecto.

8.1.1 Máquinas Virtuales de Java para Pocket PC A continuación se enumeran las máquinas virtuales que se trabajaron para realizar las pruebas correspondientes a JXME. PERSONALJAVA: Es la máquina virtual de Java implementada por SUN. Aunque es bastante ligera, la información concerniente a ésta es precaria, tanto así, que no es clara la descarga y posterior instalación para sistemas operativos Windows-CE o Windows Mobile 2003. WEME (WebSphere Everyplace Micro Edition): Es la máquina virtual de Java implementada por IBM, de carácter comercial (se trabajó con una licencia trial), lo que limita la funcionalidad de desarrollo. Adicionalmente esta versión utiliza paquetes propios es decir no es una implementación genérica. EWE: Es una implementación que permite crear aplicaciones con una máquina virtual que trabaja sobre Java; los ejemplos encontrados trabajan con paquetes propios de EWE, es decir, no es una implementación genérica. Para el desarrollo de esta investigación, se han probado otras máquinas virtuales y SDKs como SuperWaba, pero ninguna de estas nos brinda un soporte para JXME ya que es necesario que los paquetes que se invocan sean genéricos a J2ME.

Page 66: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

52

8.1.2 Trabajo Desarrollado en JXME Durante el desarrollo de éste Proyecto de Investigación se ha tratado la instalación y desarrollo de JXME en dispositivos Pocket PC, y la primera conclusión que se puede obtener, es que el paso de JXME a dispositivos Pocket PC no es transparente, ya que depende estrictamente de la máquina virtual de Java, debido a que necesita que ésta contenga paquetes propios de J2ME, para su funcionamiento. Se han tenido problemas de compatibilidad con las versiones de las máquinas virtuales encontradas. Ante los resultados obtenidos durante el trabajo con J2ME, JXTA y Java en dispositivos Pocket PC, resulta más beneficioso para la investigación crear un API nuevo basado en POO y diseñado en Compact Framework. Por consiguiente se tomó la decisión de realizar la comparación del API basado en POA; objetivo principal de esta investigación, frente a un API similar donde los aspectos que se encuentren en el desarrollo, se mantengan encapsulados en objetos y embebidos en POO; es decir, se quiere hacer un API con aspectos, basados en POA, y compararlo contra un API similar, basado en POO. El hecho de hacer la comparación entre dos APIs construidos en el mismo lenguaje de programación, permite mantener constante la variable de el framework de desarrollo, variable que inicialmente con el objetivo de este proyecto no era posible mantener; el hecho de comparar el API implementado en Microsoft .NET con uno similar en el mundo JAVA involucraba variables, de tiempo y rendimiento, que no eran pertinentes al verdadero objeto de esta investigación, el valor agregado de POA frente al paradigma de POO.

8.2 MODELOS DE IMPLEMENTACIÓN

El diseño del API de comunicaciones tuvo como base la arquitectura escogida, el paso a seguir es la elección de las tecnologías que servirán de plataforma para la construcción. La primera opción a seleccionar; es manejar procesos distribuidos a través de Remoting, sin embargo Compact Framework no lo soporta [BYNA]. La siguiente opción es implementar el API basados en socket, multihilos y manejo de flujos, serializando los objetos de la lógica.

Page 67: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

53

8.2.1 Desarrollo Basado en Sockets, Mutihilos, Flujos Distribuidos y Serialización de Objetos

Cada uno de los componentes de la arquitectura fue implementado a modo de librerías dll. La aplicación cliente, que consume los servicios del API, fue construida en Windows Forms. Este API provee la funcionalidad de publicar, buscar y transferir archivos en la Red P2P. Los métodos de enviar y recibir datos fueron interceptados y tejidos por un aspecto construido en el framework de RapierLoom.Net, de tal manera que se lanzaba un Aspecto de encripción de manera dinámica. Al iniciar la aplicación, se levanta el Servidor de índices:

Gráfica 21 Inicio del Servidor de Índices y adición de un nuevo Nodo

Como se observa en la gráfica 21, el servidor escucha por notificaciones en el puerto 9092. Luego se inicializa el servidor Relay:

Gráfica 22 Inicio del Relay y adición de un nuevo Nodo

Como se observa en la gráfica 22, el Relay espera por nodos que deseen conectarse a la red, escuchando por el puerto 9090.

Page 68: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

54

Luego se inicializa el Cliente:

Gráfica 23 Pantalla principal del Cliente

Una vez la aplicación ha subido, podemos publicar archivos para compartir, como un servicio a prestar:

Gráfica 24 Carga de un servicio

Page 69: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

55

Tanto el Relay como el Servidor de Índices reportan un mensaje, para agregar un servicio a al Red P2P:

Gráfica 25 Mensaje de adición de servicios en el Relay

Gráfica 26 Mensaje de adición de servicios en el Servidor de Índices

Ahora cualquier cliente puede buscar este servicio; las búsquedas (optimizada con el uso de los aspectos) se hacen por descripción, por tipo o por una mezcla entre estas dos. Una vez se oprime el botón Buscar, la aplicación muestra los resultados que le retorna la Red P2P, cada resultado posee la dirección IP y la ruta del archivo que se desea transferir:

Gráfica 27 Mensaje de búsqueda en el Servidor de Índices

Gráfica 28 Mensaje de búsqueda en el Relay

Page 70: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

56

Gráfica 29 Presentación de los resultados obtenidos en el Cliente

Una vez se oprime el botón solicitar servicio, la aplicación procede a guardar en el dispositivo de almacenamiento local el archivo que es transmitido por el Nodo publicador. La comunicación termina con un mensaje “Fin comunicación P2P”:

Gráfica 30 Presentación prestación de servicios en el Servidor de Índices

Todos los mensajes que viajan por la Red P2P son cifrados por el Aspecto de encriptación que intercepta los métodos de enviar y recibir. La encriptación se realizó a través del algoritmo de encriptación tiny, TEA por sus siglas en ingles [PBRO], ya que la clase System.Security.Cryptography no es soportada por Compact Framework [CRIM].

Page 71: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

57

Para la instalación del API en dispositivos Pocket PC, fue necesario implementar la aplicación cliente de ejemplo, que consume los servicios del API, en Compact Framework.

Al ejecutar la aplicación, los errores de ejecución mostraron que existía un problema de serialización de los objetos con la clase BinaryFormatter, encargada de convertir a bits los objetos:

Gráfica 31 Error presentado por la serialización de objetos

Al acudir al soporte de Compact Framework para encontrar una solución a este inconveniente [BYNA] se encontró que Compact Framework no incluyó en su implementación la clase BinaryFormatter ni la clase SOAPFormatter, encargadas de la serialización de objetos a través de flujos. La única opción restante era implementar la serialización a través de la clase XMLSerializer. Al utilizar XMLSerializer se detectaron errores en tiempo de ejecución con los flujos que incurrían en la serialización. Se consultó en el soporte de Microsoft pero no se encontró ningún ejemplo o comentario de serialización a flujos distribuidos. En este punto de la investigación se llegó a la conclusión que implementar un Cliente para Pocket PC usando socket y multihilos para enviar objetos serializados, no es posible debido a las limitantes tecnológicas. Así que fue necesario buscar otra opción que si es soportado por Compact Framework, la cual se encuentra descrita a continuación.

Page 72: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

58

8.2.2 Desarrollo Basado en Servicios Web Existe la forma de consumir servicios de manera sincrónica o asincrónica, a través de Servicios Web. Mediante los Servicio Web se ajustó el API para poder utilizar los métodos que debían proporcionar los servidores a los puntos, bajo el mismo diseño que se había evaluado previamente. Se encontró que existe la forma de consumir servicios de manera sincrónica o asincrónica, a través de Servicios Web. Estos servicios son métodos o clases expuestas en un Servidor Web como componentes remotos, muy similar a incluir una librería dll en un proyecto. Los Servicios Web XML brindan la posibilidad de manejar procesos distribuidos de manera similar a Remoting en .NET o RMI en Java, con la diferencia que en él se utiliza el protocolo HTTP para establecer la comunicación. Se realizaron varias pruebas para saber si esta tecnología soporta el diseño del API, anteriormente descrito, ya que las Pocket PC solo pueden consumir los Servicios Web y no los pueden alojar, es decir, no pueden brindar estos servicios. Adicionalmente la funcionalidad en Compact Framework, respecto a los Servicios Web es reducida frente a la que se obtiene en el Framework de .NET [BYNA]. Estas pruebas consistieron en la conexión entre una Pocket PC y un Servidor Web; Se enviaron objetos de lado y lado mediante la inclusión de las definiciones de los tipos de objetos con un atributo llamado XmlInclude. Una vez terminadas las pruebas, se llegaron a varias conclusiones; la primera es que las Pocket PC consumen de manera transparente los Servicios Web, y se pueden enviar objetos desde el servidor hacia las Pocket PC. Pero, al enviar una referencia remota de un objeto residente en la memoria del dispositivo móvil hacia el Servidor Web, se generan errores concernientes a la serialización XML. Por tal motivo sólo se pueden enviar datos primitivos desde la Pocket PC hacia el servidor (el mismo problema presentado al utilizar los socket). Este inconveniente se resolvió enviando datos primitivos hacia el servidor. Se implementaron clases comunes entre el servidor y el

Page 73: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

59

dispositivo móvil los cuales encapsulan los datos que viajan por el sistema. En el desarrollo se utiliza el Patrón Observador - Observable para notificar al cliente Pocket PC que debe enviar datos a otro punto de la Red P2P. Este patrón permite desacoplar el cliente, que consume servicios y envía sus datos, de la lógica funcional del API. Según Gamma [GOF] existen dos formas de implementar un patrón Observador – Observable: la primera y comúnmente empleada se denomina modelo Push, en el cual los observadores son informados de los cambios de estado. Existe otro modelo llamado Pull, en el cual el observador, para evitar múltiples actualizaciones, asume la responsabilidad de preguntarle al observable por cambios de estado con lo cual él puede actualizarse. Aplicando el modelo pull al escenario de implementación del API, debido a que no se pueden enviar referencias de objetos alojados en la memoria de la Pocket PC al Servidor Web, el Cliente es el responsable de preguntarle al Servidor por medio del Servicio Web, si el Relay ha reportado cambios de estado, en este caso, peticiones de datos a la Pocket Cliente; este diseño hace que el los puntos o clientes de la Red P2P tengan colas para atender las peticiones, cada petición tiene la dirección IP del punto que desea el servicio para así hacer la transferencia. Cada cliente lanza un hilo para atender peticiones, que siempre están pendientes, otro simplemente para hacer peticiones y la transferencia se hace a través de flujos de archivos. En el anexo 7 se encuentra el diagrama de secuencia que ilustra detalladamente la interacción descrita en éste párrafo.

8.3 ADAPTACIÓN DE LA ARQUITECTURA DEL API

En el caso de la concepción de esta investigación fue necesario adaptar el diseño de la arquitectura basada en Relays, ya que este nos permite dar un soporte total a POA, pero con un cambio de tecnología, ya que la implementación basada en serialización de objetos, como se explicó anteriormente, no es soportada por Compact Framework. A continuación se ilustra el proceso de implementación del API desarrollado con la ayuda de los Servicios Web.

Page 74: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

60

8.3.1 Arquitectura del API La forma como se comunica cada uno de los componentes en la arquitectura del API, se expone en la gráfica 32. Estos componentes son: los Nodos (Dispositivos Pocket PC, consumen y publican servicios), los Relays (Servidores que actúan como Proxy de un conjunto de puntos) y el Servidor de Índices (Servidor que ofrece servicios de búsquedas y de publicación de servicios). Para la comunicación entre los nodos se utiliza el protocolo de comunicaciones TCP/IP y los canales se construyen utilizando Sockets. La información que viaja por este medio esta en formato de bytes. Para las demás comunicaciones se utilizan Servicios Web, por lo cual el protocolo utilizado es HTTP; los canales usados utilizan SOAP para el envió de los datos entre servidor - cliente y la información que viaja por este medio se encuentra en formato XML

RED DE COMUNICACIÓN

TCP/IP via Socket

RELAY

SERVIDOR DE INDICES

RELAY

PUNTOS PUNTOS

XML

XML

XML

BYTES

XML

XML

SOAP via HTTP

SOAP via HTTPSOAP via HTTP

SOAP via HTTP

SOAP via HTTP

Gráfica 32 Comunicaciones entre los Elementos de la red P2P

Page 75: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

61

La distribución de cada componente es independiente, pero los servidores pueden llegar a estar sobre una misma máquina. El limitante actual existente, es que los dispositivos móviles no pueden ser servidores Relay o Directorio, debido a que no pueden ofrecer Servicios Web. La distribución de componentes se aprecia en la grafica 33. Los bloques representan máquinas virtuales diferentes.

Client Rela Directori

ClienteLogica

Relay Directorio

RelayLDirectorioLG

AspectoDirectorioAspectoRelay

RelayLogicaDirectorioLogica

Tipos

Servicio ResultadoBusquedas Peticion Nodo

Fabrica

FabricaObjetosTejidosRapierLoom.NET

RelaySV DirectorioS

Servicios Web (Framework)Cliente de Servicios Web (Compact Framework)

Servicios Transversales

Gráfica 33 Diagrama de Distribución

Los componentes del Cliente están construidos en Compact Framewok. Los componentes del Relay y del Directorio están construidos en el framework de .NET. El Relay y el Directorio tienen sus propios aspectos (AspectoRelay y AspectoDirectorio) que encapsulan la lógica no funcional. Adicionalmente se pude observar la librería de Rapier-Loom necesaria para tejer aspectos y objetos en tiempo de ejecución.

Page 76: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

62

Los servicios travesales que se utilizan en la aplicación se encuentran en el paquete Tipos. El cliente final interactúa con el paquete ClienteLogica directamente.

8.4 IMPLEMENTACIÓN DEL API

En este diagrama se puede visualizar las dependencias entre los paquetes que componen el API. Las referencias que se manejan en el sistema son de 4 tipos: Referencia web: Cuando un subsistema apunta a un Servicio Web. Referencia general: Cuando un subsistema apunta a otro subsistema directamente. Referencia con la fábrica para obtención de objetos remotos: Cuando se necesita obtener una referencia a un objeto que en tiempo de ejecución se tejerá con un aspecto. Está referencia es una referencia general. Referencia relativa: Esta referencia se obtiene después del proceso de tejido, por lo que no es explícita.

«subsistema»Paquete superior::Aspectos

«subsistema»Paquete superior::Directorio

«subsistema»Paquete superior::Fabrica

«subsistema»Paquete superior::LogicaCliente

«subsistema»Paquete superior::LogicaRelay

«subsistema»Paquete superior::Relay

«subsistema»Paquete superior::Tipos

«subsistema»Paquete superior::LogicaDirectorio

Librería de Windows

Servicio Web

Librería Pocket Pc

Referencia webReferencia general

Referencia con la fabrica para la obtención de objetos tejidosReferencia relativa, con el objeto tejido

Gráfica 34 Diagrama de Componentes

Page 77: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

63

A continuación se explica cada uno de los paquetes detalladamente.

8.4.1 Implementación de los Aspectos POA no es un paradigma sencillo de entender, el concepto de interceptar clases y tejerlas para emitir un nuevo objeto en tiempo de ejecución, contrasta con la teoría de compilación y ejecución de aplicaciones, que normalmente se conoce y en la cuál se basan los demás paradigmas de programación. Nacen nuevos retos en todas las etapas del proceso de desarrollo de software. El análisis debe identificar claramente y de forma transversal los requerimientos no funcionales, que luego el diseño debe abstraer. El modelado debe emplear la buenas prácticas, como patrones de software, también se hace vital poseer un estándar a seguir en la implementación ya que esto permite que los aspectos puedan ser componentes que corten de manera transversal toda la aplicación. La parte de depuración de código mediante herramientas como el Debug, se puede decir que no existen actualmente para POA. Esto se debe a la incapacidad de seguir el rastro al código, ya que esté se está emitiendo en tiempo de ejecución mediante reflexión; lo que no es explicitó para la herramienta que hace la depuración. Visual Studio 2003 permite hacer Debug a las aplicaciones .NET; para la implementación del API, fue necesario probar los Aspectos mediante debuggin, encontrando que el rastro de las líneas de código salta de una clase a otra, haciendo difícil entender el funcionamiento de los aspectos. Este es uno de las desventajas a la hora de utilizar POA, sin embargo se espera que las herramientas que brindan manejo a los aspectos solucionen este inconveniente en un futuro.

Page 78: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

64

ASPECTOS

Loom::Aspect

+AspectoAuditoria()+AgregarCliente(entrada args : object[], entrada insTejer : string)+AgregarServicio(entrada args : object[], entrada insTejer : string)+EliminarCliente(entrada args : object[], entrada insTejer : string)+interceptarBusqueda(entrada args : object[], entrada insTejer : string)+iniciarEscritura()+cerrarEscritura()

-instaciaTejida : string-log : StreamWriter-put : FileStream

AspectoAuditoria

+AspectoDirectorio()+interceptarBusquedaParaAgilizar(entrada args : object[])+actualizarBusquedas(entrada args : object[])+RefrescarBusquedas(entrada args : object[])+AgregarCliente(entrada args : object[])+AgregarServicio(entrada args : object[])+EliminarCliente(entrada args : object[])+interceptarBusqueda(entrada args : object[])

-marrResultadoBusquedas : Hashtable-aspAuditoria : AspectoAuditoria-instaciaTejida : string = "Directorio"

AspectoDirectorio

+AspectoRelay()+AgregarCliente(entrada args : object[])+AgregarCliente(entrada args : object[])+AgregarServicio(entrada args : object[])+EliminarCliente(entrada args : object[])+interceptarBusqueda(entrada args : object[])

-aspAuditoria : AspectoAuditoria-instaciaTejida : string = "Relay"

AspectoRelay

Gráfica 35 Paquete de Aspectos

Bajo la arquitectura planteada fue posible emplear los aspectos, superando las dificultades respecto al soporte de estos en los dispositivos Pocket PC, particularmente Compact Framework. Como se muestra en la gráfica 35, los aspectos en el API, hacen parte del namespace Aspectos, allí están agrupados de forma lógica las clases AspectoRelay (encapsula la lógica no funcional relacionada al Relay), AspectoDirectorio (encapsula la lógica no funcional relacionada al Directorio) y el AspectoAuditoria (encapsula la lógica no funcional relacionada a la auditoria del sistema). Uno de los aspectos implementados permite agilizar las búsquedas que se realizan sobre la red P2P, reduciendo el tiempo que gasta el Servidor de Índices en retornar al cliente el conjunto de resultados que cumplen con tal solicitud. Básicamente, lo que hace el aspecto es mantener actualizada una colección de respuestas (nodos que poseen un servicio) a posibles búsquedas que realicen los clientes, evitando que la aplicación siga su curso normal, ya que hacer una búsqueda por cada

Page 79: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

65

solicitud es costoso en términos de tiempo y recursos de máquina del servidor. Otro aspecto que se implementó esta encargado de llevar una auditoria de los sucesos de la red P2P. Éste aspecto se encarga de vigilar todos los llamados realizados al Relay y al Directorio, interceptando de manera transversal el sistema y mostrando la gran potencialidad de los Aspectos como código que se factoriza y se convierte en un útil componente reutilizable. Todos los sucesos de la red quedan escritos en un archivo de texto en las máquinas del Relay y el Servidor independientemente. Un aspecto que fue incorporado al API se tuvo como base las actuales herramientas de intercambio de archivos a través de Internet, como kazaa, emule y demás, las cuales desconectan a sus usuarios si estos no han reportado actividad en un cierto tiempo, lo que se conoce como time-out. En el API el Relay es el encargo de realizar ese tipo de administración sobre sus nodos, así que el aspecto entrecruza esta funcionalidad. La estructura de los aspectos que contiene el API se basa en funciones que contienen la lógica del aspecto, cada función debe indicar mediante atributos (meta datos) a qué función se le realizará el punto de corte y de qué manera se llamará el aspecto. Adicionalmente dentro del aspecto, se debe recibir un arreglo de argumentos que representan los parámetros que también recibe la función equivalente desarrollada bajo otro paradigma diferente a POA. En el anexo 8, se describen cada una de las funciones que contienen los aspectos.

8.4.1.1 Funcionamiento de los Aspectos en el API El AspectoRelay tiene la función específica de interceptar la clase RelayLG, clase encargada de implementar la lógica de publicación del Servicio Web del Relay. El AspectoDirectorio intercepta la clase Directorio principalmente con el fin de agilizar las búsquedas que éste Servicio Web debe llevar a cabo. Finalmente el AspectoAuditoria es la clase que implementa lógica de crear el Log de sucesos de la red P2P, esto se hace tanto en el Directorio como en el Relay. Para entender como funciona POA aplicado en el API, se toma como caso de estudio el proceso que sigue el sistema cuando un nodo desea agregar un servicio a la red P2P.

Page 80: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

66

El aspecto AspectoAuditoria (ilustrado como “Aspecto”) y la clase Directorio, serán los sujetos de este ejemplo. Tanto el aspecto como la clase son entidades totalmente independientes.

Gráfica 36 Relación entre la clase y el aspecto

El aspecto es una clase que hereda de Aspect, interfaz que provee la tejedora que se utilizó, Rapier-Loom.NET (normalmente las tejedoras que se probaron funcionan de manera similar). En la Gráfica 36 se puede observar, resaltado en color azul, los puntos de corte de la función AgregarServicio. Estos puntos de corte son especificados en atributos. En POA los puntos de corte deben especificar en qué lugar (objeto o función) se debe hacer el corte y en qué momento de la ejecución se debe incorporar el aspecto.

Page 81: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

67

Como se muestra en la Gráfica 36, el corte se realizará en el método AgregarServicio del objeto que se le indique a la tejedora; la invocación es de tipo After, esto quiere decir que una vez se ejecute el método que se desea tejer, el aspeto entrará entrar en acción. Existen varios tipos de invocación del aspecto: After (después de), Before (antes de), After Throwing (luego de lanzar una excepción), After Returning (después de retornar), Instead (en vez de). Así mismo, existen diferentes formas de indicar en un punto de corte, en donde se realiza el corte: En un método específico, en todos o excluyendo a alguno. La lógica que contiene el aspecto consiste en tomar los argumentos de entrada y escribirlos al archivo de Log. Los argumentos de entrada del aspecto son exactamente los mismos del objeto, esto quiere decir que son del mismo tipo y con los mismos valores. Nótese que el objeto no tiene relación ninguna con el aspecto, solamente contiene la lógica funcional. Para crear la relación entre el aspecto y el objeto se le debe indicar a la tejedora que realice el proceso de tejido.

Gráfica 37 Tejido de un objeto y un aspecto

La Gráfica 37 muestra el código necesario para crear un objeto tejido, esto se hace a través de una interfaz que el objeto debe implementar(en éste caso se denomina IDirectorio). Es una buena práctica delegar la responsabilidad de crear objetos a una clase, por tal motivo el API contiene una fábrica que sigue el patrón Fábrica Abstracta para encapsular la lógica de construcción.

Page 82: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

68

Gráfica 38 Ejecución del proceso de tejido

Así pues, cuando los otros objetos instancíen al objeto Directorio estos tendrán un objeto tejido, que se muestra en la Grafica 38, donde la costura roja indica que la tejedora coció el aspecto y el objeto basándose en los puntos de corte definidos.

Gráfica 39 Vista de la clase tejida

La Gráfica 39 muestra la estructura de la clase tejida que se construye en tiempo de ejecución. En un mismo método se unen tanto la lógica del

Page 83: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

69

objeto como la lógica del aspecto, ya que utilizan los mismos argumentos, el aspecto, de color amarillo, puede emplearlos, claro esta que sin modificar su valor, ya que esto iría en contra de la integridad de la clase. El trozo de código del aspecto aparece debajo del de la lógica funcional ya que el llamado del aspeto tiene invocación de tipo after. Una vez finalice la ejecución tanto del aspecto como del objeto, volverán a ser entidades independientes, sin relación alguna, como se muestra en la gráfica a continuación reseñada.

Gráfica 40 Clases independientes luego de la ejecución

El mismo aspecto puede ser utilizado con diferentes objetos, y haciendo cortes en diferentes funciones de los objetos, todo a la vez.

Gráfica 41 Relación de Aspectos y Clases en tiempo de ejecución

Esto quiere decir que un aspecto es un código que es encapsulado para que se disemine transparentemente a través del código que representa la lógica no funcional. POA es muy útil si se tiene un diseño estandarizado que permita que un aspecto pueda cortar varias funciones.

Page 84: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

70

8.4.2 Implementación del Cliente El paquete cliente representa la lógica con la cual interactúa el cliente final. Este paquete se compone de cuatro clases: ClienteLG: Representa un nodo de la red; es la clase con la cual se establece la comunicación entre el cliente final y el API. Conoce las otras clases del paquete e interactúa con cada una de ellas. En su construcción, recibe como parámetro una interfaz llamada INotificador, la cual se encarga de generar al cliente final los mensajes del sistema. Tiene una referencia Web con el Relay, con quien se comunica para poder interactuar con la red P2P. ConsumirServicio: Clase que abstrae la forma de obtener un servicio específico. Es un hilo que se inicia cuando un Nodo requiere un servicio y se termina cuando se ha obtenido el servicio. ServidorSolicitudes: Clase que abstrae la forma de ofrecer los servicios que publica un Nodo. Es un hilo iniciado por el Nodo y termina cuando se desconecta de la red. Transferencias: Clase que abstrae la comunicación entre un Nodo y otro. Brinda los servicios de enviar y recibir datos.

Page 85: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

71

CLIENTE

+ClienteLG(entrada ntfNotificador : INotificador, entrada strNombreDirectorio : string)+AgregarCliente()+AgregarServicio(entrada strServicio : string, entrada numTamano : long)+AgregarServicios(entrada arrServicios : string[], entrada numTamanos : long[])+EliminarCliente()+Busqueda(entrada strDescripcion : string)+SolicitarServicio (entrada numSolicitado : int, entrada strServicio : string, entrada strRuta : string, entrada numTamano : long)

-mnumIdentificador : int-mrlyServicio : RelaySV-mntfNotificador : INotificador-mstrIpLocal : string-mstrNombreDirectorio : string

ClienteLG

+EnviarDatos(entrada strIp : string, entrada arrDatos : byte[], entrada ntfNotificador : INotificador)+EnviarDatos(entrada sckEnlace, entrada arrDatos : byte[], entrada ntfNotificador : INotificador)+EnviarDatos(entrada stmFlujo, entrada arrDatos : byte[], entrada ntfNotificador : INotificador)+RecibirMensaje(entrada sckEnlace, entrada y salida arrbytMensaje : byte[], entrada ntfNotificador : INotificador) : int+RecibirMensaje(entrada stmFlujo, entrada y salida arrbytMensaje : byte[], entrada ntfNotificador : INotificador) : int

+NUMPUERTO : int = 65000+FRAME_SIZE : long = 1024

Transferencias

+ConsumirServicio(entrada strRuta : string, entrada numTamano : long, entrada ntfNotificador : INotificador)+LanzarServidor()-RecibirServicio(entrada sckEnlace)

-mthtPrncipal : Thread-mnumPuerto : int-mtplEscucha : TcpListener-mstrRuta : string-mnumTamano : long-mntfNotificador : INotificador

ConsumirServicio

+ServidorSolicitudes(entrada numSolicitado : int, entrada ntfNotificador : INotificador, entrada strNombreServidor : string)+LanzarServidor()-PrestarServicio()

-mthtPrncipal : Thread-mnumSolicitante : int-mnumSolicitado : int-mstrServicio : string-mstrIp : string-mrlyServicio : RelaySV-mntfNotificador : INotificador

ServidorSolicitudes

-Crea

*

-Inicia

1

-Usa

*

Gráfica 42 Paquete cliente

Page 86: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

72

8.4.3 Implementación del Relay Los servicios del Relay está separado en dos paquetes, el referente al Servicio Web y el que implementa la lógica del Relay. RelaySV: Es la clase por donde llegan los llamados al Relay. Consiste en un Servicio Web. Obtiene la referencia de la lógica mediante la tejedora de aspectos.

RELAY SERVICIO WEB

+RelaySV()+RelaySV(entrada strNombreDirectorio : string)-InitializeComponent()#Dispose(entrada disposing : bool)+AgregarCliente(entrada strIp : string) : int+AgregarServicio(entrada numIdentificador : int, entrada strServicio : string, entrada numTamano : long)+AgregarServicios(entrada numIdentificador : int, entrada arrServicios : string[], entrada arrTamanos : long[])+EliminarCliente(entrada numIdentificador : int)+Busqueda(entrada strDescripcion : string) : ResultadoBusqueda[]+AgregarSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+AtenderSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+ObtenerSoliciudes (entrada numSolicitado : int) : Peticion[]

-rlyLogica : RelayLG-components : IContainer = null

Relay::RelaySV

Gráfica 43 Paquete Relay Servicio Web

RelayLG: Se encarga de implementar la lógica expuesta a través del Servicio Web. En los métodos de ésta clase se puede encontrar la lógica de administración de nodos, lógica propia del Relay. Implementa la interfaz IRelay.

LÓGICA RELAY

+RelayLG(entrada strNombreDirectorio : string)+AgregarCliente(entrada strIp : string) : int+AgregarServicio(entrada numIdentificador : int, entrada strServicios : string, entrada numTamano : long)+AgregarServicios(entrada numIdentificador : int, entrada arrServicios : string[], entrada arrTamanos : long[])+EliminarCliente(entrada numIdentificador : int)+Busqueda(entrada strDescripcion : string)+AgregarSolicitud(entrada numSolicitante : int , entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+AtenderSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+ObtenerSoliciudes(entrada numSolicitado : int )

-mdsvServicio : DirectorioSVRelayLG

Gráfica 44 Paquete Lógica Relay

Page 87: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

73

8.4.4 Implementación del Directorio Los servicios del directorio están separados en dos paquetes, el referente al Servicio Web y el que implementa la lógica del Directorio.

DirectorioSV: Es la clase por donde llegan los llamados al Directorio y al Manejador de solicitudes. Consiste en un Servicio Web. Obtiene la referencia de la lógica mediante la tejedora de aspectos.

DIRECTORIO SERVICIO WEB

+DirectorioSV()-InitializeComponent()#Dispose(entrada disposing : bool)+AgregarCliente(entrada strIp : string) : int+AgregarServicio(entrada numIdentificador : int, entrada strServicio : string, entrada numTamano : long)+AgregarServicios(entrada numIdentificador : int, entrada arrServicios : string[], entrada arrTamanos : long[])+EliminarCliente(entrada numIdentificador : int)+Busqueda(entrada strDescripcion : string) : ResultadoBusqueda[]+AgregarSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+AtenderSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+ObtenerSoliciudes(entrada numSolicitado : int) : Peticion[]

-dirLogica : IDirectorio-fabObjetos : FabricaObjetosTejidos-components : IContainer = null

Directorio::DirectorioSV

Gráfica 45 Paquete Directorio Servicio Web

Directorio: Se encarga de redireccionar las solicitudes del Servidor Web a la lógica. Implementa la interfaz IDirectorio para su tejido con aspectos. DirectorioLG: Se encarga de abstraer la lógica del Servidor de Índices, es decir las referencias de todos los nodos (y sus servicios) de la red. En los métodos de ésta clase se puede encontrar la lógica de administración de búsquedas. Es una clase que se basa en el patrón Singleton. Manejador de Solicitudes: Se encarga de mantener en un arreglo único todas las solicitudes que se quieren consumir. Es una clase que se basa en el patrón Singleton.

Page 88: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

74

-DirectorioLG()+Instancia() : DirectorioLG+AgregarCliente(entrada strIp : string) : int+AgregarServicio(entrada numIdentificador : int, entrada strServicios : string, entrada numTamano : long)+AgregarServicios(entrada numIdentificador : int, entrada arrServicios : string[], entrada arrTamanos : long[])+EliminarCliente(entrada numIdentificador : int)-ObtenerIp(entrada numIdentificador : int) : string+Busqueda(entrada strDescripcion : string) : ResultadoBusqueda[]

-marrNodos : Hashtable-instance : DirectorioLG-numConsecutivo : int-MAX_RESULTADOS : int = 100

LogicaDirectorio::DirectorioL

-ManejadorSolicitudes()+Instancia() : ManejadorSolicitudes+AgregarSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+AtenderSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+ObtenerSoliciudes(entrada numSolicitado : int) : Peticion[]

-marrSolicitudes : ArrayList-instance : ManejadorSolicitudes

LogicaDirectorio::ManejadorSolicitudes

LÓGICA DIRECTORIO

+AgregarCliente(entrada strIp : string) : int+AgregarServicio(entrada numIdentificador : int, entrada strServicio : string, entrada numTamano : long)+AgregarServicios(entrada numIdentificador : int, entrada arrServicios : string[], entrada arrTamanos : long[])+EliminarCliente(entrada numIdentificador : int)+Busqueda(entrada strDescripcion : string) : ResultadoBusqueda[]+AgregarSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+AtenderSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+ObtenerSoliciudes(entrada numSolicitado : int) : Peticion[]+Directorio()

-dirLogica : DirectorioLG-manSolicitudes : ManejadorSolicitudes

LogicaDirectorio::Directorio

-Direcciona llamados

1

-Envia Solicitudes

1

Gráfica 46 Paquete Lógica Directorio

8.4.5 Implementación de las Clases Utilitarias Las interfaces y las clases que viajan en la aplicación se encuentran agrupadas en el paquete Tipos. Interfaces: IRelay: Interfaz que contiene todos los métodos que debe implementar la lógica del Relay. Es necesaria para la construcción del objeto tejido que une a RelayLG y a AspectoRelay. IDirectorio: Interfaz que contiene todos los métodos que debe implementar la lógica del Directorio. Es necesaria para la construcción del objeto tejido que une a Directorio y a AspectoDirectorio. INotificador: Interfaz que debe implementar el cliente final. Contiene los métodos necesarios para generar notificaciones sobre informaciones y errores generados en el sistema.

Page 89: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

75

ITemporizador: Interfaz que exige el patrón Observador – Observable para notificar la desconexión de un nodo después de transcurrir un tiempo de inactividad. Clases que viajan: Nodo: Clase que abstrae el comportamiento de un elemento de la red. Contiene servicios y puede realizar búsquedas sobre estos. ResultadoBusqueda: Clase que abstrae los datos que se entregan al cliente producto de una búsqueda. Contiene un servicio y una dirección del cliente que ofrece lo ofrece. Servicio: Clase que abstrae el comportamiento de un servicio que se ofrece/consume por los nodos de la red.

Page 90: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

76

+Servicio()+Servicio(entrada strDescripcion : string, entrada numTamano : long)+Descripcion() : string+Tamano() : long

-mstrDescripcion : string-mnumTamano : long

Tipos::Servicio

+ResultadoBusqueda()+ResultadoBusqueda(entrada numIdentificador : int, entrada strServico : string, entrada strIp : string, entrada numTamano : long)+Identificador() : int+Servicio() : string+Ip() : string+Tamano() : long

-mnumIdentificador : int-mstrServicio : string-mstrIp : string-mnumTamano : long

Tipos::ResultadoBusqueda

+GenerarNotificacion(entrada strMensaje : string)+GenerarExcepcion(entrada strMensaje : string, entrada objEx : Exception)+MostrarAvanceRecibir(entrada strServicio : string, entrada numPorcentaje : int)+MostrarAvanceEnviar(entrada strServicio : string, entrada numPorcentaje : int)

«interfaz»Tipos::INotificador

+AgregarCliente(entrada strIp : string) : int+AgregarServicio(entrada numIdentificador : int, entrada strServicio : string, entrada numTamano : long)+AgregarServicios(entrada numIdentificador : int, entrada arrServicios : string[], entrada arrTamanos : long[])+EliminarCliente(entrada numIdentificador : int)+Busqueda(entrada strDescripcion : string) : ResultadoBusqueda[]+AgregarSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+AtenderSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+ObtenerSoliciudes(entrada numSolicitado : int) : Peticion[]

«interfaz»Tipos::IDirectorio

+Nodo()+Nodo(entrada numIdentificador : int, entrada strIp : string)+EstaServicio(entrada strDescripcion : string) : ArrayList+AgregarServicio(entrada strServicio : string, entrada numTamano : long)+AgregarServicios(entrada arrServicios : string[], entrada numTamanos : long[])+Identificador() : int+Ip() : string

-mnumIdentificador : int-mstrIp : string-marrServicios : ArrayList

Tipos::Nodo

-Posee

*

-Contiene

*

TIPOS

+AgregarCliente(entrada strIp : string) : int+AgregarServicio(entrada numIdentificador : int, entrada strServicio : string, entrada numTamano : long)+AgregarServicios(entrada numIdentificador : int, entrada arrServicios : string[], entrada arrTamanos : long[])+EliminarCliente(entrada numIdentificador : int)+Busqueda(entrada strDescripcion : string)+AgregarSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+AtenderSolicitud(entrada numSolicitante : int, entrada numSolicitado : int, entrada strServicio : string, entrada strIp : string)+ObtenerSoliciudes(entrada numSolicitado : int)

«interfaz»IRelay

+NotificarFinTiempo()

«interfaz»ITemporizador

Gráfica 47 Paquete Tipos

Page 91: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

77

9 ETAPA DE EVALUACIÓN La evaluación tiene por principal objetivo conocer que tan bueno es el API cuyo desarrollo tuvo como base POA frente a un API basado totalmente en POO.

9.1 ALCANCE

El alcance nos lleva a generar métricas que indiquen la rapidez y eficiencia de los API y compararlos entre sí.

9.2 ÍTEMS A PROBAR

Los ítems a probar con esta investigación son la velocidad de compilación y de ejecución, tiempos de respuesta y consumo de máquina en los distintos servidores.

9.2.1 VARIABLES

Variables Dependientes • Tiempo de compilación • Tiempos de respuesta • Porcentaje de uso del procesador • Porcentaje tráfico de red

Variables Independientes • Tiempo • Número de muestra • API a probar

Constantes • Aplicación que consume el API • Equipos • Lenguaje de programación

9.3 ESTRATEGIA

La estrategia que será utilizada en el desarrollo de las pruebas es la siguiente:

Page 92: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

78

• Se realizarán los escenarios de pruebas en intervalos de tiempo iguales y de forma intercalada.

• Se adicionaran a la red un número igual de clientes realizando operaciones similares.

• Se utilizará el administrador de tareas de Windows para verificar el estado del servidor, en cuanto a la utilización de memoria, procesador y estado de la red.

• Se utilizará un proceso en Batch que envíe peticiones al servidor, cuando existan conexiones con los clientes para verificar el tiempo de respuesta.

• Se realizarán 10 muestreos por cada equipo en condiciones equivalentes.

9.4 RECURSOS

• Computadoras: Pentium II Celerón de 450 MHZ y 320Mb en memoria RAM Athlon de 1 GHZ y 512 Mb en RAM • Pocket PC:

Dell Axim x30 de procesador 320 MHZ y 64 Mb en memoria RAM. • Cables. • Conector Bluetooth. • Cronometro genérico.

9.5 IMPLEMENTACIÓN DEL API BASADO EN POO

Para la implementación del API a comparar, se utilizó el paradigma de programación POO, tomando como base el API existente en POA. Para esto fue necesario eliminar el paquete de aspectos y reemplazar el llamado del punto de corte por el código implicito, es decir, mezclar la lógica funcional con la no funcional.

Page 93: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

79

9.6 ARQUITECTURAS A PROBAR

Arquitectura con la lógica no funcional modelada en los aspectos

Servicio Web

Lógica de Cliente

Servicio Web

Lógica Funcional

Lógica Funcional

Aspectos

Cliente Relay Servidor Índices

Gráfica 48 Arquitectura a probar con aspectos

Arquitectura con la lógica no funcional modelada en los objetos

Lógica Funcional y No funcional

Servicio Web

Lógica de Cliente

Servicio Web

Lógica Funcional y No funcional

Relay Servidor ÍndicesCliente

Gráfica 49 Arquitectura a probar sin aspectos

Aspectos en donde se encapsula la lógica no-funcional

Proceso de tejido

Objetos con la lógica funcional y no funcional La diferencia entre los API a comparar radica en la forma de modelar los requerimientos ajenos a la lógica del negocio.

Page 94: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

80

9.7 ESCENARIOS

Se definieron los escenarios de la siguiente manera: T0: Se refiere al tiempo de compilación en modo Debug en la herramienta de desarrollo T1: Es el tiempo de compilación en modo release en la herramienta de desarrollo T2: El Tiempo de carga del programa en modo Debug T3: El Tiempo de carga del programa en modo Release T4: Es el consumo de procesador y tiempo del servidor T5: El Tiempo de respuesta del servidor T6: El Tiempo de respuesta durante el envió de datos entre los nodos T7: El Tiempo de búsquedas en los nodos

9.8 CONVENCIONES

AP: Aplicación RL: Relay SI: Servidor de Índices ND: Nodo ACA: API con aspectos ASA: API sin aspectos

Page 95: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

81

10 PLAN DE PRUEBAS

A continuación se muestra el plan de pruebas a realizar en la investigación, cada una de las hojas del árbol representa una prueba a realizar.

PRUEBAS API

ACA

T0

T2T1

T3

ND T7

AP

SIT4T5

RL T4T5

ASA

T0

T2T1

T3

ND T7

AP

SI T4T5

RL T4T5

ND T6

Gráfica 50 Plan de Pruebas

Page 96: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

82

10.1 ANALISIS DE LAS PRUEBAS

Las pruebas se llevaron a cabo con los recursos anteriormente mencionados, a continuación se hará el análisis de las cuarenta pruebas realizadas, sus resultados se encuentran registrados en el Anexo 9. En el Anexo 9.4 se muestra la tabla de varianzas para cada una de las pruebas que se realizaron. Mostrando que la dispersión de los resultados con relación a la media se encuentra en un intervalo de

lo que quiere decir que las muestras son similares. La media, considerada promedio en el Anexo 9.4, muestra una diferencia en tiempos de hasta 3.37s y una diferencia porcentual de hasta 1.50%, lo que es considerado despreciable e indica que los dos APIs tiene un rendimiento similar. A continuación se analiza detalladamente cada resultado de las pruebas explicado el porque de su comportamiento. AP-T0 TIEMPO DE COMPILACION DE LA APLICACIÓN EN MODO DEBUG EN LA APLICACIÓN El modo Debug, en una herramienta de desarrollo, se considera la compilación de una aplicación en la que se cargan las herramientas para hacer depuración. Por tal motivo se espera que los tiempos de compilación sean más lentos que el modo Release. Como se muestra en el Anexo 9.5, la diferencia entre el equipo 1 y el equipo 2 se mantiene constante, lo que es despreciable, ya que es apenas obvio que la máquina más potente Equipo 2 tenga mejores tiempos de respuesta. En las pruebas realizadas a los APIs se obtuvieron los siguientes promedios:

• API con Aspectos: 00:16:15s • API sin Aspectos: 00:09:07s

Una diferencia en promedio de 00:07:08s a favor del API sin Aspectos. Esta diferencia es normal teniendo en cuenta que el API con aspectos debe cargar en compilación la librería de Aspectos Rapier-Loom.NET, adicionalmente posee un mayor número de clases, las cuales son necesarias para dar soporte a POA.

Page 97: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

83

AP-TI TIEMPO DE COMPILACIÓN EN MODO RELEASE EN LA HERRAMIENTA DE DESARROLLO EN LA APLICACIÓN El modo Release, en una herramienta de desarrollo, se considera a la compilación de una aplicación que tiene como objetivo obtener una versión definitiva. A diferencia del modo Debug, esta compilación simplemente carga las clases necesarias, suponiendo tiempos de compilación mucho más cortos. Al igual que la prueba anterior, se considera despreciable la diferencia en tiempos entre los dos equipos de pruebas, ya que tienden a ser constantes. En las pruebas realizadas a los APIs se obtuvieron los siguientes promedios:

• API con Aspectos: 00:12:23s • API sin Aspectos: 00:04:04s

De nuevo es el API con Aspectos el que presenta mejores tiempos de respuesta, con una diferencia promedio a favor de 00:08:19s. Al igual que la prueba anterior, la diferencia radica en que el API con Aspectos debe cargar la librería para soporte de Aspectos Rapier-Loom.NET y además posee clases adicionales para poder soportar POA. AP-T2 TIEMPO DE CARGA DEL PROGRAMA EN MODO DEBUG EN LA APLICACIÓN Esta prueba busca medir el tiempo que demora en cargar el API, ya compilado como dll, más la aplicación ejemplo que se desarrolló. Cargando las herramientas necesarias para hacer depuración de errores sobre la aplicación. En las pruebas realizadas se obtuvieron los siguientes promedios:

• API con Aspectos: 00:32:55s • API sin Aspectos: 00:41:43s

Esta vez la diferencia promedio a favor la obtuvo el API con Aspectos. Esto se debe a que el API con Aspectos carga dinámicamente las clases mediante el uso de Reflexión, creando las referencias entre objetos en tiempo de ejecución, no en tiempo de compilación. La diferencia promedio es de 00:08:88s.

Page 98: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

84

AP-T3 EL TIEMPO DE CARGA DEL PROGRAMA EN MODO RELEASE EN LA APLICACIÓN Esta prueba busca medir el tiempo que demora en cargar el API, ya compilado como dll, más la aplicación ejemplo que se desarrolló. En las pruebas realizadas se obtuvieron los siguientes promedios:

• API con Aspectos: 00:32:51s • API sin Aspectos: 00:33:55s

Al igual que la prueba anterior la diferencia promedio a favor la obtuvo el API con Aspectos. Esto se debe a que el API con Aspectos carga dinámicamente las clases mediante el uso de Reflexión, creando las referencias entre objetos en tiempo de ejecución, no en tiempo de compilación. La diferencia promedio es de 00:01:04s. SI-T4 CONSUMO DE PROCESADOR Y TIEMPO DEL SERVIDOR DE INDICES Para realizar esta prueba se midió el uso de recursos del Servidor de Índices haciendo una rutina de conexión de un cliente, que consistió en conectar un cliente y hacer una búsqueda.

• API con Aspectos: 00:35:19s; uso de procesador: 31% • API sin Aspectos: 00:50:37s; uso de procesador: 26%

La diferencia promedio es de 00:15:28s a favor de el API con Aspectos, sin embargo el consumo de procesador es de un 5% más que el API sin Aspectos. El API con Aspectos da mayor velocidad por su proceso dinámico, pero éste proceso de corte y tejido de objetos se ve reflejado en mayor consumo de procesador. SI-T5 TIEMPO DE RESPUESTA DEL SERVIDOR DE INDICES Para realizar esta prueba se midió el tráfico de red y el tiempo que se demora haciendo una rutina de conexión de un cliente, que consistió en conectar un cliente y hacer una búsqueda.

• API con Aspectos: 00:29:55s; tráfico de red: 76% • API sin Aspectos: 00:32:47s; tráfico de red: 78%

Esta prueba muestra que los tiempos de respuesta favorece al API con Aspectos en 00:03:08s de diferencia utilizando un 2% menos de tráfico de red. Esto se debe a que el API sin Aspectos es más acoplado haciendo que los mensajes que viajan entre la red sean más pesados.

Page 99: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

85

RL-T4 CONSUMO DE PROCESADOR Y TIEMPO DEL RELAY Para realizar esta prueba se midió el uso de recursos del Relay haciendo una rutina de conexión de un cliente, que consistió en conectar un cliente y hacer una búsqueda.

• API con Aspectos: 00:25:42s; uso de procesador: 21% • API sin Aspectos: 00:41:45s; uso de procesador: 17%

La diferencia promedio es de 00:24:03s a favor de el API con Aspectos, sin embargo el consumo de procesador es de un 4% más que el API sin Aspectos. El API con Aspectos da mayor velocidad por su proceso dinámico, pero éste proceso de corte y tejido de objetos se ve reflejado en mayor consumo de procesador. RL-T5 TIEMPO DE RESPUESTA DEL RELAY Para realizar esta prueba se midió el tráfico de red y el tiempo que se demora haciendo una rutina de conexión de un cliente, que consistió en conectar un cliente y hacer una búsqueda.

• API con Aspectos: 00:16:33s; tráfico de red: 52% • API sin Aspectos: 00:17:43s; tráfico de red: 64%

Esta prueba muestra que los tiempos de respuesta favorece al API con Aspectos en 00:01:10s de diferencia utilizando un 12% menos de tráfico de red. Esto se debe a que el API sin Aspectos es más acoplado haciendo que los mensajes que viajan entre la red sean más pesados. ND-T7 TIEMPO DE BÚSQUEDAS EN LOS NODOS Esta prueba consiste en medir el tiempo de publicar un servicio y hacer una búsqueda sobre el mismo servicio.

• API con Aspectos: 00:02:22s • API sin Aspectos: 00:01:51s

En esta caso es el API sin Aspectos quien tiene menor tiempo de respuesta con una diferencia de 00:00:71s, aunque la diferencia es muy pequeña, 71 milisegundos, se esperaría que el API con Aspectos tuviera un tiempo de respuesta superior dado los resultados de pruebas anteriores, sin embargo 71 milisegundos puede considerarse desfase estadístico. ND-T6 TIEMPO DE RESPUESTA DURANTE EL ENVIÓ DE DATOS ENTRE LOS NODOS Para realizar esta prueba se enviaron varios archivos de diferentes tamaños entre dos Pockets y se calculo la razón promedio

Page 100: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

86

00:13:23s/MB. Lo que quiere decir que el API con Aspectos transmite 1MB en aproximadamente 13 segundos.

10.2 ANALISIS DE IMPACTO DE POA

A partir de los resultados obtenidos se pretende realizar un análisis que muestre el verdadero valor de hacer desarrollos basados en POA frente a los desarrollos basados a POO. Como se pudo ver previamente, en el análisis de las pruebas, el impacto a nivel de desempeño es despreciable debido a que las diferencias son poco significativas. A continuación se mirará el verdadero impacto de POA en el producto.

10.2.1 METRICAS PARA POA

Basados en estudios previos de métricas enfocadas en POA, se seleccionaron algunas de las más dicientes a la hora de comparar los dos paradigmas de programación. Complejidad Ciclomática Mide el número de decisiones lógicas en un segmento de código y cumple con los dos componentes:

Descriptivo, es aquel que identifica código susceptible a errores, difícil de entender, difícil de modificar, difícil de probar y demás. Prescriptivo, es aquel que identifica los pasos operacionales para ayudar a controlar el software, por ejemplo: dividir módulos altamente complejos en varios módulos de menor complejidad o indicar la cantidad de pruebas que deben ejecutarse para cada módulo. [ZMIL]

Máxima Complejidad Es el número de relaciones de la clase que más tiene relaciones [ZVED]

Complejidad cíclica

Tipo de procedimiento

Riesgo

1-4 Un procedimiento Simple

Bajo

5-10 Un procedimiento bien estructurado y estable

Bajo

Page 101: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

87

Complejidad cíclica

Tipo de procedimiento

Riesgo

11-20 Un procedimiento más complejo

Moderado

21-50 Un procedimiento complejo

Alto

>50 Extremadamente problemático

Muy Alto

Tabla 4 Convenciones para métricas de complejidad Reuso El reuso mide el número de llamados a una función desde otras partes del código. Sentencias Métrica que mide el número de sentencias por línea de código. Beneficio Beneficio POA, que mide cual es el beneficio de introducir aspectos. Para ello, define una relación de esfuerzo de desarrollo entre una implementación sin considerar aspectos, y otra donde se aplica el paradigma. Un valor de resultado mayor que uno significa un impacto positivo de la utilización de aspectos. Se tomó en cuenta el factor de desarrollo propuesto por Rich Rice. Este factor establece que para un sistema pequeño el tiempo de desarrollo promedio en Java es de 10 horas/programador, mientras que en AspectJ es de 2 horas/programador. [ZPOA] En esta investigación se asume que el factor de desarrollo de Java es similar en C# y el factor de desarrollo en AspectJ es similar al de la herramienta Rampier Loom.Net.

rrolloPOAFactorDesaspectosTamañoConArrolloPOOFactorDesaspectosTamañoSinAOABeneficioP

××=

ctosTamañoAspeásicaionalidadBTamañoFuncspectosTamañoConA +=

Limpieza Mide el porcentaje de código que se depura de la funcionalidad básica al introducir aspectos. [ZPOA]

Page 102: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

88

( )spectosTamañoSinA

ásicaionalidadBTamañoFuncspectosTamañoSinALimpieza 100××=

10.2.1.1 RESULTADO DE LAS METRICAS

Se utilizaron las siguientes herramientas de calculo de métricas para C#.NET, CCMetrics [ZWOO] y devMetrics [ZVED]. Estas herramientas buscan cargar los módulos del software y arrojar los resultados de las mediciones estándar, algunas de las cuales se explicaron anteriormente.

Complejidad Medio por

Clase

Complejidad de Reuso

Código Reusado

Directorio 7,67 60,87% 62,55%Relay 18,5 21,62% 79,17%Directorio 8,33 64% 56,45%Relay 15 31,11% 79,86%

ASA

CCMetrics

ACA

Tabla 5 Resultados obtenidos con la herramienta CCMetrics

Complejidad Ciclomática

Total

Máxima Complejida Sentencias Total

Sentencias

Directorio 37 8 93Relay 38 2 115Directorio 40 12 167Relay 51 4 206

ASA 489

devMetrics

ACA 476

Tabla 6 Resultados obtenidos con la herramienta devMetrics

Como se puede ver en las tablas 5 y 6, el API con aspectos tiene una menor complejidad en su implementación que el API sin aspectos, así mismo, un mayor porcentaje de código reusado. El número de sentencias que contiene el API con aspectos es menor, puesto que se reduce los llamados a la lógica no-funcional y favorece a tener un código mejor estructurado.

ACA ASA Tamaño AspectosTamaño

Funcionalidad Básica Benefício LimpiezaRelay 20480 25380 4900 15580 6,19628906 38,6130812Directorio 24576 28672 4096 20480 5,83333333 28,5714286

Tamaños en bytes

Tabla 7 Métricas de Beneficio y Limpieza

Page 103: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

89

Los resultados indican que existe un beneficio grande con la introducción de los aspectos en el API, debido a que los valores que se obtuvieron son mayores a 1. Adicionalmente, la métrica de limpieza muestra un porcentaje de reducción del código del 38% en la lógica del Relay y del 28% en la lógica del Directorio con respecto a la implementación basada en objetos.

10.2.2 COMPARACIONES DE LINEAS DE CODIGO

Para realizar estas pruebas se utilizaron las herramientas Counting Lines of Code in C# [ZASA] y Simple Source Line Counter in C# [ZBOL]. Esta prueba consistió en hacer un análisis de la cantidad de líneas de código de cada una de las implementaciones del API. Cabe decir que las dos implementaciones hacen exactamente lo mismo. El conteo de líneas de código es hecho sin contar los comentarios, regiones ni corchetes. El API sin aspectos tiene un total de 1847 líneas en 26 archivos, mientras que el API con aspectos tiene 2031 líneas en 31 archivos de código fuente. A simple vista resultaría mejor prescindir de los aspectos, ya que añade más archivos y líneas de código:

Clases Adicionales Lineas de CódigoAuditoria 41

Irelay 17Idirectorio 15

FabricaObjetosTejidos 24Total 97

Tabla 8 Clases adicionales para los aspectos La tabla 8 muestra las clases necesarias para que la tejedora (en este caso Rapier-Loom.NET) pueda tejer aspectos y objetos; adicionalmente la clase FabricaObjetosTejidos agrupa la lógica de creación de objetos basándose en el patrón de diseño Abstract Factory [GOF]. Así que estas clases adicionales desaparecerán cuando el Framework de Microsoft .NET decida incorporar POA, por otro lado la clase de fabricación es considerada una buena practica en el desarrollo de software.

Aspecto Lineas de CódigoAspectoDirectorio 80

AspectoRelay 124Total 204

Tabla 9 Total líneas de código por aspecto

Page 104: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

90

Mientras que la tabla 9 muestra en sí las líneas de código que emplearon los Aspectos. Pero lo más importante es entender como POA marca la diferencia frete a POO y en general a cualquier paradigma.

Clase Líneas de Código Aspectos Líneas de Código Sin Aspectos DirefenciaRelayLG 63 169 106

DirectorioLG 89 98 9Total 152 267 115

Tabla 10 Total líneas de código por clase a tejer Como se puede observar la diferencia total, es de 115 líneas; estas líneas en tan solo 2 clases se puede considerar significativo ya que por ejemplo la clase RelayLG es superada por más del doble por su versión sin aspectos. Para entrar más en detalle observemos en la clase DirectorioLG a una de las principales funciones del API, BuscarServicio, la cual intercepta a dos aspectos, el de auditoria y el de agilización de búsquedas. La versión basada en aspectos se ve así:

Gráfica 51 Código con aspectos, función búsqueda

Page 105: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

91

El código fuente que se muestra en la gráfica 51 es considerado código totalmente funcional, según los requerimientos y el diseño planteado a lo largo de éste documento. Ahora miremos la versión sin aspectos:

Gráfica 52 Código sin aspectos, función búsqueda

En color rojo se resalta los bloques de código que se adicionan a la función de Búsqueda, código que antes hacía parte del Aspecto y que en el caso del segundo recuadro rojo pertenece al AspectoAuditoria, ese bloque de código se escribe una sola vez en el aspecto y se multiplica en tiempo de ejecución tanto en el directorio como en el Relay, ahorrándole al desarrollador 6 líneas de código.

Page 106: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

92

Aunque POA toma fuerza a medida que el desarrollo es más grande y complejo, en el API se puede ver claramente las ventajas a nivel de diseño que este paradigma trae, un código más transparente, menos entremezclado y con la facilidad de extender incluso luego de la etapa de desarrollo de un proyecto de software sin la necesidad de impactar la lógica funcional.

Page 107: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

93

11 CONCLUSIONES Analizar la viabilidad de implementar soluciones de software basadas en POA utilizando Microsoft Compact Framework.NET era uno de los objetivos de esta investigación. Se realizaron varias pruebas de los diferentes proyectos que ofrecen herramientas para la construcción de Aspectos y la implementación de tejedoras, estableciendo que aún no existe un framework de desarrollo de POA maduro; sin embargo, se escogió la herramienta con mayor soporte y nivel de complejidad relativamente bajo (Rapier-Loom.NET). Se demostró que actualmente Compact Framework no puede implementar aplicaciones basadas en POA por los limitantes tecnológicos que hasta ahora se poseen, se establecieron contactos mediante correo electrónico con los responsables de la mayoría de herramientas para POA, llegando a la conclusión que la librería System.Reflect.Emit, no es soportada por Compact Framework, siendo este el principal conjunto de clases para la implementación de POA en .NET y por ende en cada uno de las herramientas consultadas es utilizado como base. De esta manera ofrecer soluciones para Compact Framework basadas en POA se convierte en una cuestión de diseño, como bien se plasmó en esta investigación es necesario recurrir a arquitecturas, componentes y modelos que permitan aprovechar los beneficios de POA; más aún cuándo Compact Framework es una herramienta para construir aplicaciones tipo cliente. POA, es un nuevo paradigma de implementación de software, concebido para mejorar algunas falencias de POO como el encapsulamiento, reutilización y abstracción, se convierte en una alternativa incluso necesaria; pero, como se encontró durante las pruebas realizadas, los tiempos de compilación y de ejecución de un programa desarrollado con POA contra un programa desarrollado con POO son mayores; este hecho es comprensible, puesto que la máquina virtual debe hacer un esfuerzo extra en la etapa de tejido de los aspectos. Esta investigación experimentó algunos de los beneficios de POA, se demostró lo sencillo que resulta abstraer, encapsular y factorizar el código considerado no funcional y dependiente de la tecnología, como lo es la escritura en archivos, haciendo que el API de comunicaciones cuente con un código sencillo de interpretar y fácil de extender. La extensibilidad se logra a través de la tejedora, ya que esta permite cortar el código, mediante la incorporación de los aspectos en cualquier

Page 108: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

94

lugar en que se necesite sin necesidad de modificarlo, haciendo que el desarrollo de la lógica no funcional se pueda hacer incluso después de tener implementada la lógica funcional. Adicionalmente no importa en que lenguaje o que tejedora se utilice, ya que la lógica de construcción de aspectos corre por parte del lenguaje de aspectos, es decir que la lógica funcional no se entera de la existencia de los aspectos. Sin embargo, aún faltan mejores mecanismos de implementación de puntos de cortes, así como es necesaria la posibilidad de hacer depuración sobre los aspectos, ya que el uso de reflexión no permite mantener una referencia a la herramienta de desarrollo. Se espera que tanto java como .NET incluyan en su roadmap a POA, adicionándole nuevas herramientas a sus ambientes de desarrollo, así como ya lo hizo JBOSS en su versión JBOSS-AOP. Durante el desarrollo del API se observó la importancia vital que jugaron los Patrones de software para el diseño y posterior construcción. Los patrones encierran soluciones a problemas recurrentes, y plantean la mejor opción, se consideran buenas prácticas de programación, garantizando un diseño flexible, reutilizable y extensible. Al programar sobre los dispositivos móviles, el Compact Framework brindó una abstracción aceptable, la forma de la implementación en este ambiente es muy similar al ambiente de escritorio. El gran inconveniente encontrado sobre la implementación en las Pocket PC fue la ausencia en algunos paquetes vitales para esta investigación, debido al consumo de máquina que requieren en si mismos. Es deseable que para futuros lanzamientos sobre el Compact Framework se adicionen las funcionalidades que se encuentran fuera de éste, como es el caso del soporte de la librerías: Reflection.Emit, Remoting, Security.Cryptography, BinaryFormatter, SoapFormatter y de manejos de hilos. Al inicio de ésta investigación se creyó importante realizar una comparación frente a JXTA, ya que este API es un proyecto conocido en el desarrollo de aplicaciones P2P. Sin embargo, como se mostró en las pruebas realizadas, J2ME no es transparente como máquina virtual para Pockets PC, se utilizaron muchas de las diferentes implementaciones de J2ME que existen en el mercado. Se justificó que es más diciente comparar los paradigmas de POA y POO a través del API; es así como se realizaron un total de 20 pruebas bajo el contexto específico del API, encontrando que la diferencia entre POA y POO a nivel de rendimiento,

Page 109: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

95

ejecución y tiempos de respuesta no es muy significativa, mientras que si lo son las ventajas en diseño e implementación que trae POA. Logrando la finalidad de esta investigación, mostrar el valor agregado de POA bajo un contexto específico. Los Servicios Web son parte fundamental de la arquitectura propuesta por Microsoft para el desarrollo de soluciones tecnológicas. La utilización de estos en el desarrollo de esta investigación fue muy benéfica, puesto que se pudo suplir las necesidades de comunicación remota entre los servidores y los clientes, proveyendo un canal seguro, estable y confiable de muy fácil implementación. Para futuros desarrollos se proponen varias posibles mejoras al API, entre las cuales se encuentran la integración de los aspectos en los dispositivos móviles, la inclusión de un proceso de encripción de los datos al ser transferidos y la adaptación de la arquitectura de envió de paquetes tipo Torrent, es decir, que cada uno de los nodos pueda ir consumiendo un mismo servicio de varios nodos, mediante la fragmentación/consolidación de los datos enviados.

Page 110: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

96

12 GLOSARIO API Interfaz de programación de aplicaciones Una API (del ingles Application Programming Interface - Interface de Programación de Aplicaciones, interfaz de programación de la aplicación) es un conjunto de especificaciones de comunicación entre componentes software. Representa un método para conseguir abstracción en la programación, generalmente (aunque no necesariamente) entre los niveles o capas inferiores y los superiores del software. Uno de los principales propósitos de una API consiste en proporcionar un conjunto de funciones de uso general, por ejemplo, para dibujar ventanas o iconos en la pantalla. De esta forma, los programadores se benefician de las ventajas de la API haciendo uso de su funcionalidad, evitándose el trabajo de programar todo desde el principio. Las APIs asimismo son abstractas: el software que proporciona una cierta API generalmente es llamado la implementación de esa API. Las APIs de alto nivel generalmente pierden flexibilidad; por ejemplo, resulta mucho más difícil en un navegador web hacer girar texto alrededor de un punto con un contorno parpadeante que programarlo a bajo nivel. Al elegir usar una API se debe llegar a un cierto equilibrio entre su potencia y simplicidad y su pérdida de flexibilidad. Ejemplos de APIs: Microsoft Win32 API SUN J2EE APIs API for SCSI device interfacing The Carbon APIs for the Macintosh OS Common Object Request Broker Architecture (CORBA) AspectJ AspectJ es un lenguaje de programación orientado por aspectos construido como una extensión del lenguaje Java creado en Xerox PARC. Un compilador de AspectJ hace llegar la noción de aspecto hacia el código de máquina virtual implementando así una noción de relación. Los aspectos en si se escriben en Java extendido generándose un archivo java o compilado con código de máquina compatible con el generado por los compiladores de Java. Aspecto En la informática, un aspecto es una parte de un sistema que entrecruza la lógica funcional. Aislar los aspectos, tales como la autenticación y la

Page 111: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

97

persistencia, de la lógica del negocio es el ideal del paradigma de programación orientado a aspectos. Benchmark Anglicismo traducible al castellano como cota o valor de referencia y utilizado en computación. Es el resultado de la ejecución de un programa informático o un conjunto de programas en una máquina, con el objetivo de estimar el rendimiento de un elemento concreto o la totalidad de la misma, y poder comparar los resultados con máquinas similares. Broadcast Mandar el mismo mensaje simultáneamente a múltiples receptores dentro de la misma red. Esta técnica es muy usada en los sistemas de e-mail, aunque también se usa con los fax. Bug Un error de software o computer bug, que significa bicho de computadora, es el resultado de una falla de programación introducida en el proceso de creación de programas de computadora. El término bug fue acreditado erróneamente a Grace Murray Hopper, una pionera en la historia de la computación, pero Thomas Edison ya lo empleaba en sus trabajos para describir defectos en sistemas mecánicos por el año 1870. Caché En informática, un caché es un conjunto de datos duplicados de otros originales, con la propiedad de que los datos originales son costosos de acceder, normalmente en tiempo, respecto a la copia en el caché. Cuando se accede por primera vez a un dato, se hace una copia en el caché; los accesos siguientes se realizan a dicha copia, haciendo que el tiempo de acceso aparente al dato sea menor. CLR El CLR (Common Language Runtime) es el motor en tiempo de ejecución del .NET Framework, es decir la parte del "entorno" que se encarga de ejecutar el código de los lenguajes del .NET Framework. COOL Lenguaje creado por Xerox, cuya finalidad es la sincronización de hilos concurrentes.

Page 112: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

98

CORBA En computación, Common Object Request Broker Architecture (CORBA) es un estándar que establece una plataforma de desarrollo de sistemas distribuidos facilitando la invocación de métodos remotos bajo un paradigma orientado a objetos. Encripción Se refiere a aquellos programas informáticos de conversión de datos, que codifican y descodifican mensajes en la Red. Se necesita una clave o un conocimiento especial para interpretarlo de manera correcta. Es una traducción poco aceptada del término inglés -encryption-, que tiene otros sinónimos en español como codificar o cifrar Framework Un framework es una estructura extensible para describir un conjunto de conceptos, métodos y tecnologías para el diseño de un producto completo. Hilos concurrentes Muchos lenguajes de programación (como Java y C#), y otros entornos de desarrollo soportan los llamados hilos o hebras (en inglés, threads). Los hilos son similares a los procesos en que ambos representan una secuencia simple de instrucciones ejecutada en paralelo con otras secuencias. Los hilos son una forma de dividir un programa en dos o más tareas que corren simultáneamente. HTTP Protocolo de la Web (WWW), usado en cada transacción. Las letras significan Hyper Text Transfer Protocol, es decir, protocolo de transferencia de hipertexto. El hipertexto es el contenido de las páginas web, y el protocolo de transferencia es el sistema mediante el cual se envían las peticiones de acceder a una página web, y la respuesta de esa web, remitiendo la información que se verá en pantalla. También sirve el protocolo para enviar información adicional en ambos sentidos. IDE Entorno de Desarrollo Interactivo, Interactive Development Environment (IDE) por sus siglas en inglés. Inalámbrica Es un sistema de comunicación que utiliza ondas de radiofrecuencia, ultrasonido o rayos infrarrojos (IR) para intercambiar datos entre

Page 113: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

99

dispositivos. Cada vez se está popularizando más el uso de este sistema para transferencia de datos entre cámaras digitales, PDAs, calculadoras, etc. con la computadora. En Internet, este término es utilizado para indicar que la transmisión de información se efectúa prescindiendo de cables. Es el caso de los celulares con sistema WAP, o las conexiones a Internet. En RedLibre y otras comunidades inalámbricas se emplea para designar las conexiones de red inalámbricas reguladas por la norma IEEE 802.11. J2ME Java 2 Platform Micro Edition. Es la respuesta de Sun Microsystems para una plataforma de dispositivos inalámbricos. El J2ME permite que los desarrolladores usen Java y las herramientas inalámbricas J2ME para crear aplicaciones y programas para dispositivos móviles inalámbricos. Consiste de dos elementos: configuraciones y perfiles. Las configuraciones proveen las librerías y una máquina virtual para una categoría de dispositivos inalámbricos. Hay dos configuraciones para J2ME, una para dispositivos inalámbricos fijos y otra para los móviles. Los perfiles son APIs integradas por encima de las configuraciones para proveer un ambiente de funcionamiento para dispositivos específicos, como PDAs, telefonía celular, o set-top boxes. El perfil administra la aplicación, la interfaz de usuario, las redes y la transmisión de datos. Para soportar aplicaciones Java, los fabricantes tienen que implementar un perfil para cada dispositivo específico. Java Package Carpeta creada para contener clases java, y así poder organizarlas. JBoss Servidor de aplicaciones de código abierto basado Java el cual se puede utilizar en cualquier sistema operativo que soporte a Java. JXTA Conjunto de protocolos para P2P basado en Java; también ha sido implementado para J2ME en la utilización de dispositivos móviles. Librería En computación, una biblioteca o librería es un conjunto de procedimientos y funciones (subprogramas) agrupadas en un archivo con el fin de ser aprovechadas por otros programas. Al proceso de hacer accesibles estos subprogramas al programa principal se le llama enlace (link).

Page 114: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

100

Middleware Conjunto de servicios que permiten que la aplicaciones funciones en una red. Namespace The concept of a namespace has been around for quite a while in programming but has only become a requirement for Visual Basic programmers to know about since XML and .NET became critical technologies. The traditional definition of a namespace is a name that uniquely identifies a set of objects so there is no ambiguity when objects from different sources are used together. Nodo In a discussion of networks, a “node” refers to a processing location. A node can be a computer or some other device, such as a printer. Every node has a unique network address. A device attached to a network. A node uses the network as a means of communication and has an address on the network. P2P Punto a punto En general, una red informática entre iguales (en inglés peer-to-peer y más conocida como P2P) se refiere a una red que no tiene clientes y servidores fijos, sino una serie de nodos que se comportan a la vez como clientes y como servidores de los demás nodos de la red. Este modelo de red contrasta con el modelo cliente-servidor. Cualquier nodo puede iniciar o completar una transacción compatible. Los nodos pueden diferir en configuración local, velocidad de proceso, ancho de banda de su conexión a la red y capacidad de almacenamiento. Debido a que la mayoría de los ordenadores domésticos no tienen una IP fija, sino que le es asignada por el proveedor (ISP) en el momento de conectarse a Internet, no pueden conectarse entre sí porque no saben las direcciones que han de usar de antemano. La solución habitual es realizar una conexión a un servidor (o servidores) con dirección conocida (normalmente IP fija), que se encarga de mantener la relación de direcciones IP de los clientes de la red, de los demás servidores y habitualmente información adicional, como un índice de la información de que disponen los clientes. Tras esto, los clientes ya tienen información sobre el resto de la red, y pueden intercambiar información entre sí, ya sin intervención de los servidores.

Page 115: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

101

Palm La palabra Palm puede referirse a: *PalmOne, Inc., fabricante de hardware para PDAs basadas en Palm OS*PalmSource, Inc., desarrollador de Palm OS *Palm OS, el sistema operativo para la Palm PDA*Palm Pilots, PDAs antiguas. Paradigma de Programación Representan un enfoque particular o filosofía para la construcción del software. No es mejor uno que otro sino que cada uno tiene ventajas y desventajas. También hay situaciones donde un paradigma resulta más apropiado que otro. Parser Programa de computador o un componente de un programa, que analiza la estructura gramatical de una entrada de datos, con respecto a una gramática formal dada. PDA PDA del inglés Personal Digital Assistant, (Ayudante personal digital) es un ordenador de mano originalmente diseñado como agenda electrónica. Hoy en día se puede usar como un ordenador doméstico (ver películas, crear documentos, navegar por Internet, etc.). POA Es un paradigma de programación, su idea principal es la de separar los aspectos de los componentes, estableciendo toda una metodología para abstraer aspectos en el diseño y desarrollo, con la intención de mejorar la reutilización y encapsulamiento del modulo objetivo y la invocación arbitraria de código. Pocket PC PocketPC es un ordenador de bolsillo, también llamado PDA (Personal Digital Assistant). Se trata de un pequeño ordenador, diseñado para ocupar el mínimo espacio y ser fácilmente transportable que ejecuta el sistema operativo Windows CE de Microsoft, el cual le proporciona capacidades similares a los PCs de escritorio. POO (POO u OOP según siglas en inglés) es una metodología de diseño de software y un paradigma de programación que define los programas en términos de "clases de objetos", objetos que son entidades que combinan estado (es decir, datos) y comportamiento (esto es,

Page 116: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

102

procedimientos o métodos). La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que se comunican entre ellos para realizar tareas. Proxy En el contexto de las ciencias de la computación, el término proxy (en inglés «apoderado» o «delegado») hace referencia a un programa que realiza una acción en representación de otro. Punto Un punto o nodo se comportan a la vez como clientes y como servidores de los demás nodos de una red P2P. Cualquier nodo puede iniciar o completar una transacción compatible. Los nodos pueden diferir en configuración local, velocidad de proceso, ancho de banda de su conexión a la red y capacidad de almacenamiento. Reflection Es la habilidad de proveer información de los tipos en tiempo de ejecución de tal manera que el cliente puede descubrir miembros (métodos, campos, propiedades, eventos y tipos anidados) de un tipo. La Reflexión también permite que dichos miembros sean referenciados en tiempo de ejecución, y permite que nuevos tipos sean definidos. Recientemente los tipos definidos pueden ser salvados en disco, como también permite que las instancias puedan ser alocadas en memoria. a la reflexión es común en máquinas virtuales de lenguajes de programación de alto nivel como smalltalk. Relay Termino de la OSI para el dispositivo que se encarga de conectar dos más redes o sistemas para redes. Separación de conceptos La separación de conceptos es el proceso de descomponer un programa en diferentes características que se intercepten en funcionalidad lo menor posible. Smartphone Un smartphose es considerado cualquier dispositivo portable que integre la administración de información personal con las capacidades de un teléfono móvil en el mismo dispositivo.

Page 117: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

103

Supernodo Los Supernodos son una parte esencial de la red de Kazaa. Al ser un Supernodo, otros usuarios en su proximidad pueden descargan automáticamente una lista pequeña de archivos que están compartiendo, siempre que sea con el mismo Proveedor de Internet o localizado en la misma región que usted. Cualquier computadora que usa Kazaa puede convertirse en un Supernodo si tienen una computadora moderna y están teniendo acceso al Internet con una conexión de banda ancha. El ser un Supernodo no afecta su funcionamiento perceptiblemente. UML Lenguaje Unificado de Modelado (UML, por sus siglas en inglés, Unified Modelling Language) es el lenguaje de modelado de sistemas de software más conocido en la actualidad; aún cuando todavía no es un estándar oficial, está apoyado en gran manera por la Object Management Group (OMG), consorcio creado en 1989 responsable de la creación, desarrollo y revisión de la arquitectura CORBA. No produce software, únicamente especificaciones. UXF UXF es el acrónimo de UML eXchange Format, especificación que permite definir nuevos componentes en UML. XML XML es el acrónimo del inglés eXtensible Markup Language (lenguaje de marcado ampliable o extensible) desarrollado por el World Wide Web Consortium (W3C).

Page 118: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

104

13 REFERENCIAS [ADDM] MESALEM. An add-in for Aspect Oriented Programming in Visual Studio.NET.

http://www.codeproject.com/macro/AspectOrientedVSNet.asp [AERS] AERSCHOT. Dynamic Aspect Oriented Programming In .NET.

Universiteit Antwerpen http:// www.lore.ua.ac.be/Publications/pdf/VanAerschot2004.pdf

[AKS2] AKSIT. Examples of Reusing Synchronization Code in Aspect-Oriented Programming using Composition-Filters. University of Twente. http://trese.cs.utwente.nl/oldhtml/ publications/papers/mcseai98.pdf

[AKS3] AKSIT. Solving the modeling problems of object-oriented languages composing multiple aspects using composition filters. University of Twente. http://trese.cs.utwente.nl/aop-ecoop98/papers/Aksit.pdf

[AKSI] AKSIT. Aspect-oriented Programming Using Composition-Filters. University of Twente. http://trese.cs.utwente.nl/oldhtml/publications/paperinfo/mcseai98.pi.ref.htm

[AROR] ARORA, Akhil; HAYWOOD, Carl y PABLA, Kuldip. JXTA for J2ME™– Extending the Reach of Wireless With JXTA Technology. Sun Microsystems, Inc. Marzo 2002

[ASP#] ASPECT#.Framework para AOP en .Net. http://aspectsharp.sourceforge.net/

[ASPB] Aspect Builder. Aspect-Oriented Programming Enables Better Code Encapsulation and Reuse. http://msdn.microsoft.com/msdnmag/issues/02/03/AOP/default.aspx

[ASPJ] ASPECTJ. AspectJ Related Notes. http://eclipse.org/aspectj/

[ASTE] ASTEASUAIN. Programación Orientada A Aspectos Análisis del paradigma.UNIVERSIDAD NACIONAL DEL SUR. 2002 http://www.angelfire.com/ri2/aspectos/Tesis/tesis.pdf

[BLAC] BLACKSTOCK. Aspect Weaving with C# and .NET. University of British Columbia. 2003 http://www.cs.ubc.ca/~michael/publications/AOPNET5.pdf

[BOOC] G. BOOCH, J. RUMBAUGH, I JACOBSON. The Unified Modelling Language User Guide.Addison- Wesley.1998 http://coventry.bcs.org/resources/uml.htm

[CLAR] CLARKE. Separating Concerns throughout the Development Lifecycle.IBM. http://trese.cs.utwente.nl/aop-ecoop99/papers/clarke.pdf

[CLEM] CLEMENTE.Interconexión de Componentes CCM Mediante Programación Orientada a Aspectos http://tdg.lsi.us.es/~sit02/res/papers/clemente.pdf

[CPHC] COUNCIL OF PROFESSORS AND HEADS OF COMPUTING (CPHC) with the support of the uk Quality Assurance Agency (QAA). Towards Benchmarking standards for taught masters degrees in computing. http://www.comp.leeds.ac.uk/roger/cphc/Masters/BM.pdf

[DALA] DALAGER.Aspect Oriented Programming in JBoss 4.0. http://www.jboss.org

[ENT1] REVISTA ENTER. No solo de PC vive el hombre Pag 56-61..edición 15 (2001) [ENT2] REVISTA ENTER. ¿Palm o Pocket? Pag 42-45 .Edición 32 (2002) [FLEU] FLEURY.Jboss Blue “Why I Love EJBs”.

http://www.jboss.org [GAMM] GAMMA, ERICH. Design patterns: elements of reusable object - oriented software;

foreword by Grady Booch. Reading, Massachusetts: Addison-Wesley, 1995.

Page 119: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

105

[GARS] GARSON, EDWARD.Aspect-Oriented Programming in C#/.NET http://consulting.dthomas.co.uk

[GHEZ] GHEZZI. Coding Diferent Design Paradigms for Distributed Applications with Aspect-Oriented Programming.Politecnico di Milano. http:// homes.dico.unimi.it/~monga/lib/wsdaal99.pdf

[JBAO] JBoss AOP. http://www.jboss.org/developers/projects/jboss/aop

[JBOS] JBOSS.Jboss Road Map. http://www.jboss.org

[JXPR] The JXTA Project. http://www.jxta.org

[KAIK] KAI, KOEHNE .AW: Using Loom on Compact Framework. Rapier-Loom.Net Development & Support. 38253

[KIC] KICILLOF. Programación Orientada a Aspectos (AOP).Universida Buenos Aires. http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art152.asp

[KIC2] KICZALES. Interview with Gregor Kiczales. The server side. 2003 http://www.theserverside.com/talks/videos/GregorKiczalesText/interview.tss

[KICZ] KICZALES. Aspect-Oriented Programming. 1997 http://www.cs.ubc.ca/~gregor/papers/kiczales-ECOOP1997-AOP.pdf

[KIM] KIM, HOWARD. AspectC#: An AOSD implementation for C#. http://www.dsg.cs.tcd.ie/index.php?category_id=171.2002

[KINN] KINNEAR. Investigación de Mercados. 5ta Edicion. Mcgraw-Hill. Colombia, 2000. [KIVI] KIVILUOMA. Paradigms for Concern Separation. 2004

http://www.cs.tut.fi/~kk/webstuff/ParadigmsKalvot.pdf [KNUD] KNUDSEN, Jonathan.Getting Started with JXTA for J2ME. Sun Microsystems, Inc.

2002. http://developers.sun.com/techtopics/mobility/midp/articles/jxme/ [LADD] LADDAD. I want my AOP

http://www.JavaWorld.com [LAFF] LAFFERTY. RE: Responder: RE: Using AspectC# on Pocket-Pc.AspectC#.2004,

Septiembre 27, 2004 [LIEB] LIEBERHERR. Aspect-Oriented Programming and its Northeastern History.

http://www.ccs.neu.edu/research/demeter/ talks/phd-visitation-02/visitation.ppt [LOPE] W. Hursch and C. Lopes. Separation of Concerns. Northeastern University,

Febrero1995. [MICP] MICROSOFT. Introduction to Development Tools for Windows Mobile based Pocket

PCs and Smarthphones. Microsoft Corporation. Marzo 2004. [MIHO] WAI-MING, ho; PENNANEAC’H, François; JEZÉQUÉL. Jean-Mark; PLOUZEAU,

Noël. Aspect-Oriented Design with UML. IRISA. [MS01] MICROSOFT.Arquitectura de aplicaciones de .NET: Diseño de aplicaciones y

servicios. http://www.microsoft.com/spanish/msdn/arquitectura/das_doc/Chapter2_Components.doc

[OLSN] OLSON, LANCE. .NET P2P: Writing Peer-to-Peer Networked Apps with the Microsoft .NET Framework.Tomado de: http://msdn.microsoft.com/msdnmag/issues/01/02/netpeers/

[OSSH] OSSHER, Harold y TARR, Peri.Multi-Dimensional Separation of Concerns and The Hyperspace Approach.IBM.2000

[POLZ] POLZE.Configurable Services for mobile Users based on Aspect Descriptions. Microsoft Aspect.NET.

[REIN] ANTONIA Mª REINA QUINTERO.Visión General de la Programación Orientada a Aspectos.www.lsi.us.es/~informes/aopv3.pdf

Page 120: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

106

[RLOM] OPERATING SYSTEMS AND MIDDLEWARE GROUP AT HPI.The LOOM .NET

Project. http://www.dcl.hpi.uni-potsdam.de/research/loom/

[RUPP] RUPP. JBoss 4 and AOP, what gives with it? The Inquirer .Net.2003. http://www.theinquirer.net/?article=9813

[SCHU] SCHULT.Aspect-Oriented Programming with C# and .NET. http://www.dcl.hpi.uni-potsdam.de/cms/papers/papers/isorc2002.pdf

[SLAU] SEAN LAU.Aspect Oriented Programming. 2003. Noviembre 17, 2003. [SLIW] CAROL SLIWA .Pros & Cons: .Net vs. J2EE.

http://www.computerworld.com/developmenttopics/development/story/0,10801,71210,00.html

[TITO] TITOS. Programación orientada a aspectos. Malaj http://www.geocities.com/olmotitos/POA-Malaj.ppt

[YASU] J. SUZUKI, Y. YAMAMOTO.Extending UML with Aspect: Aspect Support in the Design Phase. 3er Aspect-Oriented Programming (AOP) Workshop at ECOOP'99. 1999.

[ZASA] SEATO.Counting Lines of Code in C# By Seato. http://www.codeproject.com/useritems/DirectoryLineCounter.asp

[ZBOL] OLLAR, Tom.Simple Source Line Counter in C# for C#. http://www.codeproject.com/csharp/CSharpLineCounter.asp

[ZMIL] MILANES, José Manuel. Midiendo la Complejidad del Software. Grupo Seti. http://www.gruposeti.com/Recursos/PDFs/COMPLEJIDAD.pdf

[ZPOA] ASTEASUAIN, Fernando; CONTRERAS, Bernardo; ESTEVEZ, Elsa y FILLOTTRANI, Pablo. Programación Orientada a Aspectos: Metodología y Evaluación. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur. Bahía Blanca, Argentina.

[ZVED] DEVMETRICS. devMetrics Documentation. http://www.anticipatingminds.com/Content/Documentation/devMetrics/default.aspx

[ZWOO] CCMETRICS COMPLEXITY ANALYZER. J. Wood Software Services llc. http://www.serviceframework.com/jwss/utility,ccmetrics,utility.aspx

Page 121: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

107

14 REFRENCIAS DE PAGINAS DE INTERNET IBM, JBoss eye new Java plan Martin LaMonica, CNET News.com publicado en ZDNet News: Septiembre 24, 2003 http://news.zdnet.com/2100-3513_22-5081831.html Aspect Oriented Programming in JBoss 4 Christian Dalager, Simon Jorsal y Eske Sort Thesis Weblog http://www.dalager.com/thesis/index.html Marzo 1 de 2004 Aspectj Project Eclipse Foundation http://eclipse.org/aspectj/ April 12 de 2005 AOP: Aspect-Oriented Programming Enables Better Code Encapsulation and Reuse Dharma Shukla, Simon Fell y Chris Sells publicado en MSDN Magazine: Marzo 2002 http://msdn.microsoft.com/msdnmag/issues/02/03/AOP/default.aspx Aspect Oriented Programming Raviraj publicado en C# Corner: Noviembre 20 de 2002 http://www.c-sharpcorner.com/Code/2002/Nov/aop.asp Aspect# The Aspect# Team http://aspectsharp.sourceforge.net/ Octubre 1 de 2004 AspectC# Andrew Jackson, Siobhán Clarke,Howard Kim AspectC#: Intro http://www.dsg.cs.tcd.ie/index.php?category_id=169 Marzo 31 de 2005

Page 122: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

108

Aspect-Oriented Programming with C# and .NET Prof. Dr. Andreas Polze http://www.dcl.hpi.uni-potsdam.de/folien/Net-Days/AOP-with-NET_files/v3_document.htm Mayo 06 de 2005 Welcome to the LOOM .NET Project! Prof. Dr. Andreas Polze, Dipl. Phys. Michael Dirska, Dr. Martin v. Löwis, Dipl. Inf. Bernhard Rabe, Dipl. Inf. Andreas Rasche, Dipl. Inf. Wolfgang Schult, Dipl. Inf. Peter Tröger y Sabine Wagner http://www.dcl.hpi.uni-potsdam.de/research/loom/ Diciembre 6 de 2004 Open Source Aspect-Oriented Frameworks in C# http://csharp-source.net/open-source/aspect-oriented-frameworks An add-in for Aspect Oriented Programming in Visual Studio.NET Mesalem publicado en CodeProject: Diciembre 8 de 2003 http://www.codeproject.com/macro/AspectOrientedVSNet.asp? Weave.NET: Language-Independent Aspect-Oriented Programming Donal Lafferty y Vinny Cahill http://www.dsg.cs.tcd.ie/index.php?category_id=194 Diciembre 9 de 2002 Welcome to aosd.net Harold Ossher, Yvonne Coady, Mehmet Aksit, Brian Barry, Tzilla Elrad, Bob Filman, Gregor Kiczales, Karl Lieberherr Mira Mezini, Gail Murphy y Linda Northrop http://www.aosd.net/ SetPoint: an Aspect-Oriented Tool based on semantic pointcuts, developed using Microsoft's .NET framework http://dependex.dc.uba.ar/setpoint/ Improve modularity with aspect-oriented programming Nicholas Lesiecki publicado en IBM: Enero 1 de 2002 http://www-106.ibm.com/developerworks/java/library/j-aspectj/

Page 123: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

109

I want my AOP! Ramnivas Laddad publicado en JavaWorld Enero 18 de 2002 http://www.javaworld.com/javaworld/jw-01-2002/jw-0118-aspect.html Workshop on Multi-Dimensional Separation of Concerns in Software Engineering (ICSE 2000) http://researchweb.watson.ibm.com/hyperspace/workshops/icse2000/papers-index.htm ThemeUML Siobhán Clarke y Robert J. Walker http://www.dsg.cs.tcd.ie/index.php?category_id=353 Diciembre 9 de 2002 Developing Connected .NET Pocket PC Applications Using Web Services Andreas Sjöström Publicado en MSDN:Agosto 2003 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/connecteddotnetppcapps.asp The International Software Benchmarking Standards Group (ISBSG) http://www.isbsg.org/ Enero 25 de 2005 United Kingdom Software Metrics Association http://www.uksma.co.uk/ Performance Comparison: .NET Remoting vs. ASP.NET Web Services Priya Dhawan publicado en MSDN: Septiembre 2002 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdadotnetarch14.asp OOP vs AOP Mariano Lorente http://www.programemos.com/Articulos/1077227754/OOPvsAOP/ Agosto 1 de 2004

Page 124: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

110

Detecting IP Address of Pocket PC Pete Vickers http://www.dotnet247.com/247reference/msgs/58/290850.aspx Detecting network connection Ignacio Machin http://www.dotnet247.com/247reference/msgs/52/262844.aspx Choosing a Windows Embedded API: Win32 vs. the .NET Compact Framework Paul Yao, Windows Embedded MVP publicado por MSDN: Sep`tiembre 2002 http://msdn.microsoft.com/mobility/understanding/articles/default.aspx?pull=/library/en-us/dncenet/html/choose_api.asp Documenting your code with NDoc Peter Foot http://www.opennetcf.org/PermaLink.aspx?guid=05650440-2281-4f72-bdb2-fe6343284dca 2003 File transfer using network I/O - I Yashavant Kanetkar http://www.expresscomputeronline.com/20030303/techspace2.shtml Fundamentals of Microsoft .NET Compact Framework Development for the Microsoft .NET Framework Developer Denise Barnes publicado por MSDN: Diciembre de 200 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/net_vs_netcf.asp3 Programming Merge Replication with the Microsoft .NET Compact Framework Content Master Ltd publicado por MSDN: Abril 2003 http://msdn.microsoft.com/mobility/understanding/articles/default.aspx?pull=/library/en-us/dnnetcomp/html/netcfmergereplication.asp

Page 125: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

111

Differences in Microsoft .NET Compact Framework Development between the Pocket PC and Windows CE .NET Jim Wilson publicado por MSDN: Marzo 2003 http://msdn.microsoft.com/mobility/understanding/articles/default.aspx?pull=/library/en-us/dnnetcomp/html/netcfPPCtoCE.asp Using the Emulator in Smart Device Projects Don Espen, Jose Baldner y Ximing Zhou publicado en MSDN: Febrero 2003 http://msdn.microsoft.com/mobility/understanding/articles/default.aspx?pull=/library/en-us/dv_vstechart/html/grfUsingEmulatorInSmartDeviceProjects.asp Windows Mobile for Developers http://www.microsoft.com/windowsmobile/developers/default.mspx OpenNETCF.org: The Premier .NET Compact Framework Shared Source Site http://opennetcf.org/CategoryView.aspx?category=Home Microsoft .NET Compact Framework Multi-threading Tips Content Master Ltd publicado por MSDN: Abril de 2003 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/netcfmultithreadedapp.asp .NET P2P: Writing Peer-to-Peer Networked Apps with the Microsoft .NET Framework Lance Olson publicado en MSDN Magazine: Febrero 2001 http://msdn.microsoft.com/msdnmag/issues/01/02/netpeers/ P2P And C# Shripad Kulkarni http://www.csharphelp.com/archives/archive261.html Generic P2P Architecture, Tutorial and Example Daniel Stephen Rule publicado por CodeProject: Mayo de 2005 http://www.codeproject.com/vbscript/Generic_P2P_Architecture.asp

Page 126: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

112

J2ME Downloads http://java.sun.com/j2me/download.html IBM Workplace Client Technology, Micro Edition https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?source=wctme57&S_PKG=dl&S_TACT=104AHW42 Java Support on Pocket PC http://www.comp.lancs.ac.uk/computing/users/fittond/ppcjava.html Ewe VM http://www.ewesoft.com SuperWaba VM http://www.superwaba.com.br IBM WebSphere Studio http://www.ibm.com/websphere Sun PersonalJava http://java.sun.com/products/personaljava/index.html JXTA Project http://www.jxta.org ASP.NET Web Services or .NET Remoting: How to Choose Priya Dhawan y Tim Ewald publicado por MSDN: Septiembre 2002 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdadotnetarch16.asp Use Threading with Asynchronous Web Services in .NET Compact Framework to Improve User Experience Christian Forsberg publicado por MSDN: Febrero 2004 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/use_thread_async_web_services.asp File Merger and Splitter in C# Say Gin Teh publicado por C#: Octubre 4 de 2001 http://www.c-sharpcorner.com/1/FileMergerAndSplitter.asp

Page 127: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

113

15 ANEXOS Anexo 1. Comunicación con el soporte de la herramienta Rapier-

Loom.Net De Koehne Kai <[email protected]> Añadir remitente

Sent Jueves, Septiembre 23, 2004 5:10 am

Para [email protected]

CC Schult Wolfgang <[email protected]>

Asunto AW: Using Loom on Compact Framework

Hello, I must unfortunately say that Rapier-Loom.Net will not work with Microsoft .NET CF. This is because it relies heavily on classes in the System.Reflection.Emit namespace, which seem not to be available with the Compact Framework. Kai Koehne Rapier-Loom.Net Development & Support -----Ursprüngliche Nachricht----- Von: [email protected] [mailto:[email protected]] Gesendet: Mittwoch, 22. September 2004 23:04 An: [email protected] Betreff: Using Loom on Compact Framework Wichtigkeit: Hoch Hello, I'm an university student, and I was testing the axample application with Loom on Microsoft Compact Framework 2003 using Visual Studio, but it never works, so I want to know if I can use Loom and aspects oriented programming in general with Pocket Pc. Your answer is very important for a researh that I am making. Thank You, Paulo Andrés Burgos Heredia Pontificia Universidad Javeriana - Bogotá, Colombia

Page 128: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

114

Anexo 2. Comunicación con el Soporte de la herramienta AspectC#

De Donal Lafferty <[email protected]> Añadir remitente

Sent Viernes, Septiembre 24, 2004 9:19 am

Para [email protected]

Asunto RE: Using AspectC# on Pocket-Pc

Archivos adjuntos OOPSLA2003_FP.pdf 934K AspectC# hasn't been actively developed on. If you need to do weaving, I've a library that works for XML-based crosscuttnig specifications based on the AspectJ language. I'm writing up my thesis on the tool at the moment, so why don?t you start by looking at the following OOPSLA 2003 paper, and decide if the weaver's of interest. DL > -----Original Message----- > From: [email protected] > [mailto:[email protected]] > Sent: 23 September 2004 16:26 > To: [email protected] > Subject: Using AspectC# on Pocket-Pc > > > Hello, > > I'm an university student, and I was testing an axample application > with AspectC# on Microsoft Compact Framework 2003 using > Visual Studio, > but > it never works, so I want to know if I can use AspectC# and aspects > oriented programming in general with Pocket Pc. Your answer is very > important for a researh that I am making. > > Thank You, > > Paulo Andrés Burgos Heredia > Pontificia Universidad Javeriana - Bogotá, Colombia >

Page 129: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

115

Anexo 3. Comunicación con Mesalem, creador de un Add-in para Visual Studio para el tejido de aspectos

De Mesalem <[email protected]> Añadir remitente

Sent Domingo, Septiembre 26, 2004 6:54 am

Para paburgos <[email protected]>

Asunto [CodeProject] Re: Using the Add-in on Pocket-Pc

*** DO NOT REPLY TO THIS MESSAGE *** This message has been sent from an unattended email box. The actual reply address can be found below. An answer has been posted to your message on the page 'An add-in for Aspect Oriented Programming in Visual Studio.NET': URL : http://www.codeproject.com/macro/AspectOrientedVSNet.asp?msg=933425#xx933425xx From: Mesalem ([email protected]) I made a simple .net cf application and used the addin in it and it worked I wasn't able to reproduce your problem, if you can send me your code i'll try to fix it --------------------------------------------------------------- This message was created by The Code Project http://www.codeproject.com

Page 130: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

116

Anexo 4. Migración del add-in de aop en .net con el Ejemplo Observer Pattern

Esta implementación se probó con una aplicación que aplicaba el patrón observer [GOF] mediante aspectos en los observadores, y generaba código en tiempo de compilación, antes de ser ejecutado. Objetos de la Solución: Archivos Xml con la descripción del Aspecto aspectDescriptor.xml <?xml version="1.0" encoding="utf-8"?> <aspects> <aspect name="SubjectObserverAspect" code="SubjectObserverAspect.vb" weave="true"> <advices> <advice type="after"> <method name="initObservers" /> <pointcut> <execution> <method name="SubjectForm_Load" class="SubjectForm" access="*" return="*"/> </execution> </pointcut> </advice> <advice type="after"> <method name="afterEvent" /> <pointcut> <execution> <method name="Button1_Click" class="SubjectForm" access="*" return="*" /> </execution> </pointcut> </advice> </advices> <introductions> <member name="Observers" introduceto="SubjectForm" /> <interface name="Subject" introduceto="SubjectForm" /> <interface name="Observer" introduceto="Observer*" /> </introductions> </aspect> </aspects> Archivos con la descripción del Aspecto (Tejedor) SubjectObserverAspect.vb Public Class SubjectObserverAspect_vb Inherits AspectLib.Aspect #Region "Subject Functionality" Public Observers As New ArrayList Public Sub AddObserver(ByVal ob As Observer) Observers.Add(ob) End Sub

Page 131: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

117

Public Sub UpdateObservers(ByVal subj As SubjectForm) Dim ob As Observer For Each ob In Observers ob.UpdateObserver(subj.BackColor) Next End Sub Public Sub initObservers(ByVal f As SubjectForm) f.AddObserver(f.o1) End Sub #End Region #Region "Observer Functionality" Public Sub UpdateObserver(ByVal obs As Form, ByVal note As Object) Dim c As Color = CType(note, Color) obs.BackColor = c End Sub #End Region End Class Public Interface Subject Sub UpdateObservers() Sub AddObserver(ByVal ob As Observer) End Interface Public Interface Observer Sub UpdateObserver(ByVal note As Object) End Interface Objetos del ejemplo SubjectForm.vb Public Class SubjectForm Inherits System.Windows.Forms.Form Friend WithEvents ComboBox1 As System.Windows.Forms.ComboBox Friend WithEvents Button1 As System.Windows.Forms.Button Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu + Windows Form Designer generated code Public o1 As New ObserverForm1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim curColor As String = ComboBox1.SelectedItem Select Case curColor Case "Red" Me.BackColor = Color.Red Case "Green" Me.BackColor = Color.Green Case "Blue" Me.BackColor = Color.Blue End Select End Sub End Class ObserverForm1.vb Public Class ObserverForm1 Inherits System.Windows.Forms.Form

Page 132: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

118

+ Windows Form Designer generated code End Class

Librerías usadas Librería de Aspectos AspectLib.dll Librería de Microsoft Mscorlib.dll

Page 133: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

119

Anexo 5. Investigation sobre Desarrollo de .net Compact Framework Aspect Sharp (aspectsharp.sourceforge.net)

El paquete de Aspect Sharp contiene un ejemplo en el cual se graban mensajes digitados por pantalla a un archivo de texto en la carpeta donde se depura el programa. El paquete de software de aspect sharp permite manejar una serie de clases ya implementadas las cuales sirven de base para trabajar con la programación orientada a aspectos. Entre los principales servicios se encuentra un proxy dinámico sobre el cual se define la forma de llamado de una clase que implementa una interfaz. La estructura básica sobre la cual se construyen los aspectos, esta dado por el siguiente árbol de especificación (en formato XML –E: Elemento A: Atributo-)

Ejemplo de envió de mensaje

Page 134: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

120

El paquete de Aspect Sharp contiene un ejemplo en el cual se graban mensajes digitados por pantalla a un archivo de texto en la carpeta donde se depura el programa. Programa principal El código fuente que ejecuta el programa de ejemplo es el siguiente, en la sección señalada se hace uso de la creación de un proxy para enviar el mensaje: namespace AspectSharp.Sample { using System; using AspectSharp.Framework; using AspectSharp.Sample.Model; class AspectSharpSample { [STAThread] static void Main(string[] args) { Console.WriteLine("Type 'exit' to exit."); while(true) { Console.Write("Enter a message: "); string userInput = Console.ReadLine(); if (userInput == "exit") { return; } //Creating the proxy IMessage message = AspectSharpEngine.Wrap( new MessageImpl() ) as IMessage; message.Message = userInput; //Casting to the persistence service IMessagePersistence persistence = (IMessagePersistence)message; persistence.Save(); } } } }

Es importante señalar que en el ejemplo que trae el programa no usa otra implementación sobre las librerías de aspectos.

Page 135: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

121

Anexo 6. Ejemplo desarrollado en Rapier Loom.Net Definición del Aspecto (muestra un cuadro de dialogo) Consiste en una aplicación bancaria que cada vez que se hace un retiro lanza un mensaje con el texto “Aspecto!”. using System; using System.Windows.Forms; using Loom; namespace BancariaAspectos.Aspectos { public class AspectoSeguridad: Loom.Aspect { [Loom.ConnectionPoint.Include("Retirar")] [Loom.Call(Invoke.Before)] public void Trace(object []args) { try { MessageBox.Show("Aspecto :D!! "); } catch(Exception e) { MessageBox.Show(""+e.InnerException); } } } }

Parte de la lógica donde se lanza el aspecto definido anteriormente using System.Windows.Forms; using BancariaAspectos.Datos; using BancariaAspectos.Aspectos; namespace BancariaAspectos.Logica { public class Logica:Datos.Datos { public bool RetirarPlatica(double numSaldo, int numCuenta, double numSaldoActual) { AspectoSeguridad aspecto = new AspectoSeguridad(); ITransaccion tran =(ITransaccion)Loom.Weaver.CreateInstance( typeof(Datos.Datos), null, aspecto); try { tran.Retirar(numSaldo, numCuenta, numSaldoActual); } catch(Exception e) { MessageBox.Show(e.InnerException +""); return false; } return true; } } }

Interfaz con la que se va a relacionar el aspecto using System; namespace BancariaAspectos.Datos { public interface ITransaccion {

Page 136: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

122

bool Retirar(double saldoNuevo, int numCuenta, double numSaldo); bool Consignar(double saldoNuevo, int numCuenta, double numSaldo); } }

Implementación de la interfaz using System; using System.Data.SqlClient; using Microsoft.ApplicationBlocks.Data; namespace BancariaAspectos.Datos { public class Datos: ITransaccion { private string perfil = "User ID=sa;Initial Catalog=Bancaria;Data Source=127.0.0.1"; public bool Retirar(double saldoNuevo, int numCuenta, double numSaldo) { if(numSaldo < saldoNuevo) { return false; } numSaldo = numSaldo - saldoNuevo; using(SqlConnection objConn = new SqlConnection(perfil)) { SqlHelper.ExecuteNonQuery(objConn, "bcnSaldo_U", numCuenta, numSaldo); } return true; } public bool Consignar(double saldoNuevo, int numCuenta, double numSaldo) { numSaldo = numSaldo + saldoNuevo; using(SqlConnection objConn = new SqlConnection(perfil)) { SqlHelper.ExecuteNonQuery(objConn, "bcnSaldo_U", numCuenta, numSaldo); } return true; } public double ObtenerSaldo(int numCuenta) { Object obj = new Object(); using(SqlConnection objConn = new SqlConnection(perfil)) { obj = SqlHelper.ExecuteScalar(objConn, "bcnSaldo_S", numCuenta); } return Convert.ToDouble(obj); } public int ObtenerCuenta(int numCedula) { using(SqlConnection objConn = new SqlConnection(perfil)) { Object obj = SqlHelper.ExecuteScalar(objConn, "bcnCuenta_S", numCedula); if(obj == null) return -1; return (int)(obj); } } } }

Page 137: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

123

An

exo 7

. D

iag

ram

as

de S

ecu

en

cia

7.1

C

aso

de U

so:

Ate

nd

er

Solici

tud

IDire

ctor

ioD

irect

orio

Rel

ayR

elay

SVIR

elay

Rel

ayLG

Pock

et P

CSe

rvid

orSo

licitu

des

Dire

ctor

ioD

irect

orio

SVSe

rvid

or S

olic

tude

sM

anej

ador

Solic

itude

s

Petic

ionN

Petic

ion

Solic

itude

sPe

ticio

nEm

isor

Tran

sfer

enci

asas

pRel

ayAs

pect

oRel

ayAu

dito

riaAs

pect

oAud

itoria

aspD

irect

orio

Aspe

ctoD

irect

orio

Petic

ionS

ervi

cio

Petic

ion

9: 'A

tend

erSo

licitu

d(ob

ject

[],s

tring

):voi

d'

6: 'T

empo

rizar

Clie

nte(

obje

ct []

):voi

d'

2.1:

<co

nstru

ctor

>(in

t,int

,stri

ng,s

tring

)

2: <

<Rec

orrid

o>>

2.1.

1: 'P

rest

arSe

rvic

io(T

ipos

.Pet

icio

n):v

oid'

11: <

<elim

inar

>>

10: A

tend

erSo

licitu

d(in

t,int

,stri

ng,s

tring

):voi

d

8.1:

<<i

nter

cepc

i>>

1.1.

1.1:

Obt

ener

Solic

iude

s(in

t):Pe

ticio

n[]

4: A

tend

erSo

licitu

d(in

t,int

,stri

ng,s

tring

):voi

d

3: E

nvia

rDat

os(S

ocke

t,byt

e [],

INot

ifica

dor):

void

1: O

bten

erSo

liciu

des(

int):

Tipo

s.Pe

ticio

n[]

8: A

tend

erSo

licitu

d(in

t,int

,stri

ng,s

tring

):voi

d

1.1.

1: O

bten

erSo

liciu

des(

int):

Petic

ion[

]

7: A

tend

erSo

licitu

d(in

t,int

,stri

ng,s

tring

):voi

d

5: <

<int

erce

pci

>>

1.1:

Obt

ener

Solic

iude

s(in

t):Ti

pos.

Petic

ion[

]

10.1

: Ate

nder

Solic

itud(

int,i

nt,s

tring

,stri

ng):v

oid

1.1.

1.1.

1: O

bten

erSo

liciu

des(

int):

Petic

ion[

]

Page 138: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

124

7.2

C

aso

de U

so:

squ

ed

a S

erv

icio

s

Pock

etPC

Clie

nteL

GR

elay

Rel

aySV

Dire

ctor

ioD

irect

orio

SVD

irect

orio

L

ico

Dire

ctor

ioLG

Punt

osN

odo

Res

ulta

doR

esul

tado

Busq

ueda

aspD

irect

orio

Aspe

ctoD

irect

orio

aspR

elay

Aspe

ctoR

elay

IRel

ayR

elay

LGID

irect

orio

Dire

ctor

ioAu

dito

riaAs

pect

oAud

itoria

Clie

nte

Fina

l

1: B

usqu

eda(

strin

g):T

ipos

.Res

ulta

doBu

sque

da[]

4: B

usqu

eda(

strin

g):R

esul

tado

Busq

ueda

[]

3.1:

Bus

qued

a(st

ring)

:Tip

os.R

esul

tado

Busq

ueda

[]

2.1.

1: 'T

empo

rizar

Clie

nte(

obje

ct []

):voi

d'

3.1.

1.1.

1: 'I

nter

cept

arBu

sque

da(o

bjec

t [],s

tring

):voi

d'

3.1.

1.2.

1: B

usqu

eda(

strin

g):R

esul

tado

Busq

ueda

[]

3.1.

1.2:

'Int

erce

ptar

Busq

ueda

Para

Agiliz

ar(o

bjec

t []):

Res

ulta

doB

usqu

e...

3.1.

1.1:

'Int

erce

ptar

Busq

ueda

(obj

ect [

]):vo

id'

5.1:

<co

nstru

ctor

>(in

t,stri

ng,lo

ng)

6: 'A

ctua

lizar

Busq

ueda

s(ob

ject

[]):v

oid'

5: E

staS

ervi

cio(

strin

g):A

rrayL

ist

3.1.

1: <

<int

erce

pci

>>

3: B

usqu

eda(

strin

g):T

ipos

.Res

ulta

doBu

sque

da[]

2.1:

<<i

nter

cepc

i>>

7:2: B

usqu

eda(

strin

g):T

ipos

.Res

ulta

doBu

sque

da[]

En c

aso

que

la li

sta

de re

sulta

dos

este

vac

ia,

real

iza

lab俍

qued

a

Page 139: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

125

7.3

C

aso

de U

so:

Con

ect

ar

aspR

elay

Aspe

ctoR

elay

Punt

oN

odo

Rel

ayR

elay

SV

Pock

etPC

Clie

nteL

G

IRel

ayR

elay

LGD

irect

orio

Dire

ctor

ioSV

aspD

irect

orio

Aspe

ctoD

irect

orio

Audi

toria

Aspe

ctoA

udito

riaID

irect

orio

Dire

ctor

ioD

irect

orio

L

ico

Dire

ctor

ioLG

Serv

idor

Serv

idor

Solic

itude

s

Clie

nte

Fina

l

2: A

greg

arC

lient

e():v

oid

1: <

cons

truct

or>(

INot

ifica

dor,s

tring

)

8.1:

Lan

zarS

ervi

dor()

:voi

d

7.1:

<co

nstru

ctor

>(in

t,stri

ng)

7: A

greg

arC

lient

e(st

ring)

:int

5.1.

1: A

greg

arC

lient

e(ob

ject

[],s

tring

):voi

d

5.1:

Agr

egar

Clie

nte(

obje

ct []

):voi

d

5: <

<int

erce

pci

>>

6: A

greg

arC

lient

e(st

ring)

:int

4: A

greg

arC

lient

e(st

ring)

:int

8: <

cons

truct

or>(

int,I

Not

ifica

dor,s

tring

)

3: A

greg

arC

lient

e(st

ring)

:int

3.1:

<<i

nter

cepc

i>>

3.2:

Agr

egar

Clie

nte(

strin

g):in

t

3.1.

1: 'T

empo

rizar

Clie

nte(

obje

ct []

):voi

d'

Page 140: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

126

7.4

C

aso

de U

so:

Desc

on

ect

ar

Dire

ctor

ioD

irect

orio

SVD

irect

orio

L

ico

Dire

ctor

ioLG

Punt

oN

odo

Pock

etPC

Clie

nteL

GAu

dito

riaAs

pect

oAud

itoria

Rel

ayR

elay

SVas

pDire

ctor

ioAs

pect

oDire

ctor

ioID

irect

orio

Dire

ctor

ioIR

elay

Rel

ayLG

Serv

idor

Serv

idor

Solic

itude

sM

anej

ador

Man

ejad

orSo

licitu

des

Petic

ione

sPe

ticio

n

Clie

nte

Fina

l

1: E

limin

arC

lient

e():v

oid

7: <

<elim

inar

>>

2.1.

1: E

limin

arC

lient

e(in

t):vo

id

6: E

limin

arC

lient

e(in

t):vo

id

4: E

limin

arC

lient

e(in

t):vo

id

2.1.

1.1.

1.2:

'Act

ualiz

arBu

sque

das(

obje

ct []

):voi

d'

2.1.

1.1.

1: E

limin

arC

lient

e(ob

ject

[]):v

oid

2.1.

1.1.

1.1:

Elim

inar

Clie

nte(

obje

ct []

,stri

ng):v

oid

2.1:

Elim

inar

Clie

nte(

int):

void

8: <

<elim

inar

>>

2: E

limin

arC

lient

e(in

t):vo

id

5: <

<elim

inar

>>

3: E

limin

arC

lient

e(in

t):vo

id

2.1.

1.1:

<<i

nter

cepc

i>>

Page 141: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

127

7.5

C

aso

de U

so:

En

via

r D

ato

s

Emis

or/R

ecep

tor

Clie

nteL

GTr

ansf

eren

cias

Tran

sfer

enci

as

Clie

nte

Fina

l 5: 'R

ecib

irMen

saje

(Stre

am,b

yte[

],IN

otifi

cado

r):in

t'

4: 'R

ecib

irMen

saje

(Soc

ket,b

yte[

],IN

otifi

cado

r):in

t'

3: 'E

nvia

rDat

os(s

tring

,byt

e [],

INot

ifica

dor):

void

'

2: 'E

nvia

rDat

os(S

tream

,byt

e [],

INot

ifica

dor):

void

'

1: 'E

nvia

rDat

os(S

ocke

t,byt

e [],

INot

ifica

dor):

void

'

5.1:

Rec

ibirM

ensa

je(S

tream

,byt

e[],I

Not

ifica

dor):

int

4.1:

Rec

ibirM

ensa

je(S

ocke

t,byt

e[],I

Not

ifica

dor):

int

3.1:

Env

iarD

atos

(stri

ng,b

yte

[],IN

otifi

cado

r):vo

id

2.1:

Env

iarD

atos

(Stre

am,b

yte

[],IN

otifi

cado

r):vo

id

1.1:

Env

iarD

atos

(Soc

ket,b

yte

[],IN

otifi

cado

r):vo

id

Func

ione

sso

brec

arga

das

para

env

iar y

reci

bir d

atos

Page 142: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

128

7.6

C

aso

de U

so:

Pu

blica

ción

de S

erv

icio

s

Dire

ctor

io L

ic

oD

irect

orio

LGIR

elay

Rel

ayLG

IDire

ctor

ioD

irect

orio

aspD

irect

orio

Aspe

ctoD

irect

orio

Rel

ayR

elay

SVas

pRel

ayAs

pect

oRel

ayPo

cket

PCC

lient

eLG

Dire

ctor

ioD

irect

orio

SVPu

nto

Nod

oAu

dito

riaAs

pect

oAud

itoria

Clie

nte

Fina

l1:

Agr

egar

Serv

icio

(stri

ng,lo

ng):v

oid

6.1:

Agr

egar

Serv

icio

(stri

ng,lo

ng):v

oid

5: A

greg

arSe

rvic

io(in

t,stri

ng,lo

ng):v

oid

4: <

<int

erce

pci

>>

2: A

greg

arSe

rvic

io(in

t,stri

ng,lo

ng):v

oid

2.1.

1: 'T

empo

rizar

Clie

nte(

obje

ct []

):voi

d'

2.1:

<<i

nter

cepc

i>>

3: A

greg

arSe

rvic

io(in

t,stri

ng,lo

ng):v

oid

4.1.

1: A

greg

arSe

rvic

io(o

bjec

t [],s

tring

):voi

d

4.1:

Agr

egar

Serv

icio

(obj

ect [

]):vo

id

5.1:

Agr

egar

Serv

icio

(int,s

tring

,long

):voi

d

3.1:

Agr

egar

Serv

icio

(int,s

tring

,long

):voi

d

6: A

greg

arSe

rvic

io(s

tring

,long

):voi

d

Page 143: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

129

7.7

C

aso

de U

so:

Solici

tar

Serv

icio

Page 144: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

130

Anexo 8. Especificación del API

Detalle de la Clase

Class AspectoAuditoria public Clase AspectoAuditoria AspectoAuditoria es un Aspecto que se encarga de llevar un log de auditoria en el Servidor de Indices o Directorio.

Resumen de los Atributos private string instaciaTejida

Constante que indica el nombre de la instancia

private StreamWriter log Flujo de escritura

private FileStream put Flujo para el manejo de archivos

Resumen de los Constructores

public AspectoAuditoria() Constructora por defecto

Resumen de los Métodos

public void AgregarCliente(object [] args, string insTejer) Método del Aspecto que intercepta la función AgregarCliente en la clase Directorio o RelayLG con el fin de persistir la información de los clientes que se conectana a la red

Page 145: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

131

Resumen de los Métodos

public void AgregarServicio(object [] args, string insTejer) Método del Aspecto que intercepta la funcion AgregarServicio en el Directorio y en el Relay con el fin de persistir la información los logs de la red

public void cerrarEscritura() Método que cierra los flujos de escritura al archivo log.txt

public void EliminarCliente(object [] args, string insTejer) Método del Aspecto que intercepta la funcion EliminarCliente en el Directorio y en el Relay con el fin de persistir la información los logs de la red.

public void iniciarEscritura() Método que se encarga de iniciar un flujo de escritura para crear el log

public void interceptarBusqueda(object [] args, string insTejer) Método del Aspecto que intercepta la funcion Busqueda en el Directorio y en el Relay con el fin de persistir la información los logs de la red.

Detalles de los Atributos

instaciaTejida private string instaciaTejida

Constante que indica el nombre de la instancia

Page 146: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

132

log private StreamWriter log

Flujo de escritura

put private FileStream put

Flujo para el manejo de archivos

Detalle del Constructor

AspectoAuditoria public AspectoAuditoria()

Constructora por defecto

Detalle de los Métodos

AgregarCliente public void AgregarCliente(object [] args, string insTejer)

Método del Aspecto que intercepta la funcion AgregarCliente en la clase Directorio o RelayLG con el fin de persistir la información de los clientes que se conectana a la red Parameteros:

Arreglo de objetos que almacena en orden los atributos de la funcion interceptada contiene el nombre de la instancia que esta siendo tejida, con ingresar la informaciónl log correspondiente

AgregarServicio public void AgregarServicio(object [] args, string insTejer)

Método del Aspecto que intercepta la funcion AgregarServicio en el Directorio y en el Relay con el fin de persistir la información los logs de la red

Page 147: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

133

Parameteros: Arreglo de objetos que almacena en orden los atributos de la funcion interceptada contiene el nombre de la instancia que esta siendo tejida, con ingresar la informaciónl log correspondiente

cerrarEscritura public void cerrarEscritura()

Método que cierra los flujos de escritura al archivo log.txt

EliminarCliente public void EliminarCliente(object [] args, string insTejer)

Método del Aspecto que intercepta la funcion EliminarCliente en el Directorio y en el Relay con el fin de persistir la información los logs de la red. Parameteros:

Arreglo de objetos que almacena en orden los atributos de la funcion interceptada. Contiene el nombre de la instancia que esta siendo tejida, con ingresar la informaciónl log correspondiente.

iniciarEscritura public void iniciarEscritura()

Método que se encarga de iniciar un flujo de escritura para crear el log

interceptarBusqueda public void interceptarBusqueda(object [] args, string insTejer)

Método del Aspecto que intercepta la funcion Busqueda en el Directorio y en el Relay con el fin de persistir la información los logs de la red.

Page 148: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

134

Parameteros: Arreglo de objetos que almacena en orden los atributos de la funcion interceptada. Contiene el nombre de la instancia que esta siendo tejida, con ingresar la informaciónl log correspondiente.

Clase AspectoDirectorio public Clase AspectoDirectorio Implementa:

Loom.Aspect

AspectoAuditoria es un Aspecto que se encarga de llevar un log de auditoria en el Servidor de Indices o Directorio. Resumen de los Atributos

private AspectoAuditoria aspAuditoria Aspecto que encapsula la auditoria del sistema

private static string instaciaTejida Constante que indica el nombre de la instancia

private Hashtable marrResultadoBusquedas Resumen de los Constructores

public AspectoDirectorio() Constructor por defecto

Resumen de los Métodos

public void actualizarBusquedas(object [] args) public void AgregarCliente(object [] args)

Método del Aspecto que intercepta la funcion AgregarCliente en la clase Directorio.

Page 149: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

135

Resumen de los Métodos

public void AgregarServicio(object [] args) Método del Aspecto que intercepta la funcion AgregarServicio en el Directorio con el fin de invocar la clase AspectoAuditoria, encargada de implementar la la lógica de persistir la información del servicio en la red P2P.

public void EliminarCliente(object [] args) Método del Aspecto que intercepta la funcion EliminarCliente en el Directorio y en el Relay con el fin de invocar la clase AspectoAuditoria, encargada de implementar la la lógica de persistir la información los clientes que han salido de la red.

public void interceptarBusqueda(object [] args) public ResultadoBusqueda interceptarBusquedaParaAgilizar(object []

args) public void RefrescarBusquedas(object [] args)

Detalles de los Atributos

aspAuditoria private AspectoAuditoria aspAuditoria

Aspecto que encapsula la auditoria del sistema

instaciaTejida private static string instaciaTejida = "Directorio"

Constante que indica el nombre de la instancia

marrResultadoBusquedas private Hashtable marrResultadoBusquedas

Page 150: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

136

Detalles del Constructor

AspectoDirectorio public AspectoDirectorio()

Constructor por defecto

Detalle de los Métodos

actualizarBusquedas public void actualizarBusquedas(object [] args)

AgregarCliente public void AgregarCliente(object [] args)

Método del Aspecto que intercepta la funcion AgregarCliente en la clase Directorio. Con el fin de invocar la clase AspectoAuditoria, encargada de implementar la la lógica de persistir la información de los clientes que se conectana a la red. Parameteros:

Arreglo de objetos que almacena en orden los atributos de la funcion interceptada.

AgregarServicio public void AgregarServicio(object [] args)

Método del Aspecto que intercepta la funcion AgregarServicio en el Directorio Con el fin de invocar la clase AspectoAuditoria, encargada de implementar la la lógica de persistir la información del servicio en la red P2P. Parameteros:

Arreglo de objetos que almacena en orden los atributos de la funcion interceptada.

EliminarCliente public void EliminarCliente(object [] args)

Método del Aspecto que intercepta la funcion EliminarCliente en el Directorio y en el Relay con el fin de invocar la clase AspectoAuditoria, encargada de implementar la la

Page 151: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

137

lógica de persistir la información los clientes que han salido de la red. Parameteros:

Arreglo de objetos que almacena en orden los atributos de la funcion interceptada.

interceptarBusqueda public void interceptarBusqueda(object [] args)

interceptarBusquedaParaAgilizar public ResultadoBusqueda interceptarBusquedaParaAgilizar(object [] args)

RefrescarBusquedas public void RefrescarBusquedas(object [] args)

Clase AspectoRelay public Clase AspectoRelay Implementa:

Loom.Aspect, Tipos.ITemporizador

AspectoAuditoria es un Aspecto que se encarga de llevar un log de auditoria en el Servidor de Indices o Directorio. Debe implementar ITemporizador para que el timer le notifique el fin del tiempo y el aspecto proceda a desconectar el cliente.

Resumen de los Atributos private AspectoAuditoria aspAuditoria

Aspecto que encapsula la auditoria del sistema

private AspectoTemporizador aspTemporizador Variable que indica un delegado que maneja el temporizador de los clientes

private static string instaciaTejida Constante que indica el nombre de la instancia

Page 152: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

138

Resumen de los Atributos private IRelay relRef

Referencia a la intrfaz de Relay, necesaria para elaborar objetos tejidos

private Thread tsTemporizador Tread que se encarga de lanzar un timer, que en caso de expirar, desconecta al cliente

Resumen de los Constructores

public AspectoRelay() Constructora por defecto

Resumen de los Métodos

public void AgregarServicio(object [] args) Método del Aspecto que intercepta la funcion AgregarServicio en el Directorio con el fin de invocar la clase AspectoAuditoria, encargada de implementar la la lógica de persistir la información del servicio en la red P2P.

public void BeforeBusqueda(object [] args) Función del Aspecto encargada de interceptar todos los Métodos, excepto EliminarCliente, de la clase RelayLG, lanzando un temporizador que desconecta a un nodo luego de un determindo tiempo de inactividad en la red.

public void EliminarCliente(object [] args) Método del Aspecto que intercepta la funcion EliminarCliente en el Directorio y en el Relay con el fin de invocar la clase AspectoAuditoria, encargada de implementar la la lógica de persistir la información los clientes que han salido de la red.

Page 153: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

139

Resumen de los Métodos

private void IniciarTemporizador() Se encarga de iniciar el timer

public void interceptarBusqueda(object [] args) public void NotificarFinTiempo()

Función que se debe incluir ya que se esta implementado la interfaz INotificador, la cual hace parte de un patrón observer

private void PararTemporizador(int tiempo) Se encarga de parar el timer.

Detalles de los Atributos

aspAuditoria private AspectoAuditoria aspAuditoria

Aspecto que encapsula la auditoria del sistema

aspTemporizador private AspectoTemporizador aspTemporizador

Variable que indica un delegado que maneja el temporizador de los clientes

instaciaTejida private static string instaciaTejida = "Relay"

Constante que indica el nombre de la instancia

relRef private IRelay relRef

Page 154: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

140

Referencia a la intrfaz de Relay, necesaria para elaborar objetos tejidos

tsTemporizador private Thread tsTemporizador

Tread que se encarga de lanzar un timer, que en caso de expirar, desconecta al cliente

Detalles del Constructor

AspectoRelay public AspectoRelay()

Constructora por defecto

Detalle de los Métodos

AfterAgregarCliente public void AfterAgregarCliente(object [] args)

AfterAgregarServicio public void AfterAgregarServicio(object [] args)

AfterAgregarSolicitud public void AfterAgregarSolicitud(object [] args)

AfterAtenderSolicitud public void AfterAtenderSolicitud(object [] args)

AfterBusqueda public void AfterBusqueda(object [] args)

Page 155: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

141

AgregarServicio public void AgregarServicio(object [] args)

Método del Aspecto que intercepta la funcion AgregarServicio en el Directorio Con el fin de invocar la clase AspectoAuditoria, encargada de implementar la la lógica de persistir la información del servicio en la red P2P. Parameteros:

Arreglo de objetos que almacena en orden los atributos de la funcion interceptada.

BeforeAgregarCliente public void BeforeAgregarCliente(object [] args)

BeforeAgregarServicio public void BeforeAgregarServicio(object [] args)

BeforeAgregarSolicitud public void BeforeAgregarSolicitud(object [] args)

BeforeAtenderSolicitud public void BeforeAtenderSolicitud(object [] args)

BeforeBusqueda public void BeforeBusqueda(object [] args)

Función del Aspecto encargada de interceptar todos los Métodos, excepto EliminarCliente, de la clase RelayLG, lanzando un temporizador que desconecta a un nodo luego de un determindo tiempo de inactividad en la red. Parameteros:

Arreglo de objetos que almacena en orden los atributos de la funcion interceptada.

Page 156: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

142

EliminarCliente public void EliminarCliente(object [] args)

Método del Aspecto que intercepta la funcion EliminarCliente en el Directorio y en el Relay con el fin de invocar la clase AspectoAuditoria, encargada de implementar la la lógica de persistir la información los clientes que han salido de la red. Parameteros:

Arreglo de objetos que almacena en orden los atributos de la funcion interceptada.

IniciarTemporizador private void IniciarTemporizador()

Se encarga de iniciar el timer

interceptarBusqueda public void interceptarBusqueda(object [] args)

NotificarFinTiempo public void NotificarFinTiempo()

Función que se debe incluir ya que se esta implementado la interfaz INotificador, la cual hace parte de un patrón observer

PararTemporizador private void PararTemporizador(int tiempo)

Se encarga de parar el timer.

Clase AspectoTemporizador public Clase AspectoTemporizador Thread que funciona como timer y notificado, mediante patrón observer,

Page 157: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

143

que un cliente debe salir del Relay por estar inactivo determinado tiempo.

Resumen de los Atributos private ArrayList Clientes

Arreglo de interfaces ITemporizador, necesarias para notificar a los observados el fin del tiempo del timer.

private int TiempoEspera Tiempo que dura el timer antes de notificar al cliente o Realy

Resumen de los Constructores

public AspectoTemporizador(int sleeTime) Constructora el hilo.

Resumen de los Métodos

public void AgregarCliente(ITemporizador client) Función que se encarga de mantener una colleccion de interfaces del Relay (ITemporizador) con el fin de poder notificarles si se ha expirado el tiempo del timer

public void EliminarCliente(ITemporizador client) Cuando el cliente se desconecta por causas difentes al fin de temporizador, este ya no debe ser tenido en cuenta más.

public void Temporizar() Función la cual se inicia la ejecución de Thread.

Page 158: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

144

Detalles de los Atributos

Clientes private ArrayList Clientes

Arreglo de interfaces ITemporizador, necesarias para notificar a los observados el fin del tiempo del timer.

TiempoEspera private int TiempoEspera

Tiempo que dura el timer antes de notificar al cliente o Realy

Detalles del Constructor

AspectoTemporizador public AspectoTemporizador(int sleeTime)

Constructora el hilo. Parameteros:

Recibe como parametro el tiempo máxiimo de inactividad de un cliente

Detalle de los Métodos

AgregarCliente public void AgregarCliente(ITemporizador client)

Función que se encarga de mantener una colleccion de interfaces del Relay (ITemporizador) con el fin de poder notificarles si se ha expirado el tiempo del timer Parameteros:

Interfaz del Relay, necesaria en la estructura del patrón observer

EliminarCliente public void EliminarCliente(ITemporizador client)

Page 159: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

145

Cuando el cliente se desconecta por causas difentes al fin de temporizador, este ya no debe ser tenido en cuenta más. Parameteros:

Interfaz del Relay

Temporizar public void Temporizar()

Función la cual se inicia la ejecución de Thread. Su funcion es poner a dormir el hilo, si éste se despierta por si mismo y no por un evento en el Relay. Éste debe notificar a la interfaz del relay que debe desconectar el cliente.

Clase DirectorioSV public Clase DirectorioSV Implementa:

System.Web.Services.WebService

Clase que sirve de entrada para las peticiones de los relays

Resumen de los Atributos private IContainer components private IDirectorio dirLogica

Referencia de la la lógica del Servidor de Índices

Resumen de los Constructores

public DirectorioSV() Constructora que inicializa el Servicio Web del Directorio

Page 160: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

146

Resumen de los Métodos

public int AgregarCliente(string strIp) Agrega un cliente a la red P2P

public void AgregarServicio(int numIdentificador, string strServicio, long numTamano) Agrega un servicio a prestar en el nodo

public void AgregarServicios(int numIdentificador, string [] arrServicios, long[] arrTamanos) Agrega un listado de servicios al nodo

public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Agrega una solicitud a la cola de solicitudes, para que sea atendida

public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Elimina una solicitud ya atendida

public ResultadoBusqueda Busqueda(string strDescripcion) protected void Dispose(bool disposing)

Clean up any resources being used.

public void EliminarCliente(int numIdentificador) Desconecta un cliente de la Red P2P

Page 161: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

147

Resumen de los Métodos

private void InitializeComponent() Required method for Designer support - do not modify the contents of this method with the code editor.

public Peticion ObtenerSoliciudes(int numSolicitado) Obtiene las solicitudes de un nodo

Detalles de los Atributos

components private IContainer components = null

dirLogica private IDirectorio dirLogica

Referencia de la la lógica del Servidor de Índices

Detalles del Constructor

DirectorioSV public DirectorioSV()

Constructora que inicializa el Servicio Web del Directorio Observaciones:

En este paso se obtiene la la lógica del directorio mediante el proceso de tejido de la fabrica

Detalle de los Métodos

AgregarCliente public int AgregarCliente(string strIp)

Agrega un cliente a la red P2P

Page 162: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

148

Parameteros: Dirección IP del Nodo

Retorna: Identificador del nodo. Se obtiene desde el Servidor de Índices

AgregarServicio public void AgregarServicio(int numIdentificador, string strServicio, long numTamano)

Agrega un servicio a prestar en el nodo Parameteros:

Identificador del nodo Descripción del servicio Tamaño del archivo

AgregarServicios public void AgregarServicios(int numIdentificador, string [] arrServicios, long[] arrTamanos)

Agrega un listado de servicios al nodo Parameteros:

Identificador del nodo Listado de las descripciones de los servicios Listado de los tamaños de los archivos a publicar

AgregarSolicitud public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Agrega una solicitud a la cola de solicitudes, para que sea atendida

Parameteros: Identificador del solicitante Identificador del solicitado Descripción del servicio Dirección IP del Solicitante

Page 163: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

149

AtenderSolicitud public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Elimina una solicitud ya atendida Parameteros:

Identificador del solicitante Identificador del solicitado Descripción del servicio Dirección del solicitante

Busqueda public ResultadoBusqueda Busqueda(string strDescripcion)

Dispose protected void Dispose(bool disposing)

Clean up any resources being used.

EliminarCliente public void EliminarCliente(int numIdentificador)

Desconecta un cliente de la Red P2P Parameteros:

Identificador del nodo

InitializeComponent private void InitializeComponent()

Required method for Designer support - do not modify the contents of this method with the code editor.

Page 164: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

150

ObtenerSoliciudes public Peticion ObtenerSoliciudes(int numSolicitado)

Obtiene las solicitudes de un nodo Parameteros:

Identificacion del nodo Retorna:

Lista de las peticiones pendientes por atender

Clase FabricaObjetosTejidos public Clase FabricaObjetosTejidos Clase que encapsula el tejido de las clases que tienen puntos de corte con los aspectos Observaciones:

Implementa el patron Fabrica Abstracta Resumen de los Métodos

public IDirectorio getDirectorio() Obtiene una instancia tejida de una interfaz de directorio

public IRelay getRelay() Obtiene una instancia tejida de una interfaz de relay

Detalle de los Métodos

getDirectorio public IDirectorio getDirectorio()

Obtiene una instancia tejida de una interfaz de directorio Retorna:

Instancia tejida

Page 165: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

151

getRelay public IRelay getRelay()

Obtiene una instancia tejida de una interfaz de relay Retorna:

Instancia tejida

Clase ClienteLG public Clase ClienteLG Resumen de los Atributos

private INotificador mntfNotificador Notificador de la información presentarle al Cliente Final

private int mnumIdentificador Identificador del Cliente.

private RelaySV mrlyServicio Referencia del Servicio Web del Relay por el cual se conecta con la red P2P

private string mstrIpLocal Dirección IP Local del dispositivo

private string mstrNombreDirectorio Nombre del Relay al cual se conectará

Resumen de los Constructores

public ClienteLG(INotificador ntfNotificador, string strNombreDirectorio)

Page 166: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

152

Resumen de los Métodos

public void AgregarCliente() Agrega un cliente a la red P2P

public void AgregarServicio(string strServicio, long numTamano) Agrega un servicio a prestar en el nodo

public void AgregarServicios(string[] arrServicios, long[] numTamanos) Agrega un listado de servicios al nodo

public ResultadoBusqueda Busqueda(string strDescripcion) public void EliminarCliente()

Desconecta un cliente de la Red P2P

public void EnviarDatos(Socket sckEnlace, byte [] arrDatos) Envia datos de un par hacia otro par

public void EnviarDatos(Stream stmFlujo, byte [] arrDatos) Envia datos de un par hacia otro par

public void EnviarDatos(string strIp, byte [] arrDatos) Envia datos de un par hacia otro par

public int RecibirMensaje(Socket sckEnlace, byte[] arrbytMensaje) Recibe datos desde un par

Page 167: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

153

Resumen de los Métodos

public int RecibirMensaje(Stream stmFlujo, byte[] arrbytMensaje) Recibe datos desde un par

public void SolicitarServicio(int numSolicitado, string strServicio, string strRuta, long numTamano)

Envia una solicitud para consumir un servicio

Detalles de los Atributos

mntfNotificador private INotificador mntfNotificador

Notificador de la información presentarle al Cliente Final

mnumIdentificador private int mnumIdentificador

Identificador del Cliente. Es obtenido desde el Servidor de Índices

mrlyServicio private RelaySV mrlyServicio

Referencia del Servicio Web del Relay por el cual se conecta con la red P2P

mstrIpLocal private string mstrIpLocal

Dirección IP Local del dispositivo

Page 168: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

154

mstrNombreDirectorio private string mstrNombreDirectorio

Nombre del Relay al cual se conectará

Detalles del Constructor

ClienteLG public ClienteLG(INotificador ntfNotificador, string strNombreDirectorio)

Detalle de los Métodos

AgregarCliente public void AgregarCliente()

Agrega un cliente a la red P2P

AgregarServicio public void AgregarServicio(string strServicio, long numTamano)

Agrega un servicio a prestar en el nodo Parameteros:

Descripción del servicio Tamaño del archivo

AgregarServicios public void AgregarServicios(string[] arrServicios, long[] numTamanos)

Agrega un listado de servicios al nodo Parameteros:

Listado de las descripciones de los servicios Listado de los tamaños de los archivos a publicar

Busqueda public ResultadoBusqueda Busqueda(string strDescripcion)

Page 169: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

155

EliminarCliente public void EliminarCliente()

Desconecta un cliente de la Red P2P

EnviarDatos public void EnviarDatos(Socket sckEnlace, byte [] arrDatos)

Envia datos de un par hacia otro par Parameteros:

Socket por donde se van a enviar los datos Datos a enviar

EnviarDatos public void EnviarDatos(Stream stmFlujo, byte [] arrDatos)

Envia datos de un par hacia otro par Parameteros:

Flujo por donde se envian los datos Datos a enviar

EnviarDatos public void EnviarDatos(string strIp, byte [] arrDatos)

Envia datos de un par hacia otro par Parameteros:

Dirección IP del punto solicitante Datos a enviar

RecibirMensaje public int RecibirMensaje(Socket sckEnlace, byte[] arrbytMensaje)

Page 170: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

156

Recibe datos desde un par Parameteros:

Socket por donde viajan los datos Datos a recibir

Retorna: Tamaño de bytes enviados

RecibirMensaje public int RecibirMensaje(Stream stmFlujo, byte[] arrbytMensaje)

Recibe datos desde un par Parameteros:

Flujo por donde viajan los datos Datos a recibir

Retorna: Tamaño de bytes enviados

SolicitarServicio public void SolicitarServicio(int numSolicitado, string strServicio, string strRuta, long numTamano)

Envia una solicitud para consumir un servicio Parameteros:

Identificador del nodo servidor Descripción del servicio Ubicación físic donde se desea salvar el archivo Tamaño del archivo a transferir

Clase ConsumirServicio public Clase ConsumirServicio Clase que encapsula la función de consumir un servicio

Page 171: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

157

Resumen de los Atributos private INotificador mntfNotificador

Notificador de la información presentarle al Cliente Final

private int mnumPuerto Puerto por el cual se comunica con el punto ofertante

private long mnumTamano Tamaño del archivo

private string mstrRuta Ruta fisica donde se va a almacenar el archivo

private Thread mthtPrncipal Hilo principal de la clase

private TcpListener mtplEscucha Clase que provee el soporte para establecer la comunicación el punto ofertante

Resumen de los Constructores

public ConsumirServicio(string strRuta, long numTamano, INotificador ntfNotificador) Constructora sobrecargada

Resumen de los Métodos

public void LanzarServidor() Inicia el servicio de escucha de la atención del servicio

Page 172: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

158

Resumen de los Métodos

private void RecibirServicio(Socket sckEnlace)

Detalles de los Atributos

mntfNotificador private INotificador mntfNotificador

Notificador de la información presentarle al Cliente Final

mnumPuerto private int mnumPuerto

Puerto por el cual se comunica con el punto ofertante

mnumTamano private long mnumTamano

Tamaño del archivo

mstrRuta private string mstrRuta

Ruta fisica donde se va a almacenar el archivo

mthtPrncipal private Thread mthtPrncipal

Hilo principal de la clase

mtplEscucha private TcpListener mtplEscucha

Page 173: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

159

Clase que provee el soporte para establecer la comunicación el punto ofertante

Detalles del Constructor

ConsumirServicio public ConsumirServicio(string strRuta, long numTamano, INotificador ntfNotificador)

Constructora sobrecargada Parameteros:

Ruta físicadel archivo Tamaño del archivo Notificador de mensajes

Detalle de los Métodos

LanzarServidor public void LanzarServidor()

Inicia el servicio de escucha de la atención del servicio

RecibirServicio private void RecibirServicio(Socket sckEnlace)

Clase ServidorSolicitudes public Clase ServidorSolicitudes Clase que encapsula la función de consumir un servicio

Resumen de los Atributos private INotificador mntfNotificador

Notificador de la información presentarle al Cliente Final

Page 174: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

160

Resumen de los Atributos private int mnumSolicitado

Idetnificador del solicitado

private int mnumSolicitante Identificador del solicitante

private RelaySV mrlyServicio Referencia del Servicio Web del Relay

private string mstrIp Dirección IP del solicitante

private string mstrServicio Descripciónel servicio

private Thread mthtPrncipal Hilo principal de la clase

Resumen de los Constructores

public ServidorSolicitudes(int numSolicitado, INotificador ntfNotificador, string strNombreServidor) Constructora sobrecargada

Resumen de los Métodos

public void LanzarServidor() Inicia el servicio de escucha de la atención del servicio

Page 175: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

161

Resumen de los Métodos

private void PrestarServicio() Inicia el servicio de escucha de la atención del servicio

Detalles de los Atributos

mntfNotificador private INotificador mntfNotificador

Notificador de la información presentarle al Cliente Final

mnumSolicitado private int mnumSolicitado

Idetnificador del solicitado

mnumSolicitante private int mnumSolicitante

Identificador del solicitante

mrlyServicio private RelaySV mrlyServicio

Referencia del Servicio Web del Relay

mstrIp private string mstrIp

Dirección IP del solicitante

Page 176: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

162

mstrServicio private string mstrServicio

Descripciónel servicio

mthtPrncipal private Thread mthtPrncipal

Hilo principal de la clase

Detalles del Constructor

ServidorSolicitudes public ServidorSolicitudes(int numSolicitado, INotificador ntfNotificador, string strNombreServidor)

Constructora sobrecargada Parameteros:

Identificador del solicitante Notificador general Nombre del relay al cual se va a conectar

Detalle de los Métodos

LanzarServidor public void LanzarServidor()

Inicia el servicio de escucha de la atención del servicio

PrestarServicio private void PrestarServicio()

Inicia el servicio de escucha de la atención del servicio

Page 177: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

163

Clase Transferencias public Clase Transferencias

Clase que encapsula la las trasnferencias de datos entre los pares

Resumen de los Atributos

public static long FRAME_SIZE Tamaño de los paquetes enviados entre los pares

public static int NUMPUERTO Resumen de los Métodos

public static void EnviarDatos(Socket sckEnlace, byte [] arrDatos, INotificador ntfNotificador) Envia datos de un par hacia otro par

public static void EnviarDatos(Stream stmFlujo, byte [] arrDatos, INotificador ntfNotificador) Envia datos de un par hacia otro par

public static void EnviarDatos(string strIp, byte [] arrDatos, INotificador ntfNotificador) Envia datos de un par hacia otro par

public static int RecibirMensaje(Socket sckEnlace, byte[] arrbytMensaje, INotificador ntfNotificador) Recibe datos desde un par

public static int RecibirMensaje(Stream stmFlujo, byte[] arrbytMensaje, INotificador ntfNotificador) Recibe datos desde un par

Page 178: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

164

Detalles de los Atributos

FRAME_SIZE public static long FRAME_SIZE = 1024

Tamaño de los paquetes enviados entre los pares

NUMPUERTO public static int NUMPUERTO = 65000

Detalle de los Métodos

EnviarDatos public static void EnviarDatos(Stream stmFlujo, byte [] arrDatos, INotificador ntfNotificador)

Envia datos de un par hacia otro par Parameteros:

Flujo por donde se envian los datos Datos a enviar Notificador general

EnviarDatos public static void EnviarDatos(Socket sckEnlace, byte [] arrDatos, INotificador ntfNotificador)

Envia datos de un par hacia otro par Parameteros:

Socket por donde se van a enviar los datos Datos a enviar Notificador general

EnviarDatos public static void EnviarDatos(string strIp, byte [] arrDatos, INotificador ntfNotificador)

Page 179: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

165

Envia datos de un par hacia otro par Parameteros:

Dirección IP del punto solicitante Datos a enviar Notificador general

RecibirMensaje public static int RecibirMensaje(Stream stmFlujo, byte[] arrbytMensaje, INotificador ntfNotificador)

Recibe datos desde un par Parameteros:

Flujo por donde viajan los datos Notificador general Datos a recibir

Retorna: Tamaño de bytes enviados

RecibirMensaje public static int RecibirMensaje(Socket sckEnlace, byte[] arrbytMensaje, INotificador ntfNotificador)

Recibe datos desde un par

Parameteros: Socket por donde viajan los datos Notificador general Datos a recibir

Retorna: Tamaño de bytes enviados

Clase Directorio public Clase Directorio Implementa:

Tipos.IDirectorio

Page 180: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

166

Clase la lógica que redirecciona las solicitudes que llegan desde el Servicio Web del Directorio Observaciones:

Esta clase es construida por la fábrica, quien teje sobre los puntos de corte los aspectos Resumen de los Atributos

private DirectorioLG dirLogica Refencia a la la lógica del directorio

private ManejadorSolicitudes manSolicitudes Refrencia al manejador de solicitudes

Resumen de los Constructores

public Directorio() Constructora por defecto, obtiene las referencias de las instancias que son construidas bajo el patron singleton

Resumen de los Métodos

public int AgregarCliente(string strIp) Agrega un cliente a la red P2P

public void AgregarServicio(int numIdentificador, string strServicio, long numTamano) Agrega un servicio a prestar en el nodo

public void AgregarServicios(int numIdentificador, string [] arrServicios, long[] arrTamanos) Agrega un listado de servicios al nodo

Page 181: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

167

Resumen de los Métodos

public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Agrega una solicitud a la cola de solicitudes, para que sea atendida

public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Elimina una solicitud ya atendida

public ResultadoBusqueda Busqueda(string strDescripcion) public void EliminarCliente(int numIdentificador)

Desconecta un cliente de la Red P2P

public Peticion ObtenerSoliciudes(int numSolicitado) Obtiene las solicitudes de un nodo

Detalles de los Atributos

dirLogica private DirectorioLG dirLogica

Refencia a la la lógica del directorio

manSolicitudes private ManejadorSolicitudes manSolicitudes

Refrencia al manejador de solicitudes

Page 182: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

168

Detalles del Constructor

Directorio public Directorio()

Constructora por defecto, obtiene las referencias de las instancias que son construidas bajo el patron singleton

Detalle de los Métodos

AgregarCliente public int AgregarCliente(string strIp)

Agrega un cliente a la red P2P Parameteros:

Dirección IP del Nodo Retorna:

Identificador del nodo. Se obtiene desde el Servidor de Índices

AgregarServicio public void AgregarServicio(int numIdentificador, string strServicio, long numTamano)

Agrega un servicio a prestar en el nodo Parameteros:

Identificador del nodo Descripciónel servicio Tamaño del archivo

AgregarServicios public void AgregarServicios(int numIdentificador, string [] arrServicios, long[] arrTamanos)

Agrega un listado de servicios al nodo

Page 183: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

169

Parameteros: Identificador del nodo Listado de las descripciones de los servicios Listado de los tamaños de los archivos a publicar

AgregarSolicitud public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Agrega una solicitud a la cola de solicitudes, para que sea atendida Parameteros:

Identificador del solicitante Identificador del solicitado Descripciónel servicio Dirección IP del Solicitante

AtenderSolicitud public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Elimina una solicitud ya atendida Parameteros:

Identificador del solicitante Identificador del solicitado Descripciónel servicio Dirección IP del solicitante

Busqueda public ResultadoBusqueda Busqueda(string strDescripcion)

EliminarCliente public void EliminarCliente(int numIdentificador)

Desconecta un cliente de la Red P2P

Page 184: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

170

Parameteros: Identificador del nodo

ObtenerSoliciudes public Peticion ObtenerSoliciudes(int numSolicitado)

Obtiene las solicitudes de un nodo

Parameteros: Identificacion del nodo

Retorna: Lista de las peticiones pendientes por atender

Clase DirectorioLG public Clase DirectorioLG Clase que maneja la la lógica conserniente al servidor de índices Resumen de los Atributos

private static DirectorioLG instance Instancia del directorio, necesaria para poder implementar un patrón singleton.

private static Hashtable marrNodos private static int MAX_RESULTADOS

private int numConsecutivo Consecutivo que genera los identificadores de los nodos

Resumen de los Constructores

private DirectorioLG() Constructora por defecto

Page 185: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

171

Resumen de los Métodos

public int AgregarCliente(string strIp) Agrega un cliente a la red P2P

public void AgregarServicio(int numIdentificador, string strServicio, long numTamano) Agrega un servicio a prestar en el nodo

public void AgregarServicios(int numIdentificador, string[] arrServicios, long[] arrTamanos) Agrega un listado de servicios al nodo

public ResultadoBusqueda Busqueda(string strDescripcion) public void EliminarCliente(int numIdentificador)

Elimina un nodo del listado de indices

public static DirectorioLG Instancia() Obtiene la referencia del manejador de solicitudes

private string ObtenerIp(int numIdentificador) Obtiene la dirección IP de un nodo específico

Detalles de los Atributos

instance private static DirectorioLG instance

Instancia del directorio, necesaria para poder implementar un patrón singleton.

marrNodos private static Hashtable marrNodos

Page 186: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

172

MAX_RESULTADOS private static int MAX_RESULTADOS = 100

numConsecutivo private int numConsecutivo

Consecutivo que genera los identificadores de los nodos

Detalles del Constructor

DirectorioLG private DirectorioLG()

Constructora por defecto Observaciones:

Es una constructora privada, para instanciar este objeto es necesario llamar a la función instancia()

Detalle de los Métodos

AgregarCliente public int AgregarCliente(string strIp)

Agrega un cliente a la red P2P Parameteros:

Dirección IP del Nodo Retorna:

Retorna el valor del consecutivo actual

AgregarServicio public void AgregarServicio(int numIdentificador, string strServicio, long numTamano)

Agrega un servicio a prestar en el nodo

Page 187: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

173

Parameteros: Identificador del nodo Descripciónel servicio Tamaño del archivo

AgregarServicios public void AgregarServicios(int numIdentificador, string[] arrServicios, long[] arrTamanos)

Agrega un listado de servicios al nodo

Parameteros: Identificador del nodo Listado de las descripciones de los servicios Listado de los tamaños de los archivos a publicar

Busqueda public ResultadoBusqueda Busqueda(string strDescripcion)

EliminarCliente public void EliminarCliente(int numIdentificador)

Elimina un nodo del listado de indices Parameteros:

Identificador del nodo

Instancia public static DirectorioLG Instancia()

Obtiene la referencia del manejador de solicitudes Retorna:

Instancia actual en memoria del directorio ObtenerIp private string ObtenerIp(int numIdentificador)

Page 188: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

174

Obtiene la dirección IP de un nodo específico Parameteros:

Identificador del nodo Retorna:

Dirección IP del nodo

Clase ManejadorSolicitudes public Clase ManejadorSolicitudes Clase que maneja las colas de solicitudes pendientes por atender de los nodos Resumen de los Atributos

private static ManejadorSolicitudes

instance Instancia del manejador, necesaria para poder implementar un patrón singleton.

private static ArrayList marrSolicitudes Resumen de los Constructores

private ManejadorSolicitudes() Constructora por defecto

Resumen de los Métodos

public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Agrega una solicitud a la cola de solicitudes, para que sea atendida

Page 189: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

175

Resumen de los Métodos

public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Elimina una solicitud ya atendida

public void EliminarCliente(int numIdentificacion) Elimina todas las peticiones de un nodo que se desconecta de la red P2P

public static ManejadorSolicitudes

Instancia() Obtiene la referencia del manejador de solicitudes

public Peticion ObtenerSoliciudes(int numSolicitado) Obtiene las solicitudes de un nodo

Detalles de los Atributos

instance private static ManejadorSolicitudes instance

Instancia del manejador, necesaria para poder implementar un patrón singleton.

marrSolicitudes private static ArrayList marrSolicitudes

Detalles del Constructor

ManejadorSolicitudes private ManejadorSolicitudes()

Constructora por defecto

Page 190: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

176

Observaciones: Es una constructora privada, para instanciar este objeto es necesario llamar a la función instancia()

Detalle de los Métodos

AgregarSolicitud public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Agrega una solicitud a la cola de solicitudes, para que sea atendida Parameteros:

Identificador del solicitante Identificador del solicitado Descripciónel servicio Dirección IP del Solicitante

AtenderSolicitud public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Elimina una solicitud ya atendida Parameteros:

Identificador del solicitante Identificador del solicitado Descripciónel servicio Dirección IP del solicitante

EliminarCliente public void EliminarCliente(int numIdentificacion)

Elimina todas las peticiones de un nodo que se desconecta de la red P2P Parameteros:

Identificación del nodo

Page 191: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

177

Instancia public static ManejadorSolicitudes Instancia()

Obtiene la referencia del manejador de solicitudes Retorna:

Instancia actual en memoria del manejador de solicitudes

ObtenerSoliciudes public Peticion ObtenerSoliciudes(int numSolicitado)

Obtiene las solicitudes de un nodo Parameteros:

Identificacion del nodo Retorna:

Lista de las peticiones pendientes por atender

Clase RelayLG public Clase RelayLG Implementa:

Tipos.IRelay

Clase que maneja la la lógica del relay Observaciones:

Esta clase es construida por la fábrica, quien teje sobre los puntos de corte los aspectos. Resumen de los Atributos

private DirectorioSV mdsvServicio Referencia del Servicio Web del Directorio por el cual se comunica con el

private int numIdentificador Variable que asigna el Directorio a cada uno de los clientes.

Page 192: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

178

Resumen de los Constructores

public RelayLG() Constructora por defecto

public RelayLG(string strDireccion) Constructora que recibe como parametro la direccion del servidor de indices

Resumen de los Métodos

public int AgregarCliente(string strIp) Agrega un cliente a la red P2P

public void AgregarServicio(int numIdentificador, string strServicio, long numTamano) Agrega un servicio a prestar en el nodo

public void AgregarServicios(int numIdentificador, string[] arrServicios, long[] arrTamanos) Agrega un listado de servicios al nodo

public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Agrega una solicitud a la cola de solicitudes, para que sea atendida

public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Elimina una solicitud ya atendida

public ResultadoBusqueda Busqueda(string strDescripcion)

Page 193: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

179

Resumen de los Métodos

public void EliminarCliente() Desconecta un cliente de la Red P2P

public void EliminarCliente(int numIdentificador) Desconecta un cliente de la Red P2P

public Peticion ObtenerSoliciudes(int numSolicitado) Obtiene las solicitudes de un nodo

public void setDirectorio(string strNombreDirectorio) Función que recibe como parametro la dirección donde se encuentra el Servidor de Ídices

Detalles de los Atributos

mdsvServicio private DirectorioSV mdsvServicio

Referencia del Servicio Web del Directorio por el cual se comunica con el

numIdentificador private int numIdentificador

Variable que asigna el Directorio a cada uno de los clientes.

Detalles del Constructor

RelayLG public RelayLG()

Constructora por defecto

Page 194: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

180

RelayLG public RelayLG(string strDireccion)

Constructora que recibe como parametro la direccion del servidor de indices Parameteros:

Direccion del servidor de indices

Detalle de los Métodos

AgregarCliente public int AgregarCliente(string strIp)

Agrega un cliente a la red P2P Parameteros:

Dirección IP del Nodo Retorna:

Identificador del nodo. Se obtiene desde el Servidor de Índices

AgregarServicio public void AgregarServicio(int numIdentificador, string strServicio, long numTamano)

Agrega un servicio a prestar en el nodo Parameteros:

Identificador del nodo Descripciónel servicio Tamaño del archivo

AgregarServicios public void AgregarServicios(int numIdentificador, string[] arrServicios, long[] arrTamanos)

Agrega un listado de servicios al nodo

Page 195: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

181

Parameteros: Identificador del nodo Listado de las descripciones de los servicios Listado de los tamaños de los archivos a publicar

AgregarSolicitud public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Agrega una solicitud a la cola de solicitudes, para que sea atendida Parameteros:

Identificador del solicitante Identificador del solicitado Descripciónel servicio Dirección IP del Solicitante

AtenderSolicitud public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Elimina una solicitud ya atendida Parameteros:

Identificador del solicitante Identificador del solicitado Descripciónel servicio Dirección IP del solicitante

Busqueda public ResultadoBusqueda Busqueda(string strDescripcion)

EliminarCliente public void EliminarCliente(int numIdentificador)

Desconecta un cliente de la Red P2P

Page 196: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

182

Parameteros: Identificador del nodo

EliminarCliente public void EliminarCliente()

Desconecta un cliente de la Red P2P

ObtenerSoliciudes public Peticion ObtenerSoliciudes(int numSolicitado)

Obtiene las solicitudes de un nodo Parameteros:

Identificacion del nodo Retorna:

Lista de las peticiones pendientes por atender

setDirectorio public void setDirectorio(string strNombreDirectorio)

Función que recibe como parametro la dirección donde se encuentra el Servidor de Índices Parameteros:

Nombre del Servidor de Índices

Clase RelaySV public Clase RelaySV Implementa:

System.Web.Services.WebService

Clase que sirve de entrada para las peticiones del cliente del dispositivo móvil

Page 197: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

183

Resumen de los Atributos private IContainer components

private IRelay rlyLogica Referencia de la la lógica del Relay

Resumen de los Constructores

public RelaySV() Constructora por defecto, necesaria para el correcto funcionamiento del Servicio Web

public RelaySV(string strNombreDirectorio) Constructora sobrecargada, a partir del nombre carga el Servicio Web del Servidor de Índidces

Resumen de los Métodos

public int AgregarCliente(string strIp) Agrega un cliente a la red P2P

public void AgregarServicio(int numIdentificador, string strServicio, long numTamano) Agrega un servicio a prestar en el nodo

public void AgregarServicios(int numIdentificador, string [] arrServicios, long[] arrTamanos) Agrega un listado de servicios al nodo

Page 198: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

184

Resumen de los Métodos

public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Agrega una solicitud a la cola de solicitudes, para que sea atendida

public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Elimina una solicitud ya atendida

public ResultadoBusqueda Busqueda(string strDescripcion) protected void Dispose(bool disposing)

Clean up any resources being used.

public void EliminarCliente(int numIdentificador) Desconecta un cliente de la Red P2P

private void InitializeComponent() Required method for Designer support - do not modify the contents of this method with the code editor.

public Peticion ObtenerSoliciudes(int numSolicitado) Obtiene las solicitudes de un nodo

Detalles de los Atributos

components private IContainer components = null

rlyLogica private IRelay rlyLogica

Page 199: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

185

Referencia de la la lógica del Relay

Detalles del Constructor

RelaySV public RelaySV()

Constructora por defecto, necesaria para el correcto funcionamiento del Servicio Web Observaciones:

El sitio donde corre el Servidor de Indices por defecto es LocalHost

RelaySV public RelaySV(string strNombreDirectorio)

Constructora sobrecargada, a partir del nombre carga el Servicio Web del Servidor de Índices Parameteros:

Nombre del Servidor de Índices

Detalle de los Métodos

AgregarCliente public int AgregarCliente(string strIp)

Agrega un cliente a la red P2P Parameteros:

Dirección IP del Nodo Retorna:

Identificador del nodo. Se obtiene desde el Servidor de Índices

AgregarServicio public void AgregarServicio(int numIdentificador, string strServicio, long numTamano)

Page 200: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

186

Agrega un servicio a prestar en el nodo Parameteros:

Identificador del nodo Descripciónel servicio Tamaño del archivo

AgregarServicios public void AgregarServicios(int numIdentificador, string [] arrServicios, long[] arrTamanos)

Agrega un listado de servicios al nodo

Parameteros: Identificador del nodo Listado de las descripciones de los servicios Listado de los tamaños de los archivos a publicar

AgregarSolicitud public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Agrega una solicitud a la cola de solicitudes, para que sea atendida Parameteros:

Identificador del solicitante Identificador del solicitado Descripciónel servicio Dirección IP del Solicitante

AtenderSolicitud public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Elimina una solicitud ya atendida

Page 201: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

187

Parameteros: Identificador del solicitante Identificador del solicitado Descripciónel servicio Dirección IP del solicitante

Busqueda public ResultadoBusqueda Busqueda(string strDescripcion)

Dispose protected void Dispose(bool disposing)

Clean up any resources being used.

EliminarCliente public void EliminarCliente(int numIdentificador)

Desconecta un cliente de la Red P2P Parameteros:

Identificador del nodo

InitializeComponent private void InitializeComponent()

Required method for Designer support - do not modify the contents of this method with the code editor.

ObtenerSoliciudes public Peticion ObtenerSoliciudes(int numSolicitado)

Obtiene las solicitudes de un nodo

Page 202: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

188

Parameteros: Identificacion del nodo

Retorna: Lista de las peticiones pendientes por atender

Clase Nodo public Clase Nodo Clase la lógica que representa un punto en la red P2P

Resumen de los Atributos public int Identificador

Identificador del nodo

public string Ip Dirección IP del nodo

private ArrayList marrServicios Listado de los servicios que presta el nodo.

private int mnumIdentificador Identificador del nodo

private string mstrIp Dirección IP del nodo

Resumen de los Constructores

public Nodo() Constructora por defecto

Page 203: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

189

Resumen de los Constructores public Nodo(int numIdentificador, string strIp)

Constructora sobrecargada

Resumen de los Métodos

public void AgregarServicio(string strServicio, long numTamano) Agrega un servicio al listado de servicios ofrecidos

public void AgregarServicios(string[] arrServicios, long[] numTamanos) Agrega un listado de servicios al listado de servicios ofrecidos

public ArrayList EstaServicio(string strDescripcion)

Detalles de los Atributos

Identificador public int Identificador

Identificador del nodo

Ip public string Ip

Dirección IP del nodo

marrServicios private ArrayList marrServicios

Listado de los servicios que presta el nodo. Guarda objetos de tipo Servicio

Page 204: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

190

mnumIdentificador private int mnumIdentificador

Identificador del nodo

mstrIp private string mstrIp

Dirección IP del nodo

Detalles del Constructor

Nodo public Nodo()

Constructora por defecto

Nodo public Nodo(int numIdentificador, string strIp)

Constructora sobrecargada Parameteros:

Identificador del nodo Dirección IP del nodo

Detalle de los Métodos

AgregarServicio public void AgregarServicio(string strServicio, long numTamano)

Agrega un servicio al listado de servicios ofrecidos Parameteros:

Descripciónel servicio Tamaño del archivo

Page 205: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

191

AgregarServicios public void AgregarServicios(string[] arrServicios, long[] numTamanos)

Agrega un listado de servicios al listado de servicios ofrecidos Parameteros:

Listado de las descripciones de los servicios Listado de los tamaños de los archivos a publicar

EstaServicio public ArrayList EstaServicio(string strDescripcion)

Clase Peticion public Clase Peticion Clase la lógica que representa las peticiones de los clientes Resumen de los Atributos

public string Ip Dirección IP del Solicitante

private int mnumSolicitado Identificador del Solicitado

private int mnumSolicitante Identificador del Solicitante

private string mstrIp Dirección IP del solicitante

Page 206: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

192

Resumen de los Atributos private string mstrServicio

Descripciónel Servicio

public string Servicio Descripciónel servicio

public int Solicitado Identificador del solicitado

public int Solicitante Identificador del solicitante

Resumen de los Constructores

public Peticion() Constructora por defecto, necesaria para el paso del objeto por los Servicios Web

public Peticion(int numSolicitante, int numSolicitado, string strServicio, string strIp) Constructora sobrecargada

Detalles de los Atributos

Ip public string Ip

Dirección IP del Solicitante

Page 207: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

193

mnumSolicitado private int mnumSolicitado

Identificador del Solicitado

mnumSolicitante private int mnumSolicitante

Identificador del Solicitante

mstrIp private string mstrIp

Dirección IP del solicitante

mstrServicio private string mstrServicio

Descripciónel Servicio

Servicio public string Servicio

Descripciónel servicio

Solicitado public int Solicitado

Identificador del solicitado

Solicitante public int Solicitante

Page 208: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

194

Identificador del solicitante

Detalles del Constructor

Peticion public Peticion()

Constructora por defecto, necesaria para el paso del objeto por los Servicios Web

Peticion public Peticion(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Constructora sobrecargada Parameteros:

Identificador del solicitante Identificador del solicitado Descricpión del servicio Dirección IP del solicitante

Clase ResultadoBusqueda public Clase ResultadoBusqueda Resumen de los Atributos

public int Identificador Identificador del nodo

private int mnumIdentificador Identificador del nodo

Page 209: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

195

Resumen de los Atributos private long mnumTamano

Tamaño del archivo

private string mstrServicio Descripciónel servicio

public string Servicio Descripciónel servicio

public long Tamano Tamaño del archivo

Resumen de los Constructores

public ResultadoBusqueda() Constructora por defecto, necesaria para el paso del objeto por los Servicios Web

public ResultadoBusqueda(int numIdentificador, string strServico, long numTamano) Constructora sobrecargada

Detalles de los Atributos

Identificador public int Identificador

Identificador del nodo

mnumIdentificador private int mnumIdentificador

Page 210: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

196

Identificador del nodo

mnumTamano private long mnumTamano

Tamaño del archivo

mstrServicio private string mstrServicio

Descripciónel servicio

Servicio public string Servicio

Descripciónel servicio

Tamano public long Tamano

Tamaño del archivo

Detalles del Constructor

ResultadoBusqueda public ResultadoBusqueda()

Constructora por defecto, necesaria para el paso del objeto por los Servicios Web

ResultadoBusqueda public ResultadoBusqueda(int numIdentificador, string strServico, long numTamano)

Page 211: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

197

Constructora sobrecargada Parameteros:

Identificador del nodo Descripciónel servicio Tamaño del archivo

Clase Servicio public Clase Servicio Clase la lógica que representa un servicio

Resumen de los Atributos public string Descripcion

Descripciónel servicio

private long mnumTamano Tamaño del archivo

private string mstrDescripcion Descripciónel servicio

public long Tamano Tamaño del archivo

Resumen de los Constructores

public Servicio() Constructora por defecto

Page 212: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

198

Resumen de los Constructores public Servicio(string strDescripcion, long

numTamano) Constructora sobrecargada

Detalles de los Atributos

Descripcion public string Descripcion

Descripciónel servicio

mnumTamano private long mnumTamano

Tamaño del archivo

mstrDescripcion private string mstrDescripcion

Descripciónel servicio

Tamano public long Tamano

Tamaño del archivo

Detalles del Constructor

Servicio public Servicio()

Constructora por defecto

Page 213: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

199

Servicio public Servicio(string strDescripcion, long numTamano)

Constructora sobrecargada

Parameteros: Descripciónel servicio Tamaño del archivo

Detalles de las Interfaces

Interface IDirectorio Clases conocidades que Implementen la Interfaz:

Directorio

public interface IDirectorio Interfaz que define los Métodos necesarios para impelmentar un Directorio. Observaciones:

Se utiliza para la construcción de objetos tejidos Resumen de los Métodos

public int AgregarCliente(string strIp) Agrega un cliente a la red P2P

public void AgregarServicio(int numIdentificador, string strServicio, long numTamano) Agrega un servicio a prestar en el nodo

public void AgregarServicios(int numIdentificador, string [] arrServicios, long [] arrTamanos) Agrega un listado de servicios al nodo

Page 214: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

200

Resumen de los Métodos

public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Agrega una solicitud a la cola de solicitudes, para que sea atendida

public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Elimina una solicitud ya atendida

public ResultadoBusqueda Busqueda(string strDescripcion) public void EliminarCliente(int numIdentificador)

Desconecta un cliente de la Red P2P

public Peticion ObtenerSoliciudes(int numSolicitado) Obtiene las solicitudes de un nodo

Detalle de los Métodos

AgregarCliente public int AgregarCliente(string strIp)

Agrega un cliente a la red P2P Parameteros:

Dirección IP del Nodo Retorna:

Identificador del nodo. Se obtiene desde el Servidor de Índices

AgregarServicio public void AgregarServicio(int numIdentificador, string strServicio, long numTamano)

Page 215: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

201

Agrega un servicio a prestar en el nodo Parameteros:

Identificador del nodo Descripciónel servicio Tamaño del archivo

AgregarServicios public void AgregarServicios(int numIdentificador, string [] arrServicios, long [] arrTamanos)

Agrega un listado de servicios al nodo Parameteros:

Identificador del nodo Listado de las descripciones de los servicios Listado de los tamaños de los archivos a publicar

AgregarSolicitud public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Agrega una solicitud a la cola de solicitudes, para que sea atendida

Parameteros: Identificador del solicitante Identificador del solicitado Descripciónel servicio Dirección IP del Solicitante

AtenderSolicitud public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Elimina una solicitud ya atendida

Page 216: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

202

Parameteros: Identificador del solicitante Identificador del solicitado Descripciónel servicio Dirección IP del solicitante

Busqueda public ResultadoBusqueda Busqueda(string strDescripcion)

EliminarCliente public void EliminarCliente(int numIdentificador)

Desconecta un cliente de la Red P2P

Parameteros: Identificador del nodo

ObtenerSoliciudes public Peticion ObtenerSoliciudes(int numSolicitado)

Obtiene las solicitudes de un nodo Parameteros:

Identificacion del nodo Retorna:

Lista de las peticiones pendientes por atender

Interface INotificador public interface INotificador Interfaz que define los Métodos que debe tener un cliente final para desplegar los mensajes, errores y avances

Page 217: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

203

Resumen de los Métodos

public void GenerarExcepcion(string strMensaje, Exception objEx) Genera un mensaje, cuando ocurre una excepción

public void GenerarNotificacion(string strMensaje) Genera unh mensaje de información ///

public void MostrarAvanceEnviar(string strServicio, int numPorcentaje) Muestra el estado de avance al enviar datos

public void MostrarAvanceRecibir(string strServicio, int numPorcentaje) Muestra el estado de avance al recibir datos

Detalle de los Métodos

GenerarExcepcion public void GenerarExcepcion(string strMensaje, Exception objEx)

Genera un mensaje, cuando ocurre una excepción Parameteros:

Mensaje a desplegar que muestra el lugar donde sucedio la excepcion Excepcion ocurrida

GenerarNotificacion public void GenerarNotificacion(string strMensaje)

Genera un mensaje de información Parameteros:

Contenido del mensaje

MostrarAvanceEnviar public void MostrarAvanceEnviar(string strServicio, int numPorcentaje)

Page 218: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

204

Muestra el estado de avance al enviar datos Parameteros:

Descripciónel servicio que se estado enviando Porcentaje de avance

MostrarAvanceRecibir public void MostrarAvanceRecibir(string strServicio, int numPorcentaje)

Muestra el estado de avance al recibir datos Parameteros:

Descripciónel servicio que se esta recibiendo Porcentaje de avance

Interface IRelay Clases conocidades que Implementen la Interfaz:

RelayLG

public interface IRelay Interfaz que define los Métodos necesarios para impelmentar un Relay. Observaciones:

Se utiliza para la construcción de objetos tejidos Resumen de los Métodos

public int AgregarCliente(string strIp) Agrega un cliente a la red P2P

public void AgregarServicio(int numIdentificador, string strServicio, long numTamano) Agrega un servicio a prestar en el nodo

Page 219: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

205

Resumen de los Métodos

public void AgregarServicios(int numIdentificador, string [] arrServicios, long [] arrTamanos) Agrega un listado de servicios al nodo

public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Agrega una solicitud a la cola de solicitudes, para que sea atendida

public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp) Elimina una solicitud ya atendida

public ResultadoBusqueda Busqueda(string strDescripcion) public void EliminarCliente()

Desconecta un cliente de la Red P2P

public void EliminarCliente(int numIdentificador) Desconecta un cliente de la Red P2P

public Peticion ObtenerSoliciudes(int numSolicitado) Obtiene las solicitudes de un nodo

public void setDirectorio(string strNombreDirectorio) Función que recibe como parametro la dirección donde se encuentra el Servidor de Índices

Page 220: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

206

Detalle de los Métodos

AgregarCliente public int AgregarCliente(string strIp)

Agrega un cliente a la red P2P Parameteros:

Dirección IP del Nodo Retorna:

Identificador del nodo. Se obtiene desde el Servidor de Índices

AgregarServicio public void AgregarServicio(int numIdentificador, string strServicio, long numTamano)

Agrega un servicio a prestar en el nodo

Parameteros: Identificador del nodo Descripciónel servicio Tamaño del archivo

AgregarServicios public void AgregarServicios(int numIdentificador, string [] arrServicios, long [] arrTamanos)

Agrega un listado de servicios al nodo Parameteros:

Identificador del nodo Listado de las descripciones de los servicios Listado de los tamaños de los archivos a publicar

AgregarSolicitud public void AgregarSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Page 221: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

207

Agrega una solicitud a la cola de solicitudes, para que sea atendida

Parameteros: Identificador del solicitante Identificador del solicitado Descripciónel servicio Dirección IP del Solicitante

AtenderSolicitud public void AtenderSolicitud(int numSolicitante, int numSolicitado, string strServicio, string strIp)

Elimina una solicitud ya atendida Parameteros:

Identificador del solicitante Identificador del solicitado Descripciónel servicio Dirección IP del solicitante

Busqueda public ResultadoBusqueda Busqueda(string strDescripcion)

EliminarCliente public void EliminarCliente(int numIdentificador)

Desconecta un cliente de la Red P2P

Parameteros: Identificador del nodo

EliminarCliente public void EliminarCliente()

Desconecta un cliente de la Red P2P

Page 222: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

208

ObtenerSoliciudes public Peticion ObtenerSoliciudes(int numSolicitado)

Obtiene las solicitudes de un nodo

Parameteros: Identificacion del nodo

Retorna: Lista de las peticiones pendientes por atender

setDirectorio public void setDirectorio(string strNombreDirectorio)

Función que recibe como parametro la dirección donde se encuentra el Servidor de Índices Parameteros:

Nombre del Servidor de Índices

Interface ITemporizador Clases conocidades que Implementen la Interfaz:

AspectoRelay

public interface ITemporizador Interfaz que expone el Método de notificación para el aspecto timer. Resumen de los Métodos

public void NotificarFinTiempo() Método propio de la estructura del patrón observer, debe ser implementado para que los observados o IRelays puedan proceder a eliminar un nodo

Page 223: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

209

Detalle de los Métodos

NotificarFinTiempo public void NotificarFinTiempo()

Método propio de la estructura del patrón observer, debe ser implementado para que los observados o IRelays puedan proceder a eliminar un nodo

Page 224: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

210

An

exo

9.

Resu

ltad

os

de las

Pru

eb

as

9

.1 P

rueb

as

a los

AP

Is E

qu

ipo 1

A

PI C

ON

ASP

ECTO

SA

CA-

AP-

T0A

CA-

AP-

T1A

CA-

AP-

T2A

CA-

AP-

T3A

CA-

SI-T

4AC

A-S

I-T5

ACA

-RL-

T4A

CA-

RL-

T5

Mue

stra

Tiem

pos

Tiem

pos

Tiem

pos

Tiem

pos

CP

UTi

empo

sTr

afic

oTi

empo

s R

espu

esta

CPU

Tiem

pos

Traf

ico

Tiem

pos

Res

pues

ta1

00:2

1:32

00:1

9:35

01:3

7:27

01:0

7:12

16%

00:2

3:21

46%

00:2

2:08

12%

00:1

7:23

48%

00:1

7:05

200

:21:

3400

:27:

1500

:55:

3601

:03:

0022

%00

:20:

0165

%00

:26:

0113

%00

:15:

5645

%00

:16:

543

00:1

9:06

00:1

7:16

01:0

8:08

01:0

8:32

15%

00:1

4:23

66%

00:2

0:37

15%

00:1

6:15

45%

00:1

7:22

400

:25:

1300

:16:

5400

:59:

2401

:37:

0514

%00

:20:

3066

%00

:30:

5813

%00

:18:

2542

%00

:18:

135

00:1

9:11

00:1

8:12

01:0

9:38

01:2

2:56

20%

00:2

9:58

62%

00:3

1:25

12%

00:1

7:01

43%

00:1

7:29

600

:19:

5000

:16:

1301

:07:

2001

:39:

0518

%00

:22:

2466

%00

:28:

5912

%00

:15:

2455

%00

:17:

337

00:1

9:41

00:1

4:30

01:1

0:34

01:1

5:32

14%

00:2

3:12

64%

00:2

6:13

10%

00:1

6:22

50%

00:1

7:18

800

:20:

0800

:16:

1401

:07:

0401

:22:

5816

%00

:25:

1962

%00

:27:

3511

%00

:16:

4742

%00

:16:

229

00:2

0:26

00:1

4:28

01:0

3:21

01:0

8:05

15%

00:2

4:39

63%

00:2

1:23

10%

00:1

6:55

40%

00:1

7:13

1000

:19:

0900

:14:

3901

:05:

4301

:16:

3214

%00

:25:

0166

%00

:24:

2515

%00

:16:

4951

%00

:17:

08M

edia

00:2

0:35

00:1

7:32

01:0

8:26

01:1

8:06

16%

00:2

2:53

63%

00:2

5:58

12%

00:1

6:44

46%

00:1

7:16

API

SIN

AS

PEC

TOS

ASA-

AP-

T0AS

A-A

P-T1

ASA-

AP-

T2AS

A-A

P-T3

ASA

-SI-T

4AS

A-S

I-T5

ASA-

RL-

T4A

SA-R

L-T5

Mue

stra

Tiem

pos

Tiem

pos

Tiem

pos

Tiem

pos

CP

UTi

empo

sTr

afic

oTi

empo

s R

espu

esta

CPU

Tiem

pos

Traf

ico

Tiem

pos

Res

pues

ta1

00:1

2:09

00:0

9:30

01:1

1:40

01:0

3:01

15%

00:4

7:02

65%

00:2

4:01

13%

00:3

0:02

44%

00:1

8:21

200

:13:

3300

:09:

0001

:05:

1301

:03:

1125

%00

:36:

0862

%00

:26:

0012

%00

:31:

2548

%00

:17:

563

00:1

3:20

00:0

8:58

01:0

4:29

01:0

2:27

12%

00:3

7:30

63%

00:2

0:35

13%

00:3

2:29

50%

00:1

8:21

400

:13:

1800

:09:

0501

:03:

5501

:02:

2112

%00

:41:

1571

%00

:24:

3713

%00

:35:

0152

%00

:16:

215

00:1

3:04

00:0

9:45

01:0

3:58

01:0

2:26

12%

00:3

7:59

67%

00:2

2:31

14%

00:3

1:26

50%

00:1

7:53

600

:12:

5600

:09:

3201

:08:

2901

:02:

0213

%00

:36:

2566

%00

:26:

3412

%00

:33:

0650

%00

:18:

327

00:1

3:22

00:0

8:59

01:0

7:52

01:0

3:24

14%

00:4

0:25

71%

00:2

3:46

11%

00:3

0:53

41%

00:1

8:00

800

:13:

1200

:09:

1201

:06:

1501

:01:

0712

%00

:40:

5270

%00

:23:

1511

%00

:31:

0140

%00

:18:

259

00:1

2:55

00:0

9:02

01:0

5:22

01:0

4:42

15%

00:3

8:32

68%

00:2

4:36

13%

00:3

4:01

48%

00:1

7:26

1000

:12:

4500

:09:

4801

:08:

0601

:04:

5512

%00

:37:

1869

%00

:24:

0512

%00

:31:

0145

%00

:18:

02M

edia

00:1

3:03

00:0

9:17

01:0

6:32

01:0

2:58

14%

00:3

9:21

67%

00:2

4:00

12%

00:3

2:02

47%

00:1

7:56

Page 225: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

211

9.2

P

rueb

as

a los

AP

Is E

qu

ipo 2

A

PI C

ON

ASP

ECTO

SAC

A-A

P-T

0AC

A-A

P-T

1AC

A-A

P-T

2AC

A-A

P-T

3AC

A-S

I-T4

ACA

-SI-T

5AC

A-R

L-T4

ACA

-RL-

T5

Mue

stra

Tiem

pos

Tiem

pos

Tiem

pos

Tiem

pos

CPU

Tiem

pos

Traf

ico

Tiem

pos

Res

pues

taC

PU

Tiem

pos

Traf

ico

Tiem

pos

Res

pues

ta1

00:1

6:20

00:1

3:10

00:3

0:07

00:3

2:52

25%

00:4

0:12

77%

00:2

5:26

20%

00:2

5:01

50%

00:1

6:28

200

:14:

0900

:11:

1900

:35:

1700

:31:

0831

%00

:35:

2570

%00

:29:

0522

%00

:25:

3255

%00

:17:

253

00:1

4:06

00:1

1:22

00:3

0:49

00:4

0:29

33%

00:3

4:16

78%

00:3

1:02

21%

00:2

5:41

54%

00:1

6:14

400

:14:

3800

:11:

2300

:32:

1200

:32:

1735

%00

:33:

2972

%00

:35:

0120

%00

:26:

5550

%00

:14:

165

00:1

6:57

00:1

3:46

00:3

6:12

00:3

1:29

28%

00:3

5:06

78%

00:2

9:30

19%

00:2

6:57

52%

00:1

7:15

600

:19:

5000

:11:

3900

:31:

3000

:30:

1036

%00

:38:

4778

%00

:30:

0920

%00

:26:

0354

%00

:16:

247

00:1

7:36

00:1

3:01

00:2

9:32

00:3

2:12

31%

00:3

6:56

75%

00:3

0:40

20%

00:2

4:59

49%

00:1

6:35

800

:16:

3100

:13:

1000

:33:

0100

:31:

4032

%00

:31:

0978

%00

:30:

2421

%00

:25:

1250

%00

:16:

509

00:1

6:12

00:1

1:23

00:3

4:34

00:3

4:00

33%

00:3

2:42

79%

00:3

1:26

22%

00:2

5:31

53%

00:1

7:44

1000

:16:

1300

:13:

4000

:35:

5300

:32:

1029

%00

:35:

1372

%00

:26:

2921

%00

:25:

0650

%00

:16:

20M

edia

00:1

6:15

00:1

2:23

00:3

2:55

00:3

2:51

31%

00:3

5:19

76%

00:2

9:55

21%

00:2

5:42

52%

00:1

6:33

API

SIN

AS

PEC

TOS

ASA

-AP

-T0

ASA

-AP

-T1

ASA

-AP

-T2

ASA

-AP

-T3

ASA-

SI-T

4AS

A-S

I-T5

ASA-

RL-

T4AS

A-R

L-T5

Mue

stra

Tiem

pos

Tiem

pos

Tiem

pos

Tiem

pos

CPU

Tiem

pos

Traf

ico

Tiem

pos

Res

pues

taC

PU

Tiem

pos

Traf

ico

Tiem

pos

Res

pues

ta1

00:0

9:05

00:0

3:30

01:1

2:15

00:3

6:04

24%

00:5

8:06

72%

00:3

0:56

18%

00:4

2:05

65%

00:1

8:39

200

:09:

5900

:04:

1100

:40:

0200

:35:

3418

%00

:50:

1586

%00

:35:

5218

%00

:42:

1566

%00

:18:

263

00:0

9:40

00:0

3:27

00:4

2:06

00:3

3:57

26%

00:4

5:36

76%

00:2

9:23

15%

00:4

5:33

65%

00:1

7:21

400

:09:

0200

:04:

0200

:38:

1400

:33:

1230

%00

:54:

2370

%00

:28:

1318

%00

:41:

2162

%00

:15:

215

00:0

9:10

00:0

4:35

00:3

7:27

00:3

2:10

31%

00:5

1:23

75%

00:3

1:20

16%

00:4

1:05

62%

00:1

7:53

600

:09:

0200

:04:

5000

:39:

5900

:33:

2725

%00

:53:

1078

%00

:33:

0219

%00

:41:

2661

%00

:18:

367

00:0

8:50

00:0

4:21

00:3

7:46

00:3

3:07

28%

00:5

1:36

79%

00:3

3:12

17%

00:4

1:56

64%

00:1

7:44

800

:08:

5800

:03:

4600

:37:

5400

:35:

2025

%00

:52:

0181

%00

:33:

5014

%00

:40:

2367

%00

:17:

179

00:0

8:59

00:0

3:58

00:3

6:27

00:3

3:43

30%

00:4

4:16

80%

00:3

3:42

18%

00:4

0:27

65%

00:1

7:00

1000

:08:

3000

:03:

5700

:34:

5500

:32:

3319

%00

:45:

2479

%00

:38:

2019

%00

:40:

5866

%00

:18:

55M

edia

00:0

9:07

00:0

4:04

00:4

1:43

00:3

3:55

26%

00:5

0:37

78%

00:3

2:47

17%

00:4

1:45

64%

00:1

7:43

Page 226: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

212

9.3

P

rueb

as

a los

AP

Is e

ntr

e los

nod

os

PRU

EBA

S EN

LO

S N

OD

OS

AP

I CO

N A

SP

EC

TOS

AP

I SIN

AS

PE

CTO

SN

D-T

6A

CA

-ND

-T7

AC

A-N

D-T

7M

uest

raS

g/M

bTi

empo

Tiem

po1

14,2

400

:03:

0100

:02:

032

13,2

700

:02:

0100

:02:

023

13,4

100

:02:

0400

:01:

084

12,9

400

:04:

0400

:02:

015

12,9

400

:02:

0500

:02:

046

13,2

400

:02:

0800

:02:

007

13,2

500

:02:

0300

:01:

098

12,9

400

:02:

0700

:02:

009

12,9

500

:02:

0600

:02:

0010

12,9

400

:02:

0400

:02:

02M

edia

13,2

1200

:02:

2200

:01:

51

Page 227: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

213

9.4

A

nálisi

s d

e V

ari

an

za y

Med

ia d

e lo

s re

sult

ad

os

A

P-T

0A

P-T

1A

P-T

2A

P-T

3N

D-T

6N

D-T

7

Tiem

pos

Tiem

pos

Tiem

pos

Tiem

pos

CP

UTi

empo

sTr

afic

oTi

empo

s R

espu

esta

CP

UTi

empo

sTr

afic

oTi

empo

s R

espu

esta

Tiem

po/M

bTi

empo

AC

A1,

4403

5E-0

61,

4403

5E-0

62,

9006

E-0

63,

9767

7E-0

60,

0010

93,

6016

9E-0

60,

0021

1555

64,

3096

2E-0

69,

3333

3E-0

52,

5812

6E-0

70,

0004

6777

84,

3472

6E-0

79,

8071

5E-0

82,

1344

3E-0

7A

SA

8,41

934E

-08

9,45

469E

-08

5,74

821E

-05

8,40

968E

-07

0,00

1982

222

9,27

227E

-06

0,00

1045

556

3,38

455E

-06

0,00

0284

444

1,05

618E

-06

0,00

0401

111

5,39

582E

-07

9,80

715E

-08

6,71

418E

-08

May

or v

alor

va

rianz

a2,

12E

-03

Men

or v

alor

va

rianz

a6,

7141

8E-0

8

AP

-T0

AP

-T1

AP

-T2

AP

-T3

ND

-T6

ND

-T7

Tiem

pos

Tiem

pos

Tiem

pos

Tiem

pos

CP

UTi

empo

sTr

afic

oTi

empo

s R

espu

esta

CP

UTi

empo

sTr

afic

oTi

empo

s R

espu

esta

Tiem

po/M

bTi

empo

AC

A00

:12:

5400

:09:

5800

:42:

5700

:34:

0626

,88%

00:4

2:52

76,9

3%00

:31:

4419

,10%

0:34

:22

58,4

5%0:

17:3

10:

13:2

90:

01:5

8A

SA

00:1

1:42

00:0

7:56

00:4

3:34

00:3

3:58

26,3

8%00

:46:

2975

,60%

00:3

1:57

18,4

3%0:

37:0

059

,95%

0:17

:07

0:13

:29

0:01

:57

AC

A

ME

JOR

A

SA

?FA

LSO

FALS

OV

ER

DA

DE

RO

FALS

OFA

LSO

VE

RD

AD

ER

OFA

LSO

VE

RD

AD

ER

OFA

LSO

VE

RD

AD

ER

OV

ER

DA

DE

RO

FALS

ON

AFA

LSO

Dire

ncia

ab

solu

ta d

e pr

omed

ios

00:0

1:12

00:0

2:02

00:0

0:37

00:0

0:08

0,50

%00

:03:

371,

33%

00:0

0:13

0,67

%0:

02:3

81,

50%

0:00

:24

NA

0:00

:01

VAR

IAN

ZA

PRO

MED

IOS

I-T4

SI-T

5R

L-T4

RL-

T5

SI-T

4S

I-T5

RL-

T4R

L-T5

Page 228: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

214

9.5

G

ráfi

cas

de R

esu

ltad

os

de las

pru

eb

as

ACA-

AP-T

0

00:0

0:00

00:0

7:12

00:1

4:24

00:2

1:36

00:2

8:48

12

34

56

78

910

Mue

stra

s

Tiempos

EQ

1E

Q2

ASA-

AP-T

0

00:0

0:00

00:0

1:26

00:0

2:53

00:0

4:19

00:0

5:46

00:0

7:12

00:0

8:38

00:1

0:05

00:1

1:31

00:1

2:58

00:1

4:24

12

34

56

78

910

Mue

stra

s

Tiempos

EQ1

EQ2

ACA-

AP-T

1

00:0

0:00

00:0

7:12

00:1

4:24

00:2

1:36

00:2

8:48

12

34

56

78

910

Mue

stra

s

Tiempos

EQ

1E

Q2

ASA

-AP-

T1

00:0

0:00

00:0

1:26

00:0

2:53

00:0

4:19

00:0

5:46

00:0

7:12

00:0

8:38

00:1

0:05

00:1

1:31

12

34

56

78

910

Mue

stra

s

TiemposEQ

1

E2

Page 229: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

215

ACA-

AP-T

2

00:0

0:00

00:1

4:24

00:2

8:48

00:4

3:12

00:5

7:36

01:1

2:00

01:2

6:24

01:4

0:48

01:5

5:12

12

34

56

78

910

Prue

bas

Tiempos

EQ

1E

Q2

ASA-

AS-T

2

00:0

0:00

00:1

4:24

00:2

8:48

00:4

3:12

00:5

7:36

01:1

2:00

01:2

6:24

12

34

56

78

910

Mue

stra

s

Tiempos

EQ1

EQ2

ACA-

AP-T

3

00:0

0:00

00:1

4:24

00:2

8:48

00:4

3:12

00:5

7:36

01:1

2:00

01:2

6:24

01:4

0:48

01:5

5:12

12

34

56

78

910

Mue

stra

s

Tiempos

EQ

1E

Q2

ASA-

AP-T

3

00:0

0:00

00:1

4:24

00:2

8:48

00:4

3:12

00:5

7:36

01:1

2:00

12

34

56

78

910

Mue

stra

s

TiemposE

Q1

E2

Page 230: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

216

ACA-

S1-T

4

0%5%10%

15%

20%

25%

30%

35%

40%

12

34

56

78

910

Mue

stra

s

Consumo del CPU

EQ1

EQ2

ASA-

SI-T

4

0%5%10%

15%

20%

25%

30%

35%

12

34

56

78

910

Mue

stra

sConsumo del CPU

EQ1

EQ2

Page 231: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

217

ACA-

SI-T

4

00:0

0:00

00:0

7:12

00:1

4:24

00:2

1:36

00:2

8:48

00:3

6:00

00:4

3:12

12

34

56

78

910

Mue

stra

s

Tiempos

EQ1

EQ2

ASA-

SI-T

4

00:0

0:00

00:0

7:12

00:1

4:24

00:2

1:36

00:2

8:48

00:3

6:00

00:4

3:12

00:5

0:24

00:5

7:36

01:0

4:48

12

34

56

78

910

Mue

stra

sTiempos

EQ1

EQ2

Page 232: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

218

ASA

-SI-T

5

0%10%

20%

30%

40%

50%

60%

70%

80%

90%

100%

12

34

56

78

910

Mue

stra

s

Trafico

EQ1

EQ2

AC

A-S

I-T5

0%10%

20%

30%

40%

50%

60%

70%

80%

90%

12

34

56

78

910

Mue

stra

s

Trafico

EQ1

EQ2

Page 233: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

219

ASA-

SI-T

5

00:0

0:00

00:0

7:12

00:1

4:24

00:2

1:36

00:2

8:48

00:3

6:00

00:4

3:12

12

34

56

78

910

Mue

stra

s

Tiempo Respuesta

EQ1

EQ2

ACA-

SI-T

5

00:0

0:00

00:0

7:12

00:1

4:24

00:2

1:36

00:2

8:48

00:3

6:00

00:4

3:12

12

34

56

78

910

Mue

stra

s

Tiempo Respuestas

EQ1

EQ2

Page 234: API DE COMUNICACIONES PARA POCKET PC BASADO EN LA

220

AC

A-R

L-T4

0%5%10%

15%

20%

25%

12

34

56

78

910

Mue

stra

s

Consumo del CPU

EQ1

EQ2

ASA

-RL-

T4

0%2%4%6%8%10%

12%

14%

16%

18%

20%

12

34

56

78

910

Mue

stra

s

Consumo del CPU

EQ1

EQ2