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
}
}