Download Ingeniería del Software

Document related concepts
no text concepts found
Transcript
Ingeniería del Software
Ejercicios de Implementación





Caso
Caso
Caso
Caso
Caso
de
de
de
de
de
Uso
Uso
Uso
Uso
Uso
Total Gasto (Junio 2003)
Mejor Usuario (Septiembre 2003)
Grado de Ocupación (Junio 2004)
Registrar (Septiembre 2004)
Entradas Vendidas (Junio 2005)
 Se pide:



Diagrama de clases con su separación física
Completar código
Explicar instrucciones
1
Ingeniería del Software
Ejercicios de Implementación
 Caso de Uso Total Gasto (Junio 2003)
 Se pide:



Diagrama de clases con su separación física
Completar código
Explicar instrucciones
2
Ingeniería del Software
C
alcularel total degastosdeunusuario
(D
iagram
asecuenciaSG
B
D
)
:IU
_VentasPorFechas
:G
estorVentas
:G
estor_BD
Adm
inistrador
1: Introducir nom
bre
g1:
SELEC
Ttotalprice
FR
O
MO
rders
W
H
ER
Eusernam
e=%
nom
bre
2: calcular
3: calcular (nom
bre)
3: execSQ
L(g1:String)
4: new
()
*
R
epetir para
todaslastuplas
:R
esultados_SQ
L
5: next()
6: get("totalprice")
O
rders
total
total
-usernam
e
-orderid
-orderdate
-totalprice
-creditcard
3
Capa de Lógica de Negocio
class java.rmi.server.UnicastRemoteObject
interface java.rmi.remote
-- clase remota
-- interfaz remota
extends
extends
class GestorVentas
implementa
+ int calcular (String usuario)
...
interface GestorVentasInterfaz
+ int calcular (String usuario)
+ main (){ ...//Naming.rebind }
usa
SERVIDOR
SERVIDOR DE
DATOS
CLIENTE
class IU_TGU
gv: GestorVentasInterfaz
// Naming.lookup
BD
--
Capa de Datos
Capa de Presentación
4
Ingeniería del Software
void jButton1_actionPerformed(ActionEvent e) {
try {
int total = gv.calcular(jTextField1.getText());
jTextField2.setText(new Integer(total).toString ())
}
catch (Exception ex) {System.out.println("Error:"+ex.toString());}
}
5
Ingeniería del Software
public static void main(String[] args){
IU_TGU frame = new IU_TGU();
frame.setVisible(true);
try {
System.setSecurityManager(new RMISecurityManager());
gv =(GestorVentasInterfaz)Naming.lookup("rmi://
localhost:1099/GestionDeVentas");
}
catch (Exception ex) {System.out.println("Error:"+ex.toString());}
}
6
Ingeniería del Software
public class GestorVentas extends UnicastRemoteObject
implements GestorVentasInterfaz {
Statement s;
Connection c;
…
7
Ingeniería del Software
public int calcular(String nombre) throws RemoteException {
try {
int total=0;
s=c.createStatement();
ResultSet r=s.executeQuery("select totalprice from orders where
username='"+nombre+"'");
while(r.next()){
total=total+r.getInt("totalprice");
}
return total;
}
catch(SQLException e){
System.out.println("Error:"+e.toString());
return -1;
}
}
8
Ingeniería del Software
1. El cliente localiza el objeto remoto GestorVentas mediante el
método lookup de la clase Naming. Para ello utiliza el nombre
con el que ha identificado el objeto en el registro de nombres
rmi: GestionDeVentas del servidor sipsi.ehu.es que atiende
peticiones por el puerto 1099.
2. El servidor utiliza el método forName de la clase Class para
cargar el driver que actuará de puente entre las llamadas JDBC
y el driver ODBC que accede a una BD.
3. El método setConnection nos crea una conexión con la base de
datos BDPetShop alojada en el servidor sipsi.ehu.es
4. El servidor utiliza el método rebind de la clase Naming para
registrar un objeto servidor en el registro de nombres rmi. Se
nombra como GestionDeVentas a un objeto GestorVentas que
esta situado en el servidor sipsi.ehu.es, siendo el puerto de
escucha de peticiones el 1099.
9
Ingeniería del Software
Ejercicios de Implementación
 Caso de Uso Mejor Usuario (Septiembre 2003)
 Se pide:


Diagrama de clases con su separación física
Implementar método
10
Ingeniería del Software
Buscar UsuarioConMasGasto(DiagramasecuenciaSGBD)
:IU_PremiarUsuario
:GestorUsuario
:Gestor_BD
Administrador
1: Buscar usuarioconmásgastos
g1:
SELECTtotalgastomes
FROMUsuarios
2: buscarUsuarioConMasGasto
3: execSQL(g1:String)
4: new()
*
Repetir para
todaslastuplas
:SQL_Emaitza
5: next()
6: get("totalgastomes")
7: get("nombre")
nombre
Usuarios
-nombre
-contraseña
-...
-totalgastomes
11
class java.rmi.server.UnicastRemoteObject
interface java.rmi.remote
-- clase remota
-- Interfaz remota
extends
extends
Capa de Negocio
class GestorUsuario
implementa
+ String buscarUsuarioConMasGasto()
interface InterfazGestorUsuario
+ String buscarUsuarioConMasGasto()
{...}
...
+ main (){ ...//Naming.rebind }
usa
class IU_PremiarUsuario
g: InterfazGestorUsuario
DB
// Naming.lookup
--
Capa de Datos
Capa de Presentación
12
Ingeniería del Software
public String buscarUsuarioConMasGasto () throws RemoteException {
try {
int max=0;
int totalgasto;
s=c.createStatement();
ResultSet r = s.executeQuery ("select totalgastomes from Usuarios”);
while(r.next()){
totalgasto = r.getInt("totalgastomes");
if (totalgasto>max) {
usuario = r.getString(“nombre”);
max = totalgasto
}
}
return usuario
}
}
13
Ingeniería del Software
Examen Junio 2003-2004
 2o Parcial: Implementación: Grado Ocupación
 Se pide:



El diagrama de clases y la separación física
Implementar en Java el método GradoOcupación de la
clase Película
Responder a las preguntas
14
Ingeniería del Software
Diseño “Grado Ocupación”
:IU_GO
:GestorDB
:Pelicula
Encargado
1: Intro ciclo
2: OK
g1:
select vendidas, butacas fromPase inner join Pelicula inner join Sala
where ciclo = 'ciclo' and fecha > 'fechaActual'
GradoOcupacion (ciclo)
execSQL (g1)
new
:Resultados_SQL
* Repetir para
todas las tuplas
next
[resultado no vacío]: get("vendidas"),get("butacas")
TotalEntradasVendidas=TotalEntradasVendidas+vendidas
TotalButacas=TotaButacas+butacas
Tablas de la Base de Datos
GradoOcupación=(TotalEntradasVendidas/TotalButacas)*100
GradoOcupacion
Pelicula
#códigoPelícula
-ciclo
-título
-categoria
-director
-actores
-descripción
-duración
-imagen
*
*
Sala
#códigoSala
-butacas
Pase
#códigoPelícula
#códigoSala
#fecha
#horaInicio
#horaFin
-precio
-/vendidas
15
class java.rmi.server.UnicastRemoteObject
extends
interface java.rmi.remote
Capa de Lógica de Negocio
class Pelicula
implements
extends
interface InterfazPelicula
+ int gradoOcupacion(String ciclo)
+ int gradoOcupacion(String ciclo){...}
...
+ main (){ ... Naming.rebind }
usa
SERVIDOR
SERVIDOR DE
DATOS
CLIENTE
class IU_GO
p: InterfazPelicula
BD
+ main () { ... Naming.lookup }
Capa de Datos
Capa de Presentación
16
public int gradoOcupacion (String ciclo, String fechaA) throws RemoteException {
String SQL = "select vendidas, butacas from Pase inner join Pelicula inner
join Sala where ciclo = ‘”+ciclo+”' and fecha > ‘”+fechaA+”‘ ";
int totalEntradasVendidas
= 0;
int totalButacas
= 0;
try {
Statement s = c.createStatement(); // connection c anteriormente definida
ResultSet r = s.executeQuery(SQL);
while (r.next()){
totalEntradasVendidas = totalEntradasVendidas +
r.getInt(“vendidas");
totalButacas = totalButacas + r.getInt(“butacas");
}
go = (totalEntradasVendidas/totalButacas)*100;
}
catch (Exception ex) { go = -1; }
return go;
}
17
1.
¿En el método de qué clase se carga el puente JDBC-ODBC?
En el constructor de la clase Pelicula.
1.
¿Cómo es la instrucción que establece la conexión con la base de
datos?
Connection c = DriverManager.getConnection(“jdbc.odbc.BD”);
1.
¿Qué instrucciones registran el servicio remoto y en el método de
qué clase se encuentran?
Pelicula p = new Pelicula();
Naming.rebind(“”//localhost:1099/Pelicula”, p);
En el método main de la clase Pelicula.
1.
¿Cuál es la instrucción que busca el objeto remoto y en qué
método de qué clase se encuentra?
p = (Pelicula)Naming.lookup("rmi://super.zinemaldia.es:1099/Pelicula");
En el método main de la clase IU_GO.
18