EHU) 29 de MAYO de 2002

INGENIERÍA DEL SOFTWARE. 4º ING. INFORMÁTICA (UPV/EHU) 29 de MAYO de 2002 NOMBRE: GRUPO: 1.- (0,5 ptos.) (Tiempo estimado: 10’) Enuncia cuáles son l...
3 downloads 2 Views 65KB Size
INGENIERÍA DEL SOFTWARE. 4º ING. INFORMÁTICA (UPV/EHU) 29 de MAYO de 2002 NOMBRE:

GRUPO:

1.- (0,5 ptos.) (Tiempo estimado: 10’) Enuncia cuáles son las interfaces que se tienen que definir para desarrollar un EJB, así como cuál es su finalidad.

2.- (0,5 ptos.) (Tiempo estimado: 10’) Explica qué son los RESGUARDOS y los CONTROLADORES, y su relación con los COMPONENTES y PROCEDIMIENTOS DE PRUEBA

3.- (2,5 ptos.) (Tiempo estimado: 40’) Queremos trabajar con una especie de base de datos utilizando JGL. Para ello, se utilizará un Container JGL para almacenar las “tuplas” y el siguiente algoritmo JGL para realizar consultas de selección: Filtering.select(Container, UnaryPredicate) El predicado JGL UnaryPredicate se utiliza para expresar la condición de la selección. Se pueden realizar preguntas con condiciones compuestas con el siguiente UnaryPredicate: UnaryAnd(UnaryPredicate, UnaryPredicate) En concreto, se puede conseguir la conjunción lógica de dos predicados, esto es, que se devuelva true si y sólo si ambos predicados devuelven true. Para visualizar los resultados podemos utilizar este otro algoritmo JGL, que aplica una función a todos los elementos del Container. Applying.forEach(Container, UnaryFunction) A continuación se presenta el diseño de tres clases: Empleado, Becario y Profesor y el código INCOMPLETO de una clase Principal que visualiza la respuesta a la siguiente consulta:

CONSULTA: encontrar todos los profesores que ganan más de 150.000 y que son de Lezo Empleado -nombre : String -diasTrabajados : int -sueldoDiario- : double -ciudad : String +getSueldo() : double +toString() : String

Becario

Profesor

-proyecto : String

-departamento : String

+toString() : String

+toString() : String

// Omitimos los imports de JGL public class Principal { public static void main (String[] args) { double topeSueldo = 150000.0; String ciudad = "Lezo"; Container datos = new Array(); datos.add(new datos.add(new datos.add(new datos.add(new

Becario("Leizarraga",20.0, 1300.0, "Aduna","UPV-EHU") ); Becario("Lizarralde",25.0,1200.0, "Lekeitio","DIPU")); Profesor("Fernandez",120.0, 3000.0, "Lezo","LSI") ); Profesor("Zelaia",50.0, 4000.0, "Lezo","ATC") );

UnaryPredicate profesor UnaryPredicate sueldo UnaryPredicate ciudadano

= new InstanciaDeProfesor(); = new TopesSueldo(topeSueldo); = new CiudadanoDe(ciudad);

Container resultado = Filtering.select(?????, ??????);

// Usar Applying.forEach(??????, ??????) para visualizar datos

} }

fin de la clase Principal

Se pide: realizar la implementación de las clases necesarias y completar la clase Principal.

4.- (3 ptos.) (Tiempo estimado: 45’) El diagrama de secuencia con el diseño del caso de uso “Buscar Personas Por Nombre”

Buscar Personas Por Nombre Usuario

es el siguiente:

: IU_VP

GBD: Statement

: GestorPersonas

usuario escribir Nombre() buscarPorNombre(nombre:String) executeQuery("select * from persona where nombre= %nombre")

next()

new()

r: ResultSet

getString("nombre"),...,: getString("telefono") new Persona(nombre:String, direccion:String, telefono:String) Pi: Persona P1, P2, ... Pn()

getNombre() getDireccion() getTelefono()

Esta es la interfaz gráfica de usuario correspondiente al caso de uso:

A continuación presentamos una implementación INCOMPLETA en Java de dicho caso de uso utilizando una arquitectura física en tres niveles. package jun02; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; import java.rmi.*; public class IU_VP extends JFrame { JLabel jLabel1 = new JLabel(); JTextField jTextField1 = new JTextField(); JTextArea jTextArea1 = new JTextArea(); GestorPersonas g; public IU_VP() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { jLabel1.setBounds(new Rectangle(17, 41, 130, 30)); this.getContentPane().setLayout(null); this.setSize(new Dimension(400, 300)); this.setTitle("Pertsonen bilakatzaile / Buscador de Personas"); jLabel1.setRequestFocusEnabled(false); jLabel1.setText("Izena / Nombre"); jTextField1.setBounds(new Rectangle(122, 40, 197, 33)); jTextField1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { jTextField1_actionPerformed(e); } }); jTextArea1.setBounds(new Rectangle(45, 97, 261, 145)); this.getContentPane().add(jTextArea1, null); this.getContentPane().add(jTextField1, null); this.getContentPane().add(jLabel1, null); } public void setLogicaNegocio(GestorPersonas gp) {g=gp;}

