INGENIERÍA DEL SOFTWARE. 4º ING. INFORMÁTICA (UPV/EHU) 16 de SEPTIEMBRE de 2005 NOMBRE: GRUPO: 1) (0,25 ptos.) (Tiempo: 5 minutos) ¿Qué es un servidor de aplicaciones? Es un nodo donde se despliega (instala y ejecuta) la lógica del negocio 2) (0,25 ptos.) (Tiempo estimado: 5 minutos) ¿Qué es WSDL? ¿y SOAP? WSDL (Web Services Description Language) es un lenguaje para describir servicios web y SOAP (Simple Object Access Protocol) es un lenguaje para invocar a servicios web y devolver respuestas a los mismos. 3) (1 pto.) (Tiempo estimado: 20 minutos) Dado el caso de uso PEDIR BILLETE, y el siguiente caso de prueba // Caso de prueba que comprueba que no se pueden reservar más de 5 billetes // para una misma persona, y si se intenta, entonces se queda sin ninguno Entrada: nombre “Kepa Buitre” Condiciones de entrada: Existen 10 billetes libres y 25 ocupados en la tabla BILLETES(NUMERO,NOMBRE,ESTADO), 5 de ellos a nombre de “Kepa Buitre” Salida: no dar un número de billete (devolver el valor -1) y borrados todos los billetes reservados por “Kepa Buitre”, quedando por tanto 15 billetes libres y 20 ocupados. Escribir un componente de prueba para poder probar al menos el caso de prueba anterior, teniendo en cuenta que disponemos de las siguientes clases. NOTA: Si se usa alguna otra clase auxiliar, describirla usando UML. PedirBillete -logNeg : GestorBilletes «interface» GestorBilletes +getBillete(in nombre : string) : int «subsystem» java.rmi ServidorGestorBilletesBD +getBillete(in nombre : string) : int «subsystem» java.sql public class ComponentePruebaEntrSistema { GestorBilletes ln; OperacionesParaPruebas lp = new OperacionesParaPruebas(); public static void main(String[] args) { try{ ln = java.rmi.Naming.lookup("rmi://MAQ:PUERTO/gestorBilletes"); lp.inicializarBilletes(10,20); // 10 libres, 20 ocupados for (int j=0;j<5;j++) // 5 billetes para Kepa Buitre lp.anadirBillete("Kepa Buitre","OCUPADO"); int i = ln.getBillete("Kepa Buitre"); // Llamar lógica negocio int quedanLibres = lp.getNumLibres(); int quedanOcupados = lp.getNumOcupados(); boolean esIncorr = lp.existeBillete("Kepa Buitre","OCUPADO"); if ((i==-1)&&(quedanLibres==15)&& (quedanOcupados==20)&&(esIncorr)) System.out.println("CPxx correcto"); else System.out.println("CPxx incorrecto"); } catch (Exception e) {e.printStackTrace();} } donde se usa la clase: 4) (3 ptos.) (Tiempo estimado: 60 minutos) Las siguientes páginas JSP (IntroducirPronostico.jsp e IntrodPro.jsp) permite n introducir pronósticos de partidos de fútbol en la tabla PRONOSTICO que aparece a continuación, la cual se encuentra accesible por medio de la fuente de datos ODBC llamada BDQuinielas . Cada vez que se introduce un pronóstico para un partido, se incrementa en uno el atributo correspondiente (num1, numX o num2). Suponiendo que el contenido de la tabla Pronostico es el que aparece aquí, y que se pulsa el botón “Introducir Pronóstico” en la página anterior, entonces el nuevo contenido de la tabla Pronostico será el siguiente, donde se ha incrementado en uno el valor del atributo numX correspondiente al partido entre el Osasuna (código 1) y la Real Sociedad (código 2). Se pide: 1) (0,5 ptos) Explicar por qué en la solución proporcionada (ver código de los JSP) no se usa una arquitectura lógica en 3 niveles. 2) (1 pto.) Definir en UML una lógica del negocio apropiada para que pueda plantearse una solución basada en una arquitectura lógica en 3 niveles. Hay que incluir los nombres de las clases y los métodos con sus parámetros. 3) (1.5 ptos.) Indicar qué cambios habría que realizar en las páginas JSP. Incluir el código Java y JSP necesario y usar la lógica del negocio definida en el punto 2. NOTA: la solución propuesta NO DEBE CAMBIAR NADA si se añadiera algún nuevo equipo en la tabla EQUIPO. IntroducirPronostico.jsp: <%@ page contentType="text/html;charset=windows-1252"%> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <title>Introducir Pronóstico </title> </head> <body> <form action="introdPro.jsp" name="formulario"> Equipo Local: <select name="local"> <option value="1" selected>Osasuna</option> <option value="2">Real Sociedad</option> <option value="3">Athletic</option> <option value="4">Alavés</option> </select> <p/> Equipo Visitante: <select name="visitante"> <option value="1" selected>Osasuna</option> <option value="2">Real Sociedad</option> <option value="3">Athletic</option> <option value="4">Alavés</option> </select> <p/> Pronostico: <select name="pronostico"> <option value="uno" selected>1</option> <option value="equis">X</option> <option value="dos">2</option> </select> <p/> <input type="submit" name="intPro" value="Introducir Pronóstico"> </form> </body> </html> IntrodPro.jsp <%@ page contentType="text/html;charset=windows-1252" import="java.sql.*" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <title> Introducir Pronóstico </title> </head> <body> <% Statement s; Connection o; String local = request.getParameter("local"); String visitante = request.getParameter("visitante"); String pronostico = request.getParameter("pronostico"); try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); o=DriverManager.getConnection("jdbc:odbc:BDQuinielas"); s=o.createStatement(); String atributo=""; if (pronostico.equals("uno")) atributo = "num1"; else if (pronostico.equals("equis")) atributo = "numX"; else if (pronostico.equals("dos")) atributo = "num2"; int c=s.executeUpdate("update Pronostico set "+atributo+"=" +atributo+"+1 where codLocal="+local +" and codVisitante="+visitante); } catch (Exception e) {e.printStackTrace();} %> </body> </html> SOLUCIÓN 1): Porque en el nivel de presentación se accede al nivel de datos (en IntrodPro.jsp se utiliza SQL para actualizar la BD); e incluso se tiene parte del propio nivel de datos (en IntroducirPronostico.jsp se tienen los datos de los equipos de fútbol). ¡Si se añadiera un nuevo equipo de fútbol habría que cambiar el JSP!. No existe una lógica del negocio implementada en otras clases o componentes a la que se pueda invocar. Obtener los equipos de fútbol locales y visitantes y añadir un pronóstico se han implementado en la presentación. SOLUCIÓN 2): SOLUCIÓN 3): IntroducirPronostico.jsp: <%@ page contentType="text/html;charset=windows-1252"%> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <title>Introducir Pronóstico </title> </head> <body> <jsp:useBean id="logNegocio" class="GestorPronosticosBean" scope="request" /> <form action="introdPro.jsp" name="formulario"> Equipo Local: <select name="local"> <% java.util.Vector v = logNegocio.getEquiposLocales(); for (int i=0; i<v.size(); i=i+2) { %> // Suponemos vienen en Vector <option value="<%=v.elementAt(i)%>"> // <cod1,equip1,cod2,equip2,…> <%= v.elementAt(i+1)%> </option> <% } %> </select> <p/> Equipo Visitante: <select name="visitante"> <% java.util.Vector v = logNegocio.getEquiposVisitantes(); for (int i=0; i<v.size(); i=i+2) { %> // Suponemos vienen en Vector <option value="<%=v.elementAt(i)%>"> // <cod1,equip1,cod2,equip2,…> <%= v.elementAt(i+1)%> </option> <% } %> </select> <p/> Pronostico: <select name="pronostico"> <option value="uno" selected>1</option> <option value="equis">X</option> <option value="dos">2</option> </select> <p/> <input type="submit" name="intPro" value="Introducir Pronóstico"> </form> </body> </html> IntrodPro.jsp <%@ page contentType="text/html;charset=windows-1252" import="java.sql.*" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <title> Introducir Pronóstico </title> </head> <body> <jsp:useBean id="logNegocio" class="GestorPronosticosBean" scope="request" /> <% logNegocio.addPronostico(request.getParameter("local"), request.getParameter("visitante"), request.getParameter("pronostico")); %> </body> </html> 5) (2 ptos.) (Tiempo estimado: 40 minutos) Se desea realizar una aplicación informática para gestionar las competiciones de natación. Una competición está compuesta por Nadadores y Pruebas, donde un nadador que compite en una prueba obtiene un resultado. El resultado además del tiempo obtenido (min, seg, cent) tiene dos asociaciones que referencian al nadador que lo ha realizado, y la prueba obtenida. En el diagrama UML se reflejan todas las clases y asociaciones que existen en el modelo. Utilizando los algoritmos y predicados JGL, se pide implementar los siguientes métodos en la clase Competicion: 1- Visualizar ordenados por tiempo, los nadadores que han participado en una prueba pru. void nadadoresPrueba(String pru) 2- Visualizar los nadadore s que hayan competido en más de n pruebas. void nadadoresMasDeNPruebas(int n) 3- Visualizar los nadadores que han realizado un tiempo inferior a m minutos, s segundos y c centésimas en la prueba pru void nadadoresTiempoMenor(String pru, int m, int s, int c) 6) (2 ptos.) (Tiempo estimado: 30 minutos) Se desea realizar una aplicación para la evaluación de expresiones aritméticas. Una expresión aritmética es: a) Un número, o bien b) Un operador binario que opera sobre dos expresiones aritméticas. El único requisito del sistema es: 1- Los operadores para los que se define el sistema son inicialmente la Suma, Resta, Producto y División, pero no se descarta que en el futuro se pueda extender a otras operaciones como Exponencial o Logaritmo. Realiza la aplicación teniendo en cuenta este requisito. Se pide: 1. Realizar un modelo que permita recoger expresiones aritméticas 2. Implementa las clases del modelo 3. Realiza un programa que devuelva el resultado de 4+5 * 6-2 (Es decir, 36). 7) (1.5 ptos.) (Tiempo estimado: 20 minutos) Queremos realizar un componente que nos sirva como Monedero Virtual a la hora de realizar compras en Internet. El monedero cuando se crea se inicializa con una cantidad q, y las operaciones que están disponibles son: 1- void añadirCantidad(int q). Se incrementa el monedero con una cantidad q. 2- boolean realizarCompra(String articulo, int precio). Devuelve cierto si hay saldo suficiente, falso en caso contrario. 3- Container articulosComprados(). Devuelve en un contenedor los artículos que se han comprado así como su precio de compra. Se pide: 1. Realizar un componente que implemente este Monedero Virtual. NOTA: Las interfaces javax.ejb.EJBHomeObject extienden de las clases: javax.ejb.EJBObject y