0% found this document useful (0 votes)
77 views

Aplicaciones Distribuidas en Java Con Tecnologia RMI: JANUARY 2008

explain the programmer in java with internet.

Uploaded by

Jaime Np
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
77 views

Aplicaciones Distribuidas en Java Con Tecnologia RMI: JANUARY 2008

explain the programmer in java with internet.

Uploaded by

Jaime Np
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 19

See

discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/266794630

Aplicaciones Distribuidas en Java con


Tecnologia RMI
BOOK JANUARY 2008
DOI: 10.13140/2.1.2208.5127

READS

910

2 AUTHORS:
Santi Caball

Fatos Xhafa

Universitat Oberta de Catalunya

Polytechnic University of Catalonia

164 PUBLICATIONS 683 CITATIONS

502 PUBLICATIONS 2,479 CITATIONS

SEE PROFILE

SEE PROFILE

Available from: Santi Caball


Retrieved on: 03 February 2016

Aplicaciones Distribuidas en Java


con Tecnologia RMI
Santi Caballe y Fatos Xhafa

Portadilla del ttulo completo sin autores

II

Programacion Distribuida con Java

Acerca de los autores

SANTI CABALLE es Profesor de la Universidad Abierta de Cataluna (UOC)


desde el ano 2006 siendo profesor-colaborador en esta misma universidad en los
dos anos anteriores. Su a mbito docente se centra en el a rea de la Ingeniera del Software tanto en el desarrollo de aplicaciones en entornos distribuidos como centralizados. Las tecnologas distribuidas y su aplicacion, especialmente para el aprendizaje
colaborativo virtual, son una de sus a reas de investigacion mas activas en la

