Portafirmas. Manual del Programador. Versión: PRO004 Fecha: 29/11/2010. Versión 2.2.0



Documentos relacionados
V Manual de Portafirmas V.2.3.1

Práctica sobre compartición de instancias remotas.

Requisitos. Universidad ORT Arquitectura de Software

Universidad ORT - Arquitectura de Software. Requisitos

Manual de Usuario Comprador Presupuesto

COPIAS DE SEGURIDAD AUTOMÁTICAS DE DIRECCIONES CALLEÇPAÑA

Manual del Protocolo XML-RPC de Mensajería Negocios

Manual de instalación Actualizador masivo de Stocks y Precios

Desarrollo de Servicios Web con JBuilder

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

CREACIÓN DE WEBSERVICES

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

CONECTOR CTIFAC CONTENIDO

Manual de rol gestor de GAV para moodle 2.5

Uso de excepciones en Java

Portafirmas. Manual de Actualización. Versión: INS005 Fecha: 11/07/2011. Versión 2.3.0

Manual de NetBeans y XAMPP

DOCENTES FORMADORES UGEL 03 PRIMARIA

Modelo de Objetos Distribuidos

RemitePIN: Nuevo procedimiento de firma electrónica para las aplicaciones de captura de las Oficinas Virtuales de Coordinación Financiera.

Programa diseñado y creado por Art-Tronic Promotora Audiovisual, S.L.

Manual de integración. v3. Versión: v01r02 Fecha: 23/06/2015

CATÁLOGO CATÁLOGO CATÁLOGO CATÁLOGO CATÁLOGO

Portal Del Emisor MANUAL DEL USUARIO. Plataforma de Facturación Electrónica

LABORATORIO DE RC: PRÁCTICA 4: IMPLEMENTACIÓN DE UN CLIENTE DE CORREO

Ejercicios - Persistencia en Android: proveedores de contenidos y SharedPreferences

MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD

LiLa Portal Guía para profesores

Preguntas más frecuentes (FAQ) sobre el nuevo sistema de licencias de ARS

CREAR UN SERVICIO WEB BASICO CON JAVA AXIS2. Víctor J. Sosa

Modulo 1 El lenguaje Java

TUTORIAL DESARROLLO DE APLICACIONES PARA EVOLUTION CON MS ACCESS

ATLAS MANUAL DE USUARIO DEL ARQUETIPO WEBSERVICE

Guía de Instalación para clientes de WebAdmin

Práctica GESTIÓN Y UTILIZACIÓN DE REDES LOCALES. Curso 2001/2002. TCP/IP: protocolo TCP

FOROS. Manual de Usuario

Llamada a métodos remotos (RMI). Curso 04/05. Tema 9. Departament d Informàtica. Universitat de València. 1. Introducción 2

RESUMEN. Solución web usable para la gestión de dispositivos móviles en empresas

GUIA DE LABORATORIO Nro. 4

Oficina Online. Manual del administrador

MANUAL DE LA CONFIGURACIÓN Y USO DEL MÓDULO DE ASM PARA PRESTASHOP

Tutorial: Primeros Pasos con Subversion

MANUAL DE LA CONFIGURACIÓN Y USO DEL MÓDULO DE ASM PARA PRESTASHOP

1. Creación del repositorio

Ejercicios - Persistencia en Android: ficheros y SQLite

Requisitos técnicos para la instalación. Arquitectura Hardware Arquitectura Software. Instrucciones de instalación GONG-R

Manual de Usuario de la Herramienta SICRES-Tester. SIR Sistema de Interconexión de Registros. Tipo de documento. Fecha de entrega 08/04/2014

SISTEMA DE REGISTRO DE TRANSACCIONES BURSATILES BAGSA MANUAL DE USUARIO

Introducción a la Firma Electrónica en MIDAS

Dossier de prácticas

Notas para la instalación de un lector de tarjetas inteligentes.

GESTIÓN DOCUMENTAL PARA EL SISTEMA DE CALIDAD

Haga clic en los recuadros donde indica la mano y regrese al inicio del capítulo al hacer clic en el título de la sección donde se encuentra

Historial de Versiones: Velneo vversion. Funcionamiento. Repositorio de versiones. Funcionalidades del Historial de Versiones. Bloquear.

Introducción a las Redes de Computadoras. Obligatorio

ACCESO Y MANEJO DEL PANEL DE CONTROL

UNIDESYS UNIVERSAL BUSINESS SYSTEMS INSTALACIÓN NUEVO PUESTO DE TRABAJO

Guía rápida de la Oficina Virtual Área Web y Administración Electrónica

ALTAS MANUAL DE USUARIO DEL SERVICIO DE CERTIFICADOS

JOOMLA MANUAL USUARIO Creación del portal

UNIDAD DIDACTICA 16 USUARIOS SAMBA EN UN CONTROLADOR DE DOMINIO LINUX SERVER

GENERACIÓN DE ANTICIPOS DE CRÉDITO

Consultoría, Análisis, Desarrollo y Mantenimiento de Software. Guía de Usuario V2.1. Junio 2.004

GedicoPDA: software de preventa

Documentación Técnica Conector

2. Se indica el nombre y las configuraciones necesarias para la creación del proyecto

Figura 7-1 Enlace para instalar el servidor web Apache Jakarta Tomcat

MANUAL DE USUARIO. Webservice simple para la exportación rápida de información proveniente de una base de datos. Versión 0,1,1

DESARROLLO DE UN CLIENTE SOFIA2 (KP) SIGUIENDO ARQUITECTURA KP-MODELO

Descarga, instalación y uso de herramientas:

Manual Oficina Web de Clubes (FBM)

Manual de usuario para la parametrización de la integración Openbravo-Sugar

Configuración factura electrónica. construsyc instasyc

Gestión de Ficheros en ruralvía Recibos

3.9 Patrón Distributed callback

Aplicateca API Validador de Móviles Certificados SMS -

Apéndice 5 Manual de usuario de ColeXión. ColeXión 1.0. Manual de usuario

RUEDA TORRES DULCE CAROLINA 3CM2 JAX-WS WEB SERVICES WEB APPLICATION DEVELOPMENT

Instalación y configuración del servidor FTP Filezilla en Windows 2003 Server. Vicente Sánchez Patón I.E.S Gregorio Prieto.

Servicio Webmail. La fibra no tiene competencia

Cuando hacemos uso de los grupos, se tendrán los permisos asignados al grupo, en todas las carpetas y documentos del sitio.

REDES DE ÁREA LOCAL. APLICACIONES Y SERVICIOS EN WINDOWS

WEBSERVICES CON FIRMA DIGITAL Versión 1.2

UAM MANUAL DE EMPRESA. Universidad Autónoma de Madrid

ACCESO AL SERVIDOR EXCHANGE MEDIANTE OWA

Estimado usuario. Tabla de Contenidos

Manual de uso del Tracker (Gestor de Actividad)

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

U.E JUAN DE VELASCO CREAR DATOS EN SQL

INSTALACIÓ N A3ERP. Informática para empresas INTRODUCCIÓN CONSIDERACIONES GENERALES DE LA INSTALACIÓN PAQUETES DE INSTALACIÓN PREDEFINIDOS

