Preguntas ISD
![]() |
![]() |
![]() |
Título del Test:![]() Preguntas ISD Descripción: test final isd |




Comentarios | |
---|---|
| |
FIN DE LA LISTA |
Indicar cuál de las siguientes características NO es un requisito que deben cumplir las aplicaciones empresariales. Capacidad de soportar más usuarios o más carga al aumentar los recursos disponibles. Tolerancia a fallos mediante replicación de recursos. Transaccionalidad. Todos los usuarios deben acceder a la misma funcionalidad. Indicar cuál de las siguientes afirmaciones es correcta. En una arquitectura en 2 capas físicas (capa 1: máquina con la interfaz de usuario y la capa modelo, capa 2: máquina con la base de datos), los cambios en la implementación de la capa modelo requieren que se recompile toda la aplicación para reinstalar en las máquinas cliente. En una arquitectura en 3 capas físicas usando navegadores como clientes (capa 1: máquina con el navegador, capa 2: máquina con la interfaz y la capa modelo, capa 3: máquina con la base de datos), los cambios en la interfaz gráfica o en la capa modelo sólo requieren reinstalar la aplicación en la máquina de la capa 2. Las dos anteriores. Ninguna de las anteriores. Indicar cuál de las siguientes afirmaciones es correcta cuando hablamos de diseño de aplicaciones por capas. Normalmente el software es más complejo. En ciertos casos, una capa podría hacer su función de forma más óptima si supiese cómo funciona otra capa. Todas las anteriores. Ninguna de las anteriores. En una arquitectura típica de diseño por capas de aplicaciones empresariales. Hay una separación clara entre las capas modelo e interfaz. La capa modelo suele subdividirse en dos capas: capa de acceso a datos y capa de lógica de negocio. La capa modelo constituye la capa de acceso a los datos, mientras que la capa interfaz implementa la lógica de negocio usando la capa modelo. La a) y la b) son correctas. Suponga que trabaja en el Departamento de Sistemas de una empresa, estando al cargo de la administración de la infraestructura software de la empresa. En un momento dado, se decide cambiar el gestor de base de datos (e.g. pasar de MySQL a Oracle). Como administrador del servidor de aplicaciones Java EE (e.g. Tomcat) de la empresa, usted necesita. Reemplazar el driver JDBC anterior por el nuevo. Actualizar la configuración de los DataSources que haya definidos. JDBC define un protocolo estándar de comunicación con un gestor de base de datos relacional, y en consecuencia, no es necesario realizar ninguna tarea de administración en el servidor de aplicaciones. La a) y la b) son correctas. Analice el siguiente fragmento de código (la columna name es de tipo cadena de caracteres). Indique la opción correcta. ... String queryString = “UPDATE Product GET name = <<A>> WHERE productid= ? ”; PreparedStatement preparedStatement = connection.prepareStatement(queryString)); preparedStatement.getString(1, product.getName()); preparedStatement.setLong(2, product.getProductId()); int updatedRows = preparedStatement.<<B>>(); ... <<A>> debe ser ?, <<B>> debe ser executeQuery. <<A>> debe ser ‘?’, <<B>> debe ser executeQuery. <<A>> debe ser ?, <<B>> debe ser executeUpdate. <<A>> debe ser ‘?’, <<B>> debe ser executeUpdate. Considere las dos siguientes estrategias de implementación con respecto a los métodos de los servicios de la capa modelo. La capa modelo está instalada dentro de un servidor de aplicaciones y es invocada por la capa de servicios Web. Indique la respuesta correcta. Estrategia 1 public void <<método>> () { try (Connection connection = <<Obtener conexión>>) { <<Implementar lógica de negocio usando “connection”>> } catch (SQLException e) { throw new RuntimeException(e); } } Estrategia 2 public void <<método>> () { try { Connection connection = <<Obtener conexión>> <<Implementar lógica de negocio usando “connection”>> } catch (SQLException e) { throw new RuntimeException(e); } }. Con la estrategia 2 es posible atender más peticiones (del mismo o distintos clientes). Con la estrategia 1 es posible atender más peticiones (del mismo o distintos clientes). Con la estrategia 2 la conexión nunca se cerrará. Ninguna de las anteriores. Considere DriverManager y un DataSource que utilice la estrategia pool de conexiones. Indique la afirmación correcta. DriverManager es capaz de devolver una conexión a la base de datos en menos tiempo. Una vez obtenida una conexión a la base de datos (desprecie este tiempo), si se lanza una consulta sobre la conexión, es más rápida su ejecución si se ha obtenido de un DataSource de ese tipo. El método close de DriverManager cierra la conexión a la base de datos. La b) y la c). Considere las entidades Product (producto) y Category (categoría) en una tienda Web hipotética. Un producto tiene un identificador automáticamente generado y un nombre. Una categoría tiene un identificador automáticamente generado (categoryId) y un nombre. En esta tienda, un producto solo puede estar clasificado en una categoría, y por supuesto, dentro de una categoría puede hacer diversos productos. Utilizando el método de modelado de entidades estudiado en la asignatura, indique la afirmación correcta. La entidad Product contiene el atributo categoryId. La entidad Category contiene un atributo colección (e.g. java.util.Set) con los identificadores de todos los productos que pertenecen a una determinada categoría. Todas las anteriores. Ninguna de las anteriores. Considere la capa modelo de una aplicación diseñada según el método de diseño de la capa modelo estudiado en la asignatura. Suponga que se desea soportar una nueva base de datos que dispone de un mecanismo de generación de identificadores diferente. Indique la afirmación correcta. Es necesario proporcionar una nueva clase de implementación de la interfaz de cada DAO que precise generar identificadores. Es necesario modificar la factoría de cada DAO que precise generar identificadores. Es necesario proporcionar una nueva clase de implementación de la interfaz de cada servicio (del modelo) que precise generar identificadores. La a) y la b). Analice el siguiente fragmento de la interfaz del DAO correspondiente a la entidad Product. Indique la afirmación correcta con respecto al enfoque de desarrollo estudiado en clase public interface SqlProductDao { public Product create(Product product); public void update(Product product) throws InstanceNotFoundException; }. Falta incluir un parámetro de tipo Connection en todos los métodos. Falta declarar que los dos primeros métodos pueden levantar la excepción InputValidationException. Todas las anteriores. Ninguna de las anteriores. Considere las capas modelo y de servicios de su práctica. Teniendo en cuenta que la capa de servicios puede recibir peticiones concurrentes de múltiples clientes, indique la afirmación correcta con respecto a los métodos de los servicios locales de la capa modelo. La ejecución de cada método debe crear una nueva instancia del DataSource que permite acceder a la base de datos. La ejecución de cada método debe crear una nueva instancia de cada DAO que deba usar. Todas las anteriores. Ninguna de las anteriores. Considere una capa modelo que debe crear instancias de entidades, generando automáticamente sus claves. Indique la afirmación correcta. Solo es posible emplear claves numéricas, que pueden ser generadas por la base de datos o por la propia aplicación. Solo es posible emplear claves numéricas, que deben ser generadas por la base de datos. Si la base de datos proporciona secuencias (e.g. Oracle), puede lanzarse una consulta para que la base de datos genere una clave numérica y posteriormente realizar la inserción. La b) y la c). Suponga que está diseñando la capa modelo de una aplicación bancaria, que entre otros, incluye el caso de uso “transferencia bancaria”. La interfaz gráfica incluye un formulario en el que el usuario tiene que introducir el identificador de la cuenta origen (Long), el identificador de la cuenta destino (Long) y la cantidad bancaria a transferir (BigDecimal). Con respecto a la interfaz que debe ofrecer la capa modelo, indique la opción de diseño que considere más correcta: public interface BankService { // Opción 1 public void transfer(Long sourceAccountId, Long targetAccountId, BigDecimal amount) throws ... ... } public interface BankService { // Opción 2 // NOTA: la capa clientes primero invoca a “add” (añadir) y luego a // “withdraw” (retirar). public void add(Long sourceAccountId, BigDecimal amount) throws ... public void withdraw(Long targetAccountId, BigDecimal amount) throws ... ... }. La opción 1. La opción 2. Ambas son correctas. Ninguna es correcta. Analice el siguiente fragmento de la interfaz de un servicio de una hipotética capa modelo, siento Product una entidad. Indique la afirmación correcta con respecto al enfoque de desarrollo estudiado en la asignatura. public interface CatalogService { Product findProduct(Long productId) throws InstanceNotFoundException, SQLException; ... }. La operación findProduct no debería devolver una entidad (debería devolver un DTO). La operación findProduct no debería devolver SQLException. La operación findProduct debería recibir la conexión a la base de datos. La a) y la b) son correctas. Considere la implementación de un método transaccional en un servicio de la capa modelo de una aplicación, diseñada e implementada según el método estudiado en la asignatura. Indique la afirmación correcta. Por defecto, el modo autocommit de la conexión a la base de datos está deshabilitado. Debe usarse un nivel de aislamiento apropiado para evitar problemas de concurrencia con otras transacciones. Si no se produce ninguna excepción, debe terminarse con commit, y en otro caso, siempre con rollback. La b) y la c). Indicar cuál de las siguientes afirmaciones es correcta. En el modelo RCP, la implementación del servicio remoto delega en operaciones de la capa modelo de la aplicación. La aplicación cliente se implementa en términos de las operaciones de una librería local llamada stub. Las dos anteriores. Ninguna de las anteriores. Dada la siguiente declaración XML, indicada al principio de un documento XML <?xml versión=”1.0” encoding=”UTF-8”?> Indicar cuál de las siguientes afirmaciones es correcta. El atributo version indica la versión del documento XML (su valor debe incrementarse cada vez que se haga un cambio en el documento). El atributo encoding indica la codificación de caracteres del documento. Todas las anteriores. Ninguna de las anteriores. Una aplicación que parsee un documento XML... Siempre comprueba que esté bien formado. Si el documento incluye referencias a los esquemas, la aplicación puede utilizarlos para comprobar que el documento es válido. Las dos anteriores. Ninguna de las anteriores. Dado el siguiente documento XML. <?xml version=”1.0” encoding=”UTF-8”?> <movies xmlns="http://ws.udc.es/movies/xml" xmlns:review="http://reviews.example.com" xsl:schemaLocation="http://www.w3.org/2001/XMLSxhema-instance http://ws.udc.es/Movies/Movies.xsd http://reviews.example.com http://www.example.com/Reviews.xsd”> <!—Dark Knight Rises Again --> <movie> <movieId>3</movieId> <title>Dark Knight Rises Again</title> <runtime>103</runtime> <review:title>Batman returns in style</review:title> <review:description>Christopher Nolan serves yet another thrilling Batman movie</review:description> <review:rating>4 stars</review:rating> </movie> </movies> Indicar cuál de las siguientes afirmaciones es correcta. El elemento title pertenece al espacio de nombres http://ws.udc.es/movies/xml. El atributo xsi:schemaLocation pertenece al espacio de nombres xsi. El elemento review:title pertenece al espacio de nombres http://www.example.com/Reviews.xsd. Todas las anteriores. Indicar cuál de las siguientes afirmaciones es correcta. Los parsers XML de tipo DOM son adecuados en aplicaciones servidoras que reciben muchas peticiones que involucran parsear generar documentos XML grandes. Los parsers XML de tipo “streaming” no construyen un árbol en memoria, sino que procesan secuencialmente el documento en bloques. Todas las anteriores. Ninguna de las anteriores. En cuanto a la validación de documentos XML. Es una buena práctica que una aplicación cliente valide los documentos XML que recibe de un servidor contra su copia local del esquema, porque así aumenta su resistencia a los cambios (Ejemplo: si el XML del servidor pasa a incluir un tag adicional). El que una aplicación servidora valide los documentos XML que recibe de los clientes mejora su rendimiento. Todas las anteriores. Ninguna de las anteriores. Sea la siguiente definición de un XML-schema <xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema” targetNamespace=”http://ws.udc.es/movies/xml” xmlns=”http://ws.udc.es/movies/xml” elementFormDefault=”qualified”> <xsd:complexType name=”Movie”> <xsd:sequence> <xsd:element name=”title” type=”xsd:string”/> <xsd:element name=”director” type=”xsd:string” minOccurs=”1” maxOccurs=”unbounded”/> <xsd:element name=”actor” type=”xsd:string” minOccurs=”1” maxOccurs=”unbounded”/> <xsd:element name=”price" type=”xsd:float”/> </xsd:sequence> <xsd:attribute name=”movieId” type=”xsd:long”/> </xsd:complexType> <xsd:element name=”movie” type=”Movie”/> </xsd:schema> Indicar cuál de los siguientes documentos XML serían válidos conforme a este XML-schema: <?xml version=”1.0” encoding=”UTF-8”?> <movie xmlns=”http://ws.udc.es/movies/xml” movieId=”3”> <title>Dark Knight Rises Again</title> <actor>Christian Bale</actor> <actor>Morgan Freeman</actor> <director></director><director>Cristopher Nolan</director> <price>4.99</price> </movie>. <?xml version=”1.0” encoding=”UTF-8”?> <movie xmlns=”http://ws.udc.es/movies/xml” movieId=”3”> <title>Dark Knight Rises Again</title> <director></director><director>Cristopher Nolan</director> <actor>Christian Bale</actor> <actor>Morgan Freeman</actor> <price>4.99</price> </movie>. En una aplicación con servicios Web en la que se utiliza diseño por capas, en la capa modelo existen dos entidades para modelar la información sobre pedidos de clientes: Order (Pedido) y orderLine (Línea de Pedido) relacionadas entre sí con cardinalidad 1:N. En el modelo existen una operación findOrder que recibe un id de pedido y devuelve un objeto Order y una operación getOrderLines que recibe como parámetro un id de pedido y devuelve un objeto de tipo List<OrderLine>. En la capa de servicios, sin embargo, existe una única operación llamada findOrder que recibe un id de pedido y devuelve un objeto de tipo OrderDTO que contiene toda la información de un pedido, incluyendo una propiedad de tipo List<OrderLineDTO>. ¿Qué ventaja tiene este diseño?. El cliente se verá menos afectado por cambios en la interfaz del servicio. Minimiza el número de llamadas remotas. El diseño es incorrecto ya que se pierde la consistencia entre la capa modelo y la capa de servicios. Ninguna de las anteriores. Considere un servicio web REST en el que al hacer una petición GET sobre el URL http://www.acme.com/restws/books obtenemos en el cuerpo de la respuesta el siguiente fragmento XML. Diga qué afirmación es correcta <?xml version=”1.0” encoding=”UTF-8”?> <books xmlns=”http://www.acme.com/restws/books” Xmlns:atom=”http://www.w3.org/2005/Atom”/> <book> <id>1234</id> <title>Veinte años después</title> <author>Alejandro Dumas</author> <atom:link rel=”self” href=”http://www.acme.com/restws/books/1234”/> </book> <book> <id>1234</id> <title>Winds of Winter</title> <author>George R. R. Martin</author> <atom:link rel=”self” href=”http://www.acme.com/restws/books/1235”/> </book> ... </books>. La representación es incorrecta ya que proporciona información de más de un libro. La representación es correcta, pero aunque se añadan más libros en el futuro, la respuesta a esta petición debe ser siempre la misma, ya que las representaciones de los recursos no pueden cambiar. La respuesta es la representación de un recurso individual. La respuesta es la representación de un recurso colección que enlaza a la representación de los recursos que componen la colección. En el contexto de Servicios Web REST, suponga un intermediario genérico de caché. Diga que afirmación es correcta. El intermediario cacheará una petición de la forma GET /books/1234 que ha devuelto un código de respuesta 500 Internal Error. El intermediario cacheará una petición GET /books/1234 que ha devuelto el código de respuesta 400 Bad Request. El intermediario cacheará una petición GET /books/1234 que ha devuelto el código de respuesta 200 OK. La b) y la c) son correctas. Suponga que está diseñando un Servicio Web REST y que desea modelar una funcionalidad que permite modificar elementos (e.g. libros) en un repositorio. ¿Qué opción escogería?. El servicio expondrá una operación llamada updateBook que podrá ser invocada remotamente, y que recibirá como parámetro el identificador del libro a borrar. El servicio permitirá modificar el libro invocando el URL http://www.servicename.com/updateBook con el método POST e incluyendo como parámetro el identificador del libro. El servicio asignará un URL único a cada libro y permitirá modificarlo invocando su URL con el método PUT y pasando en el cuerpo la nueva representación. Ninguna de las anteriores. Suponga que está diseñando un Servicio Web según el enfoque REST, ¿qué opción le parece más adecuada para la respuesta a una petición que falle debido a que la BD no está accesible en ese momento?. En la cabecera HTTP se indicará el código de respuesta 200 OK para indicar que el servidor entendió correctamente la petición y que el fallo es por causas ajenas a él. En el cuerpo de la respuesta se incluirá en XML información sobre el error. En la cabecera HTTP se indicará el código de respuesta 500 Internal Error para indicar que la petición falló y que el cliente puede reintentarla. En el cuerpo de la respuesta se puede incluir en XML información adicional sobre el error. En la cabecera HTTP se indicará el código de respuesta 400 Bad Request. En el cuerpo de la respuesta se puede incluir en XML información adicional sobre el error. Ninguna de las anteriores. Considere el siguiente fragmento de código PostMethod method = new PostMethod(“http://example.org/resource”); method.addParameter(“param1”, “val1”); method.addParameter(“param2”,”val2”); try { /* Enviar petición. */ HttpClient client = new HttpClient(); Int statusCose = client.executeMethod(method); ... }. Es un fragmento de un servlet que procesa una petición POST. Es incorrecto porque una petición POST no puede llevar parámetros. Es incorrecto porque una petición POST tiene que llevar los parámetros en el URL. Ninguna de las anteriores. Considere el siguiente fragmento de código: protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException { String requestURI = req.getRequestURI(); Int idx = requestURI.lasIndexOf(‘/’); ... }. Es un fragmento de un servlet que procesa una petición POST. Es un fragmento del cliente de un servicio web REST preparándose para invocar un determinado URL. Es un fragmento de un servlet que procesa una petición DELETE. Ninguna de las anteriores. En base al enfoque aconsejado en la asignatura para la realización de pruebas de integración, indique la afirmación correcta. Un caso de prueba puede asumir que existen en BD datos creados por otros casos de prueba. Un caso de prueba debe crear los datos que precise y eliminarlos al finalizar. Con el fin de validar un caso de prueba puede ser necesario añadir nuevos casos de uso al modelo. Todas las anteriores. Dado el siguiente documento JSON: [{ "title": "Learning Java", "formats": ["PDF", "EPUB"], "price": 1 }] Indique cuál de las siguientes afirmaciones es correcta. Se trata de un array que tiene un único elemento de tipo objeto, y ese objeto tiene dos campos cuyos valores son de tipo string y un campo cuyo valor es de tipo número. Se trata de un array que tiene un único elemento de tipo objeto, y ese objeto tiene a su vez tres campos cuyos valores son de tipo string, array y número. Se trata de un objeto que tiene tres campos cuyos valores son de tipo string, array y número. Se trata de un objeto que tiene dos campos cuyos valores son de tipo string y un campo cuyo valor es de tipo número. Supongo que está desarrollando una clase de pruebas para uno de los servicios de la capa Modelo de su práctica y que para eliminar datos de la Base de Datos necesita emplear un DAO. En base al enfoque aconsejado en la asignatura, indique cómo instanciaría desde la clase de prueba el DAO, teniendo en cuenta que el DAO se desea usar desde varios métodos anotados con @Test. Creando con “new” una instancia de la clase de implementación del DAO en un método de la clase de pruebas anotado con @BeforeAll. A través de una factoría en un método de la clase de pruebas anotado con @BeforeAll. Creando con “new” una instancia de la clase de implementación del DAO en cada uno de los métodos de la clase de pruebas anotado con @Test dede los que se necesite utilizar el DAO. A través de una factoría en los métodos de la clase de pruebas anotados con @Test desde los que se necesite utilizar el DAO. Suponga que está diseñando un Servicio Web según el enfoque REST, ¿Qué opción le parece más adecuada para la respuesta a una petición que falle al validar los parámetros de entrada?. En la respuesta HTTP se indicará el código de respuesta 400 Bad Request. En el cuerpo de la respuesta se puede incluir en JSON información detallada sobre el error. En la respuesta HTTP se indicará el código de respuesta 500 internal Error para indicar que la petición falló y que el cliente puede reintentarla. En la respuesta HTTP se indicará el código de respuesta 200 OK para indicar que el servidor entendió correctamente la petición. En el cuerpo de la respuesta se incluirá en JSON información sobre el error. En la respuesta HTTP se indicará el código de respuesta 400 Bad Request. En el cuerpo de la respuesta no se incluirá nada, para no violar la interfaz uniforme. Suponga que está diseñando un Servicio Web REST y que desea modelar una funcionalidad que permite reemplazar la representación de un recurso individual (e.g. un libro) en un repositorio ¿Que opción escogería?. El servicio permitirá modificar el libro invocando el URL http://www.servicename.com/updateBook con el método POST e incluyendo como parámetro el identificador del libro, y los nuevos datos en el cuerpo de la petición. El servicio expondrá una operación llamada updateBook que podrá ser invocada remotamente, que recibirá como parámetro el identificador del libro y los nuevos datos. El servicio asignará un URL único a cada libro y permitirá reemplazar su representación invocando su URL con el método GET y pasando en el cuerpo la nueva representación. El servicio asignará un URL único a cada libro y permitirá reemplazar su representación invocando su URL con el método PUT y pasando en el cuerpo la nueva representación. Indique cuál de las siguientes afirmaciones referidas a XML es correcta. CML impone un conjunto de elementos, que son los únicos que se pueden utilizar en cualquier documento XML. Los documentos XML no pueden tener comentarios. Un elemento vacío no puede tener otros elementos anidados, pero sí texto. Para un elemento dado, cada atributo solamente puede tener un valor. Con el enfoque estudiado en la asignatura para el diseño de la capa modelo. La interfaz de un DAO oculta la tecnología de acceso a la base de datos (e.g. JDBC, JPA, etc.) que se utiliza. Las operaciones de la interfaz de un DAO no deben declarar InputValidationException como una de las excepciones devueltas. La implementación de una operación de un DAO invoca al método rollback sobre la conexión si se produce la excepción java.sql.SQLException. La interfaz de un DAO oculta el tipo de base de datos (e.g. relacional, documental, etc.) que se utiliza. Indique qué desventaja tiene una arquitectura con 2 capas con clientes de escritorio (capa 1: Interfaz gráfica de escritorio y capa Modelo; capa 2: servidor de Base de Datos) frente a una arquitectura con 3 capas, también con clientes de escritorio (capa 1: Interfaz gráfica de escritorio y capa Acceso al Servicio; capa 2: capa Servicio y capa Modelo; capa 3: servidor de Base de Datos): Es menos eficiente porque hay invocaciones remotas. No permite cambiar la Base de Datos utilizada sin modificar la capa Interfaz gráfica de escritorio. No permite hacer cambios en la capa Modelo sin necesidad de reinstalar nada en las máquinas cliente (mientras que la arquitectura en 3 capas sí lo permite). No permite hacer cambios en la capa interfaz gráfica de escritorio sin necesidad de reinstalar nada en las máquinas cliente (mientras que la arquitectura en 3 capas sí lo permite). Indique la afirmación correcta cuando se desea insertar una fila cuya clave numérica tiene que ser generada dinámicamente (suponga JDBC 3.0 o superior): Si la base de datos dispone de “columnas contador” (e.g. MySQL), primero hay que generar un identificador lanzando una consulta especial y posteriomente hay que insertar la fila con el identificador generado. Si la base de datos dispone de “columnas contador” (e.g. MySQL), primero hay que generar un identificador usando la API de JDBC y posteriormente hay que insertar la fila con el identificador generado. Si la base de datos dispone de “generadores de identificadores numéricos / secuencias” (e.g. Oracle), primero hay que generar un identificador usando la API de JDBC y posteriormente hay que insertar la fila con el identificador generado. Si la base de datos dispone de “generadores de identificadores numéricos / secuencias” (e.g. Oracle), primero hay que generar un identificador lanzando una consulta especial y posteriomente hay que insertar la fila con el identificador generado. En el contexto de Servicios Web REST, suponga un intermediario genérico de cache. Asumiendo que ninguna respuesta enviada por el servicio indica explícitamente que no se puede cachear, diga que afirmación es correcta teniendo en cuenta las convenciones seguidas en la asignatura. Sería correcto que el intermediario cachease la respuesta a una petición de la forma GET /books/1234 que ha devuelto un código de respuesta 500 Internal Error. Sería correcto que el intermediario cachease la respuesta a una petición de la forma PUT /books/1234 que ha devuelto un código de respuesta 500 Internal Error. Sería correcto que el intermediario cachease la respuesta a una petición de la forma PUT /books/1234 que ha devuelto un código de respuesta 404 Not Found. Sería correcto que el intermediario cachease la respuesta a una petición de la forma GET /books/1234 que ha devuelto un código de respuesta 400 Bad Request. Considere la interfaz PreparedStatement de la API de JDBC. Indique la afirmación correcta. El método executeQuery sólo permite lanzar consultas de lectura (e.g. SELECT) y siempre devuelve una instancia de ResultSet. El método executeUpdate permite lanzar todo tipo de consultas de actualización (UPDATE, INSERT, DELETE, etc.) y no devuelve nada. El método executeQuery permite lanzar cualquier tipo de consulta (e.g. SELECT, DELETE, etc). Si la consulta no es de lectura, devuelve null. El método executeQuery sólo permite lanzar consultas de lectura (e.g. SELECT) y devuelve null si no hay filas que concuerden con la consulta. Indique cuáles de las siguientes APIs se han utilizado en la asignatura. Apache Thrift en la capa Servicios REST y HTTPClient en la capa Acceso al Servicio REST. Servlets en la capa Servicios REST y Apache Thrift en la capa Acceso al Servicio REST. Servlets en la capa Servicios REST y JDBC en la capa Modelo. JDBC en la capa Servicios REST y HTTPClient en la capa Acceso al Servicio REST. En el modelo de programación RPC (Remote Procedure Call), indicar cuál de las siguientes afirmaciones es correcta. Las aplicaciones cliente y servidor tienen que escribirse en el mismo lenguaje de programación. Todos los servicios soportan el mismo conjunto de operaciones (interfaz uniforme). Para el programador, la invocación de una operación remota es similar a la invocación de un método de una librería local. Cambios en la implementación del servidor obligan a regenerar el stub, incluso si no cambia nada en la interfaz del servicio. Indique cuál de las siguientes afirmaciones referidas a Apache Thrift es correcta. La capa o librería de protocolos es la encargada de enviar las peticiones y respuestas por la red. Los tipos básicos que se pueden utilizar en el fichero de definición de la interfaz de un servicio dependen del lenguaje en el que se vaya a desarrollar el servicio. La capa o librería de transporte es generada por el compilador de IDL al lenguaje en el que se esté desarrollando el cliente o servicio. Cuando se utiliza Java como lenguaje para desarrollar un servicio, permite que el servicio se ejecute dentro de un servidor de aplicaciones. Indique la afirmación correcta. Todas las implementaciones de DriverManager tienen la obligación de usar la estrategia de pool de conexiones. Una vez obtenida una conexión a la base de datos (desprecie este tiempo), si se lanza una consulta, es más rápida su ejecución si la conexión se obtuvo de una invocación a DriverManager.getConnection que si se obtuvo de una invocación del método getConnection de un DataSource. Una conexión JDBC (Connection) se puede declarar e inicializar dentro de los paréntesis que siguen a la palabra reservada try en la sentencia try(...){...}catch(...){...}finally{...}. Cuando se invoca a close sobre una conexión obtenida a través de DriverManager.getConnection, la conexión contra la base de datos no se cierra. Dado el siguiente fragmento de un fichero de definición de la interfaz de un servicio Apache Thrift: struct instance { 1: i64 instanceId 2: string description } Indique qué afirmación NO es correcta. Se corresponde con la declaración de un tipo definido por el usuario, que podrá utilizarse como tipo de los argumentos que recibe una función. Si se utiliza el compilador del IDL de Apache Thrift a Java, para este tipo definido por el usuario se generará una clase cuyo nombre será “Instance”. Se corresponde con la declaración de un tipo definido por el usuario, que podrá utilizarse como tipo de las excepciones que puede lanzar una función. Se corresponde con la declaración de un tipo definido por el usuario, llamado “Instance”, que tiene un campo de tipo entero de 64 bits y otro de tipo cadena. En base al enfoque aconsejado en la asignatura para la realización de pruebas de integración de la capa Modelo, indique qué afirmación es INCORRECTA. Un caso de prueba debe crear los datos que precise antes de invocar al caso de uso a probar, y eliminarlos al finalizar. Un caso de prueba puede asumir que en la Base de Datos no habrá datos creados por otros casos de prueba. Para un mismo caso de uso se pueden diseñar varios casos de prueba (por ejemplo, para probar la ejecución correcta del caso de uso y cada uno de los casos de error). Con el fin de validar un caso de prueba puede ser necesario añadir nuevos casos de uso al modelo. Una aplicación que parsee un documento JSON... Siempre comprueba que esté bien formado y que sea válido. Siempre comprueba que sea válido pero no es obligatorio que compruebe que esté bien formado. Siempre comprueba que esté bien formado pero no es obligatorio que compruebe que sea válido. No es obligatorio que compruebe que esté bien formado ni que sea válido. Considere un servicio REST diseñado según el enfoque estudiado en la asignatura. Actualmente, su capa Modelo utiliza MySQL (proporciona “columnas contador” para la generación de claves numéricas) como base de datos. Se desea que el servicio contemple adicionalmente la posibilidad de que su capa Modelo use Oracle (proporciona “generadores de identificadores / secuencias” para la generaciçon de claves numéricas), para poder instalarlo tanto en empresas que usen MySQL como Oracle. Los nombres de las tablas y columnas en MySQL y Oracle son los mismos. Indique la afirmación correcta: Es necesario añadir DAOs y sus factorías para Oracle. No es necesario modificar la capa Acceso a Datos, pero sí la capa Lógica de Negocio. Es necesario añadir factorías de DAOs para Oracle. Es necesario añadir DAOs para Oracle. Considere un caso de uso que tiene que lanzar varias consultar (de lectura y/o modificación). Indique la afirmación correcta en base al enfoque estudiado en la asignatura: Se usa el nivel de aislamiento por defecto en la conexión a la base de datos. Si al lanzar una consulta a la base de datos se produce excepción java.sql.SQLException, se debe invocar el método commit sobre la conexión a la base de datos. Se usa el modo auto-commit en la base de datos. Si se comprueba que se viola alguna regla de negocio en base a los datos presentes en la base de datos (antes de hacer alguna modificación), se invoca al método commit sobre la conexión a la base de datos. Considere el siguiente fragmento de código: protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException{ String title = req.getParameter(“title”); ... }. Es un fragmento de un servlet que procesa una petición GET, pero es incorrecto porque al procesar una petición GET no se puede obtener los parámetros llamando a getParameter (hay que extraerlos del URL). Es un fragmento de un servlet que procesa una petición GET y obtiene el valor de un parámetro de la petición llamado “title”. Es un fragmento de una aplicación cliente, pero con el fragmento mostrado no es posible determinar si la petición es GET o de otro tipo. Es un fragmento de una aplicación cliente que realiza una petición GET a un servicio REST. Indique la afirmación correcta cuando se desea insertar una fila cuya clave numérica tiene que ser generada dinámicamente (suponga JDBC 3.0 o superior): Si la base de datos dispone de “generadores de identificadores numéricos / secuencias” (e.g. Oracle), primero hay que insertar la fila (sin especificar un valor para la clave) y posteriormente se puede usar un método de la API de JDBC, para recuperar el identificador generado. Si la base de datos dispone de “columnas contador” (e.g. MySQL), primero hay que insertar la fila (sin especificar un valor para la clave) y posteriormente se puede usar un método de la API de JDBC, para recuperar el identificador generado. Si la base de datos dispone de “columnas contador” (e.g. MySQL), primero hay que insertar la fila (sin especificar un valor para la clave) y posteriormente lanzar obligatoriamente una consulta SQL nativa (específica a la base de datos) para recuperar el identificador generado. Si la base de datos dispone de “generadores de identificadores numéricos / secuencias” (e.g. Oracle), primero hay que insertar la fila (sin especificar un valor para la clave) y posteriormente lanzar obligatoriamente una consulta SQL nativa (específica a la base de datos) para recuperar el identificador generado. Asuma el enfoque aconsejado en la asignatura, y que se utiliza la clase ConfigurationParametersManager para leer el valor de las propiedades del fichero de configuración. Para que se ejecuten correctamente las pruebas de integración de la capa Modelo, indique en qué fichero es necesario tener correctamente configurado el valor de la propiedad utilizada por una factoría para instanciar un servicio de la capa Modelo: En src/main/webapp/WEB-INF/web.xml. En src/test/resources/ConfigurationParameters.properties. En src/main/resources/ConfigurationParameters.properties. En pom.xml. Considere la interfaz PreparedStatement de la API de JDBC, indique la afirmación correcta: En una consulta parametrizada, los parámetros se especifican con %. En una consulta parametrizada, los parámetros se numeran de 1 en adelante cuando se establecen los valores con los métodos setXXX (e.g. setLong, setSting, etc,). El método executeUpdate permite lanzar todo tipo de consultas de actualización (UPDATE, INSERT, DELETE, etc.) y no devuelve nada. El método executeUpdate permite lanzar consultas de tipo UPDATE, pero no de tipo INSERT o DELETE, y devuelve el número de filas actualizadas. Indique cuáles de las siguientes APIs se han utilizado en la asignatura. Servlets para implementar la capa Servicios REST siguiendo el modelo RPC y HTTPClient para implementar la capa Acceso al Servicio siguiendo el modelo RPC. HTTPClient para implementar la capa Servicios REST y Servlets para implementar la capa Acceso al Servicio REST. Apache Thrift para implementar las capas Servicios y Acceso al Servicio siguiendo el modelo RPC. JDBC para implementar la capa Servicios REST y Servlets para implementar la capa Modelo. Considere un caso de uso que tiene que lanzar varias consultar (de lectura y/o modificación). Indique la afirmación correcta en base al enfoque estudiado en la asignatura: Se usa el nivel de aislamiento por defecto en la conexión a la base de datos. Si al lanzar una consulta a la base de datos se produce excepción java.sql.SQLException, se debe invocar el método commit sobre la conexión a la base de datos. Si se comprueba que se viola alguna regla de negocio en base a los datos presentes en la base de datos (antes de hacer alguna modificación), se invoca al método rollback sobre la conexión a la base de datos. Se deshabilita el modo auto-commit en la conexión a la base de datos. En el contexto de Servicios Web REST, suponga un intermediario genérico de cache. Asumiendo que ninguna respuesta enviada por el servicio indica explícitamente que no se puede cachear, diga que afirmación es correcta teniendo en cuenta las convenciones seguidas en la asignatura: Sería correcto que el intermediario cachease la respuesta a una petición de la forma PUT /books/1234 que ha devuelto un código de respuesta 500 Internal Error. Sería correcto que el intermediario cachease la respuesta a una petición de la forma PUT /books/1234 que ha devuelto un código de respuesta 404 Not Found,. Sería correcto que el intermediario cachease la respuesta a una petición de la forma GET /books/1234 que ha devuelto un código de respuesta 500 Internal Error. Sería correcto que el intermediario cachease la respuesta a una petición de la forma GET /books/1234 que ha devuelto un código de respuesta 400 Bad Request. En el contexto de Servicios Web REST, suponga un intermediario genérico de cache. Asumiendo que ninguna respuesta enviada por el servicio indica explícitamente que no se puede cachear, diga que afirmación es correcta teniendo en cuenta las convenciones seguidas en la asignatura: El intermediario cacheará una petición PUT /books/1234 que ha devuelto el código de respuesta 404 Not Found. El intermediario cacheará una petición GET /books/1234 que ha devuelto el código de respuesta 404 Not Found. El intermediario cacheará una petición GET /books/1234 que ha devuelto el código de respuesta 400 Bad Request. El intermediario cacheará una petición GET /books/1234 que ha devuelto el código de respuesta 500 Internal Error. Suponga que está diseñando un Servicio Web REST y que desea modelar una funcionalidad que permite reemplazar la representación de un recurso individual (e.g. un libro) en un repositorio ¿Que opción escogería?. PUT /recurso, indicando en el cuerpo de la petición el identificador del recurso y la nueva representación. POST /recurso/$id_recurso, indicando en el cuerpo de la petición la nueva representación del recurso ($id_recurso sería el identificador del recurso). POST /recurso, indicando en el cuerpo de la petición el identificador del recurso y la nueva representación. PUT /recurso/$id_recurso, indicando en el cuerpo de la petición la nueva representación del recurso ($id_recurso sería el identificador del recurso. Considere un servicio REST diseñado según el enfoque estudiado en la asignatura. Actualmente, su capa Modelo utiliza MySQL (proporciona “columnas contador” para la generación de claves numéricas) como base de datos. Se desea que el servicio contemple adicionalmente la posibilidad de que su capa Modelo use Oracle (proporciona “generadores de identificadores / secuencias” para la generaciçon de claves numéricas), para poder instalarlo tanto en empresas que usen MySQL como Oracle. Los nombres de las tablas y columnas en MySQL y Oracle son los mismos. Indique la afirmación correcta: No es necesario modificar la capa Acceso a Datos, pero sí la capa Lógica de Negocio. Es necesario añadir DAOs y sus factorías para Oracle. Es necesario añadir factorías de DAOs para Oracle y, una vez añadidas, para configurar la Base de Datos a utilizar (MySQL u Oracle) se utilizarían valores de propiedades en ws-app-model/src/main/resources/ConfigurationParameters.properties, que serían los que indicarían qué factorías habría que utilizar. Es necesario añadir DAOs para Oracle y, una vez añadidas, para configurar la Base de Datos a utilizar (MySQL u Oracle) se utilizarían valores de propiedades en ws-app-model/src/main/resources/ConfigurationParameters.properties, que serían los que leerían las factorías que instancias los DAOs. Considere el siguiente fragmento de código: protected void doPost(HTTPServletRequest req, HTTPServletResponse resp) throws ServletException { String title = req.getParameter ("title"); ... }. Es un fragmento de una aplicación cliente, pero con el fragmento mostrado no es posible determinar si la petición es POST o de otro tipo. Es un fragmento de una aplicación cliente que realiza una petición POST a un servicio REST. Es un fragmento de un servlet que procesa una petición POST y obtiene el valor de un parámetro de la petición llamado 'title'. Es un fragmento de un servlet que procesa una petición POST, pero es incorrecto porque al procesar una petición POST no se pueden obtener los parámetros llamando a getParameter (hay que extraerlos del URL). Dado el siguiente fragmento de un fichero de definición de la interfaz de un servicio Apache Thrift: struct Instance { 1: i64 instanceId 2: string description } Indique la afirmación correcta: La sintaxis utilizada no es correcta. Se corresponde con la declaración de un tipo definido por el usuario, llamado “Instance”, que tiene un campo de tipo entero de 64 bits y otro de tipo cadena. Se corresponde con la declaración de un tipo definido por el usuario, llamado “Instance”, que tiene un campo de tipo binario y otro de tipo cadena. Se corresponde con la declaración de una función que recibe dos argumentos, uno de tipo entero y otro de tipo cadena. Suponga que está diseñando un Servicio Web según el enfoque REST, ¿Qué opción le parece más adecuada para la respuesta a una petición que intente borrar un recurso que no existe?. En la respuesta HTTP se indicará el código de respuesta 404 Not Found. En el cuerpo de la respuesta se incluirá en JSON información sobre el error. En la respuesta HTTP se indicará el código de respuesta 204 No Content para indicar que el recurso no ha sido eliminado. En la respuesta HTTP se indicará el código de respuesta 201 Created para indicar que el servidor entendió correctamente la petición y se incluirá una cabecera Location para indicar la URL del recurso que ya no existe. En la respuesta HTTP se indicará el código de respuesta 200 OK para indicar que el servidor entendió correctamente la petición. En el cuerpo de la respuesta se incluirá en JSON información sobre el error. Con el enfoque estudiado en la asignatura para el diseño de la capa modelo: La implementación de la operación find (buscar por clave) de un DAO invoca al método commit sobre la conexión si no existe ninguna fila con esa clave. Las operaciones de la interfaz de la capa Lógica de Negocio no deben declarar java.sql.SQLException como una de las excepciones devueltas. La interfaz de un DAO oculta la tecnología de acceso a la base de datos (e.g. JDBC, JPA, etc.) que se utiliza. La interfaz de un DAO oculta el tipo de base de datos (e.g. relacional, documental, etc.) que se utiliza. Indique qué desventaja tiene una arquitectura con 2 capas con clientes de escritorio (capa 1: Interfaz gráfica de escritorio y capa Modelo; capa 2: servidor de Base de Datos) frente a una arquitectura con 3 capas, también con clientes de escritorio (capa 1: Interfaz gráfica de escritorio y capa Acceso al Servicio; capa 2: capa Servicios y capa Modelo; capa 3: servidor de Base de Datos): Es menos eficiente porque hay invocaciones remotas. No permite cambiar la Base de Datos utilizada sin modificar la capa Interfaz gráfica de escritorio. No permite hacer cambios en la capa Modelo sin necesidad de reinstalar nada en las máquinas cliente, mientras que la arquitectura en 3 capas sí lo permite. No permite hacer cambios en la capa Interfaz gráfica de escritorio sin necesidad de reinstalar nada en las máquinas cliente, mientras que la arquitectura en 3 capas sí lo permite. Indique en qué capas ha utilizado el API JDBC durante el desarrollo de su práctica: En la capa Lógica de Negocio. En la capa Acceso a Datos. En la capa Servicios. a) y b) son correctas. ¿Qué puede decir con respecto a este código? @Override public ... create(Connection connection, ...) { String queryString = ... try (PreparedStatement preparedStatement = connection.prepareStatement( queryString, Statement.RETURN_GENERATED_KEYS)) { ... return ... } catch (...) { ... } }. Corresponde a la capa Acceso a Datos. Corresponde a la capa Lógica de Negocio. Corresponde a la capa Servicios REST. Corresponde a la capa Acceso a Servicios. Indique la afirmación correcta: Cuando la conexión a la base de datos se obtiene a partir de un DataSource, la implementación de un caso de uso en la capa Modelo no necesita invocar a Connection.close, ni implícitamente (try-with-resources) ni explícitamente. Cuando se invoca a close sobre una conexión que se obtuvo de un pool de conexiones, la conexión contra la base de datos no se cierra. Una vez obtenida una conexión a la base de datos (desprecie este tiempo), si se lanza una consulta, es más rápida su ejecución si la conexión se obtuvo de una invocación a DriverManager.getConnection que si se obtuvo mediante la invocación del método getConnection de un DataSource. Todas las implementaciones de DataSource tienen la obligación de usar la estrategia de pool de conexiones. En base al enfoque aconsejado en la asignatura para la realización de pruebas de integración, suponiendo que un caso de prueba necesite insertar datos en la Base de Datos antes de invocar al caso de uso a probar (e.g. para probar un caso de uso que haga una búsqueda es necesario que en la Base de Datos haya datos sobre los que poder hacer la búsqueda), indique cómo debe crearlos: Siempre debe utilizar los DAOs que ofrezcan las operaciones pertinentes. Si existen servicios de la capa Modelo que ofrezcan métodos adecuados para crear esos datos, debe utilizarlos. Debe ejecutar un script SQL que tenga las sentencias necesarias para insertar los datos. Debe ejecutar directamente las sentencias SQL necesarias, haciendo uso del API JDBC. Dado el siguiente documento JSON: [{ "title": "Learning Java", "formats": ["PDF", "EPUB"], "price": 1 }] Indique cuál de las siguientes afirmaciones es correcta: Se trata de un array que tiene un único elemento de tipo objeto, y ese objeto tiene a su vez tres campos cuyos valores son de tipo string, array y número. Se trata de un array que tiene un único elemento de tipo objeto, y ese objeto tiene dos campos cuyos valores son de tipo string y un campo cuyo valor es de tipo número. Se trata de un objeto que tiene tres campos cuyos valores son de tipo string, array y número. Se trata de un objeto que tiene dos campos cuyos valores son de tipo string y un campo cuyo valor es de tipo número. Suponga que está diseñando un Servicio Web según el enfoque REST y que desea modelar una funcionalidad que permite a un usuario inscribirse en una carrera de running. Como datos de entrada, es necesario proporcionar el identificador de usuario, el identificador de la carrera y la tarjeta bancaria con la que se realizará el pago de la inscripción. Ya existe un recurso colección con el URL /carreras que representa a las carreras a las que se puede inscribir un usuario. ¿Qué opción de diseño escogería de acuerdo al enfoque estudiado en la asignatura?. El servicio permitirá inscribirse en una carrera con el identificador 5 haciendo una petición POST al URL /carreras/5 pasando los datos de entrada como parámetros de la petición. El servicio permitirá inscribirse en una carrera con el identificador 5 haciendo una petición PUT al URL /carreras/5/inscribir, pasando el resto de datos de entrada como parámetros de la petición. Las dos anteriores son válidas. El servicio permitirá inscribirse en una carrera haciendo una petición POST al URL /inscripciones pasando los datos de entrada como parámetros de la petición. En el contexto de Servicios Web REST, suponga un intermediario genérico de cache. Asumiendo que ninguna respuesta enviada por el servicio indica explícitamente que no se puede cachear, diga que afirmación es correcta teniendo en cuenta las convenciones seguidas en la asignatura: Sería correcto que el intermediario cachease la respuesta a una petición GET /books/1234 que ha devuelto un código de respuesta 500 Internal Error. Sería correcto que el intermediario cachease la respuesta a una petición POST /books/ que ha devuelto un código de respuesta 500 Internal Error. Todas las anteriores. Ninguna de las anteriores. Dado el siguiente fragmento de un fichero de definición de la interfaz de un servicio Apache Thrift: struct Instance { 1: i64 instanceId 2: string description } Indique qué afirmación NO es correcta: Se corresponde con la declaración de un tipo definido por el usuario, que podrá utilizarse como tipo de los argumentos que recibe una función. Se corresponde con la declaración de un tipo definido por el usuario, llamado Instance, que tiene un campo de tipo entero de 64 bits y otro de tipo cadena. Se corresponde con la declaración de un tipo definido por el usuario, que podrá utilizarse como tipo de las excepciones que puede lanzar una función. Si se utiliza el compilador del IDL de Apache Thrift a Java, para este tipo definido por el usuario se generará una clase cuyo nombre será "Instance". Analice el siguiente fragmento de código correspondiente a una clase de pruebas de integración de la capa modelo, implementada con JUnit 5. private static ProductService productService = null; @BeforeAll public static void init() { ... productService = ProductServiceFactory.getService(); } private void removeProduct(Long productId) { productService.removeProduct(productId); } @Test public void testCreateProductAndFindProduct() throws InputValidationException, InstanceNotFoundException { // Se crea un producto válido en memoria Product newProduct = getValidProduct(); // Se crea el producto en BD Product createdProduct = productService.createProduct(newProduct); try { // Se recupera el producto de BD Product foundProduct = productService.findProduct(createdProduct.getProductId()); // Se comprueba que el producto recuperado de BD tenga los valores // oportunos y sea igual al creado assertEquals(...); ... assertEquals(createdProduct, foundProduct); } finally { // Se elimina el producto de BD removeProduct(createdProduct.getProductId()); } } Teniendo en cuenta que el método privado removeProduct de la clase de pruebas es un método que se utilizará desde los casos de prueba que necesiten borrar productos que se hayan creado desde ellos (como, por ejemplo, desde el caso de prueba testCreateProductAndFindProduct), y que el método removeProduct de la interfaz ProductService lanza la excepción InstanceNotFoundException cuando no existe un producto con el identificador que se le pasa como parámetro, indique qué afirmación es correcta en base al enfoque aconsejado en la asignatura para la realización de pruebas de integración de la capa Modelo: En la implementación del método privado removeProduct de la clase de pruebas debería declararse la excepción InstanceNotFoundException en la cláusula throws. En la implementación del método privado removeProduct de la clase de pruebas debería capturarse la excepción InstanceNotFoundException y relanzarse como una RuntimeException. En la implementación del método privado removeProduct de la clase de pruebas debería capturarse la excepción InstanceNotFoundException y continuar con la ejecución sin realizar ninguna acción en el bloque catch. La implementación del método privado removeProduct de la clase de pruebas es correcta tal y como está en el enunciado, y los casos de prueba desde los que se llame deben declarar la excepción InstanceNotFoundException en su cláusula throws (como se hace, por ejemplo, en el caso de prueba testCreateProductAndFindProduct mostrado en el enunciado). |