INGENIERÍA DEL SOFTWARE. 4º ING. INFORMÁTICA (UPV/EHU) 3 de SEPTIEMBRE de PDF

Please download to get full document.

View again

All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
 2
 
 

Design

  INGENIERÍA DEL SOFTWARE. 4º ING. INFORMÁTICA (UPV/EHU) 3 de SEPTIEMBRE de 2004 NOMBRE: GRUPO: ) (0,25 ptos.) (Tiempo: 5 minutos) Qué es la ingeniería del software? 2) (0,25 ptos.) (Tiempo estimado: 5 minutos)
Related documents
Share
Transcript
INGENIERÍA DEL SOFTWARE. 4º ING. INFORMÁTICA (UPV/EHU) 3 de SEPTIEMBRE de 2004 NOMBRE: GRUPO: ) (0,25 ptos.) (Tiempo: 5 minutos) Qué es la ingeniería del software? 2) (0,25 ptos.) (Tiempo estimado: 5 minutos) Qué es el CMM? 3) ( 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 con 5 intentos previos fallidos Salida: NO dar paso y el número de intentos en la tabla USUARIO(cuenta,passord,numIntentos) para correcto es 5 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 «subsystem» java.sql +entradasistema(in cuenta : string, in password : string) : Boolean 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,5); boolean b = ln.entradasistema( correcto, acertado ); if (b) System.out.println( Error CPx: Permite entrada ); else {int j = lp.comprobarusuario( correcto, acertado ); // Dev. Nº intentos if (j!=5) System.out.println( Error CPx: nº int no es 5 ); else System.out.println( CPx correcto ); donde se usa la clase: OperacionesParaPruebas +aniadirusuario(in cuenta : string, in password : string, in numint : int) +comprobarusuario(in cuenta : string, in password : string) : Boolean 4) (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 DNI) 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 RegistrarHorasBeanEx.java, siguiendo estrictamente el esquema UML y sin modificar absolutamente nada el código de las otras clases que se proporcionan. ApuntarHorasEx.jsp RegistrarHorasEx.jsp RegistrarBilletesBeanEx +????() +????() «interface» InterfaceRegistrarHoras +insertar(in dni : string, in nummins : int, in fecha : Date) : int «subsystem» java.rmi GestorRegistrarHoras +insertar(in dni : string, in nummins : int, in fecha : Date) : int «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= 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-252 import= java.util.date import= java.sql. % html body jsp:usebean id= lognegocio class= reghoras.registrarhorasbeanex scope= request / % boolean res = lognegocio.registrarhoras( request.getparameter( dni ), request.getparameter( minutos ), request.getparameter( dia )+ / +request.getparameter( mes )+ /04 ); if (res) out.println( datos INSERTADOS CORRECTAMENTE ); else out.println( datos NO INSERTADOS CORRECTAMENTE POR ESTA RAZON: + lognegocio.getmensajeerror()); % /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 s,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 ); s=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(,dni); rs=s2.executequery(); if (!rs.next()) return -; // No existe DNI s.setstring(,dni); s.setstring(2,fecha); s.setint(3,nummins); int res = s.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(099); catch (Exception e) {System.out.println(e.toString()+ \nRmiregistry ya lanzado ); Naming.rebind( //localhost:099/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 err= ; public static String maquina= localhost ; public RegistrarHorasBeanEx() {try{ logneg = ((InterfaceRegistrarHoras)Naming.lookup( rmi:// +maquina+ :099/registrarhoras )); catch(exception e) {System.out.println( Error al conseguir la lógica del negocio: +e.tostring()); public boolean registrarhoras(string dni, String mins, String fecha) { try { int res = logneg.insertar(dni,fecha,integer.parseint(nummins)); if (res==-) err = El dni no existe ; else if (res =0) err = Error: no ha podido insertarse ; else err = Datos insertados: DNI= +dni+ minutos= +mins; return (res 0); catch (Exception e) {System.out.println( Error: +e.tostring()); err = Error: no ha podido insertarse ; return false; public String getmensajeerror() return err; 5) (2 ptos.) (Tiempo estimado: 45 minutos) poneenventa Usuario -nombre : string -ciudad : string -dirección : string pujan propietario Subasta -preciosalida : int -codigoartículo : int -propietario : Usuario -categoria : string gana tiene CasaDeSubastas oferta 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, sólo 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 tener 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:. En la clase Usuario, un método que devuelve las subastas que están en la misma ciudad que su ciudad de origen. 2. En la clase CasaDeSubastas, un método que devuelva aquellos usuarios que tengan en venta al menos una subasta. 3. En la clase CasaDeSubastas, un método que devuelva aquellos usuarios que tengan al menos una subasta por la que haya pujado alguien. SOLUCIÓN: poneenventa Usuario -nombre : string -ciudad : string -dirección : string pujan propietario Subasta -preciosalida : int -codigoartículo : int -propietario : Usuario -categoria : string gana tiene CasaDeSubastas oferta. En la clase Usuario, un método que devuelve las subastas que están en la misma ciudad que su ciudad de origen. void Container subastasmismaciudad(){ UnaryPredicate mismaciudad=new UnaryComposePredicate( new BindSecondPredicate(new EqualString(),getCiudad()), new ObtenerCiudad()); Container resultado=filtering.select(casadesubastas.oferta, mismaciudad); return resultado; public class ObtenerCiudad implements UnaryFunction { Object execute(object o) { Subasta s=(subasta)o; return (s.getpropieatario().getciudad()); 2. En la clase CasaDeSubastas, un método que devuelva aquellos usuarios que tengan en venta al menos una subasta. void Container visualizarusuariosconsubastas (){ UnaryPredicate consubastas=new UnaryComposePredicate( new BindSecondPredicate(new GreaterNumber(),new Integer(0)), new ObtenerSubastas()); Container resultado=filtering.select(tiene,conpujas); public class ObtenerSubastas implements UnaryFunction { Object execute(object o) { Usuario u=(usuario)o; return (u.getponeenventa().size()); 3. En la clase CasaDeSubastas, un método que devuelva aquellos usuarios que tengan al menos una subasta por la que haya pujado alguien. void Container UsuariosConPujas(){ UnaryPredicate conpujas=new UnaryComposePredicate( new BindSecondPredicate(new GreaterNumber(),new Integer(0)), new ObtenerPujas()); Container resultado=filtering.select(tiene,conpujas); return resultado; public class ObtenerPujas implements UnaryFunction { Object execute(object o) { Usuario u=(usuario)o; UnaryPredicate conpujas=new UnaryComposePredicate( new BindSecondPredicate(new GreaterNumber(),new Integer(0)), new ObtenerPujas()); Container conpujas=filtering.select(u.getponeenventa(),conpujas); return new Integer(conPujas.size()); 6) (.5 ptos.) (Tiempo estimado: 30 minutos) Desarrollar un componente EJB para la realización de transferencias bancarias para una entidad bancaria. Para realizar una transfere ncia hay que seguir los siguientes pasos):. Conectarse (dniusuario, password) 2. Realizar la transferencia(cuenta origen, destino y cantidad) 3. Desconectarse. Se pide:. Definir las interfaces del Componente con sus correspondientes métodos 2. Implementar el Compone nte. NOTA: Las interfaces extienden de las clases: javax.ejb.ejbobject y javax.ejb.ejbhomeobject NOTA: Tanto las claves CLAVES(usuario, password) como las CUENTAS(idCuenta, cantidad de los usuarios, están almacenadas en la BD en sus correspondientes tablas. Los objetos entidad que mapean estas tablas están accesibles a través los identificadores ClavesJNDI y CuentasJNDI respectivamente. SOLUCIÓN: public interface Transfer extends EJBObject { void connect(string dniuser, String passwd) void transfer(int account, int account2, int q) void disconnect() public interface TransferHome extends EJBHomeObject { public Transfer create() throws RemoteException, CreateException; public class TransferBean implements SessionBean { boolean isconnected; void connect(string user, String passwd){ Properties props=system.getproperties(); // Obtener el contexto JNDI inicial (ip, posicion árbol) InitialContext ctx=new InitialContext(props); Object obj=ctx.lookup( ClavesJNDI ); // Casting AccountHome home=(accounthome ) PortableRemoteObject.narrow( obj, AccountHome.class); Object usr=home.findbyprimarykey(user); User usuario=(user)javax.rmi.portableremoteobject.narrow( usr,user.class); if (usuario.getpassword().equals(passwd) isconnected=true; void transfer(int account, int account2, int q){ if (isconnected) { //propiedades JNDI Properties props=system.getproperties(); // Obtener el contexto JNDI inicial (ip, posicion árbol) InitialContext ctx=new InitialContext(props); Object obj=ctx.lookup( CuentasJNDI ); // Casting AccountHome home=(accounthome ) PortableRemoteObject.narrow( obj, AccountHome.class); Object c=home.findbyprimarykey(account); Object c2=home.findbyprimarykey(account2); Account account=(account)javax.rmi.portableremoteobject.narrow( c,account.class); Account account2=(account)javax.rmi.portableremoteobject.narrow( c2,account.class); if (c.getbalance() q) { c.withdraw(q); c2.deposit(q); void disconnect() {isconnected=false; 7) (2 ptos.) (Tiempo estimado: 45 minutos) La comisión de festejos de nuestro ayuntamiento nos ha encomendado la tarea de diseñar e implementar una aplicación informática para gestión los eventos y personal involucrado en la organización de las fiestas.. El ayuntamiento clasifica al personal en 3 tipos de trabajadores: peones, organizadores de actividades y organizadores de zona. Los organizadores de actividades tienen peones a su cargo, mientras que los organizadores de zona, disponen de organizadores de actividades y peones. Que patrón utilizarías para clasificar jerárquicamente al personal, sabiendo que el futuro puedan aparecer nuevos tipos de pe rsonal (p.ej. Voluntarios). Implementa un método que visualice para cualquier miembro del ayuntamiento, las personas que tiene a su cargo así como cual es su categoría. 2. Sabiendo que: a. El Programa de Fiestas esta compuesto de una serie de festejos(día, lugar, nombre) b. El método Printing.print(Enumeration e), imprime todos los objetos almacenados en el enumerado. Qué patrón utilizarías para poder imprimir el Programa de Fiestas utilizando el método anterior suponiendo que:. Tienes acceso a la clase Programa de Fiestas y puedes modificar su código 2. NO puedes modificar la clase Programa de Fiestas. Diseña e implementa la solución en ambos supuestos. (Solucion apartado ) Se solucionaría aplicando el patrón COMPOSITE. Componente Simple Compuesto Voluntarios Peón Org. Actividades Org. Zona (Solución apartado 2) En apartado a al poder modificar la clase Programa de Fiestas podemos hacer que la clase implemente la interfaz Enumeration, y así utilizando el patrón INERFAZ poder pasar una instancia del la clase Programa de Fiestas al método print de la clase Printing. Printing +print(enumeration e)() use «interface» Enumeration +hasmoreelements() +nextelement() implements «interface» Visualizable +visualize() implements Festejo ProgramaFiestas +hasmoreelements() +nextelement() +vizualize() En el apartado b, al no poder modificar la clase Programa de Fiestas, tendremos que utilizar un clase de ADAPTE la clase Programa de Fiestas a la interfaz Enumeration. Printing +print(enumeration e)() use «interface» Enumeration +hasmoreelements() +nextelement() implements Adapter +hasmoreelements() +nextelement() «interface» Visualizable +visualize() implements Festejo ProgramaFiestas usa +vizualize()
Related Search
We Need Your Support
Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

Thanks to everyone for your continued support.

No, Thanks