Casa Abierta al Tiempo UNIVERSIDAD AUTÓNOMA METROPOLITANA UNIDAD IZTAPALAPA División de Ciencia:; Básicas e Ingeniería Departarnenfo de Ingeniería Eléctrica Educación a Distancia Reporte de Proyecto de Investigación I y I1 Tesis que presenta el alumno(a) Cruz Norielga Alejandro 9627 7006 Para obtener el grado de : __-- M. en I. David Uzziel López lllescas Marzo 2007. 1 I ~ > TABLA DE CONTENIDO. 225899 1 1. E D U C A C I ~ NA DISTANCIA ................................. OBJETIVOS DEL SKiWviA 2 2. ....................................................................... 2.1 Objetivos generales del proyecto. ....................................................... 2 2.2 Objetivos específicos del proyecto..................................................... 2 3. MARCO TEÓRICO ...................................................................................... 3 3.1 Técnicas utilizadas en el desarrollo del proyecto................................. 3 3.1 .IAnálisis y diseño orientado a objetos. ........................................ 3 .IAnalisis de requerimientos.............................................. 4 3.1 .I 3.1.A .2 Ejemplo de Use Case. .................................................... 5 3.1 .,I.3 Diseñ0.L......................................................................... 7 3.1 .I .4 Construcción .................................................................... 7 3.1.2 UM.................................................................................................. 8 3.1.3 Rational Rose. .............................................................................. 9 3.1.4 De programación en Java ............................................................ 9 3.1.5 De Programación en HTML........................................................... 11 3.1.6 De Programación de Bases de Datos .......................................... 11 4. DESARROLLO PRACTICO (PRIMER PROTOTIPO)................................ 12 4.1 Modelo de requerimientos a nivel gerieral. ............................................. 12 4.2 Para cada Use Case del nivel general ....................................................12 15 4.2.1 Modelo de Requerimientos. ........................................................... 4.2.1 .IModelo de casos. ................................................................ 15 4.2.1.2 Modelo de lnterfaz............................................................... 15 4.2.1.3 Modelo del dominio del voblema ...................................... 15 4.2.2 Modelo de análisis........................................................................... 15 4.2.2.1 Escenarios explorados. ..................................................... 15 4.2.3 Modelo de diseño (Diagramas (le Secuencia)......................... 4 7 4.2.3.1 Escenarios explorados. (ver anexo 3)......................... 47 ., 63 4.2.4 Modelo de construction.................................................................. 4.2.4.1 Introducción................................................................... 63 5. DESARROLLO PRACTICO (SEGUNDO PROTOTIPO) ........................ I00 5.1 Modelo de Requerimientos a nivel general. .............................................1O0 5.2 Modelo de requerimientos para cada Use Case......................................IO 0 5.2.1 Use Case Valida Maestro ...............................................................1O0 5.2.2 Use Case Maestro Da Clases. .......................................................104 5.2.2.1 Use Case Maestro Pregunta.............................................104 . 5.2.2.2 Use Case Maestro Responde Pregunta............................107 Io9 5.2.3 Use Case Valida Ahmno ................................................................. 5.2.4 Use Case Ahmno Torna C h X .......................................................112 5.2.4.1 use Case Ahmno Pre!iunta ...............................................113 114 5.2.4.2 Use Case Alumno Responde Pregunta............................ 5.3 Modelo de Análisis para cada Use Case..................................................116 5.4 Modelo de diseño.^. .................................................................................120 ., 123 5.4.1 Modelo de Implantation.-................................................................. 6. DESARROLLO PRACTICO(TERCER PROTOTIPO) 6.1 Modelo de Requerimientos a nivel cieneral ..........................................125 6.2 Modelo de requerimientos para cada Use Case....................................125 6.2.1 Use Case Avisos Profesor..............................................................127 6.2.1 Modelo de Requerimientos.................................................... 127 6.2.1.IModelo de Casos................................................................. 128 2 6.2.1.2 Modelo de lnterfaz .................................................................129 6.2.1.3 Modelo del dominio del problema........................................132 6.2.2 Modelo de análisis. .......................................................................133 6.2.2.1 Escenarios explorados ......................................................... 134 6.2.3 Modelo de diseño (Diagramas de Secuencia) ........................ I34 6.2.3.1 Diagrama de Colaboracion..................................................133 6.2.3.1 Diagrama de Secuencia....................................................... 134 6.2.3 Codigo Fuente. ..................................................................................... 134 6.2.3 Use Case Consulta Aviso. ....................................................................... 144 6.2.1 Modelo de Requerimientos....................................................145 145 6.2.1.IModelo de casos........................................................ 6.2.1.2 Modelo de Interfaiz..................................................... 146 6.2.1.3 Modelo del domiriio del problema ............................148 6.2.2 Modelo de análisis ..............................................................................149 6.2.2.1 Escenarios explorados .........................................................149 6.2.3 Modelo de diseño (Diagramas de Secuencia) ......................... I 4 9 6.2.3.1 Diagrama de Colaboracion..................................................150 6.2.3.1 Diagrama de Secuencia ......................................................151 6.2.3 Codigo Fuente....................................................................................152 167 6.2.4 Use Case Enviar Archivo ........................................................................ 6.2.1 Modelo de Requerimientos...................................................167 . 6.2.1.IModelo de Casos. ......................................................167 6.2.1.2 Modelo de Interfeiz.....................................................168 6.2.1.3 Modelo del dominio del problema-..........................168 . 6.2.2 Modelo de análisis..............................................................................168 6.2.2.1 Escenarios explorados .........................................................169 6.2.3 Modelo de diseño (Diagramas de Secuencia). ..............................169 6.2.3.1 Diagrama de Colaboracion..................................................169 6.2.3.1 Diagrama de Secuencia....................................................... 170 171 6.2.5 Use Case Descargar Archivo .................................................................. 6.2.1 Modelo de Requerimientos.................................................... 171 171 1 Modelo de Casos........................................................ 6.2. I. 6.2.1.2 Modelo de Interfaz.....................................................172 6.2.1.3 Modelo del dominio del problema ............................172 6.2.2 Modelo de análisis .............................................................................. 173 6.2.2.1 Escenarios explorados. .......................................................173 6.2.3 Modelo de diseño (Diagramas (le Secuencia) .......................... 174 6.2.3.1 Diagrama de Colaboracion..................................................174 6.2.3.1 Diagrama de Secuencia ......................................................174 176 6.2.4 Use Case Registro....................................................................................... 6.2.1 Modelo de Requerimientos...................................................176 . 6.2.1 .IModelo de casos ........................................................ 176 6.2.1.2 Modelo de Interfciz............................................... 1.77 6.2.1.3 Modelo del dominio del problema ...........................178 . 179 6.2.2 Modelo de análisis............................................................................. 6.2.2.1 Escenarios explorados. ................................................ 1.79 6.2.3 Modelo de diseño (Diagramas de Secuencia) .......................... 1.80 6.2.3.1 Diagrama de Colaborac;ion.~ 180 ................................................ 3 180 ....... 6.2.4 Use Case Consulta ...................................................................................... 182 6.2.1 Modelo de Requerimientos....................................................182 6.2.1 .IModelo de casos........................................................182 6.2.1.2 Modelo de Interfaz..................................................... 182 6.2.1.3 Modelo del domiriio del problema............................185 185 6.2.2 Modelo de análisis.............................................................................. 6.2.2.1 Escenarios explorados.........................................................185 6.2.3 Modelo de diseño (Diagramas de Secuencia).......................... 1-86 6.2.3.1 Diagrama de Colaboracion~ .................................................186 186 6.2.3.1 Diagrama de Secuencia....................................................... 6. CONCLUSlONES ....................................................................................... 7. B l B L n x A F í A ......................................................................................... 4 187 ....... 189 ........ 1.EDUCACION A DISTANCIA. Este proyecto surgió con el fin de poder dar cursos o clases de Posgrado vía Internet en el área d~ Ciencias Sociales y Humanidades de la Universidad Autónoma Metropolitana Iztapalapa. Esta idea fue propuesta por la division de Ciencias Sociales y Humanidades en conjunto con el Laboratorio de Ingenieria de Software (LIS) area de proyectos de software. Este proyecto nace para facilitar la difusión de clases o cursos de Posgrado, dar información en la red de dichas clases o cursos, además para tener la opción de poder tomar una clase fuera de las aulas, así como poder tomar el curso desde cualquier lugar en el que se cuente con Internet. Es necesario destacar que dicho proyecto se creo como ya mencionamos para impartir clases del área de Ciencias Sociales pero se puede ampliar a otras areas. Sobre el documento: El siguiente documento muestra; algunas técnicas utilizadas para la elaboración del proyecto, como lo es el Análisis y Diseño Orientado a Objetos, UML, además de la programación que se realizo en Java, así como referencias a libros o páginas utilizadas. También se hace mención en aquellas cosas que no se toman en cuenta en los manuales y se llegan a descubrir cuando se programa. Así como problemas con los que se encuentra el programador en la práctica. 5 2. OBJETIVOS DEL SISTEMA. Objetivos Generales: . . Elaborar una aplicación Cliente-Servidor vía Internet donde los maestros puedan dar clases desde su máquina, y los alumnos se puedan conectar a esta. Las clases se darán a través del envío y recepción de texto. así como el envió y la recepción de imágenes. Recepción de preguntas por parte de los alumnos al profesor. El maestro podrá enviar texto. El alumno podrá enviar texto. Objetivos Específicos: O O La aplicación debe ser amigable La programación será en Java, haciendo uso de applets y servlets. Se crearan hojas en HTML, para presentarlas en la RED. Cada alumno tendrá una clave de acceso para dicha clase. Los alumnos podrán enviar preguntas a los maestros. No existirá la comunicación entre los alumnos, únicamente por medio del profesor. El maestro podrá abrir archivos que podrá enviar a los alumnos tanto a la pantalla de exposición como a páginas HTML ya previamente establecidas para éstos fines. El maestro puede enviar preguntas o comentarios a los alumnos. El maestro podrá ver que alumnos estén conectados, así como las preguntas que le envíen. 6 3. MARCO TEÓRICO A continuación se citan las técnicas utilizadas para el desarrollo del proyecto. Así como sus puntos finos en la construcción, de la cual se hace un énfasis especial en el análisis y diseño orientado a objetos porque ha sido la base de todo el desarrollo del proyecto. 3.1 Técnicas utilizadas en el desarrollo dlel proyecto. Las principales técnicas utilizadas para el desarrollo del proyecto, son en la Ingeniería de Software el análisis de riesgo:;, el análisis y el diseño orientado a objetos, el desarrollo por prototipos, estrategias para tratar el riesgo, la codificación y las pruebas. - 3.1.1 Análisis y diseño orientado a objetos. El proyecto se desarrolló sobre la base de una metodología de Análisis y Diseño Orientada a Objetos, que tiene como meta el desarrollo de prototipos incrementales, es decir, partiendo de un prototipo O con solamente unas cuantas funciones básicas, se van generando prototipos subsecuentes con mayor funcionalidad, cada uno de los cuales es alimentado por el anterior. El desarrollo incremental por prototipos minimiza el riesgo de entregar un producto con errores en todos sentidos, pues cada uno de ellos paulatinamente incrementa la utilidad del sistema y permite la revisión por parte de los usuarios desde etapas tempranas. Así, el cliente retroalimenta el desarrollo participando activamente como un aliado y no como un (enemigoa vencer. El análisis y diseño orientado a objetos se divide en varias etapas, cada una con entregables bien específicos que alimentan a la etapa siguiente. Estas etapas son: Etapa Entregable 1.- Levantamiento de Requerimientos. IVodelo de requerimientos. Modelo de Casos(USE CASE). Modelo de Interíaz: Pantallas principales. Diagramas de transición de estados. Modelo de dominio del problema. 2. - Análisis. IModelo de Análisis. 3. - Diseño. Modelo de Diseño. 4. - Construcción. Modelo de Construcción. 7 Cada uno de los prototipos se desarrolla siguiendo estas etapas en estricto orden, puesto que cada una alimenta a la siguiente. Por lo tanto, cada uno de los prototipos es un micro-desarrollo, como se muestra en la figl. Prototipo 1 1 Requerimientos Prototipo 2 + 1 1 Requerimientos Analisis 1 Construcción Requerimientos 1 1 Diseño Prototipo n Diseño 1 konstrucción Diseño Construcción ..... 3.1 .I.IAnálisis de Requerimientos. Esta etapa se encarga de levantar los requerimientos y especificaciones de los usuarios, de modo que queden lo suficientemente claros para evitar errores en las etapas posteriores. Esta parte es crucial porque los requerimientos obtenidos alimentarán todo el desarrollo posterior, y entonces se debe garantizar que lo que el usuario desea sea lo que el desarrollador entiende, con Io que se tiene una base confiable. Aparte de estas importantes implicaciones, el levantamiento de requerimientos sirve para que el equipo de desarrollo vaya adquiriendo un conocimiento aceptable del entorno sobre el que va a trabajar, pues son especialistas en desarrollar sistemas, no en la materia sobre la cual va a desarrollar. El aprendizaje del entorno permite la elaboración de un producto mas eficiente y libre de errores, pues así desarrolla una solución de un problema que conoce (o que va conociendo). Todo este conocimiento lo absorbe de usuarios clave, que conocen lo más perfectamente posible el problema. El entregable aquí es el modelo de requerimientos, que se constituye a su vez de tres modelos: 0 0 0 Modelo de Casos Modelo de lnterfaz Modelo del Dominio del Problema El Modelo de Casos extrae el conocimiento funcional fundamental del problema de una forma estructurada y progresiva, siendo la base para establecer la estructura del sistema. Este modelo orienta todos los demás procesos del método. Para plasmar exactamente lo que hace un sistema, se necesita definir las transacciones principales que lo componen, como se comunican y el orden que siguen para describir su funcionalidad. 8 3.1 .I .2 Ejemplo de Use Case. Un USE CASE es precisamente una descripción de una transacción, donde no sólo exhibe lo que hace, sino también incluye una serie estructurada de pasos para realizarla y los entes que interactuan con él o Actores. Cada USE CASE se trata por separado como un objeto. El sistema completo puede constar de una infinidad de transacciones, pero se ordenaran con una jerarquía de herencia, en la que cada nivel hará uso o derivara a su vez otras transacciones o USE CASES hasta describir la totalidad, siempre tratando de guardar la proporción de 5-9 o f 7 objetos #encada nivel para asegurar la percepciÓn(una cantidad mayor será difícil de entender, uria cantidad menor podría ser incluida en otro nivel). Ejemplo de USE CASE. Sobre el Modelo de lnferfaz establece el vínculo visual entre el desarrollador y el usuario para concretar aspectos de la interacción que el sistema pudiese tener con su entorno externo, permitiendo la retroalimeiitación temprana de aspectos fundamentales para el conocimiento de la aplicación. Consta de las pantallas principales que se utilizarán al desarrollar una transacción y su correspondiente Diagrama de transición de estados. Sobre el Modelo del Dominio del Problema se establecerán los principales objetos que constituirán al sistema y las relaciones que tienen entre sí. Los objetos persistentes almacenarán información, es decir, la base de datos real, que después se tendrá que pasar irremediablemente a un modelo relaciona1 y no orientado a objetos; por lo que las relaciones obtenidas aquí serán muy Útiles. Orden de Compra Articulo gCeArtic @ DescAriic @PrecioAriic QExistenciasAriic ~ ~ S e utiiiza en O ' +FechaOC @ +FolioOC Q rticulosoc 8antidadesOC ~ ~ , - -~ 1 1' Conesponde ./ S e ufdna en ,o* 9 101 Ejemplo de Modelo de dominio del problema El proceso completo de levantamiento de requerimientos se desarrolla de la sigu¡ente manera: Inicialmente se entrevista a los usuarios principales o con poder de decisión de la empresa y se les pide que definan las transacciones principales que definen al sistema, se tratarán de acotar a solamente aquellas de las cuales no se pueda prescindir y sobre las que se enfocará el mayor esfuerzo. Después se convendrá una cita con los usuarios más expertos en las transacciones principales para que describa los pasos a realizar para llevarlas a cabo. Se desarrolla un modelo inicial con el o los USE CASE que se obtuvieron, pantallas iniciales y demás componentes. En citas posteriores se propondrán estas pantallas y descripciones al usuario y se refinarán con las observaciones que haga. Esta etapa termina cuando loscambios que se hagan al modelo sean mínimos. Es importante recalcar que el prcicedimiento más pesado de levantamiento de requerimientos como se indica anteriormente, y el análisis y diseño se hace al principio del proyecto. En los prototipos subsecuentes se realiza también estas etapas para añadir nuevas transacciones y modificar las existentes, pero el trabajo ya no es tan completo. Sobre el Análisis aquí se dan las relaciones que existen entre los diversos objetos encontrados y se diseñan nuevos que puedan ayudar a la tarea específica de cada uno. AI final se tendrá una descripción detallada del comportamiento y comunicación que existe entre los diversos objetos que realizan una transacción. Para entender mejor estas relaciones se construyen escenarios, que son instanciaciones de una transacción, es decir, descripción de los pasos necesarios y los valores reales que se obtienen o se transmiten. Este escenario es referente a un comportamiento perfecto, y los errores y excepciones se toman en cuenta hasta que un escenario es perfectamente interpretado. Aquí es importante recalcar la utilidad del inodelo de tres capas. En dicho modelo todos los objetos que interactuan en una transacción se dividen en tres grupos de acuerdo a su funcionalidad: los objetos de interfaz que solamente se encargan de capturar o exhibir información, los objetos de negocio que rnanejan la lógica para manipular y procesar datos, ya sea para entregarlos a un objeto de interfaz o para obtenerlos de un objeto de datos, cuya única función es servir como un mensajero eficiente hacia o desde la base de datos permanente. AI separar los objetos en estos tipos su ordenamiento es adecuado y el mantenimiento es más sencillo. El producto principal de este proceso es el diagrama de colaboración, que describe todos los objetos en juego para (cada transacción, las llamadas que reciben y hacen hacia otros objetos con sus pariimetros respectivos(con sus tipos de datos recibidos y a retornar). 10 El diagrama de colaboración debe ser lo suficientemente detallado para entender estas relaciones. 4 SuifidoOC 1 GetOCPendientes(cLis1aOC) -> 3 SelecOC > ListaCiCPendkntes < PantallaLzaOC c 1 Pordenescompra I ozrdenCompT c dencompra ~~ Almacenisla 5 Show(0CSelaccionada) V 6 GeneraAE ~ ' A 7 CreaAE(OCBelecci0nada) V Datos - 1 oAwsoEntrada -- avisoentrada --S ~ 2 GetData(QuerylD Parámetms DatosLetdas) 1 0 WriteData(QuerylD Parámelms Datos-a-escnbir) OV I o A d Im n _____--- -+ D _________ WrleC ata(QuevlD Parámelms Datos-a-escnbTr) - ~~ -> ~ , ~ A i f i c ~ I o! 1 11 AcluaiiraInventano(tinteger. tlnleger, iliiteger. ifechd) ' 1 1 -A ~ 12 GeIDala(QueiylD, Parámetms. DatosLeidos) + writeData(QueviD'Para~e'ros~Da'os-a-escnb'r) Ejemplo de Diagrama de Colaboración. 3.1.I .3 Diseño. Prácticamente es una extensión all análisis con la adición de que contempla aspectos de implantación, es decir, toma en cuenta las características especiales de la plataforma en que va a utilizarse para decidir que tipo de datos se utilizara, el tipo de estructuras de almacenamiento mas ade'cuadas y demás detalles característicos. El entregable es el diagrama de secuencia, que es una interpretación gráfica exacta y en orden estricto de todas las llamadas que liacen y reciben los objetos que realizan una transacción. Aquí todos los métodos de los distintos objetos tienen ya bien especificados sus tipos de datos en base a una plataforma dada. Estos diagramas son la especificación completa a seguir para desarrollar el producto y tiene que ser lo mas clara y precisa posible para que el programador la siga al pie de la letra. 3.1.I .4 Construcción. Es ya la elaboración del producto. Culmina todos los esfuerzos con un prototipo funcional que sigue las especificaciones de todas las etapas anteriores, listo para probarse y modificarse alimentando un prototipo subsecuente. Para un buen entregable habrá que colocar comentarios amplios eri el código donde hagan falta para facilitar el mantenimiento y tener un producto legible. Cabe hacer notar que el proceso de pruebas se encuentra inmerso en todas las etapas anteriores y por eso no se le considera una más. AI realizar el levantamiento de 11 requerimientos en un principio los cambios son extensos por las observaciones y modificaciones propuestas por el usuario, tendiendo a estabilizarse, con lo cual el procedimiento de prueba se encuentra inrrierso en el trabajo. Cuando los cambios son mínimos entonces el usuario ya ha dado de forma implícita una prueba y una aceptación, dando luz verde para el arranque de las demás etapas, alimentadas ya con requerimientos sólidos. AI desarrollar las demás etapas de análisis y diseño y explotar una transacción dada, al sobresalir algunas rectificaciones para integrar, al realizar pruebas de escritorio y resolver dudas de los programadores acerca de especificaciones, diseños y aspectos relacionados, se están realizando pruebas. AI entregar un prototipo para revisión la entrega misma es una prueba, con la ventaja de que se hace en etapas muy tempranas del desarrollo, permitiendo verificar y corregir a tiempo. En suma, durante todo el desarrollo se hacen pruebas, tomando cclmo un hecho que una etapa alimenta a la siguiente con entregables sin errores en la medida de lo posible, y que además con esta metodología es sencillo corregir un fallo, pues nunca serán errores trascendentales. Todas estas etapas son repetidas eri el desarrollo de cada prototipo, que a su vez alimentara a uno posterior hasta que el nivel de errores y cambios sea bajo y se haya logrado atacar con eficacia las transacciones mas importantes. 3.1.2.- UML Para seguir una metodología orien’tada a objetos es indispensable un lenguaje standard bien establecido que permita modelar las ideas de una manera correcta y que permita su traslado a código sin errores. Para plasmar toda la información en cuanto a levantamiento de requerimientos, análisis y diseño se utilizo el lenguaje unificado de modelado o UML, que a ultimas fechas SE! ha convertido en un estándar en el área de análisis y diseño orientado a objetos. Los sencillos ejemplos mostrados en la sección anterior de diagramas de estados, colaboración y secuencia han sido elaborados con base en este lenguaje. AI ser un lenguaje estándar nos da un punto de partida ideal para que cualquier gente que tenga nociones de el entienda nuestras ideas y su contexto, transformándose en un medio de comunicación efectivo, sin tener que extenderse demasiado en explicaciones, ejemplos, etc. Algunos elementos más importantes del lenguaje son los sigs. : G? Actor Autotransicion O (DJntcio USE CASE Transicion ~- \ /’ Generalizacion A w c i aci on Agrega ci on , 12 I -9 -+ Estado Liga hacia si mismo 1 NewClass 5 f \ -~ ~~~ I: Liga o mensaje NewClas~6 E 3 I Clase [ j Asociacion Objeto 3.1.3.- Rational Rose. Para poder diseñar en base a un lenguaje se necesita una herramienta que facilite el trabajo. La que mejor se adapto a las niecesidades y disposición que se tenia para el presente trabajo fue Rational Rose, una herramienta CASE que proporciona una interíaz gráfica para el modelado. Con ella se tiene una buena administración de los proyectos porque permite el desarrollo de prototipos iricrementales y su uso es bastante sencillo. En el caso del proyecto el trabajo se dividió en partes que pudieran desarrollarse paralelamente, se analizo el resultado de cada una y al final se unieron en un proyecto principal. Cada cambio que se le hacia al diseño era efectuado en el proyecto de rose principal de manera que todo mundo los apreciara y pudiera modificarlo avisando desde luego de dichos cambios. 3.1.4.- Técnicas de programación en Jawa. Como el proyecto esta basado en el uso de Internet el lenguaje ideal es Java. Este lenguaje es multiplataforma y el acceso a través de Internet tiene como Único requisito el uso de un browser compatible con Java. Las ventajas son evidentes y se citan a continuación: 1. - Java es multiplataforma. Puede un mismo programa correr en diferentes maquinas sin compilar y modificar nuevamente. 13 2. - AI utilizarse paginas HTML dinámicas o Applets el código reside realmente en la maquina servidor(gateway) y es transpori:ado e interpretado en la maquina cliente, así que para realizar modificaciones y mantenimiento se trabajará Únicamente sobre el código que esta disponible en el servidor y no en toidas las maquinas cliente. 3. - La programación del lado servidor en Java es sencilla y eficiente, ya que a diferencia de guiones CGI los servlets o clases especializadas en proporcionar servicios HTTP permanecen residentes en memoria. pueden mantener conexiones costosas con bases de datos y su programación no es tan laboriosa. Por otro lado, el uso de JDBC o conexión abierta con bases de datos, permiite que su uso sea flexible a este respecto y tenga fácil mantenimiento. JDBC (Java DataBase Connectivity) es un API de Java que permite al programador ejecutar instrucciones en lenguaje estándar de acceso a Bases de Datos, SQL (Structured Query Language, lenguaje estructurado de consultas), que es un lenguaje de muy alto nivel que permite crear, examinar, manipular y gestionar Bases de Datos relacionales. Para que un8 aplicación pueda hacer operaciones en una Base de Datos, ha de tener una conexión con ella, que se establece a través de un driver, que convierte el lenguaje de alto nivel a sentencias de Base de Datos. Es decir, las tres acciones principales que realizará JDBC son las de establecer la conexión a una base de datos, ya sea remota o no; enviar sentencias SQL a esa base de datos y, en tercer lugar, procesar los resultados obtenidos de la base de datos. 4. - Como es un lenguaje 100% orientado a objetos, es el lenguaje más idóneo para un análisis y diseño correcto orientado a objetos. 5. - Como las clases predefinidas que posee tienen una alta orientación al uso de Internet, mucho del trabajo de bajo nivel y más complicado ya se encuentra resuelto y probado, con lo que se ahorra mucho tiempo en programación. 6.- El parecido con el lenguaje C es sorprendente, con lo que se facilita mucho el aprendizaje. Java es el primer lenguaje que tiene la virtud de ser compilado e interpretado de forma simultánea. Cuando un programador realiza una aplicación o un applet en Java y lo compila, en realidad, el compilador no trabaja como un compilador de un lenguaje al uso. El compilador Java únicamente genera el denominado Bytecode. Este código es un código intermedio entre el lenguaje máquina del procesador y Java. Evidentemente este código no es ejecutable por sí mismo eri ninguna plataforma hardware, pues no se corresponde con el lenguaje de ninguno de los procesadores que actualmente se conocen (habrá que esperar a ver qué ocurre cor1 los procesadores Java). Por lo tanto, para ejecutar una aplicación Java es necesario disponer de un mecanismo que permita ejecutar el ByteCode. Este mecanismo es la denominada Máquina Virtual Java. En cada plataforma (Unix, Linux, Windows 95/NT,Macintosh, etc.) existe una máquina virtual específica. Así que cuando el ByteCode llega a la máquina virtual, ésta lo interpreta pasándolo a código máquina del procesador donde se esté trabajando, y ejecutando las instrucciones en lenguaje máquina que se deriven de la aplicación Java. De este modo, cuando el mismo ByteCode llega a diferentes plataformas, éste se ejecutará de forma correcta, pues en c a d i una de esas plataformas existirá la máquina virtual adecuada. Con este mecanismo se consigue la famosa multiplataforma de Java, que con sólo codificar una vez, podemos ejecutar en varias plataformas. En realidad la máquina virtual desempeña otras funciones, como la de aislar los programas Java al entorno de la máquina virtual, consiguiendo una gran seguridad. Como herramienta se utiliza JBuilder 2.0, que es una herramienta RAD eficiente hasta cierto punto. Las máquinas utilizadas para el desarrollo son potentes y no tienen 14 problema, pero cuando se intenta utilizar en maquinas mas sencillas, los recursos que consume son importantes. En el principio del proyecto se intento realizar la conexión entre cliente y servidor mediante métodos remotos (RMI) inmersos en un applet cliente y un servidor. Este método no funcionó, pues generó muchas restricciones en cuanto a seguridad. Los navegadores o browsers no permiten tan fácilmente una conexión de este estilo y si existen firewall y proxys entre las conexiones la comunicación es muy difícil. Por todo lo anterior se decidió cambiar a servlets, con lo cual la comunicación se realiza de forma conveniente y muy fácil. 3.1 S.-Técnicas de programación en HTMIL Para que cualquier persona tenga un acceso fácil a la clase virtual así como información relativa con los cursos de la Uiiiversidad y acceso a información detallada y de uso gral., el recurso más sencillo es el uso de paginas HTML. Como un único requisito el usuario debe tener un navegador como Internet Explorer o Netscape. AI utilizar Java del lado servidor las mismas paginas pueden ser generadas de forma dinámica lo que hace muy rico su contenido y posibilidades. Lals versiones actuales de HTML(Lenguaje de Marcas para HiperTexto) proporcionan la posibilidad de cargar imágenes animadas, crear ligas, botones con acciones predefinidas en un script (por ejemplo JavaScript) y otras posibilidades sin la necesidad de contar coin una máquina virtual como en el caso de los applets, con lo que su uso es mucho más eficiente ai no necesitar demasiados recursos y cargase de manera rápida. Sin embargo, como no almacenan información a través del tiempo ni tienen la capacidad de desplegar ventanas independientes (para un aviso por ejemplo) su uso se restringió al papel de interfaz donde fue posible. Las técnicas de programación del lenguaje de HTML es relativamente sencillo, ya que no necesariamente se debe de hacer la construcción paso a paso, si no que es realmente con interfaces que facilitan el trabajo como los son el FrontPage u otros, estos mismos generan instantaneamente el código y las lineas como para ligar algunas paginas son relativamente sencillas. 3.1.6.-Tecnicas utilizadas en Bases de Datos (Access e Interbase). Este es un manejador de bases de datos muy popular y sencillo de manejar. Su efectividad no es lo más conveniente para un trabajo de este estilo pero como su uso es extensivo y no tiene que hacerse un programa particular para la introducción de datos ni modificación de ellos, fue la elección más pertinente en su momento. Este problema se ha considerado como no trascendental porque la Única ocasión en que se utiliza arduamente la base de datos es cuando los alumnos ingresan a la clase virtual. En todo el demás tiempo el maestro es el único que hace uso de ella para actualizar calificaciones o consultar historiales. Sin embargo, se hace notar que su eficiencia no es la adecuada, y al usarse JDBC en el lado servidor, se puede cambiar la BD con facilidad sin necesidad de alterar otra cosa que el driver odbc particular de la nueva base de datos en todos los servlets que la utilizan, en caso de tener problemas de desempeño. 15 4. Desarrollo práctico (Primer Prototipo). En la etapa práctica del proyecto, se hizo el desarrollo, empleando las técnicas del Análisis y Diseño Orientado a Objetos (ADOO), en las que se aplicó el diseño de Use Cases (Casos de uso UC); así, para cada UC se analizó su modelo de requerimientos, que, de acuerdo con lo ya mencionado en el marco teórico del presente reporte, dicho modelo comprende los modelos de casos, dle interfaz y del dominio del problema. Es importante mencionar, que hasta esta etapa el proyecto consta de dos prototipos, en esta parte explicaremos el desarrollo del primer prototipo para finalmente pasar a la descripción del segundo prototipo. 4.1 Modelo de requerimientos a nivel general. En ésta etapa, se estableció la forma de trabajo el equipo y se comenzó con la familiarización del equipo de desarrollo con el problema (el diagrama se encuentra en el ANEXO 1). ANEXO I MODELO DE REQUERIMIENTOS (nivel general) Diagrama General de Use Cases del Chal: -/ " \ I \ MaestroDa Clase MAESTRO AlumnoToma Clase / \ Nlaestro Expone Maestro Pregunta Alumno Responde Maestro Contesta Alumno Pregunta Maestro Accesa Expediente 16 Especialización de Use Case Maestro Pregunta y Alumno Responde \ I Alumno MAESTRO Maestro Alumno Contesta Pregunta MaestraPregunlaAbierta \ \ Maestrocalifica Respuesta Termina Selecci6n ~ AlumnoRespondePregDlrecta Maestrocalifica ReS1)"eSta Especialización de Use Case Maestro Contesta x MAESTRO A ALUMNO , ~~ 6-ALUMNO M a e s t r o contesta 1, - MaestroContestaCOn P re d e t e r m i n a d a M a e s t r o C o ntesta D ire c l a m e nte 17 PREGUNTA Especialización de Use Case Maestro Expone x MAESTRO Maestro Expone ) MAESTROENVIAIMAGEN <<USA>> MODIFICAR IMAGEN SELECCIONAIMAGEN 4.2 Modelo de requerimientos para cada IUse Case. Aquí se especifica la secuencia de acciones a tomar por el sistema para cada intercambio de información (Ver diagramas 'en ANEXO 2). 4.2.1 Modelo de requerimientos: 4.2.1.1 Modelo de casos (Ver ANEX02). 4.2.1.2 Modelo de lnterfaz (Ver ANIEX02). 4.2.1.3 Modelo del dominio del problema (Ver ANEX02). 4.2.2 Modelo de Aná?isis. 4.2.2.1 Escenarios explorados. Los escenarios que se exploraron, (corresponden Únicamente al encontrado en el marco de "Simple Correcto", ya que al ingresar a otro escenario, en el que la clave de acceso del alumno o el profesor sean incorrectas, el sistema simplemente no entra en ejecución, por lo que se omitieron diagramas que no tiene gran valor ilustrativo. 4.2.3 Modelo de Diseño (Diagramas de Secuencia). 4.2.3.1 Escenarios Explorados. 18 Como se estableció en el modelo de análisis, el Único escenario descrito es el que presenta las características de ser el "Simple Correcto", por lo que se presentan los diagramas de secuencia para cada Use Case para éste escenario en particular (Ver ANEX03). ANEXO 2: Modelos de Requerimientos para cada UC 1. Use Case MaestroPreguntaAbierta - - \ , ~ \ MaestroPreguntaAbierta MAESTRO PASOS 1.-Maestro presiona -pregunta abierta 2.-Teclea pregunta en el área de texto. 3.-Maestro presiona enviar. 4.-Sistema lleva pregunta a todos los alumnos. 5 -Sistema trae la solicitud de los alumnos (que quieren responder y los marca en el área de alumnos presentes. 6.-Maestro selecciona alumno que responderá y presiona -Aceptar. 7.-Sistema avisa a alumno que ha sido seleccionado para responder, comienza un timer y trae su respuesta al área de texto, difundiendo ésta a todos los demás clientes. 8.-U.C. MaestroCalificaRespuesta y regresa a 6 o pasa a 9. 9.-U.C. TerminaSelecciÓn. Diagrama de Estado (Use Case Maestro Pregunta Abierta) Selecciona Teclea Entra !,' -2- AlumY--nospresentes I A - P a n t P rin Pregunta A biertd 4 7 -- ~ - Fin &Aceptar y Selecciona otro( PreguntaHecha ) Aceptar( Alumno ) Aceptar y U C Term inaSeleccion uc v JL PantCalificacion ( 19 ~ AreaDeTexto - Diagrama de Clases (Use Case Maestro Pregunta Abierta) cMAESTRO (from L o g i c a l V i e w ) 6 e CveCurso @ &Fecha @ +Hora Q e C a l i f P articip +Nombre P a s s word \ Esta en \ I n s c r i f o en \ 1 1 0 1 1 * eCveEmpleado &C lave ho ra r io 1 rc1 cinscripcion (from L o g i c a l V i e w ) t+C alif‘rotal /’ (Irom L o g i c a l v i e w 1 &C red ! t o s 2. Use Case MaestroCalificaRespuesta MAESTRO MaestroCalificaReswesta PASOS Maestro otorga una calificación a la respuesta o comentario del alumno. I.-Sistema trae un cuadro de dialogo con los datos del alumno previamente seleccionado y un área de texto para que el maestro ponga la calificación. 2.-Maestro teclea la calificación y presiona aceptar. 3.-Sistema guarda calificación del alumno. 4.-Sistema muestra al alumno seleccionado mediante un cuadro de dialogo el aviso de que su respuesta fue calificada y la calificación correspondiente. 5.-Sistema despliega en todos los clientes de alumnos la participación exitosa y calificación del alumno en el área de texto. 20 Diagrama de Clases (Use Case MaectroCiilificaRespuesta) cMAEST RO . . Password cClase ( t mLogICal View) Esta en (fran Logical View) \ &Fecha NumClase @Impartida Fecha Fi n Tiene \ / \ Creditos cDlAS 1..1 ,+Dia 3 @Dia 4 &Dia 5 1 hora de inicio tiene %clave dias \ L I I I +actualiza hora de inicio( +actu a I iza du raci Ón () +Modifica dias() 3. Use Case Termina Selección pregunta Abierta - - ~- / \ ~ \ TerminaSeleccion Preg Abierta ALUMNO PASOS 1.-Maestro presiona cancelar. 2.-Sistema borra todas las marcas de los aspirantes a contestar. 3.-Sistema avisa a todos losalumnos que s'e ha terminado la oportunidad de contestar. 21 Modelo de lnterfaz Diagrama de Estado (Use Case Termina Selección Pta. Abierta) C a n c / T e r m i n a r Pregunta A b i e r t a 0 1IN IC IO 1 , Pantalla S e l e c c i ó n d e p r e g A b t a ( IL ,/' Eliminar m a n o s alzadas I I I J 4 L S e genera Aviso d e F i r de Oportunidad p a r a contestar Diagrama de Clases (Use Case Termina Selección Pta. Abierta) CMAESTRÓ 1 (from Logical View) %CveEmpleado @ 4. Use Case MaestroPreguntaDirecta MaestroPreguntaDirecta MAESTRO PASOS Maestro realiza una pregunta específica para un alumno y la califica. 1.-Maestro selecciona alumno en la pantalla de alumnos presentes. 2.-Maestro presiona pregunta directa. 3.-Maestro teclea la pregunta en el área de texto y presiona enviar. 4.-Sistema lleva pregunta a todos los alumrios. Ei.-Sistema avisa a alumno mediante cuadro de dialogo que ha sido seleccionado para contestar y comienza un timer.. 6.-Sistema trae respuesta y la despliega en todos losclientes. 7.-U.C. MaestroCalificaRespuesta. 8.-Sistema termina. 22 Modelo de lnterfaz Diagrama de Estado (Use Case MaestroPreguntaDirecta) Diagrama de Clases (Use Case MaestroPreguntaDirecta) XAE s TRO view) &CveErn pleado Q &Nombre &Pass word (from L o g i c a l g4.,. - 1 Q %Hora Esta e n .1 . 1 Tiene --/-- En parfe de 1 \ Lzzz&Nombre Q 1 .I 'nscrito e n O.' 5. Use Case MaestroContestaDirectamente MaestroContestaDirectarnente MAESTRO Ante las diversas preguntas que el maestro puede ver en el area de preguntas que realizan los alumnos, selecciona una para responder y la contesta . PASOS 1.-Maestro selecciona la pregunta correspondiente en el área de preguntas. 2.-Maestro presiona responder. 3.-Sistema prepara envío.(Pregunta, alumno). 4.-Maestro teclea respuesta en el área de texto y presiona enviar 5.-.Sistema despliega en todos los alumnols la pregunta , el alumno que la realizó y la respuesta dada por el Maestro. Layouts de pantallas( Use Case MaestroContestaDirectamente) 24 1.-Maestro selecciona la pregunta correspcindiente en el área de preguntas. 2.-Maestro teclea respuesta en el área de texto y presiona enviar Diagrama de Estado (Use Case MaestroCOntestaDirectamente) Selecciona Pregunta / O Entrar > PantPnn 3 ~~ 1 ~ Desplegar Preguntas I ~ A ~~ Área Preguntas ~~ l Enwar( Todo+,lumno$Alumno,Pregunta,Respuesta 1 Responder(Aiumno,Pregunta ) Fin g’ (0; Teclea / - \ 7 ÁreaDel-exto 25 < Diagrama de Clases (Use Case MaestroContestaDirectamente) i cum (from Logical View) &&Urn &,Nombre @ 1 1 &Creditos nene CParticipaciwi (tmm Logical View) O' En epm @ O * &CalllPartlclp Esta en , 11 l..I/' Y ~ cMAESTRO (fmm Logical View) &&Emplead0 &Nombre &Password @ &Matncula @ 0 * +,cleCUrsO@ &Fecha @ I ALUMNO 1 (from Logical View) iwMatnx@ pmbre YgPasswrd 1 26 I 6. Use Case MaestroContestaConPredeterminada ~ MaestroContestaConPredeterrninada MAESTRO Maestro contesta una pregunta de las que se han hecho en el area de preguntas y la contesta mediante una respuesta que previamente ha capturado y puesto a disposición. PASOS 1.-Maestro selecciona la pregunta que desea responder en el area de preguntas. 2.-Maestro presiona -Responder. 3.-Sistema prepara respuesta(Pregunta, alumno). 4.-Maestro presiona -Cargar. Ei.-Sistema trae todas las opciones que se han precargado en un cuadro de opciones que contiene la pregunta y la respuesta. 6.-Maestro selecciona la pregunta y respuesta correspondiente y presiona -Aceptar. 7.-Sistema despliega en el área de texto la pregunta y respuesta seleccionada. 8.-Maestro presiona -Enviar. 9.-Sistema lleva la pregunta, el alumno que la realizó y la respuesta dada a todos los alumnos de la clase. Diagrama de Estado (Use Case MaestroContestaConPredeterminada) Selecciona Pregunta Enviar( TodosAlumnos.'Alumno,Pregunta.Respuesta ) R e s p o n d e r y Cargar( A l u m n o , P r e g u n t a ) I 'n k S e l e cc'o n a Re sp u e Sta 1-I- $1 ÁreaDeT e x t o Aceptar( A l u m no .P regu n t a ,Respuesta ) 27 Pant Diagrama de Clases (Use Case MaestroContestaConPredeterminada) cUEA (hanLqlC4MRY) &CveUEA @ &Nombre &Creditoc 1 1 Jene O ' ' ccum (han LqldUew) o + CveCum Q 1 1 &CvecUi53 &CveEA &Fechalnic @ &FechaFin QCveEmpleado &Clavehorano ~ $,CalifPaiticip O' 1 1 En ~ Fmm pade de Esta en 1 1 O * -~ clnmpcion 1 l~ Inccnto en 7. Use Case AlumnoRespondePregDirecta -\ I ' \ \ AlurnnoRespondePreg. Directa ALUMNO PASOS 1.-Sistema avisa que el alumno ha sido seleccionado para responder la pregunta directa .Despliega un timer(re1oj). 2.-Alumno teclea respuesta y presiona envi,ar. 3.-Sistema lleva respuesta a servidor o avisa del fin del tiempo.(para contestar). 4.-Sistema despliega mensaje de respuesta recibida o puntuación otorgada.(privada). 28 Diagrama de Estado (Use Case AlumnoRespondePregDirecta) INICIO > Pantalla Principal 1 Sistema avisíl al alumno que ha sido escogida para responder la preg hecha ~ ~ ~-~~ Mensaje de seleccion 1 3 c - I I ~~ ~~ Alumno teclea respuesb y envia si fue selehionado FIN ~ -! - Respuesta a la preg realizada No fue posible la generacion de la calificacion Finaliza respuesta del alumno Calificaciori <- -~ &&posible seFnera la calificaci'on Diagrama de Clases (Use Case AlumnoRespondePregDirecta) CP articipacion c c c aiiíic a c i i %C ó n (from L o g i c a l V i e w ) 7 &Matricula Q &CveCurso Q &Fecha Q &Hora Q %.CaIifP articip alificac ion a s ign a d a 29 8. Use Case AlumnoRespondePregAbierta AlumnoRespondePreg.Abiería ALUMNO PASOS 1.-Sistema trae a la pantalla la pregunta y la marca como abierta(Area de Exposición). 2.-Alumno presiona solicitud de Participación . 3.-Sistema lleva solicitud al servidor. 4.- Sistema trae respuesta de servidor 5.-Alumno teclea respuesta y presiona enviar. 6.-Sistema lleva respuesta del alumno. 7.-Sistema notifica a los alumnos del termino de la sección de Respuestas. Layouts de pantallas (Use Case AlumnoRespondePregAbierta) Diagrama de Estado (Use Case AlumnoRiespondePregAbierta) Solicitud de Participacion pala contestar pregunta ~ V R e s p u e s t a a Solicitud A A F IN ~ ~- ~~ E l a l u m n o r e s p o n d e la p r e g u n t a 1 L a solicitud n o fue a c e p t a d a ~~A ! ! - __ ~ Respuesta del alumno ~ E n v i a r respuesta a l servidor - ~ ~~~- Diagrama de Clases (Use Case AlumnoRespondePregAbierta) &Nombre WP a s s w o rd 30 Layouts de pantallas: AlumnoRespondePreguntaAbierta 225899 9. Use Case MAESTRO EXPONE DIRECTO , MAESTRO MaestroExponeDirecto PASOS 1.- Maestro elige expone directo 2.- Sistema muestra pantalla del maestro. 3.- Maestro teclea en el área de pizarrón. 4.- Sistema envía información a alumnos 5.- Maestro termina clase. 31 Layouts de pantailas(Use Case MAESTRO EXPONE DIRECTO) 3.- Maestro teclea en el área de pizarrón. 4.- Sistema envía información a alumnos 32 Diagrama de Estado (Use Case MAESTRO EXPONE DIRECTO) maestro teclea informacion / a ' opciones del maestro muestra -- - T '\ 7 ~ > pantalla del maestro I < toma otra opcion termina clase fin de clase fin de clase -v -~ ~~ 'pantalla de fin de clase 1 , Modelo del Dominio del problema Diagrama de Clases(Use Case MAESTRO EXPONE DIRECTO) ~ cMAES7'RO (from Logical View) , Password 10. Use Case MaestrolniciaSesión PASOS 1.- MAESTRO TECLEA PASWORD. 2.- MAESTRO TECLEA CLAVE DE EMPLE:ADO. 3.- SISTEMA MUESTRA PANTALLA DE ElLECClON DE EXPOSICION. 4.- MAESTRO ELIGE TIPO DE EXPOSICION. 6.- SISTEMA MUESTRA PANTALLA DEL MAESTRO. 7.- U.C. MAESTRO DA LA CLASE. 8.- MAESTRO TERMINA SESION 10.-SISTEMA VERIFICA LA HORA DE TERMINACION 11.- SISTEMA AVISA LA TERMINACION DE LA CLASE 12.- SISTEMA CIERRA LA CLASE 33 Diagrama de Estado (Use Case MaestrolniciaSesión) error de pasword o matricula digita pasword y clave d e em pledado -activa panta I I a Modelo del Dominio del problema Diagrama de Clases (Use Case MaestrolniciaSesión) 1 ~ ~~ ccurco (from Logical View) L - - , se imparte +actualiza (:la= cursos() +actualiza $:la= empleado() ' ~ C v e C U r s O@ &CEUEA áFechalnic @ QFechaFin QCveEmpleado l &Clawhorario I ~ ~~ ~ - ~~~ 11. Use Case AlumnoEntra a clase \ AlumnoEntra ALUVNO PASOS 1.- ALUMNO DlGlTA PASWORD. 2.- ALUMNO DlGlTA MATRICULA. 3,- SISTEMA VERIFICA LA HORA Y CLASE QUE PUEDE 34 TOMAR A ESA HORA. 4.- SISTEMA MUESTRA LA PANTALLA DEL CURSO. 5.- ALUMNO TECLEA DE ACEPTACION. 6.- SISTEMA MUESTRA PANTALLA DEL ALUMNO. 7.- U.C.ALUMN0 TOMA CLASE. 8.- SISTEMA TERMINA SECION. 9.- ALUMNO TERMINA CLASE 10.-ALUMNO VISUALIZA PUNTUACION AL. FINALIZAR LA 11.- SISTEMA REGRESA A LA PANTALLA PRINCIPAL Modelo de Interfaz: Layouts de pantallas 1 .- ALUMNO DlGlTA PASWORD. 35 CLASE. .. 6.- SISTEMA MUESTRA PANTALLA DEL ,ALUMNO Diagrama de Estado (Use Case AlumnoEntra a clase) D I A G R A M A D E E S T A D O DE U C A L U M N O E N T R A A C L A S E INVALID0 P A S W O R D O MATRICULA 0 , ' INICIO L - ~- v--- ECPECIFICACIOhI D E L C U R S O ~ P A S W O R D Y MATRICULA _ ~- ~- CURSO A TOMAR - V_ ~ PANTALLA ALUMNO TERMINA CLASE (a)T R E G R E S A A PANTALLA PRINCIPAL D E L ALUMNO ~ ~ PUNTUACION D E L ALUMNO _ PANTALLA DE TERMINO D E CLASE ~ VISUALIZA PUNTUACION EL A L U M N O 36 ~ ____ ~~ I Modelo del Dominio del problema Diagrama de Clases (Use Case AlumnoEnltra a clase) c P U N T U A C IO D E TA-L L E N -DEP U N f i A c ION +clave detalle num de clase *clave detalle untos obtenidos +actualiza clac e() +guarda puntoso + a c t u a l i z a p u n t o s () %mete m atricula() I nombre +actualiza m atricula() +actualiza c u r s o s () %actualiza nombre() n tom a cCURSO +clave curso @ +nombre curso +inicio de curso e9num .de clases &clave h o r a r i o &u!’0 .+CveMestro 4- 9 a c tualiz a +actualiza +actualiza +a c t u a l i z a 1 n Tiene 1 I CM I M I c DA I- +Dia 3 Dia 4 +Dia 5 1 clave() d u r a c i o n () tnic io() c u P O () +clave s e imparte +actualiza +actualiza - +Modifica c H O R A R IO horario dias() 37 hora de inicio() duraciono 12. Use Case MaestroAccesaExpediente \ MaestroAccesaExDediente MAE5TRO PASOS Maestro accesa a el historial académico de im alumno en particular. 1.-Maestro selecciona alumno de la pantalla de alumnos presentes. 2.-Maestro presiona Historial. 3.-Sistema muestra el historial del Alumno y Io despliega en una pantalla especial. 4.-El Maestro presiona el botón mostrar foto de la pantalla especial. 5.-EI sistema despliega la foto del Alumno en la pantalla especial. 6.-El Maestro presiona aceptar. 7.-El sistema deshabilita la pantalla de historial y regresa a la pantalla principal. Modelo de lnterfaz Diagrama de Estado (Use Case MaestroAccesaExpediente) o... S el e c c i o n a A l u m n o ~ntrar 1 . P a n tPri n @ Mostrar Expediente( A l u m n o ) 38 Modelo del Dominio del problema Diagrama de Clases (Use Case MaestroAccesaExpediente) cMaestro @ZÍrga apunte &forma enwo &Eleccion cAlumno I &Nombre &Nombre Maestro &Clave Maestro &Recibe-Apunte() &Revisa-Historial() ,&Consulta-Foto() &Recibe-Alumnos() &Eiige-Aiumno() &Muestra-Alumnos() ~ I &Nombre &Matricula &Promedio +O..n &Carrera &Tiempo &Clases Asignadas &Muestra-Hi storial() &Muestra-Fiito() 13. Use Case CargaEnviaComoDocumento Maestro US CargaEnviaComoDocumento PASOS: El maestro selecciona enviar un texto como Documento 1.Maestro selcciona del CheckBoxGroup 'texto' 2. El sistema activa boton 'Carga Apunte' 3. El maestro presiona botón 'Carga Apunte' 4. El sistema despliega pantalla de opción 'Enviar como documento' 5. El sistema abre pantalla de selección del destino del archivo 6. El sistema despliga pabntalla de selección de archivo 7. El maestro busca selecciona archivo cor1 texto 8. El maestro presiona 'Abrir en la pantalla (le selección 9. El sistema cierra pantallas de selccion 1O. El sistema envia el documento al destino indicado 39 11.El maestro continúa con la clase . Modelo de lnterfaz Diagrama de estados UC CargaEnviaComioDocumento J - inicio F4 selec ChBG Texto \ Cargar Apunte activo Pantalla de Sele ,J Enviar como Documento Modelo del Dominio del Problema UC CargaEnviaComoDocumento cPantallaSeIDestiii0 &Enviar directamente I1 ~ cArchivo- cSelección &Archivos @Di rectonos 1 &Unidades de disco 40 @Finanzas &Sociaologi a Q,Psicología I Modelo de Colaboración 223899 UC CargaEnviaComoDocumento 1: CargaApunte 2: SetDocumento 3: SetDestino 4: SetFuente 4 5: GetHistorial(Alumno) : Maestro oDHistor I d e l 6: Layouts de pantallas 1 . Pantalla de selección de tipo de envio 41 ExecSQL\ L 2. Pantalla de selecci6n de destino de envío 14. UC CargaEnviaDirectamente NewClass US CargaEnviaDirectamente PASOS 1. Maestro selcciona del CheckBoxGroup 'texto' 2. El sistema activa boton 'Carga Apunte' 3. El maestro presiona botón 'Carga Apunte' 4. El sistema despliega pantalla con opción 'Enviar Directamente' 5. El Sistema despliega pantalla de selccion de archivo 6. El maestro busca y selecciona archivo con texto a enviar 7. El sistema cierra pantalla de seleccion 8. El sistema despliega el documento en el #areade texto 9. El maestro continúa con la clase 42 Modelo de Interfaz Diagrama de Estado UC CargaEnviaDirectamente Inicio Selec ChBG Texto Pantalla del Maestro Cargar Apunte activo Cancel Cargar Apunte Modelo del Dominio del Problema UC Carga Env iaDirectamente cMaestro &Nom breMaestro &D irectamente %Password I 1 %Di rectorios 43 Modelo de Colaboracion UC CargaEnviaDirectamente 3: Se1 de otro archivo -+ n 1: CargaApunte 2: SelArchivo / \ 4: Abre archivoTxt(archivo) : (Maestro) : GetArchivoTxt(archivo) \1 6: Exec SQL LAYOUTS DE PANTALLAS 1. Pantalla de Selección de tipo de envío 44 + J nuilnuii chat chucho hello-lava Hellolava Maequee prueba $ J P-ElegirEnvio 3 PMaestro-PreguntasPredefinidas 3 Hellolwa Helldava "him 9 CuadioDialogo 33 e E4 suw chuchow ChatE DCervlet Chat: ervlet ErrAliimnoNoSei 4 maestro uP- &% EnviaResum I p-Pantatiacarg Q PMaestro PMaestro-Abo /@ PMaestro-Preg @ PMaestro-Preg Administracion Bombre de archivo. xipo de euchwos 2. Pantalla de selección de archivo a enviar 15. USE CASE CARGAENVIAIMAGEN. PASOS A UC CargaEnialmagen Maestro (EN LA PANTALLA DEL MAESTRO, SELECCIONAN UN ICONO) 1 . Maestro selecciona del checkBoxGroup 'Imagen' 2. El sistema activa botón 'Carga Imagen' 3. El maestro presiona botón 'Carga Imageri' 4. El sistema despliega pantalla 'Clmagenea' 5. Maestro presiona 'Abrir Imagen' 6. El sistema despliega pantalla de selección de archivos 7. El maestro busca y selecciona archivo caln Imagen (*.gif, *.jpg, *.jpeg, *.bmp, etc ...) 8. Maestro presiona botón 'Abrir' de la pantalla de selección 9. El sistema muestra la imagen en un recuadro I O . Maestro presiona botón 'Enviar Imagen' 11. Sistema desaparece pantalla Cimagenes 12. El sistema coloca la imagen en el recuadro del pizarrón 13 El maestro continua la clase en la pantalla de maestro 45 Modelo de lnterfaz Diagrama de Estado(Use Case CargaEnvialmagen) Presiona Cargar Imagen Selec ChBG Imagen Abrir Imagen w Selec de Archivos Fin de Clase Selec de Otra Imagen Presiona Abrir P Visualiza Imagen i Presiona Enviar Imagen Continua Clase Pantalla del Maestro con Imagen Diagrama de Coiaboracion Clicklmagen > 2 ClickCargalmagen 3 AbnrArc.hivo > 9 5 Getlmagen(Nombre1mg) 4 Abrelmg(Nombre1mg) 9: EnUarlmci(1magen) w IO. ReqresaPMaestro 46 -> Diagrama de Secuencia Modelo del Dominio del problema Diagrama de Clases (Use Case CargaEnvialmagen) Layouts de pantallas (Use Case CargaEnvialmagen): &Nom breMaestro maestro &Password &EspacioP Imagen I..* +EnvialrnqO P&C\R 4 r cseieccion rchims Irectorios cArchiw I ' 47 16. Use Case Alumno Pregunta / \ ALUMNO a AlurnnoPre unta 4 PASOS 1.-Alumno teclea pregunta y presiona enviar. 2.-Sistema lleva pregunta a maestro. Modelo de lnterfaz Diagrama de Estado(Use Case Alumno Pregunta) Alumno teclea pregunta y la env'ia 0 1' INICIO ~ (' - c-- Pantalla Alumno I Layouts de pantallas(Use Case Alumno Pregunta) 17. Use Case Modificarlmágen 1 Modificarlmágen MAESTRO 49 PASOS 1.-Maestro presiona modificar imágen. 2.-Sistema trae componentes de dibujo. 3.-Maestro modifica imágen. 4.-Maestro presiona salir de los componentes de la paleta( dejar de dibujar). Modelo de lnterfaz Diagrama de Estado(Use Case Modificarlmágen) Modificar imágen - INICIO Pantalla Pnncipai A - ~ ~~ ~~ -~ < ~-_ _ , Fin de modificación Modelo del Dominio del problema Diagrama de Clases (Use Case Modificarlimagen) CIWI agen 50 -A! ~ Herramientas para modificar imiien -~ 7---- ANEX03: Modelo de Diseño (Diagramas de Secuencia) 1. (Use Case Maestro Pregunta Abierta) maestro pregunta abierta oPantPrin ' \ MAESTRO > Presiona - 3 habiiitar(PregAbierta) > - Presiona -~ 3 - J > oArea < %Texto - - envia(Preg ' Servidor envia(PregAbierta.Pregunta) _1 poCii?,a recibeSolicitudes I 1 -_ ~ - 1 &Texto recibe ~ Selecciona - ->r OC Servidor avisa(Alurnno) -> p~ I I oCServida recibe OCSkidci difuide OCTextorecibe f ~- 51 - ~ 1 '< - - 2. (Use Case Maestro Califica Respuesta) Q : MAESTRO I oPÁreaTexto : 1 II cPMAreaTexto I -- Y oArea +I xto.procesaca oCCali i ación.guardaC2 ) Alumno D.guardaCalif(S1 ZL2 3 1 2. (Use Case Termina Selección Prgunta Abierta) P\ : MAESTRO r OP Cancelar: Selecciona CanLelar (Terminar) ' Elimina Manos Alzadas Exec SQL I 1 , I Sin Manos a los alumnos u-- Terminar Modificación 1A I I !I U ' I I I I I I 1 (Use Case Maestro Pregunta Directa) A MAESTRO oPantPrin c P a n t Prin 'rr] Presentes c cPMAreaTe U C Maestro Califica ~~ n- r-1 oCTexto c CTexto oCSeNidor c CServidor c d - o P A Iu m Present es I Iurn i n a (A Iurn n c ) I Selecciona I >O l e s i o n a P r e g u n t a Directa 0-1 I oPAreaTexto habilita I ' u Teclea Pregunta o P Á re alT ex t o . pro ce saT xt ' ~ -1 f exto e n via (P reg Dir A Iu rn n o .Preg u n t a ) 7u rn o CS e rvid o r e n via (P reg D i r A I n o P re g ) U I I nI o C S e w i d o r corn T irn e r() la OCSeNidOr recibeRespuesta(PregDir Alurnno.Respuesta 0'7 I o Ctrl C h a t d ifu n de(Alurn n o Re spuesta) I o CT exto re c i b e Re sp (A Iu m n o x s p u e s/a ) I o- O Califica - o P AreaT e Kto d esp IIe g a Re sp (A Iurn n o , Respuesta) >--=c 7 I 3. (Use Case Maestro Contesta Directamente) oPantPrin . 1 oPÁre!a Preguntas F oCTexto OPÁreaTexto oCServidor Sen'; IoPArea Selec Pres¡< -oPÁrea Teclea -A OPP Texto.proceca -c oCTexto.envia CServifdor.difundi 1 i'5 5. (Use Case ContestaConPredeterminatla) maestro contesta con predeterminada 1 oF'AreaTexto oPÁrea Preguntas c MAESTRO , oPCuad ro Opciones ZMAreaTexto - ~ ' ' oCTexto oCServidor - ~~~ > Señal Seleccion Presiona > > < A oPÁrea Presiona Cargar > > oPCuad ro oPCuadro -1 Se Iecci on a < > A oPÁrea < oCiexto envia(Alumno,Pregunta,Respues , ~~ ~~~ __ 1 ~~ -> oCSetvidor difunde I] ~ I4- < < < 56 -~ 4. (Use Case AlumnoRespondePregunitaDirecta) :ALUMNO Alumno Teclea Respuesta y presiona enviar T II RespLiesta es llevada al 1 %ensaje Recibido o Calificación I Show " , Terminar de Responder U ' U u n' U 5. I (Use Case AlumnoRespondePregun'taAbierta) A : ALUMNO 1 =I oPSolicitudParticipación: cCFinal --T -- Solicitud \ u r; Teclea Respuesta a Preg.y preciona I1 Teminar de \ / ' I J \ I ' L U 57 (Use Case AlumnoRespondePreguntaAbierta) 6. II O ' oPSolicitudParticipación : cPSolicitudParticipación I-- oCServidor : cCSeNidor Mensaje en el area de texto : oCFinal : cCFinal Selecciona Solicitud de Solicitud n /I >ii U Show Respuesta a la , n \ I Terminar (No se otorgo (el derecho a U' 58 7. (Use Case Maestro entra a dar clase) - : MAESTRO oPinicia clase : oPMuetraüatos oVOpciones -- digita pasword y clave be ernWamX2g > ocontoi:~ oPPantalla OBD:CDBMS control -__ UCTIPODE EXPOSICION ~ I oC.TraeDbtosProfeso(Cv&impleado) > 1 Exe SQL > show(Datos del empleado) > , I pdsa , - > Show(Pantal1alylrlestro con pantalia de opciones) > iiecciona opcion I > > I 1 1 - I digita tdmina i : ' &.verifica h m l d e tenninacibn I - &.Trae - _ _ I --> 1 Exe SQL show(pantal1a de > I fin de clase I 59 >; > (Use Case Maestro Expone Directo) 8. ji- maestro expone directo ~ Selecciona expone predeterminado > Traepantallla(maestro) Exe SQL > show(pantal1a del maestro) > selecciona boton de texto -> actim el area de texto - -> ~~ show cursor en area de texto 31' escribe + enwar - :> ~ p enviardatos , -->/, 1-1 I I 60 IEvia al senidor 1 > (Use Case Alumno Entra a clase) 9. 225899 Exe SQLO I I + trae pantalla alumno - ~~ ~ r 1 I &oMpantalla alumno) I > I tomadas 1 ~ - - I - -- - terninadace - I + > I I I I I I I I I I I I 1 trae puntuacion 1 I > I I Exe SQLO ---__ I 21 ~ enviar puntuacion i 3 - d how(puntuaaon del alumno) aceptar - 3 , j i I -- -- I I trae pantalla pnncipai ~1 - ---> I I Exe SOLO ~ -- how( pantiilla pnnapal alumno) I -~ -3 I I 61 > I O . (Use Case Alumno Pregunta) O A :ALUMNO 1- - Respuesta : c Teclea Pregunta ;presiona \ , 1 - oCSemidor : c oPPre .Alumno ii enviar' Pregunta es llemda al servidor n. Show Mensaje de recibida o respuesta iY--+lI Terminar de Preguntar U 1 I 1 3 1 I 62 I 11. (Use Case Modifica Imagein) / - - ~ - ' oPSelecc Modificlmá en : I __ _ - Imáqen : c ~ Selecciona Modificar Imágen - oPModific - ~- oC?omDonentesDibuio : c CCom onentesDibu'o ~ L--I ~ OBD : cDBMS , > 3- Dibujo Show IComponentes dd Dibujd -7 -~ Modificar Imágen 1 --y Terminar Modificación - ' -+ -I 63 *- OC Final : cCFinal - 15. (Use Case Carga Envia corno Documento) oiSel Doamento SeiFuente I I I 3 ______y1 I 64 (Use Case Carga Envia Directamente) 16. j 1 - 1 x. : (Maestro) Documento C a rgaA punte -n U - Selhchivo -1 J T Se1de otro archivo 1 -I 1 U 17. (Use Case Carga Envia Imagen) 1 /’ \ 1 OlPantalla PMaestro Chcklrnagen OlPantallalmg I ClickCargalmagen I I > AbrirArchim > Abrelmg(NornbrIlrng) + I GetImagen(Nornbrelrng) > I ExecSQL --- I Regresalrng ~ _ ,<< Pasalrng 1 ->r - I ->. RegresaPMaestro - -> 4.2.4 Modelo de Construcción. El modelo de construcción es en gran parte el diagrama de secuencia, pero con las relaciones que tiene con respecto a la codificación, este modelo de construcción representa en gran parte la codificación que se realizo en la implantación del sistema. 4.2.4.1 Introducción. para obtener el modelo de construcción se tiene que tomar el modelo de análisis dinámico para generar un modelo de diseñlo que contemple aspectos de implantación y aspectos de implantación y aspectos de calidad, posteriormente se toma el modelo de diseño como entrada para la obtención del inodelo de construcción. Modelo de Construcción A continuación se presenta la codificación que nos da en gran parte el modelo de construcción esta ,codificación es la origiinal que nos presenta los Servlets, Applets, paginas y codificación mas importante con respecto al proyecto de Educación a Distancia. import java.awt.*; import java. awt .event .*; import com.sun.java. swing.*; import borland.jbcl.layout.*; import java.net.*; import java.io.*; import java.util.*; import borland.jbcl.control.*; import borland.jbcl.control.lmageControl; public class PMaestro extends JFrame implements Runnable{ private stat ic f ina I String S ERVLET-PATH ="/servlet/c hat. ChatServlet" ; private static final String servletURL="http://lis-server01:8080"; volatile private boolean bEntro; //Pendiente de capturar. String cveMaestro="l "; String cveUEA=" 1 URL chatURL; URLConnection conexion; String usuario='lmaestro'l; boolean bRespondePreg=false; Thread HiloColector; //Construct the f rame JMenuBar menuBarl = new JMenuBar(); JMenu menuFile = new JMenu(); JMenultem menuFileExit = new JMeriultem(); JMenu menuHelp = new JMenu(); JMenultem menuHelpAbout = new JMenultem(); JLabel statusBar = new JLabel(); XYLayout xYLayoutl = new XYLayoLitO; TextArea txtaAreaTexto = new TextAreaO; 'I; List IistaUsuarios = new List(); Button btnEnviar = new Button(); Button btnCargar = new Button(); List listapreguntas = new List(); CheckboxGroup chkboxglmgTxt = niew CheckboxGroup(); Checkbox chkboxlmg=new Checkbalx("1mágen",chkboxglmgTxt ,false); Checkbox chkboxTxt=new Checkbo:c("Texto",chkboxglmgTxt,true); Button btnResponder = new Button(); Label IblAreatexto = new Label(); Label IblListaAlumnos = new Label(); Label IblListaPreguntas = new Label(); TextArea Area2= new TextAreaO; Textcontrol textControl1 = new TextCoritrol(); Stringlnput stringlnputl = new Stringlnput(); Button BGuardar = new Button(); ButtonControl btnCargarHis = new ButtonControl(); List Lista2 = new List(); Panel panel1 = new Panel(); ImageControl imageControl1 = new ImageControl(); ImageControl imageControl3 = new ImageControl(); ImageControl imageControl2 = new ImageControl(); ImageControl imayeControl4 = new ImageControl(); /*inicia pantalla del maestro*/ public PMaestroO { enableEvents(AWEvent. WINDOW-EVENT-MASK); try { 1 iniciaHilo(); jbinit(); entrar();// Funcion de entrada en el servidor catch (Exception e) { e. printStac kTrace() ; 1 1 /*Este metodo controla los procesos (hilos) dado un cierto tiempo*/ public void run(){ w hiI e(true){ try{ //Funciones leidas del servlet . colectaF'reguntas(); colectaLista(); HiloColector.sleep(100); 1 catch(1nterruptedException e){ e.prints1ackTrace() ; 1 t5 8 /*muestra los los componentes del area del maestro*/ public static void main(String args[]){ PMaestro pantalla=new PMaestro(); pantalla.show(); 1 //Component initialization /**inicio de jbinit*/ private void jbinit() throws Exception { this.getContentPane().setLayout(xYLayoutl); this.getContentPane().setBackground(newColor(l29, 181, 172)); this.setSize(new Dimension(759, 589)); this.addWindowListener(newjava.awt.event. WindowAdapter() { public void windowClosed(WindowEvent e) { t hi s w indowCIosed(e) ; 1 1); this.setTitle("Maestro"); statusBar.setText(" "); xY Layout1.setHeight(727); txtaAreaTexto.setBackground(Color.white); btnEnviar.setBackground(new Color(201, 255, 232)); btnEnviar.setLabel("Enviar"); bt nEnviar.addActionListener(newjava. awt .event.ActionListener() { public void actionPerformed(ActionEvente) { btnEnviar-actio nPerformed(e) ; 1); ? btnCargar.setBackground(newColor(201, 255, 232)); btnCargar.setLabel("Cargar"); btnCargar.addActionL¡stener(new java.awt.event.ActionListener(){ public void actionPerformed(ActionEvent e) { btncargar-actionPerformed(e); 1); 1 btnResponder.setBackground(newColor(201, 255, 232)); btnResponder.setLabeI("Responder"); btnResponder.addActionListener(newjava.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { btnResponder-'actionPerformed(e); 1); IblAreatexto.setText(" Area de Texto"); lblListaAlumnos.setText(" Lista de Alumnos Presentes"); IblListaPreguntas.setText("Lis1:a de Preguntas"); Area2.~etEditable(faIse); Area2.setFont(new Font("SansSerif', 3, 12)); 69 Area2.~etBackground(newColor( 178, 255, 255)); textcontrol 1.setText(" Texto Eviado"); BGuardar.setBackground(new Color(201, 255, 232)); BGuardar.set Label("Guardar") ; btnCargarHis.setBackgroundl(newColor(201, 255, 232)); btnCargarHis.setLabeI("HistoriaI"); imageCont rol 1.setImageNams("\\\\Lisserver0 1\\csh\\EducDistancia\\Profesor.gif imageControl3.~etlmageName("\\\\Lisserver01\\csh\\EducDistancia\\libro2.gif'); imageControl4.setlmageName("\\\\Lisserver01\\csh\\EducDistancia\\Bajalnf.gif btnCargarHis.addActionListerier(newjava.awt.event.ActionListener() { public void actionPerformed(ActionEvente) { bt nCarga rHis--actio nPerformed(e,Lista2) ; I); I); 1); 1 BGuardar.addMouseListener(newjava.awt.event.MouseAdapterO { public void mouseClicked(MouseEvent e) { BGuardar-moLiseClicked(e); 1); 1 xYLayoutl .setWidth(lO36); menuFile.setText("File"); menuFileExit.setText("Exit"); menuFileExit.addActionListener(newActionListener() { public void actionPerfcrmed(ActionEvent e) { fileExit-actionPerformed(e); 1); 1 menuHe1p.setText ("Help") ; menuHelpAbout .setText("About"); menuHelpAbout.addActionListener(newActionListener() { public void actionPerformed(ActionEvente) { helpAbout-actionPerformed(e); 1); 1 menuFile.add(menuFileExit); menuHelp.add(menuHelpAbout); menuBar 1.add(me nuFile) ; menuBar 1.add(me nuHeIp) ; this.setJMenuBar(menuBar1); this.getContentPane().add(staitusBar,new XYConstraints(307, 650, 751, - 1>); 166)); this.getContentPane().add(txtaAreaTexto, new XYConstraints(20, 220, 498, this.getContentPane().add(listaUsuarios, new XYConstraints(642, 32, 235, 328)); '70 this.getContentPane().add(btnEnviar, new XYConstraints(37, 612, 123, this.getContentPane().add(btinCargar, new XYConstraints(198, 612, 77, this.getContentPane().add(chkboxlmg, new XYConstraints(43, 572, 113, this.getContentPane().add(chkboxTxt,new XYConstraints(43, 548, 113, this.getContentPane().add(listaPreguntas,new XYConstraints(645, 425, this.getContentPane().add(btiiResponder,new XYConstraints(785, 646, this.getContentPane().add(lblAreatexto,new XYConstraints(162, 196, 139, this.getContentPane().add(lblListaAlumnos,new XYConstraints(676,9,181, this.getContentPane().add(lblListaPreguntas,new XYConstraints(780,405, thi~.getContentPane().add(Area2, new XYConstraints(22,34,502, 158)); this.getContentPane().add(te,ctControll , new XYConstraints(189, 9, 129, this.getContentPane().add(BC;uardar, new XYConstraints(533,35,72,28)); this.getContentPane().add(btriCargarHis,new XYConstraints(900,35, 105, this.getContentPane().add(panell, new XYConstraints(743,53,42,37)); this.getContentPane().add(imageControll , new XYConstraints(919,86, 64, 85)); new XYConstraints(101, 648, 31,47)); new XYConstraints(214, 648, 37,47)); 1 /*finde jbinit*/ /*iniciode funciones para jbinit*/ protected void iniciaHilo(){ int prioridadActual=Thread.currentThread().getPriority(); int prioridadNueva=prioridadActual==Thread.MIN-PRIORITY?Thread.M IN-PRIORITY:priorid adActual-I; HiloColector=new Thread(thic,"AplicacionColectora"); HiloColector.setDaemon(true); HiloColector.setPriority(prioridadNueva); HiloColector.start(); p("lniciandocolección..."); 1 //FileI Exit action performed public void fileExit-actionPerformed(ActionEvente){ if( HiloColector!=nuli&&HiloColector.isAlive()){ '7 1 HiloColector.stop(); ///cuando cierra el chat se destruye el hilo colector 1 abandonar(); HiloColector=null; System.exit(0); HiloColector.destroy(); 1 //Conexion al chat especifico protected void entrar() throws MalformedURLException{ chatURL=new URL(servletUF1L); usuario=" maest ro"; String queryString=SERVLET-PATH+"?modo=nuevo_usuario&usuario="+URLEncoder.encode( usuario) ; p("Tratando de entrar."); try{ conexion=(new URL(chatURL,queryString)).openConnection(); conexion.setDefaultUseCaches(false); conexion.setUseCaches(false); conexion.setDolnput(true);//Flujo de Entrada conexion.setDoOutput(false); conexion.connect(); p("Rea1izando conexion con"+conexiori); BufferedReader in =new BufferedReader(new InputStreamReader(conexion.getlnputStrearn())); String respuesta=in.readLine(); if( respuesta.startsWith("+")){ //Detecta si se pudo conectar setEntro(true); p("Entro corno: "+usuario); repaint () ; 1 else{ p("Error al intentar conectarse: "+respuesta); System.exit(0); 1 1 catch(Ma1formedURLException e){ p("Error en URL:"); System.err. printIn(e); e.printStackTrace(System.err); 1 catch(l0Exception e2){ p("Error IO al intentar conexion"); System.err.println(e2); e2. printStackTrace(Syctem.err); I '72 protected void setEntro(boo1ean set)#[ bEntro=set; 1 protected boolean yaEntro(){ return bEntro; 1 /*metodo que elimina a un alumno de la clase*/ protected void abandonar() { if (!yaEntro() 11 usuario == null) return; String querystring + SE RVLET-PATH "?modo=borra-usuario&usuario="+URLEncider.encode(usuario); try { conexion = (new URL(chatURL,queryString)).openConnection(); conexion.set UseCaches(fa1se); conexion.setDolnput(tiwe); conexion.setDo0utput (false); conexion.connect (); BufferedReader in new BufferedReader( new InputStreamReader(conexion.getlnputStreaim())); String respuesta = in.readLine(); if (respuesta.startsWith("+")) { setEntro(fa1se); p("Usuario + usuario + ha salido del chat"); I' else { I' 1 1 p("Error al salir" + respuesta); Systerri.err.println("Error al salir" +respuesta); in.close(); } catch (MalformedURLException e2) { System.err. priritln(e2); e2.printStackTiace(System.err); p("Error al intentar salir"); } catch (IOException e l ) { System.err.priritln(e1); e 1.printst ac kTrace(System.err); p("Error al salir"); 1 1 /*metodo enviar, envia a todos losalumnos los mansajes que el maestro escribe en el area de texto*/ protected void enviar() { String mensaje; String nulo; int inicio; int fin; //asignaciones mensaje= txtaAreaTexto.getSelectedText(); inicio=txtaAreaTexto.getSelectionStart(); 73 fin=txtaAreaTexto.getSelectionEnd(); if (mensaje.equaIs("l')) { mensaje = txtaAreaTexto.getText(); if (mensaje.equals("":)) return; 225899 1 I p("Enviand0 mensaje."); //realiza la conexion para enviar mensajes try { conexion=null; conexion (new URL(chatURL,SERVLET-PATH)).openConriection(); conexion.setUaeCaches(false);//Para este conexion.setDefaultUseCaches(false); conexion.setDolnput(true); //Manda objetos con el metodo POST conexion.setDoOutput(true); conexion.setRequestProperty("ContentType","application/octet-stream"); Outputstream im=conexion.getOutputStream(); ObjectOutputStream out=new ObjectOutputStream(/*conexion.getOutputStream()*/os);//Envia losobjetos out.writeObject(mensaje); out.flush(); = new BufferedReader(new BufferedReader in InputStreamReader(conexion.getlnputStream())); String response = in.readLine(); if (response.startsWith("+")) {//Acepto el mensaje if(inicio!=fin) //si hay algo seleccionado en el area de texto para enviar txtaAreaTexto.replaceText("",inicio,fin) ; else txtaAreaTexto.setText(""); //AREA DE TEXTO1 p("Mensaje enviado"); Area2. append("\n"); Area2.append(meiisaje); else { p("Error al enviar mensaje'' + response); 1 in.close(); out.close(); bRespondePreg=false; } catch (MalformedURLException e2) { p("Error al enviar mensaje"); //System .err.println(e2); e2.printStackTi-ace(System.err); } catch (IOException e l ) { 74 1 1 p("Error al enviar mensaje IO"); //System.err. print In(e 1) ; e l .printStackTrace(System.err); /*metodo donde el maestro recibe informacion del servidor*/ protected void colectaPreguntas() { String querystring SERVLET-PATH + "?modo=colecta&usuario="+URLEncoder.er~code(usuario); try { BufferedReader in = new BufferedReader(new InputStreamReader(new URL(chatURL,queiyString).openStream())); String nextLine = in.readLine(); if (!nextLine.startsWith("+")) { //Si acepto la peticion de preguntas p("Error obteniendo mensajes del servidor"); return; 1 nextLine = in.readLine(); if (nextLine!=nuII){ p("usuarios colectados"); while (iiextLine != null && !nextLine.equals(".")) { //Recibe Preguntas 1 1 System.err.println(nextLine); listaPreguntas.addltem(nextLine); repaint(); riextline = in.readLine(); else p("ningun usuario"); in.close(); } catch (IOException e) { System.err.println(e); e.printStackTrace(System.err); p("Error al checar el mensaje"); 1 //Pregunta por la lista de usuarios protected void colectalista() { String querystring = SERVLET-PATH + "?modo=lista"; Vector usuarios = new Vector(); try { System.out.println("chatURL: + chatURL); System.out.println("queryString:" + querystring); URL IistaURL = new LlRL(chatURL,queryString); System.out.printIn("list aURL: + I istaURL); URLConnection listacon = listaURL.openConnection(); listaCon.setDefaultUseCaches(false); listaCon.setUseCaches(false); I' 75 listacon .connect(); BufferedReader in new BufferedReader(new InputStreamReader(listaCon.getl nputStrearri())); String sigLinea = in.readLine(); if (!sigLinea.startsWith("+")){ //acepto la peticion de lista del p("Error obteniendo lista de usuarios servidor"+sigLinea); return; 1 sigLinea = in.readLine(); while (sigLinea != null && !sigLinea.equals(".")) { //Recolecta lista p("Leyendo usuario: "+sigLinea); usuarios. addEleme nt (sigLinea); sigLinea = in.readLine(); 1 if (!usuarios.isEmpty())l { //Hay usuarios IistaUsuarios. removeAll() ; int size = usuarios.size(); for (int i = O; i < size; i++) { listaUsuarios.addltem((String)usuarios.elemen~t(i)); 1 1 else { 1 IistaUsuarios.removeAll(); listaUcuarios.addItem("Ningunusuario dentro"); repaint(); in.close(); } catch (IOException e) { System.err.priritln(e); e.printStackTraice(System.err); p("Error al obtener Iista"+e); ///////////////// //Overriden so we can exit on System Close protected void processWindowEvent(WindowEvente) { super. processWindowEvent(e); if (e.getlD() == WindowEventWINDOW-CLOSING) { file Exit-act ionPerformed(null); 1 1 /*manda mensajes a la consola*/ protected void p(String mensaje){ System.out. println(mensaje); 1 76 protected void abreCargaTxt(){ Frame f=new Frame(); String linea; String archivo; FileDialog fd = new FileDialog(f,"ABRIR ARCHIVO"); fd.show(); archivo= fd.getDirectory()+fd.getFile(); try{ FilelnputStrearn is = new FilelnputStream(archivo); BufferedReader ds =new BufferedReader(new InputStreamReader( is)); while ((linea=ds.readLine())!= null) { txtaAreeTexto.append(linea); txtaAreaTexto. append("\n"); I I ds.close(); catch(l0Exception e){ System.out.println("ERR0R DE ARCHIVO:" + e); I I protected void abreCargalmagen(){} protected void abreCargaRespuesta(){ new PMaestro-PreguntasPredefinidas dlg PMaestro_PreguntasPredefinidas(this,SER\/LET_PATH,servletURL,txtaAreaTexto,cveMa estro,cveUEA); Dimension dlgSize = dlg.getPreferredSize(); Dimension frmSize = getsize(); Point loc = getlocation(); dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height dlgSize.height) / 2 + 10c.y); dlg.setModal(true); dlg.show(); void btnEnviar-actionPerformed(ActionEvente) { imageControl4.setVisi ble(fa1se); // imageControl5.setVisible(false); imageControl3.setVisible(false); enviar(); I void btncargar-actionPerformed(ActionEvente) { String Ibl=chkboxgImgTxt.getSelectedCheckbox().getLabel(); if( bRespondePreg==false){ if(I bl.equaIs("Texto")) abreCargaTxt(); 77 I 1 else abrecargalmageno; else abreCargaRespuesta0; void btnResponder-actionPerformed(A3ionEvent e) { String pregunta=null; pregunta=listaPreguntas.getSelectedltem(); p("Select"); if(pregunta==null) errorPregNoselec(); else{ t xt aA reaTexto.setText("") ; txtaAreaTexto.append("\nPREGUNTA DE "+pregunta+"\n"); 1 /////////l/lllllll*q ui t ar cuando sea el bRespondePreg=true; verdadero*/ } void BGuardar-mouseClicked(MouseEvent e) { GuardaTxtO; 1 void btnCargarHis-actionPerformed(ActionEvent e,List Lista2) { String nombre=nuII; nombre =listaUsuarios.getSelectedltem(); System.out.println(nombre); if (nombre == null) error-Alumno-No-Selec(); // aqui madar nombre al sewlet para que busque en la base else // de datos y llene una IistaUsuarios o un vector para mandarlo /I al cuadro de dialogo que Io mostrara en el area de texto I / de este mismo. falta otro metodo de recepcion de datos //recibe la imformacion del servelt paira la consulta MuestraHistorial(nombre,L~ste2); /*guarda en un archivo lo que se le ha enviado a los laumnos*/ protected void GuardaTxt(){ Frame f=new Frame(); String linea; String archivo; 78 FileDialog fd new ARCH IVO",FileDialog.SAVE); fd .show(); archivo= fd.getDirectoiy()+fd.getFile(); GUARDAR FileDialog(f,"GUARDAR //CAMBIAR PARA linea=Area2.getText(); try{ FileOutputStream os = new FileOutputStream(archivo); DataOutputStream ods=new DataOutputStream(0s); ods.writeUTF(Iiinea); ods.close(); 1 catch(l0Exception e){ System.out.println("EIRROR DE escritura ARCHIVO:" + e); 1 /*aqui recibo la cadena con la imforniacion para desplegar //quitar en el area de texto*/ //Help IAbout action performed public void helpAbout-actionPerformisd(ActionEvent e) { PMaestro-AboutBox dlg = new PMaestro-AboutBox(this); Dimension dlgSize = dlg.getPi.eferredSize(); Dimension frmSize = getsize(); Point loc = getlocation(); dlg.setLocation((frmSize.width- dlgSize.width) / 2 + loc.x, (frmSize.height dlgSize.height) / 2 + 10c.y); d Ig.setModaI(true) ; dlg.show(); 1 /*manda llamar la clase PMaestro-PregNoSelec para crear un cuadro de dialogo*/ protected void errorPregNoSelec(){ PMaestro-PregNoSelec dlg = new PMaestro-PregNoSelec(this); Dimension dlgSize = dlg.getPreferredSize(); Dimension frmSize = getsize(); Point loc = getlocation(); dlg.setLocation((frmSize,width- dlgSize.width) / 2 + loc.x, (frmSize.height dlgSize.height) / 2 + 10c.y); dIg.set ModaI (true) ; dlg.show(); protected void MuestraHistoríal(String nombre,List Lista2) { /**cambiar**/ 79 CuadroDialogo d = new CuadroDialogo(this,nombre,Lista2); Dimension dlgSize = d.getPreferredSize(); Dimension frmSize = getsize(); Point loc = getlocation(); d.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height dlgSize.height) / 2 + 10c.y); d.setModal(true); d.show(); - 1 protected void error-Alumno-No-Selec(){ ErrAlumnoNoSel dlg-error= new ErrAlumnoNoSel(this); Dimension dlgSize =dig-error.getPreferredSize(); Dimension frmSize = getsize(); Point loc = getlocation(); dlg-error.setLocation((frmSize.width- dlgSize.width) / 2 + loc.x, (frmSize. height dlgSize.height) / 2 + 10c.y); dig-error.setModal(true); d Ig-e rror.show(); 1 void thiswindowClosed(WindowEvent e) { if(HiloColector!=null&&HiloColector.~sAlive()){ HiloColector.stop(); ///cuando cierra el chat se destruye el hilo colector 1 HiloColector=null; abandonar(); System.exit (O) ; //HiloColector.destroy(); 1 }/*de todo*/ import java. awt .*; import java.awt.event.*; import java.util.*; import java. net.*; import java. net. URL.*; import java. io.*; import com.sun.java.swing.*; import com .sun.java. swi ng.border.*; public class PMaestro-PreguntasPredefinidas extends Dialog implements ActionListener{ String SERVLET-PATH; JPanel panel1 = new JPanelO; JPanel panel2 = new JPanel(); 80 JPanel insetspanell = new JPanel(); JPanel insetsPanel2 = new JPanelO; JPanel insetsPanel3 = new JPanelO; JButton button1 = new JButton(); JLabel imageControl1 = new JLabel(); lmagelcon imagelcon; JLabel label2 = new JLabelO; BorderLayout borderLayout2 = new E3orderLayoutO; FlowLayout flowLayoutl = new FlowLayout(); FlowLayout flowlayout2 = new FlowLayout(); GridLayout gridLayout1 = new GridLayoutO; String product = "Error."; String version = String copyright = "Pregunta no seleccionada"; String comments = "Reintentar"; List IstPreguntas = new List(); TextArea txtaRespuesta = new TextArea(); TextArea txtaPadre=new TextAreaO; String cveMaestro; String cveUEA; Vector pregs; String servletUFiL; Ctrl Preguntas ct rlPregs; Button btnAceptar = new Button(); Button btncancelar = new Button(); Button btnCargarResp = new Button(); Label IblPregs = new Label(); Label IblResp = new Label(); 'I1'; public PMaestro-PreguntasPredefinidas(Frame parent, String SERVLET-PATH,String urlBase,TextArea padre,String cveMaestro,String cveUEA) { super(parent); this.cveMaestro=cveMaestro; this. cveUEA=cveUEA; this. SE RVLET-PATH=S ERVLET-PATH ; this. servlet URL=servletURL; this.txtaPadre=padre; enableEvents(AVVTEvent.WlbJDOW_EVENT_MASK); try { jblnit(); ctrlPregs=new CtrlPreguntas(SERVLET-PATH,servletURL,cveMaestro,cveUEA); cargapregso; 1 1 catch (Exception e) { e. printStackTrace(); } //imageControll .setlcon(imagelcon); pack0; 81 private void jblnit() throws Exception { //¡magelcon = new Imagelcon(getClass().getResource("your image name goes here")); this.setTitle("About"); setResizable(fa1se); panel1.setLayout(null); panel2.setLayout(borderLayout2); insetspanell .setLayout(flowL;ayoutl); insetsPanel2.setLayout(flowLiayoutl); insetsPanel2.~etBorder(new EEmptyBorder(1O, 1O, 1O, 1O)); gridLayout1setRows(4); gridLayout1.setColumns(l); istPreguntas.setBounds(newIRectangle(29, 93, 213, 303)); txtaRespuesta.setBounds(ne\iv Rectangle(374, 93, 365, 300)); btnAceptar.setBounds(new Rectangle(470, 419, 184, 43)); btnAce ptar .set Label("Aceptar'l); btnAceptar.addActionListener(newjava.awt.event.ActionListener() { public void actionPerformed(ActionEvente) { btnAceptar-actionPetformed(e); 1); 1 btnCancelar.setBounds(newFZectangle(86, 425, 93, 33)); btnCancelar.setLabel("Cancelar"); btnCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvente) { bt nCance lar-ac:t io nPerformed(e) ; 1 1); J btnCargarResp.setBounds(newRectangle(254, 203, 112, 36)); btnCargarResp.setLabel("Cargar Respuesta"); btnCargarResp.addActionListener(newjava.awt.event.ActionListener() { public void actionPerformed(ActionEvente) { btnCargarResp.-actionPerformed(e); 1); 1 IblPregs.setBounds(new Rectangle(95, 62, 61, 24)); IblPregs.setText("Preguntas"); IblResp.setBounds(new Rectangle(539, 68, 70, 24)); IblResp.setText("Respuesta"); label2.setText(version); insetsPanei3.setLayout(gridLayout1); insetsPanel3.~etBorder(new EmptyBorder(1O, 60, 1O, 1O)); button 1.setText("OK"); button 1.addActionListener(th¡s); insetsPanel2.add(imageControl?, null); 112 I panel2.add(insetsPane12,BorderLayout.WEST); this.add(panel1, null); insetsPanel3.add(labe12, null:); panell .add(btnAceptar, null); panell .add(btnCancelar, null;); panel 1.add(btnCargarResp, riull); panell .add(lblPregs, null); panell .add(lblResp, null); panell .add(lstPreguntas, null); panell .add(txtaRespuesta, null); panel2.add(insetsPane13,6orderLayout.CENTER); panell .add(insetsPanell, null); insetsPanel1.add(buttonl , null); panell .add(panel2, null); protected void processWindowEvent(WindowEvent e) { if (e.getlD() == WindowEvent.WINDOW-CLOSING){ cancel(); 1 I super.processWindowEvent(e); void cancel() { dispose(); I public void actionPerformed(ActionE\rente) { if (e.getSource() == buttonl) { cancel(); I I protected void cargaPregs(){ Enumeration pregs=ctrlPregs.getPreguntas(); while(pregs. hasMoreElements()){ IstPreguntas.addltem((String)pregs.nextElement0); I void btnAceptar-actionPerformed(Ac1:ionEvente) { String sTexto=txtaRespuesta.getText(); txtapadre. append(sText0); dispose(); 1 void btncancelar-actionPerformed(ActionEvente) { dispose(); II3 void btnCargarResp-actionPerformed(ActionEvente) { int index=lstPreguntas.getSelectedlndex(); String texto=null; //texto= ctrlPregs.getPregunta(index); txtaRespuesta.append(text0); 1 class CtrlPreguntas{ String cveMaestro; String cveUEA; String SERVLET-PATH; String cervletURL; CtrlPreguntas(String SERVLET-PATH,String servletURL,String cveMaestro,String cveUEA){ this.cveMaestro=cveMaestro; this. cveUEA=cv eUEA; this. S ERVLET-PATH=S ERVLET-PATH ; this.servletURL=servletURL; 1 protected Enumeration getPreguntas(){ Vector pregs=nuII; String query="?modo=lst_preguntas&cveUEA="+c\~eUEA+"&cveUsuario="+cveMaestro; query=SERVLET-PATH+queiy; try{ URL urlServlet=new URL(serv1etURL); URL urlServletGet=new URL(urlServlet,query); URLConnection conexiion= urlServletGet.openConnection(); conexion.setDefaultUseCaches(false); conexion.setUseCaches(false); conexion.set Dolnput(true); conexion.setDoOutput(false); ObjectlnputStream in=new ObjectlnputStream(conexion.getlnputStream()); pregs=(Vector)in.readObject(); 1 catch(l0Exception e l ) { e l .printStackTrace(); 1 catch(C1assNotFoundException e3){ e3. printStackTrace0; 1 Enumeration enum=pregs.elernents(); return enum; protected String getRespuesta(String cvePregunta){ String sigLinea=null; String query="?modo=repues,ta&cvePregunta="+cvePregunta; query=SERVLET-PATH+query; try{ URL urlServlet=new LlRL(serv1etURL); URL urlServletGet=new URL(urlServlet,query); URLConnection conexion= urlServletGet.openConnection(); conexion.setDefaultUseCaches(false); conexion.setUseCachles(false); conexion.setDolnput(true); conexion.setDoOutput(false); conexion.connect(); BufferedReader(new BufferedReader in=new InputStreamReader(conexion.getlnputStreaim())); sigLinea=in.readLine(); if(sigLinea.startsWith("+")){ sigLinea=in.reaidline(); return siglinea; 1 1 else sigLinea="Error al cargar respuesta"+sigLinea; catch(l0Exception e l ) { e l .printStackTrace(); 1 //E numerat io n enum=pregs.e Iement s() ; return siglinea; import borland.jbcl.*; import java.awt.*; import java.util.*; import java. awt .event .*; import borland.jbcl.control.*; import borland.jbcl.layout.*; import com.sun.java.swing.*; public class CuadroDialogo extends Dialog { Button BtnCerrar=new Button(); public CuadroDialogo(Frame padre,String nlombre,List Lista2) { super(padre,"Historial de "+ nombre, false); enableEvents(AWTEvent.WINDOW-I3/ENT_MASK); try{ cuadro(); dibujaArea(Lista2); dibujaBoton(); 85 I catch(Exception e){ e.printStackTrace(); I 1 pack(); private void cuadro() throws Exception{ this.setBackground(new Color( 129, 181, 172)); this.setLayout(nul1); setLocation(450,15); resize(340,550); I private void dibujaArea(List Lista2) throws Exception{ TextAreaControl Area= new TextAreaControl(); //Area. Area.setBackground(new Color(255, 255, 255)); Area.setBounds(new Rectangle(15,25310,450)); Area.appendText( Lista2.getSelectedltem()); Area. set Editable(faIse); this.add(Area); I private void dibujaBoton() throws Exception{ BtnCerrar.setBounds(new Rectangle(105,500,135,32)); BtnCerrar.setLabel("Cerrar"); BtnCerrar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEIvente){ Bt nCerrar-Act i(3nPerformed(e); I 1); 1 this.add(BtnCerrar); //cierra el cuadro de dialogo con el icono :>( protected void processWindowEvent(:WindowEventevt){ if (evt.get IDO==WindowEvent.WI NDOW-CLOSI NG){ this.dispose(); I' 'I 1 I super. processWindowEvent(evt); //cierra el cuadro de dialogo pubIic void Bt nCerrar-Act ion Performed(ActionEvent e){ dispose(); } CHAT APPLET import java.applet.Applet; import java. awt.*; import java. net.*; import java.io.*; import java.util.*; public class ChatApplet extends Applet implements Runnable{ private static final String SERVLET-PATH = "/servlet/chat.ChatServlet"; Label userlnfo; Label messagelnfo; Label listlnfo; Button sendButton; TextField userText; TextArea messageText; List userList; URL chatURL; URL servletURL; URLConnection connect; volatile private boolean loggedin = false; String username=null; Thread pollingThread = null; //Lista de parametros. public String[][] getParameterlnfo0 { return null; 1 //Describe el applet. public String getAppletlnfo() { return "ChatApplet - Applet"; 1 public synchronized void init() { if (pollingThread != null) return; //LlamaIra a init() siempre antes de hilar super.init(); resize(500,300); userlnfo = new Label("Teclea mensaje:"); messagelnfo = new Label("Area de meiisajes:"); userText = new TextField(40); send Butt on = new Button("Enviar'l); messageText = new TextArea( 10,40); messageText.seiEditable(fa1se); //Inicializa el panel principal Panel mainp = new Panel(); GridBagLayout gbl = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); gbc.weightx = O; gbc.weighty = O; gbc.gridx = O; gbc.gridy = O; gbc.gridwidth = 10; gbc.gridheight = 1; gbc.anchor = GridBagConstraints.CENTER; gbc.fil1 = GridBagConstraints.NONE; mainp.setLayout(gb1); gbl.setConstraints(userlnfo, gbc); mainp.add(userlnfo); gbc.gridy = 1; gbc.gridwidth = 9; g bc.f iII = GridBagCo nst raint s. HOR IZOIVTA L; g bl.setConstraints(userText,gbc); mainp.add(userText); gbc.gridx = 9; gbc.gridwidth = 1; gbc.fill = GridBagConstraints.NONE; g bI.setConst raint s(se nd Button , g bc) ; mainp.add(sendButton); gbc.gridx = O; gbc.gridy = 2; gbc.gridwidth = 10; g bI.setConst raint s (message Info , g bc) ; mainp.add(messagelnfo); gbc.gridy = 3; gbc.weighty = 100; gbc.gridheight = 1O; gbc.fill = GridBagConstraints.BOTH; gbl.setConstraints(messageText,gbc); mainp.add(messageText); Panel userp = new Panel(); userp.setLayout(new BorderLayoutO); listlnfo = new Label("Usuarios en el chat:"); userp.add("Nortt-i",listlnfo); userList = new List(l0, false); userList.addltem("Ningun usuario."); userp.add("Center",userlist); setLayout(new BorderLayoutO); add("Center" ,mainp) ; add("East",userp); // URL base(Donde se cargo el applet. chatURL = getCodeBase(); //Inicializa y comienza el hilo colector. int currPriority = Thread.currentThread().getPriority(); int newpriority = currPriority == ThreadMIN-PRIORITY ? Thread.MIN-PRIORITY currPriority - 1; pollingThread = new Thread(this,"Chat colector"); pollingThread.setDaemon(true); pollingThread.setPriority(newPriority); pollingThread.start(); p("Chat: Iniciando coleccion"); username=getParameter("nickname"); System.out.println("us: "+username); login(); 1 //Inicializa o reanuda el hilo I** * Start polling thread if not already runniing. */ public synchronized void start() { if (!isLoggedin() && username != null) { //login () ; 1 if (pollingThread != null && pollingThread.isAlive()) { pollingThread.resume(); p("Chat: reanudando hilo"); } else { p l ("Chat: No hay hilo colector!"); pollingThread = new Thread(this,"Chat colector"); pollingThread.setDaemon(true); polIingTh read.start() ; p("Chat: iniciando coleccion"); 1 1 /** * *I public synchronized void stop() { if (pollingThread.isAlive()) { pollingThread.suspend(); p("Chat: suspendiendo coleccion"); } else { p l ("Chat: hilo principal muerto y en stop()!"); I logout(); 1 public synchronized void destroy() { if (pollingThread != null && pollingThread.isAlive()){ pollingThread.stop(); pollingThread = null; //En caso de regresar p("Chat: parando coleccion"); 1 1 logout(); public void run() { p("Chat: iniciando run()''); while (!Thread.interrupted()) { if (isLoggedin()) { polllist(); p0~~0; p("Chat: colectando"); } else { 1 1 1 pollList(); p("Chat: no ha entrado al chat paIra coleccion"); try { Thread.sleep(5000); // Dormir por 1 seg } catch (InterruptedException e) {} //Aqui Io cambie p("Chat: saliendo de run()"); private void login() { if (username == null) return; String querystring + SE RVLET-PATH "?modo=nuevo_usuario&usuario="+URLEncoder.encode(username); p("Tratando de entrar como: "+usernarne); try { connect = (new URL(chatURL,queryString)).openConnection(); connect.setDefauItUseCaches(faIse);//Para futuras conexiones connect.setUseCaches(faIse);//No usar caches para acelerar envio connect .setDolnput(true); connect.setDoOutput(false); connect.connect(); p("Rea1izando conexion con: "+connsct); -BufferedReader in new BufferedReader(new InputStreamReader(connect.getlnputStreaml())); String responze = in.readLine(); if (response.startsWith("+")) { setLoggedin(true); showStatus("Entro al chat como 'I + username); p("Entro como "+username); userlnfo.setText("Tecleamensaje: "); repaint(); } else { showStatus("Error al entrar" + response); p("No pudo entrar como "+username); System.err.println("Error al intentar conexion:" +response); 1 } catch (MalformedURLException e2) { System.err.println(e2); e2. printStackTrace(System.err); showStatus("Error al tratar de conectarse"); } catch (IOException e l ) { System.err.println(e1); e l .printStackTrace(System.err); showStatus("Error al tratar de conectarse"); 1 1 private void logout() { if (!isLoggedin() 11 username == null) return; 90 String querystring + SERVLET-PATH "?modo=borra_usuario&usuario="+URLEncoder.encode(username); try { connect = (new URL(chatURL,queryString)).openConnection(); connect.setUseCaches(false); connect.setDolnput(true); connect.setDoOutput(false); connect.connect(); -BufferedReader in new BufferedReader(new InputStreamReader(connect.getlnputStreanl())); String response = in.readLine(); if (response.startsWith("+")) { setLoggedin(fa1se); showStatus("Usuario" + username + "ha salido del chat"); } else { showStatus("Error al salir" + response); System.err.println("Error al salir" +response); 1 } catch (MalformedURLException e2) { System.err.println(e2); e2. printStackTrace(System.err); showStat us("E rror aI intentar saIir"); } catch (IOException e l ) { System.err.println(e1); e l .printStackTrace(System.err); showStatus("Error al salir"); 1 1 private void send() { if(!isLoggedin()){return;} String message = userText.getText(); if (message.equals("")) return; //No enviar un mensaje vacio userText.setText(""); showStatus("Sending message"); String querystring + SERVLET-PATH "?modo=envia&usuario="+URLEncoder.encode(username); querystring = querystring +"&mensaje=:"+URLEncoder.encode(message); try { connect = (new URL(chatURL,queryString)).openConnection(); connect.setUseCaches(false);//Para este connect.setDolnput(true); connect.setDoOutput(false); connect.connect(); -BufferedReader in new BufferedReader(new InputStreamReader(connect.getlnputStream())); String response = in.readLine(); if (response.startsWith("+")) { showStatus("Mensaje enviado"); } else { showStatus("Error al enviar mensaje" + response); System.err.println("Erroral enviar mensaje" + response); 1 } catch (MalformedURLException e2) { System.err.println(e2); e2. printStackTrace(System.err); showStatus("Error al enviar mensaje"); } catch (IOException e l ) { System.err.println(e1); e 1.printStackTrace (Syst em.err) ; showStatus("Error al enviar mensaje"); 1 private void poll() { String querystring S ERVLET-PATH "?modo=colecta&usuario="+URLEncoder.ericode(username); try { connect=(new URL(chatURL,queryString)).openConnection(); connect .setUseCaches(false); connect.setDefaultUseCaches(false); ObjectlnputStream in=new ObjectlnputStream(connect.getlnputStream()); String nextLine = (String)in.readObject(); if (!nextLine.startsWith("+")) { showStatus("Error obteniendo meiisajes del servidor"); System.out.println("Error obteniendo mensajes : "+nextLine); return; 1 nextLine = (String)in.readObject(); while (nextLine != null && !nextLine.equaIs(".")) { System.out.println("Linea:"+nextLiiie); messageText.append(nextLine+"\r'\n"); repaint(); nextLine = (String)in.readObject(); 1 1 catch (IOException e) { System.err.println(e); e.printStackTrace(System.err); showStatus("Error al checar el mensaje"); 1 catch(C1assNotFoundExceptione l ) { System.err.println(e1); e l .printStackTrace(System.err); showStatus("Error al checar el mensaje OBJ"); 1 //Pregunta por la lista de usuarios private void pollList() { String querystring = SERVLET-PATH + "?modo=lista"; Vector users = new Vector(); 92 + try { System.out.println("chatURL: + chatURL); System.out.println("queryString: + querystring); URL IistURL = new URL(chatURL,queryString); System.out.println("listURL: + IiistURL); URLConnection IistConn = listURL.openConnection(); listConn.setDefaultUseCaches(false); listConn.setUseCaches(false); listconn. connect(); BufferedReader in new BufferedReader(new InputStreamReader(listConn.getlnputStream())); String nextLine = in.readLine(); if (!nextLine.startsWith("+")) { showStatus("Error al obtener lista de usuarios del servidor"); p l ("Error obteniendo lista de usualrios del servidor"); return; 'I 'I 'I 1 nextLine = in.readLine(); while (nextLine != null && !nextLine.eqiuals(".")) { p("Read user: "+nextLine); users.addElement(nextLine); nextLine = in.readLine(); 1 if (!users.isEmpty()) { userList.removeAll(); int size = users.size(); for (int i= O; i size; i++){ userList.addltem((String)users.elementAt(i)); 1 } else { userlist.removeAll(); userList.addItem ("Ningun usuario dentrol'); 1 repaint() ; } catch (IOException e) { System.err.printIn(e); e.printStackTrace(System.err); showStatus("Error al obtener lista"+e); I I //Checa si el usuario esta dentro. public boolean isLoggedin() { return loggedin; 1 //Pone variable protected void setLoggedin(boo1ean newval) { loggedin = newval; 1 public boolean action(Event evt, Object arg) { 93 if (evt.target == sendButton 1) evttarget == userText) { if (isLoggedin()) send(); else { username = userText.getText(); if (username.length() > IO) { showStatus("1O o menos caracteres!"); } else { userText.setText(""); login(); 1 I 1 return true; return super.action(evt,arg); private void p(String debug) { System .err.println("Chat:"+debug); I private void p l (String debug) { System.err. printIn("Chat:"+debug); I private String getString(String q) { return "/servlet/chat.ChatServlet" + "'?" + q; 1 public ChatApplet() { try { jbinit(); I catch (Exception e) { e. printStackTrace(); 1 1 private void jblnit() throws Exception { this.setBackground(new Color(129, 181, 180)); 1 1 CHAT SERVLET package chat; import javax.servlet.http.*; import javax.servlet. *; import java.io.*; 94 import java.util.*; public class ChatServlet extends HttpServlet implements Runnable { private ListaUsuarios usuarios = new ListaUsuarios(); private final static String paginaDefault = '"/public-html/ChatApplet.html"; private Thread recolector; // Timeout protected static final int TIMEOUT = 95 * 150 * 1000;//5 minutos public void init(Serv1etConfig config) throws ServletException { super.init(config); int currPriority = Thread.currentThread().getPriority(); int newPriority = currPriority == Thread.MIN-PRIORITY ? Thread.MIN-PRIORITY : currPriority - 1; recolector = new Thread(this,"Chat Recolector"); recolector.setDaemon(true); recolector.setPriority(newPriority); recolector.start(); return; 1 public void destroy() { super.destroy(); if (recolector != null && recolector.isAlive()) { recolector. stop(); 1 1 return; public void doGet(httpServ1etRequest req, HttpServletResponse res) throws IOException, ServletException { Administracion admon=new Administracion(res,req); String usuario, modo ; if (req.getQueryString() == null) { //Regresar a la pagina inicial... if (getlnitParameter("startpage" )== null) res.sendRedirect(paginaDefault); res.sendRedirect(getInitParameter("ctarpage")); ret urn; 1 modo = req.getParameter("modo"); usuario = req.getParameter("usuario"); if(usuarios.existe("maestro")l lusuario.equals("maestroll)>( if (modo == null) { admon.enviaError("Modo no iniciado"); return; 1 else if (usuario == null && !modo.equals("lista")) { admon.enviaError("Usuario no indicado"); return; 1 95 1 1 else if (modo.equals("nuevo-usuario")) admon.addNuevo(usuario,usuarios); else if (modo.equals("borra-usuario")) admon.borraUsuario(usuario,usuarios); else if (modo.equals("colecta")) admon.colectaMensajes(usuario,usuarios); else if (modo.equals("envia")) admon.envia(usuario,usuarios); else if (modo.equals("lista")) admon.regresa-listaUsuarios(usuarios); else admon.enviaError("Modo invalido."); else admon.enviaError("Clase no iniciada"); public void run() { while (!Thread. interrupted()) { Enumeration inactive = usuarios.inac:tive(TlMEOUT); while (inactive. hasMoreElements()) { String usuario = (String)inactive.nr?xtElement(); usuarios. borra(usuario); ha finalizado su usuarios.addMensaje(new Mensaje("Chat",usuario + Timeout .")); usuarios.addMensaje(new Men!;aje("Chat","Desechando "+usuario+" del chat.")); log("Usuario "+usuario+" fuera de tiempo. Desechado del chat."); 'I I 1 1 try { Thread.sleep(TIME0UT); I/ Dormir por el TIMEOUT } catch (InterruptedException e) {} public void doPost(HttpServ1etRequect req,HttpServletResponse IOException,ServletException{ Adm inistracion admon=new Adm inistracion(res,req) ; admon.envia(usuarios); } }//Fin servlet ............................................................................. Clases básicas ............................................................................ I class Administration{ HttpServletResponse res=nuil; HttpServletRequest req=null; Administracion(HttpServletResponseres,Hl:tpServletRequestres){ this.res=res; 96 res)throws 1 this. req=req; protected void addNuevo(String usuario,LiistaUsuarios usuarios){ if (usuarios.existe(usuario)) { enviaError("Usuario existe"); return; 1 if (!usuarios.add(usuario)) { enviaError("Prob1ema al añadir usuario"); ret urn; 1 usuarios.addMensaje(new Mensaje("Au1a Virtual: ",usuario + ha entrado.")); enviaResp("Usuario ha entrado al Aula \/irtual."); I' protected void borraUsuario(String usuario,ListaUsuarios usuarios){ if (!usuarios.existe(usuario)){ enviaError("Usuario no existe"); return; 1 else if (!usuarios. borra(usuario)){ enviaError("Prob1ema al borrar al iisuario"); return; 1 usuarios.addMensaje(new Mensaje("Ch;it",usuario + ha dejado el chat.")); enviaResp("Usuario ha salido."); I' protected void colectaMensajes(String usu,ario,ListaUsuariosusuarios){ if (!usuarios.existe( usuario)){ enviaError Invalido usuario") ; ret urn; (I' 1 //Para maestro if(usuario.equalc("maestro")) regresapreguntas( usuarios.getMensajes("maestro")); //Para alumno else regresaMensajes(usuarios.getMensajes(usuario)); usuarios. resetUsuario(usuario); 1 //Alumno envia pregunta protected void envia(String usuario,ListaUsuarios usuarios){ String msjusuario = req.getParameter("mensaje"); if (msjusuario == null) { enviaError("Mensaje no inicializado par,a envio"); return; 1 usuarios.addPregunta(newMensaje(usuririo,msjusuario)); enviaResp("Mensaje aceptado."); 97 1 //Maestro envia mensaje protected void envia(ListaUsuarios usuarios){ try{ String mensaje=nuII; ObjectlnputStream in=new ObjectlnputStream(req.getlnputStream()); mensaje=(String)in.readobject(); if (mensaje == null) { enviaError("Mensaje no inicializado para envio"); return; 1 1 usuarios.addMensaje(new Mensaje('lmaestro'I,mensaje)); enviaResp("Mensaje aceptado."); catch(l0Exception e){ e. printStackTrace(); 1 catch(C1assNotFoundException e l ) { e l .printStackTrace(); 1 1 protected void enviaError(String error) { try { Printwriter pout = new PrintWriter(res.getOutputStream()); pout print("-ERR "+error+"\r\n"); pout.flush(); pout.close(); } catch (IOException e) { // Pendiente 1 1 protected void enviaResp(String resp) { try { res.setDateHeader("Expira",System.currentTimeMillis()); Printwriter pout = new PrintWriter(res.getOutputStream()); pout. print("+OK "+resp+"\r\n"); pout.flush(); pout.close(); 1 catch (IOException e) { // Pendiente protected void regresaPreguntas(Enumeration lista-mensajes) { try { res.setDateHeader("Expira",System.currentTimeMillis()); Printwriter pout = new PrintWriter(res.getOutputStream()); pout. print("+OK\r\n"); 98 while (lista-mensajes. hasMoreElements()){ Mensaje mensaje = (Mensaje) lista-mensajes.nextElement(); pout.print(mensaje+"\r\n"); 1 1 pout.print(".\r\n"); pout.fl ush() ; pout.close(); catch (IOException e) { // Pendiente 1 I protected void regresaMensajes(Enumerationlista-mensajes){ try{ res.setDateHeader("Expira",System.cLirntTimeMillis()); ObjectOutputStream out=new ObjectCiutputStream(res.getOutputStream()); out.writeObject("+OK\r\n"); while (Iista-mensajes .hasMo reElements()) { Mensaje mensaje = (Mensaje) lista-mensajes.nextElement(); out .writeObject(mensaje+"\r\n"); I out .writeObject(".\r\n"); out.flush(); out.close(); 1 catch(l0Exception e){ e.printStackTrace(); 1 1 protected void regresa-listaUsuarios(ListaUsuariosusuarios) { try { res.set DateHeader("Expira",System.currentTimeMillis()); Printwriter pout = new PrintWriter(res.getOutputStream()); pout.print("+OK\r\n") ; Enumeration IistaUsuarios = usuarios.lista(); while (IistaUsuarios.hasMoreElements()){ pout.print((String)listaUsuarios.nextl_lement()); pout.print("\r\n"); 1 1 pout.print (" .\r\n") ; pout.flush(); catch (IOException e) { //Pendiente I 1 }//Fin administración //Lista de usuarios y S ~ J Soperaciones. class ListaUsuarios { 99 private Hashtable lista = new Hashtable(); private Hashtable active = new Hashtable(); ListaUsuarios() { 1 protected synchronized boolean add(Stririg usuario) { if (existe(usuario)) return false; lista. put(usuario, new ColaMensajes()) touch (usuario) ; return true; 1 protected synchronized Enumeration lista() { return lista.keys(); 1 protected synchronized boolean borra(String usuario) { if (!existe(usuario)) return false; lista.remove(usuario); active. remove(usuario); return true; 1 //Checa la existencia de un usuario protected boolean existe(String usuario) { return lista.containsKey(usuario); 1 protected void addMensaje(Mensaje mensaje) { Enumeration todosUsuarios = lista.keys(); while (todosUsuarios.hasMoreElements()){ String usua=(String) todosUsuarios.nextElement(); if(!usua.equals("maestro")) addMensajeUsuario(usua,mensaje1; 1 1 protected void addPregunta(Mensaje mensaje){ addMensajeUsuario("maestro",mensaje); I private void addMensajeUsuario(String usuario, Mensaje mensaje) { 1 ((ColaMensajes)lista.get(usuario)).add(rnensaje); protected void resetUsuario(String usuario) { ((ColaMensajes)lista.get(usuario)).recetl(); I //Regresa una enumeracion de los mensajes esperados por el usuario protected Enumeration getMensajes(String usuario) { to uch (usuario); 1O0 1 return ((ColaMensajes)lista.get(usuario)).listaMensajes(); //Actualiza el Timeout para un usuario protected synchronized void touch(String usuario) { if (existe(usuario)) { active.put(usuario, new Long(System.currentTimeMillis())); } 1 //Regresa una enurneracion de los usuariois inactivos protected synchronized Enumeration inactive(int timeout) { Vector inactive = new Vector(); long now = System.currentTimeMillis(); long when = now - timeout; Enumeration usuarios = lista.keys(); while (usuarios. hasMoreElements()) { String usuario = (String)usuarios.nextElement(); if (((Long)active.get(usuario)).longValue()when) { inactive.addElement(usuario); 1 1 1 return inactive.elements(); }//Fin Listausuarios //Lista de mensajes class ColaMensajes { private Vector cola-mensaje = new Vector(); ColaMensajes() {} //Anade mensajes a la cola protected synchronized void add(Mensaje mensaje) { cola-mensaje. addElement(mensaje); notifyAll(); 1 //Regresa una lista de mensajes en la cola y se bloquea hasta que un mensaje //esta listo para envio protected synchronized Enumeration listalVlensajes() { try { if (cola-mensaje.isEmpty()) { wait(30*1000); //30 second timeouit 1 } catch (InterruptedException ¡e) { //Pendiente 1 1 return cola-mensaje.elements(); protected synchronized void reset() { cola-mensaje. removeAIIElements(); 1 101 }//Fin ColaMensajes //Mensaje que envia un usuario y que guarda en la cola de todos los usuarios class Mensaje { private String usuario; private String mensaje; Mensaje(String usuario, String mensaje) { this.usuario = usuario; thkmensaje = mensaje; 1 public String tostring() { return usuario+": "+mensaje; 1 protected String getuser() { return usuario; 1 protected String getMensaje() { return mensaje; 1 }//Fin Mensaje I o2 MODELO DEL DOMINIO DEL PROBLEMA GENERAL \ '\ Esta en Tiene 1 1 Fonm p i e de 11 en - CUAS ~ ~ üse r %e m \ n i I fiene 103 5. DESARROLLO PRACTICO (Segundo Prototipo). En la etapa práctica del proyecto, elanálisis se hizo empleando las técnicas del Análisis y Diseño Orientado a Objetos (ADOO), por lo que primeramente mostraremos un modelo de requerimientos general y después centraremos la atención en los casos individuales y sus especializaciones. En cada caso se presentara el modelo de casos, de interfaz y de dominio del problema. 5.1 Modelo de requerimientos a nivel general. Diagrama General de Use Cases del Chat \ h Maestro ValdaMaestro MaestroDaCiase AlummTmaClase ValidaAlunno Alumno Maestm Pregunta Alumno Maestro Respwde Pregunta Regune 5.2 Modelo de requerimientos para catla Use Case. En esta parte analizaremos cada UC del Modelo de requerimientos a nivel general, la forma de hacerlo será primeramente el lado de los UC del Maestro y después continuaremos con los UC del Alumno. 5.2.1 Modelo de Requerimientos: Use Case ValidaMaestro Modelo de Casos. El siguiente diagrama de casos muestra la validación que tendrá que realizar el maestro, cada vez que ingrese al sistema. ValidaMaestro Maesiro I04 Descripción del caso: 8 emdeado. Password v Dresiona enviar. El sistema valida la clave de empleado y su password. Si los datos son correctos el sistema despliega una lista de cursos donde el maestro esta dado de alta para impartir clases. El maestro elige el curso al que desea ingresar y presiona enviar. El maestro entra al Aula Virtual. I Fin del Caso. Modelo de Interfaz. 105 106 Diagrama de Navegación de Pantallas Diagrama de navegacion de inieriaz Dalolncamdo t OITestMaestm I ~ \ OILiStaCum ValidaMaestm - SeleuonaCum 3 SelecionaMaeStw A 107 Modelo del Dominio del Problema. Paso 1 2 3 4 5 6 7 8 Descripción UC Valida Maestro El sistema despliega una lista de modo de entrada. El maestro selecciona el modo de entrada maestro. El sistema despliega una pantailla donde el maestro introduce su Clave de empleado, Password y presiona enviar. El sistema valida la clave de empleado y su password. Si los datos son correctos el sistema despliega una lista de cursos donde el maestro esta dado de alta para impartir clases. El maestro elige el curso al que desea ingresar y presiona enviar. El maestro entra al Aula Virtual. IFin del Caso. : I I - cMaestro ccurso NombreProfesor 5.2.2. Modelo de Requerimientos: Use! Case MaestroDaClases Este Use Case tiene dos especializaciones, que son: Use Case Maestro Pregunta 0 Use Case Maestro Responde Pregunta 0 Estos Uses Cases se describen a continuación. 5.2.2.1. Modelo de Requerimientos: Use Case Maestro Pregunta Modelo de Casos. El siguiente diagrama de casos nos muestra como el maestro puede enviar una pregunta a los alumnos. ~* / \ Maestro Maestro Pregunta 108 A\ /’ Alumno Descripción del caso: Paso Descripción UC Maestro Pregunta Maestro teclea pregunta en el área de teclea mensaje a enviar. 1 Maestro presiona enviar. 2 I 3 I Sistema lleva la Dreaunta a todos los alumnos. 4 TFin del caso. ~ ~~ Modelo de Interfaz. 109 I Diagrama de Navegación de Pantallas. Teclea Pregunta O / I :Se coloca en \ u~ ~- ~~ Pantalla Principal del Maesro) &- EnWar Modelo de/ Dominio de/ Problema. ivbestro NombreProfesor __ *E nvia () 110 _ _ . j I I -> \ \ 1-3 I Area de teclea mensaje I‘ I 5.2.2.2 Modelo de Requerimientos: Use Case Maestro Responde Pregunta Modelo de Casos El siguiente diagrama de casos se muestra como el maestro puede responder a la pregunta de un alumno. , -I. Maestro /, \ \ ; Res ponde Pregunta - \ I-- Alumno Descripción del caso: IPaso I Descritxión UC Maestro Responde Pregunta 1 2 3 4 5 Sistema trae al área de mensajes la pregunta del Alumno. Maestro teclea la respuesta dentro del área de teclea mensaje a enviar. I Maestro presiona enviar. 1 Sistema envia a todos los alumnos la respuesta. IFin del caso. 111 Modelo de Interfaz. Diagrama de Navegación de Pantallas Teclea Respuesta -1 ' Pantalla Pnncipal del Maestro , Maestro Observa Pregunta Area de Mensajes ~ ~- > A Enwar I12 \ Secoloca - ~ > t Area de mensajes a enwar Modelo del Dominio de/ Problema. la respuesta. ~ ~ Maestro CGProfesor PasswordP rofesor Nombreprofesor ~ WoiecteP regunta() *En\na() 5.2.3. Modelo de Requerimientos: Use Case ValidaAlumno Modelo de Casos. El siguiente diagrama de casos muestra la validación que tendrá que realizar el alumno, cada vez que ingrese al sistemai. ValidaAlumno ALimru Descripción del caso: Paso I 2 3 4 5 6 7 8 Descripción UC Valida Alumno El sistema despliega una lista de modo de entrada. El alumno selecciona el modo de entrada alumno. El sistema despliega una pantallla donde el alumno introduce su matricula, password y presiona enviar. El sistema valida la matricula y le1password. Si los datos son correctos el sistema despliega una lista de cursos donde el alumno esta dado de alta, para tomar clases. El alumno elige el curso al que desea ingresar y presiona enviar. El alumno entra al Aula Virtual. 1 Fin del Caso. 113 Modelo de Interfaz. 114 115 Diagrama de Navegación de Pantallas Diagrama de navegacion de interfa2 A SelecionaNumno Modelo del Dominio del Problema. I Paso 1 DescriDción UC Valida Alumno 1 2 3 4 5 6 7 8 El sistema despliega una lista de modo de entrada. El alumno selecciona el modo (de entrada alumno. El sistema despliega una pantalla donde el alumno introduce su matricula, password y presiona enviar. El sistema valida la matricula y el password. Si los datos son correctos el sistema despliega una lista de cursos donde el alumno esta dado de ,alta, para tornar clases. El alumno elige el curso al que desea ingresary presiona enviar. El alumno entra al Aula Virtual. I Fin del Caso. I I ~- cCurso ~~ cAlurnno __ MaQicula PasswrdAlumno NombreAlumno ~~ I I 1, , ~- I 5.2.4 Modelo de Requerimientos: Use Case AlumnoTomaClase Este Use Case tiene dos especializaciones, que son: \ Use Case Alumno Pregunta 0 Use Case Alumno Responde Pregunita 0 Estos Uses Cases se describen a contiriuación. 116 5.2.4.1 Modelo de Requerimientos: Use Case Alumno Pregunta Modelo de Casos. El siguiente diagrama de casos muestra como el alumno puede realizar una pregunta al maestro. Alumno Alumno P mgu nta Descripción del caso: Modelo de Interfaz. 117 Maestro Diagrama de Navegación de Pantallas Teclea Pregunta / A I I \ - Se coloca ~ -- -7 - ~ f s Pantalla Principal del Alumno \ JL ~- ~~ -~ Area de mensajes a enviar I / -p p - -- I ~ Enviar Modelo del Dominio del Problema. Paso 1 2 3 4 Descripción UC Alumno Pregunta Alumno teclea pregunta en el area de teclea mensaje a enviar. Alumno presiona enviar. Sistema lleva pregunta al maestro y a los demás alumnos. Fin del caso. Aluinno - ~- --- PasswordAlumno 5.2.4.2 Modelo de Requerimientos: Use Case Alumno Responde Pregunta Modelo de Casos. El siguiente diagrama de casos muestra como un alumno puede contestar la pregunta realizada por el maestro. A , /A\\ Alumno Alumno Responde Pregunta Maestro Descripción del caso: I Paso I Descrimión UC Alumno ResDonde Preaunta Sistema trae al área de mensajes la pregunta del Maestro. Teclea la respuesta dentro del área de teclea mensaje. El Alumno presiona enviar. El Sistema envia al maestro la respuesta junto con el nombre del alumno. Fin del caso. Modelo de Interfaz. I19 Diagrama de Navegación de Pantallas. Teclea respuesta a Alumno Obsetw Pregunta A ~ ~~~ / Se coloca - /Area de mensajes Pantalla Principal del Alumno + : - - - > I 1 Area de mensajes a enuar A Enwar Modelo de/ Dominio del Problema. 1 Paso 1 Descrbción UC Alumno ResDontle Preaunta 1 2 3 Sistema trae al área de mensajes la pregunta del Maestro. El Alumno teclea la respuesta dentro del área de teclea mensaje de enviar. El Alumno roresiona enviar. El Sistema envía al maestro la respuesta junto con el nombre del alumno. Fin del caso. Aiuinno ~~ ~ .__ Matricula PasswordAlumno Nombre ~~ K o l e c t a P regunta() +En\na() 5.3 Modelo de Análisis para cada Use (",ase. 5.3.1 Escenarios explorados. Los escenarios que se exploraron. corresponden únicamente al encontrado en el marco de "Simple Correcto", ya que al ingresar a otro escenario, en el que la 120 clave de acceso del alumno o el profesor sean incorrectas, el sistema simplemente no entra en ejecución, por lo que se omiitieron diagramas que no tiene gran valor ilustrativo. Diagramas de Colaboración. Modelo de Análisis: Use Case ValidaMaestro DIAGRAMA DE COLABORACION DE UCVALIDAMAESTRO 1 Selecciona Maedm+Envia J\ >--I I 1 - OIE~~~~MO~O- __ ~ ~ Maedm 2 Siítema DespliegaPantalla V 3 Captura CveEmpIeado+Paswd > \ 5 GeiDala(0deErnpl Pa5Vlbid)Dalos 4 Valida(CveEmp P a s w d ) Cuiais OIPamd h lv ' Maedm ñ Sistema DepliegaCursos 9 SeleccionaCum - V OISeleccionaGNpo v2Padaedm > I , 1 - ~ 6 Clasfic4GNpo<CveEm~T i m ) Dalos i / - -- Maesirn 7 GelGNpos(CveEmpl Tnrn)CveUEANornbreCuno CveGNpo V ~ 10 EntiaAula OlAulaVirlual AppletMaedrn Modelo de Análisis: Use Case Maestropregunta 2: 01. Teclea Pregunta -> / 1 Entra O1 / -> 1 /' \ 3: ON. Envia( ) 3 I 0 1 :Paitaiia principal -' del Maestro - \ : Maestro 121 ~ 0N.Envia ~ - Pregunta Modelo de Análisis: Use Case MaestroRespondePregunta 3: 01: Teclea Respuesta , I I 1: Entra > I ON: Muestra P requnta ~ 01: Pantalla IPrincipal del Maestro : Maestro ~ 2: ON: Colecta Pregunta 4. ON: Enbia( ) ~ > - --_____ - ON: E n i a Respuesta L - 1 Modelo de Análisis: Use Case ValidaAlumno DIAGRAMA DE COLAEORACION DE U C V A L I D M L U M N O 1 Selecciona:Alumno+Envia Alumno 2 Sirtema Deq>liegaPantalla V 3 Captura Matncula+Pawmd 5 GeiData(Matncula PassWord) Datos 4 V a l l d a ( M a i n w l a , P a i r d )Cursis IONPap&dAlumno v2Pass4lumno Alumno J 8 Sistema DepliepaCuroos 9 SeleccionaCurn, V > ODAlumno alumno 6 CIasificaG~ipos(Maricula.Tirm)Datoz -_____ ONSelea cnaCursm CNSelCum ____- -Alumno 7 GetGwpoqMatncula Tnm) CveUEA h b m b r e c u m CveGRipo 12.2 Modelo de Análisis: Use Case Alumno Pregunta 2: 01: Teclea Pregunta -> 1 Entra O1 > A 3 ON: EnLia() 01 : Pantalla Principal del Alumno - i /' , ~- ', -3 ' _ _ - O N : Envia 4 Prequnta I .. . A : Alumno Modelo de Análisis: Use Case Alumno Responde Pregunta 3: 01: Teclea respuesta -- 1 1 1 Entra O1 Ii \ - / > - I Í - ._ _I _ I : Alumno I ~ - I i Jo"p,guns: - 01: Pantalla Principal del Alumno ----A I ~ < - 2: ON: Colectapregunta() 4: ON: EnLia( ) -> L 123 - -~ -~ ~ ON: Envia _i Respuesta 5.4. Modelo de Diseño. Modelo de Diseño: Use Case ValidaMaestro. Modelo de Diseño: Use Case Maestro Pregunta. 2: 01: Teclea Pregunta ~ II ~ 124 < I I 3: ON: E n i a ( ) I Modelo de Diseño: Use Case Maestro IResponde Pregunta. '\ / \ - _____.____ ON: Muestra p~~ 01: Pantalla : Maestro Principal del 1 EntrS 1 I ON: Envia--- ~ Pregunta Respuesta J p-_ p. - -L L ____ ~ -> I 2. ON: Colecta Pregunta <- - - ~ -~ IT 3: 01: Teclea Respuesta p p <--- I ~ 4: ON: Envia( ) p I - ~ Modelo de A < , I Modelo de Diseño: Use Case Alumno P'regunta. o l 3 antaiia - . Alumno Principal del 1 ON : EnLia Pregunta 2: 01: teciea Pregunta - ~~ ~< ~~ 3: ON: Envia( ) -> I I I I Modelo de Diseño: Use Case Alumno Ftesponde Pregunta. ,/\ ______ ~ : Alumno I.Entra O1 ____ - _~~_____ >- 2. ON. Colec.taPregunta() < 3: O1 Teclea respuesta - I < ~ 4: ON:'Envia( ) 5. DESARROLLO PRACTICO (Tercer Pirototipo). En la etapa práctica del proyecto, el análisis se hizo empleando las técnicas del Análisis y Diseño Orientado a Objetos (ADOO), por lo que primeramente mostraremos un modelo de requerimieiitos general y después centraremos la atención en los casos individuales y sius especializaciones. En cada caso se presentara el modelo de casos, de interfaz y de dominio del problema. 5.1 Modelo de requerimientos a nivel general. Diagrama General de Use Cases del Chat Mae~iro ValdaMaestm MaesIroDaClase __ AlunnoTmaClase Vali d a lunno Alunno ~ l \ ) Ma~stro Prma \ / Alunno Respande Pregunta Maestro Responde Pregunta 5.2 Modelo de requerimientos para cada Use Case. En esta parte analizaremos cada IJC del Modelo de requerimientos a nivel general, la forma de hacerlo será primeramente el lado de los UC del Maestro y después continuaremos con los UC del Alumno. 127 Use Case Envío Avisos Profesor. OBJETIVO El profesor en ( eterminado momento desea mandar un av,so de cualquier tipo a los alumnos y se implemento esta funcion.alidad para poder lograrlo. DESCRIPCION De alguna forma este Use Case nos permite mandar un aviso a todos los alumnos que se encuentren en la clase del profesor, no necesariamente se lleva a cabo en el momento de la clase ya que al profescr se le puede olvidar y posteriormente mandárselo, por lo que el envío se lleva acabo fuera del aula de clase, este aviso posteriormente puede ser utilizado por los alumnos, pero tiene una fecha de vigencia y en caso de no observarlo se eliminara del sistema. 1. Use Case Envío Avisos Profesor. USE CASE ENVIO AVISO PROFESOR profesor 1.-Oprime botón de avíso.(actor) 2.-Muestra Pantallla de avíso.(sistema) 3 .-Introduce palabra clave. (actor) 4.-Introduce clave profesor.(actor) 5.-Escribe fecha de vigencia.(actor) 6.-Escribe dia. (actor) 7 .-Escribe mes.(actor) 8.-Escribe año.(actor) 9.-lntoduce avíso.(actor) 10.-Valída vigencia.(sistema) 128 11.-Oprime botón envía avíso.(sistema) Envío Aviso Profesor Layouts de pantallas (Use Case Envío de Aviso Profesor) El profesor selecciona Avisos 129 El profesor llena los campos correspondientes 130 El sistema muestra el aviso guardado en la base de datos Datos enviados a l a Base de datos Palabra c1ave:presentacion Clave Materia:215 11 1 gnipo:CG51 vigencia mes:l añ0:Ol avisoxomo estan m i s alminos de clase clave aViso:16 131 El sistema muestra pantalla de error 132 Diagrama de Estado (Use Case Envío Aviso Profesor) iriao V V fin En esta tabla se guardan los atributos utilizados para la base de datos . 133 MOIJELO 111. ANAI 1SlS I>INAR/lICO ESCENARIO USE CASE(Envío Aviso Profesor). Dame palabra clave: feliz Dame tu fecha de vigencia: Día: 24 Mes : I 2 Año: O0 AVISO: Les deseo feliz Navidad Envíar OK. Diagrama de Colaboración(Use Case Envío Avisos Profesor) lo: hq.) 134 MODELO DE DISENO (Diagramas de Secuencia Use Case Envío Aviso Profesor) 9 DIAGRAMA DE SECUENCIA USE CASE ENVIO DE AVISOS PROFESOR I 1: Oprime bdton aviso 1 2. Open() pF qobtieneciave(():ini obtienedato(():int) 5 ' I aptura Palabra Cv 7 Captura mes 8 Captura año 9 Captura aviso 10 EnviaOk( ) I I Y ll 11: Obti eFecha(dia,mes,á,d():int) , 12: i i , 13: Ha; 4 :tualizacion(dia,m ~~ r- 14: Insertadato claveaviso,profesm 135 + ,año,aviso) Código Fuente del Use Case (Envío Aviso Profesor). Servlet3 import javax.servlet.*; import javax.servlet.http. * ; import java.io.*; import java.util.*; import java.sql.*; public class Servlet3 extends HttpServlet { //Initialize global variables private cconectabd oconectabd; private Connection conex; private cNgeneraclave oNgeneraclave; //Correcta inicializacion del servlet public void init(Serv1etConfig config) throws ServletException { super.init(config); //inicia el servlet oconectabd= new cconectabdo; conex=oconectabd.regresaconexion(); oNgeneraclave= new cNgeneraclave(conex); )//fin el init //verificar el destroy public void destroy{ try { conex.close();} catch(SQLException eql) { System.out.println("No se pudo cerrar la base"); System.out.println(eql.getMessage()); I }//fin de destroy //Service the request public void service(HttpServ1etRequest req, EittpServletResponse res) throws ServletException, IOException { int clave; String uea=req.getParameter("CveUEA"); String grupo=req.getParameter("CveGrupo"); String claveprof=req.getParameter("CveProf I); clave=oNgeneraclave.obtieneclave(); clave=clave+ 1; despliegaclave(clave,claveprof,uea,grupo,re:;); }//fin de service public void despliegaclave(int clave,String claveprof,String uea,String grupo,HttpServletResponse resp) //Se obtiene un tipo de respuesta resp.setContentType("text/html"); //se obtiene un print writer para escribir texto Printwriter out=null; try t out=resp.getWriter(); }catch(IOException e¡) 136 c System.out.println("se ha producido un error"); } System.out.println("claveaviso"); out.println("<html>"); out.println("<head>"); out.println("<meta http-equiv=Content-Type"); out.println("content=text/html; charset=iso-8859- 1>"); out.println("<meta name=GENERATOR content=Mici-osoft FrontPage 2.0>"); out.println("<title>Por favor,</title>"); out.println("</head>"); out.println("<body bgcolor=#FFFFFF>");//** * * * * * * * * ******me falto algo out.println("<p><font size=5 face=Verdana><em>EN'dIO DE AVISOS A ALUMNOS</em></font></p>"); //out.println("<form actiori=littp://IisO7/xtodos/servletniaestro method=POST>"); out.println("<form action=http://lis.uam.mx:8080/serv'letlproyectoCSH.avisos.servletmaestro method=POST>"); out.println("<p>Clave de Aviso: <input type=text sizez=4name=claveaviso value="+clave+"></p>"); out.println("<p>Clave de Profesor:<input type=text size=5 name=profesor value="+claveprof+"></p>"); out.println("<p>Palabra clave:<input type=text size= 15 name=palabraclave> </p>"); out.println("<p>Clave Materia:<input type=text s i z e 6 name=cvemateria value="+uea+"></p>"); out.println("<p> grupo:<input type=text size=4 name=grupo value="+gnipo+"></p>"); out.println("<p>vigencia</p>"); out.println("<p>dia:<input type=text size=2 name=dia></p>"); out.println("<p>mes:<input type=text size=2 name=mi:s></p>"); out.println("<p>año:<input type=text size=2 name=año></p>"); out.println("<p><font size=6><strong>AVISO~/stronl:></font~~/p~"); out.println("<p><textarea naine=aviso rows=6 cols=6;!></textarea></p>"); out.println("<pre> <input type=submit name= boton enviar"); out.println("value=Enviar> <input type=reset") , out.println("name=boton limpiar value=Limpiar></pre>"); out.println("</form>"); out.println("</body>"); out.println("</html>"); 1 //Get Servlet information public String getServletInfo() { return "Servlet3 Information"; 1 } Clase cconectabd 137 import java.sql.*; import java.lang.*; import java.io.*; public class cconectabd { private String url; private String driver; private String usuario; private String password; private Connection conec; public cconectabdo {//metodo constructor driver="sun.jdbc.odbc.JdbcOdbcDriver"; url="jdbc:odbc:Aula-Virtual"; usuario="SYS DBA"; password="masterkey"; try{//se inicializa el driver Class.forName(driver); 1 catch(C1assNotFoundException e){ System.out.println("error en al conectar base de datos"); 1 try{//se realiza la conexion conec=DriverManager.getConnectiori(url,usuar¡o, password);} catch(SQLException ex){ System.err.println("SQLexception:"+ ex.getMessage());} }//fin de constructor public Connection regresaconexion() /*hicia metodo que regresa la conexion a la base de datos */ return(conec); 1 }//fin de clase 138 Clase cNgeneraclave import javax.servlet.*; import javax.servlet. http.*; import java.io.*; import java.util.*; import java.sql.*; public class cNgeneraclave { private cDaviso oDavisol ; public cNgeneraclave(Connection conec) { oDavisol = new cDaviso(conec); I Ufuncion que regresa la la clave de aviso public int obtieneclave() { int resul; resul=oDavisol .obtienedato(); return( resuI); I I Clase cDaviso import javax.servlet.*; import javax.servlet. http.*; import java.io.*; import java. utiI.*; import java.sql.*; public class cDaviso { private Connection conecc; private Statement st; private Resultset rs; private int clave; private String consulta="select max(cveavisc1) from Tavico"; public cDavisoiConnection conec) { conecc=conec; I public int syncronize obtienedato() { try{ st=conecc.createStatement(); rs=st.executeQuery(consulta); }catch(SQLException e¡) { System.out.println("Se ha producido un error"); try{ while(rs. next()) 139 //*************cerrar el recut set rs clave=rs.getlnt( 1); }//fin de while }catch( SQLException e) { System.out.println("Se ha producido un error"); { 1 return(c1ave); }//fin de obtienedato }//fin de clase Servletmaestro package proyectoCSH.avisos; import javax.servlet .*; import javax.servlet. http.*; import java. io.*; import java.util.*; import java.lang.*; public class servletmaestro extends HttpSendet //Initialize global variables private String palabraclave =null; private String cvemateria = null; private String grupo = null; private String dia = null; private String mes = null; private String año = null; private String aviso=nuII; private String profesor=null,claveaviso=null; private cDrecibe oDactualiza; private cDrecibe oDactualiza2; private cDrecibe oDactualiza3; public void init(Serv1etConfig config) throws ServletException { super.init(config); oDactualiza=new cDrecibe(); oDactualiza2=new cDrecibe(); oDactualiza3=new cDrecibe(); } //fin de in¡ 140 public void service(HitpServ1etRequest request, HttpServletResponse resp) throws ServletException, IOException { Ion; int ban=0,claveaviso2,profesor2,dia2,mes2,año2,grupo2,cvemateria2, boolean error=false,error2=false; claveaviso=request.getParameter("claveaviso"); profesor=request.getParameter("profesor"); palabraclave=request.getParameter("palabraclave"); cvemateria=request.getParameter("cvemateria"); grupo = request.getParameter("grupo") ; dia = request.getParameter("dia"); mes = request.getParameter("mes") ; año = request. get Parameter("a ño") ; aviso=request.getParameter("aviso"); if((lon=palabraclave.length())!=O && (loii=grupo.length())!=O&& (lon=dia.length())!=O && (Ion=mes.length()) !=O && (lon=año.length())!=O && (lon=avisci.length())!=O) { claveaviso2=lnteger.parselnt(claveaviso); profesor2=lnteger.parselnt(profesor); dia2= I nteger. parseInt(d¡a); cvemateria2=Integer.parselnt(cvemateiria); mes2=lnteger.parselnt(mes); año2=lnteger.parselnt(año); ban=obtienefecha(dia2,mes2,año2, resp); if(ban==O) { insertadatos(claveaviso2, profesor2,cvemater'ia2,palabraclave,grupo,dia2,mes2,año2,aviso 1; devuelvepaginaHTML(resp);} 1 else despliegaerror(resp,1); } //fin de service public int obtienefecha(int dia2,int mes2,irit año2,HttpServletResponseresp) { int dial ,mes1,añol; try { Date fechaactual= new Date(); d ia 1=fechaactual .getDate(); mes1=fechaactual.getMonth()+l ; año1=fechaactual.getYear(); if(año2<=año1) if(mes2<mes 1) 141 { despliegaerror( resp,2); return( I ) ; } else { if(mes2==mesl) if(dia2cdial) { despliegaerror(resp,2); return( I ) ; } 1 actualiza(dia1,mes1,añol); }catch (Exception e) { } //fin de catch return(O) ; }//fin de obtiene fecha public void actualiza(int d, int m,int a) { try{ oDactualiza.hazactualizacion(d,m,a); }catch (Exception e) { System.err.println("ServletMastro: "+e); 1 } //fin de actualiza //funcion insertadatos se encargade Insertar los datos de insertar recibidos del formulario //a la base de datos correspondiente. public void insertadatos(int claveaviso,int profesor,int cvemateria,String palabraclave,String grupo, int dia,int mes,int año,String aviso) { oDactualiza2.insertainfo(claveaviso,profesor,cvemateria,palabraclave,grupo,dia,mes,año,a viso); .............................................................................. public void despliegaerror(HttpServletResp0nseres,int x) { //establece el contenido donde escribir res.setContentType("text/html"); //se obtiene un prinwriter donde escribir Printwriter out=null; try{ 142 / out=res.getWriter(); }catch(lOException io){ System.out.println("se ha producido un error"); 1 //genera el contenido del error html out.printIn("<htmI>"); out.println("<head>"); out.println("<meta http-equiv=Content-Type"); out. println("content=text/html; charset=iso-8859-1>"); out.println("<meta name=GENERATOR content=Microsoft FrontPage 2.0>"); out.println("<title>Por favor,</title>"); out.println("</head>"); >"); out.println("<body background=http://lis.uam.mx/EducDistancia/f029.jpg if (x==l) out.println("<p><font size=5 face=Verdana><:em>Existeerror en el envio de tus datos, los datos no estan completos.</em></font></p>"); else out.println("<p><font size=5 face=Verdana><:em>Existe error en la fecha vigencia de tu aviso, tu fecha es no valida. </em></font></p>"); out. println("</body>"); out. print In(W h t mI>"); }//fin de error */ public void devuelvepaginaHTML(HttpServlletResponseresp){ //Se establece el tipo de contenido MIME de la respuesta resp.setContentType("text/html"); //Se obtiene un Printwriter donde escribir(so1o texto) Printwriter out=null; try{ out=resp.getWriter(); }catch (IOException io){ System.out.println("Se ha protjucido una excepcion"); 1 //Se genera el contenido de la pagiria HTML out.println("<htmi>"); out.println("<head><title>Datosenviados a la Basede Datos</title></head>"); out.println("<body background=http://lis.uam.mx/EducDistancia/f029.jpg out.println("<font size=4>Datoc enviados a la Base de datos</html>"); >'I); out.println("<p>Palabra clave:"+palabraclave+'14p>'1); out.println("cp>Clave Materia:"+cvemateria+"</p>"); out.println("<p> grupo:"+grupo+"</p>"); out. println("<p>vigencía</p>"); out. printIn("<p>dia:"+dia+"</p'."); out. printIn("~p>mes:"+mes+"<,lp>"); out. println("<p>año:"+año+"</p>"); out. println("<p>aviso:"+aviso+Wp>"); 143 out.println("cp>clave avico:"+claveaviso+'Wp=-''); out. println("~p>profesor:"+profesor+"c/p"); out. println("c/body>"); out.println("~/html>"); out.close(); ; }//fin de devolver pagina HTMLpcve = request.getParameter("palabraclave") Clase cDrecibe package proyectoCSH.avisos; import java.sql.*; import java.lang.*; import java.io.*; import java.util.*; public class cDrecibe /*throw SQLException*/{ private cconectabd oconectabd; private Connection conec; private String consulta= "delete from Taviso where ( dia <=? and mes<=? )"; private String coninserta="insert into Taviso(cveaviso,pclave,cveuea,cveprofesor,i~viso,dia,mes,year,grupo) values(?,?,?,?,?,?,?,?,?)"; private Preparedstatement instrucion~sql,instrucion_cql2; private String avis; public cDrecibe() { oconectabd= new cconectabdo; conec=oconectabd.regresaconexion(); 1 /*esta funcion regresa la conexion para cerrarla*/ public Connection regresa(){ return conec; 1 1 public void hazactualizacion(int d,int m,int a) { try{ instrucion-sql=conec. prepareStatemerit(consu1ta); instrucion-sql.setlnt(1 ,d); instrucion-sql.setlnt(2,m); int resultado=instrucion_sql.executeUpdate(); catch(SQLException io){ /*throw new SQLException("cDrecibe: Error "+io);*/ 144 System.out.println("Se ha producido uin error pato"+io);} } //fin de hazactualizacion public void insertainfo(int aviso,int cveprof,int cveuea,String pacve,String grupo,int dia,int mes,int año,String avis) { try{ inst ruc io n-sq I2=co nec .prepareSt at e me nt (coninserta) ; instrucion-sql2.setlnt(l,aviso); instrucion-sql2.setString(2,pacve); instrucion~sql2.setlnt(3,cveuea); instrucion-sql2.setl nt(4,cveprof); instrucion-sql2.setString(5,avis); instrucion-sql2.setlnt(6,dia); inst rucio n-sq 12.set I nt (7,mes) ; inst rucio n-sq 12.set Int (8,año); instrucion-sql2.setString(9,grupo); int resultado=instrucion~sql2.executeLlpdate(); System.out.println("el resultado de irisertar es: "+resultado); conec.close(); 1 catch(SQLException ex){ System.err.println("SQLException:'I + c?x.getMessage()); System.out.println("Se ha producido un1 error 100"); 1 }//fin de insertadatos };//fin de la clas Use Case CONSULTA AVISO OBJETIVO El maestro podrá responder las dudas especificas de sus alumnos y ésta sesión será guardada por el maestro con el objetivo de que éste archivo este disponible para los alumnos que no entraron a la sesión. MODELO DE REQUERIMIENTOS 1.- Use Case Consulta Avíso 145 USE'CE\SE * CONSULTA AVISO PASOS 1 .-Oprime botón de avíso(actor) 2 .-Despliega Pantalla de avisos@sterna) 3.-üespl i eg a paIabras cl ave(ssterna) 4.-Selecciona palabra clave(actor) 5-Despliega Pantalta con losavisosdt3 la palabra clave(Q$terna) 6.23 lo dBseea realiza consulta p2.6 7.- Terminar El alumno selecciona avisos 146 El alumno selecciona la palabra clave 147 El sistema muestra el aviso correspondiente 148 Diagrama de Estado (Use Case Consulta Aviso) 149 MODELO DE ANALISIS DINAMICO Escenario Alumno oprime Botón Aviso OK. Alumno oprime URGENTE OK Sistema muestra aviso Los alumnos del proyecto presentarse urgentemente en le cubiculo. Diagrama de Colaboración(Use Case Consulta Aviso) O: obtenerpalabraclave(c1aveuea):ResultSet 2 - 1 . Onrime -r - -botón - - aviso -- '1 O: obtenerdatos(cveuea):ResultSet 2: ODeníl - olAlumno : clAlumno I >" ~ oNConsultaAvíso : c N C o n s u T a z 1 J - 3- I I-- - 5: Open( alabraclave) olDespliegaPalClave : clDespliegaPalClave - . ~~ oNConsultaAviso2 : cNConsultaAviso I 150 - - ~ - - A O: obtienealviso(pa1abra):ResultSet ' -- oDPalabraClave : cDPalabraClave MODELO DE DISEÑO (Diagramas de Secuencia) 1 'I oNConsultaAviso : cNConsultaAvico olAlumno: c IAlumno me botón avíso - oBabraClave : edabraClave olDespiiegaPalClave : ciDecpliegaPalClave oNConsuitaAvico2 : cNConcultaAvico2 > 2. Open() > 3: obtenerpalabraclave(ciaveuea():ResuItSet) 3 I I 4: obtenerdatps(cveuea():RecultSet) , I ~ 'iL +? I I 6: obtieneav'co(palabra():ResultSet) ~- 7: obtienedatos(palabraclave():ResuitSet) 6--- Codigo Fuente Sew let1 package proyectoCSH.avisos; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import java.sql.*; import java.lang.*; public class Servlet 1 extends HttpServlet { //Initialize global variables private String cveuea,pc; private int claveuea,i; private Resultset rs; private Connection con; private cconectabd oconectabd; private cNconsultaaviso oNconsultaaviso; private cDrecibe oDactualiza; private cconectabd ocierra; 151 -- > /*Llamada al metodo init de la superclase generitServlet asi se asegura una correcta inicializacion del Servlet*/ public void init(Serv1etConfig config) throws ServletException { super.init(config); System.out.println("lniciando el Servletl . . . . ' I ) ; oDactualiza=new cDrecibe(); oconectabd=new cconectabdo; con=oconectabd.regresaconexion(); oNconsultaaviso = new cNconsultaaviso(con); ocierra= new cconectabdo; }//fin de init //Service the request public void service(HttpServ1etRequest req, HttpServletResponse resp) throws ServletException, IOException { i++; String CveUEA=req.getParameter("CveUEA"); String CveGrupo==req.getParameter("CveGrupo"); claveuea=Integer.parseInt(CveUEA); rs=oNconsuItaaviso.obtienepalabraclave(claveuea); despliegapalabrasclave(resp); } //este metodo me despliega las palabras claves public void despliegapalabrasclave(HttpServletResponse respuesta) c //establecemos el tipo de respuesta de nuestros datos respuesta.setContentType( "textihtml"); //se obtiene un print writer para escribir solo texto Printwriter out=null; try { out=respuesta.getWriter(); }catch(lOException io){ System.out.println("Se ha producido un eiror"); } out.println("<html>"); out.println("<head>"); out.println("<title>sin titulo Normal Page</title>"); out.println("</head>"); out.println("<body background=http://li~;.uam.mx/EducDistanci~~29.jpg >"); out.println("<p>':font color=008080 size=6 face=Arial><marquee bgcolor=#COCOCO height=50 scrollamount=30 scrolldelay= 13O>LOS SIGUIENTES AVISOS FUERON ENVIADOS POR T U PROFESOR</marquee></font></p>"); try { while(rs.next()) c pc=rs.getString(2); out.println("<:p><a href=http://lis.uam m x : 8080/servlet/proyectoCSH.avi~~os. Servlet2?id="+pc+">"+pc+"</a></p>"); } out.println("</body>"); 152 out.println("</htmI>"); out.flush(); out.close(); ocierra.cierraconexion(); }catch(SQLException ei) { System.out.println("ERROR:"+e¡+" "+i); System.err.println("SQLexception:"+ ei.getMessage());} //Get Servlet information public String getServletInfo() { 1 return "Servlet 1 Information"; Clase cNconsulta aviso package chat; import java.sql.*; import java.lang.*; public class cNconsultaaviso { private Connection conet; private cDpalabracve oDpalabracve; private Resultset ap2=null; public cNconsultaaviso(Connection co) { oDpalabracve=new cDpalabracve(co); 1 public Resultset obtienepalabraclave(int cveuea) c ap2=oDpalabracve.obtienedatos(cveuea); return(ap2); 1 Clase cDpalabraclave package proyectoCSH.avisos; import java.sql.*; import java.lang.*; import java.io.*; import java.util.*; public class cDpalabracve { private Connection conec; private String consulta= "select * from Taviso where cveuea = ?"; private String consulta2="Select * from Taviso nhere pclave = ?" ; private PreparedStatement instrucion-sq1,instruccion; private Resultset ap,ap5; private String avis; public cDpalabracve(Connection conex ) { conec=conex; 1 public Resultset obtienedatos(int cveuea) { try { instrucion-sq I=conec. prepareStatement(consu1ta); instrucion-sql.setlnt( 1 ,cveuea); ap=instrucion-sql.executeQuery(); 1 catch(SQLException io){ System.out.println("Se ha producido un error");} return( ap) ; } lllllllllllllllllll/llllllllllllllllllllllllllllllllllf public Resultset obtienedatos(String avis) try { instruccion=conec.prepareStatement(consulta2); instruccion.setString( 1 ,avis); apS=instruccion.executeQuery(); }catch(SQLException ¡a){ Systein.out.println("Se ha producido un Ierror");} return(ap5); 1 1 S e w let2 package proyectoCSH.avisos; import javax.servlet.*; import javax.servlet.http. * ; import java.io.*; import java.uti I. * ; import java.sql.*; 154 import java.lang.*; public class Servlet2 extends HttpServlet { //Initialize global variables private cconectabd oconectabd; private Connection con; private cNconsuItaaviso2 oNconsuItaaviso2; private String palabra; private String palabraclave,id; private Resultset st; /*Llamada al metodo init de la superclase generitservlet asi se asegura una correcta inicializacion del Servlet*/ public void init(Serv1etConfig config) throws ServletException { super.init(config); System.out.println("1niciando el Servlet 1...."); oconectabd=new cconectabdo; con=oconectabd .regresaconexion(); oNconsultaaviso2 = new cNconsuItaaviso2(con); }//fin de init //Service the request public void service(HttpServ1etRequest request, HttpServletResponse ServletException, IOException { System.out.println("1niciando el servlet que despliega los avisos"); response) throws palabra=request.getParameter("id"); st=oNconsultaaviso2.obtieneaviso(palabra); despliegaaviso(resp0nse); }//fin de service //metodo que despliega el aviso correspondiente public void despliegaaviso(HttpServletResponse respuesta){ //establecemos el tipo de respuesta respuesta.setContentType("textihtm1"); //se obtiene un printwriter donde escribir Printwriter out=nu I I; try f out=respuesta.getWriter(); }catch(IOException io){ System.out.println("Se ha producido un error"); } out.println("<h:mI>"); out.println("<head>"); out.println("<title>sin titulo Normal Page</title>"); out.println("</head>"); out.println("<body background=http://li~~.uam.mx/EducDistancia/fO29.jpg~"); out.println("<p><font color=008080 size=ó face=Arial><marquee bgcolor=#COCOCO height=50 scrollamount=30 scrolldelay= 130>AVISOS </marquee></font></p>"); try { while(st.next()) { out.println("<p>"+st.getString(5)+"</a></p>"); 1 out.println("</body>"); out.println("</html>"); st.close(); }catch(SQLException e¡){ 155 System.out.println("ERR0R:"+ei); System.err.println("SQLexception:"+ ei.getMessage());} //Get Servlet information public String getServletInfo() { return "Servlet2 Information"; } //fin de String )//fin de class Clase cNConsulta aviso2 package chat; import java.sql.*; import java.lang.*; public class cNconsultaaviso2 { //variables globaies private cDpaiabracve oDpalabracve; private String palabracve; private Resultset ap3; private Connection conex; public cNconsultaaviso2(Connection conex) .[ oDpalabracve=new cDpalabracve(conex); 1 public Resultset obtieneaviso(String palabracve) { ap3=oDpalabracve.obtienedatos(palabracve); return(ap3); I> REVISA SESION OBJETIVO El alumno podrá en algún momento tener duda respecto a ciertos puntos específicos de la sesión ,por lo cual podrá disponer de la sesión correspondiente para poder clasificar sus dudas. 1.-Use Case Revisasesion 156 ALUMNO USE CASE REVISA SESION PASOS I.- Clik ai botón revisa sesión. 2.- El sistema verifica UEA. 3.- El sistema verifica el grupo. 4.- El sistema abre el archivo. 5.- Elsistema muestra la sesión correspondilente. 6.- Fin Layouts de pantallas (Use Case RevisaSesion) El alumno selecciona Revisar Sesion 157 158 I SESION GRUPO CGOl UEA 2 15 107 S E INICIA LA SECION CORRESPONDIENTE como A LA FECHA dia 15mes 12año 100 estas Ada Vutual Cesar ha cntrado adios Cesar provarcmos S E C E W . LA SESION CORRESPONDIENTE A LA FECHA dia 15mcs 12año 1 O0 SE INICIA LA CESION CORRESPONDIENTE 11LA FECHA &a 15mes 12aiio 100 como estas Ada VvhJal Ccsar ha cntrado adios Cesar provarcmos SE C E - LA SESION CORRESPONDIENTE A LA FECHA dia 15mes 12año 100 Diagrama de Estado (Use Case RevisaSesion) seleccina Rev icar Sesion PantallaAlum no 1 ~P --__ ~P > Ventana Secion cSeson GRUPO UEA w e UEA nombre N o c r e d it os 1 t i I 159 - ‘ I l 0 t ) Z LO I ) t A h >%Iis14 I ) I h A M I ( ’ O Diagrama de Colaboracion(Use Case RevisaSesion) -> p - .-I 2: venficaUE.A(UEA) 1 Remaseson f oi P a n t a l l a A l u m n o T JclPantallaAlumno) /? 1I 5: ObtieneSesion(UEAGnipo) -+ oD0btieneSesonoNVen8caDatos ~ N V = n r i u i o a t ~ ~ E W b l e n e C e . o n 3-;eniicaGnipo(Gnipof -> ALUMNO 4 m n catena (UEAGRip o) > MODELO D E DISEÑO (Diagramas de Secuencia) I.- (Use Case RevisaSesion) ALUMNO olPantallaAlumno (clPantalla 1 oNVenficslatos cNVerificaM > ‘2. verificaUEA(UEA) ~ I r pp- oDObtieneSeYon’ cDObtieneSesion , 7-1 13‘ venficaGnipo(Gmpo) r I - 7 1 ---*- 4 concatena(UEAGnipo) - 5. OtitieneSeson(UEAGnipo) -> GUARDA SESION 160 OBJETIVO El maestro podrá responder las dudas especificas de sus alumnos y ésta sesión será guardada por el maestro con el objetivo de que éste archivo este disponible para los alumnos que no entraron a la sesión. MODELO DE REOUEKJMIENTOS 1.- Use Case GuardarCesioii PASOS 1.-Elprofesor oprime el botón "enviar sesión" 2.-Elsistema obtiene la sesión 3.-Elsistema registra el profesor 4.-El sistema registra la clave del grupo 5.-EI sistema registra la clave de la UEA 6.-EI sistema crea un archivo 7.-Elsistema obtiene la fecha de la sesión correspondiente. 8.-El sistema guarda la fecha. 9.-EI sistema guarda la sesión lO.-El sistema cierra el archivo 11.-Fin 161 Diagrama de Estado (Use Case GuardaSecion) Inicio - O Aula Virtual >i ~ - \ - ~ Pantallaprofesor Enviar Seson ~ ~~ Salir ____~ Salir Fin ~ ~~ CProfesor I 1 1 ' ~~ CSeaon 162 -> Pantal IaE nvi a Diagrama de Colaboracion(Use Case GuardiaSecion) 1: GuardaSesonO 3: ObtieneFecha 2: EnviaiUEAGniDo.usiano) MODELO DE DISEÑO (Diagramas de Secuencia) 1.- (Use Case GuardaSesion) ~~ o NG11 a rda o IPantal Ia M aestro : (clPantaila : (maestro) ~ 0DGuardaSe.s cNguaida ~~ ~ ~~ L ~ ~~~~ ~ 1. Guardasesono ~~ ~ >I I I I I 2 Envia(UEAGrupo.usuario) I 1 3: ObtieneFecha ~ ~I .-- I >>ciI 4 Guarda!2ecion(UEAGRipo,uuano,sason) __ 163 > /*El Servlet MIPRIMER lo que hace es abrir una carpeta en el servidor y guardar los archivos correspondientes a la sesión correspondiente única, pues esta dada por el grupo y la clave de la UEA, además de que se identifica por la fecha correspondiente a ese día*/ public class MIPRIMER extends HttpServlet r I /* Los parametros de service encapsulan los datos que son mandados tanto desde el cliente, como desde el servidor*/ private String modo; private int dia,mes,año; private String usuario; private String UEAGrupo; private String sesiones; c public void service(HttpServ1etRequest req, HttpServletResponse res) throws ServletException, IOException modo = req.getParameter("modo"); appletmaestro //esta parte se encarga de recibir los datos enviados por el usuario = req.getParameter("usuario"); UEAGrupo = req .getParameter("CveUEAGrupo"); sesiones=req.getParameter( "sesion"); System.out.println("Esto es lo que posibl llegue si E conex con modo"+modo); System.out.println("Esto es lo que posibl llegue si E conex con usuario"+usuario); System.out.println("Esto es lo que posibl llegue si E conex con "+UEAGrupo); if (modo.equals("guarda-sesion")) obtienefecha( 1; escribearchivo(UEAGrupo,usuario,sesiones,dia, mes, año,res); String grupo=UEAGrupo.~ubstring(6); String uea=UEAGrupo.substring(0,6); /I presentaExito(res,grupo,uea); //para mostrar exito del guardado del archivo. 1 ilfuncion que inserta un texto en el archivo protected synchronized void escribearchivo(String int año,HttpServletResponse res) { try I; EAGrupo,String c usuario,String sesiones,int dia,int mes, File directorio=new File("pub1ic-htmllarchivoprofe"); directorio.mkdirs(): FileOutputStream fos= new FileOutputStream("public_html/archivoprofe/"+UEAGrupo+".txt",true); PrintStreain ps= new PrintStream(fos); ps.println("SE INICIA LA SESION CORRESPONDIENTE A LA FECHA:"+"dia "+dia+"mes "+mes+"año "+año); ps.println(sesiones); ps.println("SE CIERRA LA SESION CORRESPONDIENTE A LA FECHA:"+"dia "+dia+"mes "+mes+"año "+año); ps.close(); // enviaResp("se almaceno la informacion",res) ; } 164 catch(l0Exception e){ System.out.println("ERR0RARCHIVO"+e); 1 }//fin de funcion escribearchivo protected synchronized void obtienefechao { try { Date fechaactual= new Date(); dia=fechaactual.getDate(); mes=fechaactual.getMonth()+ I ; año=fechaactual.getYear(); }catch (Exception e) { } //fin de catch }//fin de obtiene fecha lienvia la respuesta de regreso al aplet protected void enviaResp(String resp,HttpServletResponse res) { try { res.setDateHeader("Expira",System.currentTi~ieMillis()); Printwriter pout = new PrintWriter(res.getOutputStream()); pout.print("+OK "+resp+"\r\n"); pout.flush(); pout.close(); } catch (IOException e) { // Pendiente 1 }//fin de enviaResp private void presentaExito(HttpServ1etResponse res, String grupo, String uea) { String texto; try i //Se establece el conteido de la respuesta res.setContentType("text/htinl"); //se obtiene un Printwriter para salida0000000000 Printwriter out=null; out=res.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<meta http-equiv=Content-Type"); out.println("content=text/htmI;charset=iso-8859- 1>"); out.println("<meta name=GENERATOR content=Microsoft FrontPage 2.0>"); out.println("<title>LA SESION HA SIDO GUARDA CON EXITO</title>"); out.println("</head>"); out.println("<body bgcolor=#FFFFFF>"); out.println("<hr>"); out.println("<pre> </pre>"); out.println("<pre> <font color=#000080 size=7"); out.println("face=Zurich XCn B P L A SESION HA SIDO GUARDA CON EXITO</font></pre>"); out.println("<pre><font face=TrumpetLite> </font></pre>"); 165 out.println("<pre><font face=TrumpetLite> LA UE A: "+uea+" DEL GRUPO :"+grupo+ " HA SIDO GUARDADA</font></pre>"); out.println("<pre><font color=#000080 size=4 face=Verdana> <a href=http://lis.uam.inx/EducDistancia/PrincipalPag/UniversidadVirtual.htm>PAGINA PRINCIPAL</a>"); out.println("<hr>"); out.println("</body>"); out.println("</htinI> "); 1 catch (IOException e) { } }//fin de presentacion /*este servlet es para ver la sesión , por parte del alumno*/ public class Servletsesion extends HttpServlet { //lnicializacion devariables globales private String UEA; private String Grupo; private cNVerificaDatos oNVerificaDatos; public void init(Serv1etConfig config) throws ServletException { super. init(config); }//fin de init //Service the request public void service(HttpServ1etRequest req, HttpServletResponse res) throws ServletException, IOException { //Obtiene los datos para ser manipulados tanto UEA, como Grupo oNVerificaDatos- new cNVerificaDatos(res); boolean ban 1=false,ban2=false; UEA=req.getParameter("CveUEA"); ban I =oNVerificaDatos.verificaUEA(UEA);/Nerifca que la UEA no sea nula Grupo=req.getParameter( "CveGrupo"); ban2=oNVerificaDatos.verificaGrupo(Grupo); //Verifica que el grupo sea no nulo oNVerificaDatos.concatena(ban 1,ban2,UEA,Grupo); }//fin de service //Get Servlet information public String getServletInfo() { return "Servletsesion Information"; 1 } //fin de Servletsesion 166 ENVIAR ARCHIVOS. Objetivo El maestro podrá enviar cualquier tipo de archivos a través de la pagina de la Universidad Virtual. Use Case EnviarArchivo EnviarArchim Maestro 1.-Oprimir liga "Subir Archim". 2.-Se despliega pantalla donde habrá de capturarse la claw de maestro, claw de la materia y la claw de grupo. 3.-Se despliega la pantalla para seleccionar el archim a subir. 4.-Se selecciona el archim a enviar. 5 . S e opnmeel botón "Enviar". 6 . E I archilo seleccionado es enviado a Servidor. 7. S e despliega una pantalla que indica los datos que acaban de ser eniados. 8. -Term h a Favor de llenas los siguientes campos: - 1 Insertar la clave de ia materia- 1 Insertar su clave de profesor Insertar la clave del grupo 1 A continuación, favor de seleccionar el archivo 167 Diagrama de estado ( UseCase EnviarArchivo. ) m a h Q \ Modelo del dominio del problema. ~~~~~ A rc h ivo (from L o g i c a l View ) . CveP rofesor CveUEA CveG rupo N o m b r e A rc h ivo DirArchivo I +<<Set>> ~~ 1 Curso-Prof I I I(from L o g i c a l View ) ~ Cve-UEA : String ~ I 1 .* Archivo() A continuación se presenta el escenario para el envió de un archivo; no se tomara en cuenta una situación de error. Paso Escenario Descripcion SUBIR ARCHIVO 1 Oprimir liga “Subir Archivo”. 2 Se despliega pantalla donde habra de Clave Maestro: capturarse la clave del maestro, clave de la Clave Materia: Clave Grupo: materia y la clave de grupo. 3 Se despliega la pantalla para archivo a subir. 4 Se selecciona el archivo a enviar. El archivo Servidor. seleccionado es C:\Texto.txt enviado a Se ha oprimido el botón grupo 168 as¡ como nombre y Diagrama de colaboración.(Use Case EnviiarArchivo) I 4 Mrad-iu, / I 09\isOti7jo: 169 MODELO DE DISEÑO (Diagramas de Secuencia) 1.-(Use Case EnviarArchivo.) \ Maestro Maestro oEnwoArchiu, clEnwoArchiw EnwarArchb , I oArcK7 1~ oNUploadSedet ' 1 cNU loadsenkt --- IEnwoArchiu: - I P ~ - * Examinar ' I Abnrarchiu, < < Open( ) UploadServlet(Cw-profesor.Cve-matela,C-grupo, ~~ direccion) -+ -L_-... < 170 Diagrama de clases dinámicas. I Atchiw I D E S C A R G A R ARCHIVOS. OBJETIVO El alumno podrá bajar los archivos que fiueron prevdmente puestos en la página G Z la Universidad Virtual, por el maestro. 171 Use Case DescargarArchivo / ' I,, -2 \ DescargarArchiw Usuario 1.-Oprimir liga "Bajar Archiw". 2.-Se despliega la pantalla con la lista de los alrchiws a descargar. 3.-Seleccionar el archiw a descargar. 4.-Una e z seleccionado el archiw, se hace click sobre la liga del archiw. 5 . S e abre pantalla donde se indicará en qué parte queremos carpeta deseamos guardarlo. 6. S e oprime el boton "OK'. 7 . E l archiw es descargado de la página de la Unilersidad Virtual.. 8. -Temina Diagrama de estado ( UseCase Descargar Archivo. ) 1 ~ ~ _ _ ~ Pantalla seleccion de archiws Pantalla descargar notas ~ Pantalladescargandoanhiw J'_ I Modelo del dominio del problema. Archim(from Curso-P rof Logical View) (from Logical View) C-UEA I I..* I +setlnformacion(CLe_profesor, Ce-materia, Cw-grupo, direction)() ~_~ ~ - 172 1 - __ -- String MOIIELO L)F ANA1 .lClCI>INAMlCO A continuación se presenta el escenario para la descarga de un archivo; no se tomara en cuenta una situación de error. Escenario Descripcion Paso 1 Oprimir liga “Bajar Archivo” 2 Se despliega la pantalla con la lista de los Clave Maestro: Clave Materia: archivos a descargar. Clave Grupo: BAJAR ARCHIVO Se seleccionará un archivo de una lista de archivos previamente subidos por el mofesor. Para poder pasar a la siguiente Una vez seleccionado el archivo, se hace clic pantalla, es necesario escoger solo un archivo de los que se sobre la liga del archivo. muestran. Seleccionar el archivo a descargar. 3 4 5 6 Se abre pantalla donde se indicará en que Se le indicara la ruta donde deseamos guardar el archivo. carpeta deseamos guardarlo. Se oprime el boton “ O K . “OK” 7 Aparece la pantalla por default El archivo es descargado de la página de la donde se indica el proceso de Universidad Virtual. descargar del archivo. 8 Termina . 173 Diagrama de colaboración.(UseCase BajairArchivo) i x, '\ i 1: Bajar k c h i m > ~~ ~~~ 3: Get&& im(Cve-profesor.C\e-materia,Cve-grupo.direccion) 2 sennce() - olDescargarkchiw clDescargarArchim 1 7 oNDcwnloadSe\let cNDownlmdSer\let - / /& 5 Termina > ~ clDescarF]arPrchi ~ 174 -+ - -' odatosDownload cdatosDownload , ~ MODELO DE DISEÑO (Diagramas de Secuencia) 1.-(Use Case Bajar Archivo.) z - ~~ GDownloadSe viet Alumno Usuario I odabsDownloa d: _ _ _ - , clDescar arArc Lp-L 1 - - I i I I I senice( ) ~ >- 175 I I REGISTRO OBJETIVO. El siguiente Use Case se encargará de capturar los datos personales de los alumnos de la Universidad Virtual dentro de la pagina de la Universidad Virtual. Use Case Registro. \ / h /' '\ Administrador Registro 1.-Oprimir liga "Registro". 2.-Desplegar la pantalla que contendra el menij principal. 3.-Seleccionar la liga "Inscripción". 4.-Se desplegará la pantalla con la hoja de inscripción 5.-Capturar los campos requeridos (nombre, dirección, etc.) para registrar al Alumno. 6. -Validación de la existencia de campos IX) \/;=íos. 7.-Oprimir botón "Enbiar". 8.-Desplegar los datos capturados. 9.-Oprimir botón "Salir". 1O. -Te m i na. 176 Se selecciona la liga Inscripción. Favor de hacer click en l a operacion deseada C onsui ta Inscrincion Reinscriacioii Se despliega la pantalla la hoja de registro. 1177 Diagrama de estado (UseCase Registro). Inicio , \ Oprimir Iiga "Reg1stro" k Pantalla con liga "Registro" I >Pantalla Menú "lnscnpción" Oprimir liga "Inscripción" I i Pantalla Hoja'L <- 7 / / inscnpción ~~ 1 J Oprimir botón "Enwar" Enivar a la BD los campos capturados L-- - Opiimir botón "Salir" !Pantalla con los datos capturados; -<O)Fin -~ I Modelo de Dominio del problema. 178 X 1 0 1 l I ~ i , c > Ill !\N,ll 1’715 I ) i Y , \ \ l l C O A continuación se presenta el escenario para el registro de un alumno; no se tomara en cuenta una situación de error. Paso Descripción Escenario 1 Oprimir liga “Registro” 2 Desplegar la pantalla que contendrá el menú principal. 3 4 5 REGISTRO INSCRIPCION CONSULTA RElNSCRlPClON INSCRIPCI~N Seleccionar la liga “Inscripción”. Se desplegará la pantalla con la hoja de inscripción. CONSULTA RElNSCRlPClON Hoja de inscripción con los campos a llenar para dar de alta al alumno en la Univ. Virtual. Capturar los campos requeridos (nombre, dirección, etc) para registrar al Alumno. Se hará la captura de los datos personales del alumno. 6 Validación de la existencia de campos no vacíos. 7 Oprimir botÓ n “Enviar” . En caso de que exista algúr campo importante que este vació, se le informará a la persona que este capturando la información. El capturista hará clic en e botón “Enviar”. 8 Desplegar los datos capturados. Se desplegarán los datos que fueron escritos en la BD. 9 Oprimir botón “Salir”. Se ha oprimido el botón “Salir” 10 Termina 179 Diagrama de colaboración (Use Case Registro). 1 Registro > oRegistro c Ilnscripcion / Administrador : Administrador I 8 Termina -> oconírnxion clconfirmacion " 2 Ope() 3 Enwar 4 EnwarDatosíMatncula.Nombre Password) + - olnscnpcion cllnscnpcion 5 SetDatos(Matncda, Nombre, Passvmrd) - oNlnscn cion cNinsc&cbn L -~ -~ -> - oAlumno cDAlumno ~~ / 7 Open ( ) MODELO DE DISEÑO (Diagramas de Secuencia) Administrador oReqistro c Ilnscnpcion olnscnpcion 2 Ilnscnpcior! oConlmacion clconfimacion oNlnscnpcion cNlnscnpción oAlunno c DAlumno EnwarDatos(Matncula,Nombre, Password) 11 r h- ~~ - - SetDatos(hatncula, Nombre, Password) / \ Salir 1L,-----+- >-i I ' O p e n ( ) ~ I Temina ~- <- I so Diagrama de clases dinámicas. cDAlumno I 38 8 word) I < < E v e n > > Salir 181 CONSULTA. OBJETIVO. Qué el Administrador pueda consultar los datos personales de los alumnos pertenecientes a la Universidad Virtual a través de la pagina misma. Use Case Consulta. /' I ' \ \\ \ UC Consulta Admi ni st rador 1.-Oprime liga "Registro". 2.-Despliega pantalla "Menú". 3.-Selecciona "Cons u1ta" . 4.-Despliegue de matricula y nombre de todos losAlumnos de la Univxsidad Virtual. 5.-Oprime liga "Matricula" perteneciente al Aluinno a consultar. 6.-Despliegue de los datos personales del Alumno. 7 ,-0primi r botón "Sal it". 8. -Termina. Se oprime la liga Consulta. I82 Se desplegara . - la pantalla con la matricula y el nombre de todos los alumnos de la Universidad Virtual. A conginuacion,se lnuertran los alumnos inscritos 94216867 Salvador Oscar Lopez Carrera 94319656 Sandra Aide Valadea Lopez 96217006 Alejandro Cruz Noriega 93220718 E d o Flores Díaz 200318099 Alarcon Martinez Jose Antodm 95214852 Rey César Romero Barragán 92321214 Martha Ivonne Juarez Gonzalex 200317695 Aimaraz Marcon Carlos Alberto 20031785’ M v a r c z Fabila Nelson 200317653 Baliesteros Flores Saul 1, 83 en el aula virtual Cuando se hace click sobre una matricula, esta desplegara los datos personales de cada alumno. l.lNlvmsU>mAuTbrv Matricula: 200315928 Nombre: G o m a G o m a Jesus Nickname: jerusg Password j esus g Sexo: Mascuiino Emaikninguno Direcaon: ninguno Co1onia:ninguno codigo Postal: o Lada: O Telefoiio:O Ciudad Cd.de Mexico Estado: D.F. Pair:Mexico Diagrama de estado (Use Case Consulta), 'A------ - Pantalla con liga Registro \ - - Pantalla icon Menú Pnncipal ' I f Query a la BD t; Nombre Matricula 1 1 , Crick en una soia Matricula I84 Modelo de Dominio del Problema. Alumno , I h101)l I c, 111 /\\.I1 151,s I , I N , \ n i l c ‘ o A continuación se presenta el escenario para la consulta de un alumno; no se tomará en cuenta una situación de error. Descripción Paso Escenario 1 Oprimir liga “Registro”. 2 Desplegar la pantalla que contendrá el menú principal. 3 4 REGISTRO INSCRIPClON INSCRIPCI~N CONSULTA Seleccionar la liga “Consulta”. Despliegue de matricula y nombre de todos losAlumnos de la Universidad Viritual. 5 Oprime liga “Matricula” perteneciente al Alumno a consultar. 6 Despliegue de los datos personales del Alumno. 7 Oprimir botón “Salir” 10 Termina 185 RElNSCRlPClON Se desplegaran la matricula y el nombre de los alumnos, no importa a que grupo Pertenezcan. Cada una de las matriculas será una liga a los datos personales de los alumnos a quienes Pertenezca dicha matricula. Desplegara la información personal del alumno, de acuerdo a la matricula seleccionada. Se realiza un clic en el botón “SaI ir”. Diagrama de colaboración (Uxe Case Conisulta). 1 Oprimir Registro > oRegistro clRegistro / Administrador Administrador 2 Consulta 3 Open ( ) 6 Open ( ) A $ 4 Consu~al(Matncula, Nombre) 5 GetDato(Matncula, Nombre) v- oMatncula clMatricula - 10 Tennina 1-' 7 Consulta2(Matricula, Nombre, Password) 3 oConsuTG -> cNConsulta - p~~ 8 GetDato(Matricula,Nombre,Password) > '9. , oDatosP clDatosP - - oAlumno CDAlumno Openo 1 MODELO DE DISEÑO. (Diagramas de secuencia) Administrador Administrador oRegistro c IRegistro OprmrReglstm - oMenu c IMenu -- 1 oMatnwia 1 ' -' c IMatncula oDatosP c oconsulta c 7 oAlümno GetDat o(M& n cula. Nombre) > ConsultaZ(Matricula. Nombre Password) 31-1 GetDato~Matncula.Nombre.Password) r Open ( ) I ' J I86 - - - ~ I -->Termina I < - A I 1 -->- Diagrama de clases dinamicas. ciRegistro I C D A l u m no I cIMenu I I I +O e t D a t o ( M atric u la. N o m bre) I 5.4.1 Modelo de Implantanción. La codificación de todo el análisis) anterior se realizo en Java, con la ayuda de Servlets, y Applets, además es importante mencionar que también se requirieron paginas HTML para la presentación en la red del proyecto Educación a Distancia. 6. Conclusiones. El proyecto de Educación es una necesidad de muchas Universidades, pero no solo a nivel nacional, si no a nivel mundial, esta necesidad a provocado el desarrollo de este proyecto que habia llegado a un primer prototipo, sin embargo en este trimestre se ha llegado a un segundo prototipo en el cual se logro una comunicación completa via internet, es decir se logró el intercambio de información mediante el uso de la clase virtual entre el alumno y el maestro. Es importante mencionar que algunos factores obstruyeron la elaboración de dicho proyecto, como lo fueron : la falta de información, la inestabilidad del servidor e incluso la inestabilidad de los requisitos. De la realización del presente proyecto, se pudo observar y tener viva conciencia de la importancia y el impacto en la sociedad de la denominada "Educación a I87 Distancia". Asumiéntose a la Universidad Virtual como una aplicación, en esta era de las comunicaciones, ya que es una florma flexible de enseñanza especializada a distancia que utiliza avanzadas tecnologias, esto permite ofrecer una formación de excelencia, cumpliendo con los estandares academicos internacionales. Entre otras cosas hay que destacar que este proyecto brinda comodidad a los alumnos, ya que pueden tomarse las clases en cualquier parte donde exista Internet, por lo que puede ser muy comercial. i 88 7. Bibliografía. O 1001 tips para programar en Java, Steven W. Griffith et al. Mc Graw Hill , México ,D.F ,1998, I r a . Edición Español. O Java Servlets, Kalr Moss, Mc Graw Hill, United States o f America, 1999, first edition (Primera Edición). O Aprendiendo Borland Jbuilder2 en 21 días, Donald Doherty y Michelle M. Manning, Prentice may Hispanoamericana S.A., M{exico, 2000, 1ra. Edición Español. REFERENCIAS O http://developer.java.s un.com/deve!loper/onIineTraining/Servletsl Fundamentals/con tents. htm I http://java.sun.com/docs/books/tutorial/index.html http://www.netverk.com.ar/usuario~s/suweb/html/manualde/man000.htm http://members.es.tripod.de/froufe/parte2/cap2-1. html http://java.sun.com/products/jd k/l.2/docs/api/ http://geminis.adi.uam.es/-dcclhtrrillhtmll .htm O http://www.eis.uva.es:80/GuiaHTMl,/introHTML.htmI O O O 0 o 189