Download 26 de MAYO de 2004

Document related concepts
no text concepts found
Transcript
INGENIERÍA DEL SOFTWARE. 4º ING. INFORMÁTICA (UPV/EHU)
26 de MAYO de 2004
NOMBRE:
GRUPO:
1) (0,25 ptos.) (Tiempo: 5 minutos) ¿Qué es el proceso de control de configuraciones del
software?
Es el conjunto de actividades que tratan los cambios en los
requisitos de los usuarios para que los objetivos de calidad y
costo del software se mantengan, así como la integridad de los
productos.
2) (0,25 ptos.) (Tiempo estimado: 5 minutos) ¿Qué es el PSP?
El PSP (Personal Software Process) es un modelo de mejora del
proceso software, que define una serie de técnicas, métodos y
actividades para que cada ingeniero de software mejore
“individualmente” en su forma de desarrollar software.
3) (1 pto.) (Tiempo estimado: 20 minutos) Dado el caso de uso ENTRAR EN EL SISTEMA,
y el siguiente caso de prueba
Entrada: usuario “correcto” password “acertado” Salida: dar paso y el número de
intentos en la tabla USUARIO(cuenta,passord,numIntentos) para “correcto” es 0
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.
Presentacion
-logNeg : InterfaceLogicaNegocio
«interface»
InterfaceLogicaNegocio
+entradaSistema(in cuenta : string, in password : string) : Boolean
«subsystem»
java.rmi
EntradaSistemaRemotoBD
+entradaSistema(in cuenta : string, in password : string) : Boolean
«subsystem»
java.sql
SOLUCIÓN:
public class ComponentePruebaEntrSistema {
InterfaceLogicaNegocio ln; OperacionesParaPruebas lp;
public static void main(String[] args) {
ln = java.rmi.Naming.lookup(“rmi://MAQ:PUERTO/nombreServ”);
lp.aniadirUsuario(“correcto”,“acertado”,1);
boolean b = ln.entradaSistema(“correcto”,“acertado”);
if (!b) System.out.println(“Error CPx: No permite entrada”);
else {int j = lp.comprobarUsuario(“correcto”,“acertado”);
// Dev. Nº intentos
if (j!=0) System.out.println(“Error CPx: No puesto a 0.”);
else System.out.println(“CPx correcto”);}
}
donde se usa la clase:
3) (2,5 ptos.) (Tiempo estimado: 30 minutos) El caso de uso APUNTAR SESIÓN DE
TRABAJO sirve para registrar en el sistema el número de minutos trabajados por una
persona (identificada con el DN I) en una determinada fecha.
A continuación se presenta gran parte de la implementación de dicho caso de uso, así como
un esquema en UML de las clases, componentes, paquetes y relaciones de dependencia y
herencia entre ellos. SE PIDE: implementar la clase RegistrarBilletesBeanEx.java,
siguiendo estrictamente el esquema UML y sin modificar absolutamente nada el código de
las otras clases que se proporcionan.
Presentacion
-logNeg : InterfaceLogicaNegocio
«interface»
InterfaceLogicaNegocio
+entradaSistema(in cuenta : string, in password : string) : Boolean
«subsystem»
java.rmi
EntradaSistemaRemotoBD
+entradaSistema(in cuenta : string, in password : string) : Boolean
«subsystem»
java.sql
Esta es la implementación del JSP ApuntarHorasEx.jsp (no se incluye el código JavaScript
para validar los datos de entrada)
<html><body>
<h2> APUNTAR SESIÓN DE TRABAJO </h2>
<form action="RegistrarHorasEx.jsp" name="formulario" method="post">
DNI: <input type="text" name="dni"> <BR>
Fecha: <input type="text" name="dia" size=1>
<select name="mes" simple>
<option value="3" selected>Marzo</option>
<option value="4">Abril</option>
<option value="5">Mayo</option>
</select>
2004<BR>
Num. de minutos: <input type="text" name="minutos" value="0"> <BR>
<input type="submit" name="enviar" value="Enviar Datos">
</form></body></html>
Esta es la implementación del JSP RegistrarHorasEx.jsp
<%@ page contentType="text/html;charset=windows-1252" import="java.util.Date"
import="java.sql.*"%>
<html><body>
<jsp:useBean id="logNegocio" class="regHoras.RegistrarHorasBeanEx"
scope="request" />
<jsp:setProperty name="logNegocio" property="dni" param="dni" />
<%-- Equivalente a: <% logNegocio.setDni(request.getParameter("dni")); --%>
<% String fecha =
request.getParameter("dia")+"/"+request.getParameter("mes")+"/04";%>
<jsp:setProperty name="logNegocio" property="fecha" value="<%= fecha %>"/>
<jsp:setProperty name="logNegocio" property="numMins" param="minutos"/><p>
RESULTADO: <jsp:getProperty name="logNegocio" property="resultado" />
</body></html>
Esta es la implementación de la interfaz InterfaceRegistrarHoras.java
package regHoras;
import java.rmi.*;
public interface InterfaceRegistrarHoras extends Remote
{int insertar(String dni,String fecha, int numMins) throws RemoteException; }
Esta es la implementación de la clase GestorRegistrarHoras.java
package regHoras;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.*;
import java.sql.*;
public class GestorRegistrarHoras extends UnicastRemoteObject
implements InterfaceRegistrarHoras
{ PreparedStatement s1,s2; Connection o; ResultSet rs,rs2;
public GestorRegistrarHoras() throws RemoteException
{ try{ Class.forName("org.gjt.mm.mysql.Driver");
o=DriverManager.getConnection("jdbc:mysql://localhost/BDHorasProy");
s1=o.prepareStatement("insert into sesion(dni,fecha,numMins)
values(?,?,?)");
s2=o.prepareStatement("select * from estudiante where dni=?");
}catch (Exception ex){System.out.println("Error: "+ex.toString());}}
public int insertar(String dni,String fecha, int numMins)
throws RemoteException
{try{ s2.setString(1,dni);
rs=s2.executeQuery();
if (!rs.next()) return -1; // No existe DNI
s1.setString(1,dni);
s1.setString(2,fecha);
s1.setInt(3,numMins);
int res = s1.executeUpdate();
if (res==0) System.out.println("Error: no insertado...");
return res;
} catch (Exception e) {System.out.println("Error: "+e.toString());
return -5;}}
public static void main(String[] args) {
System.setSecurityManager(new RMISecurityManager());
try { GestorRegistrarHoras objetoServidor = new GestorRegistrarHoras();
try { java.rmi.registry.LocateRegistry.createRegistry(1099);}
catch (Exception e)
{System.out.println(e.toString()+"\nRmiregistry ya lanzado");}
Naming.rebind("//localhost:1099/registrarHoras",objetoServidor);
} catch (Exception e) {System.out.println("Error: "+e.toString());}}}
SOLUCIÓN:
package regHoras;
import java.rmi.*;
public class RegistrarHorasBeanEx
{ InterfaceRegistrarHoras logNeg;
private String dni, fecha;
private int numMins;
public static String maquina= “localhost”;
public RegistrarHorasBeanEx()
{try{
logNeg = ((InterfaceRegistrarHoras)Naming.lookup("rmi://
"+maquina+":1099/registrarHoras"));
} catch(Exception e) {System.out.println("Error al conseguir la
lógica del negocio: "+e.toString());}
}
public void setDni(String d) { dni=d; }
public void setFecha(String f) { fecha=f; }
public void setNumMins(int n) { numMins=n; }
public String getResultado()
{ try {
int res = logNeg.insertar(dni,fecha,numMins);
if (res==-1) return "El dni no existe";
else if (res<=0) return "Error: no ha podido insertarse";
else return "Datos insertados: DNI="+dni+" minutos="+numMins; }
catch (Exception e) {System.out.println("Error: "+e.toString());
return "Error: no ha podido insertarse";} } }
5) (2 ptos.) (Tiempo estimado: 45 minutos)
Usuario
*
poneEnVenta
1
1
*
pujan
-nombre : string
-ciudad : string
-dirección : string
propietario
1*
Subasta
-precioSalida : int
-codigoArtículo : int
-propietario : Usuario
-categoria : string
*
gana
*
oferta
tiene
1
CasaDeSubastas
1
Una casa de subastas quiere realizar una aplicación para gestionar sus subastas on-line. En
la figura superior se muestra el diagrama de clases UML del sistema, donde los rombos
negros representan relaciones de agregación.
Una casa de subastas contiene un conjunto de usuarios y subastas y OJO, solo existe una
instancia de esa clase en el sistema. Un Usuario pone en Venta una serie de subastas, y
además puede ganar otra serie de subastas. A su vez una subasta, puede tene r un conjunto
de usuarios que pujan por ella. De cada subasta almacenamos el precio de salida, el código
del artículo en subasta, el propietario y la categoría a la que pertenece. De un usuario se
almacena su nombre, ciudad y dirección.
Se pide utilizando los contenedores, predicados, funciones y algortimos JGL programar las
siguientes funcionalidades:
1. En la clase Usuario, un método que devuelve el poncentaje de subastas de ese usuario que
no han tenido ganador. NOTA: Una subasta no ha tenido ganador si no tiene ninguna puja.
2. En la clase CasaDeSubastas, un método que visualice ordenados por precio, las subastas
ofertadas en una ciudad c. HOTA: Una subasta se oferta en una ciudad c, si la ciudad del
usuario que pone en venta ese artículo es de la ciudad c.
3. En la clase CasaDeSubastas, un método que para una subasta, visualice otras subastas
similares. NOTA: Una subasta es similar a otra si son de la misma categoría.
SOLUCIÓN:
Usuario
-nombre : string
-ciudad : string
-dirección : string
*
poneEnVenta
1
Subasta
*
1
pujan
1*
-precioSalida : int
-codigoArtículo : int
-propietario : string
-categoria : string
*
gana
*
oferta
tiene
1
CasaDeSubastas
1
1. En la clase Usuario, un método que devuelve el poncentaje de subastas de ese usuario que
no han tenido ganador. NOTA: Una subasta no ha tenido ganador si no tiene ninguna puja.
void visualizarPorcentajeSinGanador(){
UnaryPredicate conPujas=new UnaryComposePredicate(
new BindSecondPredicate(new GreaterNumber(),new Integer(0)),
new ObtenerPujas());
Container resultado=Filtering.select(poneEnVenta,conPujas);
System.out.println(resultado.size()/poneEnVenta.size());
}
public class ObtenerPujas implements UnaryFunction {
Object execute(Object o) {
Subasta s=(Subasta)o;
return (s.getPujan().size());
}
}
2. En la clase CasaDeSubastas, un método que visualice ordenados por precio, las subastas
ofertadas en una ciudad c. HOTA: Una subasta se oferta en una ciudad c, si la ciudad del
usuario que pone en venta ese artículo es de la ciudad c.
void visualizarSubastasCiudad(String c){
UnaryPredicate subastasCiudad=new UnaryComposePredicate(
new BindSecondPredicate(new EqualString(),c),new
ObtenerCiudad());
Container resultado=Filtering.select(tiene,subastasCiudad);
Sorting.sort(resultado, new Porprecio());
}
public class ObtenerCiudad implements UnaryFunction {
Object execute(Object o) {
Subasta s=(Subasta)o;
return (s.getPropietario().getCiudad()); }
}
3. En la clase CasaDeSubastas, un método que para una subasta, visualice otras subastas
similares. NOTA: Una subasta es similar a otra si son de la misma categoría.
void subastasSimilares(Subasta sub){
UnaryPredicate subastasSimilares=new UnaryComposePredicate(
new BindSecondPredicate(new EqualString(),sub.getCategoria()),
new ObtenerCategoria());
Container resultado=Filtering.select(oferta, subastasSimilares);
}
public class ObtenerCategoria implements UnaryFunction {
Object execute(Object o) {
Subasta s=(Subasta)o;
return (s.getCategoria());
}
}
6) (1.5 ptos.) (Tiempo estimado: 30 minutos)
Queremos realizar un componente EJB para la realización de transferencias bancarias.
Una transferencia bancaria se realizar en cuatro fases consecutivas pero NO simultáneas
(Imaginemos que cada datos se recoge de una pantalla diferente):
1. Se elige la cuenta origen (un entero)
2. Se elige la cuenta destino (un entero)
3. Se elige la cantidad
4. Se realiza la transferencia.
Se pide:
1. Definir las interfaces del Componente con sus correspondientes métodos
2. Implementar el Componente.
NOTA: Las interfaces
javax.ejb.EJBHomeObject
extienden
de
las
clases:
javax.ejb.EJBObject
SOLUCIÓN:
public interface Transfer extends EJBObject {
void selectSourceAccount(int account1);
void selectTargetAccount(int account2);
void selectAmount(int q);
void executeTransfer();}
public interface TransferHome extends EJBHomeObject {
public Transfer create() throws RemoteException, CreateException; }
public class TransferBean implements SessionBean {
int acc1,acc2, quant;
void selectSourceAccount(int account1){
acc1=account1;}
void selectTargetAccount(int account2){
acc2=account2;}
void selectAmount(int q){
quant=q;}
void executeTransfer(){
//propiedades JNDI
Properties props=System.getProperties();
// Obtener el contexto JNDI inicial (ip, posicion árbol)
InitialContext ctx=new InitialContext(props);
Object obj=ctx.lookup(“AccountHome”);
// Casting
AccountHome home=(AccountHome )
PortableRemoteObject.narrow(obj, AccountHome .class);
Object c1=home.findByPrimaryKey(acc1);
Object c2=home.findByPrimaryKey(acc2);
Account account1=(Account)javax.rmi.PortableRemoteObject.narrow(
c1,Account.class);
Account account2=(Account)javax.rmi.PortableRemoteObject.narrow(
c2,Account.class);
if (c1.getBalance()>q) {
c1.withdraw(q);
c2.deposit(q);}}
y
7) (2.5 ptos.) (Tiempo estimado: 45 minutos)
Se desea realizar un sistema para monitorizar un sistema de gestión de subastas. Una
subasta tiene una descripción del artículo, un precio de salida, un precio actual, el usuario
con mejor puja y el usuario vendedor. Las operaciones que se pueden realizar sobre una
subasta son:
• Crear, indicando los parámetros necesarios.
• Pujar, indicando quien es el usuario, y cual es precio que por el que desean pujar.
Para simplificar el problema, si el valor pujado es mayor que el valor actual se
modificara automáticamente por este nuevo valor, en otro caso, no se actualizara la
subasta.
Además de gestionar las subastas, queremos que los usuarios que hayan pujado alguna vez
en una subasta, sean notificados de la evolución que va teniendo esa subasta a lo largo del
tiempo, indicando en cada momento cual es el precio actual de la subasta.
1. Diseñar un modelo de clases que recoja esta especificación, indicando los métodos
existentes en cada clase.
2. Para realizar la notificación a los usuarios de la evolución de la subasta, los usuarios
pueden personalizar el canal de comunicación (Móvil, Busca, Correo) a partir del cual
quieren ser notificados de la evolución de la subasta. Pudiendo extenderse en el futuro
a otros medios de comunicación (p. ej. PDA). Realizar los cambios que estimes
oportunos, e implementa las clases Usuario y Subasta.
3. Qué añadirías al sistema para que el mensaje que recibiese cada
usuario
indicándole del nuevo precio de la subasta pudiese particularizarse a diferentes
idiomas? (p. ej. Castellano: El nuevo precio de la subasta es XXX, Ingles: The
new price of the auction is XXX, Euskara: Enkantearen prezio berria XXX
da?). ¿Cómo cambiaría el sistema si se añadiese otro nuevo idioma?
Movil
Busca
«interface»
Observer
+update()
Correo
*
Observable
1
«extends»
<<implements>>
<<implements>>
<<implements>>
«interface»
Dispositivo
+notificar(in text : string)
<<implements>>
<<use>>
Usuario
-nombre : string
-ciudad : string
-dirección : string
mejorPuja
propietario
Subasta
-precioSalida : int
-descripcion : string
-precioActual : Usuario
<<use>>
«interface»
TipoMensaje
+getMensaje(in valor : float) : string
<<implements>>
<<implements>>
Euskara
Ingles
<<implements>>
Castellano
public class Subasta extends Observable {
public int precioActual,precioSalida;
Usuario mejorPuja, propietario;
String descripcion;
public void pujar(Usuario u, int precio) {
if (precio>precioActual) {
precioActual=precio;
mejorPuja=u;
//Añadimos el usuario a la lista de objetos observadores si NO
//existía previamente
if (!exists(u)) addObservers(u);
//Notificar a los observadores
setChanged();
notifyObservers();} }
public class Usuario implements Observer {
Dispositivo D;
TipoMensaje tm;
Observable o;
public void update(){
int nuevoPrecio=o.getPrecioActual();
String mensaje=tm.getMensaje(nuevoPrecio);
d.notificar(mensaje);
}
}