Casa abierta al t m p o Universidad Autónoma MetropolitanaUnidad lztapalapa ‘‘Educación!a Distancia ’’ TERESA GA-RCIA BAHENA L323130 Para o6tenerelgrdo de : Licenciatura en Computación Con Ih ,%esonh de : Universidad Autónoma Metropolitana lztapalapa División de ciencias Básicas e Ingenierziz Departamento de Ingeniería EEctrica ''Educación a Distancia" Tesis presentadapor Teresa 5;arcía Batíena Para o6tener elgrado di: Licenciada en computación LABORATORIO DE INGENIERIA DE SOFTWARE 1. INTRODUCCION ............................................................................................................. 5 ......................................................................................... 2. EDUCACION A DISTANCIA 8 SOBRE EL DOCIJMENTO:....................................................................................................... 8 3 . OBJETIVOS DEL SISTEMA......................................................................................... 9 4 . MARCO TEORICO....................................................................................................... TCCNICAS IJTILIZADAS EN EL DESARROLLO DEL PROYECTO............................................... ANÁ[. ISIS Y DISEÑO ORIENTADO A OR.[ETOS. ...................................................................... ANÁl. ISIS DE REQUERIMIENTOS ......................................................................................... E J E M P I .O DE USE C A S E ...................................................................................................... D I S E Ñ O.............................................................................................................................. CONS.I'RIJCCl6N ................................................................................................................. UML ................................................................................................................................. RATIONAL Ros E................................................................................................................ T~NICA DESPROGRAMACl6N EN JAVA ............................................................................ T~NICA D ESP R O G R A M A C I ~ NEN HTML. ......................................................................... TEC'NICAS lJTILlZADAS EN BASESDE DAWS ..................................................................... 10 10 10 11 12 14 14 15 16 16 18 18 . 5 ESQUEMA BÁSICO DEL SISTEMA DE NAVEGACI~NPARA LA UNIVERSIDAD VIRTUAL.............................................................................................. 20 D E S C R I P C I ~ N...................................................................................................................... BARRA DE NAVEGACIóN DE SERVICIOS C8:)N CARÁCIER PRIVADO...................................... 20 21 - . 6 ANALISIS Y DISENO ................................................................................................... P O N E R N O T A S .................................................................................................... MODELO DE REQUERIMIENTOS............................................................................ DIAGRAMA D L CLASES ESTÁTICAS ........................................................................................ MODELO DEANALISL7 DINAMICO ......................................................................... 1 J S E C A W P O N E R N O T A S ESCENARIO CORRECTO SIMPLE ................................................. - ................................................................................................ MODELO DE DISENO P O N E R A V I S O S ................................................................................................... MODELO DE REQUERIMIENTOS............................................................................ DIAGRAMA DE CLASES ESTÁ-rlcAS ........................................................................................ MODELO DE ANALISISDINAMIC ' O ......................................................................... Us[<CASEPONERA V I S o-s ESCENARIO CI:)RREC'I'O SIMPLE ................................................ MODELO DE DISENO ................................................................................................ P O N E R B I B L I O G R A F I A ............................................................................... MODELO DE REQUERIMIENTOS............................................................................ DIAGRAMA DIi CLASES ESTÁ.llCAS ........................................................................................ MODELO DE ANALISIS DINAMKO ......................................................................... USl; C A S E PONER BIBLIOGRAFIA ESCEN~ZRIO CORRECTO SIMPLE ..................................... MODELO DE DISENO ................................................................................................ _Ir . o d 1 g o .......................................................................................................................... ADM1NISTRACI~)N DEI. SISTEMA......................................................................................... (jB.JETIV0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 23 23 25 25 25 26 29 29 30 31 31 31 34 34 35 36 36 36 39 72 ?. 1-7 2 MODELO DE REQUERIMIENTOS............................................................................ USl: CASE ENTRADAAI~MINISTRAD~R .............................................................................. MODELO DE ANALISIS DINAMICO ......................................................................... MODELO DE DISEÑO (Diagramusde Secuencia) .................................................... C O N S U L T A M A E S T R O................................................................................... OB.JE TI VO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MODELO DE REQUERIMIENTOS............................................................................ Usl: CAsr: CONSUI; I-AMAI.STRO ....................................................................................... Modelo de Inter*fbz........................................................................................................ MODELO DEL DOMINIO DEL PROBLEM ............................................................ MODELO DE ANALISIS DINAMICO ......................................................................... MODELO DE DISEÑO (Diugrumas de Seczlencia) .................................................... L T A M A E S T R O S ............................................................................................ OB.JE TI Y O. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MODELO DE REQUERIMIENTOS............................................................................ MODELO DE ANALIk5'LY DINAMICO ......................................................................... MODELO DE DISEÑO (Diugrunusde Secuencia) .................................................... A J A M A E S T R O S ............................................................................................. OB./ E TI VO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MODELO DE REQUERIMIENTOS............................................................................ 72 72 73 74 74 74 75 75 75 75 76 77 78 78 75 78 (YO 80 N0 80 . . Instalaclon de los parches: ......................................................................................... Instalacidn de SDHJRE: ............................................................................................ Instalucicin de paquete Solaris S, DK:......................................................................... Instulacidn de binarios auto-extraiblt'sde SDKLJRE: ............................................... [/sando Java 2 SDK 1.3: ............................................................................................ 8. MIGRACIóN DEL SISTEMA A SERVIDOR 1NFOCBI.UAM.MX ..................... JIJSTIFICACI~N ................................................................................................................. PROCESODE PREPARACI~N .................... I31 7 133 1 133 136 136 137 137 ........................................................................ DIAGRAMA DE.PROCESO DE REDIRECCIONAMIENTO DE ARCHIVOS HTML ............................. Migracidn de base de datos de Interbase 5 a Interbase 6 .......................................... 137 138 138 9. CONCLUSIONES......................................................................................................... 139 10. APÉNDICE .................................................................................................................. 140 ASPECTOS SOBRE LA MÁQIJINA CON SISTEMA SOLARIS UAM VIRTLJAL ......................... 140 EL FTP? .................................................................................................... 140 ¿QLJEES FTPD? ................................................................................................................ 144 ¿,Y COMO I T J E : 1I .BIBLIOGRAFÍ A. ........................................................................................................ REFERENCIAS ............................................................................................................. 145 145 4 1. Introducción. Dirección del sitio en internet donde se encuentra el sistema actualmente. http://infocbi.uarn.mx:W Todo sitio, portal o página web requiere de un sistema de navegación. Por sistema de navegación enlínea entendemos al programa de cómputo que se ubica en unservidor especializado y que permite la organización del contenido,serviciosy materiales ubicados en una página, sitio o portal en internet y que orienta y apoya a los usuarios en la selección de las diferentes opciones de servicios que se les ofrece; así como, les facilita la comunicación entre ellos y con el oferente del servicio. Asimismo, la estructura lógica de los sistemas de navegación es una herramienta muy útil para el diseño e implantación de los materiales y servicios en línea, ya sean productos en venta, materiales educativos, avisos para la prevención de desastres, noticias, etc. Además, un sistema de navegación forma parte de la imagen que proyecta el oferente de los servicios: educación, gobierno, empresas comerciales, organismos normativos, agenciasde noticias, compañías de entretenimiento, etc.En este sentido, el correcto diseño del sistema demanda de la intervención deun grupo interdisciplinariode especialistasen la materia: representantes de la institución, diseñador, computólogo, comunicador, gestor, etc. AI multiplicarse hoy en día las opciones para que una institución educativa ofrezca sus servicios en linea, es conveniente establecer un sistema institucional de navegación que le otorgue una estructura, organización e identidad al material educativo que ofrece el personal de la institución y facilite tanto la consulta de los usuarios, como el diseño de los ambientes y materiales en linea. Estoes,noimporta si las plataformas de educación enlinea se ubican en servidores externos a la institución (por ejemplo WebCT o Blackboard), se utilicen plataformas ya diseñadas en servidores de la institución (learning space o las plataformas del IPN, de la UOC o de la Universidad de Alicante) o sean las propias de la institución (la plataforma lis diseñada en la Unidad lztapalapa de la UAM), Io conveniente es incorporar endichas plataformas el programa de cómputo asociado al sistema de navegación. Sin embargo, la mayor parte de las plataformas de educación en línea ya disponen de un sistema de navegación propio, por lo que las posibilidades para incorporar el sistema de navegación institucional es un factor que pudiera orientar la toma de decisiones en la selección de las plataformas institucionales. En este sentido, es necesario responder a la siguiente pregunta: ¿La plataforma de educación en línea que se propone usar cuenta con la capacidad de incorporar el sistema de navegación decidido por la institución? Labúsquedade la respuestaala pregunta anterior necesariamente enriquecerá los procesos para la introducción sistemática de la educación en línea a la institución y evitará muchos de los problemas asociados a la compatibilidad de programas de cómputoy materiales en línea diseñados o adquiridos con proveedores externos. Porotro lado, como todo programa de cómputo, el sistema de navegaciónpuede ser diseñado por la propia institución o por ernpresas especialistas en dichos programas. En ambas opciones es necesario que la institución acuerde la estructura de navegación acorde a sus propias necesidades actuales y futuras, con la imagen que desea proyectar a todo el mundo, que sea compatible con los recursos de cómputo y de comunicaciones institucionales, que se garantice la posibilidad de que personal de la institución le haga modificaciones y le de el mantenimiento necesario, etc. Con base a lo anterior, se sustenta la necesidad del trabajo de un equipo institucional que diseñedicha estructura, considere, entre otros, los aspectos arribamencionadosy determine cuál es la mejor opción para c,ontar con el sistema de navegación en plazos de tiempo breves. Conelfin de iniciar el diseño de un sistema de navegación institucional, en este documento se presentala estructura básica de un sistema de navegaciónpreliminar orientado a la docencia en el nivel licenciatura de la UAM-lztapalapa. En el diseño de esta propuesta se consultó a decenas de sitios disponibles en internet y, en especial, se analizaron, entre otros, los sistemas disponibles al público del IPN, ITESM, CIIDET-SEP, ILCE, ANUIES, Ciimara de Diputados, Gobierno Federal, Gobierno de D.F., CENAPRED,SEPIENSA, Infotec, WebCT,Blackboard,Aulafácil,CyberCentral Web de la U. de Berkeley, Ciudad Futura, UNED, UOC y Macromedia. No obstante la variedad de los sistemas de navegación analizados, se pueden observar coincidenciasquepermitieron normar un criterio personal paraincluirelementospara construir un primeresquema de un sistema propio de laUAM-lztapalapa el cual, al acordarse al interior de la institución, se instalaría en lasplataformasde educación en líneapropias o ajenas que alberguen rnateriales didácticos en línea diseñados por el personal de la Unidad. Sirva esta propuesta como un primer catalizador para iniciar este trabajo, una propuesta que no es acabada sino un primer estírnulo orientado a organizar un trabajo de equipo 6 que derive en un sistema de navegación de la UAM-lztapalapa útil para todos y, porqué no, atractivo y agradable a la visión de los usuarios. 2. EDUCACION A DISTANCIA. Este proyecto surgió con elfin cle poder dar cursos o clases dePosgrado vía InterneteneláreadeCiencias Sociales y Humanidades de la Universidad Autónoma Metropolitana plantel Iztapalapa. Esta ideafue propuesta por la división de Ciencias Sociales y Humanidades en conjunto con el Laboratorio de Ingeniería de Software (LIS) área 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 mencionamospara impartir clases del área de Posgrado Ciencias Sociales y Humanidades pero se puede ampliar a otras áreas. Actualmente el sistema se ha ampliado a las áreas de licenciatura y a otras divisiones dentro de la universidad y se tiene planeado que sea utilizado por otras instituciones distintas a la (JAM. 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. 8 3. OBJETIVOS DEL SISTEMA. Objetivos Generales: El sistema debe reconocer cuatro grupos de usuarios(alumnos, profesores, y administradores, usuario general ), y desplegar las opciones pantallas correspondientes a cada usuario. El sistemadebe despliegar unapantalla en donde el usuario ingresasuloginyel sistema lo validará y ubicará dentro de un grupo de usuarios. El profesor o el alumno pueden elegir un curso de entre los que les corresponden. El sistema desplegará una pantalla en donde el profesor podrá ver las fotografías de todos sus alumnos y sus correspondientes correos electrónicos, teniendo la opción de enviar un correo al alumno seleccionado. El sistema desplegará una pantalla en donde el alumno podrá ver las fotografías de todos sus compañeros de grupo y sus correos, teniendo la opción de enviar un correo al alumno seleccionado o al profesor. El sistemadebe permitir el envíodeimágenes, éste envío lo realizará el profesor desdealgunacomputadora que este conectada a Internet y solo se asignaránlas imágenes a un aula virtual en especifico. El alumno podrá ver las imágenes que previamente su profesor envío al aula virtual en la que esté inscrito. El profesorpodrá enviar vía Internet notas, bibliografía,tareasyexámenesasus alumnos, poniendo éstas en su aula virtual. Los alumnos debenpoderverestos archivos. El profesor podrá poner avisos con cierta vigencia, cuando se cumpla la vigencia del archivo éste se eliminará automáticamente del sistema. Cada grupo de usuarios debe tener acceso a una zona de ayuda en el sistema. La interfaz debe ser agradable y eficiente. 9 - ... " 4. 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 121cual 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. Técnicas utilizadas en el desarrollo del proyecto. Las principales técnicas utilizadas parael desarrollo del proyecto, son enla Ingeniería de Software el análisis de riesgos, 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. Análisis y diseño orientado a objetos. El proyecto se desarrolló sobre l a 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 incrementá1 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 enemigo a 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 1. - Levantamiento de Requerimientos. Entregable Modelo de requerimientos. Modelo de Casos(USE CASE). Modelo de Interfaz: Pantallas principales. Diagramas de transición estados. Modelo de dominio del problema. 2. - Análisis. Modelo de Análisis. 3. - Diseño. Modelo de Diseño. 4. - Construcción. Modelo de Construcción. de 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 f i g l . Prototipo 1 -”..+ Prototipo 2 1 Requerimientos 4 1 1 Análisis __+ Requerimientos Análisis Diseño 1 Diseño Construcción Prototipo n 4 Requerimientos 1 Análisis 1 &construcción Diseño Construcción ..... Aná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 lo 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 entornosobre el que va a trabajar, pues son especialistas en desarrollar sistemas, no en la materia sobre la cual va adesarrollar. El aprendizaje del entorno permite la elaboración deunproductomás eficiente y libre de errores, pues así desarrolla una solución de un problema que conoce (o que va conociendo). Todo este conocimiento lo absorbede 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 ModelodeCasos Modelodelnterfaz ModelodelDominio 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.Estemodelo 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. I1 Ejemplo de Use Case. Un USE CASE es precisamente una descripción de una transacción, donde no sólo exhibe lo quehace, sino también incluye una serie estructuradadepasospara realizarlaylos entes que interactuan con éI o Actores. CadaUSECASE separado como un objeto. se tratapor El sistema completo puede corlstar 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 7 objetos en cada nivel para asegurar la percepción(una cantidad mayor será difícil de entender, una cantidad menor podría ser incluida en otro nivel). > >. Almacenista Entrada de Arliculos ~ Entrada por Dewluclón Entada por Compra Entrada por Transferencla Ejemplo de USE CASE. Sobre el Modelo de lnterfaz 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 retroalimentació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 de/ Dominio del f'roblema se establecerán los principales objetos que constituirán al sistema y las relaciones que tienen entre sí. Los objetos persistentes almacenaráninformació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 @FechaOC @ +FOIIOOC @ ~&ArticulosOC @CantldadesOC Se utdlza en Articulo O ' +C\RAIIIC @ &DescArtlc QPrecloArttc &ExlstenclasArtc 1 I ' Conesponde , Se ubllza en O ' .Almacenista .... -. .... " @ tgNomElnp 1 o 0..1 Entrada * QFechaEnt @ &FolioEnt @ &ArticulosEnt Ejemplo de Modelo de dominio del problema El proceso completo de levantamiento de requerimientos se desarrolla de la siguiente 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 se llevarlasacabo. Se desarrolla un modelo inicialcon éI o los USE CASEque 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 los cambios que se hagan al modelo sean mínimos. Es importante recalcar que el procedimiento 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. Al final se tendrá una descripcióndetallada del comportamiento y comunicación que existe entre los diversos objetos que realizan una transacción. Para entender mejorestas relacionesse construyen escenarios, que son instanciaciones de una transacción,es decir,descripción de los pasos necesarios y los valores reales queseobtienen o se transmiten.Este escenario es referente auncomportamientoperfecto,y los erroresy excepciones se toman en cuenta hasta que un escenario es perfectamente interpretado. Aquí es importante recalcar la utilidad del modelo 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 objetosde negocio que manejan la lógica paramanipulary 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 productoprincipalde este proceso es el diagramadecolaboración,que describe todos los objetos en juego para cada transacción, las llamadas que reciben y hacen hacia otros objetos con sus parámetros respectivos(con sus tiposdedatos recibidos y a retornar). El diagrama de colaboración debe ser lo suficientemente detallado para entender estas relaciones. Ejemplo de Dia(7rama de Colaboración. Diseño. Prácticamente es una extensión al 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 adecuadas 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 hacen 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 Io mas clara y precisa posible para que el programador la siga al pie de la letra. Construcción. Es ya la elaboración del producto. Culmina todos los esfuerzos con un prototipo funcionalquesiguelas especificaciones de todas las etapas anteriores, listopara probarse y modificarse alimentando un prototipo subsecuente. Para un buen entregable habrá que colocar comentarios amplios en 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 14 requerimientos en un principio los cambios son extensos porlasobservacionesy modificacionespropuestas por el usuario, tendiendo a estabilizarse, con lo cual el procedimiento de prueba se encuentra inmerso 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. Ensuma, durante todo el desarrollose hacen pruebas, tomando como un hecho que unaetapaalimentaala 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 en 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 más importantes. Para seguir unametodología orientada a objetos es indispensable unlenguaje estándar 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 lenguajeunificadode 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 ejemplosmostradosenlasección anterior de diagramasde estados, colaboración y secuencia han sido elaboradoscon base en este lenguaje. AI ser un lenguaje estándar nos da un punto de partida ideal para quecualquier gente que tenga nociones deelentiendanuestrasideasy su contexto, transformándoseenun medio de comunicación efectivo, sin tener que extenderse demasiadoen explicaciones, ejemplos, etc. Algunos elementosmásimportantes del lenguaje son los siguientes. : Autotransicion Actor USE CASE hcio Transicion , 7 Estado V Generalizaclon Asociaclon Agregacion Fin Liga hacia si mismo 1: Liga o mensaje '.. ,/' Clase Asociacion Objeto Mensaje . Automensale S:: 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 necesidades y disposición que se tenia para el presente trabajo fue Rational Rose, una herramienta CASE que proporciona una interfaz gráfica para el modelado. Con ella se tiene una buena administración de los proyectos porque permite el desarrollo de prototipo!; incrementales 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. Técnicas de programación en Java. 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 deun browser compatible con Java. Las ventajas son evidentesyse citan a continuación: I6 1. - Javaesmultiplataforma. Puede un mismoprogramacorrerendiferentes maquinas sin compilar y modificar nuevamente. 2. - AI utilizarse paginas HTML dinámicas o Applets el código reside realmente en la maquina servidor(gateway) y es transportado 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 todas 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, permite 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 gestionar y Bases de Datos relacionales. Para que una 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 yase 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 compiladorJavaúnicamentegenera el denominado Bytecode. Este código esun código intermedio entre el lenguaje máquina del procesador y Java. Evidentemente este código noes ejecutable por sí mismo en ningunaplataforma hardware, pues no se corresponde con el lenguaje de ninguno de los procesadores que actualmente se conocen (habráqueesperara ver qué ocurre con los procesadores Java). Por lo tanto,para ejecutaruna aplicación Java es necesario disponer deun 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 unamáquinavirtual específica.Asíque cuando el ByteCode llegaalamá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 cada 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 lamáquina virtual desempeña otras funciones, como la de aislar los programasJava al entorno dela máquina virtual, consiguiendo una gran seguridad. Comoherramientase utiliza JBuilder 4.0 de Borland, quees una herramienta visual, eficientehasta cierto punto. La~smáquinas utilizadas para eldesarrolloson adecuadas y no tienen problema serios, 1pero 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 mediantemétodosremotos (RMI) inmersos enun applet cliente y un servidor.Este métodono funcionó, pues generó muchas restricciones en cuanto aseguridad. Los navegadores o browsers no permiten tan fácilmente una conexión de este estiloysi existen firewall y proxys entre las conexiones la comunicación es muy difícil. Por todo lo anterior se decidió cambiar a servlets, que son muy adecuados para éstetipode aplicaciones, con lo cual lacomunicacicm se realiza de forma conveniente y muy fácil, además los servlets permiten la modificación de . Técnicas de programación enHTML. Paraque cualquier persona tenga un acceso fácila la clase virtual así como información relativa con los cursos de la Universidad 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 muyricosu contenido y posibilidades. Las versiones actuales de HTML(Lenguajede Marcas para HiperTexto) proporcionan la posibilidad de cargar imágenes animadas, crear ligas, botones con acciones predefinidas enun script (por ejemplo JavaScript) y otras posibilidades sin la necesidad de contar con una máquina virtual como en el caso de los applets, con lo que su uso es mucho más eficiente al 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 quenonecesariamente se debe de hacer la construcción paso a paso, sinoquees 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. 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 Io 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 alumncls ingresan a la clase virtual. En todo el demás tiempoelmaestroes 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 servlets que la utilizan, en caso de tener problemas de desempeño. en todos los I9 5. Esquema básico del sistema de nlavegación para la Universidad Virtual. Preeliminar Descripción A continuación se presenta el esquema básico del sistema de navegación, tal como lo observaría el usuario en una computadora. Cada cuartilla representa a lo que se observa en la pantalla del monitor Una vez que se ingresa al sistema de navegación se observan tres áreas: 1 , La barra de navegación vertical izquierda superior, que se denomina barra de servicios para usuarios en general 2. La barra de navegación vertical izquierda inferior, llamada barra de servicios con carácter de privado. 3. El área para textos, gráficas, imágenes, etc. (que incluye un sistema muy simple de navegación) que se identifica como el área de trabajo. Cabe mencionar que no se han desarrollado todas las posibles trayectorias del sistema, ya que como bien se mencionó antes, éste es solo un esquema básico, cuya única finalidad es presentar a groso modo la vi:;ión que tendría el usuario al utilizar el sistema. En un principio se presenta sólo a la barra de servicios para usuarios en general, y más tarde la de los servicios con carácter de privado. La primera barra se compone de 8 links, cada uno de los cuales se describe brevemente a continuación: Página Principal: Un link para regresar a la página de la universidad virtual desde cualquier parte del sistema. Biblioteca Virtual: Un link a la página de la biblioteca en línea de la UAMI: http://amoxcalli.uam.mx Conferencia Magistral: Aquí, los usuarios de la universidad virtual tendrán la posibilidad de participar enconferencias !en tiempo real con envío de voz e imagen (Actualmente en construcción). Hemeroteca: Links a las páginas de losprincipales diarios de circulación nacional. Cursos en línea: Información acerca de los cursos que se imparten actualmente en la universidad virtual. Divulgación: Links a diversas páginas con material didáctico para usuarios en general. Sitios de interés: Links adiversas páginas de interés general (gobierno, educación! etc). Ayuda general: Información acerca de los distintos links arriba descritos Barra de navegación de servicios con carácter privado. A esta parte, sólo tendrán acceso aquéllos usuarios que cuenten con una clave de usuario dentro de la universidad virtual (alumnos, profesores y administradores) y ésta barra variará dependiendo del perfil de usuario del que se trate. En el caso del perfil de usuario profesor, esta barra constará de las siguientes partes: -Aula Virtual: Una especie de chat en tiempo real, en donde el profesor y los alumnos tendrán la oportunidad de tener una sesión en línea. -Subir notas y apuntes: Aquí el profesor podrá poner en el aula virtual sus notas y apuntes para el grupo. -Subir bibliografía: Aquí el profesor podrá poner en el aula virtual la bibliografía para el grupo. -Subir tareas y exámenes: Aquí el profesor podrá poner en el aula virtual las tareas y exámenes que desee dejar para el grupo. -Poner avisos: Aquí el profesor podrá dejar en el aula virtual avisos para el grupo. -Proyector de imágenes: Aquí el profesor podrá subir al aula virtual archivos de imágenes que le puedan servir de apoyo durante la sesión en línea con el grupo. -Correos de alumnos: Aquí el profesor podrá consultar las direcciones de correo electrónico de los alumnos en caso de que así lo requiera. -Ayuda para el profesor: Una breve explicación sobre los puntos arriba descritos. En el caso del perfil de usuario alumno, esta barra constará de las siguientes partes: -Aula Virtual: Una especie de chat en tiempo real, en donde el profesor y los alumnos tendrán la oportunidad de tener una sesión en línea. -Notas y apuntes: Aquí el alumno podrá bajar las notas y apuntes que el profesor haya dejado para el grupo. -Bibliografía: Aquí el alumno podrá consultar la bibliografía que el profesor haya dejado para el grupo. -Tareas y exámenes: Aquí el alumno podrá bajar las tareas y exámenes que el profesor haya dejado para el grupo. -Avisos: Aquí el alumno podrá consultar los avisos que el profesor haya dejado para el grupo. -Proyector de imágenes: Aquí el alumno podrá bajar las imágenes que el profesor haya subido para apoyarse con las sesiones en línea. -Directorio: Aquí el alumno podrá consultar las direcciones de correo electrónico de sus compañeros y del profesor si así Io desea. -Ayuda para el alumno: Una breve explicación sobre los puntos arriba descritos. Finalmente, para el perfil de usuario administrador, la barra de servicios de carácter privado, constará de los siguientes puntos: - Alumnos: Aquí el administrador podrá realizar todo lo concerniente a altas, bajas, consultas y cambios de alumnos. - Profesores: Aquí el administrador podrá realizar todo lo concerniente a altas, bajas y consultas de profesores. - UEA's: Aquí el administrador podrá realizar todo lo concerniente a altas, bajas y consultasde UEA's. - Cursos: Aquí el administrador podrá readizar todo lo concerniente a altas, bajas y consultas de cursos. 22 6. Analisis y diseño. PONER NOTA S MODELO DE REQUERIMIENTOS Modelo de casos(Use Case) 1.-Use Case PonerNotas maestro PonerNotas Descripción de la transacción Poner Notas en forma de Caso: 1.-El profesor oprime el botón poner notas en la pantalla del curso (ReciDato) 2.-El sistema muestra la pantalla de seleccionar notas(Envía Archivo) 3.-El profesor oprime el botón seleccionar notas 4.-El sistema despliega ventana de archivos 5.-EIprofesor selecciona el archivo correspondiente 6.-El profesor oprime el botón Enviar 7.-EIsistema envia la información al servidor lis.uam.mx. 8.-Se ejecuta el use case recibe archivo. 9.-EI profesor oprime regresar al botón principal. 10.-Fin Modelo de casos(Use Case) I .-Use Case Recibe Archivo m a e s t ID P onerNotas RecibeArchivo Descripción de la transacción Recibe Archivo en forma de Caso: 1.-El sistema obtiene los datos del archivo: -Clave de grupo -Clave de UEA -Nombre de archivo 2.-El sistema obtiene el archivo 3.-EIsistema guarda el archivo en el subdirectorio: notas/cveuea/cvegpo/Nombre del archivo 4.- El sistema guarda los datos en la base de datos del aula virtual. Modelo de lnterfaz Diagrama de transición de Estados(Use Case Poner Notas) Pantalla Mensaje A Enviar SeleccionarSubirNotas > Pantalla Curso > Pantalla Subir Notas A Seleccinar Archivo Fin Aceptar V a v Pantalla Examinar 24 Modelo del Dominio del problema Diagrama de clases estáticas Profesor '.$$veprofesor @NombreProfesor @paswordProfesor Notas 1 '&C\RG rupo O..* o Curso 7.CveUEA &:EPchivo @Directorio @Fecha .* 1 QCveGrupo MODELO DE ANALISIS DlNAMlCO Use Case Poner Notas Escenario Correcto simple 1 .-Paginadel curso CH-O1 Graficas por computadora se oprime el botón poner notas se envia la CveUEA y CveGrupo 2.-el sistema muestra pagina poner notas con el nombre del curso la clave del curso y la cve de la UEA. 3.-Se oprime botón seleccionar notas 4.-El usuario elige la unidad A 5.-EI usuario elige prueba.txt 6.-Se envia el archivo prueba.txt con CveGrupo,CveUEA 7.-EI sistema pone el archivo prueba.txt en notas/cveuea/cvegpo/ del servidor 8.-Se muestra la pantalla de envio satisfactorio con nombre de archivo,fecha,CveGrupo y CveUEA 9.-EI profesor oprime el botón regresar 10.-El sistema muestra la pantalla de curso en el del menu inicial. MODELO DE DISEÑO Diagrama de Colaboración (Use Case PonerNotas) OlRec~Dato CReclDato 1 PonerNoIasO 2 subirNolas(CveUEA.Cve(;rupo,NombreUEA,CveProfesor) OIEnuaArchlw CEnuaArchlvo .._ oNCaptumrArchlw C(:apturarArchlw " ODCaptuladorBaSeDato5 CCapluradorBaseDalos 7 hayDalosNulos(datos,rleData) 'V 9 guardaArchlM(RleDala.RleD~reclorlo.fileNa~~) 5 ObtenValores(mult~parse.nparametros) ..1 ,!" 8 creaDrectono(Palhdlrectorl0) 6 OblenArch~M(mull~parser) \i ,, Diagrama de Secuencia (Use Case Poner Notas) OlReclDato OIEnwaArchivo ONCapturarArchlvo ONCapturador ODCaDturador CReciDato CEnviaArchim CCapturarArchivc Archivo Profesor profesor BaseDatos 1 PonerNotasO > 2 : subirNotas(CveUEA,CveGrupo,NombreUEA,CveProfesor) > 3 Exarnlnar() .> 4 ’ EnvlaDatos(CveUEA,CveGrupo,NombreUEA.CveProfesor) .._ , , ’ 5: ObtenValores(multlparse,npararnetros) .,.* 6 . ObtenArchivo(rnu1tiparser) ’,. ./ 7 - hayDatosNulos(datos.flleData) .. _” 8 creaDlrectorio(Pathdirector1o) _..’ 9 guardaArchlvo(flleData.hleDirectorio,flleNatne) x,.: 10 insertadatos(ConlnteIBase,datos) .,.;- Diagrama de Clases Dinámicas (Use Case Poner Notas) CapturarArchivo ReciDato OSubirNotasO I $ObtenV;alores() +ObtenAvchivo() %HayDatosNulos() %CreaDirectorio() $GuardaArchivo() $lnsertaDatosAvisos() $insertaDatosBibliografia() OlnsertaDatos() +MuestraAvisos() +MuestraNotas() +MuestraBibliografia() V EnviaArchivo +EnviaDatos() CapturadorBaseDatos 1 v CapturadorArchivo QNewM etlod() 28 PONER AVISOS MODELO DE REQUERIMIENTOS Modelo de casos(Use Case) 1.- Use Case Poner Avisos profesor ponerAvisos Descripción de la transacción Poner Avisos en formade Caso: 1.-El profesor oprime el botón poner avisos en la pantalla del curso (ReciDato) 2.-El sistema muestra la pantalla de seleccionar avisos(Envia Archivo) 3.-El profesor oprime el botón seleccionar avisos 4.-El sistema despliega ventana de archivos 5.-EIprofesor selecciona el archivo correspondiente 6.-EI profesor oprime el botón enviar 7.-El sistema envia la información al servidor lis.uam.mx. 8.-Se ejecuta el use case recibe archivo. 9.-EI profesor oprime regresar al botón principal. 10.-Fin Modelo de casos(Use Case) 1.- Use Case Recibe Archivo <<usa>> R e c i b e A r c h iAvvoi s o s profesor Poner Descripción de la transacción Recibe Archivo en forma de Caso: 1.-El sistema obtiene los datos del archivo: -Clave de grupo -Clave de UEA -Nombre de archivo 2.-EIsistema obtiene el archivo 3.-EI sistema guarda el archivo en el subdirectorio: notas/cveuea/cvegpo/Nombre del archivo 4.- El sistema guarda los datos en la base de datos del aula virtual. Modelo de lnterfaz Diagrama de transición de Estados(Use Case Poner Avisos) Pantalla Mensaje A Enviar Seleccionar PonerAvisos > Pantalla Curso > Pantalla PonerAvisos A Seleccinar Archivo Fin Aceptar v V Pantalla Examrnar Modelo del Dominio del problema Diagrama de clases estáticas Avisos $.‘$ve UEA ‘GbCVe G ru op ,,wNom *. breArchivo I-! @D ia @Mes @/AñO 30 MODELO DE ANALISIS DlNAMlCO Use Case Poner Avisos Escenario Correcto simple 1 .-Paginadel curso CH-O1 Graficas por computadora se oprime el botón poner avisos se envia la CveUEA y CveGrupo 2.-el sistema muestra pagina poner avisos con el nombre del curso la clave del curso y la cve de la UEA. 3.-Se oprime botón seleccionar avisos 4.-El usuario elige la unidad A 5.-EI usuario elige prueba.txt 6.-Se envia el archivo prueba.txt con CveGrupo,CveUEA 7.-El sistema pone el archivo prueba.txt en notas/cveuea/cvegpo/ del servidor 8.-Se muestra la pantalla de envio satisfactorio con nombre de archivo,fecha,CveGrupo yCveUEA 9.-EI profesor oprime el botón regresar 10.-El sistema muestra la pantalla de curso en el del menu inicial. MODELO DE DISEÑO Diagrama de Colaboración (Use Case Poner Avisos) OlRec,Dalo CReclDato 1 PonerAusosO Profesar . I 4 E n u a D a l o s ( C v U E A , C v G ~ ~ p ~ , N ~ m b ~ ~ U E A . C v e P r o ~ e s10 or~ ) nseltadalos(Conhle~ase.datos) 3 Examlnarl) O i E n ~ a A u s o s, CEnMaAwsos ., ONCaplurarArch~w CCapturarArchlvo e '.. , ' ODCaoluradorBaseDatos CCavturadorBaseDatos 5 O b l e n V a l a i e s ( m u l i p a n e nparamelros) !, ONCavturadorArchlvo C-CavturadorArchiw 31 .- . ... """." l" ~ Diagrama de Secuencia (Use Case Poner Avisos) OlReciDato 0IEnviaAvis;os CEnviaAvisB CReclDato Profesor. profesor ONCaDturarArchivo ONCapturador ODCapturador CCapturarArchlvo Archivo BaseDatos 1' PonerAvisos() ___I. s. 2 ' sublrAwsos(CveUEA,CveGrupo.NombreUEA.CveProfesor) .,' 3: Examinar() ;> 4 EnvlaDatos(CveUEA.c3veGrupo,NombreUEA,CveProfesor) .._. ,.A 5 - ObtenValores(rnultlparse.nparametros) ,'..... 6 ObtenArchivo(mu1tlparser) ;:. 7 hayDatosNulos(datos.flleData) ... /* 8 creaDlrectono(Pathdlrector1o) ,?> 9 : guardaArchlvo(fileData,fileDirectorlo,fileName) .,:' 10 Insertadatos(ConlnterBase.datos) -.. ,.' 32 Diagrama de Cases Dinámicas (Use Case Poner Avisos) CapturarArchlvo ReciDato OS ubirAvisos() 7 QObtenValores() QObtenArchivo() OHayDatosNulos() OCreaDirectorio() QGuardaArchivo() '1 1 ~ ~ V EnviaAvisos CEnviaDatos() CapturadorArchivo QNewMethodO ~ CapturadorBaseDatos OlnsertaDatosAvisos() %nsertaDatosBibliografia() QlnsertaDatos() GMuestraAvisos() OMuestraNotas() 3MuestraBibllografa() PONER BIBLIOGRAFIA MODELO DE REQUERIMIENTOS Modelo de casos(Use Case) 1.- Use Case Poner Bibliografia ponerBibliografia profesor Descripción de la transacción Poner Bibliografia en forma de Caso: 1.-El profesor oprime el botón poner notas en la pantalla del curso (ReciDato) 2.-El sistema muestra la opcion de seleccionar Bibliografía (Envia Archivo) 3.-EI profesor oprime el botón seleccionar Bibliografia 4.-EI sistema despliega ventana de archivos 5.-EI profesor selecciona el archivo correspondiente 6.-EI profesor oprime el botón enviar 7.-El sistema envia la información al servidor lis.uam.mx. 8.-Se ejecuta el use case recibe archivo. 9.-EI profesor oprime regresar al botón principal. 1O.-Fin Modelo de casos(Use Case) 1.- Use Case Recibe Archivo <<usa>> profesor RecibeArchivo ponerBibliografia 34 Descripción de la transacción Recibe Archivo en formade Caso: 1.-El sistema obtiene los datos del archivo: -Clave de grupo -Clave de UEA -Nombre de archivo 2.-El sistema obtiene el archivo 3.-EI sistema guarda el archivo en el subdirectorio: notas/cveuea/cvegpo/Nombre del archivo 4.- El sistema guarda los datos en la base de datos del aula virtual. Modelo de lnterfaz Diagrama de transición de Estados(Use Case Poner Bibliografia) Pantalla Mensaje A Envial SeleccionarSubiBibliografia ~~ > Pantalla Curso 3 Pantalla Subir Bibliografia A Seleccinar Archivo Fin Aceptar V Modelo del Dominio del problema Diagrama de clases estáticas Bibliografia 'VbCveUEA '@CVeGrupo 'GiNombreArchivo V Pantalla Examinar MODELO DE ANALISIS DlNAMlCO Use Case Poner Bibliografia Escenario Correcto simple 1.-Pagina del curso CH-O1 Graficas por computadora se oprime el botón poner bibliografía se envia laCveUEA y CveGrupo 2.-el sistema muestra pagina poner bibliclgrafia con el nombre del curso la clave del curso y la cve de la UEA. 3.-Se oprime botón seleccionar notas 4.-EI usuario elige la unidad A 5.-EI usuario elige prueba.txt 6.-Se envia el archivo prueba.txt con CveGrupo,CveUEA 7.-EI sistema pone el archivo prueba.txt en notas/cveuea/cvegpo/ del servidor 8.-Se muestra la pantalla de envio satisfactorio con nombre de archivo,fecha,CveGrupo y CveUEA 9.-EI profesor oprime el botón regresar 10.-El sistema muestra la pantalla de curso en el del menu inicial. MODELO DE DISEÑO Diagrama de Colaboración (Use Case Poner Bibliografia) OReclDato CReclDato 1 PonerBlbllograflaO 3 ExarnlnarO OIEnMaBlblloqraRa CEnaaBlblloqraRa .. ONCapturCCapturz rArchlw :’ ODCapluradorBaSeDaloS CCapturadorBaseDatos 7 hayDalosNulos(datos.RleDala) 36 Diagrama de Secuencia (Use Case Poner Bibliografía) Profesor profesor OlReclDato CReclDato OlEnviaBlblioqrafla CEnbiaBiblioarafia ONCapturarArchlvo CCapturarArchivu ONCapturador Archivo ODCapturador BaseDatos 1 ’ PonerBlbllografia(j > : 2: subilBibliografia(C~UEA,CveGrupo.NombreUEA,C~Profesorj 3 Examinar() -.. ~,’ 4 EnuaDatos(CveUEA.CveGrupo,NombreUEA.CveProfesor) > :, 5 ObtenValores(multiparse,nparametros) I . I 2 6’ ObtenArchm(multlparser) ’..._ 7 hayDatosNulos(datos,fileData) -. _ d . 8: creaDlrectorio(Pathdirectorio) ~ > ; 9 guardaArchlvo(hleData,fileD!rectono,flleNamej ....2 10 Insertadatos(ConlnterBase.datos) .;’ Diagrama de Clases Dinámicas (Use Case Poner Bibliografía) CapturarArchivo Reci Dato 1 bSubirBibliografia() 7 i;Obten'\/alores() +ObtenArchivo() i;HayDatosNulos() wreaDirectorio() $GuardaArchivo() CapturadorBaseDatos ~ Olnserta DatosAvisos() ainsertaDatosBibliografia() Olnserta Datos() OMuestraAvisos() i;MuestraNotas() OMuestraBibliografia() V Enviabibliografia 'd OEnGaDatosO ~ CapturacorArchivo ONewMothod() Código // ........................................ .... _ . _ _ . .... . . .................................. package proyectoCSH.upload; . . ... ... EnviaArch~vo.]ava import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class EnviaArchivo extendsHttpServlet { //Initialize global variables public void init(Serv1etConfig config) throws ServletException { super.init(config); 1 //Process the HTTP Post request public void service(HttpServ1etRequest request, HttpServletResponse response) throws ServletException, IOException { //nombre de la uea String NombreUEA = try { NombreUEA = request.getParameter("NombreUEA").toUpperCase(); } catch (Exception e) { e.printStackTrace(); } //clave de la uea String CveUEA = ""; try { CveUEA = request.getParameter("CveUEA'); } catch (Exception e) { e.printStackTrace(); } //clave del grupo String CveGpo = ""; try { CveGpo = request.getParameter("CveGpo").toUpperCase(); } catch (Exception e) { e.printStackTrace(); } //clave del profesor String Cveprofesor = try { Cveprofesor = request.getParameter("CveProf"); } catch (Exception e) { e.printStackTrace(); } response.setContentType("text/html"); Printwriter out = new Printwriter (response.getOutputStream()); out.println("<htmI>"); I"'; 'I1'; out.println("<head><title>EnviaArchivo</title></head>"); out.println("<body background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/f029.jpg~"); out.println("<p align=left><font size=3>UEA : "+CveUEA+"</font></p>"); out.println("<p align=left><font size=3>GRUPO : "+CveGpo+"</font></p>''); out.println("<p align=center><font size=5~<strong~"+NombreUEA+"~/strong~~/font>~/p~"); out.println("<p align=center><font size=3><strong>Bienvenido Profesor</strong></font></p>"); out.println("<p>Envie su Archivo Desde aquí,elija el archivo"); out.println("deseado con el botón </p>"); out.println("<p>Examinar(Browse) y oprima Enviar.</p>"); out.println("<p>si no puede ver el botón examinar su navegador no puede"); out.println("enviar archivos.</p>"); out.println("<form ENCTYPE=\"multipart/form-data\" action=\"http://localhost:8080/examples/servlet/proyectoCSH.upload.CapturarArchivo\""); out.println("method=\"post\">"); out.println("<input type=\"hidden\" name=\"CveGpo\" vaIue=\""+CveGpo+"\">"); out.println("<input type=\"hidden\" name=\"CveUEA\" value=\""+CveUEA+"\">"); //out.println("<BR><BR> Nombre del archivo<input type=\"text\" name=\"ref\">"); //out.println("<input type=Y'hidden\" name=\"NombreUEA\" value=\""+NombreUEA+Y">"); //out.println("<input type=\"hidden\" name=\"CveProf\" value=\""+Cveprofesor+"Y'>''); out.println("<BR><BR>Descripcion del achivo <textarea Name =Description Rows =2 Cols = 50 Wrap = virtual></textarea>"); out.println("<BR><BR><lNPUT NAME=\"archivo\" TYPE=\"file\">"); out.println("<input type=\"submit\" value=';'Enviar datos\">"); out.println("</form>"); out.println("</body></htmb"); out.close(); 1 //Get Servlet information public String getServletlnfo() { return "proyectoCSH.upload.EnviaArchivo Information"; I // ........................................................................................... fin de listado EnviaArchivo.java 4o // ........................ ... ....... ............. ....CapturarArchivo.java /* este servlet es el queguarda el archivo en el servidor*/ package proyectoCSH.upload; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import com.oreilly.servlet.multipart.*; import java.sql.*; public class CapturarArchivo extends HttpServlet { String DBurllnterBase = "jdbc:odbc:Aula-Virtual"; // Nombre de la base de datos en ODBC " //"jdbc:odbc:Aula-Virtual" String UserName="SYSDBA"; //Usuario String Password="masterkey";// Password String Driver="sun.jdbc.odbc.JdbcOdbcDriver";//Drivers de ODBC Connection conlnterBase; // Este metodo es el que se encarga de establecer // la conexion con la base de datos public void init(Serv1etConfig config) throws ServletException { super.init(config); try { Class.forName(Driver); System.out.println("paso el driver"); conlnterBase=DriverManager.getConnection(DBurlInterBase,UserName,Password); System.out.println("iniciando conexion a la base de datos interbase"); 1 catch( Exception e ) { System.err.println(e.getMessage()); System.err.println("error en el init()"); }// fin del metodo init() ...................................................................... / // Se cierra la conexion con la base de datos public void destroy() { super.destroy(); System.out.println("cerrando conecciones ...") ; try { conlnterBase.close(); } catch( SQLException ex ) { System.err.println("no se puede cerrar la conexion, error en destroy"); System.err.println("ex.getMessagge()"); 1 }// fin del metodo destroy public void doPost(HttpServ1etRequest request, HttpServletResponse response) throws IOException, ServletException { MultipartParser mp = new MultipartParser(request, 7 * 1024 * 1024); byte[] fileData = null; response.setContentType("text/htmI"); Printwriter out = response.getWriter(); out.println("<html>"); out.println("<HEAD><TITLE>Capturandoarchivo</TITLE></HEAD>"); out.println("<body background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/fO29.jpg~"); out.println("<p>lNlClANDO UPLOAD "); try{ CapturadorArchivo ca = new CapturadorArchivo(out); String datos[] = ca.obtenValores(3,mp); out.println("<p>Datos recibidos:"); out.println("<p> Grupo = "+datos[O]); = "+datos[l]); out.println("<p> UEA out.println("<p> description= "+datos[2]): fileData=ca.obtenArchivo(mp); out.println("<p> Archivo = "+ca.FileNanle); if (ca.hayDatosNulos(datos,fileData)==true){ out.println("<br><br><h3>por favor regrese a la pagina anterior"); out.println("<br><br> y llene todos los campos del formulario"); out.println("<br><br> para que se puedan guardar las notas</h3>"); }else{ String pathDirectorio="E:\\EducacionDistancia\\~~ublic~html\\notas\~'+datos[l]+"\\"+datos[O]; ca.creaDirectorio(pathDirectorio); try{ CapturadorBaseDatos cbd = new CapturadorBaseDatos(out); cbd.insertaDatos(conlnterBase,datos,ca.FileName.replace(' ','-')); ca.guardaArchivo(fileData,pathDirectorio,ca.FileName.replace(' out.println("<p><font color=\"#OOOOFF\" size=\"2\"><em><strong>su archivo fue enviado exitosamente</strong></em></font></p>"); out.println("<p><font color=\"#OOOOFF\" size=\"2\"~<em><strong>Desdeeste momento esta disponible en la WEB<strong></emx/font></p>"); }catch(SQLException ex) { System.out.println("<br>\n--- SQLException caught ---\n"); while (ex != null) { out.println("<br>" + ex.getErrorCode 0 ) ; out.println("<br>Posiblemente ya existe un archivo con el mismo nombre,"); out.println("<br>Cambie el nombre del archivo e intente nuevamente"); out.println("<br>Si el problema persiste, consulte con el Administrador de servicios"); System.out.println("<br>Message: " + ex.getMessage 0 ) ; System.out.println("<br>SQLState: " + ex.getSQLState 0 ) ; System.out.println("<br>ErrorCode: " + ex.getErrorCode 0 ) ; ex = ex.getNextException(); out.println("<br>"); ','-I)); 1 //ca.guardaArchivo(fileData,pathDirectoi.io,ca.FileName); 1 42 }catch (Exception ex) { out.println("<p>" + ex.toString()); 1 out.println("</BODY>"); out.println("</HTML>"); }// del doPost }// de la clase Capturar archivo // .......................................... Fin de CapturarArchivo.java 11_....._...._..._.. .... ................ ...... ....CapturadorArchivo.java package proyectoCSH.upload; import java.io.*; import com.oreilly.servlet.multipart.*; I** esta clase implementa metodos para el manejo del stream que recibimos del formulario *I public class CapturadorArchivo{ Printwriter out; public String FileName; long tamaño; I** el constructor del objeto recive el Printwriter para poder mandar mensajes en la pagina html *I public CapturadorArchivo(PrintWriterPO) { out = new PrintWriter(po); FileName =""; tamaño=O; public CapturadorArchivo(Stringname, IPrintWriter PO, int tam ) { out = new PrintWriter(p0); FileName =name; tamaño=tam; 1 I** el metodo hayDatosNulos te regresa ver'dadero si algunos de los datos que se enviaron es nulo porque el usuario no lleno algun campo *I public boolean hayDatosNulos(String clatos[],byte[] fileData) { boolean key=false; int j; for(int i =O; i<datos.length; i++) { if( datos[i].length() == O ) { out.println("<p>hay dato(S) nulo(S)"); key=true; 1 1 if(fileData==null) 44 key=true; if(tamaño==O) key=true; return key; 1 I** este metodo regresa los valores que no sean el archivo en un arreglo de tamaño nParametros de cadenas utilizando un objeto MultipartParser *I public String[] obtenvalores (int nParametros, MultipartParser mp)throws IOException{ String datos[]= new String[nParametros]; int j=O; Part p; while(j < nparametros) { p = mp.readNextPart(); if (p instanceof Parampart){ datoslj] = ((Parampart) p).getStringValue(); j++; 1 1 return datos; 1 I** Este metodo regresa un arreglo de bytes que contiente al archivo, utilizando un objeto MultipartParser *I public byte[] obtenArchivo (MultipartParser mp) throws IOException{ byte fileData[]= null; Part p = mp.readNextPart(); while(p != null) { if (p instanceof FilePart) { FileName=((FilePart) p).getFileName(); if( FileName!=null){ ByteArrayOutputStream ba = new ByteArrayOutputStream(); tamaño=((FilePart) p).writeTo(ba); fileData = ba.toByteArray(); 1 I p = mp.readNextPart(); 1 return fileData; 1 I** Este metodo crea un directorio en pathDir y si ya existe no hace nada, regresa falso si por alguna razon no se puede crear el directorio *I public boolean creaDirectorio (String pathDir) throws IOException{ /I buscamos el directorio boolean key= true; File directorio = new File(pathDir); if(directorio.isDirectory()) out.println("<p>ya existe el directorio"); else{ out.println("<br>creando el directorio"); if (key=directorio.mkdirs()) out.println("<br>directorioscreado"); else out.println("<br>directorios no creado"); 1 return key; } I** Este metodo guarda en una archivo de nombre fileName y de path pathDir lo contenido en fileData */ public void guardaArchivo(byte[] fileData, String pathDir, String fileName ) throws IOException{ out.println("cbr>"+pathDir); out.println("<br>"+fileName); if (fileData != null){ String path = new String(pathDir+"\\"+fileName); out.println("<br>esta es la ruta completa :"); out.println("<br>"+path); FileOutputStream fos = new FileOutputStream(path,true); 46 out.println("<br> se crea fos"); fos.write(fileData); out.println("<br> se escribe en fosfileData"); fos.flush(); out.println("<br> se vacia el bufer"); fos.close(); out.println("<br> se cierra el archivo"); 1 else out.println("<br> fileData = NULL"); 1 1 // ............................................ fin de CapturadorArchivo.java 11......... ......... .._...........................CapturadorBaseDatos.java package proyectoCSH.upload; import java.sql.*; import java.io.*; import java.util.*; public class CapturadorBaseDatos { Printwriter out; I** Constructor que necesita Printwriter para escribir en la pagina html *I public CapturadorBaseDatos(PrintWriterPO){ out = new PrintWriter(p0); 1 I** Este metodo se encarga de insertar los datos del archivo almacenado en el servidor en la tabla Avisos2 de la base de datos del aula virtual acepta los parametros a insertar en un arreglo, realiza la senterlcia con el objeto con *I public void insertaDatosAvisos( Connection con, String datos[], String FileName) { throws IOException,SQLException,NumberFormatException Preparedstatement pstm = con.prepareStatement("lNSERTINTO AVISOS2"+ "(CVEUEA,CVEGRUPO,NOMBREARCHIVO,DIA,MES,A)"+ "VALUES(?,?,?,?,?,?)"); pstm.setlnt(1,Integer.valueOf(datos[l]).intValue()); pstm.~etString(2,datos[O]); pstm.setString(3,FileName); pstm.setlnt(4,Integer.valueOf(datos[2]).intValue()); pstm.setlnt(5,Integer.valueOf(datos[3]).intValue()); pstm.setlnt(6,Integer.valueOf(datos[4]).intValue()); pstm.executeUpdate(); 1 I** Este metodo se encarga de insertar los datos del archivo almacenado en el servidor en la tabla BlBLlOGRAFlA de la base de datos del aula virtual acepta los parametros a insertar en un arreglo, realiza la sentencia con el objeto con *I public void insertaDatosBibliografia( Connection con, String datos[], String FileName) throws IOException,SQLException,NumberFormatException{ Preparedstatement pstm = con.prepareStatement("lNSERT INTO BIBLIOGRAFIA"+ 48 "(CVEUEA,CVEGRUPO,NOMBREARCHIVO)"+ "VALUES(?,?,?)"); pstm.setlnt(1 ,Integer.valueOf(datos[l]).intValue()); pstm.~etString(2,datos[O]); pstm.setString(3,FileName); pstm.executeUpdate(); 1 /** Este metodo se encarga de insertar los datos del archivo almacenado en el servidor en la tabla notas de la base de datos del aula virtual acepta los parametros a insertar en un arreglo, realiza la sentencia con el objeto con */ public void insertaDatos( Connection con, String datos[], String FileName) throws IOException,SQLException,NumberFormatException{ Preparedstatement pstm = con.prepareStatement("lNSERT INTO NOTAS"+ "(CVEUEA,CVEGRUPO,NOMBREARCHIVO,DESCRIPCION)"+ "VALUES(?,?,?,?)"); pstm.setlnt(1 ,Integer.valueOf(datos[l]).intValue()); pstm.~etString(2,datos[O]); pstm.setString(3,FileName); pstm.~etString(4,datos[2]); pstm.executeUpdate(); 1 public void MuestraAvisos( String path , Connection con, String CveGpo, String CveUEA) { throws IOException,SQLException,NumberFormatException String NombreArchivo=""; con.prepareStatement("SELECT Preparedstatement pstm NOMBREARCHIVO,DIA,MES,A FROM AVISOS2 WHERE CVEGRUPO= ? AND CVEUEA= ? "); Preparedstatement pstmdel= con.prepareStatement(" DELETE FROM AVISOS2 WHERE NOMBREARCHIVO = ? "); pstm.setString(1 ,CveGpo); int claveuea=lnteger.valueOf(CveUEA).intValue(); pstm.setlnt(2,claveuea); Resultset rs = pstm.executeQuery(); Calendar cad = Calendar.getlnstance(); Calendar hoy = cad.getlnstance(); /* copia de la variable */ while (rs.next()) { NombreArchivo=rs.getString("NOMBREA.RCHIVO"); int dia=rs.getlnt("DIA"); int mes=rs.getlnt("MES")-I; int año=rs.getlnt("A"); cad.set(año,mes,dia); if( cad.after(hoy) 11 cad.equals(hoy) ) { // out.println("<br>vigencia: "+dia+" "+mes+" "+año+" "); out.println(" <a href=\"htt~://infocbi.uam.mx:~5/A~isos/'+~~veUEA+''/'+CveGpo+''/'+NombreArch~vo+"~'~"+ NombreArchivo+"</a>"); 1 else c // si la caducidad es anterior a hoy, entonces borra el archivo File temp = new File(path+NombreArchivo); //out.println("<TR> nombre del archivo a borrar"); //out.println("<TR>"+path+"<TR>"+ NombreArchivo); boolean qp=temp.delete(); //out.println("<TR>borrado = 'l+qp ); // y se borra de labase de datos// pstmdel.setString(1 ,NombreArchivo); pstmdel.executeUpdate(); 1 1 out.println("</table>"); 1 /** este metodo muestra las notas existentes en la base de datos para la clave de grupo y la clave de uea proporcionada */ public void MuestraNotas( Connection can, String CveGpo, String CveUEA) { throws IOException,SQLException,NumberFormatException System.out.println("enre al MuestraNotas"); String NombreArchivo,Descripcion=""; System.out.println("enre al MuestraNotas variables"); = con.prepareStatement("SELECT NOMBREARCHIVO, Preparedstatement pstm DESCRIPCION FROM NOTAS WHERE CVEGRUPO= ? A N D CVEUEA= ? "); System.out.println("PreparedStatement pstm ="); O pstm.setString(1 ,CveGpo); System.out.println("pstm.setString(1 ,CveGpo);"); int claveuea=lnteger.valueOf(CveUEA).intValue(); System.out.println("int claveuea=lnteger.valueOf(CveUEA).intValue();"); System.out.println("int claveuea= "+claveuea); pstm.setlnt(2,claveuea); System.out.println("pstm.setlnt(2,claveuea);"); Resultset rs = pstm.executeQuery(); System.out.println("ResuItSet rs = pstm.executeQuery();"); out.println("<table border=Y'2Y' bgcolor=Y'#FFFFFF\" bordercolordark=\"#OOOOOOY' bordercolorlight=\"#OOOOOOY'~"); while (rs.next()) { bordercolor=Y'#OOOOOOY' NombreArchivo=rs.getString("NOMBREARCHlVO"); Descripcion=rs.getString("DESCRIPCION"); /* <table border="2"> <tr> <td>&nbsp;</td> <td>&nbsp;</td> </tr> </table> */ out.println("<TR>"); out.println("<TD>&nbsp;&nbsp;<a href=~'http://infocbi.uam.mx:85/notas/"+CveUEA+"/"+CveGpo+"/"+NombreArchivo+"Y'~"+ NombreArchivo+"</a>&nbsp;&nbsp;</TD>"); out.println("~TD>&nbsp;"+Descripcion+"&nbsp;~~D~"); } out.println("</table>"); } I** este metodo muestra las notas existentes en la base de datos para la clave de grupo y la clave de uea proporcionada */ public void MuestraBibliografia( Connection con, String CveGpo, String CveUEA) throws IOException,SQLException,NumberFormatException{ System.out.println("enre al MuestraBibliografia"); String NombreArchivo = I"'; System.out.println("enre al MuestraNotas variables"); Preparedstatement pstm = con.prepareStatement("SELECTNOMBREARCHIVO FROM BIBLIOGRAFIA WHERE CVEGRUPO= ? A N D CVEUEA= ? "); System.out.println("PreparedStatement pstm ="); pstm.setString(1 ,CveGpo); System.out.println("pstm.setString(1 ,CveGpo);"); int claveuea=lnteger.valueOf(CveUEA).intValue(); System.out.println("int claveuea=lnteger.valueOf(CveUEA).intValue();"); System.out.println("int claveuea= "+claveuea); pstm.setlnt(2,claveuea); System.out.println("pstm.setlnt(2,claveue~~);"); Resultset rs = pstm.executeQuery(); System.out.println("ResultSet rs = pstm.executeQuery();"); out.println("<table border=Yt2Y' bgcolor=Y'#FFFFFFY' bordercolordark=Y'#OOOOOOY'bordercolorlight=\"#OOOOOOY'~"); while (rs.next()) { bordercolor=Y'#OOOOOOY' NombreArchivo=rs.getString("NOMBREP,RCHlVO"); /* <table border="2"> <tr> <td>&nbsp;</td> <td>&nbsp;</td> </t r> </table> *I 1 // ........................................ fin del CapturadorBaseDatos.java 52 I/........ . . . . . . . .. . ... . ... . . . . .. .... ... . . . . .. . . . .RevisaNotas.java package proyectoCSH.upload; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import java.sql.*; public class RevisaNotas extends HttpServlet { //Initialize global variables String DBurllnterBase = "jdbc:odbc:Aula-Virtual-Prueba"; String UserName="SYSDBA'; //Usuario String Password="masterkey";// Password String Driver="sun.jdbc.odbc.JdbcOdbcDriver";//Drivers de ODBC Connection conlnterBase; public void init(Serv1etConfig config) throws ServletException { super.init(config); try { Class.forName(Driver); System.out.println("paso el driver"); conlnterBase=DriverManager.getConnection(DBurlInterBase,UserName,Password); conexion a la base de datos interbase"); System.out.println("iniciando 1 catch( Exception e ) { System.err.println(e.getMessage()); System.err.println("error en el init()"); }// fin del metodo init() ...................................................................... / // Se cierra la conexion con la base de datos public void destroy() { super.destroy(); System.out.println("cerrando conecciones try { conlnterBase.close(); } catch( SQLException ex ) { System.err.println("no se puede cerrar la conexion, error en destroy"); System.err.println("ex.getMessagge()"); ...'I); 1 }// fin del metodo destroy //Service the request public void service(HttpServ1etRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); Printwriter out = new Printwriter (response.getOutputStream()); out.println("<htmI>"); out.println("<head><title>zona de descarga</title></head>"); out.println("<body background=http://infocbi.uam.mx:85/Edu~cDistancia/PrincipalPag/fO29.jpg~"); //nombre de la uea String NombreUEA = try { NombreUEA = request.getParameter("NombreUEA'); } catch (Exception e) { e.printStackTrace(); } //clave de la uea String CveUEA = ""; try { CveUEA = request.getParameter("CveUEA"); } catch (Exception e) { e.printStackTrace(); } //clave del grupo String CveGpo = '"'; try { CveGpo = request.getParameter("CveGpo"); } catch (Exception e) { e.printStackTrace(); } //clave del profesor String Cveprofesor = ""; try { Cveprofesor = request.getParameter("CveProf"); } catch (Exception e) { e.printStackTrace(); } out.println("<p align=left><font size=3>UEA : "+CveUEA+"</font></p>"); out.println("<p align=left><font size=3>GRUPO : "+CveGpo+"</font></p>"); out.println("<p align=center><font size=3~~strong~"+NombreUEA+"~/strong>~/p~"); out.println("<p align=center><font size=2><strong> Notas disponibles del curso</strong></font></p>"); out.println("<p><font size=2>desde aqui puedes descargar tus archivos para el curso</font></p>"); 'I"; try{ CapturadorBaseDatos cbd = new CapturadorBaseDatos(out); cbd.MuestraNotas(conlnterBase,CveGpo,CveUEA); }catch(SQLException ex) { out.println("<br>\n--- SQLException caught ---\n"); while (ex != null) { out.println("<br>POR MOMENTO EL NO SE PUEDEN MOSTRAR LOS ARCHIVOS"); System.out.println("<br>Message: " + ex.getMessage 0 ) ; System.out.println("<br>SQLState: " + ex.getSQLState 0 ) ; System.out.println("<br>ErrorCode: " + ex.getErrorCode 0 ) ; out.println("<br>ErrorCode: + ex.getErrorCode 0 ) ; ex = ex.getNextException(); System.out.println("<br>error"); I' 1 1 out.println("</body></htmb"); out.close(); 54 //Get Servlet information public String getServletlnfo() { return "proyectoCSH.upload.RevisaNotas Information"; 1 1 // ........................................... fin del ReviasNotas.java // ........................................................................ // ......................... Fin del package upload package avisos2 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EnviaAvisos.java package proyectoCSH.Avisos2; import proyectoCSH.upload.*; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class EnviaAvisos extendsHttpServlet { //Initialize global variables public void init(Serv1etConfig config) throws ServletException { super.init(config); 1 //Process the HTTP Post request public void service(HttpServ1etRequest request, HttpServletResponse response) throws ServletException, IOException { //nombre de la uea String NombreUEA = ""; try { NombreUEA = request.getParameter("NombreUEA").toUpperCase(); } catch (Exception e) { e.printStackTrace(); } //clave de la uea String CveUEA = 'I"; try { CveUEA = request.getPararneter("CveUEA'); } catch (Exception e) { e.printStackTrace(); } //clave del grupo String CveGpo = ""; try { CveGpo = request.getParameter("CveGpo").toUpperCase(); } catch (Exception e) { e.printStackTrace(); } //clave del profesor String Cveprofesor = ""; try { Cveprofesor = request.getParameter("CveProf"); } catch (Exception e) { e.printStackTrace(); } response.setContentType("text/html"); Printwriter out = new Printwriter (response.getOutputStream()); Calendar fecha = Calendar.getlnstance(); int dia = fecha.get(fecha.DAY-OF-MONTH); int mes = fecha.get(fecha.MONTH)+l; int año = fecha.get(fecha.YEAR); out.println("<html>"); out.println("<head><title>EnviaAvisos</title></head>"); out.println("<body background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/fO29.jpg~ out.println("<p align=left><font size=3>"+CveUEA+"</font>dp>"); out.println("<p align=left><font size=3>"+CveGpo+"</font>~/p>"); out.println("<p align=center><font size=5~~strong~"+NombreUEA+"~/stron~~~~/font~~/p~"); size=3><strong>vienvenido out.println("<p align=center><font profesor</strong></font></p>"); out.println("<p>en este espacio puede"); out.println("enviar avisos de su curso con una fecha de vigencia </p>"); >'I); out.println("<form action=\"http://infocbi.uam.mx:85/servlet/proyectoCSH.Avisos2.CapturarAvisos~"'); out.println("method=\"postY'>"); out.println("<input type=\"hidden\" name=\"CveGpo\" value=\""+CveGpo+"\">"); out.println("<input type=\"hidden\" name=\"CveUEA\" value=\""+CveUEA+"\">"); /*datos del aviso*/ out.println("<BR>vigencia&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"); out.println("dia <input type=\"text\" name--\"d\" value=\""+dia+"\" size=\"2\">"); out.println("mes <input type=\"text\" namc?=\l'm\l' value=Y"'+mes+''Y'size=\"2\">"); out.println("año <input type=\"text\" name=\l'a\" value=\""+ario+"\" size=\"4\">"); out.println("<BR><BR>Nombre del aviso:&nbsp;&nbsp;&nbsp;"); out.println("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"); out.println("&nbsp;<input type=\"text\" name=\"nombre\" >"); out.println("<BR><BR><p>Texto del aviso:</p>"); out.println("<textarea Name =contenido Rows =IO C o k = 50"); 56 out.println("Wrap = virtual></textarea>"); out.println("<BR><BR><input type=\"submit\" value=\"Enviar\">"); out.println("<BR><BR>"); out.println("</form>"); out.println("</body></htmI>"); out.close(); 1 //Get Servlet information public String getServletlnfo() { return "proyectoCSH.upload.EnviaArchivo Information"; 1 1 //fin del ........................................................................... ... ......... EnviaAvisos.java 57 // ...................... ......... CapturarAvisos.java /* este servlet es el que guarda el archivo en el servidor*/ package proyectoCSH.Avisos2; import proyectoCSH.upload.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; //import com.oreilly.servlet.multipart.*; import java.sql.*; public class CapturarAvisos extends HttpServlet { String DBurllnterBase = "jdbc:odbc:Aula--Virtual"; // Nombre de la base dedatos en ODBC " /l"jdbc:odbc:Aula-Virtual" String UserName="SYSDBA'; //Usuario String Password="cbi208399";// Password de ODBC String Driver="sun.jdbc.odbc.JdbcOdbcDriver";//Drivers Connection conlnterBase; // Este metodo es el que se encarga de establecer // la conexion con la base de datos public void init(Serv1etConfig config) throws ServletException { super.init(config); try { Class.forName(Driver); System.out.println("paso el driver"); conlnterBase=DriverManager.getConnection(DBurlInterBase,UserName,Password); System.out.println("iniciando conexion a la base de datos interbase"); 1 catch( Exception e ) { System.err.println(e.getMessage()); System.err.println("error en el init()"); }// fin del metodo init() ....................................................................... / // Se cierra la conexion con la base de datos public void destroy() { super.destroy(); System.out.println("cerrando conecciones ..."); try { . conlnterBase.close(); } catch( SQLException ex ) { System.err.println("no se puede cerrar la conexion, error en destroy"); System.err.println("ex.getMessagge()"); }// fin del metodo destroy public void doPost(HttpServ1etRequestrequest, HttpServletResponse response) 5s throws IOException, ServletException { //clave del grupo String datos[]= new String[nParametros]; String datos[] = new String[7]; //String CveGpo = ""; try { datos[O]= request.getParameter("CveGpo").toUpperCase(); } catch (Exception e) { e.printStackTrace(); } //clave de la uea //String CveUEA = ""; try { datos[l] = request.getParameter("CVeUEA"); } catch (Exception e) { e.printStackTrace(); } //d ia //String dia=""; try { datos[2] = request.getParameter("d"); } catch (Exception e) { e.printStackTrace(); } //mes //String mes = ""; try { datos[3] = request.getParameter("m"); } catch (Exception e) { e.printStackTrace(); } //año //String año = ""; try { datos[4] = request.getParameter("a"); } catch (Exception e) { e.printStackTrace(); } //nombre //String nombre = ""; try { datos[5] = request.getParameter("nombre"); } catch (Exception e) { e.printStackTrace(); } //contenido //String contenido = ""; try { datos[6] = request.getParameter("contenido"); } catch (Exception e) { e.printStackTrace(); } response.setContentType("text/htmI"); Printwriter out = response.getWriter(); out.println("<html>"); out.println("<HEAD><TITLE>capturando aviso</TITLE></HEAD>"); out.println("<body background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/fO29.jpg~"); try { out.println("<p>Datos recibidos:"); = "+datos[O]); out.println("<p> Grupo = "+datos[l]); out.println("<p> UEA = "+datos[2]); out.println("<p> dia = "+datos[3]); out.println("<p> mes = "+datos[4]); out.println("<p> año out.println("<p> nombre = "+datos[5]); out.println("<p> contenido = "+datos[6]); /* se guarda el contenido en un archivo llamado nombre*/ /* se guarda en la base de datos el nombre del achivo el grupo, la uea y la vigencia*/ CapturadorArchivo ca = new CapturadorArchivo(datos[5],out,datos[6].length()); byte[] fileData = datos[6].getBytes(); //ileData=ca.obtenArchivo(mp); //ut.println("<p> Archivo = "+ca.FileName); if (ca.hayDatosNulos(datos,fileData)==true){ out,println("<br><br><h3>por favor regrese a la pagina anterior"); out.println("<br><br> y llenetodos los campos del formulario"); out.println("<br><br> para que se puedan guardar las notas</h3>"); }else{ String pathDirectorio="E:\\EducacionDistancia\\public~html\\Avisos\~'+datos[l]+"\\"+datos[O]; //String pathDirectorio="C:\\jswdk1.0.1\\examples\\EducacionDistancia\\public~html\\Avisos\~'+datos[l]+"\\"+datos[O]; ca.creaDirectorio(pathDirectorio); try{ CapturadorBaseDatos cbd = new CapturadorBaseDatos(out); cbd.insertaDatosAvisos(conlnterBase,datos,ca.FileName.replace(' ca.guardaArchivo(fileData,pathDirectol-io,ca.FileName.replace(' out.println("<p><font color=\"#OOOOFF'I" size=\"2\">~em>~strong>su aviso fue enviado exitosamente</strong></em></font>4p>"); out.println("<p><font color=\"#OOOOFF\." size=\"2\"><em><strong>Desde este momento esta disponible <strong></em></font></~~>"); }catch(SQLException ex) { System.out.println("<br>\n--- SQLException caught ---\n"); while (ex != null) { out.println("<br>" + ex.getErrorCode 0 ) ; out.println("<br>Posiblemente ya existe un archivo con el mismo nombre,"); out.println("<br>Cambie el nombre del archivo e intente nuevamente"); out.println("<br>Si el problema persiste, consulte con el Administrador de servicios"); System.out.println("<br>Message: " + ex.getMessage 0 ) ; System.out.println("<br>SQLState: " + ex.getSQLState 0 ) ; System.out.println("<br>ErrorCode: " + ex.getErrorCode 0 ) ; ex = ex.getNextException(); out.println("<br>"); ','-I)); ','-I)); 1 //ca.guardaArchivo(fileData,pathDirectorio,ca.FileName); 1 1 }catch (Exception ex) { out.println("<p>" + ex.toString()); out.println("</BODY>"); out.println("</HTML>"); }// del doPost }// de la clase Capturararchivo 60 // ............................. fin del..CapturarAvisos.java 11... . . . . . . . . . . . . . . . .RevisaAvisos.java package proyectoCSH.Avisos2; import proyectoCSH.upload.*; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import java.sql.*; public class RevisaAvisos extends HttpServlet { //Initialize global variables String DBurllnterBase = "jdbc:odbc:Aula-Virtual"; String UserName="SYSDBA"; //Usuario String Password="cbi208399";// Password String Driver="sun.jdbc.odbc.JdbcOdbcDriver";//Drivers de ODBC Connection conlnterBase; pathDirectorio="C:\\jswdk//String 1.O. 1\\examples\\EducacionDistancia\\public_hvisos\\"; public void init(Serv1etConfig config) throws ServletException { super.init(config); try { Class.forName(Driver); System.out.println("paso el driver"); conlnterBase=DriverManager.getConnection(DBurllnterBase,UserName,Password); System.out.println("iniciando conexion a la base de datos interbase"); 1 catch( Exception e ) { System.err.println(e.getMessage()); System.err.println("error en el init()"); 1 }// fin del metodo init() ...................................................................... / I/ Se cierra la conexion con la base de datos public void destroy() { super.destroy(); System.out.println("cerrando conecciones ..."); try { conlnterBase.close(); } catch( SQLException ex ) { System.err.println("no se puede cerrar la conexion, error en destroy"); System.err.println("ex.getMessagge()"); 1 }// fin del metodo destroy //Service the request public void service(HttpServ1etRequestrequest, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/htmI"); Printwriter out = new Printwriter (response.getOutputStream()); out.println("<html>"); out.println("<head><title>AVISOS</title></head>"); out.println("<body background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/fO29.jpg~"); //nombre de la uea String NombreUEA = ""; try { NombreUEA = request.getParameter("NombreUEA'); } catch(Exceptione) { e.printStackTrace(); } //clave de la uea String CveUEA = try { CveUEA = request.getParameter("CveUEA"); } catch (Exception e) { e.printStackTrace(); } //clave del grupo String CveGpo = ""; try { CveGpo = request.getParameter("CveGpo"); } catch (Exception e) { e.printStackTrace(); } //clave del profesor String Cveprofesor = try { Cveprofesor = request.getParameter("CveProf"); } catch (Exception e) { e.printStackTrace(); } out.println("<p align=left><font size=3:.UEA : "+CveUEA+"</font></p>"); out.println("<p align=left><font size=3:.GRUPO : "+CveGpo+"</font></p>"); out.println("<p align=center><font size=3~~strong~"+NombreUEA+"~/strong~~/font~~/p~"); out.println("<p align=center><font size=2><strong> del Avisos curso</strong></font></p>"); //out.println("<p><font size=2>desde aqui puedes ver o descargarlabibliogfiadel curso</font></p>"); '"I; 'I1'; try { CapturadorBaseDatos cbd = new CapturadorBaseDatos(out); String pathDirectorio="E:\\EducacionDistancia\\pubIic-htmI\~v;sos\~'+CveUEA+"\~'+CveGpo+"\\"; //String pathDirectorio "C:\\jswdk1.O.l\\examples\\EducacionDistancia\\public_html\\Avisos\\"+CveUEA+"\\"+CveGpo+"\\"; cbd.MuestraAvisos(pathDirectorio,conlnterBase,CveGpo,CveUEA); }catch(SQLException ex) { out.println("<br>\n--- SQLException caught ---\n"); while (ex != null) { out.println("<br>POR EL MOMENTO NO SE PUEDEN MOSTRAR LOS ARCHIVOS"); out.println("<br>Message: " + ex.getMessage 0 ) ; 62 out.println("<br>SQLState: " + ex.getSQLState 0 ) ; System.out.println("<br>ErrorCode: " + ex.getErrorCode 0 ) ; out.println("<br>ErrorCode: " + ex.getErrorCode 0 ) ; ex = ex.getNextException(); System.out.println("<br>error"); 1 1 out.println("</body></html>"); out.close(); 1 //Get Servlet information public String getServletlnfo() { return "proyectoCSH.upload.RevisaNotas Information"; 1 1 // ........................... fin del RevisaAvisos.java // ......................... fin del package avisos2.java // _._..........._......p ackage proyectoCSH.bibliografia // ..........__......... archivo EnviaBibliografia.java package proyectoCSH.bibliografia; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class EnviaBibliografia extends HttpServlet { //Initialize global variables public void init(Serv1etConfig config) throws ServletException { super.init(config); 1 //Process the HTTP Post request public void service(HttpServ1etRequest request, HttpServletResponse response) throws ServletException, IOException { //nombre de la uea String NombreUEA = try { NombreUEA = request.getPal-ameter("NombreUEA").toUpperCase(); } catch (Exception e) { e.printStackTrace(); } //clave de la uea String CveUEA = try { CveUEA = request.getParameter("CveUEA"); } catch (Exception e) { e.printStackTrace(); } //clave del grupo String CveGpo = try { CveGpo = request.getParameter("CveGpo").toUpperCase(); } catch (Exception e) { e.printStackTrace(); } //clave del profesor String Cveprofesor = ""; try { Cveprofesor = request.getPa.rameter("CveProf"); } catch (Exception e) { e.printStackTrace(); } response.setContentType("text/htmI"); Printwriter out = new Printwriter (response.getOutputStream()); out.println("<html>"); out.println("<head><title>EnviaBibliografia~/title~~/head~"); out.println("<body>"); out.println("<p align=left><font size=3>"+CveUEA+"~/font></p>"); out.println("<p align=left><font size=3>"+CveGpo+"~/font>~/p>"); out.println("<p align=center><font size=5><strong>"+NombreUEA+"</strong>~/font~~/p~"); align=center>cfont out.println("<p size=3><strong>vienvenido profesor</strong></font></p>"); out.println("<p>Envie El Archivo que contenga su bibliografia, temario y evaluacion del curso(se recomienda enviar pdf, doc, o t:d), elija el archivo"); out.println("deseado con el botón "); out.println("examinar(browse) y oprima enviar.</p>"); out.println("<p>si no puede ver el botón examinar(brouse) su navegador no puede"); out.println("enviar archivos.dp>"); out.println("<form ENCTYPE=Y'multipatVform-data\" action=\"http://infocbi.uam.mx:85/servlet~proyectoCSH.bibliografia.CapturarBibliografia\""); out.println("method=\"post\">"); 'I1'; "'I; "I'; 64 out.println("<input type=\"hidden\" name=\"CveGpo\" value=\""+CveGpo+"\">"); out.println("<input type=\"hidden\" name=\"CveUEA\" value=\""+CveUEA+''~'>''); out.println("<BR><BR><lNPUT NAME=Y'archivo\" TYPE=\"file\">"); out.println("<input type=\"submit\" value=\"Enviar datos\">"); out.println("</form>"); out.println("</body></htmI>"); out.close(); 1 //Get Servlet information public String getServletlnfo() { return "proyectoCSH.upload.EnviaArchivoInformation"; 1 1 // ..................... fin de archivo EnviaBibliografia.java // ....................... Archivo CapturarBibliografia.java /* este servlet es el que guarda el archivo en el servidor*/ package proyectoCSH.bib1iografia; import proyectoCSH.upload.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import com.oreilly.servlet.multipart.*; import java.sql.*; public class CapturarBibliografia extends HttpServlet { String DBurllnterBase = "jdbc:odbc:Aula--Virtual"; // Nombre de la base de datos en ODBC " //"jdbc:odbc:Aula-Virtual" String UserName="SYSDBA'; //Usuario String Password="masterkey";// Password de ODBC String Driver="sun.jdbc.odbc.JdbcOdbcDriver";//Drivers Connection conlnterBase; // Este metodo es el que se encarga de establecer // la conexion con la base de datos public void init(Serv1etConfig config) throws ServletException { super.init(config); try { Class.forName(Driver); System.out.println("paso el driver"); conlnterBase=DriverManager.getConnection(DBurllnterBase,UserName,Password); System.out.println("iniciando conexion a la base de datos interbase"); 1 catch( Exception e ) { System.err.println(e.getMessage()); System.err.println("error en el init()"); }// fin del metodo init() /*X**********X***************x*****************k************************ / // Se cierra la conexion con la base de datos public void destroy() { super.destroy(); System.out.println("cerrando conecciones try { conlnterBase.close(); } catch( SQLException ex ) { System.err.println("no se puede cerrar la conexion, error en destroy"); System.err.println("ex.getMessagge()"); ...'I); 1 }// fin del metodo destroy public void doPost(HttpServ1etRequestrequest, HttpServletResponse response) throws IOException, ServletException { Multipartparser mp = new MultipartParser(request, 7 * 1024 * 1024); byte[] fileData = null; response.setContentType("textlhtm1"); Printwriter out = response.getWriter(); out.println("<html>"); out.println("<HEAD><TlTLE>Capturando archivo</TITLE></HEAD>"); out.println("<body background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/fO29.jpg~"); out.println("<p>lNIClANDO UPLOAD 'I); try{ CapturadorArchivo ca = new CapturadorArchivo(out); String datos[] = ca.obtenValores(2,mp); out.println("<p>Datos recibidos:"); out.println("<p> Grupo = "+datos[O]); = "+datos[l]); out.println("<p> UEA fileData=ca.obtenArchivo(mp); out.println("<p> Archivo = "+ca.FileName); if (ca.hayDatosNulos(datos,fileData)==true){ out.println("<br><br><h3>porfavor regrese a la pagina anterior"); out.println("<br><br> y llene todoslos campos'del formulario"); out.println("<br><br> para que se puedan guardar las notas</h3>"); }else{ //String pathDirectorio="E:\\EducacionDistancia\\public~html\\bibliografia\~'+datos[l]+"\\"+datos[O]; String pathDirectorio="C:\\j.swdk1.0.1\\examples\\EducacionDistancia\\public~html\\bibliografia\~'+datos[l]+"\\"+datos[O]; ca.creaDirectorio(pathDirectorio); try{ CapturadorBaseDatos cbd = new CapturadorBaseDatos(out); cbd.insertaDatosBibliografia(conlnterBase,datos,ca.FileName,replace(' ca.guardaArchivo(fileData,pathDirectorio,ca.FileName.replace(' ','-')); out.println("<p><font color=\"#OOOOFFY' size=\"2\">~ern>~strong~su archivo fue enviado exitosarnente</strong></em></font>4p>"); out.println("<p><font color=\"#OOOOFF\" size=\"2\"><em><strong>Desde este momento esta disponible en la WEB<strong></em></font></p>"); }catch(SQLException ex) { System.out.println("<br>\n--- SQLException caught ---\n"); while (ex != null) { out.println("<br>" + ex.getErrorCode 0 ) ; out.println("<br>Posiblemente ya existe un archivo con el mismo nombre,"); out.println("<br>Cambie el nombre del archivo e intente nuevamente"); ','-I)); 67 out.println("<br>Si el problema perskte, consulte con el Administrador de servicios"); System.out.println("<br>Message: " + ex.getMessage 0 ) ; System.out.println("<br>SQLState: " + ex.getSQLState 0 ) ; System.out.println("<br>ErrorCode: " + ex.getErrorCode 0 ) ; ex = ex.getNextException(); out.println("<br>"); 1 //ca.guardaArchivo(fileData,pathDirectorio,ca.FileName); 1 1 }catch (Exception ex) { out.println("<p>" + ex.toString()); 1 out.println("</BODY>"); out.println("</HTML>"); }// del doPost }// de la clase Capturar archivo // ....................... fin de Archivo CapturarBibliografia.java 68 // ..................archivo RevisaBibliografia.java package proyectoCSH.bibliografia; import proyectoCSH.upload.*; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import java.sql.*; public class RevisaBibliografia extends HttpServlet { //Initialize global variables String DBurllnterBase = "jdbc:odbc:Aula-Virtual"; String UserName="SYSDBA"; //Usuario String Password="cbi208399";// Password String Driver="sun.jdbc.odbc.JdbcOdbcDriver";Drivers de ODBC Connection conlnterBase; public void init(Serv1etConfig config) throws ServletException { super.init(config); try { Class.forName(Driver); System.out.println("paso el driver"); conlnterBase=DriverManager.getConnection(DBurlInterBase,UserName,Password); System.out.println("iniciando conexion a la base de datos interbase"); 1 catch( Exception e ) { System.err.println(e.getMessage()); System.err.println("error en el init()"); }// fin del metodo init() ...................................................................... / // Se cierra la conexion con la base de datos public void destroy() { super.destroy(); System.out.println("cerrando conecciones try { conlnterBase.close(); } catch( SQLException ex ) { System.err.println("no se puede cerrar la conexion, error en destroy"); System.err.printIn("ex.getMessagge()"); ...'I); 1 }// fin del metodo destroy //Service the request public void service(HttpServ1etRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); Printwriter out = new Printwriter (response.getOutputStream()); out.println("<htmI>"); out.println("<head><title>zona de descarga</title></head>"); out.println("<body background=http://infocbi.uam.mx:85/EducDistancia/PrincipalPag/fO29.jpg~"); //nombre de la uea String NombreUEA = ""; try { NombreUEA = request.getParameter("NombreUEA')); } catch(Exception e) { e.printStackTrace(); } //clave de la uea String CveUEA = ""; try { CveUEA = request.getParameter("CveUEA"); } catch (Exception e) { e.printStackTrace(); } //clave del grupo String CveGpo = ""; try { CveGpo = request.getParameter("CveGpo"); } catch (Exception e) { e.printStackTrace(); } //clave del profesor String Cveprofesor = try { Cveprofesor = request.getParameter("CveProf"); } catch (Exception e) { e.printStackTrace(); } out.println("<p align=left><font size=S>UEA : "+CveUEA+"</font></p>"); out.println("<p align=left><font size=S>GRUPO : "+CveGpo+"</font></p>"); out.println("<p align=center><font size=3~~strong~"+NombreUEA+"<lstron~~~~/font~~/p~"); out.println("<p align=center><font size=2><strong> Bibliografia, temario y evaluacion del curso</strong></font></p>"); out.println("<p><font size=2>desde aqui puedes ver o descargar la bibliogfiadel curso</font></p>"); I"'; try{ CapturadorBaseDatos cbd = new CapturadorBaseDatos(out); cbd.MuestraBibliografia(conlnterBase,(=veGpo,CveUEA); }catch(SQLException ex) { out.println("<br>\n--- SQLException caught ---\n"); while (ex != null) { out.println("<br>POR MOMENTO EL NO PUEDEN SE MOSTRAR ARCHIVOS"); System.out.println("<br>Message: " + ex.getMessage 0 ) ; System.out.println("<br>SQLState: " + ex.getSQLState 0 ) ; System.out.println("<br>ErrorCode: + ex.getErrorCode 0 ) ; out.println("cbr>ErrorCode: " + ex.getErrorCode 0 ) ; ex = ex.getNextException(); System.out.println("<br>error"); LOS I' 1 1 out.println("</body></htmb"); out.close(); 1 //Get Servlet information 70 public String getServletlnfo() { return "proyectoCSH.upload.RevisaNotas Information"; 1 //..................fin del archivo RevisaBibliografia.java // ................ .Fin del package bibliografia Administración del sistema. OBJETIVO Que existan personas encargadas de darle mantenimiento a los maestros, alumnos, cursos y UEAS en el AULA VIRTUAL. MODELO DE REQUERIMIENTOS Modelo de casos(Use Case) Use Case EntradaAdministrador Adrninlstrador ,. .' EscenarioCorrectoSimpleparaentrara ElitradaAdministrador pantalla de administrador 1.-El Administrador da click en administrador 2.-El administrador introduce su clave y su password 3.-El administrador oprime enviar 4.-El sistema valida la clave y el password 5.-EIsistema despliega la pantalla del administrador 6.-fin 72 Modelo de lnterfaz Diagrama de Estado(Use Case EntradaAdministrador) €3 orar Entar O.K. Universidad Virtual O Password Admon Regresar Salir Envlar a Pantalla Adrnon Modelo del Dominio del problema Diagrama de clases estaticas Administrador Ybcveadrn on @passwordadmon @nombre MODELO DE ANALISIS DlNAMlCO Diagrama de Colaboracion(Use Case GuardaSesion) 1 cveAdmln+ passwod+OK 2 ValidaAdmon(cveAdmonPassword) boolean OlPantallaAdm~n .,'. ao Uns u a r l o C l P aCnD t aVl learAi fdl cr n -~ 3 VerlflcaAdmon(cveAdmon Password)Int ONVenflca A d m o n CNVerlflcaADmon .... ODVenflcaUsuarlo 4 ExesqI(Query1) Admlnlstrador 73 .". ."" _I ... " I " MODELO DE DISEÑO (Diagramas de S'ecuencia) 1.- (Use Case GuardaSesion) ODVerlficaUsu ONVerlfica OlPantallaAdm on - Administrador cveAdrnln+ password+OK arlo 34 ValldaAdmon(cweAdmon,Password). boolean ~> VerlficaAdmon(cveAdmon.Password).int > Exesql(Query1) ~~ > CONSULTA MAESTRO OBJETIVO Que el administrador pueda saber encualquier momento que maestros hay en la base de datos y además que cursos están imparhendo. 74 MODELO DE REQUERIMIENTOS Use Case ConsultaMaestro ConsultaMaestros Administrador PASOS 1.-El Administrador da click en Maestros 2.-El sistema muestra la pantalla de maestros 3.-EI Administrador da click en Profesores Actuales 4.-EI sistema consulta los maestros actuales 5.-EI sistema despliega los maestros actuales 6.-El Administrador oprime regresar 7.-Fin Modelo de lnterfaz Diagrama de Estado (Use Case ConsuItaMaesto) 0.K Inicio Pantalla MuestraProfesores Pantalla ConsultaProfesores Regresar Salir a' MODELO DEL DOMINIO DEL PROBLEMA Diagrama de clases estáticas Profesor 'TQcveprofesor @passwordprofesor @nombreprofesor MODELO DEANALISIS DlNAMlCO Diagrama de Colaboracion(Use Case ConsultaMaestros) 1: Maestn, :> Pdministrador : Pdrninistradw 2: Westros Pctuales OlPantallaMaestro ClPantallaMaestro :> ONCOnsultaMaestrosO 4: Consultab'() , ; COConsuttaM CDConsultaM CNConsultaMO ~ :> 3: ConsultaFhestros() 76 MODELO DE DISEÑO (Diagramas de Secuencia) Administrador: Administrador OIPantallaMae ~ ONCOnsultaMa ODConsultaM CDConsultaM estros(l m ~ Maestro >- Maestros Actuales >I ConsultaMaestros() ../* , ConsuitaMO > Execsql(Query2) > ;. A L T AM A E S T R O S OBJETIVO Que El administrador pueda dar de ahla a profesores. MODELO DE REQUERIMIENTOS Modelo de casos(Use Case) 1.- Use Case AltaMaestros AltaMaestros Administrador Escenario Correcto simple para dar de alta a un maestro 1.-El actor hace clic enalta de maestros 2.-El actor introduce datos 3.-El actor oprime enviar 4.-El sistema valida los datos 5.-EI sistema inserta datos 6.-EI sistema muestra una pantalla de éxito 7.-El actor oprime salir Modelo de lnterfaz Diagrama de Estado (Use CaseAltaMaesto) Entrar > ~~ ~~ PantallaConsultaProfesor A Desplegar i Regresar I \/ 1 PantallaAltaProfes MODELO DE ANALISIS DlNAMlCO Diagrama de Colaboracion(Use Case AltaMaestros) 78 >: , 7 ShowHTMLExitolnsert() 2 AltaProfesores 1 AltaMaestros ONAltaMaestros2 ' CNAltaMaestrosZ OlPantallaMaeswtro ClPantallaMaestro ' ;. Admlnlsbador Adrnlnlstrador v 3 Vallda(cveProfesor,passwordP) 4 Verlhca(cwProfesor.passwordP) 1 'J v 5 Insertalnfo(cveProfesor,passwordPnombre) ONValldaProfesor CNValidaProfesor 6 Inserta(cveProfesor.password.nornbre) \\J ODlnserta ' COlnseerta 7: ShowHTMLExltolnsert() 1 AltaMaestros :> Adrnmistrador 2- Altaprofesor OlPantallaMaestro CIPantallaMaestro *,;' ONAltaMaestros2 CNAltaMaestros2 3: Vallda(cveProfe,passwordP) ' Y 4 Venfica(cveProfe,paswordP) 0 V 5 . lnsertalnforrnaclon(cveProfesor.password,nornbre) ODlnserta ONValidaProfesor CDlnsertaCNValidaProfesor 6 Inserta(cLeProfe.password,nornbre) MODELO DE DISEÑO (Diagramas de Secuencia) Administrador : Administrador OlPantalla Maestro ONValida ~0NP.lta ODlnserta aestros2 ~MProfesor CDlnserta 1 A l taM aestTOS ' 2: Altaprofesor :> 3: Valida(cveProfe,passwordP) 4: Verifica(cveProfe,paswordP) ; ; , 5: Insertalnformacion(cveProfesor,password,nombre) 2 6. Inserta(cwProfe,password,nombre) >:. 7: ShowHTMLExitolnsert() ..................... BAJA ....................................................... MAESTROS OBJETIVO Que El administrador pueda dar de ba.ja a profesores. MODELO DE REQUERIMIENTOS Modelo de casos(Use Case) 1.- Use Case BajaMaestros Administrador BajaMaestros 80 Escenario Correcto simple para dar de baja a un maestro 1.-El actor hace clic en bajade maestros 2.- El actor proporciona los datos del profesor 3.-El actor oprime enviar 4.-El sistema valida los datos 5.-EIsistema elimina el registro correspondiente 6.-El sistema muestra pantallade éxito 7.-EI actor oprime salir Modelo de lnterfaz Diagrama de Estado (Use Case BajaMaesto) Entrar PantallaConsultaProfe v PantallaBajaProfes 7: ShowHTMLExito() -.,/. B a j a P r o f1: e s2B: a j a P r o f e s -." >- OlPantalla Profesor ClPantallaProfesor ONBaiaMaestros2 CNBaiaMaestrosZ ~ : Administrador 3: Valida(cveProfe) 'J 4 : Verifica(cveProfe) v 5: Borra(cveProfe,nombre) v ODBaia CDBara ONValidaProfe CNValidaProfe I-, 6: B a j a s ( c v e P r o f , n o m b r e P ) ~~ ~~ ODBaia ONValidaProfe ONBaia OIPantalla CNValidaProk CDBaia Maestros2 Profesor : Administra+nr 1: BajaProfes > 2:BajaF’rofes > 3: Valida(cveProfe) ?~ 4: Verifica(cw,Profe) > 5: Borra(cveProfe,nombre) > 6: Bajas(cveProf,nombreP) > 7: ShowHTMLExito() 82 PROYECTOR DE IMAGENES OBJETIVO: El alumno podrá observarlas imágenes que el profesor le envié dentro de su aula virtual. PROFESOR MODELO DE REQUERIMIENTOS Modelo de casos (Use Case) U C Envlar Imagen maestro I L E I maestro da click en subir graficos 2 -El sistema mestra la pantalla de bienvenida 3 - El maestro selecciona la ruta de su archivo. 4 . - E l maestro da click en upload 5 - El s l s t e m a envia la imagen &-El slstema genera un archlvo con la clave ddel maestro 7 -El s i s t e m a e n u a una págma de avlso , grupo y trlmestre. Modelo de interfaz Diagrama de Estado 0 inicio Subir Graficos Enviolmagen Subirlmagen O fin back b a U C P I k O a d PantConfirmacion MODELO DE ANALISIS DINAMICO Diagrama de colaboración CPSubirlmagen OPSublrlmagen 2 ShowEnvlalmagenO j <\ 6 envla(8rchlK nombre) 7 setArchlvo(archlvo,nambre) :>, CPEnmlmaqen OPEnuolmaqen CDGuardalmaqen ODG uardalmaqe n 5 GenberaNombrearchlvoO'jtrlng >: 8 ShawAvtsoO CNGeneraNombre , ONGeneraNombre j! CPConfirmacmn OPConfirmaclon 84 Diagrama de secuencia maestra CPSublrlmasen CPEnuolmaqen CPConf~rmaclo CNGeneraNom 'CDGuardalmaq OPEnvlolmase OPSublrlmaqen sublr Imagen n_ en ONEnva ::. I , ShowEnualmagenO ':. Selcclona ruta OK I GenberaNombrearchlw()Strlng .F enlna(archlvo.nombre) '.. __,a SetArchlvo(archlw.nombre) __r ALUMNO MODELO DE REQUERIMIENTOS Modelo de casos ( Use Case ) UC Proyectorde imagenes alumno 1 , - E l alumno da click en proyector de imagenes. 2.- E l sistema se conecta alservidor. 3.- El sistema obtiene las imagenes del arciivo correspondiente. 4.- E l sistema guarda las imagenes en un wxtor. 5.- E l sistema despliega l a primera imagen en el Frame. 6.- El alumno da click en el boton siguiente 7 - E l sistema muestra la siguiente imagen en el frame. 8.- Se repiten los pasos 6 y 7 9.- E l alumno da click en salir. 10.-El sistema regresa el control al applet del alumno. Modelo de interfaz Diagrama de Estado a Inicio proyector de¡m agenes panAulaVirtual panProyector S ;I lir 86 MODELO DE ANALISIS DlNAMlCO Diagrama de colaboración Diagrama de secuencia : alumno CPAuIaVirtuaI CPpanlmaqen CNRecibe -3ntlmaqen OPAulaVirtual : CDobtenerlmaq I ONRecibe : en proyector de imagenes ~ >; recibe(arch ivo ,nom bre) >- getArchivo(archivo.nom bre) > showhagen( ) :> salir > 88 Código //programas para subir las imágenes al servidor package multipart; importjava.io.*; import java.util.ResourceBundle; import javax.servlet.*; import javax.servlet.http.*; // Referenced classes of package multipart: // Textos2 public class PaginaProyector2 extends HttpServlet I t String servlet; String RutaServlets; String imagenFondo; private String CVE-UEA; private String CVE-GRUPO; private String CVE-PROFE; public PaginaProyector2() I I servlet = "multipart.UploadContent2"; RutaServlets = Textos2.ruta.getString("RutaServlets"); irnagenFondo = "fondo I .jpg"; CVE UEA = null; C V E ~ G R U P O= null; CVE-PROFE = n u l l ; I I public void init(Serv1etConfig servletconfig) throws ServletException I super.init(servletconfig); I I public void doGet(HttpServ1etRequest httpservletrequest, HttpServletResponse httpservletresponse) throws ServletException, IOException I \ System.out.println("Estoy entrando en doget "); doPost(httpservletrequest, httpservletresponse); I public void doPost(HttpServ1etRequest llttpservletrequest, HttpServletResponse httpservletresponse) throws ServletException, IOException f t System.out.println("Estoy entrando en doPost "); CVE UEA = httpservletrequest.getPa.rameter("CveUEA"); CVE-GRUPO = httpservletrequest.gt:tParameter("CveCrl~po"); C V E ~ P R O F E= 11ttpservletrequest,get:Parameter("CveProf'); System.out.println("Estoy entrando y tengo los sigueintes datos -+ CVE-GRUPO + + CVE-PROFE); Printwriter printwriter = null; try 'I + CVE-UEA + 'I 'I 'I i printwriter = httpservletresponse.getWriter(); 1 f catch(1OException ioexception) I t System.out.println("Se ha producido una excepcion"); I I httpservletresponse.setContentType("text/html"); printwriter.println("<html>"); printwriter.println("<html><head><title>Subir Archivo</title>"); printwriter.println("<META content=text/html; charset=windows-l252httpequiv=Content-Type>"); printwriter.println("<META content= MSHTML 5.00.2920.0 name=GENERATOR></HEAD>"); printwriter.println("<BODY bgColor=#ffffff>"); print\?iriter.println("<CENTER>"); printwriter.println("<form method=post action=\"" + RutaServlets + servlet + "?CveUEA=" + CVE-UEA + "&CveGrupo=" + CVE GRUPO + "&CveProf=" + CVE-PROFE + "\" encType=multipart/form-data method=post>"); System.out.println("ruta del servlet:" + RutaServlets + servlet); printwriter.println("<font face=\"Aria.l, Helvetica, sans-serifl" color=\"#000099\"><b>UNIVERSJDAD '\IIRTUAL</b></font><br><font face=\"Arial, Helvetica, sans-serif\" color=\"#000099\"~~"); printwriter.println("<font face=\"Aria.l, Helvetica, sans-serif\" color=\"#000099\">"): printwriter.println("<b>BIENVENIDOPROFESOR "); ~.'rintwriter.printIn("</b></font><br><br>"); print\?iriter.println("<fo~ltface=\"Arial, Helvetica, sans-serif\" color=\"#000099\" size=\" 1 printwriter.println("<b>EN ESTA PAGINA PODRA SELECCIONAR LA IMAGEN LOCAL QUE DESEE ENVIAR <br>"); printwriter.println("PARA EL AULA VIRTUAL DE LA UEA + CVE-UEA); printwriter.println("EN EL GRUPO + CVE-GRUPO); printwriter.println("</b></font><br><br>"); printwriter.println("<font face=\"Arial, Helvetica, sans-serif\'t color=\"#000099\">"); \">I1); I' I' printwriter.println("<b>Seleccione el archivo que desee ellviar</b></font><br><br>"); printwriter.println("<font face=\"Arial, Helvetica, sans-serif\" color=\"#000000\" size=\"2\">"); printwriter.println("<b>Presione el bot&oacute;n 'send file' para enviar sus im&aacute;genes.</b></font><br><br>"); printwriter.println("<font face=\"Arial, Helvetica, sans-serifl" color=\"#0099FF\" size=\"2\">"); printwriter.println("<BR><BR><INPUTname=userfile 1 type=file> "); printwriter.println("<lNPUT type=\"submit\" value=\"send file\">"); printwriter.println("</form></center~~/body~</ht~ml~"); printwriter.flush(); printwriter.close(); t I I package multipart; importjava.io.*; importjava.uti1.ResourceBundIe; importjavax.servlet.*; import javax.servlet.http.*; // Referenced classes of package multipart: // MultipartParser, Filepart, Textos public class UploadContent2 extends IHttpServlet I I private String CVE-UEA; private String CVE-GRUPO; private String CVE-PROFE; String nombreArchivo; File dirlmagenes; String rutaImagenes; String Folder; public UploadContent2() f CVE-UEA = null; CVE GRUPO = n u l l ; CVE-PROFE = IIUII; nombreArchivo = null; rutalnlagenes = Textos.ruta.getString("Ruta1magenes"); Folder = Troy-" + CVE-lJEA + "-"+ CVE-GRUPO + "-"+ CVE-PROFE + "/".trim(); I I public void doPost(HttpServ1etRequest httpservletrequest, HttpServletResponse httpservletresponse) throws IOException, ServletException I \ CVE UEA = httpservletrequest.getParameter("CveUEA"); CVE-GRUPO = httpservletrequest.getParameter("CveGrupo"); CVE-PROFE = httpserv~etrequest.gel.Parameter(~~cve~ro~~); System.out.println("los datos son: +- CVE-UEA + "-"+ CVE-GRUPO + "-"+ CVE-PROFE); MultipartParser multipartparser = new MultipartParser(httpservletrequest, 0x1 00000); Part part = multipartparser.readNextPart(); nombreArchivo = multipartparser.getYombreArchivo(); System.out.println("nombre archvio + nombreArchivo); + String S = new String(CVE-UEA + " ~ _ " + CVE-GRUPO + CVE-PROFE.trim()); File file = new File(ruta1magenes + S); System.out.println("el folder es"+ CVE-UEA + - + CVE-GRUPO + - + CVE-PROFE.trim()); Systetn.out.println("rutade guardado seria =" + rutalmagenes + S + "/" + notnbreArchivo); boolean flag = false; Object obj = null; Object obj 1 = null; if(part instanceof FilePart) I' ''-I1 'I 'I 'I f I ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStreamO: ((FilePart)part).writeTo(bytearrayoutputstream); byte abyteO[] = bytearrayoutputstream.toByteArray(); System.out.println("Y en fileDataz="+ abyte0); System.out.println("Estoy antes de preguntar:"); if(!file.exists()) I I System.out.println("Y el archivo no existe"); file.mkdir(); System.out.println("Entonces lo hemos creamos en:" + rutaImagenes + S); FileOutputStream fileoutputstream = new FileOutputStream(ruta1magenes "/" + nombreArchivo); System.out.println("ruta de guardado + rutalmagenes + s + "/" + nombreArchivo); fileoutputstream.write(abyte0); +S+ ='I fileoLltputstreatn.close(); else I FileOutputStream fileoutputstream 1 "/" + nombreArchivo); = new FileOutputStream(rutal1nagenes + s + Systern.out.printl~l("r~~ta de guardado nombreArchivo); fileoutputstream 1.write(abyteO); fileoutputstream 1 .close(); =I1 + rutalmagenes + S + "I" + 1 I 1 I part = muItipartparser.readNextPart(); llttpservletresponse.setCo~ltentType("text/html"); ServIetOutputStream servletoutputstream= httpservletresponse.getOutputStream(); servletoutputstream.println("El archivo fue enviado"): servletoutputstream.close(); I I I //para bajar las imágenes package multipart; importjava.io.*; import java.util.ResourceBundle; importjavax.servlet.*; import ~javax.servlet.http.*; 11 Referenced classes of package rnultipart: I/ Textos2 public class MuestraArchivo2 extends HttpServlet I I private String CVE UEA; private String CVE-GRUPO; private String CVE:,IPROFE; private String NOMBRE-ARCH; private String folder; String nombreArchivo; File dirfmagenes: String rutaImagenes; String rutaservlets; String rutaFondo; String imagenFondo; public MuestraArchivo2() I \ CVE-UEA = null; CVE GRUPO = n u l l ; C V E ~ P R O F E= null; NOMBRE-ARCH = null; nombreArchivo = null; rutahagenes = Textos2.ruta.getString("RutaImagenes"); rutaservlets = Textos2.ruta.getString("RutaServlets"); rutaFondo = Textos2.ruta.getString("RutaFondo"); imagenFondo = "fondo 1..jpg"; > f public void init(Serv1etConfig servletconfig) throws ServletException f k super.init(servletconfig); System.out.println("1niciando Servlet 1 ...I1); public void service(HttpServ1etRequest httpservletrequest, HttpServletResponse httpservletresponse) throws IOException, ServletException r t CVE UEA = httpservletrequest.getParameter("CveUEAf'); CVE1GRl.JPO = httpservletrequest.getParameter("CveGrupo"); CVE PROFE = httpservletrequest.getParameter("CveProf'); NOMBRE ARCH = httpservletrequest.getParameter("archivo"); folder = new String(CVE-UEA + - + CVE GRUPO + "_" + CVE-PROFE.trirn()); System.out.println("Estarnos recibiendo los datos en MuestraArchivo: + CVE-UEA + CVE-GRUPO + + CVE-PROFE + + NOMBRE-ARCH); paginaArchivos(httpserv1etresponse); I' I' + If 1 'I 'I " void paginaArchivos(HttpServ1etResponse httpservletresponse) f \ System.o~~t.println("entra~nos en la pagina que debe mostrar la imagen"); Printwriter printwriter= null; try I I printwriter = httpservletresponse.gztWriter(); I I catch(1OException ioexception) f \ System.out.println("Se ha producido una excepcion"); 1 I l~ttpservletresponse.setContentType("text/ht~nl"); printwriter.println("<llttnl>"); printwriter.println("<head>"); printwriter.println("<title>Archivos <:/title>"); printwriter.println("</head>"); printwriter.prilltl17("<body background=\"" + rutaFondo + imagenFondo + "\""); 94 printwriter.println("<CENTER>"); printwriter.println("<HR NOSHADE>"): ~~rintwriter.println("<font size=\"4\"><strong>:>Imagen: + NOMBRE__ ARCH "</strong></font></a>"); printwriter.println("<HR NOSHADE>"); printwriter.println("<p></p>"); printwriter.println("<br>"); printwriter.println("<img src=\"" + rutalmagenes + + folder + "/" + NOMBRE-ARCH + "\">"): System.out.println("E1 arcvhivo dado es:"+ rutalmagenes + folder + + NOMBREARCH); printwriter.pri~ltl~l("</body>"); printwriter.println("</17tmI>"); printwriter.flush(); printwriter.close(); 'I "/I' I I I I package multipart; import java.io.*; importjava.util.ResourceBundle: importjavax.servlet.*; import.javax.servlet.http.*: // Referenced classes of package multipart: I/ Textos2 public class DownLoad3 extends HttpServlet I private String CVE-UEA; private String CVE-GRUPO; private String CVE-PROFE; String nombreArchivo; private String irnagenFondo: private String imagenLogo: File dirlmagenes; String rutaFondo; String rutalogos; String rutalmagenes; String rutaservlets: public DownLoad30 I I CVE UEA = null; WE-GRUPO = n L l l l : C V E ~ P R O F E= null: + nornbreArchivo = null; imagenFondo = "fondo1 .jpg"; imagenLogo = "casanim.gif'; rutaFondo = Textos2.ruta.getString("RutaFondo"); rutaLogos = Textos2.ruta.getString("F:utaLogos"); rutalmagenes = Textos2.ruta.getStrin~;("Rutalmagenes"); rutaServlets = Textos2.ruta.getString("RutaServlets"); 3 public void init(Serv1etConfig servletconfig) throws ServletException I t super.init(servletconfig); System.out.println("lniciando Servlet .."); 1 I public void service(HttpServ1etRequest httpservletrequest. HttpServletResponse httpservletresponse) throws IOException, ServletException I t CVE UEA = httpservletrequest.getParameter("CveUEA"); CVEIGRUPO = httpservletrequest.getParameter("CveGrupo"); CVE-PROFE = httpservletrequest.getParameter("CveProf'); System.out.println("Los datos son : + CVE-UEA + " + CVE-GRUPO + " CVE-PROFE); String S = new String(CVE-UEA + ._ + CVE-GRUPO + "-"+ CVE-PROFE.trim()); dirlmagenes = new File(ruta1magenes + + S); Systetn.out.println("e1 folder es'' + C'JE -UEA + - + CVE-GRUPO + "-"+ CVE-PROFE.trirn()); Systetn.out.prilltlIl("ruta donde sera extraidos los archivos + rutalmagenes + 'I 'I + I' I' I' =I' 'I + S); if(!dirlmagenes.exists()) I \ System.out.println(" el directorio no existe : "); System.out.println("dirlmagenes=" + dirlmagenes); 1 else I I System.out.println(" El archivo existe y estoy antes de pagina archivos "); paginaArchivos(httpserv1etresponse); System.out.println(" el directorio si existe : "); 1 I I I void paginaArchivos(HttpServ1etResponse httpservletresponse) I t Printwriter printwriter = null; 96 try f t printwriter = httpservletresponse.getWriter(); I I catch(1OException ioexception) r I System.out.println("Se ha producido una excepcion"); I System.out.println("Estoy entrando en la pagina"); I~ttpservletrespo~~se.setConte~lt'fype(''text/htrnI"); printwriter.println("<I~t~nb"); printwriter.println("<head>"); printwriter.println("<title>Archivos </title>"); printwriter.println("</head>"); printwriter.printIn("<body background=\"" + rutaFondo + itnagenFondo + "\""); printwriter.println("<CENTER>"); printwriter.println("<HR NOSHADE>"); printwriter.println("<h>PROYECTORDE IMAGENES </h> <br> "); printwriter.println("<lMG SRC=\"" + rutaLogos + ilnagenLogo + "\" width=\" 127\" height=\"7O\" ></CENTER>"); printwriter.println("<HR NOSHADE>"); printwriter.println("<p>Estas son las im&aacute;genes disponibles:</p>"); printwriter.println("<br>"); System.out.println("la cantidad de archivos es:" + dirImagenes.list().length); ibr(int i = O; i < dirlmagenes.list().length;i++) I printwriter.pri~ltlI7("<br>"); printwriter.prilltln("<ll><a href=\"" + rutaServlets + "m~1ltipart.MuestraArchivo2?CveUEA=" + CVE UEA + "&CveGrupo=" + CVE-GR1JPO + "&CveProf=" + CVE PROFE + "&archivo=" T dirlmagenes.list()[i] + "\">" + dirlmagenes.list()[i] + 'l¿/a><l~>l'); System.out.println("archivo + i + + dirlmagenes.list()[i]); 'I 'I 'I I I printwriter.println("</body>"); printwriter.println("</l~tml>"); printwriter.flush(); printwriter.close(): I I I //las clases que se encargaron del envio de las imágenes fueron package multipart; import java.io.*; import java.utiI.Enumeration; importjava.utiI.Vector; import javax.servlet.ServletlnputStrea1n; import javax.serv1et.ServletRequest; import javax.servlet.http.HttpServ1etRequest; I/ Referenced classes of package multipart: /I BufferedServletInputStream, LimitedServletInputStream, Parampart, Filepart. /I Part public class Multipartparser I private private private private private ServletlnputStrealn in; String boundary; FilePart 1astFilePart; byte bun]; String filename; public MultipartParser(HttpServ1etRequest httpservletrequest, int i) throws IOException i this(httpserv1etrequest. i, true, true); 1 I public MultipartParser(HttpServ1etRequest httpservletrequest, int i, boolean flag, boolean flagl) throws IOException I \ buf= new byte[8 1921; filename = null; String S = null; String S 1 = httpservletrequest.getHeader("Content-Type"); String s2 = httpservletrequest.getContentType(); System.out.println("valor de type + S ) ; if(sl == null && s2 != null) 'I I I s = s2; System.out.println("type 1 else if(s2 == null && S I != null) 'I + S); 'I + S); f 1 S = SI; System.out.println("type2 else if(sl != null && s2 != null) 98 S = S I .length() <= s2.length() ? s2 : S I ; System.out.println(" type + S); if(s == null 11 !s.toLowerCase().staI-tsWith("~llultipart/for~ll-data")) throw new IOException("Posted content type isn't multipart/form-data"); int j = httpservletrequest.getContentLength(); Syste~n.out.println("Longutuddel archivo +j); if(¡ > i) throw new IOException("Posted content length of f j + excede el limite de 'I " I' i 1; I' String s3 = extractBoundary(s); System.out.println("Longutud limite del archivo + s 3 ) ; if(s3 == null) throw new IOException("El limite no fue especificado"); Ob.ject obj = httpservletrequest.getlnputStream(); System.out.println("ServletlnputStream + s3); if(flag) ob.; = new BufferedServletlnputStream((((Servlet1nputStreatn) (obi))); if(f1agl) obj = new Li~nitedServletl~~putStreatn(((Servletl~~putStrea~n) (ob;)), j); i n = ((ServletInputStream) (ob.;)): boundary = s 3 ; String s4 = readline(); System.out.println("leer la primera linea + s3); if(s4 == null) throw new IOException("Corruptform data: premature ending"); if(!s4.startsWith(s3)) throw new IOException("Corrupt form data: no leading boundary: + s4 + != + I' " I' I' s3); else return; \ I public PartreadNextPartO throws IOException I System.out.println(" lastFilePart= if(lastFi1ePart != null) " + IastFilePart); I I lastFilePart.getlnputStrea~n().close(); IastFilePart = null; I I Vector vector = new Vector(); String S = readLine(); if(s == null) return null; if(s.lengtll() == O) return null: + vector.addElernent(s); for(; ( S = readline()) != null && s.len@h()> O; vector.addElement(s)); iqs == null) return null; String S 1 = null; String s2 = null; String s3 = "text/plain"; for(Enumeration enumeration= vector.elements(); enumeration.hasMoreElements();) I I String s4 = (String)enumeration.nextElement(); if(s4.toLowerCase().startsWith("content-dispo~ition:~~)) I String as[] = extractDispositionInfo(s4); sl = as[l]; filename = as[2]; s2 = as[3]; j else if(s4.toLowerCase().startsWith("content-type:")) I I String s5 = extractContentType(s4); if(s5 != null) S 3 = s5; 1 I I I System.out.println(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::" >; System.out.println("valor de type -t filename); System.out.println(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::" >; if(fi1ename == null) return new ParamPart(s l . in, boundary); if(filename.equals("")) filename = null; IastFilePart = new FilePart(s1, in, boundary, s3, filename, s2); return IastFilePart; I I public String getNombreArchivo0 I I return filename; i private String extractBoundary(StringS) I I int i = s.lastlndexOf("boundary="); if(¡ == -1) return null; String S 1 = s.substring(i + 9); I O0 if(s I .charAt(O) == "") I I intj = S I .lastlndexOf(34); I = S I .substring( l . j); S t f S 1= 1f"11 +SI; return S 1; private String[] extractDispositionlnfo(String S ) throws IOException I t String as[] = new String[4]; String S I = S; S = S I .toLowerCase(); int i = s.indexOf("content-disposition: "): int .j = s.indexOf(";"); if(¡ == -1 (1 j == -1) throw new IOException("Cot1tent disposition corrupt: String s2 = s.substring(i + 21, j); if(!s2.equals("fortn-data")) throw new IOException("1nvalid content disposition: i = s.indexOf("name=\'"', j); .j = s.indexOf("\"", i + 7); 'I + s2); 'I ¡(fi == -1 I/ ; == -1) throw new lOException("Cot1tent disposition corrupt: String s3 = S I .substring(¡ + 6, j); String s4= null; String s5 = null; i = s.indexOf("filenare=\"", j + 2); j = s.indexOf("\"", i + IO); if(¡ != -1 & & j ! = - I ) + SI); 'I + S 1); I s4 = S 1.substring(¡ + 1O, j); S5 = s4; int k = Math.max(s4.lastlndexOf(47), s4.lastlndexOf(92)); if(k > -1) s4 = s4.substring(k + I ) ; as[O] = s2; as[ I ] = s3; as[2] = s4; as[3] = s5; return as; I private String extractContentType(String S ) throws IOException I \ String sl = null; String s2 = S; S = s2.toLowerCase(); if(s.startsWith("content-type")) I t 1 int i = s.indexOf(" 'I): if(¡ == - 1) throw new IOException("Content type corrupt: 'I + s2); s 1 = s.substring(i + I ) ; ] else if(s.length() != O) throw new IOException("Ma1formed line after disposition: return S I ; I' + s2); private String readLine() throws 10Exception 6 \ StringBuffer stringbuffer = new StringBufferO; int i; do I I i = in.readLine(buf, O, buf.length); if(¡ != - I ) stringbuffer.append(new String(buf, O. i, "ISO-8859-1")); while(¡ == buf.length); if(stringbuffer.length() == O) I I return null; 1 else f I stringbuffer.setLength(stringbuffer.Iength() - 2); return stringbuffer.toString(); 1 J 1 I package multipart; import java.io.1OException; import java.io.lnputStream; import javax.servlet.Servlet1nputStream; public class LimitedServletInputStreaml extends ServletInputStream 1o2 I I private ServletInputStream in; private int totalExpected; private int totalRead; public Li~nitedServletInputStream(ServletlnputStrea~nservletinputstrealn, int i) r t totalRead = O; i n = servletinputstream; totalExpected = i; I I public int readLine(byte abyteO[], int i, intj) throws IOException I I I int 1 = totalExpected - totalRead; if(I <= O) return - 1; int k = in.readLine(abyte0. i, Math.min(1, j)); if(k > O) totalRead += k; return k; I public int read() throws IOException I t if(tota1Read >= totalExpected) return - 1; else return in.read(); \ I public int read(byte abyteO[], int i, intj) throws IOException int I = totalExpected - totalRead; if(l <= O) return - 1 : int k = in.read(abyte0, i, Math.min(1, j)); if(k > O) totalRead += k; return k; I I o3 .-. package multipart; importjava.io.*: importjavax.servlet.Servlet1nputStream; // Referenced classes of package multipart: // Part, PartlnputStream, MacBinaryDecoderOutputStrearn public class FilePart extends Part I private String fileNarne; private String filePath; private String contentType; private PartlnputStream parthput; FilePart(String S , ServletlnputStream servletinputstream, String S I , String s2, String s3, String s4) throws IOException I t super(s); fileName = s3; filepath = s4; contentType = s2; partlnput = new PartlnputStream(servletinputstream, S 1); l J public String getFileNarne0 r I return fileName; 1 f public String getFilePath0 r t return tilepath; 1 I public String getContentType() I t return contentType; I I public InputStream getlnputStream() I t return partlnput; I I I04 public long writeTo(File file) throws IOException I I long I = OL; BufferedOutputStream bufferedoutputstream try = null; I I if(fi1eName != null) I I File file 1; if(file.isDirectory()) filel = new File(fi1e. fileName); else filel = file; bufferedoutputstream = new BufferedOutputStream(new FileOutputStream(fi1e 1)); 1 = write(buffered0utputstream); 1 I I finally I if(bufferedoutputstrea1n != null) bufferedoutputstream.close(); I I I return 1; public long writeTo(0utputStream outputstream) throws IOException I I long 1 = OL; if(fileNa1ne != null) I = write(outputstream); return I; 1 I long write(OutputStrea1n outputstream) throws IOException f I if(contentType.equals("application/x-macbinary")) outputstream = new MacBinaryDecoderOutputStream(outputstream); long 1 = OL; byte abyteO[] = new byte[8 1921; int i; while((i = partlnput.read(abyte0)) != - I ) I outputstream.write(abyte0, O, i); I += i; I I return I ; 1 I public boolean isFile() I t return true; I package multipart; import java.io.*; public class MacBinaryDecoderOutputStream extends FilterOutputStream I I private int bytesFiltered; private int dataForkLength; public MacBinaryDecoderOutputStream(0utputStream outputstream) r t super(outputstrea1n); bytesFiltered = O; dataForkLength = O; 2 I public void write(inti) throws IOException if(bytesFi1tered <= 86 && bytesFiltered >= 83) I I int j = (86 - bytesFiltered) * 8; dataForkLength = dataForkLength I (i & Oxff) << j ; 1 else if(bytesFi1tered < I28 + dataForkLength && bytesFiltered >= 128) out.write(i); bytesFiltered++; I public void write(byte abyteO[]) throws lOException f t write(abyte0, O. abyteO.length); 106 public void write(byte abyteO[], int i, intj) throws IOException f t if(bytesFi1tered >= 128 + dataForkLengt11) bytesFiltered += j; else if(bytesFi1tered >= 128 && bytesFiltered + .i <= 128 + dataForkLength) I t out.write(abyte0, i, j); bytesFiltered += j; j else t for(int k = O; k <.j; k++) write(abyteO[i + kl); package multipart; import java.io.*; import javax.servlet.Servlet1nputStream; // Referenced classes of package multipart: // Part, PartlnputStream public class ParamPart extends Part I t private byte value[]; ParamPart(String S, ServletlnputStrea~nservletinputstrearn, String S I ) throws IOException I super(s); PartlnputStream paltinputstream= new PartlnputStream(servletinputstream,S 1); ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(512); byte abyteO[] = new byte[ 1281; int i ; while((¡ = partinputstream.read(abyte0)) != - 1) bytearrayoutputstream.write(abyte0, O, i); partinputstream.close(); bytearrayoutputstream.close(): value = bytearrayoutputstrearn.toByteArray(); 1 I public byte[] getvalue() I t 1- return value; public String getstringvalue() throws UnsupportedEncodingException I t return getStringValue("IS0-8859-1"); I I public String getStringValue(String S) throws UnsupportedEncodingException I t return new String(value, S); I public boolean isparam() I t return true; I I I I package multipart; importjava.io.1OException; import java.io.InputStream; import javax.servlet.ServletInputStrea1n; public class BufferedServletlnputStreanl extends ServletInputStream I t private ServletInputStream in; private byte bufl]; private int count; private int pos; public BufferedServletinputStrea~n(ServletInputStrea~n servletinputstream) I I buf = new byte[0x 100001; i n = servletinputstream; I I 108 private void fill() throws IOException I int i = in.read(buf, O, buf.length); if(¡ > O) f I pos = o; count = i; I J public int readLine(byte abyteO[], int i, intj) throws IOException I I int k = O; if(¡ == O) return O; int 1 = count - pos; if(] <= O) I fill(); 1 = count - pos; if(1 <= O) return - 1; I int j 1 = Math.min(j, 1); int kl = findeol(buf, pos,j 1); if'(kl != -1) j l =kl; System.arraycopy(buf, pos, abyte0, i, .j 1); pos += j 1; for(k +=.j I ; I< <I && k 1 == -1; k += j I ) f I fill(); int i 1 = count - pos; if(il <= O) return k; .j I = Math.min(j - k, i 1); k 1 = findeol(buf, pos, j I ); if(kl != -1) jl =kl; I Systeln.arraycopy(buf. pos, abyte0, i pos +=.j 1: I return k; I I + k. .j I ); private static int findeol(byteabyteO[]. int i, int j ) f I int k = i + j ; for(int 1 = i; 1 < k;) if(abyteO[l++] == 10) return I - i; return - 1; 1 I public int read() throws IOException I I if(count <= pos) f t fill(); if(count <= pos) return - 1 ; 1 I return buf[pos++] & Oxff; I public int read(byte abyteO[] int i, intj) throws IOException f I int k; int i l ; for(k = O; k < j; k += i l ) f t int 1 = count - pos; i f(l <= O) I fill(); I = count - pos; if(1 <= O) if(k > O) return k; else return - 1 ; I I i 1 = Math.min('j - k, 1); System.arraycopy(buf, pos, abytea,.i + k, i I ) ; pos += i l ; 1 return k; 1 IO I I I I package multipart; public abstract classPart I 1 private String name; Part(String S) I name = S; I I public String getName() f t return name; I I public boolean isFile() f I return false; I public boolean isparam() I I return false; I J I I package multipart; importjava.io.*; import javax.servlet.Servlet1nputStream; public class PartInputStream extends FilterlnputStream I private String boundary; private byte bufl]; private int count; private int pos; private boolean eof; PartlnputStream(Serv1etlnputStream sewletinputstream, String S ) throws IOException t super(servletinputstream); buf = new byte[Ox 100001; boundary = S; I f private void fill() tl7rows IOException I I if(eof) return; $(count > O) if(count - pos == 2) I t System.arraycopy(buf, pos, buf, O, count - pos); count -= pos; pos = o; f else I t throw new IllegalStateExceptior~("fill()detected illegal buffer state"); I I boolean flag = false; int i; for(; count < buf.length; count += i) I 1 i = ((ServletInputStrea~n)in).readLine(buf, count, buf.length - count); if(i == - 1 ) throw new lOException("unexpected end of part"); if(i < boundary.length()) continue; eof = true; for(int J = O; J < boundary.length(); j++) I t if(boundary.charAt(i) == buflcount continue; eof = false; break; + j]) I I12 if(eo0 break; t public int read() throws IOException í if(count - pos <= 2) f I fill(); t I if(count - pos <= 2) return - 1 ; return bufIpos++] & Oxff: I public int read(byte abyte0[], int i, int j) throws IOException f int k = O; if(¡ == O) return O; int 1 = count - pos - 2; if(l <= O) I fill(); I = count - pos - 2; if(l <= O) return - 1 ; 1 l int .j 1 = Math.min(j, I); System.arraycopy(buf, pos, abyte0, i, .j I ); pos += j I ; for(k += .j 1; k < i; IC += j 1) I I fill(); int i 1 = count - pos - 2; if(i1 <= O) return k; .j 1 = Math.min(j - k, i 1); System.arraycopy(buf, pos, abyte0, i pos +=.jI; I I return IC; + k, j 1 ); public int available() throws IOException int i = (count - pos - 2) + in.available(); return i >= O ? i : O; 1 I public void close() throws IOException r t if(!e o 0 while(read(buf, O, buf.length) != -1) ; 1 I 1 I //esta es la clase que contiene una variable estática para internacionalización de las rutas package multipart; import java.utiI.Locale; in~portjava.util.ResourceBundle; public class Textos2 I public static ResourceBundle ruta = ResourceBundle.getBundle("inter2". new I,ocale("en", "US")); public Textos20 I14 Implementación del correo Modelo de requerimientos Use Case del Envio de correo Usuario Use Case Envio de Correo Un usuario (maestro o alumno) envía un correo. PASOS 1.-Usuario selecciona el vínculo “Directorio” 2.-Sistema Muestra todos los posibles usuarios a los que se les puede enviar correo 3.-Usuario selecciona uno delos nombres. 4.-Sistema despliega pantalla paraeditar el correo 5.-Usuario edita correo (Asunto y texto) 6.-Usuario oprime en “Enviar” -/.-Sistema Sistema envía correo 8.-Sistema despliega mensaje deexito 9.-Fin Modelo de lnterfaz Diagrama de Estado (Use Case Envío de correo) Aceptar :. O IlllC 10 Fin de Clase Fantalla pnnclpal [la cllckeli el riornbre Carga nornbies v Fotos Da clicken la foto Cancelar Carga el cone0 Cancelar 4lecclona Dreciono Y la pantalla d e cone0 Mita el correo y da clicken enviar Vlsrallza losdatos Modelo del Dominio del problema Diagrama de Clases (Use Case Envío de correo) ~ <<Interface> > ClEnvioCorreo ( f r o mL o g l c a l o,,* 1 . .I cMaestro View) &CorreoExitoso() GEntrarCorreo() Osalircorreo() o * @Coreo @Nombre %Foto @Clave GMandarCorreo() &G etCorrqo() 1.. 1. . I cCurso eCveUEA @CveGrupo @Matricula 1..1 1. . * 1..* cAlum no @Correo @Nombre @Matricula @Foto +Mandarcorreo() GG e t c o r r e o 0 Diagrama de Colaboracion 2 McerconsXa(regl3ms) 1 Clicken Drectono ONCOnslita = O Rlnclgal OK- m? Base Usuario 3 Qebuta SQL S wgresaregtstms 4 wgresareglstms 8 4 9 DE m10s 6 Deqllega reg 0 Correo 7 clicksabre elnornbre 8 cilcken envlar OIConeo_s Fotos I I6 Diagrama de Secuencia Modelo del Dominio del problema I I7 -~~., ...... .... ........... "". " " Ami tambien puedes cclnsultar ;+Ira tu correo UAM virtual, Colrreo E l e c t r h i c o Correo encolado pma ser enviado remitente =UA.MFYXNLTM.COM destinatarios =hij [email protected]. con iasunto =Escolar texto =Presentarse al exratea Modelo de Diseño (Diagramas de Secuencia) 1. (Use Case Envío decorreo) Case Visualiza datos Modelo de requerimientos Usuario Visualiza datos Un usuario (maestro o alumno) visualiza los datos de otra persona. PASOS 1.-Usuario selecciona elvínculo “Directorllo” 2.-Sistema Muestra todos los posibles usuarios a los que se les puedeenviar correo 3.-Usuario selecciona una de las fotos. 4.-Sistema despliega pantalla todos los d’atos del alumno seleccionado 5.-Usuario oprime “Aceptar” 6.-Fin Modelo de lnterfaz Diagrama de Estado (Use Case Envío de correo) 0 llllCl0 Wntalla principal Da clicken elnombre Cancelar Carganombres Da clicken la foto y Fotos Vlslaliza losdatos Pceptar Carga el como Cancelar Slecclona Drectono ymuestra la pantalla de CORO Mita elcorreo y da clicken enviar <<Interface>> ClVisualizaDatos Modelo del Dominio del problema (from L o g i c a l V l e w ) Diagrama de Clases de correo) (Use Case Envío 1..1 cUsuario O..* , +visualiza() %Nombre @Foto &GetCorre*o() 1. . 1..1 cConsulta %Matricula 120 Diagrama de Colaboracion I 2 Hiicercons~lta(regi~ros) C l l c k e n Dreclono C)lhntaj!a Fhncipal ONCo!lsiha @se ODConsulta Base Usuario 3 Qebuta s)L 5 wglesaregistms 4 wgresaregistros m 9 ELADS 6 Despliegareg Olmlta ONbvia como Y k g r e s a a pantalla OIFa_n!alla cone0 M 7 clicksobre elnombre 8 cltcken enviar olcomos Fotos Diagrama de Secuencia Modelo del Dominio del problema I22 Modelo de Diseño (Diagramas de Secuencia) 2. (UseCaseVisualizadatos) Oli'dntdlla mnclpa! Usugrio cu,nwnrn Códigos de las distintas clases /*Archivo temporal, en el quese hace la consulta de los alumnos del aula virtual, requiere los archivos ConsultaA2 y ConsultaA3 y de la pagina html BIEVENIDA.htm*/ package mailes; import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class consulta1 bis extends HttpServlet { p4vWf!lVv (IIWIR lAyI PC1RII~""t public void Inlt(ServTetCot%g config) throws ServletException { super.init(config); // NO OLVIDAR PONER EL NOMBRE DEL SERVLET 1 public void service (HttpServletRequest request, HttpServletResponse response){ ServletOutputStream out; String parametro,value,url,db-user,passwd,driver; int matricula; Connection db; Statement st; Resultset rs; int ¡=O; url="jdbc:odbc:Aula-Virtual";// Nombre de la base de datso en ODBC db-user="SYSDBA"; //Usuario passwd="masterkey"; I1 Password driver="sun.jdbc.odbc.JdbcOdbc:Driver"; //Drivers de ODBC try { Class.forName(driver); ¡++;//Se inicializa el driver i++; db = DriverManager.getConnectiori(url,db_user,passwd); // Se hace la conexion a la BD st = db.createStatement(); i++; // Inicializa una sesion a la conexion out= response.getOutputStream(); response.setContentType("text/html"); out.println("<HTML><HEAD>~TlTl-E>"); out.println("CONSULTA DE ALUMNOS DE LA UNIVERSIDAD VIRTUAL"); out.println("</TITLE></HEAD><BC)DY>"); CveGrupo=request.getParameter("id"); out.println("<H2><1> A continuacion, se muestran los alumnos" inscritos en el aula virtual </I></H2>"); +'I I24 rs=st.executeQuery("Select * from ALUMNO where matricula in (select i++; matricula from INSCRIPCION WHERE CVEGRUPO=\""+CveGrupo+"\")"); // Se hace la consulta if(rs.next()){ ¡=IO; // Avanza al siguiente registro matricula=rs.getlnt(l); out.println("<H3> "+ "<a href=http://lis.uam.mx:8080/servlet/mailes.Consulta2?id=" +matricula+"><lMG SRC=\"http://lis.uam.mx/EducDistancia/PrincipalPag/fotos~'+matricula+".gi~' alt=\"Obras\"HSPACE=2O></a>" + matricula +" href=http://lis.uam.mx:8080/servlet/mailes.Consulta2b¡s?~d="+ matricula + "> " + rs,getString(3)+ CveGrupo +"</a>"); while(rs.next()) { matricula=rs.getlnt(l); out.println("<H3>"+ "<a href=http://lis.uam.m~:808O/servlet/" +"mailes.Consulta2?id="+matricula +"><IMG SRC=\"http://lis.uam.mx/EducDistancia/PrincipalPag/fotos/"+matricula+".GlF\" alt=\"Obras\"HSPACE=2O></a>" // +"><IMG SRC=\"http://lis.uam.mx:8080/servlet/Cardozo.jpg\" alt=\"ObrasYqHSPACE=20></a>" + matricula+" <a href=http://lis.uam.mx:8080/servlet/mailes.Consulta2bis?id="+ matricula " + rs,getString(3)+"</a>"); +'I> 1 //aqui se hara referencia a la pagina principal out.println("<BR><BR><A HREF=\"http://lis.uam.mx/EducDistancia/Princ¡palPag/ejemplos.htm~"'); out.println(">Salir</A> "); 1 else out.println("<H2> No HAY REGISTROS<br>"); out.println("</BODY></HTML>"); out.close(); rs.close(); st.close(); db.close(); 1 catch(Exception e) { System.out.println("ERR0R: "+e+" 1 'I+¡); /*Archivo temporal, en el que se hace la consulta de los alumnos del aula virtual, requiere los archivos Con:jultaAl y ConsultaA3*/ package mailes; import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class Consulta2bis extends HttpSelvlet { private String matricula="" ; public void init(Serv1etConfig config) throws ServletException { super.init(config); // NO OLVIDAR PONER EL NOMBRE DEL SERVLET I public void service (HttpServletRequestrequest, HttpServletResponse response){ String SQL-consulta = "SELECT * FROM ALUMNO"; ServletOutputStream out; String parametro,value,url,db-user,passwd,driver; Connection db; Statement st; Resultset rs; int ¡=O: url="jdbc:odbc:Aula-Virtual"; // Nombre de la base de datos en ODBC db-user="SYSDBA"; //Usuario // Password passwd="masterkey"; driver="sun.jdbc.odbc.JdbcOdbcDriver"; //Drivers de ODBC try { out= response.getOutputStream(); 1 catch(Exception e) { System.out.println("ERR0R: "+e+" return; 'I+¡); I try { Class.forName(driver); ¡++;//Se inicializael driver ¡++;/I Se hace db = DriverManager.getConnection(url,db_user,passwd); conexion a la BD st = db.createStatement(); i++; // Inicializa una sesion a la conexion response.setContentType("text/htrnl"); out.println("<HTML>cHEAD><Hl:>Envio de correo UAMVIRTUAL4MG" + " SRC="UAM.GIF" HSPACE=2O></Hl></HEAD>" +" <BODY background=Y'fondol .jpgY' >"); e-mail=request.getParameter("e-,mail"); i=lOOO; la SQL-consulta=SQL-consulta +" WHERE MATRICULA=" + matricula; rs=st.executeQuery(SQL_consulta); if(rs.next()){ out.println("<FORMACTION="http://lis.uam.mx:8080/servlet/mailes.Consultal" METHOD=\"POST\">");i=200; NAME="remitente" <INPUT out.println("<PRE> De: TYPE="TEXT" SIZE=55><br><br>"); out.println(" <INPUT Para: NAME="destinatarios" TYPE="TEXT" SIZE=55><br><br>"); out.println(" NAME="asunto" <INPUT Asunto: TYPE="TEXT" SIZE=55><br><br>"); out.println(" Texto:<BR>"); out.println(" <TEXTAREA COLS=60 ROWS=7 NAME="texto" ></TEXTAREA><br>"); out.println(" NAME="MANDAR" <INPUT TYPE="SUBMIT" VALUE="Enviar"><br>"); out.println(" <a href="http://lis.uam.mx/EducDistancia/PrincipalPag/UniversidadVi~ual.htm"~Cancelar~/a~" ); out.println("</PRE></FORM>"); //aqui debe ir la direcc.de la pagina principal. // out.println("<form action=http://localhost/trabajo/Consulta3 method= post>"); // out.println("<form method=POST> <p><input type=submit name=Bl "); value=Salir></p> </form> 1 out.println("</BODY></HTML>"); out.close(); rs.close(); st.close(); db.close(); 1 catch(Exception e) { try { out.println("ERROR:"+e+" "+i ); out.close(); 1 catch(Exception ei) {} System.out.println("ERR0R: "+e+" 1 'I+¡); ackage mailes; import java.net.*; I27 import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class correo extends HttpServlet { private static final int PUERTO_SMTP=25; private static final char ERROR-SMTP-1='4'; private static final char ERRORSMTP-2='5'; public void service(HttpServ1etRequestreq, HttpServletResponse res) throws ServletException, IOException { String host; String dominio; String remitente; String destinatarios; String asunto; String texto; String datos; Vector sesion = new Vector (20); host = "xanum.uam.mx"; dominio = "uam.mx"; remitente = obtieneParametro(req, "rernitente"); destinatarios = obtieneParametro(req, "destinatarios"); asunto = obtieneParametro(req, "asunto"); texto = obtieneParametro(req, "texto"); try { datos= "Fecha: ''+(new Date()).toString()+"\W+"De: "+remitente+"\r\n"+ "Para: "+destinatarios+"\r\n"+ "Asunto: "+asunto+"\r\n"+ "\r\n"+ texto+"\r\n"; enviaCorreo(host, dominio, remitente, destinatarios,asunto, datos, sesion); enviaRespuesta(req, res, "Correo encoladopara ser enviado", sesion); }catch(lOException e){ enviaRespuesta(req, res, e.toString(), sesion); 1 1 protected String obtieneParametro(HttpServ1etRequest req, String parametro) { String[] valores; String resultado=""; valores=req.getParameterValues(parametro); if (valores!=null) { resultado=valores[O]; 1 return (resultado); 1 I28 protected void enviaCorreo(String host, String dominio, String remitente, String destinatarios, String asunto, String datos, Vector sesion) throws IOException { Socket SockCorreo; BufferedReader in; DataOutputStream out; StringTokenizer token; SockCorreo=new Socket(host, PUERTO-SMTP); in = new BufferedReader(new InputStreamReader(SockCorreo.getlnputStream())); out = new DataOutputStream(SockCorreo.getOutputStream()); leeRespuesta(in,sesion); enviaComando(out,"Helo "+dominio,sesion); leeRespuesta(in,sesion); enviaComando(out,"MAIL FROM: "+remitente,sesion); leeRespuesta(in,sesion); token = new StringTokenizer(destinatarios,","); while (token.hasMoreElements()) { enviaComando (out,"RCPT TO: "+token.nextToken(),sesion); leeRespuesta(in,sesion); I enviaComando(out,"DATA ",sesion); leeRespuesta(in,sesion); enviaComando(out,datos+".",sesion); leeRespuesta(in,sesion); enviaComando(out,"QUIT ",sesion); leeRespuesta(in,sesion); 1 private void enviaComando(Data0utputStream out,String comando, Vector sesion) throws IOException { out.writeBytes(comando+"\r\n"); sesion.addElement(comando); 1 private void leeRespuesta(BufferedReaderin, Vector sesion) throws IOException { String respuesta; char estado; respuesta = in.readLine(); estado = respuesta.charAt(0); sesion.addElement(respuesta); if ((estado == ERROR_SMTP-I)II(estado == ERROR-SMTP-2)) { throw (new IOException ("SMTP: "+respuesta)); 1 I protected void enviaRespuesta(HttpServ1etRequestreq, HttpServletResponse res, String mensaje, Vector sesion) throws IOException { ServletOutputStream out; res.setContentType("text/html"); out = res.getOutputStream(); de java, out.println ("<HTML><HEAD><TITLE>Tutorial "Servlet</TITLE></HEAD>"+ "<BODY BGCOLOR=\"white\"TEXT=\'black\">"+ "<HI> Tutorial de Java, Correo Electrhico</HI>"); out.println("<P>"+mensaje); out.println("<P><B>Parámetros del mensaje de "); out.println("correo elecrónico:</B>"); out.println ("<PRE>"); ="+obtieneParametro(req,"remitente")); out.println ("remitente out.println ("destinatarios ="+obtieneParametro(req,"destinatarios")); out.println ("asunto ="+obtieneParametro(req,"asunto")); ="+obtienePararnetro(req,"texto")); out.println ("texto out.println("</PRE>"); out.println("<P><B>Traceado de la Sesión: </E+"); out.println("<PRE>"); //Enumeration en = sesion.elements(); //while (en. hasMoreElements()) 'I+ // out.println((String) en.nextElement()); 14 out.println("</PRE>"); out.println ("cGR WIDTH=\"20%\" ALIGN=\"LEFT\">"+ "Correo de la Universidad Virtual<br>cpre>"); out.println(" href=\"http://lis.uam.mx"+ "/EducDistancia"+"/PrincipalPag/UniversidadVirtual.htm Y'>"+ "regreso"+ "c/a></pre></BODY></HTML>"); <a 1 7. Migración del sistema a servidor virtual.uam.mx Justificación Es de todos sabido que un servidor soportado por un sistema operativo como Uníx es mas seguro y mas funcional, aunque el tratamiento a este sea de mayor complejidad, lasrazonespara tener nuestro sistema en un servidor Solaris que cuenta conestas características es símbolo de seguridad para el usuario final. La seguridad deestos sistemas no solo se basa en lacomplejidad del sistema operativo, sino también en la parte correspondiente a virus informaticos, ya que al día de hoy no existen virus capaces de doblegar un sistema que este alojado bajo un sistema como lo es Uníx. Proceso de Preparación Como este sistema esta hecho totalmente en lenguaje Java, y sabemos que los programas hechos en este lenguaje es posible ejecutarlo en la mayoría de los sistemas operativos, ésta parte de la migración es la que tiene menor dificultad. Dentro de la estructura planteada tanto en los archivos HTML como en los servlets y clases que tienen contacto directo con la base de datos, la importancia radica en hacer el cambio correcto para realizar el direccionamiento hacia el nuevo sitio, así como hacia la nueva dirección de la base de datos, también es importante que, como dentro de este sistema operativo no existe el puente ODBC es necesario hacer uso de un controlador de tipo 4 como lo es el que contiene interbase a través de la API que contiene el paquete, y de estaformacomunicarnos de forma correcta con la basede datos realizada en interbase para Solaris. Archivos HTML Sistema Windows Redireccionamient o hacia el nuevo Archivos HTML del b Sistema Solaris Diagrama de proceso de redireccionamiento de archivos HTML Servlets del Sistema Windows Redireccionamiento hacia el nuevo sitio y Recompilación de todos los archivos Servlets del b Sistema Solaris Diagrama de proceso de redireccionamientoa la nueva base de datos. Software a Utilizar Para la migracióndelsistemaalservidorvirtual.uam.mxesnecesario y tenemos que evaluar todo el software que vamos a necesitar para esta tarea, considerar los siguientes paquetes: J2SDK 1.2.2que es necesario paraejecutar y compilarlosprogramas hechos en Java. lnterbase Server 6.0 o superior que es necesario para alojar la base de datos de este sistema. Interclient compatible con el lnterbase que hayamos instalado, este es el que nos proporcionara la conexión entre la aplicación Java y la base de datos. Apache Web Server 1.3.0o superior, este el encargado de proveernos una configuración para poner nuestras paginasweb. Apache Jserver 1.1 .O o superior, software encargadodeconfiguraruna zona en la que se alojaran todos los Servlets que ocuparemos a travésdel uso del sistema. Gzip, necesario para hacer la descompresión de los diferentes paquetes que vengan comprimidos con este formato. Proceso de instalación de Java 2 SDK and Runtime Environment Versión1.3.0 Introducción: EstaliberacióndeJava 2 SDKandJava 2 RuntimeEnvironmentv 1.3.0para Solaris SPARC incluye nuevas clases y librerías, además de la maquina virtual de Java con características de tecnología HotSpot. Requerimientos: Solaris 2.6, Solaris 7 o Solaris 8 requieren los parches mencionados a continuación los cuales se encuentran en http://java.sun.com/~2se/l.3/install-solaris-patches.html Solaris Version Patch Note Id -"""""" ""-"" 2.6 (5.6) 2.6 (5.6) 2.6 (5.6) 2.6 (5.6) 2.6 (5.6) 2.6 (5.6) 2.6 (5.6) 2.6 (5.6) 2.6 (5.6) 2.6 (5.6) """-" " " 107733-06 requerido 105568-17 requerido requerido 10521 0-27 106040-13 requerido 105633-38 requerido (1,4,5) 106409-01 requerido (2) 108091-03 requerido (3) 106842-09 requerido (4) 106841-01 requerido (4) 1051 -20 81 requerido 2.6 (5.6) 105669-1O recomendado 2.6 (5.6) 105284-33recomendado 2.6 (5.6) 105591-09requerido 25-09 requerido 2.6 (5.6)1061 7 7 7 7 7 7 7 7 7 7 7 (5.7) 106980-1O requerido (5.7) 107636-03requerido (5.7) 108376-07 requerido (1,5) requerido ( 1 ) (5.7)1071 53-01 (5.7) 106541-1 1 requerido (5.7) 107544-03requerido requerido (5.7) 1 O91 04-01 (5.7) 106950-09requerido (5.7) 106327-08requerido (5.7) 106300-09requerido -20 requerido (5.7) 107081 8 (5.8) 108940-07requerido NOTAS: ( 1 ) - parche requerido para localidades Asiáticas. (2)- parche requerido para desplegar caracteres chinos en aplicaciones Swing (3) - parche requerido paca cualquier localidad en la que se usen caracteres SO8859-1 O lSO8859-15 (4)- parche requerido para soportar moneda europea (5) - requeido para correr kit de compatibilidad Java Test Instalación de los parches: Use el comando “showrev -p” para listar los parches instalados en el sistema, si los parches no están previamente instalaclos, siga los pasos abajo mencionados para hacer la instalación. Esta es simple si ha descargado los archivos.tar correspondientes 1 . Extraiga los archivos.tar de los parches que corresponden a la version de su sistema Solaris como se muestra: Solaris 6:$ tar xvf j2sdkl~3~0-patches-solsparc-5.6.tar Solaris 7: $ tar xvf j2sdkl~~3~0-patches-solsparc-5.7.tar Solaris 8: $ tar xvf j2sdkl~~3~0-patches-solsparc-5.8.tar Estos crearan archivos con el numero de parche con extensi6n.tar.Z. 2. Descomprima y extraiga cada uno de los archivos que desee instalar $ uncompress .tar.Z $ tar xvf .tar Un directorio con un nombre similar al de cara parche se creara, las instrucciones generales de instalación son incluidas en elarchivo install.info en el nivel superior del directorio de cada parche. Se adicionan también instrucciones de instalación especial o requerimientos de post-instalación I34 (tal como un reboto de susistema) en el archivo README incluido en cada parche. 3. Logear el sistema como root. 4. Poner el sistema como monousuario (este paso no es requerido, pero es recomendado para la instalación de los parches)# shutdown 5. Instale los parches, estos deben ser instalados usando los comandos abajo mencionados, debiendo ser consultados los archivos install.info y README. En los comandos abajo mencionados reemplace con la ruta de el directorio de donde serán extraídos. # patchadd -M . . . 6. Salga del sistema y reinicie # shutdown -i6 Instalación de SDKlJRE: Java 2 SDK está disponible como paquete Solaris o como binario auto-extraíble; JRE esta disponible solo como binario auto-extraible. Las siguientes son instrucciones de instalación para SDKIJRE que se desee instalar. Instalación de paquete Solaris SDK: La instalación es simple si el archivo .tar de SDK es descargado en un directorio vacío, y en este. 1. Extraiga el contenido del archivo comprimido. $ zcat j2sdkl-3-0-so1sparc.tar.Z I tar -xf Este creara un conjunto de 6 archivos y 4 paquetes README.sparc LICENSE.ps COPYRIGHT 1.3-Developer-Guide.ps 1.3-Release-Notes.ps 1.3-Release-Notes.htmI SUNWj3rt SUNWj3dev SUNWj3man SUNWj3dem READMEsparc is this file; the LICENSE file is acopy of the license agreement. 2. Conviértase en root su 3. Si se tiene previamente instalado algún paquete de liberación beta de J2SE remuévalos primero $ pkgrm SUNWj2dem SUNWj2man SUNWj2dev SUNWj2rt Si su liga simbólica estaba apuntando a /usr/javal.2, puedes querer actualizar este apuntador a otra plataforma Java como /usr/javaI . I para JDK 1. I .x o /usr/j2se para J2SE 1.3 4. Ejecuta el comando pkadd para instalar los paquetes $ pkgadd -d . SUNWj3rt SUNWj3dev SUNWj3man SUNWj3dem Este instalara SDK dentro de /usr/j2se 5. Elimina los archivos .tar y directorios de extracción 6. Salir del sep de root Instalación de binarios auto-extraíbles de SDKlJRE: Estas instrucciones se aplican pare ambos archivos. Los comandos ejemplo usados abajo usan los nombres de archiv,osde SDK; para JRE simplemente reemplace "j2sdk" por "j2re" en los directorios y archivos mencionados. 1. Cambie los permisos de el grupo de archivos binarios de auto-extracción $ chmod +x j2sdkl-3-0-solsparc.bin 2. Cambie el directorio a la locacion donde serán instalados los archivos. 3. Ejecute los archivos binarios de auto-extracción. Los archivos serán instalados en un subdirectorio llamado j2sdk1-3-0. Después de completar la instalación, el directorio puede ser renombrado según las necesidades. Ejemplo: $ chmod +x /tmp/j2sdkl-3-O-solsparc.bin $ cd /export $ /tmp/j2sdkl~3~0-solsparc.bin Unpacking... Checksumming ... Extracting... Archive: ./install.sfx. 1665 creating: j2sdk1-3-01 Usando Java 2 SDK 1.3: Antes de usar Java 2 SDK o Java Runtime Environment, por favor verifique que los parches requeridos para su versión de Solaris estén instalados. La manera mas fácil de ejecutar Java 2 SDK es actualizando la variable de medio ambiente PATH en su shell colocando la ruta de los ejecutable java al frente, antes /usr/bin. Por ejemplo, si SDK esta instalaclo en /usr/j2se, (csh) setenv PATH "/usr/j2se/bin:$PATH" (sh or ksh) PATH="/usr/j2se/bin:$FATH" Alternativamente, los ejecutables pueden correrse especificando la ruta completa, /usr/j2se/bin/javac, /usr/j2se/bin/java, etc. Ninguna otra variable de ambiente (tal como JDK-HOME, JAVA-HOME o CLASSPATH) son requeridas para ejecutar SDK, sin embargo, existen escenarios de estas variables que pueden resultar en una impropia operación y deben ser checados para posibles conflictos. I36 8. Migración del sistema a servidor infocbi.uam.mx Justificación La razón mas importante de esta migración fue que a raíz del funcionamiento no muy bueno del servidor original en el que se encontraba lis.uam.mx se decide hacer este proceso, el sistema esta siendo usado de forma real por algunos profesores y alumnos, así que es necesario que este sea constante para que el usuario final no se de cuenta de la transición entre un servidory otro. Proceso de Preparación Lasbondadesdellenguaje Java son muy útiles para estosfines, ya quelos al cambios no serán extremadamente grandes, solo serán algunos cambios en cuanto código fuente. Dentro de la estructura planteada tanto en los archivos HTML como en los servlets y clases que tienen contacto directo con la base de datos, la importancia radica en hacer el cambio correcto para realizar el direccionamiento hacia el nuevo sitio,asícomohacialanuevadireccióndelabasededatos.Dentrodela migraciónhaciaestenuevoservidor,laparteimportantedentrodelabasede datos es el paso de una originalmente creada en lnterbase 5, a un lnterbase 6 que incluye un proceso de migración entre controladores de bases de datos. Las siguiente graficas muestran archivos HTML y los archivo .class. el procedimiento de migración utilizado para los Archivos HTML del Servidor lis.uam.mx Redireccionamiento hacia el nuevo sitio Archivos HTML del b Servidor infocbi.uam.mx:85 Diagrama de proceso de redireccionamiento de archivos HTML Servlets del Servidor lis.uam.mx /Y Redireccionamiento hacia el nuevo sitioy a la nueva base de datos Recopilación de todos los archivos Servlets del b Servidor infocbi.uam.mx: -8- Diagrama de proceso de redireccionamientoa la nueva base de datos. Migración de base de datos de Interbase5 a lnterbase 6 Detenga todos los procesos que este corriendo en ambos manejadores. Respalde la base de datos de la versión 5 este creara un archivo .gbk. Apague su lnterbase 5. instale la versión 6 de Interbase. inicializa el nuevo servidor. 0 En WndowsNT, hágalo desde Servicios en el panel de control e inicie lnterbase Guardian. 0 En Windows 9x, ejecute la aplicación lnterbase Guardian 6. Restaure la base de datos .gbk. , esto generara un nuevo .gdb. 1. 2. 3. 4. 5. 9. Conclusiones. El proyecto de Educaciónesunanecesidaddemuchas Universidades, pero no solo anivel nacional, si no a nivel mundial, esta necesidad a provocado el desarrollo deéste proyecto quehabía llegado aun segundo prototipo. Sin embargo en este trimestre se ha llegado a un sistema funcional y estable que está siendo utilizado por varios grupos de licenciatura y posgrado y está teniendo muy buena aceptación. 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, afortunadamente pudimos realizamos la migración del sistema a un servidor mas estable y seguro. De la realización del presente proyecto, se pudo observar y tener viva conciencia de la importancia y el impacto en la sociedad de ladenominada"Educación a Distancia". Asumiéndose ala Universidad Virtual como una aplicación que muestra las ventajas de la educación a distancia en esta era de las comunicaciones,ya que esunaforma flexible de enseñanza especializada a distancia que utiliza avanzadas tecnologías, esto permite ofrecer una formación de excelencia, cumpliendo con los estándares académicos internacionales. Entre otras cosashay que destacarque este proyecto brinda comodidad a los alumnos,ya que puedentomarse las clases en cualquier parte donde exista Internet, por lo que puede ser muy comercial. Cabe mencionar que el proyecto fue desarrollado completamente por alumnosde las carreras de computacióny electrónica con asesorías de profesores de la universidad. 1O. Apéndice Aspectos sobre la máquina conSis1:ema Solaris UAM Virtual n los inicios de este proyecto se pretendió realizar el correo electrónico para la UniversidadVirtualde la UAMy con éxito se realizó, el correo fue implementado en Java (corno todo el proyecto se ha hecho), se desarrollo por medio de un Servlet y se incrusto en la primera página en donde estas apenas eligiendo la forma en que vas a entrar, ya sea como alumno o como maestro. Con esto el correofuncionanadamas como servicio pues no brinda un correo personaly mucho menos su administración tan sólo brinda la interfaz y el envío del mismo. Desde estecorreo se puedemandar de cualquier correo hacia cualquier otro pues te pide destinatario y remitente, además de que se le agregaron vínculos a otros correos de los más conocidos. Bueno a groso modoesto fue lo que desarrollo el proyecto y claro la integración a lo que fue el proyecto el conocerlo y tomar las bases y antecedentes para poder participar en eldesarrollo del mismo. Para desarrollar una segunda parte del proyecto, la idea fundamental que movió los intereses deestefueel migrartodoslos avances hasta elmomentoaunanueva plataforma (y máquina), es decir se quería incursionar en la plataforma UNIX. Para lograr esto se tuvo que empezar desde el principio a conocer este nuevo sistema para todos, no habíanadiequetuviera alguna experiencia eneste sistema. Pero hubo un pequeño inconveniente, la Base de Datos, si la Base de Datos no se podía migrar tal como estaba, para la máquina que trabaja UNIX se utilizará como manejador ORACLE, pero aún falta comprar el Software. Bueno a esto, se comenzó a pensar como poder dar un adelanto a lamigraciónmientrasseconsigueORACLE.Una de las formasfáciles de hacerlo es FTPeando los programas, así que dijimos: vamos a hacer esta máquina un servidor FTP. Y pues manos a la obra, y el FTP se hizo, y bueno los detalles se dan a continuación. ¿Y como fue el FTP? E I desarrollo de FTP fue sencillo, para empezar secreo un directorio en donde se guardaría la información este directorio esta en el directorio raíz y se llama home2 dentro de home2 esta el directorio ftp que como habrán adivinado este es donde pondremos los archivos FTP que además se encuentra acompariado por otro archivo(de requisito) que es lost+found. Y dentrode FTP se encuentran algunas subcarpetas que fueron creadas requisito para tener el buen funcionamiento del FTP. nuevamente como Las carpetas creadas son: bin dev etc Pub usr Dentro de la carpeta bin, todas estas carpetas tienen como owner al superusuario y tienen solo el atributo de lectura, es decir, no se puede escribir en ellas ni ejecutar sobre ellas. 140 Se copiaron algunos archivos del verdadero bin que se encuentra en el directorio raíz Los archivos son: compress IS tar Después tenemos el directorio dev (Que nuevamente es una copia) y dentro de éI se hace un proceso un poco raro se van a crear nodos, de hecho este es uno de los pasos mas importantes para llegar a tener nuestro servidor de FTP anónimo, a modo de comentario le quiero decir que cuando se implemento el FTP esto fue lo que hice hasta el ultimo y antes de hacerlo el FTP todavía no servia para nada y despues de este paso como por artede magia, FTP funciona. Para mayor información sobre como hacer este proceso puede consultar el manual de mknod ( escriba en la línea de comando: man mknod). Bueno como habíamos dicho tenemos que crear nodos a los archivos: tCP ticotsord UdP zero Que se encuentran originalmente en el directorio Idev. Bueno para darnos una ayuda de como crear los nodos debemos teclear en la línea de comandos lo siguiente: # cd /dev # Is -1L Con estoestaremos obteniendo el mayor y menor de cada uno de los archivos mencionados arriba. El numero mayor y menor aparecen al lado izquierdo de la fecha, yconesto también obtendrá la información para saber si es un archivo de bloque(b), de caracter(c) o bien FIFO(p), que es la primera letra que aparece en el renglón del archivo. El siguiente paso ya que conocemos el mayor y menor de estos archivos, es crear ahora si los nodos. Si ya se consulto el manual de mknod se vera que mas o menos la sintaxis para crear cada uno de los nodos es algo parecido a esto: # mknod tcp c I I 42 Y así sucesivamente para los otros tres archivos también hay una copia del directorio etc, que tan importante es para el sistema en esta copia están los archivos: group netconfig passwd De los cuales solo netconfig es una copia, los demás fueron hechos con las entradas mínimas para existir. Esto es, el archivo group no es el original que esta en el directorio etc del directorio raíz, si no que es un archivo que tiene mas o menos la siguiente estructura: root::O:root ftp::50O:ftp 141 La declaración de un grupo llamado roof, luego dos puntos, no tiene contraseña, dos puntos, el numero de grupo O, dos puntos y decir que es miembro de roof. Nuevamente declaramos un grupo nuevo llamado ftp, que de hecho este va a ser el usuario anónimo, dos puntos, sin contraseña, dos puntos, el numero de grupo 500 (que no necesariamente tiene que ser 500, si no solo uno que no haya sido ya utilizado), dos puntos, y decir que pertenece a ftp. Después de esto creamos un archivo llamado passwd (igual que el que esta en /etc) y nuevamente le vamos a poner las entradas necesarias para que se crea que es el que tiene las passwords, pero solo nosotros sabemos que es falso (jajajajajaja). La estructura del archivo es la siguiente: root:x:O: ? : S u p e r - U s e r : L / s b i h sys:x:3:3::/: ffp:x: 1006: 1:Anonymous FTP:/home2/ftp:/birue El usuario roof, el usuario sys y el usuario ftp (este es el bueno para el FTP anónimo), dos puntos, luego una x que simula ser las contraseñas, dos puntos, el numero de identificación de usuario, dospuntos, el numero del grupo al que pertenecen, dos puntos, un comentario cualquiera, dos puntos, el directorio que le pertenece al usuario, dos puntos y por ultimo el directorio a donde irán las salidas erróneas. Y así queda estructurado un archivo que nos servirá para decir que ahí están las contraseñas (Cualquiera pensaría que puede burlar por ahí la seguridad del sistema pero el archivo es falso). Y vamos a tener una carpeta que por convención se llama en la mayoría de las veces PUB que es la contracción de PUBLICO. En este directorio se colocan los archivos, es decir el software, que estará disponible en este tipo de paginas. Sigue la historia La siguiente carpeta en crearse fue usr que recursivamente tiene, o bien, se le crearon enseguida las siguientes carpetas: lib sbin share Y estas carpetas a su vez tienen algo adentro, veamos: La carpeta lib tiene Idso. 1* libcso. 1* 1ibdl.so.I * libmp.so.2* libnsl.so. I * libsocketso. I * nss-compatso. I * nss-dnsso. I * nss-filesso. 1* nss-nis.so. I * nss-nisplusso. 1 * 142 nss-xfnso. I * sfraddr.so* straddr.so.2* Que fueron copiados de la usrllib pero del que esta en la raíz. La carpeta share es la mas ocupada de todas, pues dentro tiene una carpeta llamada lib que a su vez esta llena de archivos que fueron copiados de usrlliblzoneinfo. Que nuevamente es un requisito que pide el demonio del ftp para poder funcionar bien. ¿Que es ftpd? Es el programa o bien llamado demonio que hace posible todos los servicios que pudiera tener el ftp, es decir, este programa siempre esta corriendo, por default, un sistema UNlX es un servidor de FTP, lo Único que falta implementarle, y que fue lo que hicimos, es el ftp anónimo o bien publico. Paraestoprimeramente recurrimos a la información del ftpd, conesto supimos los pasos para implementar este servicio, y además te d ce como protegerte de la red, es decir como dar seguridad a tu ftp anónimo. Para mas información teclear en la línea de comando: # man ftpd Y obtendrás toda la información referente al FTP Bueno con esto quedo implementado el FTP en la maquina de la UOC. Después de haber hecho este servidclr FTP parece fácil la migración del Software, aunque no se trata nadamas de pasar los programas y ya, pues al menos con eso ya tenemos hecho mas del 50%, buenodaré por hecho que el que tenga que pasar los programas sabrá FTPear, y supondré que ya están en la máquina UNIX. Siguiente paso es definir en donde pc'ndremos estos programas (que son servlets, html's y dibujos que aún no investigo si no tienen rlingún problema de una plataforma aotra),bueno la pregunta es ¿Cómo definir en donde estarán los servlets, los html's y los dibujos?. Para empezar para poder correr los Servlets tenemos un programa que se nos acaba de instalar recientemente que es el ¡Planet Web Server del cual tenernos una licencia de 90 días que lo más seguro es que la tendremos que extender, aunque Luis Castro esta negociando el comprar la versión académica, pero independientemente de esto la prioridad para las siguientes personas que ingresen a este proyecto, apartede aprender UNlX tendrán que familiarizarse con esteprograma,eneste momento doy un bosquejo de como utilizar vagamente este programa, después formalizaré mas mi explicación. Primeramente el manual lo encontramos tecleando en el browser www.virtual.uam.mx:85 (Claro estoy pensando que estamos en Internet) Ahí se encuentra toda la información de este programa, y ya después que uno le sabe mover la forma de entrar aéI es: www.virtual.uam.mx:8888 El usuario es : admin Y la clave es : admin (Parece conocido verdad) Dentro de este programa esta toda una ficha para la administración de los servlets ahí es donde se define en que directorio vas a tener los servlets ( o bien mejor dicho, cuando se ejecute un servlet en que directorio lo encontrará la máquina), :;e creará una carpeta en donde quedarán los archivos html y otra en donde quedaran los dibujos por último lo que hay que hacer es cambiar las rutas a los archivos html y a los servlets. I44 1l.Bibliografía. 1001 tips para programar en Java, Steven W. Griffith et al. Mc Graw Hill , México ,D.F ,1998, Ira. Edición Español. Java Servlets, Kalr Moss, Mc Graw Hill, United States of America, 1999, first edition (Primera Edición). Aprendiendo Borland Jbuilder2 en 21 días, Donald Doherty y Michelle M. Manning, Prentice may HispanoamericanaS.A., México, 2000, 1ra. Edición Español. Documentación de reportes anteriores de Educación a Distancia Java Secrets, Elliotte Rusty Harold, o f America, 1997. IDG Books Worldwide, United States REFERENCIAS Ittp://developer.java.sun.com/developer/onlineTraininn/Servlets/ =undamentals/contents.html Ittp://iava.sun.com/docs/books/tutorial/index.html ~ttp://www.netverk.com.ar/usuarios/suweb/html/manualde/man000.htm ~ttp://members.es.tripod.de/froufe/parte2/cap2-1 .html ~ttp://iava.sun.com/products/jdk/l.2/docs/api/ lttp://qeminis.adi.uam.es/-dcc/html/htmll .htm 1ttp://www.eis.uva.es:8O/GuiaHTML/introHTML.html 1ttp://www.fie.us.es/docencia/publi/JAVA lttp://www.servlets.com lttp://java.proqramacion.net/cursos.htm