que ha publicado numerosos artculos en congresos y conferencias internacionales. Actualmente,
participa en diferentes proyectos de investigacion tanto nacionales como internacionales relacionados con el desarrollo de aplicaciones distribuidas. (http://cv.uoc.edu/scaballe/)

FATOS XHAFA es Profesor Titular de la Universidad Politecnica de Cataluna


(UPC). Imparte docencia en los estudios presenciales de la UPC desde el ano 1996
y en los estudios a distancia de la Universidad Abierta de Cataluna desde el ano
2000. En su docencia ha impartido e imparte asignaturas relacionadas con la programacion distribuida y el desarrollo de aplicaciones distribuidas. Ha publicado
 varios libros de docencia de circulacion nacional. La programacion distribuida es
a la vez uno de los temas de investigacion que le interesa; en este respecto ha participado y participa
en varios proyectos de investigacion nacionales y de la EU relacionado con la programacion distribuida de gran escala, ha publicado numerosos artculos en revistas y conferencias internacionales
y ha organizado eventos internacionales. (http://www.lsi.upc.edu/fatos/)

III

Portadilla con ttulo, autores, universidad y logo Delta

IV

Programacion Distribuida con Java

Pagina de Copyright

A nuestras famlias.

VI

Programacion Distribuida con Java

VII

Prefacio
La programacion distribuida, des de sus incios, ha formado parte de los currculums de los estudios
de informatica y hoy en da esta presente no solo en los planes de estudios informaticos sino que
tambien en las ingenieras en general, e incluso en nuevas titulaciones como las bioinformatica.
Ademas, la comunidad de los profesionales que usan la programacion distribuida como su herramienta de programacion ha ido siempre creciendo.
Con Internet y otras nuevas tecnologas, la programacion distribuida ha recibido un nuevo impulso. La propia naturaleza de Internet como una plataforma distribuida ha hecho de la programacion distribuida un paradigma indispensable para el desarrollo de aplicaciones de Internet. Como
consecuencia, la programacion distribuida ha resultado aun mas importante para los estudios universitarios.
El libro Aplicaciones Distribuidas con Java explica los fundamentos de la programacion distribuida con Java. El contenido propuesto tiene como objetivo cubrir las necesidades de las titulaciones de ingenieras tecnicas y superior en Informatica en cuanto a asignaturas de arquitectura y
programacion intermedia y avanzada. Por otra parte, el contenido representa un punto de partida
para profesionales informaticos que deseen introducirse en la programacion distribuida. Los contenidos del libro cubren el desarrollo de las aplicaciones distribuidas paso a paso transmitiendo as
la metodologa que el estudiante y el profesional necesitan y pueden aplicar para afianzar los conceptos teoricos. Para ello, se ha considerado el caso de la tecnologa RMI de manera sistematica:
empezando por los conceptos basicos, ejemplos y aplicaciones sencillas hasta llegar a aplicaciones
complejas.
El libro tiene un enfoque eminentemente pragmatico combinando los conceptos teoricos principales con gran cantidad de ejemplos. Estos ejemplos se encuentran en forma de graficos para
representar los modelos de arquitecturas expuestas conceptualmente y sobretodo incluye casos resueltos tanto especficos como completos en forma de codigo fuente. Los ejemplos presentados a
lo largo del libro se han escogido cuidadosamente y motivados por problemas reales.
El objetivo del libro es que se pueda utilizar como material de soporte para estudiantes universitarios que tienen que afrontar ejercicios practicos como parte del plan de estudios para superar
las asignaturas. Ademas se ha concebido como una obra para el aprendizaje incremental desde
los conceptos basicos hasta los mas avanzados. El libro no presupone ningun conocimiento de la
programacion distribuida si bien presupone algunos conocimientos muy basicos de Programacion

Orientada a Objetos (POO). Obviamente,


en las aplicaciones distribuidas, las bases de datos juegan
un papel importante y por tanto algunos conocimientos basicos de bases de datos y SQL facilitaran
la lectura del libro. Remarcamos, de todas formas, que no ha sido objetivo de este libro explicar
temas de bases de datos si bien se han explicado en detalle las bases de datos en el contexto de los

VIII

Programacion Distribuida con Java

ejemplos practicos.
A partir de una lectura secuencial del libro, cualquier lector (estudiante o profesional) podra
avanzar en sus conocimientos de programacion distribuida y su aplicacion en Java de forma gradual. Tambien se facilitara al lector la posibilidad de experimentar a fondo con todos los ejemplos
ofrecidos en el libro mediante la disposicion de material complementario que se encuentra en el
sitio Web de Delta Publicaciones. El objetivo es aprovechar los altos beneficios pedagogicos que
ofrecen las practicas en este sentido al implicar la instalacion y el uso de las tecnologas necesarias
para experimentar con los ejemplos del libro.
Nuestros agradecimientos a Joan Carles Gimenez Alcober por su ayuda en la preparacion del
material. Este libro se ha beneficiado de las sugerencias de los estudiantes de la asignatura Tecnicas
de Desarrollo de Software de la Universidad Abierta de Cataluna (UOC) y muy particularmente a
los estudiantes del grupo JAVA22 de los estudios de Informatica de Gestion de la UOC.

Barcelona, Agosto de 2007.

Los autores

Contenido

IX

Contenido
Introduccion
1 El paradigma de la computacion distribuida
1.1 Introduccion . . . . . . . . . . . . . . . . . . . . . .
1.1.1 Sistemas distribuidos y centralizados . . . .
1.2 Que es la computacion distribuida . . . . . . . . . .
1.3 Anatoma de un entorno de computacion distribuida .
1.3.1 Capa hardware . . . . . . . . . . . . . . . .
1.3.2 Capa sistema operativo de red . . . . . . . .
1.3.2.1 Procesos . . . . . . . . . . . . . .
1.3.2.2 Threads . . . . . . . . . . . . . .
1.3.2.3 Comunicacion a redes . . . . . . .
1.3.3 Capa software intermediario (middleware) . .
1.3.4 Capa aplicacion . . . . . . . . . . . . . . . .
1.4 Beneficios de la computacion distribuida . . . . . . .
1.4.1 Escalabilidad . . . . . . . . . . . . . . . . .
1.4.2 Apertura . . . . . . . . . . . . . . . . . . .
1.4.3 Heterogeneidad . . . . . . . . . . . . . . . .
1.4.4 Fiabilidad . . . . . . . . . . . . . . . . . . .
1.4.5 Viabilidad . . . . . . . . . . . . . . . . . . .
1.5 Costes y soluciones en la computacion distribuida . .
1.5.1 Interoperabilidad . . . . . . . . . . . . . . .
1.5.2 Eficiencia y seguridad . . . . . . . . . . . .
1.5.3 Vision global . . . . . . . . . . . . . . . . .
1.5.3.1 Coherencia . . . . . . . . . . . . .
1.5.3.2 Sincronizacion . . . . . . . . . . .
1.5.3.3 Administracion . . . . . . . . . .
1.5.3.4 Balanceo de carga . . . . . . . . .
1.5.4 Transparencia en la computacion distribuida .
1.5.4.1 Transparencia de acceso . . . . . .
1.5.4.2 Transparencia de ubicacion . . . .
1.5.4.3 Transparencia de migracion . . . .
1.5.4.4 Transparencia de replicacion . . .
1.5.4.5 Transparencia a fallos . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

11
11
12
13
15
16
16
17
17
17
18
18
19
20
21
22
22
23
24
24
25
26
26
27
27
28
28
28
29
29
29
29

Programacion Distribuida con Java


1.6

Modelos de computacion distribuida . . . . . .


1.6.1 Modelo Cliente/Servidor . . . . . . . .
1.6.2 Arquitectura de ncapas . . . . . . . .
1.6.3 Entornos Grid . . . . . . . . . . . . . .
1.6.3.1 Generadores de electricidad .
1.6.3.2 Generadores de computacion
1.6.3.3 Recursos Grid . . . . . . . .
1.6.3.4 Grid de ciclos inutilizados . .
1.6.4 Sistemas Peer-to-Peer . . . . . . . . .
1.6.4.1 Sistemas hbridos . . . . . .
1.6.4.2 Sistemas P2P puros . . . . .
Test de auto-evaluacion . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

2 Desarrollo de aplicaciones distribuidas


2.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Por que utilizar la programacion distribuida? . . . . . . . . . . . . . . . .
2.1.2 Las 8 falacias de la programacion distribuida . . . . . . . . . . . . . . . .
2.2 Desarrollo de aplicaciones distribuidas . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 Partes de una aplicacion distribuida . . . . . . . . . . . . . . . . . . . . .
2.2.2 Requerimentos basicos sobre una aplicacion distribuida . . . . . . . . . . .
2.3 Tres modelos basicos de la programacion distribuida . . . . . . . . . . . . . . . .
2.3.1 Modelo Cliente/Servidor . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.1.1 Protocolo de solicitud-respuesta del modelo C/S . . . . . . . . .
2.3.1.2 Modelo C/S: terminos y definiciones . . . . . . . . . . . . . . .
Los componentes de una aplicacion C/S. . . . . . . . . . . . . . .
El server loop. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interfaces del C/S: interfaces import/export. . . . . . . . . . . . . .
C/S: modo de comunicacion. . . . . . . . . . . . . . . . . . . . . .
2.3.1.3 Tres tipos de procesamiento de solicitudes de servicios . . . . .
Proceso servidor dedicado. . . . . . . . . . . . . . . . . . . . . . .
Clonaje de un proceso servidor. . . . . . . . . . . . . . . . . . . .
Threads procesos servidores ligeros. . . . . . . . . . . . . . . . .
2.3.1.4 Clientes ligeros/pesados vs. servidores pesados/ligeros . . . . . .
2.3.1.5 Middleware para aplicaciones Cliente/Servidor . . . . . . . . . .
El ejemplo del middleware ODBC. . . . . . . . . . . . . . . . . .
2.3.2 Remote Procedure Call . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.3 Como funciona el RPC . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Similitudes y diferencias entre la llamada de procedimientos locales
y remotos. . . . . . . . . . . . . . . . . . . . . . . . .
2.3.4 Aplicaciones distribuidas basadas en RPC . . . . . . . . . . . . . . . . . .
2.3.5 Modelo basado en objetos distribuidos . . . . . . . . . . . . . . . . . . . .
2.3.5.1 Arquitectura general para sistemas basados en objetos distribuidos
2.3.5.2 Transaccion de objetos remotos en tiempo de ejecucion . . . . .
2.3.5.3 The Common Object Request Broker Adapter CORBA . . . . .
2.4 Otros modelos de la programacion distribuida . . . . . . . . . . . . . . . . . . . .

29
29
30
31
32
33
33
34
35
35
36
38
39
39
40
41
42
43
44
44
45
45
46
47
47
47
48
48
49
49
49
50
50
51
51
52
53
53
54
56
56
57
58

Contenido

XI

2.4.1 Multi-threading . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4.2 Modelo de comparticion de datos . . . . . . . . . . . . . . . . . . .
2.4.3 Modelo basado en paso de mensajes . . . . . . . . . . . . . . . . . .
2.5 Proceso de construccion de una aplicacion distribuida . . . . . . . . . . . . .
2.5.1 Descomposicion en paquetes/componentes y ciclo en espiral . . . . .
2.5.2 Modelo-Vista-Controlador con patron Observador . . . . . . . . . .
Observer y Observable de Java. . . . . . . . . . . . . .
2.5.3 Factores que miden el e xito del proceso de desarrollo de aplicaciones
tribuidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Test de auto-evaluacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 Java para aplicaciones distribuidas
3.1 Paradigma de orientacion a objetos . . . . . . . . . . . . . . . . . . .
3.1.1 Modularizacion y ocultacion de la informacion . . . . . . . .
Ejemplo 3.1.: Gestion de Empleados de una Empresa.
3.1.2 Clasificacion y abstraccion . . . . . . . . . . . . . . . . . . .
Ejemplo 3.2. Abstraer el modelo de un coche. . . . . .
3.1.3 Herencia y polimorfismo . . . . . . . . . . . . . . . . . . . .
3.1.4 Documentacion y mantenimiento . . . . . . . . . . . . . . .
3.2 Interoperabilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.1 Interoperabilidad a nivel de plataforma . . . . . . . . . . . .
3.2.1.1 Bytecode . . . . . . . . . . . . . . . . . . . . . . .
3.2.1.2 Java Native Interface . . . . . . . . . . . . . . . .
Ejemplo de JNI. . . . . . . . . . . . . . . . . . . . .
3.2.2 Interoperabilidad a nivel de aplicacion . . . . . . . . . . . . .
3.2.2.1 Capa de presentacion . . . . . . . . . . . . . . . .
3.2.2.2 Capa de negocio . . . . . . . . . . . . . . . . . . .
3.2.2.3 Capa de datos . . . . . . . . . . . . . . . . . . . .
3.3 Soporte al trabajo en red (networking) . . . . . . . . . . . . . . . . .
3.3.1 Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3.1.1 OutputStream . . . . . . . . . . . . . . . . . . . .
Ejemplo 3.3: Manejo de ficheros. . . . . . . . . . . .
3.3.1.2 InputStream . . . . . . . . . . . . . . . . . . . . .
Ejemplo 3.4.: Fichero de entrada. . . . . . . . . . . .
Ejemplo 3.5.: Streams. . . . . . . . . . . . . . . . . .
3.3.2 Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3.2.1 Socket . . . . . . . . . . . . . . . . . . . . . . . .
3.3.2.2 ServerSocket . . . . . . . . . . . . . . . . . . . . .
Ejemplo 3.6.: Uso de sockets. . . . . . . . . . . . . .
3.4 Soporte al modelo de objetos distribuidos . . . . . . . . . . . . . . .
3.4.1 CORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4.2 Remote Method Incocation RMI . . . . . . . . . . . . . . .
3.5 Seguridad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5.1 Seguridad en applets y aplicaciones . . . . . . . . . . . . . .
Ejemplo 3.7.: Ejemplo de norma y permisos. . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

. . .
. . .
. . .
. . .
. . .
. . .
. . .
dis. . .
. . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

58
58
58
59
59
60
61
62
63
65
65
66
67
70
70
73
74
74
75
76
76
77
78
78
79
79
79
80
81
81
82
82
85
86
86
86
88
89
89
93
95
95
98

XII

Programacion Distribuida con Java


Ejemplo 3.8. Fichero de polizas. . . . . . . .
3.5.2 Seguridad en comunicacion en red . . . . . . . . . .
Ejemplo 3.9.: Permisos. . . . . . . . . . . .
Ejemplo 3.10.: Permisos para todo el codigo.
3.6 Tratamiento de excepciones y robustez . . . . . . . . . . . .
Ejemplo 3.11.: Gestion de Excepciones. . . .
Test de auto-evaluacion . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

98
99
99
100
101
104
107

4 Introduccion a Remote Method Invocation


4.1 Que es RMI . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Objetivos de RMI . . . . . . . . . . . . . . . . . . . . . . .
4.3 Caractersticas basicas de RMI . . . . . . . . . . . . . . . .
4.3.1 Sockets . . . . . . . . . . . . . . . . . . . . . . . .
4.3.2 Serializacion . . . . . . . . . . . . . . . . . . . . .
4.3.2.1 Usos de la serializacion . . . . . . . . . .
4.3.2.2 Ventajas y problemas de la serializacion .
4.3.2.3 Mecanica de la serializacion . . . . . . . .
4.3.2.4 Identificador universal de serializacion . .
4.3.2.5 Serializando objetos en RMI . . . . . . .
4.3.3 Paso de parametros y valores de retorno . . . . . . .
4.3.4 Activacion de objetos remotos . . . . . . . . . . . .
4.3.5 Recolector de basura distribuido . . . . . . . . . . .
4.3.6 Localizacion . . . . . . . . . . . . . . . . . . . . .
4.3.7 Excepciones . . . . . . . . . . . . . . . . . . . . .
4.3.8 Seguridad . . . . . . . . . . . . . . . . . . . . . . .
Ejemplo 4.1.: Permiso de aceptar conexiones.
4.4 Arquitectura basica RMI . . . . . . . . . . . . . . . . . . .
4.4.1 El servidor . . . . . . . . . . . . . . . . . . . . . .
4.4.2 El cliente . . . . . . . . . . . . . . . . . . . . . . .
4.4.3 Stubs y skeletons . . . . . . . . . . . . . . . . . . .
4.4.3.1 Evolucion de los stubs y skeletons en Java
4.4.3.2 Proceso de invocacion Cliente/Servidor . .
Ejemplo 4.2.: Contenido del archivo stub . .
4.4.4 RMI Registry . . . . . . . . . . . . . . . . . . . . .
Test de auto-evaluacion . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

109
109
110
112
112
113
114
114
116
117
118
119
120
122
123
124
125
126
126
127
129
129
130
130
131
133
134

5 Caso de estudio RMI basico


5.1 Un ejemplo de RMI basico: una calculadora remota . . . . . . . . . . . . . . . . .
5.1.1 Desarrollar el objeto remoto . . . . . . . . . . . . . . . . . . . . . . . . .
5.1.1.1 La interfaz remota: definicion del objeto remoto . . . . . . . . .
5.1.1.2 La implementacion de la interfaz: implementar el objeto remoto
5.1.1.3 La clase servidora . . . . . . . . . . . . . . . . . . . . . . . . .
5.1.2 Creacion del fichero de polizas . . . . . . . . . . . . . . . . . . . . . . . .
5.1.3 Desarrollar el cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Compilar y ejecutar la aplicacion . . . . . . . . . . . . . . . . . . . . . . . . . . .

135
135
136
136
137
137
138
139
141

Contenido
5.2.1 Compilar la interfaz remota, servidor y cliente
5.2.2 Generar stubs y skeletons con rmic . . . . . . .
5.2.3 Arrancar el registro (RMIRegistry) . . . . . . .
5.2.4 Ejecutar el servidor . . . . . . . . . . . . . . .
5.2.5 Ejecutar el cliente . . . . . . . . . . . . . . . .
5.3 Automatizacion de tareas . . . . . . . . . . . . . . . .
5.4 Despliegue y ejecucion en un entorno real . . . . . . .
Test de auto-evaluacion . . . . . . . . . . . . . . . . . . . .

XIII
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

6 Programacion RMI avanzada


6.1 Conceptos avanzados de la tecnologa RMI . . . . . . . . . . . . . . . .
6.1.1 Manejo de excepciones remotas . . . . . . . . . . . . . . . . . .
6.1.2 Acceso RMI a base de datos con JDBC . . . . . . . . . . . . . .
6.2 Ejemplo completo: Sistema de voto electronico . . . . . . . . . . . . . .
6.2.1 El problema de voto electronico . . . . . . . . . . . . . . . . . .
6.2.2 Configuracion y ejecucion . . . . . . . . . . . . . . . . . . . . .
6.2.2.1 Configuracion . . . . . . . . . . . . . . . . . . . . . .
6.2.2.2 Arrancar rmiregistry . . . . . . . . . . . . . . . . . . .
6.2.2.3 Arrancar servicios del servidor . . . . . . . . . . . . .
6.2.2.4 Arrancar el cliente: realizar una votacion . . . . . . . .
6.2.3 Pasos de la implementacion . . . . . . . . . . . . . . . . . . . .
6.2.3.1 Declaracion de la interfaz remota: MesaRemota . . . .
6.2.3.2 Implementacion de la interfaz remota: ProgramaMesa .
6.2.3.3 Implementacion del servidor: MesaServidor . . . . . .
6.2.3.4 Implementacion del cliente: PantallaCabinaClienteMesa
6.2.4 Juego de pruebas . . . . . . . . . . . . . . . . . . . . . . . . . .
6.3 Listado de ficheros de la aplicacion . . . . . . . . . . . . . . . . . . . . .
Test de auto-evaluacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

141
141
142
142
143
145
146
148

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

151
151
151
152
155
155
157
157
158
158
161
163
163
163
165
167
171
174
176

7 Aplicaciones distribuidas con Java: interfaces graficas de usuario con Swing


7.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 Capa de presentacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.3 Soporte Java a las interfaces graficas . . . . . . . . . . . . . . . . . . . . .
7.4 El paquete Swing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.4.1 Swing basico: componentes graficos habituales . . . . . . . . . . .
7.4.1.1 Ventanas . . . . . . . . . . . . . . . . . . . . . . . . . .
Ejemplo 7.1.: Codigo completo para crear una ventana. . . .
7.4.1.2 Paneles y organizadores de contenido (layouts) . . . . . .
Combinacion de diferentes organizadores. . . . . . . . . . .
Ejemplo 7.2.: Dar color al fondo de pantalla. . . . . . . . .
7.4.1.3 Etiquetas . . . . . . . . . . . . . . . . . . . . . . . . . .
Ejemplo 7.3.: Etiquetas JLabel. . . . . . . . . . . . . . . .
7.4.1.4 Campos y a reas de texto . . . . . . . . . . . . . . . . . .
Ejemplo 7.4.: Campo de texto. . . . . . . . . . . . . . . . .
7.4.1.5 Botones . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

179
179
180
181
182
183
184
184
185
187
188
189
189
191
191
193

XIV

Programacion Distribuida con Java

Ejemplo 7.5.: Creacion de un boton. . . . . . . . . . . . . . . . . .


7.4.1.6 Gestion de eventos . . . . . . . . . . . . . . . . . . . . . . . . .
Ejemplo 7.6.: Gestion de eventos del boton con nombre Aceptar.
Ejemplo 7.7. Gestion de eventos del boton de cerrar la ventana. . .
Presentacion de mensajes. . . . . . . . . . . . . . . . . . . . . . .
Ejemplo 7.8.: Codigo para presentar mensajes al usuario. . . . . . .
7.4.2 Swing avanzado: otros componentes graficos . . . . . . . . . . . . . . . .
7.4.2.1 Programacion sistematica en Swing . . . . . . . . . . . . . . . .
Ejemplo 7.9.: Codigo completo de PantallaElectoral. . . . . . . . .
7.4.2.2 Combos, casillas de verificacion y botones de radio . . . . . . .
Ejemplo 7.10.: Codigo completo de PantallaIntroducirElector. . . .
7.4.2.3 Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ejemplo 7.11.: Codigo completo de PantallaMesa. . . . . . . . . .
7.4.2.4 Tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ejemplo 7.12.: Codigo completo de PantallaEmitirVoto. . . . . . .
Test de auto-evaluacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8 Programacion Java con JDBC y el paquete java.sql
8.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2 Capa de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.3 Soporte Java al acceso a base de datos . . . . . . . . . . . . . . . . . . . . . . .
8.3.1 Pasos a seguir en el desarrollo de un programa Java con JDBC . . . . . .
8.3.1.1 Creacion de las base de datos e instalacion de los controladores
Para MS Access. . . . . . . . . . . . . . . . . . . . . . . . . . .
Para PostgreSQL. . . . . . . . . . . . . . . . . . . . . . . . . . .
8.3.1.2 Conexion a la base de datos . . . . . . . . . . . . . . . . . . .
Clase java.sql.Connection. . . . . . . . . . . . . . . . . . . . . .
URL de conexion a la base de datos. . . . . . . . . . . . . . . . .
La clase GestorDiscoConexion. . . . . . . . . . . . . . . . . . .
8.3.2 Realizar una session de trabajo con la base de datos . . . . . . . . . . . .
8.3.2.1 Conectarse y trabajar con una base de datos . . . . . . . . . .
La clase java.sql.Statement. . . . . . . . . . . . . . . . . . . . .
La clase java.sql.PreparedStatement. . . . . . . . . . . . . . . . .
Gestion de excepciones. . . . . . . . . . . . . . . . . . . . . . .
8.3.2.2 Control de transacciones . . . . . . . . . . . . . . . . . . . . .
8.3.2.3 Conversion entre tipos de datos Java y SQL . . . . . . . . . .
8.3.3 Sentencias SQL para efectuar operaciones elementales . . . . . . . . . .
La clase Persona. . . . . . . . . . . . . . . . . . . . . . . . . . .
La clase Elector. . . . . . . . . . . . . . . . . . . . . . . . . . .
8.3.3.1 Sentencias executeUpdate para insertar informacion . . . . . .
La clase PantallaIntroducirElector. . . . . . . . . . . . . . . . . .
La clase GestorDiscoElector para insercion. . . . . . . . . . . . .
Ejecucion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Resultado de la insercion de un elector. . . . . . . . . . . . . . .
8.3.3.2 Sentencia executeQuery para consultar informacion . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

193
195
196
198
198
200
203
203
204
214
214
221
221
224
224
229
231
231
232
235
236
237
237
239
245
248
248
249
252
252
252
253
255
256
258
260
261
265
267
267
272
274
274
276

Contenido

XV

La clase java.sql.ResultSet. . . . . . . . . . . . . . . . .
La clase PantallaConsultarElector. . . . . . . . . . . . .
La clase GestorDiscoElector para consulta. . . . . . . .
Ejecucion. . . . . . . . . . . . . . . . . . . . . . . . . .
Resultado de la consulta de un elector. . . . . . . . . . .
8.3.3.3 Sentencias executeUpdate para modificar informacion
La clase PantallaModificarElector. . . . . . . . . . . . .
La clase GestorDiscoElector para modificacion. . . . . .
Ejecucion. . . . . . . . . . . . . . . . . . . . . . . . . .
Resultados de modificar un elector. . . . . . . . . . . .
8.3.3.4 Sentencias executeUpdate para eliminar . . . . . . .
La clase PantallaBorrarElector. . . . . . . . . . . . . . .
La clase GestorDiscoElector. . . . . . . . . . . . . . . .
Ejecucion. . . . . . . . . . . . . . . . . . . . . . . . . .
Resultado de la eliminacion de un elector. . . . . . . . .
Test de auto-evaluacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9 Poniendo las piezas juntas...la aplicacion distribuida eVotoSeguro
9.1 Presentacion del problema de la votacion electronica . . . . . .
9.2 Especificacion y analisis de la aplicacion eVotoSeguro . . . . . .
9.2.1 Descripcion del sistema . . . . . . . . . . . . . . . . .
9.2.2 Programa Electorado . . . . . . . . . . . . . . . . . . .
Electores. . . . . . . . . . . . . . . . . . . . . .
Partidos. . . . . . . . . . . . . . . . . . . . . .
Candidatos. . . . . . . . . . . . . . . . . . . . .
Circunscripciones. . . . . . . . . . . . . . . . .
Comarcas. . . . . . . . . . . . . . . . . . . . . .
Municipios. . . . . . . . . . . . . . . . . . . . .
Centros. . . . . . . . . . . . . . . . . . . . . . .
Mesas electorales. . . . . . . . . . . . . . . . .
Impresion del acta. . . . . . . . . . . . . . . . .
Envo de los votos a la Central Electoral. . . . .
Creacion de archivos historicos. . . . . . . . . .
Escrutinio. . . . . . . . . . . . . . . . . . . . .
9.2.3 Programa Contrasena . . . . . . . . . . . . . . . . . . .
Identificacion. . . . . . . . . . . . . . . . . . . .
Obtencion de contrasena. . . . . . . . . . . . . .
9.2.4 Programa Votantes . . . . . . . . . . . . . . . . . . . .
Identificacion. . . . . . . . . . . . . . . . . . . .
Votacion. . . . . . . . . . . . . . . . . . . . . .
Introduccion de la contrasena. . . . . . . . . . .
Seleccion del candidato. . . . . . . . . . . . . .
Confirmacion de la seleccion. . . . . . . . . . .
Despido. . . . . . . . . . . . . . . . . . . . . .
9.2.5 Resumen Esquematico . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

276
279
282
283
284
284
285
291
292
293
295
295
298
299
299
299

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

303
303
304
304
305
305
305
306
306
307
307
307
308
308
308
308
308
309
309
309
309
309
309
310
310
310
310
310

XVI

Programacion Distribuida con Java


9.2.6
9.2.7

9.3

9.4

9.5

Recursos necesarios . . . . . . . . . . . . . . . . . . . .
Otros requerimientos . . . . . . . . . . . . . . . . . . . .
Extensibilidad de eVotoSeguro. . . . . . . . . . . .
Codigos de barras. . . . . . . . . . . . . . . . . .
Pantalla tactil. . . . . . . . . . . . . . . . . . . . .
Distribucion del espacio y disposicion de la cabina.
9.2.8 Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . .
Diagramas de casos de uso . . . . . . . . . . . . . . . . . . . . .
9.3.1 Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . .
9.3.1.1 Identificacion de los actores . . . . . . . . . . .
9.3.1.2 Diagrama de casos de uso de los requisitos . . .
9.3.2 Descripcion textual de los casos de uso . . . . . . . . . .
Caso de uso Gestion electores. . . . . . . . . . . .
Caso de uso Gestion de partidos. . . . . . . . . . .
Caso de uso Gestion de candidatos. . . . . . . . .
Caso de uso Gestion circunscripciones. . . . . . .
Caso de uso Gestion comarcas. . . . . . . . . . .
Caso de uso Gestion municipios. . . . . . . . . . .
Caso de uso Gestion de centros. . . . . . . . . . .
Caso de uso Gestion mesa electoral. . . . . . . . .
Caso de uso Tratamiento escrutinio. . . . . . . . .
Caso de uso Calcular participacion. . . . . . . . .
Caso de uso Identificacion y finalizacion. . . . . .
Caso de uso Identificar elector. . . . . . . . . . .
Caso de uso Comprobar contrasena. . . . . . . . .
Caso de uso Emitir voto. . . . . . . . . . . . . . .
Caso de uso Crear acta. . . . . . . . . . . . . . .
Arquitectura / diseno de la aplicacion eVotoSeguro . . . . . . . . .
9.4.1 Diagrama de entidades . . . . . . . . . . . . . . . . . . .
9.4.2 Diagrama de paquetes . . . . . . . . . . . . . . . . . . .
9.4.3 Subsistema Gestion Basica Central Electoral . . . . . . .
9.4.3.1 Descripcion . . . . . . . . . . . . . . . . . . .
9.4.3.2 Diagramas de jerarquas . . . . . . . . . . . .
9.4.4 Subsistema Calculo Votos . . . . . . . . . . . . . . . . .
9.4.4.1 Resultados . . . . . . . . . . . . . . . . . . . .
9.4.4.2 Consultas . . . . . . . . . . . . . . . . . . . .
9.4.4.3 Diagrama de clases . . . . . . . . . . . . . . .
9.4.5 Subsistema Actividades Centro . . . . . . . . . . . . . .
9.4.5.1 Descripcion . . . . . . . . . . . . . . . . . . .
9.4.5.2 Diagrama de clases . . . . . . . . . . . . . . .
9.4.6 Diagrama de estados . . . . . . . . . . . . . . . . . . . .
Persistencia de datos . . . . . . . . . . . . . . . . . . . . . . . .
9.5.1 Descripcion . . . . . . . . . . . . . . . . . . . . . . . . .
9.5.2 Diseno conceptual Diagrama ER . . . . . . . . . . . . .
Descripcion de los atributos . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

311
311
311
312
312
312
312
313
314
314
314
317
317
317
317
318
318
318
319
319
319
320
320
320
321
321
321
322
322
322
324
324
325
325
327
328
328
328
328
330
330
331
331
331
331

Contenido
9.6

Implementacion de la aplicacion eVotoSeguro . . . . . .


9.6.1 Declaracion de las interfaces remotas . . . . . .
9.6.1.1 Interfaz Comision remota . . . . . . .
9.6.1.2 Interfaz de la Mesa remota . . . . . .
9.6.2 Implementacion de las interfaces remotas . . . .
9.6.2.1 Programa Comision . . . . . . . . . .
9.6.2.2 Programa Mesa . . . . . . . . . . . .
9.6.3 Implementacion de los servidores . . . . . . . .
9.6.3.1 Servidor Comision . . . . . . . . . . .
9.6.3.2 Servidor Mesa . . . . . . . . . . . . .
9.6.4 Implementacion de los clientes . . . . . . . . . .
9.6.4.1 Cliente de la comision (mesa electoral)
9.6.4.2 Cliente de la mesa (cabina electoral) .
9.6.5 La base de datos . . . . . . . . . . . . . . . . .
9.6.5.1 Creacion de la base de datos . . . . . .
9.6.5.2 La conexion con la base de datos . . .
9.7 Ejecucion de la aplicacion eVotoSeguro . . . . . . . . .
9.8 Uso de la aplicacion eVotoSeguro . . . . . . . . . . . . .
9.8.1 Programa Electorado de la comision central. . .
9.8.2 Programa Contrasena en las mesas electorales . .
9.8.3 Programa Votantes en las cabinas de votacion . .
Test de auto-evaluacion . . . . . . . . . . . . . . . . . . . . .

XVII
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

333
334
334
334
335
335
343
345
345
346
347
347
349
350
351
353
357
361
361
362
364
369

Bibliografa

371

Acronimos

373

Indice
de terminos

374

You might also like