INGENIERÍA DEL SOFTWARE. 4º ING. INFORMÁTICA (UPV/EHU

Anuncio
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
Descargar