1 \documentclass{article}
3 \usepackage[utf8]{inputenc}
4 \usepackage[T1]{fontenc}
5 \usepackage[spanish]{babel}
9 \definecolor{gray97}{gray}{.97}
10 \definecolor{gray75}{gray}{.75}
11 \definecolor{gray45}{gray}{.45}
18 framexbottommargin=3pt,
19 framexleftmargin=0.4cm,
22 backgroundcolor=\color{gray97},
23 rulesepcolor=\color{black},
25 stringstyle=\ttfamily,
26 showstringspaces = false,
27 basicstyle=\small\ttfamily,
28 commentstyle=\color{gray45},
29 keywordstyle=\bfseries,
34 numberfirstline = false,
38 % minimizar fragmentado de listados
39 \lstnewenvironment{listing}[1][]
40 {\lstset{#1}\pagebreak[0]}{\pagebreak[0]}
42 \lstdefinestyle{consola}
43 {basicstyle=\scriptsize\bf\ttfamily,
44 backgroundcolor=\color{gray75},
53 \lstdefinestyle{Python}
56 \title{Práctica PCD 07/08 - Subastas}
57 \author{Daniel García Moreno <dani@danigm.net>}
65 \section{Cómo compilar y ejecutar}
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
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.
81 \item \textbf{Servidor:}
82 \texttt{java -classpath PCD/bin subastas.Servidor}
83 \item \textbf{Cliente:}
84 \texttt{java -classpath PCD/bin subastas.Cliente}
87 Para conocer los comandos disponibles en el cliente basta con
88 escribir el comando 'help' que mostrará una lista con todos los
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
96 \section{Explicación del diseño}
98 \subsection{Interfaces IDL}
99 Las tres interfaces que hay que implementar se han implementado
100 dentro del modulo subastas.
102 \subsubsection{clienteSubastas}
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
109 \subsubsection{coordinadorSubasta}
111 Para la interfaz gestorSubasta se ha declarado un tipo de dato
112 sequence para la lista de clientes.
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.
119 \subsubsection{gestorSubastas}
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
125 Por lo demás se ha implementado según lo especificado en el
128 \subsection{Sirvientes}
130 Se han implementado los sirvientes:
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
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
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.
151 Las esperas de los clientes se realizan mediante wait y el
154 \subsubsection{gestorSubastasImpl}
155 Como los dos sirvientes anteriores este también se ha implementado
158 Este sirviente es un objeto fábrica. Crea coordinadores de
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.
167 El resto de operaciones está implementado según la especificación
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.
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.
181 \subsection{Cliente unificado}
182 Esta es la parte con más código del trabajo aunque no por ello la
185 Se han definido los suiguientes comandos:
189 * COMANDOS DISPONIBLES
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
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
212 * crearcliente identificacion
213 * cldisp -> muestra los clientes disponibles
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.
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.
226 \section{Código fuente}
228 \subsection{Definción de interfaces en IDL}
229 \begin{lstlisting}[style=java]
234 interface clienteSubastas{
235 readonly attribute string identificacion;
237 void nuevoValor(in float valor);
240 typedef sequence<clienteSubastas> lista_clientes;
241 interface coordinadorSubasta{
243 * coordinadorSubasta: interfaz de objetos que gestionan el
244 * desarrollo de la subasta de cada bien subastado por la empresa.
246 * La subasta pasara por tres estados:
253 readonly attribute clienteSubastas ganador_provisional;
254 readonly attribute lista_clientes clientes;
256 readonly attribute float valor;
257 readonly attribute string descripcion;
258 // Inscripcion -> Abierta -> Cerrada
259 readonly attribute string estado;
261 void inscribirCliente(in clienteSubastas cl);
263 boolean pujar(in float cantidad, in clienteSubastas cl);
264 void ultimaPuja(in clienteSubastas cl);
265 clienteSubastas ganador();
266 void cerrarSubasta();
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);
280 \subsection{clienteSubastasImpl.java}
282 \begin{lstlisting}[style=java]
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) {
299 public void finSubasta() {
303 public String identificacion() {
304 return identificacion;
307 public void nuevoValor(float valor) {
308 valor_subasta = valor;
309 System.out.println("NUEVO VALOR " + valor);
316 \subsection{coordinadorSubastaImpl.java}
318 \begin{lstlisting}[style=java]
321 import java.util.Vector;
327 public class coordinadorSubastaImpl extends coordinadorSubastaPOA {
328 private clienteSubastas ganador_provisional;
329 private Vector<clienteSubastas> clientes;
331 private String descripcion;
332 // Inscripcion -> Abierta -> Cerrada
333 private String estado;
335 public coordinadorSubastaImpl(float v_inicial, String desc) {
337 estado = "Inscripcion";
338 ganador_provisional=null;
339 clientes = new Vector<clienteSubastas>();
344 synchronized public void abrirSubasta() {
345 if(estado.equals("Inscripcion")){
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);
358 public String descripcion() {
362 public String estado() {
366 public synchronized clienteSubastas ganador() {
367 //Si la puja esta cerrada devuelve ganador
368 //sino se bloquea hasta que se cierre
370 while(!estado.equals("Cerrada"))
372 } catch (InterruptedException e) {
373 // TODO Auto-generated catch block
376 return ganador_provisional;
379 public clienteSubastas ganador_provisional() {
380 return ganador_provisional;
383 public void inscribirCliente(clienteSubastas cl) {
384 //estaria bien lanzar una excepcion
385 if(estado.equals("Inscripcion"))
390 public synchronized boolean pujar(float cantidad, clienteSubastas cl) {
391 String id = cl.identificacion();
393 while(estado.equals("Inscripcion"))
395 } catch (InterruptedException e) {
396 // TODO Auto-generated catch block
399 if(estado.equals("Cerrada"))
402 if (clientes.contains(cl)){
403 if (cantidad > valor){
405 ganador_provisional = cl;
406 for (int i=0; i<clientes.size(); i++)
407 clientes.get(i).nuevoValor(valor);
414 //quizas mejor una excepcion
421 synchronized public void ultimaPuja(clienteSubastas cl) {
422 if (clientes.contains(cl)){
425 if (clientes.size() == 0) {
431 public float valor() {
435 synchronized public void cerrarSubasta() {
444 \subsection{gestorSubastasImpl.java}
446 \begin{lstlisting}[style=java]
450 import java.util.Vector;
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;
466 public class gestorSubastasImpl extends gestorSubastasPOA {
468 private Vector<coordinadorSubasta> subastas;
471 public gestorSubastasImpl(POA arg_poa) {
473 subastas = new Vector<coordinadorSubasta>();
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;
482 obj = poa.servant_to_reference(coord);
483 c = coordinadorSubastaHelper.narrow(obj);
485 } catch (ServantNotActive e) {
486 // TODO Auto-generated catch block
488 } catch (WrongPolicy e) {
489 // TODO Auto-generated catch block
492 SubastaKiller sk = new SubastaKiller(c, tiempo);
497 public void destruirSubasta(coordinadorSubasta cs) {
498 if (cs.estado().equals("Cerrada")){
503 public coordinadorSubasta[] localizarSubasta(String palabra) {
504 coordinadorSubasta[] encontradas = new coordinadorSubasta[subastas.size()];
506 for(int i=0; i<subastas.size(); i++){
507 if (subastas.get(i).descripcion().contains(palabra)){
508 encontradas[j] = subastas.get(i);
512 coordinadorSubasta[] encontradas2 = new coordinadorSubasta[j];
513 for(int i=0; i<j; i++){
514 encontradas2[i] = encontradas[i];
523 \subsection{SubastaKiller.java}
525 \begin{lstlisting}[style=java]
529 public class SubastaKiller implements Runnable{
533 private coordinadorSubasta cs;
535 public SubastaKiller(coordinadorSubasta cs, int time){
536 hilo = new Thread(this);
537 this.time = time*1000;
545 } catch (InterruptedException e) {
556 \subsection{Servidor.java}
558 \begin{lstlisting}[style=java]
563 import java.io.FileNotFoundException;
564 import java.io.FileOutputStream;
565 import java.io.PrintWriter;
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;
574 public class Servidor {
578 * @throws InvalidName
579 * @throws AdapterInactive
580 * @throws WrongPolicy
581 * @throws ServantNotActive
582 * @throws FileNotFoundException
584 public static void main(String[] args) throws InvalidName, AdapterInactive, ServantNotActive, WrongPolicy, FileNotFoundException {
585 //inicializacion del orb
586 ORB orb = ORB.init(args, null);
588 //creacion del poa raiz
589 POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
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);
596 String ior = orb.object_to_string(obj);
597 PrintWriter ps = new PrintWriter(new FileOutputStream(new File("server.ior")));
607 \subsection{Cliente.java}
609 \begin{lstlisting}[style=java]
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;
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;
626 public class Cliente {
630 * @throws IOException
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)){
643 private static clienteSubastas crearCliente(String ident, POA poa){
644 org.omg.CORBA.Object obj = null;
645 clienteSubastasImpl cl1x = new clienteSubastasImpl(ident);
647 obj = poa.servant_to_reference(cl1x);
648 } catch (Exception e1) {e1.printStackTrace();}
650 clienteSubastas cl1 = clienteSubastasHelper.narrow(obj);
654 public static void main(String[] args) throws IOException {
655 ORB orb = ORB.init(args, null);
657 LineNumberReader input = new LineNumberReader(new FileReader("server.ior"));
658 String ior = input.readLine();
660 org.omg.CORBA.Object obj = orb.string_to_object(ior);
662 gestorSubastas gs = gestorSubastasHelper.narrow(obj);
666 //creacion del poa raiz
667 poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
668 //crear y activar sirvientes
669 poa.the_POAManager().activate();
671 catch (Exception e){e.printStackTrace();}
674 * COMANDOS DISPONIBLES
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
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
697 * crearcliente identificacion
698 * cldisp -> muestra los clientes disponibles
701 coordinadorSubasta[] subastas = null;
702 clienteSubastas[] clientes = new clienteSubastas[100];
705 boolean salir = false;
707 System.out.println("== INICIO ==");
709 System.out.print(">>");
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")){
717 System.out.println("Adios ;)");
720 else if(comando.equals("help")){
722 "* COMANDOS DISPONIBLES\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"+
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"+
743 "* CLIENTE SUBASTAS\r\n"+
744 "* ----------------\r\n"+
745 "* crearcliente identificacion\r\n"+
746 "* cldisp -> muestra los clientes disponibles\r\n");
749 // Opciones de gestorSubastas
750 else if(partesDelComando[0].equals("crear")){
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];
759 coordinadorSubasta cs = gs.crearSubasta(valor, desc, time);
760 System.out.println("Subasta creada");
762 else if(partesDelComando[0].equals("buscar")){
764 for(int i=1; i<partesDelComando.length; i++){
765 desc += " "+partesDelComando[i];
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());
772 else if(partesDelComando[0].equals("borrar")){
774 id = Integer.valueOf(partesDelComando[1]);
775 gs.destruirSubasta(subastas[id]);
776 System.out.println("Subasta borrada");
779 // Opciones de coordinadorSubasta
780 else if(partesDelComando[0].equals("abrir")){
782 id = Integer.valueOf(partesDelComando[1]);
783 subastas[id].abrirSubasta();
784 System.out.println(subastas[id].estado());
786 else if(partesDelComando[0].equals("estado")){
788 id = Integer.valueOf(partesDelComando[1]);
789 System.out.println(subastas[id].estado());
791 else if(partesDelComando[0].equals("valor")){
793 id = Integer.valueOf(partesDelComando[1]);
794 System.out.println(subastas[id].valor());
796 else if(partesDelComando[0].equals("ganador_prov")){
798 id = Integer.valueOf(partesDelComando[1]);
799 System.out.println(subastas[id].ganador_provisional().identificacion());
801 else if(partesDelComando[0].equals("ganador")){
803 id = Integer.valueOf(partesDelComando[1]);
804 System.out.println(subastas[id].ganador().identificacion());
806 else if(partesDelComando[0].equals("clientes")){
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());
814 else if(partesDelComando[0].equals("inscribir")){
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");
825 else if(partesDelComando[0].equals("pujar")){
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");
837 System.out.println("No es suficiente");
839 else if(partesDelComando[0].equals("ultima")){
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());
851 // creacion de clientes
852 else if(partesDelComando[0].equals("crearcliente")){
854 clienteSubastas cl=null;
855 id = partesDelComando[1];
856 cl = crearCliente(id, poa);
857 clientes[n_clientes++] = cl;
859 else if(partesDelComando[0].equals("cldisp")){
860 for(int i=0; i<n_clientes; i++){
861 System.out.println(i+": "+clientes[i].identificacion());
867 System.out.println("FIN");
873 \section{Anexos (Cliente python)}
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.
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.
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.
888 \subsection{Código del cliente python}
890 \subsubsection{cliente.py}
891 \begin{lstlisting}[style=Python]
896 import CORBA, subastas
897 import PortableServer
898 from clienteSubastas_i import *
900 orb = CORBA.ORB_init()
901 ior = open('../server.ior').readline()
903 gestor_subasta = orb.string_to_object(ior)
905 poa = orb.resolve_initial_references("RootPOA")
906 poa._get_the_POAManager().activate()
909 def crear_cliente(id, poa):
910 cl = clienteSubastas_i(id)
911 cl1 = poa.servant_to_reference(cl)
914 subastas = gestor_subasta.localizarSubasta('')
918 nombre = raw_input("nombre del cliente: ")
919 cl = crear_cliente(nombre, poa)
922 comando = raw_input(">>")
923 if comando.split()[0] == 'salir':
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):
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"
940 elif comando.split()[0] == 'buscar':
942 desc = comando.split()[1]
945 subastas = gestor_subasta.localizarSubasta(desc)
946 for i,s in enumerate(subastas):
947 print i, s._get_descripcion(), s._get_estado()
949 elif comando.split()[0] == 'ganador':
950 subasta = subastas[int(comando.split()[1])]
951 print subasta.ganador()._get_identificacion()
953 elif comando.split()[0] == 'ganador_prov':
954 subasta = subastas[int(comando.split()[1])]
955 print subasta._get_ganador_provisional()._get_identificacion()
957 elif comando.split()[0] == 'estado':
958 subasta = subastas[int(comando.split()[1])]
959 print subasta._get_estado()
961 elif comando.split()[0] == 'valor':
962 subasta = subastas[int(comando.split()[1])]
963 print subasta._get_valor()
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()
971 elif comando.split()[0] == 'help':
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
992 \subsubsection{cliente.py}
993 \begin{lstlisting}[style=Python]
997 class clienteSubastas_i(subastas__POA.clienteSubastas):
998 def __init__(self, id):
999 self.identificacion = id
1001 def finSubasta(self):
1004 def nuevoValor(self, valor):
1005 print "NUEVO VALOR: ", valor
1007 def _get_identificacion(self):
1008 return self.identificacion