MANUAL INSTALACIÓN DE SUGARMINI PARA SUGAR CRM

MANUAL DE USUARIO PANEL DE CONTROL Sistema para Administración del Portal Web.

Pruebas de unidad con JUnit

Acronis License Server. Guía del usuario

%& %)& '$!%*+ $, %%%&$ %%

Conceptronic CFULLHDMA Cómo usar Samba/CIFS y NFS

WEB SERVICES CREACIÓN DEL SERVICIO

JOOMLA MANUAL USUARIO Creación del portal

Transcripción:

Versión: PRO004 Fecha: 29/11/2010 Versión 2.2.0

HOJA DE CONTROL Organismo Proyecto Entregable Autor Consejería de Economía, Innovación y Ciencia Portafirmas GuadalTEL S.A. Versión/Edición PRO004 Fecha Versión 29/11/2010 Aprobado por Fecha Aprobación Nº Total de Páginas 43 REGISTRO DE CAMBIOS Versión Causa del Cambio Responsable del Cambio Fecha del Cambio PRO001 Versión inicial MMS 02/03/2010 PRO002 Actualización MMS 25/05/2010 PRO003 Actualización MMS 21/09/2010 PRO004 Actualización MMS/FJCV 27/10/2010 CONTROL DE DISTRIBUCIÓN Nombre y Apellidos María Luisa de la Vega Royo Manuel Baena Fernández Francisco José Cantero Villar Manuel Martín Soria Página 3 de 43

Página 4 de 43

ÍNDICE 1 Introducción... 4 2 Servicios Web Portafirmas... 5 2.1 Nuevas funcionalidades V2... 5 2.2 Fachada Web Services v1... 5 2.2.1 Servicio de peticiones de firma... 6 2.2.2 Servicio de firma remota... 6 2.2.3 Ejemplo de integración Web Services... 7 2.2.3.1 Requisitos previos... 7 2.2.3.2 Configuración del entorno de pruebas... 7 2.2.3.3 Parámetros del entorno de pruebas... 7 2.2.3.4 Detalle de pruebas... 9 2.3 Fachada Web Services v2... 13 2.3.1 Servicio de consulta... 13 2.3.2 Servicio de modificación... 13 2.3.3 Ejemplo de integración Web Services... 13 2.3.3.1 Requisitos previos... 13 2.3.3.2 Parámetros del entorno de pruebas... 14 2.3.3.3 Detalle de pruebas... 16 3 Interfaz de Custodia de ficheros... 29 3.1 Interfaz CustodyServiceInput... 29 3.2 Interfaz CustodyServiceOutput... 33 4 Glosario... 36 5 Bibliografía y Referencias... 37 Página 5 de 43

Página 6 de 43

1 Introducción El objetivo del presente documento es servir de guía en el uso de los servicios web de la aplicación Portafirmas v2 por parte de los programadores que vayan a desarrollar aplicaciones clientes que hagan uso de los mismos. Página 7 de 43

2 Servicios Web Portafirmas Portafirmas dispone de dos fachadas Web Service para atacar a las API's desde terceras aplicaciones. Dichas fachadas son la de nuevos servicios de Portafirmas v2 y una fachada para retrocompatibilidad con los servicios de Portafirmas v1. Cada fachada contiene varios servicios que serán descritos: Fachada Web Services v1 Servicio de envío de peticiones de firma. Servicio de firma remota. Fachada Web Services v2 Servicio de consulta. Servicio de modificación. Servicio de administración. Para poder hacer uso de las nuevas funcionalidades de Portafirmas v2 es necesario hacer uso de la fachada de servicios de v2, que irá evolucionando con cada nueva funcionalidad que se añada a la aplicación. La fachada de servicios de v1 no ofrece nuevas funcionalidades ni evolucionará dado que su función es únicamente ofrecer retrocompatibilidad con los servicios de v1. 2.1 Nuevas funcionalidades V2 Tal como se ha comentado previamente, la fachada de servicios web de Portafirmas v2 ofrece nuevas funcionalidades respecto a los que se ofrecían en la versión anterior. Dichas funcionalidades se describen a continuación. Se pueden anexar documentos a una petición que no se firman, solo sirven a modo de consulta. Cambia el concepto de firmante por el de línea de firma. Una petición puede contener varias líneas de firma en las que se pueden incluir varios firmantes. Además se pueden añadir líneas de visto bueno a una petición. Se pueden definir puestos de trabajo como firmantes en una petición. Además de las funciones descritas anteriormente, los servicios de Portafirmas v2 incluyen una serie de mejoras no funcionales tales como la implementación de dichos servicios web mediante Apache CXF cumpliendo con las recomendaciones Página 8 de 43

de MADEJA para la creación de servicios web. 2.2 Fachada Web Services v1 La fachada ofrece dos servicios, uno para el envío de peticiones de firma y otro para la firma remota de documentos para terceras aplicaciones. 2.2.1 Servicio de peticiones de firma El WSDL descriptor del servicio se encuentra en la siguiente URL: http://servidor:puerto/pfirmav2/services/pfserviciows?wsdl El javadoc de la interfaz webservice en java se puede encontrar dentro del fichero javadocws.zip. 2.2.2 Servicio de firma remota El WSDL descriptor del servicio se encuentra en la siguiente URL: http://servidor:puerto/pfirmav2/services/firmaremotaws?wsdl El javadoc de la interfaz webservice en java se puede encontrar dentro del fichero javadocws.zip. Este servicio de firma simplifica a dos pasos el proceso de firma. Obtener el HASH a firmar pasando el identificador del documento, y el identificador del firmante (iniciar firma). Este hash se firma mediante el cliente correspondiente de @firma, y el resultado se le pasa al segundo método, junto al identificador del documento y del usuario. Existe un control de sesión en dicho proceso, de forma que si excede 10 minutos entre el primer paso y el segundo se cancela el proceso. Página 9 de 43

2.2.3 Ejemplo de integración Web Services Se incluye una aplicación de test llamada testpfirmav1ws para mostrar el uso de los web services de la versión 1. Se trata de una aplicación con estructura maven/eclipse. La aplicación contiene una clase main que se encarga de lanzar los suites de test JUnit definidos. 2.2.3.1 Requisitos previos Las especificaciones del servidor a desarrollar las pruebas deben ser las indicadas en el documento de instalación de Portafirmas v2 (PF2 INS00X Instalación Portafirmas). En cuanto a los requisitos a nivel de equipo cliente, que tenga conexión contra el servidor donde está desplegada la aplicación y tener instalada una JRE 1.5 o superior. 2.2.3.2 Configuración del entorno de pruebas La aplicación cliente de los servicios web contiene un fichero de propiedades que debe ser configurado para la correcta realización de las pruebas. El fichero se encuentra en la ruta: /testpfirmav1ws/src/main/resources/ ## WS Adresses ## ws.send.address=http://servidor:puerto/pfir mav2/services/pfserviciows?wsdl ## Redaction data ## req uest.remmitter=12345678z req uest.application=eco req uest.remmitername=remitente de pruebas WS req uest.reference=referencia de pruebas WS req uest.subject=asunto de pruebas WS req uest.receiver=12345678z req uest.text=texto de pruebas WS req uest.document.filepath=/home/user/fir macorreo.jpg req uest.document.name=documento de pruebas WS req uest.document.mime=image/jpeg ## Req uest receiver change data ## req uest.hash=mobhsowscs req uest.newreceiverid=11111111h req uest.newreceivername=nuevo req uest.newreceiversurname1=fir mante req uest.newreceiversurname2=de Pruebas Página 10 de 43

