Download 14 de SEPTIEMBRE de 2006
Document related concepts
no text concepts found
Transcript
INGENIERÍA DEL SOFTWARE. 4º ING. INFORMÁTICA (UPV/EHU) 14 de SEPTIEMBRE de 2006 NOMBRE: GRUPO: Las dos primeras preguntas son de test. Es obligatorio marcar las respuestas correctas usando un bolígrafo y dibujando un círculo en torno a la letra de la respuesta. En caso de error poner un aspa. Por cada pregunta puede haber más de una respuesta respuestas erróneas se valorarán negativamente. correcta, las 1) (0,25 ptos.) (Tiempo: 5 minutos) ¿Cómo podemos saber qué hacer a lo largo del proceso de desarrollo del software si seguimos la metodología Rational Unified Process (RUP)? a) Siguiendo los procesos que tiene definidos de forma gráfica en forma de flujos de trabajo o diagramas. b) La metodología RUP no ofrece información de ese tipo. c) Leyendo la abundante bibliografía que lleva adjunta. d) Siguiendo las recomendaciones que se encuentran en las plantillas de los artefactos o productos del trabajo documentales. 2) (0,25 ptos.) (Tiempo: 5 minutos) ¿Qué consecuencias nos traerá el establecimiento de la reutilización sistemática? a) La imposibilidad de utilizar un proceso definido. b) No se podrá utilizar la metodología Rational Unified Process c) La posibilidad de obtener productos de calidad por la utilización de artefactos probados/validados previamente en el desarrollo del software. d) Los artefactos que se reutilizan deben ser gestionados como cualquier otro activo. 3) (1 pto.) (Tiempo estimado: 20 minutos) Dado el siguiente caso de prueba correspondiente al caso de uso RESERVAR CASA, // Caso de prueba que comprueba que NO se puede reservar una casa rural entre dos días diaIni y diaFin si existe una secuencia de ofertas, donde la primera empieza por ini, la última termina en fin, no existen días en medio sin oferta, pero alguna oferta está reservada Entrada: número de casa 18, día ini: 1/6/2006, día fin: 15/6/2006, teléfono: 943121212 Condiciones de entrada: Existen las tuplas <1/6/2006,7/6/2006,400,18,13> y <7/6/2006,15/6/2006,600,18,NULL> en la tabla OFERTAS(FECHAINI,FECHAFIN,PRECIO,NUMCASA,NUMRESERVA> Salida: devuelve -1 (no se puede reservar). En la BD deben existir las tuplas anteriores así: <1/6/2006,7/6/2006,400,18,13> y <7/6/2006,15/6/2006,600,18,NULL> Se pide completar el componente de prueba que aparece a continuación para que pruebe dicho caso de prueba. NOTA: Si se usa alguna otra clase auxiliar, describirla usando UML. public class ComponentePruebaEntrSistema { InterfazFachada ln; public static void main(String[] args) { try{ ln = java.rmi.Naming.lookup("rmi://MAQ:PUERTO/CasaRural"); int numReser = ln.reservar(diaIni,diaFin,numCasa,numTelefono); // Llamada a lógica negocio para reservar la casa } catch (Exception e) {e.printStackTrace();} } SOLUCIÓN: public class ComponentePruebaEntrSistema { InterfazFachada ln; OperacionesPruebas lp = new OperacionesPruebas(); public static void main(String[] args) { try{ ln = java.rmi.Naming.lookup("rmi://MAQ:PUERTO/CasaRural"); lp.aniadirOferta(“1/6/2006”,”7/6/2006”,400,18,13); lp.aniadirOferta(“7/6/2006”,”15/6/2006”,600,18,NULL); int numReser=ln.reservar((“1/6/2006”,”15/6/2006”,18,”943121212”); // Llamada a lógica negocio para reservar la casa if ((numReser==-1) && lp.existeOferta(“1/6/2006”,”7/6/2006”,400,18,13) &&(lp.existeOferta(“7/6/2006”,”15/6/2006”,600,18,NULL)) System.out.println(“Caso de prueba correcto”); else System.out.println(“Caso de prueba incorrecto”); } catch (Exception e) {e.printStackTrace();}} 4) (3 ptos.) (Tiempo estimado: 60 minutos) El siguiente JSP verFavoritos.jsp permite ver los equipos sobre los que es favorito un equipo seleccionado. <%@ page contentType="text/html;charset=windows-1252"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <title>Ver Favoritos</title></head><body> <form action="verFav3N.jsp" name="formulario"> Equipo: <select name="equipo"> <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/> <input type="submit" name="verFav" value="es favorito ante..."></form></body></html> Al pulsar el botón etiquetado con “Ver Favoritos” se cargaría la siguiente página cuyo código HTML es el siguiente: <head><title>Ver Favoritos</title></head> <body> <table border="4" width="200"> <tr> <td> Equipo 1 favorito contra: </td> </tr> <tr> <td>REAL SOCIEDAD</td></tr> <tr> <td>ATHLETIC</td></tr></table></body></html> que muestra el nombre de los equipos sobre los que el equipo seleccionado es favorito, según los datos de la tabla PRONOSTICO. Dicha tabla se encuentra accesible por medio de la fuente de datos ODBC llamada BDQuinielas. En este caso, OSASUNA es favorito ante REAL SOCIEDAD porque en la tupla con codLocal = 1 y codVisitante=2 num1 es mayor que num2; y OSASUNA es favorito ante ATHLETIC porque en la tupla con codLocal=3 y codVisitante=1 num2 es mayor que num1 Se pide: Realizar la implementación del JSP verFav3N.jsp, el cual debe utilizar un Java Bean que implemente la lógica del negocio. Se debe implementar también dicho Java Bean y mostrar el esquema de clases en UML. SOLUCIÓN: verFav3N.jsp <%@ page import="java.util.*" %> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <title> Ver Favoritos </title> </head> <body> <jsp:useBean class="quinielas.QuinielasBean" id="quin" scope="request" /> <% String equipo = request.getParameter("equipo"); Vector favs = quin.obtFavoritos(equipo); out.println("<TABLE border=\"4\" width=\"200\"> <TR> <TD> Equipo "+equipo+" favorito contra: </TD> </TR>"); for (int i=0;i<favs.size();i++){ out.println("<TR> <TD>"+(String)favs.elementAt(i)+"</TD></TR>"); } %> </body> </html> QuinielasBean.java package quinielas; import java.sql.*; public class QuinielasBean { PreparedStatement s1,s2,sX; Statement s; Connection o; public QuinielasBean() {try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); o=DriverManager.getConnection("jdbc:odbc:BDQuinielas"); s=o.createStatement(); } catch (Exception e) {e.printStackTrace();} } public Vector obtFavoritos(String equipo) { Vector favs = new Vector(); try{ String sql = "select nombre from Pronostico, Equipo "+ " where (codLocal="+equipo+" and codVisitante=codigo and num1>num2)"+ " or (codVisitante="+equipo+" and codLocal=codigo and num1<num2)"; ResultSet rs=s.executeQuery(sql); while (rs.next()) favs.addElement(rs.getString("nombre")); } catch (Exception e) {e.printStackTrace();} return favs; } } verFavoritos.jsp verFav3N.jsp QuinielasBean +obtFavoritos(in equipo : string) : Vector «subsystem» java.sql 5) (2 ptos.) (Tiempo estimado: 30 minutos) En el desarrollo de una e-tienda, uno de los componentes básicos es la gestión de los artículos que se van introduciendo a través del componente GestorCarrito. Sin embargo para gestionar las operaciones de carrito, es necesario, utilizar operaciones ubicadas en otros componentes EJB que nos permitan gestionar de manera flexible los artículos (p.ej, ordenar artículos, seleccionar artículo, etc...) . Teniendo en cuenta esta arquitectura, nos proporcionan los métodos de la librería JGL, englobados dentro de un componente EJB, tal y como aparecen en la siguiente figura: GestorCarrito JGL-Library-EJB void sort(Container c, BinaryPredicate bp) Container select(Container c, UnaryPredicate up) int add(Container c, UnaryFunction uf) Se pide diseñar el componente (las 2 interfaces) GestorCarrito, que apoyándose en el componente JGL cuando sea necesario, permita: 1. Crear objetos Carrito. 2. Añadir artículos al carrito(Descripción, cantidad y precio). 3. Imprimir un informe de todos los artículos cuyo precio sea mayor que p, ordenados por descripción, y el montante total de los artículos seleccionados. SOLUCIÓN: public interface CarritoHome extends EJBHome { Carrito create() throws RemoteException, CreateException; } public interface Carrito extends EJBObject { void anadirArticulo(String desc, int cant, float precio) throws RemoteException; void imprimirInformeMayor() throws RemoteException; } public class CarritoBean implements SessionBean { private SessionContext context; public Vector<Articulo> carrito; private GestorPedidos gestorJGL; public void ejbCreate(){ carrito=new Vector<Articulo>(); Context context = getInitialContext(); //localizar y crear una instacia del EJB gestorEJB GestorEJBHome gestorEJBHome = (GestorEJBHome)PortableRemoteObject.narrow (context.lookup("GestorEJB"), GestorEJBHome.class); gestorEJB = gestorEJBHome.create(); } public void anadirArticulo(String desc, int cant, float precio) { carrito.add(new Articulo(desc, cant, precio); } public void imprimirInformeMayor(int cant) { UnaryPrecicate precioMayor=new UnaryComposePrecicate( new BindSecondPrecicate(new GreaterNumber<Integer>(),cant), new ObtenPrecio<Articulo,Integer>()); Container<Articulo> result=gestorEJB.select(carrito,precioMayor); gestorEJB.sort(result, new BinaryComposePredicate<String>( new GreaterString<String>, new ObtenDesc<Articulo, String>, new ObtenDesc<Articulo, String>) ); float total=gestorEJB.add(result, new obtenTotal<Articulo, Float>()); Enumeration<Articulo> e=result.elements(); Articulo art; while (e.hasMoreElements()){ art=e.nextElement(); art.print(); } System.out.println("Total pedido "+total); } 6) (2 ptos.) (Tiempo estimado: 30 minutos) Se desea extender la librería JGL, con una nueva estructura que permita ejecutar una regla sobre un conjunto de elementos. Semánticamente una regla representa la siguiente estructura: SI Condición<T> ENTONCES devolver Acción<T,R> Donde indica que si se cumple una condición sobre T, se ejecuta una acción sobre T, devolviendo un objeto de tipo R. Su implementación es la siguiente: class Rule<T,R> implements UnaryFunction<T,R>{ UnaryPredicate<T> up; UnaryFunction<T,R> uf; R execute(T obj) { if (up.execute(obj)) then return (uf.execute(obj)); else return null; } } Cómo definirías un algoritmo que dada una regla, y un contenedor, devuelva en otro contenedor, el resultado de aplicar la regla a los elementos del contenedor. Atención, sólo deben aparecen aquellos elementos en el contenedor destino, si la parte condición de la regla se ha verificado(es decir, la regla no ha devuelto null). Por ejemplo, dado un contenedor de Personas<nombre, población, dni>, nos devuelva en otro contenedor unicamente los dni-s de las personas que viven en Donosti. Se pide: 1. Definir el algoritmo Rule.applyRule. 2. Definir la regla anteriormente descrita. 3. Realizar un programa principal que aplique la regla anterior. SOLUCIÓN: class Rule<T,R> { public void applyRule(Container<T> source, Container<R> destination, Rule<T,R> r){ Enumeration<T> e=c.elements(); T elem; R result; while (e.hasMoreElements) { elem=e.nextElement(); result=r.execute(elem); if (result!=null) destination.add(result); } return destination; } } public static void main(String args[]){ Container<Persona> personas=new SList(); Container<String> dnis=new SList(); personas.add(new Persona("Aitor","34123456","Donosti")); personas.add(new Persona("Mikel","34123123","Bilbo")); ........ UnaryPredicate<Integer> esdeDonosti=new UnaryComposePrecicate( new BindSecondPrecicate(new EqualString(),"Donosti"), new ObtenCiudad()); UnaryFunction<Persona, String> obtenDni=new ObtenDni(); //Una funcion unaria que pone el numero en positivo. Rule<Persona, String> regla=new Rule(esdeDonosti,obtenDni); dnis=Rules.applyRule(list, regla); } 7) (1.5 ptos.) (Tiempo estimado: 30 minutos) Se desea gestionar los distintos foros(música, deportes, teatro, etc…) que la UPVEHU tiene en el Campus de Gipuzkoa. Con este propósito, se desea realizar una aplicación informática que gestione los mensajes que envían los participantes de los distintos foros. Un participante debe tener la posibilidad de darse de alta en un foro, y de enviar un mensaje a cualquier foro. Por otro lado, cuando un mensaje es enviado a un foro, se envía una notificación a todos los participantes subscritos a ese foro. Los participantes de los foros pueden ser profesores, alumnos, becarios o personal del PAS, cada uno con sus atributos y funcionalidades propias. Se pide: 1. Diseñar el diagrama de clases de la aplicación, así como los atributos y métodos que estimes oportunos. 2. Implementar los métodos que estimes más relevantes para la gestión de los mensajes de los foros. SOLUCIÓN: Diseño: Observer Observable update() addObserver() notify() implements extends Usuario Foro alta(Usuario u) enviarMsg(String msg) ForoMusica ForoDeport ForoTeatro Implementacion class Foro implements Observable { public void alta(Usuario u) { addObserver(u); PAS Becario Alumno } public enviarMsg(String msg){ //Visualizar el msg en el foro //Notificar a los usuarios subcritos setChanged(); notifyObservers(); } } class Usuario implements Observer { public void update(){ //Se le notifica que ha habido un nuevo msg a los foros a los que estaba suscrito } }