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