La documentación de la practica
[pcd.git] / pcd.tex
1 \documentclass{article}
2  
3 \usepackage[utf8]{inputenc}
4 \usepackage[T1]{fontenc}
5 \usepackage[spanish]{babel}
6 \usepackage{times}
7  
8 \usepackage{color}
9 \definecolor{gray97}{gray}{.97}
10 \definecolor{gray75}{gray}{.75}
11 \definecolor{gray45}{gray}{.45}
12  
13 \usepackage{listings}
14 \lstset{ frame=Ltb,
15    framerule=0pt,
16    aboveskip=0.5cm,
17    framextopmargin=3pt,
18    framexbottommargin=3pt,
19    framexleftmargin=0.4cm,
20    framesep=0pt,
21    rulesep=.4pt,
22    backgroundcolor=\color{gray97},
23    rulesepcolor=\color{black},
24    %
25    stringstyle=\ttfamily,
26    showstringspaces = false,
27    basicstyle=\small\ttfamily,
28    commentstyle=\color{gray45},
29    keywordstyle=\bfseries,
30    %
31    numbers=left,
32    numbersep=15pt,
33    numberstyle=\tiny,
34    numberfirstline = false,
35    breaklines=true,
36    }
37  
38 % minimizar fragmentado de listados
39 \lstnewenvironment{listing}[1][]
40    {\lstset{#1}\pagebreak[0]}{\pagebreak[0]}
41  
42 \lstdefinestyle{consola}
43    {basicstyle=\scriptsize\bf\ttfamily,
44   backgroundcolor=\color{gray75},
45    }
46  
47 \lstdefinestyle{java}
48    {language=java, }
49
50 \lstdefinestyle{idl}
51    {language=IDL, }
52
53 \lstdefinestyle{Python}
54    {language=Python, }
55
56 \title{Práctica PCD 07/08 - Subastas}
57 \author{Daniel García Moreno <dani@danigm.net>}
58 \date{\today}
59  
60 \begin{document}
61 \maketitle
62
63 \tableofcontents
64
65 \section{Cómo compilar y ejecutar}
66
67 \subsection{Compilar}
68   Para compilar hay que ejecutar:
69   \texttt{javac src/subastas/*.java -d bin/}
70   desde el directorio PCD. Los .class se guardarán en el directorio
71   bin.
72
73 \subsection{Ejecutar}
74
75   El cliente y servidor se comunican a través de un fichero .ior,
76   así que el servidor tiene que tener permiso de escritura en el directorio
77   desde el cual se ejecute y el cliente tiene que ejecutarse desde
78   el mismo directorio despues de haber ejecutado el servidor.
79
80   \begin{itemize}
81   \item \textbf{Servidor:} 
82   \texttt{java -classpath PCD/bin subastas.Servidor}
83   \item \textbf{Cliente:} 
84   \texttt{java -classpath PCD/bin subastas.Cliente}
85   \end{itemize}
86
87   Para conocer los comandos disponibles en el cliente basta con
88   escribir el comando 'help' que mostrará una lista con todos los
89   posibles comandos.
90
91   Hay que tener en cuenta que para poder hacer alguna operación con
92   alguna de las subastas creadas hay que hacer una busqueda para que
93   se inicialice el vector de subastas, y el id será el indice en
94   esta busqueda.
95
96 \section{Explicación del diseño}
97
98 \subsection{Interfaces IDL}
99     Las tres interfaces que hay que implementar se han implementado
100     dentro del modulo subastas.
101
102     \subsubsection{clienteSubastas}
103     
104     La interfaz clienteSubastas está implementada según la
105     especificación del trabajo y además contiene una operación
106     nuevoValor que sirve para resolver el primer problema especificado
107     en el documento.
108
109     \subsubsection{coordinadorSubasta}
110
111     Para la interfaz gestorSubasta se ha declarado un tipo de dato
112     sequence para la lista de clientes.
113
114     En esta interfaz se definen los atributos y las operaciones
115     especificadas en el documento. Además se define la operación
116     cerrarSubasta que será llamado para cerrar una subasta y así
117     evitar el segundo problema.
118
119     \subsubsection{gestorSubastas}
120
121     Para la interfaz gestorSubasta se ha definido un tipo sequence
122     para la lista de subastas que hay que devolver en la operación
123     localizarSubasta.
124
125     Por lo demás se ha implementado según lo especificado en el
126     documento.
127
128 \subsection{Sirvientes}
129
130     Se han implementado los sirvientes:
131
132     \subsubsection{clienteSubastasImpl}
133     Este sirviente implementa la interfaz clienteSubastas por
134     herencia. Se han implementado las operaciones según la
135     especificación. Cuando se actualiza el valor de una suabasta el
136     cliente será informado por el coordinador subasta e imprimirá el
137     nuevo valor.
138
139     \subsubsection{coordinadorSubastaImpl}
140     Al igual que el sirviente anterior este está implementado por
141     herencia. Se han definido las operaciones según lo especificado en
142     el documento.
143
144     Se han definido los métodos \texttt{abrirSubasta},
145     \texttt{ganador}, \texttt{pujar}, \texttt{ultimaPuja} y
146     \texttt{cerrarSubasta} como synchronized puesto que serán llamados
147     desde diferentes clientes. Para la sincronización entre clientes
148     se utilizan los métodos proporcionados por java y vistos en clase,
149     wait y notifyAll. Cuando se cambia el estado se ejecuta notifyAll.
150
151     Las esperas de los clientes se realizan mediante wait y el
152     atributo estado.
153
154     \subsubsection{gestorSubastasImpl}
155     Como los dos sirvientes anteriores este también se ha implementado
156     por herencia.
157
158     Este sirviente es un objeto fábrica. Crea coordinadores de
159     subastas.
160
161     Para evitar el segundo problema especificado en el documento se ha
162     utilizado la clase SubastaKiller que implementa la interfaz
163     Runnable para ser lanzado en un hilo. Este hilo duerme durante el
164     tiempo especificado y después cierra la subasta especificada
165     llamando al método cerrarSubasta del coordinadorSubasta.
166
167     El resto de operaciones está implementado según la especificación
168     del documento.
169
170 \subsection{SubastaKiller}
171     Para solventar el problema de que una subasta no acabe nunca por
172     culpa de un cliente se ha implementado esta clase que implementa
173     la interfaz Runnable. Este hilo duerme durante un tiempo
174     especificado y después cierra la subasta.
175
176 \subsection{Servidor}
177     El servidor crea un gestorSubastasImpl y crea un fichero
178     \texttt{server.ior} donde escribe el ior correspondiente a este
179     objeto. Y se lanza el servidor.
180
181 \subsection{Cliente unificado}
182     Esta es la parte con más código del trabajo aunque no por ello la
183     más compleja.
184
185     Se han definido los suiguientes comandos:
186
187     \begin{verbatim}
188   /**
189    * COMANDOS DISPONIBLES
190    * 
191    * GESTOR SUBASTAS
192    * ---------------
193    * salir -> sale del bucle
194    * crear valor tiempo desc -> crea una subasta
195    * buscar desc -> busca una subasta y muestra todas las coincidencias
196    * borrar id -> borra una subasta si esta cerrada
197    * 
198    * COORDINADOR SUBASTA
199    * -------------------
200    * abrir id -> abre la subasta por id
201    * estado id -> devuelve el estado de una subasta
202    * valor id -> devuelve el valor actual de una puja
203    * ganador_prov id -> dice el identificador del cliente que va ganando la puja
204    * ganador id -> muestra el ganador, si la puja no esta cerrada aun, bloquea al cliente
205    * clientes id -> muestra todos los identificadores de los clientes de la subasta
206    * inscribir id cliente_id -> inscribe un cliente en una subasta
207    * pujar id cliente_id valor
208    * ultima id cliente_id
209    * 
210    * CLIENTE SUBASTAS
211    * ----------------
212    * crearcliente identificacion
213    * cldisp -> muestra los clientes disponibles
214    */
215     \end{verbatim}
216
217     Cuando se ejecuta un cliente muestra una línea de comandos que
218     permite llamar a cualquiera de estos comandos. No se han capturado
219     los errores por lo que si se llama a alguno con una sintaxis
220     inadecuada el programa dará errores.
221
222     Este cliente unificado permite tanto crear y gestionar subastas
223     como crear clientes y trabajar con más de un cliente desde un
224     mismo cliente unificado.
225
226 \section{Código fuente}
227
228 \subsection{Definción de interfaces en IDL}
229 \begin{lstlisting}[style=java]
230
231 module subastas{
232
233
234   interface clienteSubastas{
235     readonly attribute string identificacion;
236     void finSubasta();
237     void nuevoValor(in float valor);
238   };
239
240   typedef sequence<clienteSubastas> lista_clientes;
241   interface coordinadorSubasta{
242     /** 
243      * coordinadorSubasta: interfaz de objetos que gestionan el
244      * desarrollo de la subasta de cada bien subastado por la empresa.
245
246      * La subasta pasara por tres estados:
247      *  Inscripcion
248      *  Abierta
249      *  Cerrada
250      * 
251      */
252     
253     readonly attribute clienteSubastas ganador_provisional;
254     readonly attribute lista_clientes clientes;
255
256     readonly attribute float valor;
257     readonly attribute string descripcion;
258     // Inscripcion -> Abierta -> Cerrada
259     readonly attribute string estado;
260
261     void inscribirCliente(in clienteSubastas cl);
262     void abrirSubasta();
263     boolean pujar(in float cantidad, in clienteSubastas cl);
264     void ultimaPuja(in clienteSubastas cl);
265     clienteSubastas ganador();
266     void cerrarSubasta();
267   };
268
269   typedef sequence<coordinadorSubasta> lista_subastas;
270   interface gestorSubastas{
271     coordinadorSubasta crearSubasta(in float valor, in string desc, in long tiempo);
272     void destruirSubasta(in coordinadorSubasta cs);
273     lista_subastas localizarSubasta(in string palabra);
274   };
275
276 };
277
278 \end{lstlisting}
279  
280 \subsection{clienteSubastasImpl.java}
281
282 \begin{lstlisting}[style=java]
283
284 package subastas;
285
286 /**
287  * @author danigm
288  *
289  */
290 public class clienteSubastasImpl extends clienteSubastasPOA {
291   private String identificacion;
292   private boolean fin=false;
293   private float valor_subasta=0;
294   public clienteSubastasImpl(String id) {
295   super();
296   identificacion = id;
297   }
298
299   public void finSubasta() {
300   fin = true;
301   }
302
303   public String identificacion() {
304   return identificacion;
305   }
306
307   public void nuevoValor(float valor) {
308   valor_subasta = valor;
309   System.out.println("NUEVO VALOR " + valor);
310   }
311
312 }
313 \end{lstlisting}
314
315
316 \subsection{coordinadorSubastaImpl.java}
317
318 \begin{lstlisting}[style=java]
319
320 package subastas;
321 import java.util.Vector;
322
323 /**
324  * @author danigm
325  *
326  */
327 public class coordinadorSubastaImpl extends coordinadorSubastaPOA {
328   private clienteSubastas ganador_provisional;
329   private Vector<clienteSubastas> clientes;
330   private float valor;
331   private String descripcion;
332   // Inscripcion -> Abierta -> Cerrada
333   private String estado;
334
335   public coordinadorSubastaImpl(float v_inicial, String desc) {
336   super();
337     estado = "Inscripcion";
338     ganador_provisional=null;
339     clientes = new Vector<clienteSubastas>();
340     valor = v_inicial;
341     descripcion = desc;
342   }
343
344   synchronized public void abrirSubasta() {
345     if(estado.equals("Inscripcion")){
346       estado = "Abierta";
347       notifyAll();
348     }
349   }
350
351   public clienteSubastas[] clientes() {
352   clienteSubastas[] cs = new clienteSubastas[clientes.size()];
353   for (int i=0; i<clientes.size(); i++)
354     cs[i] = clientes.get(i);
355   return cs;
356   }
357
358   public String descripcion() {
359   return descripcion;
360   }
361
362   public String estado() {
363   return estado;
364   }
365
366   public synchronized clienteSubastas ganador() {
367     //Si la puja esta cerrada devuelve ganador
368     //sino se bloquea hasta que se cierre
369   try {
370     while(!estado.equals("Cerrada"))
371     wait();
372   } catch (InterruptedException e) {
373     // TODO Auto-generated catch block
374     e.printStackTrace();
375   }
376     return ganador_provisional;
377   }
378
379   public clienteSubastas ganador_provisional() {
380   return ganador_provisional;
381   }
382
383   public void inscribirCliente(clienteSubastas cl) {
384     //estaria bien lanzar una excepcion
385     if(estado.equals("Inscripcion"))
386       clientes.add(cl);
387
388   }
389
390   public synchronized boolean pujar(float cantidad, clienteSubastas cl) {
391   String id = cl.identificacion();
392   try {
393     while(estado.equals("Inscripcion"))
394     wait();
395   } catch (InterruptedException e) {
396     // TODO Auto-generated catch block
397     e.printStackTrace();
398   }
399     if(estado.equals("Cerrada"))
400       return false;
401     else{
402       if (clientes.contains(cl)){
403         if (cantidad > valor){
404           valor = cantidad;
405           ganador_provisional = cl;
406           for (int i=0; i<clientes.size(); i++)
407             clientes.get(i).nuevoValor(valor);
408           return true;
409         }
410         else
411           return false;
412       }
413       else{
414         //quizas mejor una excepcion
415         return false;
416       }
417     }
418
419   }
420
421   synchronized public void ultimaPuja(clienteSubastas cl) {
422     if (clientes.contains(cl)){
423       clientes.remove(cl);
424     }
425     if (clientes.size() == 0) {
426       estado = "Cerrada";
427       notifyAll();
428     }
429   }
430
431   public float valor() {
432   return valor;
433   }
434
435   synchronized public void cerrarSubasta() {
436   estado = "Cerrada";
437   notifyAll();
438   }
439
440 }
441 \end{lstlisting}
442
443
444 \subsection{gestorSubastasImpl.java}
445
446 \begin{lstlisting}[style=java]
447
448 package subastas;
449
450 import java.util.Vector;
451
452 import org.omg.CORBA.*;
453 import org.omg.CORBA.ORBPackage.InvalidName;
454 import org.omg.PortableServer.POA;
455 import org.omg.PortableServer.POAHelper;
456 import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
457 import org.omg.PortableServer.POAPackage.ServantNotActive;
458 import org.omg.PortableServer.POAPackage.WrongPolicy;
459
460
461
462 /**
463  * @author danigm
464  *
465  */
466 public class gestorSubastasImpl extends gestorSubastasPOA {
467
468   private Vector<coordinadorSubasta> subastas;
469   
470   private POA poa;
471   public gestorSubastasImpl(POA arg_poa) {
472     super();
473     subastas = new Vector<coordinadorSubasta>();
474     poa = arg_poa;
475   }
476
477   public coordinadorSubasta crearSubasta(float valor, String desc, int tiempo) {
478   coordinadorSubasta c = null;
479     coordinadorSubastaImpl coord = new coordinadorSubastaImpl(valor, desc);
480     org.omg.CORBA.Object obj;
481   try {
482     obj = poa.servant_to_reference(coord);
483     c = coordinadorSubastaHelper.narrow(obj);
484     subastas.add(c);
485   } catch (ServantNotActive e) {
486     // TODO Auto-generated catch block
487     e.printStackTrace();
488   } catch (WrongPolicy e) {
489     // TODO Auto-generated catch block
490     e.printStackTrace();
491   }
492   SubastaKiller sk = new SubastaKiller(c, tiempo);
493   
494     return c;
495   }
496
497   public void destruirSubasta(coordinadorSubasta cs) {
498     if (cs.estado().equals("Cerrada")){
499       subastas.remove(cs);
500     }
501   }
502
503   public coordinadorSubasta[] localizarSubasta(String palabra) {
504     coordinadorSubasta[] encontradas = new coordinadorSubasta[subastas.size()];
505     int j=0;
506     for(int i=0; i<subastas.size(); i++){
507       if (subastas.get(i).descripcion().contains(palabra)){
508         encontradas[j] = subastas.get(i);
509         j++;
510       }
511     }
512     coordinadorSubasta[] encontradas2 = new coordinadorSubasta[j];
513     for(int i=0; i<j; i++){
514       encontradas2[i] = encontradas[i];
515     }
516     
517   return encontradas2;
518   }
519
520 }
521 \end{lstlisting}
522
523 \subsection{SubastaKiller.java}
524
525 \begin{lstlisting}[style=java]
526
527 package subastas;
528
529 public class SubastaKiller implements Runnable{
530
531         private Thread hilo;
532         private long time;
533         private coordinadorSubasta cs;
534         
535         public SubastaKiller(coordinadorSubasta cs, int time){
536                 hilo = new Thread(this);
537                 this.time = time*1000;
538                 this.cs = cs;
539                 hilo.start();
540         }
541         
542         public void run() {
543                 try {
544                         hilo.sleep(time);
545                 } catch (InterruptedException e) {
546                         e.printStackTrace();
547                 }
548                 cs.cerrarSubasta();
549                 
550         }
551         
552
553 }
554 \end{lstlisting}
555
556 \subsection{Servidor.java}
557
558 \begin{lstlisting}[style=java]
559
560 package subastas;
561
562 import java.io.File;
563 import java.io.FileNotFoundException;
564 import java.io.FileOutputStream;
565 import java.io.PrintWriter;
566
567 import org.omg.CORBA.*;
568 import org.omg.CORBA.ORBPackage.InvalidName;
569 import org.omg.PortableServer.*;
570 import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
571 import org.omg.PortableServer.POAPackage.ServantNotActive;
572 import org.omg.PortableServer.POAPackage.WrongPolicy;
573
574 public class Servidor {
575
576   /**
577    * @param args
578    * @throws InvalidName 
579    * @throws AdapterInactive 
580    * @throws WrongPolicy 
581    * @throws ServantNotActive 
582    * @throws FileNotFoundException 
583    */
584   public static void main(String[] args) throws InvalidName, AdapterInactive, ServantNotActive, WrongPolicy, FileNotFoundException {
585     //inicializacion del orb
586     ORB orb = ORB.init(args, null);
587
588     //creacion del poa raiz
589     POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
590
591     //crear y activar sirvientes
592     poa.the_POAManager().activate();
593     gestorSubastasImpl sirviente = new gestorSubastasImpl(poa);
594     org.omg.CORBA.Object obj = poa.servant_to_reference(sirviente);
595
596     String ior = orb.object_to_string(obj);
597     PrintWriter ps = new PrintWriter(new FileOutputStream(new File("server.ior")));
598     ps.println(ior);
599     ps.close();
600
601     orb.run();
602   }
603
604 }
605 \end{lstlisting}
606
607 \subsection{Cliente.java}
608
609 \begin{lstlisting}[style=java]
610
611 package subastas;
612
613 import java.io.BufferedReader;
614 import java.io.FileNotFoundException;
615 import java.io.FileReader;
616 import java.io.IOException;
617 import java.io.InputStreamReader;
618 import java.io.LineNumberReader;
619
620 import org.omg.CORBA.*;
621 import org.omg.PortableServer.POA;
622 import org.omg.PortableServer.POAHelper;
623 import org.omg.PortableServer.POAPackage.ServantNotActive;
624 import org.omg.PortableServer.POAPackage.WrongPolicy;
625
626 public class Cliente {
627
628   /**
629    * @param args
630    * @throws IOException 
631    */
632   private static clienteSubastas buscar(String id, clienteSubastas[] cs){
633   clienteSubastas cl = null;
634   for (int i=0; i<cs.length; i++){
635     if (cs[i].identificacion().contains(id)){
636     cl = cs[i];
637     break;
638     }
639   }
640   return cl;
641   }
642   
643   private static clienteSubastas crearCliente(String ident, POA poa){
644   org.omg.CORBA.Object obj = null;
645   clienteSubastasImpl cl1x = new clienteSubastasImpl(ident);
646   try {
647     obj = poa.servant_to_reference(cl1x);
648   } catch (Exception e1) {e1.printStackTrace();}
649   
650   clienteSubastas cl1 = clienteSubastasHelper.narrow(obj);
651   return cl1;
652   }
653   
654   public static void main(String[] args) throws IOException {
655   ORB orb = ORB.init(args, null);
656   
657   LineNumberReader input = new LineNumberReader(new FileReader("server.ior"));
658   String ior = input.readLine();
659   
660   org.omg.CORBA.Object obj = orb.string_to_object(ior);
661   
662   gestorSubastas gs = gestorSubastasHelper.narrow(obj);
663   
664   POA poa=null;
665   try{
666   //creacion del poa raiz
667     poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
668     //crear y activar sirvientes
669     poa.the_POAManager().activate();
670   }
671   catch (Exception e){e.printStackTrace();}
672     
673   /**
674    * COMANDOS DISPONIBLES
675    * 
676    * GESTOR SUBASTAS
677    * ---------------
678    * salir -> sale del bucle
679    * crear valor tiempo desc -> crea una subasta
680    * buscar desc -> busca una subasta y muestra todas las coincidencias
681    * borrar id -> borra una subasta si esta cerrada
682    * 
683    * COORDINADOR SUBASTA
684    * -------------------
685    * abrir id -> abre la subasta por id
686    * estado id -> devuelve el estado de una subasta
687    * valor id -> devuelve el valor actual de una puja
688    * ganador_prov id -> dice el identificador del cliente que va ganando la puja
689    * ganador id -> muestra el ganador, si la puja no esta cerrada aun, bloquea al cliente
690    * clientes id -> muestra todos los identificadores de los clientes de la subasta
691    * inscribir id cliente_id -> inscribe un cliente en una subasta
692    * pujar id cliente_id valor
693    * ultima id cliente_id
694    * 
695    * CLIENTE SUBASTAS
696    * ----------------
697    * crearcliente identificacion
698    * cldisp -> muestra los clientes disponibles
699    */
700   
701   coordinadorSubasta[] subastas = null;
702   clienteSubastas[] clientes = new clienteSubastas[100];
703   int n_clientes = 0;
704   
705   boolean salir = false;
706   String comando = "";
707   System.out.println("== INICIO ==");
708   while(!salir){
709     System.out.print(">>");
710     try{
711     BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
712     comando = br.readLine();
713     }catch(Exception e){ e.printStackTrace();}
714     String[] partesDelComando = comando.split(" ");
715     if(comando.equals("salir")){
716     salir = true;
717     System.out.println("Adios ;)");
718     break;
719     }
720     else if(comando.equals("help")){
721     System.out.println(
722    "* COMANDOS DISPONIBLES\r\n" +
723    "*\r\n " +
724    "* GESTOR SUBASTAS\r\n"+
725    "* --------------\r\n"+
726    "* salir -> sale del bucle\r\n"+
727    "* crear valor tiempo desc -> crea una subasta\r\n"+
728    "* buscar desc -> busca una subasta y muestra todas las coincidencias\r\n"+
729    "* borrar id -> borra una subasta si esta cerrada\r\n"+
730    "* \r\n"+
731    "* COORDINADOR SUBASTA\r\n"+
732    "* -------------------\r\n"+
733    "* abrir id -> abre la subasta por id\r\n"+
734    "* estado id -> devuelve el estado de una subasta\r\n"+
735    "* valor id -> devuelve el valor actual de una puja\r\n"+
736    "* ganador_prov id -> dice el identificador del cliente que va ganando la puja\r\n"+
737    "* ganador id -> muestra el ganador, si la puja no esta cerrada aun, bloquea al cliente\r\n"+
738    "* clientes id -> muestra todos los identificadores de los clientes de la subasta\r\n"+
739    "* inscribir id cliente_id -> inscribe un cliente en una subasta\r\n"+
740    "* pujar id cliente_id valor\r\n"+
741    "* ultima id cliente_id\r\n"+
742    "* \r\n"+
743    "* CLIENTE SUBASTAS\r\n"+
744    "* ----------------\r\n"+
745    "* crearcliente identificacion\r\n"+
746    "* cldisp -> muestra los clientes disponibles\r\n");
747     }
748     
749     // Opciones de gestorSubastas
750     else if(partesDelComando[0].equals("crear")){
751     String desc = "";
752     float valor = 0;
753     int time = 0;
754     valor = Float.valueOf(partesDelComando[1]);
755     time = Integer.valueOf(partesDelComando[2]);
756     for(int i=3; i<partesDelComando.length; i++){
757       desc += " "+partesDelComando[i];
758     }
759     coordinadorSubasta cs = gs.crearSubasta(valor, desc, time);
760     System.out.println("Subasta creada");
761     }
762     else if(partesDelComando[0].equals("buscar")){
763     String desc = "";
764     for(int i=1; i<partesDelComando.length; i++){
765       desc += " "+partesDelComando[i];
766     }
767
768     subastas = gs.localizarSubasta(desc);
769     for (int i=0; i<subastas.length; i++)
770       System.out.println(i+": "+subastas[i].descripcion()+" ("+subastas[i].valor()+") > " + subastas[i].estado());
771     }
772     else if(partesDelComando[0].equals("borrar")){
773     int id = 0;
774     id = Integer.valueOf(partesDelComando[1]);
775     gs.destruirSubasta(subastas[id]);
776     System.out.println("Subasta borrada");
777     }
778     
779     // Opciones de coordinadorSubasta
780     else if(partesDelComando[0].equals("abrir")){
781     int id = 0;
782     id = Integer.valueOf(partesDelComando[1]);
783     subastas[id].abrirSubasta();
784     System.out.println(subastas[id].estado());
785     }
786     else if(partesDelComando[0].equals("estado")){
787     int id = 0;
788     id = Integer.valueOf(partesDelComando[1]);
789     System.out.println(subastas[id].estado());
790     }
791     else if(partesDelComando[0].equals("valor")){
792     int id = 0;
793     id = Integer.valueOf(partesDelComando[1]);
794     System.out.println(subastas[id].valor());
795     }
796     else if(partesDelComando[0].equals("ganador_prov")){
797     int id = 0;
798     id = Integer.valueOf(partesDelComando[1]);
799     System.out.println(subastas[id].ganador_provisional().identificacion());
800     }
801     else if(partesDelComando[0].equals("ganador")){
802     int id = 0;
803     id = Integer.valueOf(partesDelComando[1]);
804     System.out.println(subastas[id].ganador().identificacion());
805     }
806     else if(partesDelComando[0].equals("clientes")){
807     int id = 0;
808     id = Integer.valueOf(partesDelComando[1]);
809     clienteSubastas[] clientes2 = subastas[id].clientes();
810     for (int i=0; i< clientes2.length; i++){
811       System.out.println(i+": "+clientes2[i].identificacion());
812     }
813     }
814     else if(partesDelComando[0].equals("inscribir")){
815     int id = 0;
816     String cliente_id="";
817     clienteSubastas cl=null;
818     id = Integer.valueOf(partesDelComando[1]);
819     cliente_id = partesDelComando[2];
820     cl = buscar(cliente_id, clientes);
821     subastas[id].inscribirCliente(cl);
822     System.out.println("Cliente inscrito");
823     }
824     
825     else if(partesDelComando[0].equals("pujar")){
826     int id = 0;
827     float valor = 0;
828     String cliente_id="";
829     clienteSubastas cl=null;
830     id = Integer.valueOf(partesDelComando[1]);
831     cliente_id = partesDelComando[2];
832     valor = Float.valueOf(partesDelComando[3]);
833     cl = buscar(cliente_id, clientes);
834     if(subastas[id].pujar(valor, cl))
835       System.out.println("Vas ganando");
836     else
837       System.out.println("No es suficiente");
838     }
839     else if(partesDelComando[0].equals("ultima")){
840     int id = 0;
841     String cliente_id="";
842     clienteSubastas cl=null;
843     id = Integer.valueOf(partesDelComando[1]);
844     cliente_id = partesDelComando[2];
845     cl = buscar(cliente_id, clientes);
846     subastas[id].ultimaPuja(cl);
847     System.out.println("Has dejado de pujar");
848     System.out.println(subastas[id].estado());
849     }
850     
851     // creacion de clientes
852     else if(partesDelComando[0].equals("crearcliente")){
853     String id="";
854     clienteSubastas cl=null;
855     id = partesDelComando[1];
856     cl = crearCliente(id, poa);
857     clientes[n_clientes++] = cl;
858     }
859     else if(partesDelComando[0].equals("cldisp")){
860     for(int i=0; i<n_clientes; i++){
861       System.out.println(i+": "+clientes[i].identificacion());
862     }
863     }
864
865   }
866
867   System.out.println("FIN");
868   }
869
870 }
871 \end{lstlisting}
872
873 \section{Anexos (Cliente python)}
874
875     Dado el interés que esta asignatura ha despertado en mí, me he
876     decidido a implementar un cliente en otro lenguaje diferente a
877     java para probar la interoperabilidad entre diferentes lenguajes
878     del middleware CORBA.
879
880     Después de implementar los sirvientes en java, la implementación
881     de un cliente en python que se conecte al servidor en java no ha
882     sido nada complicado.
883
884     Este cliente en python no es un cliente unificado sino que sólo
885     permite manejar un cliente que se puede inscribir a subastas y
886     pujar, no se pueden manejar las subastas desde este.
887
888 \subsection{Código del cliente python}
889
890 \subsubsection{cliente.py}
891 \begin{lstlisting}[style=Python]
892
893 #!/usr/bin/python
894
895 import sys
896 import CORBA, subastas
897 import PortableServer
898 from clienteSubastas_i import *
899
900 orb = CORBA.ORB_init()
901 ior = open('../server.ior').readline()
902
903 gestor_subasta = orb.string_to_object(ior)
904
905 poa = orb.resolve_initial_references("RootPOA")
906 poa._get_the_POAManager().activate()
907
908
909 def crear_cliente(id, poa):
910     cl = clienteSubastas_i(id)
911     cl1 = poa.servant_to_reference(cl)
912     return cl1
913
914 subastas = gestor_subasta.localizarSubasta('')
915 try:
916     nombre = sys.argv[1]
917 except:
918     nombre = raw_input("nombre del cliente: ")
919 cl = crear_cliente(nombre, poa)
920
921 while True:
922     comando = raw_input(">>")
923     if comando.split()[0] == 'salir':
924         break
925     elif comando.split()[0] == 'inscribir':
926         subasta = subastas[int(comando.split()[1])]
927         subasta.inscribirCliente(cl)
928     elif comando.split()[0] == 'pujar':
929         subasta = subastas[int(comando.split()[1])]
930         valor = float(comando.split()[2])
931         if subasta.pujar(valor, cl):
932             print "Vas ganando"
933         else: 
934             print "No es suficiente"
935     elif comando.split()[0] == 'ultima':
936         subasta = subastas[int(comando.split()[1])]
937         subasta.ultimaPuja(cl)
938         print "Has dejado de pujar"
939
940     elif comando.split()[0] == 'buscar':
941         try:
942             desc = comando.split()[1]
943         except:
944             desc = ''
945         subastas = gestor_subasta.localizarSubasta(desc)
946         for i,s in enumerate(subastas):
947             print i, s._get_descripcion(), s._get_estado()
948
949     elif comando.split()[0] == 'ganador':
950         subasta = subastas[int(comando.split()[1])]
951         print subasta.ganador()._get_identificacion()
952
953     elif comando.split()[0] == 'ganador_prov':
954         subasta = subastas[int(comando.split()[1])]
955         print subasta._get_ganador_provisional()._get_identificacion()
956
957     elif comando.split()[0] == 'estado':
958         subasta = subastas[int(comando.split()[1])]
959         print subasta._get_estado()
960
961     elif comando.split()[0] == 'valor':
962         subasta = subastas[int(comando.split()[1])]
963         print subasta._get_valor()
964
965     elif comando.split()[0] == 'clientes':
966         subasta = subastas[int(comando.split()[1])]
967         clientes = subasta._get_clientes()
968         for i, c in enumerate(clientes):
969             print i, c._get_identificacion()
970
971     elif comando.split()[0] == 'help':
972         help_str = '''
973         COMANDOS DISPONIBLES
974         --------------------
975         buscar desc -> muestra la lista de subastas
976         ganador id -> muestra el ganador de una subasta
977         inscribir id -> te inscribe en una puja
978         pujar id cantidad -> puja cantidad en la puja con id
979         ultima id -> dejas de pujar en la puja id
980         ganador_prov id -> muestra el ganador provisional
981         estado id -> muestra el estado de una puja
982         valor id -> muestra el valor actual de una puja
983         clientes id -> muestra los clientes que hay en una puja
984         salir -> sale del cliente
985         help -> muestra esta ayuda
986
987         '''
988         print help_str
989
990 \end{lstlisting}
991
992 \subsubsection{cliente.py}
993 \begin{lstlisting}[style=Python]
994  
995 import subastas__POA
996
997 class clienteSubastas_i(subastas__POA.clienteSubastas):
998     def __init__(self, id):
999         self.identificacion = id
1000     
1001     def finSubasta(self):
1002         pass
1003
1004     def nuevoValor(self, valor):
1005         print "NUEVO VALOR: ", valor
1006
1007     def _get_identificacion(self):
1008         return self.identificacion
1009
1010 \end{lstlisting}
1011
1012 \end{document}