void jTextField1_actionPerformed(ActionEvent e) {

} public static void main(String[] argc) { IU_VP i = new IU_VP(); i.setVisible(true); try{ System.setSecurityManager(new RMISecurityManager()); String url = i.setLogicaNegocio((GestorPersonas)Naming.lookup(url)); } catch (Exception ex) { } } }

package jun02; import com.objectspace.jgl.Container; public interface GestorPersonas { /** Método que busca personas con un determinado nombre * @param n Nombre de la persona a buscar * @return Container con los objetos de Persona que tienen dicho nombre */ Container buscarPorNombre(String n) }

package jun02; public class Persona { private String nombre; private String direccion; private String telefono; public Persona(String n, String dir, String tel) { nombre=n; direccion=dir; telefono=tel; } public String getNombre(){return nombre;} public String getDireccion() {return direccion;} public String getTelefono() {return telefono;} }

package jun02; import java.rmi.server.*; import java.rmi.*; import java.sql.*; import java.util.*; import com.objectspace.jgl.Container; import com.objectspace.jgl.Array; public class ImplGestorPersonas { PreparedStatement s; Connection o; public ImplGestorPersonas() throws RemoteException { try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); o=DriverManager.getConnection("jdbc:odbc:BDPers"); s=o.prepareStatement("select nombre, direccion, telefono"+ " from persona where nombre like ?"); } catch (Exception ex){System.out.println("Error: "+ex.toString());} } public Container buscarPorNombre(String n) throws RemoteException { Array v=new Array();

} public static void main(String[] args) { System.setSecurityManager(new RMISecurityManager()); try { ImplGestorPersonas objetoServidor = new ImplGestorPersonas(); try { java.rmi.registry.LocateRegistry.createRegistry(1200); } catch (Exception e) {System.out.println("Rmiregistry ya lanzado");} Naming.rebind("//localhost:1200/gestorPersonas",

);

System.out.println("Lanzado el objeto servidor"); } catch (Exception e) {System.out.println("Error al lanzar el servidor"+e.toString());} }}

Se pide implementar el código correspondiente a la respuesta al evento “escribir un nombre en la caja de texto de la interfaz gráfica de usuario”, la implementación del método buscarPor Nombre y las llamadas a los métodos lookup y rebind de RMI. Además existen algunos errores claros que hay que corregir.

5.- (3,5 ptos.) (Tiempo estimado: 60’) Una operadora de telefonía ha puesto un nuevo servicio disponible a sus clientes. El servicio “aviso de llamadas” consiste en enviar a los dispositivos pre establecidos por el cliente (correo electrónico, buscador, móvil o teléfono fijo ) la llegada de una llamada de cualquiera de sus dispositivos. En el mensaje se indica el número del dispositivo a partir del cual se ha realizado la llamada. Los dispositivos se subscriben a otro dispositivo mediante el método subscribir(dispositivo) y se pueden dar de baja mediante el método unsubscribir(dispositivo). Suponiendo que el programa principal y su salida es la siguiente:

public static void main(String[] args) { TelefonoFijo tfijo=new TelefonoFijo("943015052"); TelefonoMovil tmovil=new TelefonoMovil("Mi movil"); CorreoElectronico correo=new CorreoElectronico("[email protected]"); Buscador bus=new Buscador("El busca de pepe"); tfijo.subscribir(tmovil); tfijo.subscribir(bus); tfijo.llamada(new TelefonoFijo("943015555")); tfijo.unsubscribir(bus); tfijo.llamada(correo); correo.subscribir(tmovil); correo.subscribir(tfijo); correo.llamada(bus); }

Mensaje Mensaje Mensaje Mensaje Mensaje

al al al al al

busca recibido en 943015052 enviado desde 943015555 móvil recibido en 943015052 enviado desde 943015555 móvil recibido en 943015052 enviado desde [email protected] fijo recibido en [email protected] enviado desde El busca de pepe móvil recibido en [email protected] enviado desde El busca de pepe

SE PIDE: 1. Diagrama de clases para modelar la aplicación, con los métodos que estimes relevantes 2. Implementación de las clases del diseño. 3. Recientemente la operadora desea construir un nuevo módulo “almacenamiento de llamadas”. Este módulo permite almacenar llamadas a través del método insertLlamada(String numero) y devolver el conjunto de llamadas almacenadas a través del método getLlamadas(). Diseña e implementa este módulo teniendo en cuenta que (1) NO debes ofrecer detalles al cliente de este módulo, acerca de la implementación y (2) NO debes apoyarte en ninguna librería de java. 4. Modifica el diseño inicial para poder añadir la funcionalidad getLlamadasRecibidas() (p.ej. correo.getLlamadasRecibidas()) a todos los dispositivos del sistema. Esta funcionalidad nos devuelve todas llamadas redirigidas a un dispositivo. 5. Implementa los métodos necesarios para dar soporte al servicio del punto 4.