2.2.3.3 Parámetros del entorno de pruebas A nivel del servidor no se requiere ningún requisito especial para Portafirmas. La aplicación de lanzamiento de pruebas se lanzará a través de línea de comandos. Las propiedades a editar en ws.properties son las siguientes: ws.send.address Dicha propiedad debe contener la dirección del servicio de envío de peticiones de Portafirmas. request.remmitter Identificador (DNI) de usuario que actuará como remitente de la petición y será consultado (Debe existir en el sistema). request.application Código de la aplicación que será asociada a la petición que se va a enviar. request.remmitername Nombre de usuario que actuará como remitente de la petición y será consultado (Debe existir en el sistema). request.reference Referencia de la petición. request.subject Asunto de la petición. request.receiver Identificador (DNI) de usuario que recibirá la petición de firma. (Debe existir en el sistema). request.text Texto de la petición. request.document.filepath Ruta al fichero que se adjuntará como documento a firmar. request.document.name Nombre del fichero a firmar. request.document.mime Tipo MIME del fichero a firmar. request.hash Página 11 de 43

Hash de la petición cuyo firmante se cambiará. request.newreceiverid Identificador (DNI) del nuevo firmante al que se cambiará la petición. request.newreceivername Nombre del nuevo firmante al que se cambiará la petición. request.newreceiversurname1 Primer apellido del nuevo firmante al que se cambiará la petición. request.newreceiversurname2 Segundo apellido del nuevo firmante al que se cambiará la petición. Para lanzar la aplicación de pruebas es necesario compilar el proyecto a través de maven. Para ello lanzar la instrucción en el directorio raíz del proyecto: mvn clean compile Esto generará 2 ficheros jar en el directorio /target/. Para ejecutar la aplicación de test bastará con ejecutar la siguiente instrucción desde línea de comandos: java -jar testpfirmav1ws-1.0.0-jar-with-dependencies.jar Tras esto se mostrará el menú principal de la aplicación. 2.2.3.4 Detalle de pruebas Opción 1 Envío de petición Envía una petición a partir de los datos contenidos en el fichero de propiedades. A continuación se comentan los pasos que hay que realizar como mínimo para poder enviar una petición correctamente. El primer paso es obtener la clase servicio que proporciona los métodos para llamar a los distintos servicios de envío de peticiones. Para ello basta con ejecutar el siguiente código. PfServicioWSServiceLocator locator = new PfServicioWSServiceLocator(); PfServicioWS service = locator.getpfserviciows(new URL( http://servidor:puerto/pfirmav2/services/pfserviciows?wsdl )); Para poder enviar una petición es necesario primero insertarla, pasándole como parámetro el identificador (DNI) del usuario que actuará como remitente. Dicho método devuelve un String con el identificador de la petición creada. Página 12 de 43

String req uestid = service.insertarpeticion( 12345678Z ); Una vez creada la petición, es necesario actualizarla con los datos contenidos en el fichero de propiedades. Esto se hace a través del método actualizarpetición que devuelve un long con valor 0 en caso de que todo haya ido correctamente u otro valor en caso de error. Se puede encontrar información más detallada sobre cada uno de los servicios en el javadoc de los web services de portafirmas v1. long updatereq uestresponse = service.actualizarpeticion(req uestid, ECO, false, false, false, false, false, Calendar.getInstance(), null, Nombre del remitente, "", "", Referencia de la petición, Asunto de la petición,new BigDecimal(1), 11111111H, "", Texto de la petición ; Una vez actualizada la petición será necesario insertar el documento que se va a firmar. El método empleado es insertardocumentopetición, que devuelve el hash del documento en caso de funcionar correctamente o null en caso de error. String insertdocumentresponse = service.insertardocumentopeticion(req uestid, Tipo de documento, Nombre del documento, Tipo MIME, bytes); Tras insertar el documento es necesario definir el firmante del mismo. Para ello se llama al método insertardestinatariopetición que devolverá un 0 en caso de que todo haya funcionado correctamente, y otro valor en caso de error. long insertsignerresponse = service.insertardestinatariopeticion( 11111111H, req uestid); Por último, bastará con entregar la petición para completar el proceso. El método entregarpetición devolverá un 0 en caso de haberse entregado la misma correctamente, y otro valor en caso de error. long sendreq uestresponse = service.entregarpeticion(req uestid); Página 13 de 43

Opción 2 Consulta de usuario Consulta un usuario concreto a partir de su Identificador (DNI) y muestra su nombre y apellidos por consola. El primer paso es obtener la clase servicio que proporciona los métodos para llamar a los distintos servicios de envío de peticiones. Para ello basta con ejecutar el siguiente código. PfServicioWSServiceLocator locator = new PfServicioWSServiceLocator(); PfServicioWS service = locator.getpfserviciows(new URL( http://servidor:puerto/pfirmav2/services/pfserviciows?wsdl )); Para obtener la información del usuario basta con llamar al método consultarusuario pasándole como parámetro el identificador (DNI) del usuario. El método devuelve un objeto UsuarioWS con los datos de dicho usuario en caso de existir en el sistema, de lo contrario devuelve null. UsuarioWS user = service.consultarusuario( 12345678Z ); Una vez obtenido el objeto, podremos acceder a cada una de las propiedades del usuario a través de sus métodos get. log.info("id: " + user.getcdni()); log.info("name: " + user.getdnombre()); log.info("first surname: " + user.getdapell1()); log.info("second surname: " + user.getdapell2()); Opción 3 Cambio de firmante en petición Cambia el firmante de una petición por el que se le especifique. El primer paso es obtener la clase servicio que proporciona los métodos para llamar a los distintos servicios de envío de peticiones. Para ello basta con ejecutar el siguiente código. PfServicioWSServiceLocator locator = new PfServicioWSServiceLocator(); PfServicioWS service = locator.getpfserviciows(new URL( http://servidor:puerto/pfirmav2/services/pfserviciows?wsdl )); Para cambiar un firmante de una petición necesitaremos el hash de la petición de la cual queremos cambiar el firmante, así como el identificador (DNI) del firmante a cambiar y el del nuevo firmante por el que será sustituido. También se necesitan nombre y apellidos del nuevo firmante. El servicio al que hay que llamar es cambiardestinatario. long receiverchanged = service.cambiardestinatario( MobHsoWscs, Página 14 de 43

12345678Z, 11111111H, Nuevo, Fir mante, De pruebas, "N"); A través del último parámetro se indica si es necesario dar de alta al nuevo firmante en el sistema en caso de que no existiese ( S o N ). En caso de ejecutarse la petición correctamente, el servicio devolverá un 0, mientras que de darse algún error se obtendrá otro valor. Opción 4 Obtención de id de transacción de un documento firmado en bloque Obtiene el identificador de transacción de un documento que haya sido firmado en bloque a través del hash del documento. El primer paso es obtener la clase servicio que proporciona los métodos para llamar a los distintos servicios de envío de peticiones. Para ello basta con ejecutar el siguiente código. PfServicioWSServiceLocator locator = new PfServicioWSServiceLocator(); PfServicioWS service = locator.getpfserviciows(new URL( http://servidor:puerto/pfirmav2/services/pfserviciows?wsdl )); Para obtener el identificador de transacción basta con llamar al servicio obteneridtransaccion. double transactionid = service.obteneridtransaccion(properties.get(constants.request_document_hash)); Dicho método nos devolverá el valor del id de transacción en caso de que la operación se haya realizado correctamente y 1 en caso de error. Página 15 de 43

2.3 Fachada Web Services v2 La fachada ofrece dos servicios, uno para consulta y otro para modificación. 2.3.1 Servicio de consulta Proporciona métodos de consulta de peticiones y datos asociados, usuarios y puestos de trabajo. El WSDL descriptor del servicio se encuentra en la siguiente URL: http://servidor:puerto/pfirmav2/servicesv2/queryservice?wsdl El javadoc de la interfaz webservice en java se puede encontrar dentro del fichero javadocws.zip. 2.3.2 Servicio de modificación Ofrece métodos para la creación, edición y envío de peticiones. El WSDL descriptor del servicio se encuentra en la siguiente URL: http://servidor:puerto/pfirmav2/servicesv2/modifyservice?wsdl El javadoc de la interfaz webservice en java se puede encontrar dentro del fichero javadocws.zip. 2.3.3 Ejemplo de integración Web Services Se incluye una aplicación de test llamada testpfirmav2ws para ilustrar el uso de los servicios ofrecidos en la fachada web service de v2. Se trata de una aplicación con estructura maven/eclipse y hace uso de unos clientes generados a través de CXF. La aplicación contiene una clase main que se encarga de lanzar los suites de test JUnit definidos. 2.3.3.1 Requisitos previos Las especificaciones del servidor a desarrollar las pruebas deben ser las indicadas en el documento de instalación de Portafirmas v2 (PF2 INS00X Instalación Portafirmas). En cuanto a los requisitos a nivel de equipo cliente, que tenga conexión contra el servidor donde está desplegada la aplicación y tener instalada una JRE 1.5 o superior. Página 16 de 43

Configuración del entorno de pruebas La aplicación cliente de los servicios web contiene un fichero de propiedades que debe ser configurado para la correcta realización de las pruebas. El fichero se encuentra en la ruta: /testpfirmav2ws/src/main/resources/ ## WS Adresses ## ws.q uery.address=http://servidor:puerto/pfir mav2/servicesv2/queryservice? wsdl ws.mofify.address=http://servidor:puerto/pfir mav2/servicesv2/modifyservice? wsdl ## Redaction data ## redaction.user.id=12345678z redaction.job.id=técnico redaction.doctype=generico redaction.application=pfirma redaction.subject=prueba WS redaction.reference=ref WSTesting redaction.text=req uest text. WS Testing application. redaction.document.path=/home/user/fir macorreo.gif redaction.document.name=docpruebaws redaction.document.mime=image/gif ## Metadata ## metadata.param1=parametro1 metadata.param2=parametro2 ## Action ## req uest.webaction=http\://www.google.com ## Signers ## req uest.newusersigner=11111111h req uest.newjobsigner=22222222j 2.3.3.2 Parámetros del entorno de pruebas A nivel de servidor no se requiere ningún requisito especial para Portafirmas. La aplicación de lanzamiento de pruebas se lanzará a través de línea de comandos. Las propiedades a editar en ws.properties son las siguientes: ws.query.address Url del servicio de consulta. ws.mofify.address Url del servicio de modificación. Página 17 de 43

redaction.user.id Identificador de usuario que actuará como remitente y destinatario de las peticiones. redaction.job.id Identificador del puesto de trabajo que será destinatario de las peticiones que sean enviadas a puesto de trabajo. redaction.doctype Tipo de documento que se enviará en la petición. redaction.application Nombre de la aplicación en el sistema de portafirmas a la cual pertenecerá la petición. redaction.subject Asunto de la petición. redaction.reference Referencia de la petición. redaction.text Texto de la petición. redaction.document.path Ruta del documento a insertar en la petición. redaction.document.name Nombre del documento a insertar en la petición. redaction.document.mime Tipo mime del documento a insertar en la petición. metadata.param1 Nombre del primer parámetro para la petición. metadata.param2 Nombre del segundo parámetro para la petición. request.webaction URL de web que será invocada al ejecutar la acción de la petición. request.newusersigner Nuevo firmante (usuario) para cambios de firmantes en peticiones. request.newjobsigner Página 18 de 43

Nuevo firmante (cargo) para cambios de firmantes en peticiones. Para lanzar la aplicación de pruebas es necesario compilar el proyecto a través de maven. Para ello lanzar la instrucción en el directorio raíz del proyecto: mvn clean compile Esto generará 2 ficheros jar en el directorio /target/. Para ejecutar la aplicación de test bastará con ejecutar la siguiente instrucción desde línea de comandos: java -jar testpfirmav2ws-1.0.0-jar-with-dependencies.jar Tras esto se mostrará el menú principal de la aplicación. 2.3.3.3 Detalle de pruebas A continuación se detallan cada uno de los casos probados en la aplicación. El proyecto contiene una clase ClientManager.java que es la encargada de generar los clientes del servicio web a través de sus respectivas URL definidas en el fichero ws.properties. URL q ueryserviceurl = new URL( http://servidor:puerto/pfir mav2/servicesv2/queryservice ); QueryServiceService q ueryservice = new QueryServiceService(q ueryserviceurl); QueryService client = q ueryservice.getqueryserviceport(); Opción 1 Envío de una petición de firma a un único firmante con acción asociada Seleccionando la primera opción desde el menú de la aplicación se lanzará dicho test. En este ejemplo se crea una petición y se envía a un único destinatario (el destinatario es el mismo que el remitente). El tipo de firma será de primer firmante y se le asociará una acción web a la petición que se lance cuando la petición sea leída por el firmante. Para implementar dicho ejemplo, lo primero que se necesita es generar los clientes de los servicios de consulta y modificación. ClientManager client = new ClientManager(); QueryService q ueryserviceclient = client.getqueryserviceclient(); ModifyService modifyserviceclient = client.getmodifyserviceclient(); Una vez generados los clientes, se obtendrá el usuario que actuará a su vez como remitente Página 19 de 43

y destinatario de la petición. Para ello, se hará una consulta de usuarios a través del método queryusers pasando como filtro el dni del usuario que se pretende obtener. UserList userlist = q ueryserviceclient.q ueryusers( 12345678Z ); User user = userlist.getuser().get(0); Tras obtener el usuario, se asignará el mismo como remitente y firmante de la petición. Remitente(s) y firmante(s) son añadidos a la petición a través de listas de sus respectivas clases por lo que es necesario instanciar una lista de remitentes y otra de firmantes y añadirles el usuario obtenido anteriormente. RemitterList remitterlist = new RemitterList(); remitterlist.getuser().add(user); Signer signer = new Signer(); signer.setuserjob(user); SignerList signerlist = new SignerList(); signerlist.getsigner().add(signer); El siguiente paso en la creación de la petición es añadirle una línea de firma que contenga al firmante que se definió anteriormente. Tal como se comentó en el punto anterior, los firmantes han de añadirse a las líneas de firma a través de listas por lo que se instanciará una lista de firmantes para añadirlas a la línea de firma y ésta será añadida también a una lista de líneas de firma. Si no se especifica el tipo de línea de firma, ésta toma por defecto el valor de firma. SignLine signline = new SignLine(); signline.setsignerlist(signerlist); SignLineList signlinelist = new SignLineList(); signlinelist.getsignline().add(signline); Tras crear la línea de firma se procederá a obtener el tipo del documento que se añadirá a la petición. DocumentTypeList doctypelist = q ueryserviceclient.q uerydocumenttypes( GENERICO ); DocumentType doctype = doctypelist.getdocumenttype().get(0); Y se adjuntará el documento a la petición. Mediante el método setsign se especifica que el documento será firmable o anexo. El contenido binario del mismo se pasa a través de un Página 20 de 43

objeto DataHandler. Los documentos de la petición también se almacenarán en una lista de los mismos para la creación de la petición. Document doc = new Document(); doc.setsign(true); doc.setdocumenttype(doctype); doc.setmime( text/plain ); doc.setname( fichero_a_fir mar ); DataSource ds = new FileDataSource( /home/user/fichero.txt ); DataHandler dh = new DataHandler(ds); doc.setcontent(dh); DocumentList doclist = new DocumentList(); doclist.getdocument().add(doc); Tras crear la lista de documentos se procederá a crear la lista de acciones a ejecutar añadiendo la acción tipo web que invocará la web indicada en el fichero ws.properties cuando la petición haya pasado a estado leída. Para ello basta con instanciar un objeto Action y otro State que marcará el estado en el que se ejecutará la acción y setear sus propiedades como se indica en el fragmento de código a continuación. Action action = new Action(); action.settype("web"); action.setaction(properties.get(constants.web_action_prop)); State stateread = new State(); stateread.setidentifier("leido"); action.setstate(stateread); ActionList actionlist = new ActionList(); actionlist.getaction().add(action); Una vez creada la lista de acciones de la petición, el siguiente paso es instanciar un objeto Request y setear sus propiedades con los datos obtenidos anteriormente además de indicar la aplicación a la que irá asociada dicha petición, el asunto, texto, referencia y tipo de firma de la misma. Req uest req = new Req uest(); req.setapplication(application); req.setdocumentlist(doclist); req.setreference( Referencia ); req.setremitterlist(remitterlist); req.setsignlinelist(signlinelist); req.setsigntype( PRIMER FIRMANTE ); req.setsubject( Asunto ); req.settext( Texto de la petición ); req.setactionlist(actionlist); Página 21 de 43

Una vez creado el objeto, se creará la petición a través del método createrequest del servicio de modificación pasándole el objeto Request, devolviendo el hash de la petición creada. String req uesthash = modifyserviceclient.createreq uest(req); Y para enviar la petición que ha sido creada, basta con invocar el método sendrequest del servicio de modificación, pasándole el hash de la misma. modifyserviceclient.sendreq uest(req uesthash); Tras este proceso, se habrá creado y enviado la petición. En caso de producirse algún error, el servición lanzará una PfirmaException con los detalles de dicho error. Página 22 de 43

Opción 2 Envío de una petición de firma a un usuario y un puesto de trabajo Seleccionando la segunda opción desde el menú de la aplicación se lanzará dicho test. En este ejemplo se crea una petición y se envía a un usuario y a un puesto de trabajo (el firmante usuario es el mismo que el remitente). El tipo de firma será en cascada. Para implementar dicho ejemplo, lo primero que se necesita es generar los clientes de los servicios de consulta y modificación. ClientManager client = new ClientManager(); QueryService q ueryserviceclient = client.getqueryserviceclient(); ModifyService modifyserviceclient = client.getmodifyserviceclient(); Una vez generados los clientes, se obtendrá el usuario que actuará a su vez como remitente y destinatario de la petición. Para ello, se hará una consulta de usuarios a través del método queryusers pasando como filtro el dni del usuario que se pretende obtener. UserList userlist = q ueryserviceclient.q ueryusers( 12345678Z ); User user = userlist.getuser().get(0); Dado que en este caso también se va a añadir un puesto de trabajo como firmante de la petición se consultará éste también a traves del servicio queryjobs pasándole como parámetro el código del puesto de trabajo. JobList joblist = q ueryserviceclient.q ueryjobs( Técnico ); Job job = joblist.getjob().get(0); Tras obtener usuario y puesto de trabajo se procede a definir los firmantes (usuario y puesto de trabajo) y el remitente (usuario). Signer signeruser = new Signer(); signeruser.setuserjob(user); Signer signerjob = new Signer(); signerjob.setuserjob(job); SignerList signerlist = new SignerList(); signerlist.getsigner().add(signeruser); signerlist.getsigner().add(signerjob); Página 23 de 43

RemitterList remitterlist = new RemitterList(); remitterlist.getuser().add(user); Una vez obtenidos los firmantes se añaden a una nueva línea de firma. SignLine signline = new SignLine(); signline.setsignerlist(signerlist); SignLineList signlinelist = new SignLineList(); signlinelist.getsignline().add(signline); Tras ello, mediante un proceso igual que en el ejemplo anterior, se crea el objeto petición y se le añaden documentos, firmantes y remitente y se establecen el texto, asunto, referencia y tipo de firma. DocumentTypeList doctypelist = q ueryserviceclient.q uerydocumenttypes( GENERICO ); DocumentType doctype = doctypelist.getdocumenttype().get(0); Document doc = new Document(); doc.setsign(true); doc.setdocumenttype(doctype); doc.setmime( text/plain ); doc.setname( fichero_a_fir mar ); DataSource ds = new FileDataSource( /home/user/fichero.txt ); DataHandler dh = new DataHandler(ds); doc.setcontent(dh); DocumentList doclist = new DocumentList(); doclist.getdocument().add(doc); Req uest req = new Req uest(); req.setapplication(application); req.setdocumentlist(doclist); req.setreference( Referencia ); req.setremitterlist(remitterlist); req.setsignlinelist(signlinelist); req.setsigntype( CASCADA ); req.setsubject( Asunto ); req.settext( Texto de la petición ); Una vez creado el objeto, se creará la petición a través del método createrequest del servicio de modificación pasándole el objeto Request, devolviendo el hash de la petición creada. String req uesthash = modifyserviceclient.createreq uest(req); Página 24 de 43

Y para enviar la petición que ha sido creada, basta con invocar el método sendrequest del servicio de modificación, pasándole el hash de la misma. modifyserviceclient.sendreq uest(req uesthash); Tras este proceso, se habrá creado y enviado la petición. En caso de producirse algún error, el servición lanzará una PfirmaException con los detalles de dicho error. Opción 3 Envío de una petición de firma a un usuario y visto bueno a un puesto de trabajo con documento anexo Seleccionando la tercera opción en el menú de la aplicación se lanzará dicho test. En este ejemplo se crea una petición que contiene una línea de visto bueno para un puesto de trabajo y una segunda línea de firma para un usuario. El tipo de firma es en cascada y lleva un documento anexo que no se firmará. Para implementar dicho ejemplo, lo primero que se necesita es generar los clientes de los servicios de consulta y modificación. ClientManager client = new ClientManager(); QueryService q ueryserviceclient = client.getqueryserviceclient(); ModifyService modifyserviceclient = client.getmodifyserviceclient(); Una vez generados los clientes, se obtendrá el usuario que actuará a su vez como remitente y destinatario de la petición. Para ello, se hará una consulta de usuarios a través del método queryusers pasando como filtro el dni del usuario que se pretende obtener. UserList userlist = q ueryserviceclient.q ueryusers( 12345678Z ); User user = userlist.getuser().get(0); Dado que en este caso también se va a añadir un puesto de trabajo como firmante de la petición se consultará éste también a traves del servicio queryjobs pasándole como parámetro el código del puesto de trabajo. JobList joblist = q ueryserviceclient.q ueryjobs( Técnico ); Job job = joblist.getjob().get(0); Tras obtener usuario y puesto de trabajo se procede a definir los firmantes (usuario y puesto de trabajo) y el remitente (usuario). Signer signeruser = new Signer(); signeruser.setuserjob(user); Signer signerjob = new Signer(); Página 25 de 43

signerjob.setuserjob(job); SignerList signerlist = new SignerList(); signerlist.getsigner().add(signeruser); signerlist.getsigner().add(signerjob); RemitterList remitterlist = new RemitterList(); remitterlist.getuser().add(user); Una vez obtenidos los firmantes se procederá a crear las líneas de firma y visto bueno. SignLine signline = new SignLine(); SignLine signline2 = new SignLine(); SignerList signerlist = new SignerList(); SignerList signerlist2 = new SignerList(); signerlist.getsigner().add(signeruser); signerlist2.getsigner().add(signerjob); signline.setsignerlist(signerlist); signline2.setsignerlist(signerlist2); signline.settype( FIRMA ); signline2.settype( VISTO BUENO ); SignLineList signlinelist = new SignLineList(); signlinelist.getsignline().add(signline2); signlinelist.getsignline().add(signline); A continuación se procede a crear los documentos que se incluirán en la petición, obteniendo primero el tipo de documento de ambos. DocumentTypeList doctypelist = q ueryserviceclient.q uerydocumenttypes( GENERICO ); DocumentType doctype = doctypelist.getdocumenttype().get(0); Se crea el primer documento para firma. Document doc = new Document(); doc.setsign(true); doc.setdocumenttype(doctype); doc.setmime(properties.get( plain/txt ); doc.setname(properties.get( Documento para fir ma ); DataSource ds = new FileDataSource( home/user/prueba.txt ); DataHandler dh = new DataHandler(ds); doc.setcontent(dh); Y posteriormente se crea el documento anexo (Se utiliza el mismo objeto DataHandler dado Página 26 de 43

que se va a usar el mismo contenido binario para ambos documentos. Document doc2 = new Document(); doc2.setsign(false); doc2.setdocumenttype(doctype); doc2.setmime( plain/text ); doc2.setname(properties.get( Documento anexo ); doc2.setcontent(dh); Y finalmente se añaden a la lista de documentos a adjuntar en la petición. DocumentList doclist = new DocumentList(); doclist.getdocument().add(doc); doclist.getdocument().add(doc2); Tras ello, mediante un proceso igual que en el ejemplo anterior, se crea el objeto petición y se le añaden firmantes y remitente y se establecen el texto, asunto, referencia y tipo de firma. Req uest req = new Req uest(); req.setapplication(application); req.setdocumentlist(doclist); req.setreference( Referencia ); req.setremitterlist(remitterlist); req.setsignlinelist(signlinelist); req.setsigntype( CASCADA ); req.setsubject( Asunto ); req.settext( Texto de la petición ); Una vez creado el objeto, se creará la petición a través del método createrequest del servicio de modificación pasándole el objeto Request, devolviendo el hash de la petición creada. String req uesthash = modifyserviceclient.createreq uest(req); Y para enviar la petición que ha sido creada, basta con invocar el método sendrequest del servicio de modificación, pasándole el hash de la misma. modifyserviceclient.sendreq uest(req uesthash); Tras este proceso, se habrá creado y enviado la petición. En caso de producirse algún error, el servición lanzará una PfirmaException con los detalles de dicho error. Página 27 de 43

Opción 4 Eliminación de una petición Seleccionando la cuarta opción en el menú de la aplicación se lanzará dicho test. En este ejemplo se crea una petición con los datos especificados en el fichero ws.properties y la elimina a continuación. Para implementar dicho ejemplo, lo primero que se necesita es generar los clientes de los servicios de consulta y modificación. ClientManager client = new ClientManager(); QueryService q ueryserviceclient = client.getqueryserviceclient(); ModifyService modifyserviceclient = client.getmodifyserviceclient(); Una vez generados los clientes, se creará y enviará la petión que será eliminada a continuación. String req uesthash = createreq uest(q ueryserviceclient,modifyserviceclient); log.info("req uest created correctly with hash " + req uesthash); // Send req uest modifyserviceclient.sendreq uest(req uesthash); log.info("req uest sent"); Una vez creada la petición procedemos a eliminarla a través del servicio deleterequest pasándole como parámetro el hash de dicha petición de firma. modifyserviceclient.deletereq uest(req uesthash); log.info("req uest with hash " + req uesthash + " deleted correctly"); Tras este proceso, se habrá eliminado la petición. En caso de producirse algún error, el servición lanzará una PfirmaException con los detalles de dicho error. Página 28 de 43

Opción 5 Creación de una petición con metadatos Seleccionando la quinta opción en el menú de la aplicación se lanzará dicho test. En este ejemplo se crea una petición con los datos especificados, entre los que se encuentran los nombres de 2 parámetros de la aplicación que se añadirán como información adicional a la petición enviada. Para implementar dicho ejemplo, lo primero que se necesita es generar los clientes de los servicios de consulta y modificación. ClientManager client = new ClientManager(); QueryService q ueryserviceclient = client.getqueryserviceclient(); ModifyService modifyserviceclient = client.getmodifyserviceclient(); Una vez generados los clientes, se creará y se llamará al servicio de consulta de petición pasándole como parámetro el hash de la petición creada para así obtener toda la información de la petición en un objeto Request. // Create req uest String req uesthash = createreq uest(q ueryserviceclient,modifyserviceclient); // Obtain req uest Req uest req = q ueryserviceclient.q ueryreq uest(req uesthash); Una vez obtenida la petición, pasamos a añadirle al objeto Request los dos parámetros cuyos nombres están especificados en el fichero ws.properties y estableciendo como valor una cadena de prueba. // Add parameters Parameter param1 = new Parameter(); param1.setidentifier(properties.get(constants.parameter_1)); param1.setvalue("testing value 1"); Parameter param2 = new Parameter(); param2.setidentifier(properties.get(constants.parameter_2)); param2.setvalue("testing value 2"); Una vez creados los parámetros se añaden a un nuevo objeto ParameterList que se asignará al objeto Request que estamos editando. ParameterList paramlist = new ParameterList(); paramlist.getparameter().add(param1); paramlist.getparameter().add(param2); req.setparamterlist(paramlist); Página 29 de 43

Una vez añadida la información adicional a la petición bastará con enviar la petición. En el código de ejemplo se recorre la lista de parámetros de la petición y se muestran por consola para comprobar que se han añadido correctamente. // Send req uest modifyserviceclient.sendreq uest(req uesthash); log.info("req uest metadata:"); for (Parameter param : req.getparamterlist().getparameter()) { log.info(param.getidentifier() + ": " + param.getvalue()); En caso de producirse algún error, el servición lanzará una PfirmaException con los detalles de dicho error. Opción 6 Creación de una petición con metadatos Seleccionando la sexta opción en el menú de la aplicación se lanzará dicho test. En este ejemplo se crea una petición con los datos especificados, y se actualizan las líneas de firma eliminando y añadiendo nuevos firmantes antes y después de haber enviado la petición. Para implementar dicho ejemplo, lo primero que se necesita es generar los clientes de los servicios de consulta y modificación. ClientManager client = new ClientManager(); QueryService q ueryserviceclient = client.getqueryserviceclient(); ModifyService modifyserviceclient = client.getmodifyserviceclient(); Una vez generados los clientes, se creará la petición y se llamará al servicio de consulta para obtener un objeto Request con todos los datos de la misma. String req uesthash = createreq uest(q ueryserviceclient, modifyserviceclient); Req uest req = q ueryserviceclient.q ueryreq uest(req uesthash); A continuación se eliminará el único firmante que tiene la petición a través del servicio deletesigners pasándole el hash de petición y la lista de firmantes a eliminar(en este caso la que contiene la única línea de firma de la petición) y volvemos a llamar al servicio de consulta de peticiones para actualizar el objeto Request. modifyserviceclient.deletesigners(req uesthash, req.getsignlinelist().getsignline().get(0).getsignerlist()); req = q ueryserviceclient.q ueryreq uest(req uesthash); Tras haber dejado la petición sin líneas de firma ni firmantes, se procederá a insertar una Página 30 de 43

nueva línea de firma con un firmante indicado en el fichero ws.properties. Para ello basta con llamar al servicio insertsigners pasándole el hash de la petición, el número de la línea de firma (contando desde 0) y la lista de firmantes a insertar. Para ello creamos los objetos Signer y SignerListn y los cargamos con la información especificada en el fichero properties y se envía. Tras ello volvemos a actualizar el objeto Request a mediante el servicio de consulta. Página 31 de 43

// Query users UserList userlist = q ueryserviceclient.q ueryusers(properties.get(constants.new_user_signer_1_prop)); // Create signer Signer signer = new Signer(); signer.setuserjob(userlist.getuser().get(0)); SignerList signerlist = new SignerList(); signerlist.getsigner().add(signer); // Insert signer modifyserviceclient.insertsigners(req uesthash, 0, signerlist); // Update req uest object req = q ueryserviceclient.q ueryreq uest(req uesthash); // Send req uest modifyserviceclient.sendreq uest(req uesthash); Al no existir la línea de firma 0, ésta se crea automáticamente. Una vez enviada la petición se procederá a eliminar el firmante insertado anteriormente para verificar que tras esta operación, la petición pasará a estado Nueva. El procedimiento es igual al descrito anteriormente. modifyserviceclient.deletesigners(req uesthash, req.getsignlinelist().getsignline().get(0).getsignerlist()); Opción 7 Eliminación de última línea de firma en petición cuya penúltima línea de firma es de tipo visto bueno Seleccionando la séptima opción en el menú de la aplicación se lanzará dicho test. En este ejemplo se crea una petición cuya primera línea de firma es de visto bueno y la segunda de tipo firma (cada una con un único firmante). Tras ello se intenta eliminar el último firmante y el sistema devolverá un error indicando que una petición no puede contener como última línea de firma una de tipo visto bueno. Para implementar dicho ejemplo, lo primero que se necesita es generar los clientes de los servicios de consulta y modificación. ClientManager client = new ClientManager(); QueryService q ueryserviceclient = client.getqueryserviceclient(); ModifyService modifyserviceclient = client.getmodifyserviceclient(); Una vez generados los clientes, se creará la petición, se enviará y se llamará al servicio de consulta para obtener el objeto Request con todos los datos de la petición. JobList joblist = q ueryserviceclient.q ueryjobs(properties.get(constants.job_id_prop)); Job job = joblist.getjob().get(0); Página 32 de 43

// Creating signers Signer signeruser = new Signer(); signeruser.setuserjob(user); Signer signerjob = new Signer(); signerjob.setuserjob(job); // Creating sign lines log.info("creating sign line"); SignLine signline = new SignLine(); SignLine signline2 = new SignLine(); SignerList signerlist = new SignerList(); SignerList signerlist2 = new SignerList(); signerlist.getsigner().add(signeruser); signerlist2.getsigner().add(signerjob); signline.setsignerlist(signerlist); signline2.setsignerlist(signerlist2); signline.settype(constants.sign_type); signline2.settype(constants.pass_type); SignLineList signlinelist = new SignLineList(); signlinelist.getsignline().add(signline2); signlinelist.getsignline().add(signline); // Create req uest String req uesthash = createreq uest(q ueryserviceclient, modifyserviceclient); modifyserviceclient.sendreq uest(req uesthash); // Get req uest Req uest req = q ueryserviceclient.q ueryreq uest(req uesthash); Tras esto se actualiza el objeto request con las líneas de firma en la disposición comentada anteriormente y se vuelve a enviar (ya que al eliminar los firmantes, ésta pasa de nuevo a estado no enviada ). // Delete signers modifyserviceclient.deletesigners(req uesthash, req.getsignlinelist().getsignline().get(0).getsignerlist()); req.setsigntype(constants.sign_type_cascade); req.setsignlinelist(signlinelist); // Update req uest modifyserviceclient.updatereq uest(req); // Resend req uest modifyserviceclient.sendreq uest(req uesthash); Tras ello intentaremos eliminar la línea de firma tipo firma para que a posteriori nos salte una excepción indicando que la petición no puede contener como última línea de firma una línea tipo visto bueno. // Try to delete last sign line (must fail) Página 33 de 43

modifyserviceclient.deletesigners(req uesthash, signerlist); Página 34 de 43

3 Interfaz de Custodia de ficheros Portafirmas ofrece la posiblidad de implementar un sistema propio de almacenamiento de documentos y firmas que no sea el que ofrece la aplicación por defecto (almacenamiento en base de datos, fichero o alfresco). Para ello basta con implementar dos interfaces: CustodyServiceInput Contiene los métodos de subida de documentos y firmas. CustodyServiceOutput Contiene los métodos de descarga de documentos y firmas. 3.1 Interfaz CustodyServiceInput Se encuentra en el paquete: es.juntadeandalucia.cice.pfirma.utils.document.service Contiene los métodos a implementar para la subida de ficheros. Si se produjese cualquier error durante la ejecución de cualquiera de sus métodos deberá lanzarse una excepción de tipo CustodyServiceException. Dicha excepción se encuentra definida en el paquete: es.juntadeandalucia.cice.pfirma.utils.document public interface CustodyServiceInput extends Serializable { public void initialize(map<string, Object> parametermap) throws CustodyServiceException; public String uploadfile(custodyserviceinputdocument document, InputStream input) throws CustodyServiceException; public String uploadsign(custodyserviceinputsign sign, InputStream input) throws CustodyServiceException; El método initialize sirve para setear los valores que sean necesarios en la implementación a Página 35 de 43

través de un mapa de parámetros. En la implementación de ficheros, en principio sería necesario tener la ruta donde serán almacenados los ficheros, por lo que recibiría dicha ruta en el mapa como un parámetro. El método uploadfile se emplea para subir el documento. Para ello recibe una clase tipo CustodyServiceInputDocument con datos útiles para realizar la subida. Dicha clase no es más que un bean con propiedades y sus métodos de acceso y se encuentra en el paquete es.juntadeandalucia.cice.pfirma.utils.document.bean. El otro parámetro que recibe es un objeto InputStream con el contenido binario a subir. A través del método uploadsign se suben al sistema los ficheros de firma generados tras el proceso de firma de peticiones. El funcionamiento es el mismo que en el método uploadfile salvo que el objeto que recibe es de tipo CustodyServiceInputSign que se encuentra en el paquete es.juntadeandalucia.cice.pfirma.utils.document.bean. A continuación se muestra la implementación de fichero para la subida de documentos. public class FilePathCustodyServiceInputImpl implements CustodyServiceInput { private static final long serialversionuid = 1L; public static final String C_PARAMETER_FILEPATH_PATH = "RUTA"; private org.slf4j.logger log = LoggerFactory.getLogger(FilePathCustodyServiceInputImpl.class); private String path; private Map<String, String> signextensions; public void initialize(map<string, Object> parametermap) throws CustodyServiceException { this.path = (String) parametermap.get(c_parameter_filepath_path); if (path == null path.eq uals("")) { throw new CustodyServiceException( "No path to store files defined. Check configuration parameters"); signextensions = Util.getInstance().loadSignExtensions(); public String uploadfile(custodyserviceinputdocument document, InputStream input) throws CustodyServiceException { log.info("uploadfile init"); String filepath = null; // Get file name Página 36 de 43

String filename = Util.getInstance().getNameFile(document.getName()); // Replace filename with hash code filename = Util.getInstance().replaceFileNameWithHash(fileName, document.getcheckhash()); String separator = path.substring(path.length() 1).eq uals( File.separatorChar + "")? "" : File.separatorChar + ""; filepath = path + separator + getyear() + separator + getweek() + separator; uploadfile(filepath, filename, input); log.info("uploadfile end"); return filepath + filename; public String uploadsign(custodyserviceinputsign sign, InputStream input) throws CustodyServiceException { log.info("uploadsign init"); String separator = path.substring(path.length() 1).eq uals( File.separatorChar + "")? "" : File.separatorChar + ""; // Set file path String filepath = path + separator + getyear() + separator + getweek() + separator; // Set sign extension String filename = sign.gettransaction() + "." + signextensions.get(sign.getfor mat()); uploadfile(filepath, filename, input); log.info("uploadfile end"); return filepath + filename; private void uploadfile(string path, String name, InputStream input) throws CustodyServiceException { try { File f = new File(path); if (!f.exists()) { f.mkdirs(); OutputStream outputstream = new FileOutputStream(path + name); int read; byte[] buffer = new byte[constants.buffer_size]; while ((read = input.read(buffer)) > 0) { outputstream.write(buffer, 0, read); Página 37 de 43

input.close(); outputstream.close(); catch (FileNotFoundException e) { throw new CustodyServiceException(e.getMessage()); catch (IOException e) { throw new CustodyServiceException(e.getMessage()); private String getyear() { Calendar cal = Calendar.getInstance(); SimpleDateFor mat sdfyear = new SimpleDateFor mat("yyyy"); return sdfyear.for mat(cal.gettime()); private String getweek() { Calendar cal = Calendar.getInstance(); SimpleDateFor mat sdfweek = new SimpleDateFor mat("ww"); return sdfweek.for mat(cal.gettime()); Página 38 de 43

3.2 Interfaz CustodyServiceOutput Se encuentra en el paquete: es.juntadeandalucia.cice.pfirma.utils.document.service Contiene los métodos a implementar para la descarga de ficheros. Si se produjese cualquier error durante la ejecución de cualquiera de sus métodos deberá lanzarse una excepción de tipo CustodyServiceException. Dicha excepción se encuentra definida en el paquete: es.juntadeandalucia.cice.pfirma.utils.document public interface CustodyServiceOutput extends Serializable { public void initialize(map<string, Object> parametermap) throws CustodyServiceException; public void downloadfile(custodyserviceoutputdocument document, OutputStream outputstream) throws CustodyServiceException; public BigDecimal filesize(custodyserviceoutputdocument document) throws CustodyServiceException; public void downloadsign(custodyserviceoutputsign sign, OutputStream outputstream) throws CustodyServiceException; public BigDecimal signsize(custodyserviceoutputsign sign) throws CustodyServiceException; El método initialize sirve para setear los valores que sean necesarios en la implementación a través de un mapa de parámetros. En la implementación de ficheros, en principio no sería necesario ningún parámetro. Mediante el método downloadfile se descargan los documentos en la aplicación. Dicho método recibe un objeto CustodyServiceOutputDocument con datos útiles para realizar la descarga del documento. Dicha clase no es más que un bean con propiedades y sus métodos de acceso y se encuentra en el paquete es.juntadeandalucia.cice.pfirma.utils.document.bean. El otro parámetro que recibe el método no es más que un objeto OutputStream para cargar con el contenido binario a descargar. Página 39 de 43

El método filesize sirve para calcular el tamaño del contenido binario del documento a partir de los datos recibidos en el objeto CustodyServiceOutputDocument. A través del método downloadsign se descargan del sistema las firmas almacenadas en el sistema tras el proceso de firma de peticiones. El funcionamiento es el mismo que en el método downloadfile salvo que el objeto que recibe es de tipo CustodyServiceOutputSign que se encuentra en el paquete es.juntadeandalucia.cice.pfirma.utils.document.bean. El método signsize es utilizado para calcular el tamaño del contenido binario de las firmas a través de los datos recibidos en el objeto CustodyServiceOutputSign. A continuación se muestra la implementación de fichero para la subida de documentos. public class FilePathCustodyServiceOutputImpl implements CustodyServiceOutput { private static final long serialversionuid = 1L; private org.slf4j.logger log = LoggerFactory.getLogger(FilePathCustodyServiceOutputImpl.class); public void initialize(map<string, Object> parametermap) throws CustodyServiceException { // nothing { public void downloadfile(custodyserviceoutputdocument document, OutputStream outputstream) throws CustodyServiceException log.info("downloadfile init"); download(document.geturi(), outputstream); log.info("downloadfile end"); public BigDecimal filesize(custodyserviceoutputdocument document) throws CustodyServiceException { log.info("filesize init"); return size(document.geturi()); { public void downloadsign(custodyserviceoutputsign sign, OutputStream outputstream) throws CustodyServiceException log.info("downloadsign init"); download(sign.geturi(), outputstream); Página 40 de 43