Sei sulla pagina 1di 59

CD

GR IN AT CL IS U

ID O

8 ENTREGA DEL COLECCIONABLE

Precio: 6 (Espaa) (IVA incluido)

AO XI. 2. POCA

N 124

UNA PUBLICACIN DE:

REVISTAS PROFESIONALES S.L.

Y ADEMS
ACTUALIDAD Enrique Martn, de BEA Systems, nos cuenta los secretos del proyecto Da Vinci Certifcate como arquitecto J2EE de Sun DISPOSITIVOS MVILES J2ME avanzado: enva un SMS y accede a la cmara de tu mvil MIDDLEWARE Programacin distribuida en .NET con .NET Remoting Acceso a orgenes de datos desde interfaces XAML DISEO Together Architect, el enlace entre el problema y la solucin Implementacin de patrones de diseo con C++ y ACE CANAL PANDA Pharming, nueva tcnica de fraude
00124

Noticias, javaHispano y Opinin, Libros, Preguntas y Respuestas

413042 303299

EDITORIAL
Otra sopa de letras
Nmero 124 - Mayo 2005 Edita: REVISTAS PROFESIONALES S.L. solop@revistasprofesionales.com C/ Valentin Beato 42, 3. 28037 - Madrid. http://www.revistasprofesionales.com http://digital.revistasprofesionales.com Editor Agustn Buelta Coordinacin Tcnica-Redaccin Carlos Laparra Maquetacin Ral Clavijo Asesora de Publicidad Felipe Ribagorda Tel.: 91 304 87 64 Barcelona C/ Rocafort, 241/243, 5 1 Mariano Snchez Tel.: 93 322 12 38 Suscripciones Tel: 91 304 87 64 Fax: 91 327 13 03 Impresin Ideas de Impresin Distribucin Motorpress Ibrica

Nuevamente, la actualidad nos llega en forma de siglas. En efecto, la conversacin mantenida con Enrique Martn (Director de Tecnologa de BEA Systems) ha servido, entre otras cosas, para entender que una nueva guerra de estndares emergentes se avecina. Como el lector podr comprobar en la entrevista publicada en este nmero de Slo Programadores, los nuevos estndares sobre los que corrern los prximos servicios y aplicaciones de red sern: SIP, Parlay y JAIN. La aceptacin de JAIN por parte de la industria est an por comprobar, sin embargo tanto SIP como Parlay parece que ya se han hecho un hueco entre los puestos ms importantes. De hecho, hablamos aqu de estndares nuevos y emergentes pero esto no es cierto al 100%. SIP, por ejemplo, es un protocolo cuyo objetivo es permitir el tratamiento de los servicios de voz como una aplicacin ms de la red, y el primer borrador de este protocolo surgi en febrero de 1996 (SIPv1), sin embargo en el mes de diciembre de ese mismo ao se public la segunda versin (SIPv2). En febrero de 1999 SIP se convirti ya en un estndar, publicado como RFC 2543, aunque en junio de 2002 se publicaba una nueva versin, RFC 3216, que reemplazaba a la anterior. Sin embargo, pese a que estos protocolos tengan ya algunos aos de vida, parece que es ahora cuando las empresas proveedoras de infraestructuras software como BEA Systems estn empezando a darles soporte, para conseguir de una vez por todas la tan ansiada integracin de voz en las redes de datos.

SUMARIO ACTUALIDAD
12 BEA entra en la red con Da Vinci 16 Sun Certified Enterprise Architect for J2EE

Distribucin Mexico DIMSA - Angel Bosch angelbosch@infosel.net.mx Distribucin, nmeros atrasados y suscripciones Renacimiento, 180. Col. San Juan Tlihuaca Azcapotzalco. 02400 Mxico D.F. Distribucin Argentina Capital Federal: Distrimachisa Interior: York Agency, S. A. Tel. (005411) 43 31 50 51 La revista Slo Programadores no tiene por qu estar de acuerdo con las opiniones escritas por sus colaboradores en los artculos firmados. El editor prohibe expresamente la reproduccin total o parcial de los contenidos de la revista sin su autorizacin escrita. Depsito legal: M-26827-1994 PRINTED IN SPAIN COPYRIGHT 30-04-2005 P.V.P. 6,00 Euros Precio en Canarias, Ceuta y Melilla: 6,15 Euros

DISPOSITIVOS MVILES
20 Juegos de calidad comercial en J2ME (III)

MIDDLEWARE
28 Programacin distribuida en .NET (II) 36 XAML (IV)

REDES
42 Sistemas de mensajera con Java Message Service (I)

DISEO
50 Together Architect, el enlace entre el problema y la solucin 54 Diseo multiplataforma para aplicaciones C++ (y III)

Y adems
04 08 10 60 64 66 Noticias javaHispano: jH.com, joda-time, columna de opinin y ms Canal Panda: Pharming, nueva tcnica de fraude Preguntas y respuestas Libros: Desarrollo web con PHP Contenido del CD-ROM

Asociacin Espaola de Editoriales de Publicaciones Peridicas

NOTICIAS

MICROSOFT

Microsoft desarrolla un nuevo servicio de asesora y soporte para sus partners ISVs
Microsoft ha puesto en marcha una nueva herramienta enfocada a conseguir el xito de sus partners ISVs (fabricantes independientes de software) y ayudarles a mejorar la satisfaccin de sus clientes. Se trata de un servicio de consultora telefnica diseado para ayudarles en la creacin y desarrollo de nuevos programas a partir de las tecnologas de la compaa. Con esta consultora especializada Microsoft mejora notablemente el servicio habitual que se proporciona en concepto de mantenimiento de software con una ayuda pro-activa gestionada por un tcnico experto en desarrollo de aplicaciones y nuevos programas, migracin de productos y gestin de cdigos.

Este nuevo beneficio forma parte del Partner Program y permite a los ISVs seleccionar aquellos servicios que se ajustan a sus necesidades dentro de una amplia oferta de asesoramiento. En funcin del nivel alcanzado por el partner dentro del programa, Microsoft ofrece distintas horas de asesoramiento: 10 a los partners suscritos al programa Empower, 15 a los Certified y 20 a los Gold Certified. Los partners que quieran ampliar informacin sobre este nuevo servicio pueden visitar la web http://www.microsoft.com/spain/partner/isv/default.asp. Para Susana Nez, responsable del Programa de Partners en Microsoft Iberica, este nuevo servicio es un importante valor aadido del que pueden beneficiarse todos los ISVs. Forma parte del compromiso de permanente colaboracin que tenemos con todos nuestros partners y nos permite mejorar y avanzar juntos en el desarrollo de tecnologas que ayuden a mejorar la productividad de las empresas. virutal sobre el que organizar y decidir la manera de programar la generacin de los informes, etc.

BUSINESS OBJECTS

Crystal Reports XI y Crystal Server XI, la generacin de informes rpida y eficaz


Business Objects, proveedor de soluciones de business intelligence, ha anunciado dos nuevos productos: Crystal Reports XI y Crystal Reports Server XI, ambos orientados a dar solucin a la generacin de informes.

Crystal Reports Server XI,


Crystal Reports Server XI es una versin orientada a las pequeas y medianas empresas, ya que supone una solucin de generacin de informes empaquetada que incluye todo lo que las organizaciones de mediano tamao pueden necesitar para crear, distribuir y gestionar informes a travs de la web, integrando las funciones de reporting dentro de sus aplicaciones ofimticas. Crystal Reports Server XI pone a disposicin de las organizaciones las mismas funcionalidades de generacin de informes que las que poseen las grandes empresas, pero sin el coste ni la complejidad de esas implantaciones. Adems, cuenta con un ao de mantenimiento y asistencia tcnica. Actualmente la Fundacin Eclipse cuenta con 91 miembros, pero slo ocho de estas compaas figuran como desarrolladores estratgicos. BEA ha sido tambin elegida para liderar el proyecto WTP (Web Tools Platform), que desarrolla herramientas de infraestructura para soportar J2EE y desarrollo de aplicaciones Web. BEA planea incorporar capacidades WTP dentro de futuros lanzamientos de BEA WebLogic Workshop. Adems de demostrar su compromiso con la Fundacin Eclipse desde el punto de vista corporativo, BEA tambin tiene previsto anunciar futuros desarrollos que vendrn a reforzar el compromiso desde el punto de vista tecnolgico. Bajo la denominacin de cdigo Daybreak, BEA va a disear la prxima versin de BEA WebLogic Workshop, el entorno de desarrollo integrado de la compaa, que soportar el framework de Eclipse. Daybreak ofrecer un amplio entorno de desarrollo que comprende caractersticas de Workshop de fcil uso, as como un framework de alta productividad para el desarrollo de arquitecturas orientadas a servicios, adems de frameworks de Eclipse y un abanico de plug-ins, tambin de Eclipse.

Crystal Reports XI
Los desarrolladores y otros profesionales informticos necesitan poder acceder rpidamente a los datos, integrar con facilidad la funcionalidad de reporting dentro de sus aplicaciones empresariales, y gestionar el formateo y distribucin de informacin a travs de la web. Para atender esta demanda, Crystal Reports XI ofrece nuevas funciones, como por ejemplo mejores controladores de conectividad para acceder con facilidad a cualquier fuente de datos, creacin de plantillas para personalizar informes, herramientas de diseo intuitivas, un banco de trabajo

BEA SYSTEMS

BEA Systems y Eclipse unen sus fuerzas para potenciar la Comunidad Java
BEA Systems y la Fundacin Eclipse, una comunidad de cdigo abierto que centra su actividad en la oferta de una plataforma de desarrollo universal, anuncian que BEA se ha integrado en Eclipse como miembro del Consejo de Direccin y Desarrollador Estratgico de esta organizacin. Una de las primeras funciones de BEA dentro de Eclipse va a ser el liderazgo del proyecto WTP (Web Tools Platform). Adems, BEA va a proponer un nuevo proyecto sobre el Lenguaje de Herramientas de Desarrollo y tambin va a fusionar su proyecto de cdigo abierto AspectWerkz con el proyecto AspectJ de Eclipse, como ya adelant el mes pasado Slo Programadores en la seccin de la comunidad javaHispano.

SOLO PROGRAMADORES n 124

http://digital.revistasprofesionales.com

NOTICIAS

BORLAND

Borland presta un mayor soporte a Eclipse


Borland ha ampliado significativamente su soporte a Eclipse, comunidad de cdigo abierto, a la vez que plataforma de desarrollo universal que soporta mltiples lenguajes y tecnologas. Borland se ha incorporado como desarrollador estratgico a la Junta Directiva de la Fundacin Eclipse desde donde desempear un papel importante en el progreso de esta tecnologa, mediante la aportacin de un equipo de desarrollo para ampliar la plataforma Eclipse. Borland fomentar el uso de Eclipse como plataforma a lo largo de toda su lnea de productos de gestin del ciclo de vida de las aplicaciones (ALM). De este modo, junto con el creciente soporte de Borland a Microsoft Visual Studio, la compaa continuar ofreciendo a los clientes la posibilidad de elegir la tecnologa para sus soluciones ALM corporativas, mientras contribuye a reducir la creciente complejidad de los entornos de TI heterogneos. Eclipse y Visual Studio se han convertido en dos de las plataformas de desarrollo lderes en la actualidad y Borland ayudar a sus clientes a estrechar

la distancia entre ambas con el fin de que puedan aprovechar mejor las inversiones que ya han realizado. En este sentido, y para impulsar los avances ALM de la plataforma Eclipse, Borland liderar la propuesta para un nuevo marco de modelado grfico que se sumar a la tecnologa de modelado actual en la comunidad Eclipse. Y es que no hay que olvidar que el modelado comienza a cobrar ms protagonismo entre las empresas, como va para reducir la complejidad de TI, mejorar la eficiencia y colaboracin de los equipos y acercar los requisitos de TI y de negocio. Como fiel defensor de los sistemas abiertos, de las plataformas independientes y de la libre eleccin del cliente, Borland continuar soportando productos y servicios, tanto en Eclipse, como en el marco de trabajo Microsoft Visual Studio, mientras tambin avanza las caractersticas y funcionalidades de su IDE Java JBuilder. zadas actualmente por ms de 15.000 empresas de todo el mundo. Los partners de BEA que quieran participar en los webinars podrn elegir entre ms de 15 cursos diferentes que analizan contenidos como la creacin de portales, desarrollos en J2EE, integracin de aplicaciones empresariales o estndares de servicios web, entre otras temticas. Tambin se ofrece informacin a los partners sobre las ltimas soluciones que BEA lance al mercado, como la nueva versin de su servidor de aplicaciones BEA WebLogic 9.0 o acerca de su proyecto de cdigo abierto Apache Beehive. Los partners de BEA que quieran participar en su programa de formacin pueden consultar la agenda en la URL http://es.bea.com/eventos/webinars/index.jsp o dirigirse por telfono al departamento de marketing de BEA Systems (91 384 65 34). que Telefnica Mviles pone a disposicin de sus partners para proporcionarles la ayuda y los conocimientos necesarios con el fin de fomentar el desarrollo de aplicaciones mviles sobre la red MoviStar. El acuerdo alcanzado por Microsoft y Telefnica Mviles Espaa incluye una serie de acciones de colaboracin mutua, entre las que cabra destacar la participacin de la operadora en DevDay, el principal evento que anualmente celebra Microsoft con los desarrolladores de software, el patrocinio de Microsoft en la Feria MovilForum, dando a conocer la aplicacin de su tecnologa en el rea de la movilidad, la colaboracin de Telefnica Mviles en las sesiones sobre Smart Client de los eventos MSDN Workshop que se celebren en Madrid y Barcelona, y la incorporacin de los elementos de movilidad real propios de Telefnica MoviStar en ISV Walqa Lab, el principal laboratorio tecnolgico de Microsoft a disposicin de los ISVs espaoles.
Mauricio Ulargui, director de la Divisin de Desarrolladores de Plataforma de Microsoft Ibrica (izquierda) y Jos Mara Soler, director de Aplicaciones y MovilForum de Telefnica Mviles Espaa (derecha), durante la firma del acuerdo de colaboracin.
http://digital.revistasprofesionales.com

BEA SYSTEMS

BEA Systems ofrece formacin permanente y gratuita a sus partners a travs de Webinars
BEA Systems ha puesto en marcha un programa de formacin continua y gratuita, dirigido a sus partners, que tendrn lugar cada martes hasta el prximo mes de junio. El plan de formacin se imparte a travs de Webinars, seminarios online que tienen como objetivo cualificar a los mejores partners de BEA e incrementar el nmero de expertos en las soluciones de BEA, utili-

MICROSOFT

Microsoft y Telefnica Mviles firman un acuerdo dirigido a ofrecer apoyo a los desarrolladores de software
Mauricio Ulargui, director de la Divisin de Desarrolladores de Plataforma de Microsoft Ibrica y Jos Mara Soler, director de Aplicaciones y MovilForum de Telefnica Mviles Espaa, han firmado un acuerdo de colaboracin por el que ambas compaas se comprometen a poner en marcha una serie de actividades dirigidas a ofrecer su apoyo a la comunidad tcnica de desarrolladores de software. La importancia que este colectivo ha adquirido en el campo de las nuevas tecnologas ha llevado a Microsoft y Telefnica Mviles Espaa a crear programas especficos orientados a los desarrolladores. MSDN (Microsoft Developer Network) se fund a principios de 1992 y desde entonces se ha convertido en el principal vehculo de comunicacin que mantiene la compaa con esta comunidad. Por su parte, con una antigedad de ms de cuatro aos, MovilForum es el foro

SOLO PROGRAMADORES n 124

JAVAHISPANO

Actualidad Java de la mano de javaHispano


javaHispano lanza un nuevo portal dedicado a empresas: javaHispano.com
Hasta el presente javaHispano mantena dos portales, uno dedicado a informar sobre las ltimas novedades, dar apoyo, formar y, en general, servir de cauce para compartir conocimiento entre los desarrolladores Java (javaHispano.org); y otro orientado a dar soporte y fomentar el desarrollo de soluciones libres en torno a las tecnologas Java (javaHispano.net). En javaHispano estamos convencidos de que las empresas pueden realizar inestimables contribuciones a la plataforma Java en general, y a los desarrolladores y al Software Libre en particular: conocimiento, experiencia, innovaciones, servicios, soluciones, etc. Por ello hemos decidido crear un portal orientado a todas aquellas empresas que, teniendo lneas de negocio en torno a plataforma Java, tengan presencia en pases de habla hispana. Este portal podr ser empleado por las empresas como escaparate y punto de encuentro, sirvindoles para darse a conocer y presentar los servicios y productos que ofrecen. Para aquellas que lo deseen, javaHispano.com tambin les permitir colaborar activamente para incrementar el valor del portal mediante la publicacin de casos de xito, informes, noticias y comparativas, as como con cualquier otra iniciativa que convierta al portal en una herramienta ms til. Desde el portal se podrn realizar bsquedas entre las empresas registradas por el sector al que pertenecen, por los servicios que ofertan y por su localizacin geogrfica; as como bsquedas entre los productos ofertados por las empresas por categora, tecnologa y licencia. En acorde con la filosofa altruista que gua a nuestra organizacin, darse de alta en el portal y acceder a todos sus servicios es completamente gratuito, si bien, dados los gastos de mantenimiento del portal, javaHispano aceptar donativos de las empresas registradas.

Librera alternativa para el procesado de fechas


Una de las clases Java que menos simpatas crea entre los desarrolladores es, sin duda, java.util.Date. Sus mtodos son poco intuitivos, a menudo no existe un mtodo que nos proporcione la funcionalidad que necesitamos y, en la actualidad, la mayor parte de ellos se encuentran "deprecated". A esto se aade el hecho de que las fechas no son inmutables, para muchos una mala decisin de diseo. Joda-time (http://joda-time.sourceforge.net) es una librera Open Source con licencia Apache 2.0 para el manejo de fechas y horas de una manera sencilla y eficiente. Soporta los calendarios Gregoriano, Gregoriano-Juliano, Budista, Copto e ISO8601 y posee un excelente soporte de franjas horarias y localidad. Aunque hace bastante tiempo que el proyecto es funcional recientemente han liberado la versin 1.0. Junto a estas lneas podis observar un pequeo cdigo de ejemplo, y en el CD-ROM se incluye la propia librera:
DateTime dt = new DateTime(); int year = dt.getYear(); String monthText = dt.monthOfYear().getAsText(Locale.ENGLISH); String monthInFrench = dt.monthOfYear().getAsText(Locale.FRENCH); String dateAsISO8601Format = dt.toString();

SOLO PROGRAMADORES n 124

http://digital.revistasprofesionales.com

JAVAHISPANO

javaHispano

JBenchmark3D: mide la potencia grfica de tu mvil

OPININ

XML: uso y abuso


El XML es un estupendo formato para estructurar informacin jerrquica o en rbol en texto plano, gracias a esta cualidad y a ser una lengua franca independiente de las plataformas, se est usando casi para todo: representacin visual (XHTML), descriptor de contenidos (RDF), comunicacin de datos y acciones (SOAP), configuracin y almacenamiento de datos a medida, descriptor de tareas en desarrollo (Ant), generacin de cdigo (JAXB), descriptor ortogonal entre el lenguaje de programacin y mundos paralelos: HTML y cdigo en los frameworks web, descriptores de tablas/clases en EJBs, vnculos con aspectos en AspectWerkz, serializacin en XStream etc, por citar ejemplos Java. Parece que tendremos XML para rato.

JBenchmark (http://www.jbenchmark.com) es una aplicacin Java para dispositivos mviles que permite medir su rendimiento ejecutando una serie de tests sobre l. Hasta hace poco JBenchmark constaba de dos versiones, una para MIDP 1.0 y otra para MIDP 2.0. Ahora se aade JBenchmark3D, del cual vemos varias capturas de pantalla junto a estas lneas, orientado a medir el rendimiento grfico de los terminales mviles. JBenchmark3D mide la potencia grfica del dispositivo realizando tests relacionados con el manejo de tringulos, texturas, escenas de bajas calidad para juegos basados en motores 3D, y escenas de alta calidad para dispositivos con aceleracin 3D por hardware. Al igual que sus hermanos, JBenchmark3D se descarga gratuitamente, y los resultados se pueden enviar a la web para ser considerados en las estadsticas que, de prcticamente todos los terminales mviles del mercado, se muestran en el portal de JBenchmark.

IntelliJ IDEA gratis para desarrolladores de sofware libre


Sin embargo existe la fuerte tendencia de usar XML como metalenguaje de programacin secuencial, con ejemplos relevantes como Ant (con gran xito), algunos frameworks web y el modelado y coreografa de procesos de negocio en WebServices (BPML, BPEL, CDL etc.). La sintaxis en ocasiones puede llegar a ser tan compleja que son necesarias herramientas, y adolecen de un gran problema: pobre expresividad. XML presenta grandes dificultades para expresar comportamiento que fcilmente puede expresarse en un lenguaje normal con un buena API, de hecho, ms reutilizable y extensible. Teniendo en cuenta la enorme influencia sintctica que ha tenido el C/C++ en los lenguajes modernos no sera difcil inventar una nueva lengua franca multiplataforma terica, la OMG lo hizo con el IDL para declaraciones, el W3C lo usa con xito para el DOM, Por qu no aadir tambin comportamiento? Un Behavior Definition Language? Ms clases, interfaces y herencia y quizs menos XML por favor.
Jose Mara Arranz Santamara (jmarranz). Profesor Asociado de la Universidad Politcnica de Madrid.

Jetbrains, compaa desarrolladora de uno de los principales IDE Java, IntelliJ IDEA, ha anunciado que apoyar al movimiento del Sofware Libre regalando licencias de su IDE a los desarrolladores que participen en proyectos libres. Las condiciones para acceder a estas licencias son participar en un proyecto que: se distribuya bajo una licencia aprobada por la OSI, tenga una web propia y cuente con una comunidad activa. Las peticiones pueden realizarse desde http://www.jetbrains.com/idea/opensource/application.htm.

Sobre el autor
Abraham Otero (abraham.otero@javahispano.org) es responsable de calidad y miembro de la junta de javaHispano.
http://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

CANAL PANDA

Pharming, nueva tcnica de fraude


FERNANDO DE LA CUADRA

Los hackers estn intentando, cada vez ms, obtener beneficios econmicos de sus actuaciones y del malware que crean.
Si hasta ahora uno de los fraudes ms extendidos era el phishing, consistente en engaar a los usuarios para que efecten operaciones bancarias en servidores web con el mismo diseo que un banco on-line, el pharming entraa an mayores peligros que el phishing. Bsicamente, el pharming consiste en la manipulacin de la resolucin de nombres en Internet, llevada a cabo por algn cdigo malicioso que se ha introducido en el equipo. Cuando un usuario teclea una direccin (como puede ser www.pandasoftware.com), sta debe ser convertida a una direccin IP numrica, como 62.14.63.187. Esto es lo que se llama resolucin de nombres, y de ello se encargan los servidores DNS, siglas que corresponden a Domain Name Server. En ellos se almacenan tablas con las direcciones IP de cada nombre de dominio. A una escala menor, en cada ordenador conectado a Internet hay un fichero en el que se almacena una pequea tabla con nombres de servidores y

Esquema del proceso de resolucin de nombres cuando accedemos a los servicios del servidor de Panda Software.

direcciones IP, de manera que no haga falta acceder a los DNS para determinados nombres de servidor, o incluso para evitarlo. El pharming consiste en modificar este sistema de resolucin de nombres, de manera que cuando el usuario crea que est accediendo a su banco en Internet, realmente est accediendo a la IP de una pgina web falsa. El phishing debe su xito a la ingeniera social, aunque no todos los usuarios caen en estos trucos y su xito est limitado. Y adems, cada intento de phishing se debe dirigir a un nico tipo de servicio bancario, por lo que las posibilidades de xito son muy limitadas. Por el contrario, el pharming puede atacar a un nmero de usuarios de banca muchsimo mayor. Adems, el pharming no se lleva a cabo en un momento concreto, como lo hace el phishing mediante sus envos, ya que la modificacin de DNS queda en un ordenador, a la espera de que el usuario acceda a su servicio bancario. De esta manera, el atacante no debe estar pendiente de un ataque puntual, como hemos mencionado antes. La solucin para esta nueva tcnica de fraude pasa, de nuevo, por las soluciones de seguridad antivirus. Las acciones necesarias para llevar a cabo el pharming necesitan efectuarse por alguna aplicacin en el sistema a atacar (puede ser un fichero exe, un script, etc.). Pero antes de poder ejecutarse esta aplicacin, debe llegar al sistema objetivo, evidentemente. La entrada del cdigo en el sistema puede ser a travs de mltiples vas, tantas como entradas de informacin hay en un sistema: el e-mail (la ms frecuente), descargas por Internet, copias desde un disco o CD, etc. En todas y cada una de estas entradas de informacin, el antivirus debe detectar el fichero con el cdigo malicioso y eliminarlo, siempre que se encuentre detectado como una aplicacin daina dentro del fichero de firmas de virus del antivirus. Desgraciadamente, hoy en da nos movemos en un escenario en el que el malware ha adquirido una velocidad de propagacin muy elevada, y los creadores son ms y ofrecen al resto de la comunidad hacker los cdigos fuente para que introduzcan variaciones y puedan crear ataques nuevos. Los
http://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

10

CANAL PANDA

Pharming, nueva tcnica de fraude

laboratorios de virus no tienen tiempo suficiente para efectuar la deteccin y eliminacin del malware para todos los nuevos cdigos antes de que lleguen a propagarse en unos pocos PCs. A pesar de los esfuerzos y la mejora de los laboratorios, es humanamente imposible que se elabore una solucin adecuada y a tiempo para algunos cdigos que se propagan en cuestin de minutos. La solucin para este tipo de amenazas no debe ser, al menos en un primer frente de proteccin, una solucin reactiva, sino que deben instalarse sistemas mediante los cuales se detecten no los ficheros en funcin de firmas vricas, sino las acciones que se llevan a cabo en el ordenador. De esta manera, cada vez que se intente realizar un ataque al sistema de DNS del ordenador (como es el caso de las aplicaciones para pharming), sea reconocido el ataque y detenido, as como el programa que lo ha llevado a cabo, bloqueado. Sin embargo, existe un peligro aadido a esta nueva tcnica de pharming, que reside en los servidores proxies annimos. Muchos usuarios desean ocultar su identidad (su direccin IP) a la hora de navegar, por lo que utilizan servidores proxy instalados en Internet que llevan a cabo la conexin con la IP del servidor en lugar de la IP del cliente. En el peor de los casos, uno de estos servidores proxy puede tener la resolucin de nombres alterada, de manera que los usuarios que intenten entrar en su pgina bancaria (a pesar de que su sistema local est perfectamente asegurado) sean redirigidos por el proxy a una pgina con el mismo diseo y apariencia de su banco, pero falsa. Tambin podramos pensar, siendo ms positivos, que el servidor proxy ha sufrido algn tipo de ataque que altere su sistema de resolucin de nombres de dominio. En cualquiera de los casos, el problema del pharming se plantea como peligroso, aunque de muy fcil solucin. nicamente con sistemas capaces de detectar los cambios en la resolucin de nombres de Internet en el ordenador y con sistemas para su bloqueo, podremos hacer frente a la avalancha de cdigos maliciosos que nos espera y que intentan estafar a los usuarios.

Los usuarios de banca on-line amenazados por un nuevo ladrn de contraseas

Sobre el autor
Fernando de la Cuadra (Fdelacuadra@pandasoftware.com) es editor tcnico internacional de Panda Software (http://www.pandasoftware.com).

El laboratorio anti-virus de Panda Software (PandaLabs) ha detectado recientemente la aparicin de Searchmeup, el primer adware (o programa que muestra publicidad) que utiliza una vulnerabilidad de Microsoft para sustraer informacin de los usuarios. Los usuarios de banca on-line se ven expuestos a esta amenaza simplemente al navegar por Internet. Este adware se introduce en las mquinas sin el consentimiento del usuario utilizando una vulnerabilidad denominada Exploit/LoadImage. Una vez introducido en el ordenador cambia la pgina de inicio del navegador, dejando en su lugar la de un buscador que, cada vez que se carga, muestra popups que instalan spyware y dialers en el equipo como el troyano Tofger.AT, los dialers Dialer.BB y Dialer.NO, y otro adware denominado Adware/TopConvert. Infectado el ordenador, cuando el usuario abre Internet Explorer, Tofger.AT se activa y si el usuario visita uno de los 15 bancos on-line ms importantes de Espaa (pginas con conexiones seguras HTTPS) Tofger.AT capturar la contrasea utilizada para acceder a las siguientes entidades bancarias: cajamadrid, bpinet, millenniumbcp, hsbc, barclays, lloydstsb, halifax, autorize, bankofamerica, bancodevalencia, cajamar, portal.ccm, bancaja, caixagalicia, caixapenedes, ebankinter, caixasabadell, bes, banif, millenniumbcp, totta, bancomais, montepiogeral, bpinet, patagon, lacaixa, citibank, bbvanet, banesto, e-trade y unicaja. El usuario infectado no es consciente de la existencia de Searchmeup a menos que: Observe el cambio de la pgina de inicio de su navegador. Si se genera un error y se reinicia el ordenador en un minuto (lo cual puede no ocurrir siempre). Tambin puede mostrar pantallas de error de sistema (pantallazos azules). La vulnerabilidad Exploit/LoadImage de la que se aprovecha Searchmeup afecta a ordenadores con sistema operativo Windows 2003/XP/

2000/NT/Me/98, y permite ejecutar cdigo arbitrario en el sistema. Puede ser aprovechada por un atacante alojando un cursor o icono especialmente creado en una pgina web maliciosa, o en un mensaje de correo electrnico en formato HTML. Para corregir este problema Microsoft ha publicado la correspondiente actualizacin, cuya instalacin se recomienda. Para ms informacin, puede visitarse la direccin http://www.microsoft.com/spain/technet/ seguridad/boletines/MS05-002-IT.mspx Ante el peligro que representa Searchmeup y el troyano Tofger.AT, Panda Software recomienda extremar las precauciones y mantener actualizado el software antivirus. Los clientes de Panda Software ya tienen a su disposicin las correspondientes actualizaciones para la deteccin y desinfeccin de estos nuevos cdigos maliciosos. Asimismo, los clientes de Panda Software ya tienen disponibles las actualizaciones para instalar las nuevas Tecnologas TruPrevent junto con su antivirus y estar, as, protegidos de forma preventiva frente a nuevos cdigos maliciosos. Por otro lado, para usuarios que cuenten con otros antivirus del mercado, Panda TruPrevent Personal es la solucin idnea, ya que es compatible y complementaria a stos y proporciona una segunda lnea de defensa y una proteccin preventiva que acta mientras el antivirus es actualizado, disminuyendo el riesgo de ser infectados. El lector puede conocer ms sobre las tecnologas TruPrevent en http://www.pandasoftware.es/ truprevent. Para la deteccin y desinfeccin gratuita de los ordenadores, los usuarios pueden utilizar el antivirus on-line Panda ActiveScan, disponible en http://www.pandasoftware.es.

http://digital.revistasprofesionales.com

11

SOLO PROGRAMADORES n 124

ACTUALIDAD

BEA entra en la red con Da Vinci


CARLOS LAPARRA

Hablamos con Enrique Martn, Director de Tecnologa de BEA Systems, sobre el proyecto Da Vinci y el mercado de las Telecomunicaciones.
En el nmero anterior de Slo Programadores se publicaba una noticia que seguramente habr generado una larga lista de interrogantes en el lector. En dicha noticia, cuyo ttulo fue El proyecto Da Vinci, se informaba del lanzamiento de un innovador conjunto de productos por parte de BEA Systems, agrupados todos ellos bajo el nombre en clave Da Vinci. Tal como se informaba en dicha noticia, esta nueva gama de productos va dirigida a la industria de las Telecomunicaciones, y su objetivo es permitir a las corporaciones de este sector ampliar el actual abanico de servicios e incrementar sus beneficios mediante la creacin, la gestin y la entrega de servicios mviles de una forma gil y eficaz. Intrigados por este nuevo lanzamiento, y viendo que puede ser la piedra angular de cambios importantes en la forma de disear, implementar y desplegar nuevos servicios basados en las infraestructuras de Telecomunicaciones, hemos considerado de inters el mantener una charla con Enrique Martn, Director de Tecnologa de BEA Systems, quien muy amablemente no ha dudado en responder a todas nuestras cuestiones. Esperemos que esta entrevista pueda servir para que el lector entienda el giro que est a punto de producirse en el sector de las Telecomunicaciones y, por lo tanto, las nuevas tecnologas que la gente de Tecnologas de la Informacin (TI) tendr que asimilar en sus proyectos futuros. Slo Programadores. Tradicionalmente, BEA ha ofrecido plataformas de software orientadas a todos los mercados e industrias. Por qu estamos presenciando ahora el lanzamiento de un producto especfico para el mercado de las Telecomunicaciones? Enrique Martn. BEA siempre ha perseguido una oferta horizontal de middleware orientada a servidores de aplicaciones y control de proceso. Con Da

Vinci seguimos en esa visin horizontal pero particularizando en el mundo de las Telecomunicaciones. En realidad sigue siendo la misma filosofa, es decir, BEA sigue siendo un proveedor de infraestructura. Lo que ocurre es que en el mundo de las TI existen estndares muy slidos como por ejemplo J2EE; en cambio, el mundo de las Telecomunicaciones carece de ello, y por eso se construye sobre una tecnologa distinta en cuanto al propsito, pero muy parecida en cuanto a la filosofa horizontal. BEA ha querido dar el salto y, sin salir del mundo de la oferta de infraestructura, ahora queremos ofrecer un producto de infraestructura muy particular para el sector de las Telecomunicaciones. S.PP. Por qu, desde el punto de vista de BEA, el sector de las Telecomunicaciones necesita esta infraestructura particular que has mencionado? E.M. Como te he comentado, el objetivo que persiguen las corporaciones del sector de las Telecomunicaciones es llegar a estndares para el desarrollo de aplicaciones y servicios sobre sus redes, del mismo modo que en el sector de las TI se han alcanzado estndares del nivel de J2EE. En este sentido, la oferta de BEA particularizada en el sector de las Telecomunicaciones consiste en proveer a estas empresas de una infraestructura que ofrezca una convergencia total entre los protocolos estndares de la red y los estndares tpicos del mundo de las TI. Aqu es importante entender que cuando mencionamos red, estamos haciendo referencia a toda la infraestructura de la red de Telecomunicaciones (red de telefona, de GSM, de UMTS, etc.). S.PP. Por qu es necesaria esa convergencia? E.M. El sector de las Telecomunicaciones ha llegado a un punto de inflexin en el que es necesario un cambio de estrategia. Uno de los factores que ha llevado a este punto al propio sector es el hecho de que los servicios se han construido pensando en la propia estructura de la red, quedando stos localizados y aislados en los propios nodos de la red (servicios de voz, videoconferencia, gestin de tonos, etc.). En la medida en que los operadores de telefona pretendan aumentar su facturacin con servicios alternativos al de voz, como por ejemplo con
http://digital.revistasprofesionales.com

Enrique Martn atendi muy amablemente la llamada de Slo Programadores.

SOLO PROGRAMADORES n 124

12

ACTUALIDAD

BEA entra en la red con Da Vinci

aplicaciones de datos, van a experimentar unos costes altsimos al implantar estos nuevos servicios con la filosofa actual, es decir, localizndolos en los nodos de la red. En estos momentos ya todos tenemos telfono mvil, por ejemplo. Esto hace muy difcil el que una operadora pueda seguir creciendo con los servicios de voz, lo cual nos lleva a la conclusin de que los servicios y las aplicaciones de datos son el nuevo camino a explorar. Pero si la implantacin de estos nuevos servicios tiene unos costes tan altos... cul es el futuro? La solucin a esta tesitura pasa por aislar la capa de red (transporte) de la capa de servicio (aplicaciones) y en esta ltima poder desarrollar y desplegar aplicaciones con la velocidad y agilidad que las necesidades comerciales lo requieran. Con esto se conseguir tener aplicaciones que podrn ser usadas por miles de empresas, puesto que se basarn en tecnologas de servidor estndares huyendo del carcter propietario de este tipo de redes. Retomando el hilo de la pregunta, la convergencia entre los estndares del mundo de las Telecomunicaciones y del mundo de las TI resulta necesaria para poder desarrollar aplicaciones que obtengan lo mejor de ambos sectores y poder ofrecer as al usuario los servicios que est demandando: voz, vdeo y datos. S.PP. Me ha llamado la atencin esto ltimo. A qu te refieres cuando hablas del carcter propietario de las redes de Telecomunicaciones? E.M. La realidad actual es que si desarrollamos una aplicacin de datos para una operadora (por ejemplo para ofrecer un servicio de datos a sus usuarios finales), ser prcticamente imposible que esta aplicacin pueda ser adquirida por otra operadora, dado que cuando se desarrolla una aplicacin de este tipo, puesto que se debe usar la infraestructura de la red de Telecomunicaciones, es necesario descender hasta los niveles de protocolos y estos, efectivamente, son propietarios. Por lo tanto, podemos afirmar que la naturaleza de las redes de Telecomunicaciones actuales supone un problema para la nueva orientacin del mercado que comentaba antes. S.PP. Cmo es posible superar esta dificultad? E.M. Precisamente en esta lnea es en la que estamos trabajando. Es necesario evolucionar esta red, introduciendo interfaces estndares
http://digital.revistasprofesionales.com

En la figura adjunta puede verse la posicin que ocupa el protocolo SIP en la pila de protocolos.

que permitan el uso de la propia infraestructura de la red con el objetivo de que los servicios que se desarrollen sobre ella no le sean dependientes. S.PP. Podras poner un ejemplo, para entender claramente el problema que supone tener una red propietaria? E.M. S, y para ello vamos a tomar como referencia la simple accin de enviar un SMS. Tanto si el SMS es enviado desde un telfono mvil como si es enviado desde una aplicacin web, a la postre ambos medios debern consumir el servicio de una operadora de Telecomunicaciones. Efectivamente, el operador exhibe un interfaz mediante el cual nosotros podremos darle el mensaje y ste servicio lo convertir en un SMS. Pero este operador deber mandar el mensaje a travs de un hardware que es propietario, puesto que ha sido subministrado por alguna de las principales empresas proveedoras de este tipo de equipos. Cada modelo de cada fabricante realiza esta accin de una manera distinta, luego estamos ante un problema nicamente solucionable mediante estndares. En este sentido, har un paralelismo que ser entendido rpidamente por cualquier programador. Qu suceda cuando no haba APIs estndares para el acceso a bases de datos? Pues sencillamente que una aplicacin escrita para un SGBD no poda de ninguna manera conectarse a otro SGBD. As pues, lo que se consigui entonces con la estandarizacin del acceso a bases de datos es algo parecido a lo que se est persiguiendo en la actualidad, pero aplicado a la infraestructura de las redes de Telecomunicaciones. S.PP. A lo largo de la entrevista est quedando clara la importancia que van a tener los estndares en la nueva orientacin que va a tomar el mercado de las

Telecomunicaciones. Qu estndares son esos? E.M. Efectivamente, son tres los estndares ms prometedores del mundo de las Telecomunicaciones, aquellos que permiten la comunicacin de voz y multimedia: SIP, Parlay y JAIN. SIP (Session Initiation Protocol) es el protocolo de sealizacin para voz sobre IP, principalmente. Simplificando mucho diremos que, en el mundo de la telefona, al establecer una llamada telefnica se estn empleando dos circuitos de informacin. Uno se encarga de la sealizacin y el control de la llamada y el otro se encarga puramente de streaming del audio. Por lo tanto, en el mundo IP SIP ser el protocolo encargado de establecer la llamada. Parlay es un protocolo cuyo objetivo es la homogeneizacin de la infraestructura de red, independientemente de quin sea el fabricante de esa infraestructura. Retomemos de nuevo el ejemplo del envo del SMS propuesto anteriormente. La problemtica de hacer esto en una red propietaria desaparecera si pudiramos usar la infraestructura de dicha red mediante interfaces estndares. En efecto, ste es el objetivo de Parlay. Y, por ltimo, comentar de forma muy resumida que JAIN representara un servidor de aplicaciones situado dentro de la propia infraestructura de la red y que permitira conseguir una red inteligente. S.PP. En este escenario, qu solucin ofrece BEA para las empresas del sector de las Telecomunicaciones? E.M. Bsicamente, y de forma resumida, desde BEA se hace una apuesta firme por la convergencia a la que hacamos alusin al principio de esta conversacin. En este sentido, BEA pretende integrar en su oferta de infraestructura a los tres estndares del mundo de las Telecomunicaciones (SIP, Parlay

13

SOLO PROGRAMADORES n 124

ACTUALIDAD

Un SIP Servlet muy bsico


public class EjemploServlet extends SipServlet { public void doInvite(SipServletRequest a_Request) throws ServletException, java.io.IOException { try { a_Request.send(); } catch (IOException e) { throw new ServletException(No se ha podido enviar la request, e); } } }

Enrique Martn explic con toda clase de detalles los objetivos que persigue el proyecto Da Vinci.

y JAIN), ofreciendo as una plataforma optimizada para las empresas de este sector. En la actualidad, BEA ya tiene una oferta completa para las compaas de Telecomunicaciones, conocida bajo el nombre de WebLogic Service Delivery, que incluye BEA WebLogic Communications Platform, BEA WebLogic Platform (Portal, Integration, App Server, Liquid Data Security & Workshop), BEA Tuxedo, BEA MobileAware Interaction Server, soporte especializado para servicios y soporte de empresas de Telecomunicaciones, etc. S.PP. Entonces, qu es el proyecto Da Vinci? E.M. Da Vinci es el nombre en clave de un proyecto interno de doce meses de duracin de BEA. Da Vinci representa, precisamente, el compromiso de BEA para suministrar una familia de productos integrados, que deben facilitar el desarrollo y despliegue de aplicaciones basadas en las redes de Telecomunicaciones y a la vez en las Tecnologas de la Informacin. Ms concretamente, el producto que da sentido al proyecto Da Vinci y que BEA ha lanzado recientemente es BEA WebLogic Communications Platform. En efecto, BEA WebLogic Communications Platform es una suite de tecnologas integradas basada en estndares, diseada para ayudar a las compaas de Telecomunicaciones a incrementar la productividad de sus negocios, mejorando su capacidad para crear, distribuir y gestionar voz convergente para innovadoras redes de Telecomunicaciones.

Es importante entender que BEA WebLogic Communications Platform se compone de dos productos: BEA WebLogic SIP Server y BEA WebLogic Network Gatekeeper. BEA WebLogic SIP Server es un servidor de aplicaciones J2EE con soporte de SIP. Esto significa que podremos seguir desplegando nuestra aplicacin en BEA WebLogic SIP Server, puesto que como servidor J2EE, soporta HTTP, servicios web, EJBs, etc. Pero, adems, tambin incluye un contenedor de SIP Servlet, que es el estndar de Java para el uso del protocolo SIP. Existen otras soluciones para el uso de SIP, pero la de BEA es la nica que funciona encima del servidor de aplicaciones, de modo que con esta solucin es posible mantener la infraestructura de aplicaciones de la corporacin (EJBs, servicios web, etc.) para mantener nuestra lgica de negocio, y agregar aqu los servicios consumibles de la red de Telecomunicaciones mediante el protocolo SIP. Queda claro entonces que es aqu donde obtenemos la tan famosa convergencia entre la lgica de la aplicacin y los servicios que ofrece la red de Telecomunicaciones. Por su parte, BEA WebLogic Network Gatekeeper es una infraestructura que permite ofrecer los servicios de red de la empresa (expuestos por BEA WebLogic SIP Server) a los agentes consumidores, pero agregando un componente restrictivo basado en polticas de seguridad y de acceso, en funcin de nuestras reglas de negocio. S.PP. Sera posible apuntar algn ejemplo del tipo de aplicaciones que podramos desplegar en BEA WebLogic SIP Server? E.M. Por supuesto. Es necesario entender que el protocolo SIP est pensado para tener un control de la llamada (sealizacin y establecimiento). Veamos, tcnicamente, cmo esto es posible. En el mundo de la web, cuando desde un navegador invocamos http://www... estamos accediendo a un servidor web, el cual nos enviar un documento HTML. En el mundo SIP, bastar con marcar desde nuestro telfono IP

el nmero con el que queremos establecer la llamada y el propio terminal enviar algo del estilo sip://numero_de_telefono, viajando esto por la red de Telecomunicaciones como si de una peticin HTTP se tratara. Lo que ocurre es que esta peticin nunca ser tratada por un servidor web, sino por un servidor SIP. En efecto, aqu entrar en accin nuestro Servlet ejecutndose desde nuestro contenedor de SIP Servlet. Desde l, podremos acceder a la informacin del nmero que realiza la llamada, el nmero destino, etc. Por lo tanto, si podemos tener en nuestro servidor de aplicaciones el control de la llamada que desea efectuar el cliente, las acciones a realizar pueden ser tantas como seamos capaces de ingeniar. Por ejemplo, imaginemos que queremos construir un servicio de prepago. nicamente tendremos que recibir la llamada, identificar a nuestro cliente, comprobar si dispone de crdito para efectuar la llamada y proceder en consecuencia, es decir, establecer la llamada o denegarla. De igual modo, podramos construir un servicio de redireccin de llamadas en caso de que la llamada se efecte a una hora determinada o, por ejemplo, establecer que si en el momento de producirse la llamada el telfono destino se encuentra ocupado, se deber realizar la llamada inversa cuando la lnea quede libre, etc. Pasando a temas ms avanzados, podramos pensar en la construccin de centralitas virtuales alojadas en nuestro servidor de aplicaciones o, por ejemplo, en incluir en los formularios de nuestra aplicacin web un botn que sirviera para que el usuario pudiera solicitar una llamada por parte de la empresa para aclarar cualquier duda sobre el propio formulario, todo esto en tiempo real. Como ha podido verse, BEA WebLogic SIP Server es capaz de unir el mundo de las Telecomunicaciones con el mundo de TI, ofreciendo una variedad de servicios y aplicaciones realmente curiosas.
http://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

14

ACTUALIDAD

Sun Certified Enterprise Architect for J2EE


JAVIER CANO MEDINA (Arquitecto J2EE SCEA)

En este artculo vamos a tratar de detallar en qu consiste la certificacin como arquitecto J2EE de Sun, las distintas pruebas que la componen, proceso de inscripcin y posibles fuentes de documentacin para prepararnos este examen.
Introduccin
El objetivo de la certificacin como arquitecto J2EE es la evaluacin de los conocimientos del aspirante acerca del diseo de arquitecturas software en el mbito de los sistemas empresariales, especialmente centrados en entornos Internet/intranet y sobre la plataforma J2EE. Esta certificacin evala una serie de aspectos tericos y prcticos que veremos ms adelante, como pueden ser modelado con UML, patrones, EJBs o seguridad, entre otros. Tal y como se define en el libro de preparacin de esta certificacin de Mark Cade y Simon Roberts, el objetivo fundamental de una arquitectura software es la de cumplir los requerimientos de nego-

Pgina web en la que Sun informa sobre las notas de las certificaciones.

cio y los requerimientos de nivel de servicio. Estos ltimos son: rendimiento, escalabilidad, fiabilidad, disponibilidad, extensibilidad, seguridad, etc. Esta certificacin forma parte del conjunto de certificaciones ofertadas por Sun dentro de la plataforma Java. La obtencin de esta certificacin no presenta ningn requisito previo, es decir, no es necesario obtener ningn otro certificado Sun ni haber realizado ninguno de los cursos recomendados. De hecho, no es necesario un conocimiento exhaustivo de las APIs J2EE aunque si es recomendable el tener cierta experiencia como desarrollador en la plataforma. Otras certificaciones ofertadas por Sun son: Sun Certified Java Programmer (SCJP). Sun Certified Java Developer (SCJD). Sun Certified Web Component Developer (SCWCD). Sun Certified Business Component Developer (SCBCD). Sun Certified Developer for Java Web Services (SCDJWS). Sun Certified Mobile Application Developer (SCMAD). Estas certificaciones se agrupan segn su entorno de ejecucin. SCJP y SCJD estn orientadas a la plataforma bsica Java o J2SE. En el caso de las certificaciones SCWCD, SCBCD, SCDJWS junto con la certificacin SCEA, que es la que nos ocupa, estn centradas en la plataforma J2EE. En ltimo lugar, la certificacin SCMAD se orienta a dispositivos mviles o J2ME. Para todas las certificaciones, excepto para la de arquitecto (SCEA), es requisito imprescindible la obtencin previa del certificado como Programador Java (SCJP). Desde un punto de vista profesional, la obtencin de la certificacin SCEA puede resultar beneficiosa tanto para la empresa como para el empleado. En el caso de la empresa, podr incluir entre sus recursos disponibles un arquitecto certificado mientras que en el caso del empleado, supone un salto cualitativo en su historial profesional. Esta certificacin se compone de tres partes, que se detallan en los apartados siguientes, una primera parte terica sobre diferentes conceptos, un ejercicio prctico y una ltima prueba terica acerca de nuestro ejercicio prctico. Es importante resaltar que todas las pruebas, tanto las tericas como las prcticas, han de realizarse en ingls.
http://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

16

ACTUALIDAD

Sun Certified Enterprise Architect for J2EE

SCEA parte I: prueba terica


La primera parte de la certificacin es una prueba terica tipo test, compuesta por 48 preguntas. Es necesario obtener una nota igual o superior a un 68% para superar este examen, disponindose de 78 minutos para su realizacin. Es importante comentar que en todas las preguntas que componen el test se indica el nmero de respuestas correctas, lo que a la hora de realizar la prueba supone una ayuda bastante importante. Esta prueba, al igual que la tercera parte de la certificacin, se realiza en un centro Prometric autorizado, utilizando su equipamiento hardware y, lgicamente, sin poder utilizar ningn tipo de documentacin para la realizacin del mismo. Una vez finalizada esta primera prueba, su correccin y la entrega de la nota es inmediata en el propio centro Prometric. Al mismo tiempo Sun proporciona una web (http://www. certmanager.net/sun_assignment) donde podemos consultar las notas de esta y otras certificaciones Sun. Tal y como se comenta en esta web, la actualizacin de los resultados se realiza transcurridos dos o tres das. Los objetivos del examen son: Conceptos bsicos: En este apartado se trata de evaluar conceptos relacionados con la orientacin a objetos y el lenguaje de modelado UML. Impacto de la herencia, encapsulado de funcionalidad y utilizacin de interfaces en la definicin de arquitecturas software, as como dibujo e interpretacin de diagramas UML. Arquitecturas: Los conceptos a evaluar en este apartado estn relacionados con la identificacin de las diferentes caractersticas de las arquitecturas en dos capas, tres capas y n-capas, as como su impacto en los requerimientos a nivel de servicio que comentbamos anteriormente. Reconocer el impacto de una arquitectura J2EE en estos mismos requerimientos de nivel de servicio e identificar posibles puntos dbiles de una arquitectura software dada. Conectividad con sistemas heredados: El objetivo de esta seccin es evaluar la capacidad de determinar cul es el mtodo ms adecuado de acceso a un sistema heredado (Sistema Mainframe, ERP, etc.) desde una aplicacin J2EE. Tecnologa EJB: Los objetivos a evaluar en este apartado estn relacionados con la utilizacin de Enterprise JavaBeans: clases e
http://digital.revistasprofesionales.com

Esquema con las certificaciones de Sun.

interfaces que componen la definicin de un EJB, diferencias entre Stateful y Stateless Session Bean, as como entre Entity Beans y Session Beans, beneficios y coste de la utilizacin de la Persistencia Manejada por el Contenedor (CMP) frente a la Persistencia Manejada por el Bean (BMP), descripcin del comportamiento transaccional de un EJB, seguridad y utilizacin de DAOs en el acceso a datos desde EJBs. Contenedor EJB: Comportamiento del contenedor EJB a la hora de definir el ciclo de vida de los EJB, as como los diferentes mecanismos utilizados por el contenedor para aumentar la escalabilidad y rendimiento de las aplicaciones J2EE como puede ser la definicin de pools de instancias o la activacin/pasivacin de EJBs. Protocolos: Definir las diferentes caractersticas de los protocolos HTTP, HTTPS, IIOP y JRMP, as como identificar el protocolo ms apropiado en un escenario concreto y determinar los posibles problemas derivados de la presencia de un firewall en un entorno concreto y utilizando un protocolo determinado. Aplicacin de tecnologas J2EE: Definir los aspectos de una aplicacin susceptibles de ser implementados mediante la tecnologa J2EE, as como mediante la utilizacin de EJB. Patrones de diseo: Seleccionar el patrn de diseo (GoF) ms adecuado para ser utilizado en un escenario concreto, reconocer los beneficios de la utilizacin de los patrones y determinar el patrn a partir del diagrama UML correspondiente. Mensajera: En este apartado se evala la correcta identificacin de los escenarios en los que la utilizacin de la mensajera resuelta adecuada, as como reconocer los

beneficios de la mensajera sncrona y asncrona. Determinar, dado un escenario, si la utilizacin de la mensajera resulta adecuada. Internacionalizacin de aplicaciones: Determinar los tres aspectos especficos de una aplicacin que resulta necesario modificar para lograr su internacionalizacin. Conocer las clases fundamentales involucradas en este proceso. Seguridad: Conocer las restricciones de seguridad aplicadas a la ejecucin de Applets en los navegadotes web y dado un escenario especfico, determinar la localizacin correcta de la implementacin de las caractersticas de seguridad, as como seleccionar la tecnologa ms adecuada. Algunos conceptos importantes en este apartado son SSL, Certificados y Firma Digital, Firewalls y DMZ, etc.

Ejemplos de preguntas
A continuacin se muestran algunos ejemplos de preguntas de esta primera parte de la certificacin. Adems en el libro de Mark Cade/Simon Roberts tambin se incluyen ejemplos de preguntas de esta primera parte: 1. When should you use CMP? (A) When performance is essential and you are storing standard data types. (B) When performance is not essential and you are storing standard data types. (C) When performance is essential and you are storing complex data types. (D) When performance is not essential and you are storing complex data types. 2. To create an Enterprise JavaBean you need the following components: (A) A Home interface, A Remote Interface and a class that implements either the SessionBean or EntityBean interfaces.

17

SOLO PROGRAMADORES n 124

ACTUALIDAD

Pgina web de Sun con informacin de las certificaciones Java.

(B) A Home interface and a class that implements either the SessionBean or EntityBean interfaces. (C) A Remote interface and a class that implements either the SessionBean or EntityBean interfaces. (D) A Remote interface and a class that implements the EnterpriseBean interface. 3. Which statements are true? (A) ejbPassivate() is called prior to passivation. (B) ejbPassivate() is called immediately after passivation. (C) ejbActivate() is called prior to activation. (D) ejbActivate() is called immediately after activation. 4. JMS provides a full implementation of classes for Messaging. (A) TRUE (B) FALSE 5. What are the benefits of asynchronous messaging? (A) Less coupling between the sender and receiver. (B) Network doesnt have to be available. (C) Does not block the sender. (D) Good for transaction processing. En el apartado de bibliografa, se citan una serie de libros y direcciones web que pueden resultar de ayuda en la preparacin de esta primera parte de la certificacin.

SCEA parte II: ejercicio prctico


El objetivo de este ejercicio prctico es, una vez demostrados una serie de conocimientos tericos sobre arquitecturas software y J2EE mediante la superacin de la primera parte de la certificacin, comprobar si el aspirante es capaz de aplicar estos conocimientos a la resolucin de un supuesto prctico. Una vez superada la primera parte de la certificacin y realizado el pago de este ejercicio prctico, podemos descargar la prueba desde la web http://www.certmanager.net/ sun_assignment. No existe restriccin en cuanto al tiempo que puede transcurrir entre la realizacin de la primera parte y el abono de la matrcula de esta segunda prueba. En el fichero JAR descargado se incluye en formato HTML la descripcin del problema planteado, la documentacin necesaria para su resolucin as como el formato de la solucin a entregar y los distintos aspectos a tener en cuenta en su correccin. Esta solucin debe presentarse tambin en formato HTML. Es obligatorio que al solucin est compuesta por diagramas de clases, diagramas de componentes y diagramas de secuencia y/o colaboracin, no especificndose el nmero de diagramas de cada tipo que debe presentarse. Tambin es recomendable que se incluya documentacin explicando los planteamientos previos que hemos tenido en cuenta a la hora de resolver el ejercicio, as como una explicacin detallada de nuestra solucin.

Segn se especifica en la documentacin que acompaa al ejercicio prctico, los diagramas de clases tienen un peso igual a 44 en la nota final, donde la correcta utilizacin del lenguaje UML tiene una nota mxima de 10 mientras que la resolucin de los requerimientos expresados en el ejercicio tiene una nota mxima de 34. En el caso de los diagramas de componentes la proporcin es la misma, 10 frente a 34 para un total de 44. En el caso de diagramas de secuencia/colaboracin la nota total mxima es 12, otorgndose una nota mxima de 3 a la correcta utilizacin del lenguaje UML, mientras que el cumplimiento de los requerimientos del sistema se punta como mximo con una nota de 9. Una vez que demos por concluido nuestro ejercicio, para la entrega de la solucin nos dirigiremos a la web de Sun ya comentada donde deberemos tener habilitado un botn Upload que nos permitir enviar la solucin para su evaluacin. Esta solucin debe enviarse en formato JAR y el nombre del fichero a enviar debe contener el identificador del candidato, suministrado por Sun al realizar un primer examen de certificacin Java. Para la preparacin de esta segunda parte de la certificacin, puede resultar especialmente interesante el libro Designing Enterprise Applications with the J2EE Platform , as como los libros relacionados con patrones, tanto de diseo como J2EE.

SCEA Parte III


Despus de enviar el ejercicio prctico, ser necesario realizar la tercera y ltima prueba. Se trata de una prueba terica consistente en 4 preguntas sobre la forma en que hemos resuelto el ejercicio prctico de la segunda parte, siendo necesario argumentar nuestras decisiones a la hora de definir la arquitectura de nuestra solucin. El tiempo disponible para su realizacin es de 90 minutos y, al igual que la primera parte de la certificacin, esta prueba se tiene que realizar en un centro Prometric, previa adquisicin del vouncher correspondiente y concertada la prueba en dicho centro. La nota obtenida en esta tercera parte es la combinacin de la evaluacin del ejercicio prctico y de esta tercera prueba. El proceso de correccin dura entre cuatro y seis semanas, pudindose consultar el resultado de la misma en la web anteriormente citada.
http://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

18

ACTUALIDAD

Sun Certified Enterprise Architect for J2EE

Cdigos de las pruebas que componen la certificacin de arquitecto J2EE


A la hora de afrontar esta ltima prueba, no existe ninguna bibliografa que debamos revisar, siendo importante, por supuesto, haber resuelto el ejercicio prctico por nuestros propios medios y que no haya transcurrido demasiado tiempo entre la finalizacin del ejercicio prctico y la realizacin de esta ltima prueba. Una vez superadas las tres pruebas y transcurridas algunas semanas, Sun se encarga de enviar el certificado como arquitecto J2EE mediante envo postal. Nombre de la prueba Sun Certified Architect for J2EE Part I Sun Certified Ent Architect for Java J2EE tech., Assignment Sun Certified Architect for J2EE Part III Sun Certified Enterprise Architect for J2EE Technology, Assignment Resubmission memos que no es necesario abonar ninguna cantidad extra para la realizacin de la prueba. En el caso de no superar la segunda/tercera parte del examen, existe la posibilidad de volver a enviar el ejercicio prctico para que vuelva a ser evaluado, no siendo necesaria la realizacin de la tercera parte del examen. Cdigo CX-310-051 CX-310-300A CX-310-061 CX-310-300R

Proceso de Inscripcin
El proceso de inscripcin en cada uno de los exmenes es siempre el mismo. Como primer paso, debemos ponernos en contacto con Sun por telfono (902 210 412) o por correo electrnico (ses_es@sun.com) para confirmar las cantidades a abonar para cada una de las pruebas ya que stas pueden cambiar, adems en el caso de particulares no es necesario el pago del IVA de cada una de las pruebas. Una vez confirmadas las cantidades, procederemos a realizar la transferencia de la cantidad correspondiente a la cuenta indicada por Sun y haremos llegar el justificante del pago mediante fax o correo electrnico. En el caso de la primera y tercera prueba, recibiremos en la direccin que indiquemos el vouncher que utilizaremos para concertar el examen en un centro Prometric autorizado. En el caso del ejercicio prctico no recibimos vouncher ya que no debemos realizarlo en ningn centro autorizado. En los tres exmenes s recibiremos la factura correspondiente. A la hora de concertar el examen con el centro Prometric, se nos solicitar el vouncher enviado por Sun, siendo recomendable que confir-

Bibliografa
Algunos libros recomendables para la preparacin de esta certificacin se detallan a continuacin: Sun Certified Enterprise Architect for J2EE Technology: Study Guide, por Mark Cade/Simon Roberts. Sun Microsystems Press. Designing Enterprise Applications with the J2EE Platform, Second Edition, por Inderjeet Singh, Beth Stearns, Mark Johnson, and the Enterprise Team. Disponible en la web de Sun (http://www.sun.com). UML Distilled, por Martin Fowler, Kendall Scott. Addison Wesley. Applying UML and Patterns: An Intro to OOA/D and the Unified Process, por Craig Larman. Prentice-Hall. Enterprise JavaBeans, por Richard Monson-Haefel, OReilly & Associates.

Dessign Patterns: Elements of Reusable Object-Oriented Software, por Gamma et Al. Addison-Wesley. Core J2EE Patterns: Best Practices and Design Strategies, por Deepak Alur, John Crupi, Dan Malks. Sun Microsystems Press. EJB Design Patterns, por Floyd Marinescu. Wiley Computer Publishing, disponible en la web http://www.theserverside.com. Por otro lado, en Internet existen multitud de pginas donde es posible obtener informacin relativa, especialmente, a la primera parte de la certificacin como arquitecto, as como simuladores de esta primera parte. Pginas de Preparacin SCEA y Foros: http://www.stormpages.com/jnagal/index .html http://www.leocrawford.org.uk/work/jcea /part1/index.html http://prasks.webahn.com/ http://saloon.javaranch.com/cgi-bin/ ubb/ultimatebb.cgi?ubb=forum&f=26 Pginas con Simuladores del Examen SCEA parte I: http://www.ianswebpage.com/cert/scea/ scea.htm http://prasks.webahn.com/ http://www.javacoding.net/certification/ mocks/index.html

Pgina web con informacin sobre la plataforma J2EE.


http://digital.revistasprofesionales.com

Buscador de centros Prometric.

19

SOLO PROGRAMADORES n 124

DISPOSITIVOS MVILES

Juegos de calidad comercial en J2ME (III)


Uso de APIs adicionales
ALBERTO GUTIRREZ MARTNEZ (Ingeniero en Informtica y co-fundador de Flag Solutions) FRANCISCO JOS GARCA PEALVO (Profesor titular del departamento de Informtica y Automtica de la Universidad de Salamanca)

Como se est viendo a lo largo de este curso, el API de Nokia ofrece un conjunto muy avanzado de posibilidades. En esta tercera entrega estudiaremos, entre otras cosas, el control de la luz de la pantalla, la gestin del sonido, el acceso a la cmara de fotos del telfono y el envo de SMS.
Introduccin
En la entrega anterior de este curso terminamos presentando la API propietaria de Nokia, centrndonos en todo lo que a nivel grfico haca referencia. En esta tercera entrega del curso continuaremos profundizando en esta importante API para descubrir qu ms aporta a MIDP 1.0. Concluiremos este artculo con otras dos APIs opcionales, la Mobile Media API (veremos un MIDlet que accede a la cmara de nuestro telfono), y la Wireless Messaging API (con la que haremos un envo de un SMS desde nuestro programa).

Continuando con la Nokia UI API

Hacer una foto o enviar un SMS son acciones fciles de hacer con el API de Nokia
SOLO PROGRAMADORES n 124

Deteccin de teclado
Para detectar las pulsaciones de teclado a bajo nivel no necesitamos usar explcitamente la Nokia UI API, ya que MIDP 1.0 (vase la referencia 1) nos proporciona funcionalidad suficiente en este sentido. Sin embargo, vamos a ver en este apartado algunas aportaciones de esta API a la deteccin de teclado. Para este fin, empezaremos viendo el uso de la clase Canvas, que es la que en MIDP 1.0 incorpora las funciones relacionadas con este aspecto: keyPressed(int keyCode): Evento que se levanta al pulsar una tecla (o detecta la pulsacin continuada de la misma).

keyRepeated(int keyCode): Evento que se levanta mientras mantengamos pulsada una tecla. No lo utilizaremos porque se consigue una respuesta muy lenta del teclado. Como veremos en breve, usaremos otro enfoque para detectar una pulsacin continuada de teclado. keyReleased(int keyCode): Evento que se levanta al dejar de pulsar una tecla. pointerPressed(int x, int y): Evento que se levanta en terminales con pantalla tctil al pulsar con el lpiz. pointerDragged(int x, int y): Evento que se levanta en terminales con pantalla tctil al arrastrar el lpiz por la pantalla. Se levanta siempre, como es lgico, despus de un evento pointerPressed. pointerReleased(int x, int y): Evento que se levanta en terminales con pantalla tctil al levantar el lpiz. Como no estamos programando para terminales con pantalla tctil no hablaremos de los tres ltimos mtodos, que, por otra parte, no entraan ninguna dificultad en su uso. Observaremos que los tres mtodos de deteccin de teclado reciben un parmetro llamado KeyCode. Para facilitar la portabilidad de las aplicaciones J2ME, la clase Canvas tiene un mtodo que nos traduce ese KeyCode a teclas relacionadas con una accin tpica de un juego; las llamadas Game Actions. Con esto se consigue que un terminal al ejecutar nuestro juego se encargue de mapear las teclas por nosotros y que, por ejemplo, un usuario use en nuestro juego la tecla que el fabricante ha estimado ms oportuna para disparar, o las teclas de direccin para mover al personaje. El mtodo que nos provee esta traduccin es:
public int getGameAction(int keyCode)

Este mtodo nos devuelve un entero que deberemos comparar con las constantes de la clase Canvas para saber qu tecla se puls tal y como se aprecia en el listado 1. En el cdigo de este primer listado podemos observar cmo estamos detectando la pulsacin
http://digital.revistasprofesionales.com

20

DISPOSITIVOS MVILES

Juegos de calidad comercial en J2ME (III)

LISTADO 1
simultnea de la tecla de disparo y de una tecla de direccin. No tiene sentido detectar la pulsacin simultnea de dos teclas de direccin porque en los terminales telefnicos no se pueden pulsar a la vez (salvo en el nuevo Nokia N-Gage QD). Como vemos, aunque recogemos las pulsaciones en los eventos keyPressed y keyReleased, no respondemos a su pulsacin hasta el mtodo moverJugador, que forma parte de nuestro game loop del que hablaremos en prximos artculos. Si, como es nuestro caso, queremos usar la clase FullCanvas de Nokia que vimos en el artculo anterior para poner nuestros juegos a pantalla completa, como ya sabemos no podemos usar ni addCommand ni setCommandListener. Esto implica que ahora las teclas que normalmente se usaban para manejar estas rdenes en la clase Canvas (las llamadas soft keys de Nokia), se puedan detectar con la clase FullCanvas (con las Game Actions de la clase Canvas no es posible). Nuestro juego necesitar ser capaz de saber cundo el usuario pulsa las soft keys por ejemplo para pausar el juego y mostrar el tpico men que permita salir del juego o cambiar configuraciones mientras el juego ya est empezado. La clase FullCanvas aade nuevas teclas a las Game Actions adicionales a las de la clase Canvas (que tambin se pueden usar). La figura 1 muestra las constantes de la clase FullCanvas y las teclas con las que se mapean.

Deteccin de teclas con MIDP 1.0 estndar

public void keyPressed(int keyCode) { if (Canvas.FIRE == getGameAction(keyCode)) disparando=true; else TeclaPulsada=getGameAction(keyCode); } public void keyReleased(int keyCode) { if (Canvas.FIRE == getGameAction(keyCode)) disparando=false; //Le damos un valor que no se corresponda con ninguna tecla else TeclaPulsada=1000; } public void moverJugador () { switch(TeclaPulsada) { case Canvas.FIRE: mensaje=Ests pulsando DISPARO; break; case Canvas.UP: mensaje=Ests pulsando ARRIBA; break; case Canvas.DOWN: mensaje=Ests pulsando ABAJO; break; case Canvas.LEFT: mensaje=Ests pulsando IZQUIERDA; break; case Canvas.RIGHT: mensaje=Ests pulsando DERECHA; break; default: mensaje=No detecto pulsacin; break; } }

Si no vamos a necesitar que nuestro juego detecte las soft keys podemos usar sin problemas el mismo cdigo que hemos visto en

Figura 1. Mapeado de teclas de un 3650 con FullCanvas.


http://digital.revistasprofesionales.com

el listado 1. En cambio si, como es usual, estamos obligados a detectarlas, es muy recomendable cambiar nuestro cdigo por el que se presenta en el listado 2. Hay un par de cosas a resaltar en el cdigo de este segundo listado. En primer lugar, ya no estamos usando la funcin getGameAction(). Si la usramos comprobaramos que no detectamos en el switch ninguna tecla correspondiente a las constantes definidas en la clase Canvas. Por otro lado, tambin debemos fijarnos en que para detectar el disparo estamos usando la constante KEY_NUM2, correspondiente a la tecla del nmero 2 de nuestro telfono. La razn es que, salvo en la N-Gage, en el resto de telfonos de la serie 60 no se puede simultneamente pulsar la tecla de disparo y una direccin. Si nos queremos olvidar del problema de teclados tan distintos entre s, es recomendable incorporar a nuestro juego un mdulo de configuracin de teclado para que el usuario lo ponga a su gusto, y almacenar su configuracin mediante RMS (Record Management System, vase el artculo Persistencia de datos con J2ME en el nmero 119) en el telfono.

21

SOLO PROGRAMADORES n 124

DISPOSITIVOS MVILES

LISTADO 2

Deteccin de teclas con la Nokia UI API

public void keyPressed(int keyCode) { if (FullCanvas.KEY_NUM2 == keyCode || FullCanvas.KEY_SOFTKEY3 == keyCode) disparando=true; else TeclaPulsada=keyCode; } public void keyReleased(int keyCode) { if (FullCanvas.KEY_NUM2 == keyCode || FullCanvas.KEY_SOFTKEY3 == keyCode) disparando=false; //Le damos un valor que no se corresponda con ninguna tecla else TeclaPulsada=1000; } public void moverJugador () { switch(TeclaPulsada) { case FullCanvas.KEY_UP_ARROW: mensaje=Ests pulsando ARRIBA; break; case FullCanvas.KEY_DOWN_ARROW: mensaje=Ests pulsando ABAJO; break; case FullCanvas.KEY_LEFT_ARROW: mensaje=Ests pulsando IZQUIERDA; break; case FullCanvas.KEY_RIGHT_ARROW: mensaje=Ests pulsando DERECHA; break; default: mensaje=No detecto pulsacin; break; } }

Figura 2. MIDlet de vibracin y backlight.

Vibracin y control de luz de pantalla


Seguramente el lector apasionado de los juegos en los mviles habr observado cmo muchos juegos vibran cuando, por ejemplo, nuestra nave se golpea con un objeto, o cmo la pantalla parpadea cuando hay una explosin. Pues bien, estos efectos no son posibles con MIDP 1.0 (aunque s lo son con MIDP 2.0 y con la Nokia UI API). Vamos a ver un ejemplo en el que se usan algunos mtodos sencillos que nos permiten controlar la vibracin y la luz del telfono. Los mtodos relacionados con vibracin y luz pertenecen a la clase DeviceControl y son todos estticos. Son los siguientes: static void flashLights(long duration): La luz del mvil parpadear durante los milisegundos que se le indiquen en el parmetro duration. static void setLights(int num, int level): En la mayora de los casos slo podremos encender y apagar la luz trasera de la pantalla del mvil. En algunos terminales podremos elegir sobre qu luz actuar (con el parmetro num), y qu nivel de luminosidad tendr. static void startVibra(int freq, long duration): Hace vibrar el mvil a la fre-

cuencia elegida durante el tiempo elegido. Cuando llamamos a esta funcin no se queda esperando a que acabe la vibracin sino que internamente crea un hilo que la controla, por lo que podremos simultneamente realizar otra accin mientras el telfono sigue vibrando. static void stopVibra(): Para una vibracin antes del tiempo para el que se program. En el listado 3 mostramos el cdigo fuente de un MIDlet que usa estos mtodos y que tiene el aspecto que muestra la figura 2.

Figura 3. Aplicacin de capacidades sonoras en ejecucin.

(salvo en el Nokia 7650 que no soporta esta API). Las clases relacionadas con el sonido en MIDP 2.0 son un subconjunto de la Mobile Media API, que ser tratada en el siguiente apartado, sin embargo, para la mayora de los terminales Nokia que no soporten MIDP 2.0 slo tendremos como opcin usar la Nokia UI API.

Advertencia!
En cualquier telfono Nokia compatible con MIDP 2.0 no deberemos usar las clases de la Nokia UI API que se usen para el mismo fin que las que existan en MIDP 2.0. Este es el caso, por ejemplo, de las clases relacionadas con el sonido. En un 6600, por ejemplo, Nokia no asegura que la clase Sound de la Nokia UI API funcione correctamente. Lo mismo ocurre con otras clases de esta API que han sido declaradas Deprecated.

Advertencia!
Si tienes un telfono de la serie 60 de Nokia seguramente te habrs dado cuenta de que los juegos Java nunca tienen la opcin de vibracin. La razn no es otra que la falta de soporte para esta funcionalidad de la serie 60. Si pruebas el ejemplo en el emulador de la serie 60 vers que no da ningn fallo pero simplemente no ocurre nada. Lo mismo pasa con la luz trasera.

Sonido
Para reproducir sonido con MIDP 1.0 en un telfono de la serie 60 tenemos dos opciones: usar la Nokia UI API o la Mobile Media API (JSR-135)

Cuando utilizamos la Nokia UI API, nos tenemos que limitar a 3 formatos: WAV: Formato binario (array de bytes). Smart Messaging Ringtones: Formato binario (array de bytes). Tonos simples: Vienen dados por su frecuencia y duracin.
http://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

22

DISPOSITIVOS MVILES

Juegos de calidad comercial en J2ME (III)

LISTADO 3
import import import import

MIDlet con vibracin y control de luz trasera

javax.microedition.lcdui.*; javax.microedition.midlet.MIDlet; javax.microedition.midlet.MIDletStateChangeException; com.nokia.mid.ui.DeviceControl;

public class Principal extends MIDlet implements CommandListener { List myScreen; Command vibrar,flash,luzTrasera; boolean luzOn=true; public Principal() { super(); } protected void startApp() throws MIDletStateChangeException { myScreen = new List(Efectos de la NOKIA UI API, List.IMPLICIT); myScreen.append(Vibrar,null); myScreen.append(Flash,null); myScreen.append(Luz ON/OFF,null); myScreen.append(Salir,null); myScreen.setCommandListener(this); Display.getDisplay(this).setCurrent(myScreen); } protected void pauseApp() {} protected void destroyApp(boolean arg0) throws MIDletStateChangeException {} public void commandAction(Command c, Displayable d) { if (d == myScreen) { if (c == List.SELECT_COMMAND) { switch (myScreen.getSelectedIndex()) { case 0: DeviceControl.startVibra(100,2000); break; case 1: DeviceControl.flashLights(8000); break; case 2: if (luzOn) DeviceControl.setLights(0,0); else DeviceControl.setLights(0,100); luzOn=!luzOn; break; case 3: try { destroyApp(false); } catch (Exception e) { } notifyDestroyed(); break; } } } } }

Este mtodo, que en la documentacin aparece declarado como static, en la prctica no lo es y debemos instanciar un objeto de la clase Sound para poder utilizarlo. Adems, y mucho ms importante, es necesario saber que este programa dar un error irrecuperable cuando se ejecute dicho mtodo en cualquier telfono de la serie 40 developer platform 1.x. El programa del listado 4 tiene el aspecto que se ilustra en la figura 3 al ejecutarse.

Advertencia!
Hay que saber que las implementaciones de MIDP de Nokia suelen tener pequeas variaciones entre s, incluso entre distintas versiones de software de un mismo modelo de mvil! Comprobaremos en numerosas ocasiones cmo algunos mtodos de APIs soportadas no funcionan como se espera o simplemente no estn soportados. Adems, muchos de estos problemas no estn documentados, y Nokia slo da esta informacin a las empresas que forman parte del Foro Nokia Pro que es de pago. Sin embargo, Nokia pone de forma gratuita a disposicin de los desarrolladores numerosas herramientas, documentacin y foros en la direccin http://www.forum.nokia.com/main.html.

Todas las posibilidades sonoras de la Nokia UI API giran en torno a la clase Sound y a la interfaz SoundListener. Para comprender el uso de estas dos clases se ha codificado un nuevo programa, cuyas fuentes por motivos de espacio no se mostrar en su totalidad, aunque se puede encontrar en el CD-ROM que acompaa a la revista. No obstante, mostraremos las porciones de cdigo ms interesantes y las explicaremos a continuacin. El programa que hemos desarrollado en esta ocasin nos permite reproducir los tres tipos de formatos sonoros posibles, as como recoger su estado de reproduccin, que se mostrar en la parte superior del Form tal y como muestra la figura 4.

Sin embargo, cada terminal Nokia puede ser compatible o no con estos tres formatos. Cada terminal es un mundo y encontraremos telfonos como el Nokia 6230 que puede reproducir el formato MP3 de forma nativa y, sin embargo, no soporta este formato desde aplicaciones Java. Para saber qu formatos son compatibles y el nmero de sonidos concurrentes que se pueden utilizar, la clase Sound de Nokia tiene varios mtodos a tal efecto: static int getConcurrentSoundCount(int type): Devuelve el nmero de sonidos
http://digital.revistasprofesionales.com

concurrentes que se pueden reproducir del tipo dado. Normalmente, slo se podr reproducir un sonido a la vez. static int[] getSupportedFormats(): Devuelve una matriz con todos los formatos compatibles. En el listado 4 se puede apreciar cmo se utilizan estos mtodos. En este programa se muestran por pantalla todos los formatos de audio que podremos usar en J2ME para el terminal. Hay que llamar la atencin sobre una lnea del programa:
int[] formatos= miSnd.getSupportedFormats();

Figura 4. Aplicacin de reproduccin de audio en ejecucin.

23

SOLO PROGRAMADORES n 124

DISPOSITIVOS MVILES

LISTADO 4
El programa consta de dos clases, Principal.java y Sonido.java. La primera clase usa la clase Sonido, que es un envoltorio de la clase Sound, para reproducir los distintos tipos de sonido segn la opcin elegida. Adems, implementa la interfaz SoundListener (adems del CommandListener), con el que podremos detectar cundo el estado de un sonido cambia, y mostrarlo en el ttulo del Form. En el listado 5 se muestra el mtodo soundStateChanged() de la clase Principal.java que gestiona los estados del sonido. Para que se levante el evento soundState Changed le hemos aadido un mtodo a nuestra clase Sonido similar al de la clase Sound, al que invocamos desde la clase Principal (vanse los listados 6 y 7). En la clase Principal tambin es de destacar el array de bytes que se muestra en el listado 8, que no es ms que un fragmento de una cancin en formato SmartRingTone. De la clase Principal no destacaremos nada ms. Nos fijaremos ahora en la clase Sonido. Esta clase como se ha sealado antes, es un wrapper o envoltorio de la clase Sound de Nokia que facilita su uso, sobre todo a la hora de crear el sonido. La clase tiene tres constructores, uno para cada tipo de sonido. Vamos a fijarnos en el constructor que crea un sonido WAV (vase el listado 9) porque es quiz la nica parte del cdigo que no es auto explicativa, sobre todo el mtodo getTamanno(). El constructor primero llama a la funcin getTamanno() para conocer el tamao del archivo WAV que se va a abrir y reservar memoria para una matriz de bytes del mismo tamao. Posteriormente, lee el archivo a esa matriz y se la pasa al constructor de la clase Sound de Nokia. Quiz el mtodo ms interesante sea el getTamanno(). Para entenderlo hay que comprender el formato interno de un fichero WAV, cuya cabecera mostramos en la figura 5. En la cabecera de un WAV tenemos el tamao del archivo en los bytes del 8 al 5, es decir, que el archivo al que pertenece el fragmento de la figura 5 tendra un tamao de: 00 00 39 24 bytes; que es un nmero hexadecimal que transformado en decimal nos dara un tamao de: 16.628 bytes (14,28KB). Este proceso es lo que hace el cdigo del mtodo getTamanno(). Abrimos el archivo y
import import import import

MIDlet que muestra formatos de sonido compatibles

javax.microedition.midlet.MIDlet; javax.microedition.midlet.MIDletStateChangeException; com.nokia.mid.sound.Sound; javax.microedition.lcdui.*;

public class Principal extends MIDlet { Form miForm; public Principal() { super(); } protected void startApp() throws MIDletStateChangeException { miForm = new Form(Propiedades de Sonido); String msg=; try { msg=Tonos Simultneos= +Sound.getConcurrentSoundCount(Sound.FORMAT_TONE); } catch (Exception e) { msg=No Soporta Tonos; } StringItem strItm=new StringItem(Polifona, msg); miForm.append(strItm); try { msg=Wavs Simultneos= +Sound.getConcurrentSoundCount(Sound.FORMAT_WAV); } catch (Exception e) { msg=No Soporta Wavs; } strItm=new StringItem(Polifona, msg); miForm.append(strItm); //Segn la documentacin de Nokia es un mtodo esttico //pero en la prctica no lo es, y hay que crear un objeto Sound //Adems, este mtodo inexplicablemente no funciona para la serie 40 Sound miSnd=new Sound(10,1000); int[] formatos= miSnd.getSupportedFormats(); if (formatos.length > 0) { for (int i=0;i<formatos.length;i++) { switch (formatos[i]) { case Sound.FORMAT_TONE: strItm=new StringItem(Formatos Compatibles, Tonos); miForm.append(strItm); break; case Sound.FORMAT_WAV: strItm=new StringItem(Formatos Compatibles, WAV); miForm.append(strItm); break; default: strItm=new StringItem(Formatos Compatibles, Formato Desconocido); miForm.append(strItm); } } }else { strItm=new StringItem(Formatos Compatibles, Ninguno); miForm.append(strItm); } Display.getDisplay(this).setCurrent(miForm); } protected void pauseApp() {} protected void destroyApp(boolean arg0) throws MIDletStateChangeException {} }

leemos el primer entero (32 bits) y lo almacenamos en la variable cabecera que no vamos a utilizar para nada. Habramos ledo

Figura 5. Cabecera de un fichero WAV.

ya 52 49 46 46, ahora empezamos a leer byte a byte los cuatro bytes que codifican el tamao: tam4=24, tam3=39, tam2=00 y tam1=00. Para terminar se invierte el orden de las variables y se transforma el nmero obtenido a decimal. El cdigo del mtodo se recoge en el listado 10.
http://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

24

DISPOSITIVOS MVILES

Juegos de calidad comercial en J2ME (III)


Fragmento de cdigo que gestiona los estados del sonido Fragmento de cdigo que asigna el Listener de eventos de sonido con la clase Principal

LISTADO 5

LISTADO 6

// Principal.java public void soundStateChanged(Sound s, int evento) { switch (s.getState()) { case Sound.SOUND_PLAYING : myScreen.setTitle(Reproduciendo); break; case Sound.SOUND_STOPPED : myScreen.setTitle(Parado); break; case Sound.SOUND_UNINITIALIZED : myScreen.setTitle(No Inicializ.); break; } }

// Sonido.java public void setEscuchador(SoundListener miEscuchador) { soundDriver.setSoundListener(miEscuchador); }

LISTADO 7

Fragmento de cdigo que pasa la referencia de s misma a la clase Sonido

// Principal.java sonWav.setEscuchador(this);

LISTADO 8

Fragmento de un array de bytes de un SmartRingTone

Aunque habra otras maneras de cargar un archivo WAV, sta quiz sea la ms ptima, aunque como hemos visto implica conocer el formato binario del archivo. Una vez ms comprobaremos que Nokia no nos avisa de determinados fallos. Si probamos este MIDlet, nos encontraremos con varias sorpresas: En el emulador del 7210 el Smart Ring Tone se oye pero mucho ms rpido que en el terminal real, en el que la cancin s se oye como debiera. En el emulador de la serie 60, el Smart Ring Tone no se oye y ni siquiera se levanta el evento SoundListener. En el terminal real funciona perfectamente. En la documentacin de la Nokia UI API se hace referencia a que se usen los Smart Ring Tones en vez de los Simple Tones. Y es que, aunque no lo pone en ninguna parte, los tonos simples no funcionan en la serie 60 developer platform 1.x (ni en el emulador ni en el terminal real). Sin embargo, en la serie 60 developer platform 2.0 s que funcionan.

// Principal.java public byte[] data={ (byte)0x02, (byte)0x4a, (byte)0x04, (byte)0x01, (byte)0x82, (byte)0xf4, (byte)0x14, (byte)0x2f, (byte)0x21, (byte)0x02,

(byte)0x3a, (byte)0x9d, (byte)0x21, (byte)0x42, (byte)0xf4,

(byte)0x40, (byte)0x1c, (byte)0x02, (byte)0xf5, (byte)0x2f,

LISTADO 9

Constructor de sonidos de tipo WAV

public Sonido(String s,int miTipoSonido) { tipoSonido=miTipoSonido; cadena=s; int tamanno=getTamanno(); try { DataInputStream datainputstream = new DataInputStream( getClass().getResourceAsStream(cadena) ); soundData = new byte[tamanno]; datainputstream.read(soundData, 0, tamanno); datainputstream.close(); } catch(Exception exception) { exception.printStackTrace(); } soundDriver = new Sound(soundData, tipoSonido); volumen = 255; setVol(volumen); }

LISTADO 10

Cmo obtener el tamao de un fichero WAV

Advertencia!
En el MIDlet no se ha incluido ningn tipo de control para que no se pueda seleccionar el WAV en un terminal que no soporta WAVs. Esto se ha hecho as para no mezclar conceptos con el MIDlet anterior. Por ello, si en un 7210 seleccionamos WAV, la aplicacin dar un error irrecuperable.

Mobile Media API (JSR-135)


Ya conocemos esta API estndar de SUN, que como vimos no est soportada en su totalidad por la serie 60 de Nokia. En MIDP 2.0 usaremos esta API, entre otras cosas, para reproducir sonidos en vez de usar APIs de los fabricantes tal y como vimos anteriormente. En este apartado vamos a mostrar un ejemplo de una de las mltiples posibilidades que tiene esta API, capturar una instantnea con la cmara del mvil.
http://digital.revistasprofesionales.com

private int getTamanno() { InputStream is; int tamanno=-1; try { DataInputStream datainputstream = new DataInputStream(getClass().getResourceAsStream(cadena)); int cabecera = datainputstream.readInt(); int tam4 = datainputstream.read(); int tam3 = datainputstream.read(); int tam2 = datainputstream.read(); int tam1 = datainputstream.read(); tamanno = (tam1 << 24) + (tam2 << 16) + (tam3 << 8) + (tam4 << 0) + 8; datainputstream.close(); } catch (Exception e) { System.out.println(Fallo al cargar el archivo); } return tamanno; }

Advertencia!
Aunque las especificaciones del estndar hablen de que con la MMAPI (Mobile Media API) podemos reproducir y grabar audio y vdeo, sus posibilidades reales varan con cada mvil. Por poner un ejemplo, con el Nokia 3650 no se puede grabar ni audio ni vdeo, aunque s reproducir ambos y capturar fotos. Con el Nokia 6600 ya se poda grabar audio aunque no vdeo. Se puede decir, por tanto, que en cada nuevo modelo de Nokia la implementacin de la MMAPI va siendo ms completa.

La aplicacin que vamos a mostrar est basada en un documento de Nokia llamado Camera MIDlet: A Mobile Media API example y est disponible en el rea de desarrolladores de su web en http://www.forum.nokia.com. La figura 6 muestra el diagrama de clases del MIDlet. Por motivos de espacio comentaremos las porciones de cdigo ms interesantes. El

25

SOLO PROGRAMADORES n 124

DISPOSITIVOS MVILES

videoControl.getSnapshot(encoding= bmp&width=80&height=60);

En el ejemplo estamos obteniendo un array de bytes correspondiente a una imagen en formato BMP y del tamao indicado. Hay que tener cuidado pues manipulando el tamao de la imagen podramos distorsionar la imagen. Adems, no podremos especificar anchura o tamao por separado, debemos especificar siempre los dos o tendremos un error. En cuanto al parmetro encoding, tenemos tres opciones de formato compatibles: PNG (Formato por defecto). BMP. JPEG.
Figura 6. Diagrama UML del MIDlet de acceso a la cmara.

Advertencia!
Nokia no recomienda capturar imgenes superiores a 240x180 a no ser que nuestro terminal sea un Nokia 6630 o similar. Figura 7. MIDlet de acceso a la cmara.

cdigo completo del MIDlet se puede encontrar en el CD que acompaa a la revista. En el cdigo mostrado en el listado 11 estamos simplemente accediendo a la cmara del mvil. Para ello estamos obteniendo un objeto Placer de un objeto Manager, y del objeto Placer, un objeto VideoControl que es con el que jugaremos. Lo ms importante del listado 11 es el String que pasamos como parmetro al mtodo createPlayer() que se llama Capture Locutor y hace referencia a dispositivos de captura. En la documentacin de la MMAPI podemos ver una ampliacin sobre los Capture Locators en la introduccin a la clase Manager. En la prctica, si estamos programando para la serie 60 de Nokia, slo podremos usar los Capture Locutor compatibles con el terminal en particular para el que estamos programando. Para saber qu Capture Locators son o no soportados por cada terminal, no nos queda ms remedio que investigar en los foros de Nokia, as como en los documentos que ponen a nuestra disposicin. Por ejemplo, si queremos saber cules son compatibles con un Nokia 6600, existe un documento en la web de Nokia llamado Known Issues in_the Nokia 6600 MIDP 2.0. Otra lnea importante es en la que tomamos la instantnea:
byte[] pngImage = videoControl. getSnapshot(null);

LISTADO 11

Cmo acceder a la cmara

//CameraCanvas.java player = Manager.createPlayer(capture://video); player.realize(); //Cogemos el VideoControl y lo mostramos por pantalla videoControl = (VideoControl)(player.getControl(VideoControl)); if (videoControl == null) { ... } else { videoControl.initDisplayMode(VideoControl.USE_DIRECT_VIDEO,this); ... }

LISTADO 12

Convertir el array de bytes en imagen

//DisplayCanvas.java void setImage(byte[] pngImage) { image = Image.createImage(pngImage, 0, pngImage.length); }

Finalmente, para convertir la captura obtenida en una imagen normal, usamos el mtodo setImage() de la clase DisplayCanvas.java, que se recoge en el listado 12. Simplemente estamos creando una imagen inmutable leyendo el array de bytes que obtuvimos al capturar, desde el byte 0 (primer byte del array), hasta el ltimo byte del array. La figura 7 muestra la aplicacin en funcionamiento en un 3650.

Wireless Messaging API (JSR-120)


La WMA (Wireless Messaging API) es otra API opcional de SUN que nos permitir enviar y recibir mensajes SMS (Short Message System) de texto y binarios. Los SMS de texto ya los conocemos todos, pero quiz los SMS binarios no sean tan conocidos a pesar de estar tan de moda ltimamente. Los SMS binarios son mensajes que usan el protocolo Short Message

Sobre el parmetro que le pasamos al mtodo getSnapShot(), en nuestro caso le hemos pasado null, con lo que obtendremos en la serie 60 de Nokia una imagen en formato PNG (Portable Network Graphics, vase la referencia 2) con un tamao de 160x120 pxeles. Podremos jugar con este parmetro de la forma siguiente:

Service para enviar informacin que ser interpretada slo por algunos terminales. Por ejemplo, los logotipos de Nokia y los RingTones son ejemplos de informacin binaria que se pueden enviar en un SMS y que slo ser vlida para un terminal Nokia o compatibles. Esta API nos abstraer de la red que haya por debajo y como es lgico no nos importar si el SMS se enviar bajo GSM (Group Special Mobile o Global System for Mobile), CDMA (CodeDivision Multiple Access), etc. Es importante no confundir esta API con la Nokia SMS API, que es anterior en el tiempo a la WMA, y slo fue soportada por el Nokia 3410. Sus caractersticas eran similares a las de la WMA salvo que tena una funcionalidad muy parecida al Push WAP de MIDP 2.0 que no es objeto de estudio en la presente serie de artculos. La WMA es una API con pocas clases y sencilla de aprender si se parte de un ejemplo que
http://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

26

DISPOSITIVOS MVILES

Juegos de calidad comercial en J2ME (III)

LISTADO 13
muestre el funcionamiento, por eso vamos a mostrar un ejemplo auto explicativo de cmo enviar un SMS desde nuestro MIDlet. Con el cdigo del listado 13 se enva un SMS al telfono (inexistente) 751862661 de Espaa. Afortunadamente, para evitar la existencia de MIDlets malintencionados que se dedicaran a enviar mensajes SMS indiscriminadamente, en el momento de ejecutarse el send nos aparecer un mensaje de confirmacin de la interfaz del telfono para avisarnos de que se va a enviar un SMS, y podremos abortar el envo. Es importante saber que podremos enviar grandes extensiones de texto y no tener la limitacin de los 160 caracteres de un SMS. La interfaz MessageConnection tiene un mtodo para calcular el nmero de SMSs necesarios para enviar un texto dado (numberOfSegments), por si el usuario de nuestro MIDlet quiere calcular cunto le va a costar el envo que nuestro MIDlet, y como hemos dicho antes, siempre en ltimo trmino el usuario ser quien tenga la ltima palabra para realizar o no el envo de informacin. Para poder enviar MMS ya existe una nueva especificacin de WMA, la JSR-205. Aunque todava deberemos esperar un tiempo a que est implementada en los telfonos Nokia.

Envo de un SMS

try { String addr = sms://+34751862661; MessageConnection conn = (MessageConnection)Connector.open(addr); TextMessage msg = (TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE); msg.setPayloadText(Hola!); conn.send(msg); } catch (Exception e) { }

Compilacin y ejecucin de los ejemplos


Para compilar y ejecutar los ejemplos propuestos no ser suficiente con el J2ME Wireless Toolkit de Sun, puesto que los fragmentos de cdigo aqu propuestos usan la API especfica para terminales Nokia. Las herramientas necesarias para probar los ejemplos incluidos en el CD-ROM son, el propio J2ME Wireless Toolkit de Sun (http:// java.sun.com/products/j2mewtoolkit/download-2_2.html) y, adems, el Nokia Developers Suite for J2ME (http://www.forum.nokia.com/main/ 0,6566,034-2,00.html). Ambos paquetes de software estn a disposicin del desarrollador y pueden descargarse libremente. En el caso del Nokia Developers Suite ser necesario completar un proceso de registro y obtener as un nmero de licencia, necesario para la instalacin. Todo este

proceso queda explicado en la pgina de descarga del producto. Una vez descargados ambos productos, se proceder a la instalacin de J2ME Wireless Toolkit de Sun. Es posible que el lector ya tenga instalado este entorno, puesto que ha sido objeto de estudio en nmeros anteriores de Slo Programadores. Despus se proceder a la instalacin del Nokia Developers Suite, eligiendo la instalacin standalone (opcin por defecto). Despus de superar la instalacin de ambos productos, se proceder a la configuracin de la herramienta KToolbar del J2MEWTK. Para ello, habr que copiar el contenido de la carpeta C:\Nokia\Devices (de la instalacin del Nokia Developers Suite) dentro de la carpeta C:\WTK22\wtklib\devices (de la instalacin del J2MEWTK). Con esto, habremos aadido a nuestro entorno J2MEWTK los emuladores para los terminales Nokia (de los emuladores instalados slo se garantiza el correcto funcionamiento del Series_60_MIDP_Concept_ SDK_Beta_0_3_1_Nokia_edition). Para ejecutar los ejemplos incluidos en el CDROM tendremos dos posibilidades, totalmente equivalentes. La primera, es copiar las carpetas que hay dentro del directorio Proyectos del CD-ROM en el directorio C:\WTK22\apps de nuestro J2MEWTK. Despus, ejecutar la herramienta KToolbar y pulsar en Open Project. En la lista de proyectos, podremos ver los proyectos aadidos, puesto que cada una de las carpetas incluidas en directorio Proyectos del CD-ROM corresponde a un proyecto. Despus de abrir un proyecto, escogeremos en la pestaa Device uno de los emuladores que hemos importado al J2MEWTK, para luego pulsar en Build y luego en Run. Otra opcin para ejecutar los ejemplos consiste en crear nosotros mismos el proyecto. Para ello, habr que pulsar

en New Project de KToolbar y nombrar el proyecto, para luego escribir el nombre de la clase principal. Una vez hecho esto, el propio KToolbar nos indicar dnde copiar los fuentes para luego poder compilar y ejecutar el proyecto. El lector encontrar los fuentes en el directorio Codigo del CD-ROM. Es necesario entender que ambos procedimientos son equivalentes, y que por lo tanto el cdigo del directorio Codigo tambin se encuentra incluido en los proyectos del directorio Proyectos (dentro del directorio src correspondiente).

Conclusiones
Con este artculo ya hemos completado los conocimientos tcnicos necesarios para estar en disposicin de crear un juego que supere las limitaciones de los terminales MIDP 1.0. En este artculo hemos visto cmo los fabricantes de juegos Java, hasta la aparicin de los presentes terminales MIDP 2.0, todava no demasiado extendidos entre los potenciales usuarios de nuestros juegos, tienen que recurrir a APIs adicionales que son soportadas con diferentes matices segn el terminal. Se aprecia por tanto la gran dificultad que entraa el desarrollo de juegos realmente multiplataforma, sin tener que recurrir a distintas compilaciones de un mismo cdigo fuente adaptado a cada telfono. En este sentido existen iniciativas muy interesantes como es el proyecto J2ME Polish que se puede conocer en la direccin http://www.j2mepolish.org/. En el prximo artculo nos pondremos manos a la obra y configuraremos el IDE gratuito Eclipse (http://www.eclipse.org/) para facilitarnos la labor de programar en J2ME no estndar, para lo cul tambin instalaremos y configuraremos algunas herramientas gratuitas de Nokia.

Agradecimientos
Se quiere agradecer a la empresa Flag Solutions (http://www.flagsolutions.net) y al grupo AWEG (Adaptive Web Engineering Group) de la Universidad de Salamanca sus aportaciones y consejos para la elaboracin de este artculo.

Referencias
[1] [2] SUN MICROSYSTEMS JSR-37 (15 Diciembre 2000). MIDP (Mobile Information Device Profile) http://java.sun.com/products/midp/index.jsp. W3C. Portable Network Graphics (PNG) Specification (Second Edition). Information technology Computer graphics and image processing Portable Network Graphics (PNG): Functional specification. ISO/IEC 15948:2003 (E). W3C Recommendation 10 November 2003. http://www.w3.org/TR/PNG/.

http://digital.revistasprofesionales.com

27

SOLO PROGRAMADORES n 124

MIDDLEWARE

Programacin distribuida en .NET (II)


DIEGO LZ. DE IPIA GZ. DE ARTAZA (Profesor del departamento de Ingeniera del Software de la facultad de Ingeniera de la Universidad de Deusto (ESIDE)).

Tras conocer en la primera entrega las piedras angulares de la programacin distribuida a bajo nivel: sockets, multithreading y XML, ahora analizamos .NET Remoting, la tecnologa por excelencia para el desarrollo de aplicaciones distribuidas en .NET.
Introduccin
ASP.NET es una herramienta adecuada para la construccin de clientes ligeros que slo visualizan lenguaje de marcado a travs de un navegador. Sin embargo, hay aplicaciones que: Se benefician de un mayor acoplamiento entre el cliente y el servidor. Se comportan mejor en la comunicacin a dos bandas entre el cliente y el servidor. Requieren utilizar la red de manera ms ptima y facilitar el mantenimiento de sesiones. En .NET, el espacio de nombres System.Runtime. Remoting provee la infraestructura para el desarrollo de este tipo de aplicaciones. .NET Remoting sustituye a la tecnologa DCOM para crear aplicaciones distribuidas sobre plataformas Windows. Proporciona una arquitectura orientada a objetos que como todo buen middleware otorga transparencia de localizacin a los componentes distribuidos. En Remoting, los componentes de una aplicacin pueden concentrarse en un nico ordenador o en mltiples nodos alrededor de Internet, sin que el consumidor de tales servicios sepa que dichos componentes estn distribuidos. Remoting permite invocar mtodos y pasar objetos ms all de los dominios de nuestra aplicacin de una manera sencilla, flexible y muy configurable. Combina estndares ya existentes como: SOAP (Simple Object Access Protocol), para codificacin de mensajes, o HTTP y TCP, como protocolos de comunicacin, con formateadores binarios propietarios destinados a conseguir un alto rendimiento en las comunicaciones. Bsicamente, .NET

Remoting consiste en un conjunto de servicios y canales de comunicacin que transmiten mensajes entre aplicaciones remotas, con la ayuda de formateadores que codifican y decodifican esos mensajes. A continuacin estudiamos en detalle esta poderosa herramienta de programacin distribuida.

.NET Remoting bsico


En .NET, una clase es remota cuando puede ser usada por clientes en otro dominio de aplicacin, es decir, en el mismo proceso, en otro proceso o en otras mquinas. Para construir una clase remota hay que seguir los siguientes pasos: 1. Derivar la clase de System.MarshalBy RefObject. Por ejemplo:
public class ClaseRemota: MarshalBy RefObject { ... }

Gracias a .NET Remoting los objetos de nuestra aplicacin podrn residir en mquinas remotas
SOLO PROGRAMADORES n 124

Cuando un cliente cree una instancia de ClaseRemota, realmente se crear un proxy de la misma. Un proxy es un objeto que pretende ser otro. Es decir, llamadas recibidas por el proxy son transmitidas al objeto remoto a travs de un canal que conecta los dos dominios de aplicacin. Realmente el cliente slo mantiene una referencia al objeto, no una copia del mismo. El cliente interacta con un objeto local, el proxy, que encapsula las complejidades de la comunicacin distribuida con un objeto remoto. 2. Registrar la clase para que pueda ser activada desde otro dominio de aplicacin. Una clase remota se puede registrar a travs de dos mtodos estticos definidos en System.Runtime.Remoting. RemotingConfiguration: RegisterActivated ServiceType y RegisterWellKnownServiceType. Asimismo, en .NET Remoting se pueden definir dos tipos de objetos remotos: (1) server-activated y (2) client-activated.

Objetos activados en la parte cliente o en la parte servidora


Los objetos activados en la parte servidora (serveractivated) tienen las siguientes propiedades: Se registran con RegisterWellKnown ServiceType y RegisterWellKnownClient Type.
http://digital.revistasprofesionales.com

28

MIDDLEWARE

Programacin distribuida en .NET (II)


ClaseRemota cr = new ClaseRemota();

Cuando el cliente invoca new slo se crea un proxy en la parte cliente, el objeto no se crea en la parte servidora hasta que una invocacin es recibida. Slo se pueden usar constructores por defecto sin parmetros. Por su parte, los objetos activados en la parte cliente (client-activated): Se registran con RegisterActivated ServiceType y RegisterActivatedClientType. El objeto remoto se crea en la parte servidora inmediatamente despus de llamar a new en el cliente. Se pueden activar con constructores con parmetros. Cuando registras un objeto activado en la parte servidora se pueden especificar dos modos de comportamiento: WellKnownObjectMode.SingleCall, se crea una nueva instancia de la clase remota por cada invocacin recibida de un cliente. WellKnownObjectMode.Singleton, se crea una instancia de la clase remota para procesar todas las llamadas de los clientes. Los objetos activados en la parte del cliente ofrecen slo un modo de activacin. Cada llamada a new por un cliente crear una instancia en el servidor que preserva estado de una llamada a otra. Si se desea mantener estado por cada cliente, este modo de activacin es idneo para ello. A modo de ejemplo, el siguiente fragmento de cdigo activa un objeto de tipo ClaseRemota en la parte servidora, bajo la URI ClaseRemota, con un comportamiento SingleCall, es decir, se crear una instancia del objeto por cada peticin recibida:
RemotingConfiguration.RegisterWell KnownServiceType ( typeof(ClaseRemota), // Clase remota ClaseRemota, // URI de la clase remota WellKnownObjectMode.SingleCall // Modo de comportamiento );

son transportados a los objetos por medio del canal. De la misma forma son transportadas las respuestas a esa invocacin. Hay dos tipos de canales predefinidos en .NET: Canales TCP (TcpServerChannel y TcpClient Channel) usan TCP para comunicarse y transmiten datos, por defecto, en formato binario. Son adecuados cuando el rendimiento es lo importante, ya que los datos se transmiten por medio del formato de serializacin binario diseado para .NET Remoting. Canales HTTP (HttpServerChannel y HttpClientChannel) usan HTTP para comunicarse. Lo ms normal es que transporten mensajes de tipo SOAP. Son adecuados cuando lo que prima es la interoperabilidad. El canal HTTP es comnmente utilizado para las comunicaciones en Internet. Una interesante propiedad de los objetos que usan estos canales es que permiten el uso de IIS como su agente de activacin. El siguiente fragmento ilustra cmo crear un canal TCP en la parte servidora escuchando en el puerto 1234:
TcpServerChannel channel = new Tcp ServerChannel(1234); ChannelServices.RegisterChannel(channel);

La infraestructura .NET Remoting es altamente configurable y extensible. Es perfectamente posible definir nuevos canales y formateadores a travs de .NET Remoting que permitan comunicarse con servicios/objetos distribuidos desarrollados con otras populares herramientas de programacin distribuida, como CORBA, RMI o Tibco RV. Un buen ejemplo de ello ha sido la integracin del protocolo IIOP de CORBA en .NET con la extensin Remoting.CORBA, incluida en el CD-ROM y disponible en http://remotingcorba.sourceforge.net. Gran parte de la capacidad de interoperabilidad de .NET Remoting es debida a que integra SOAP. Aunque no es el protocolo ms eficiente, permite gran flexibilidad. SOAP es un protocolo basado en XML que especifica un mecanismo mediante el cual aplicaciones distribuidas pueden intercambiar informacin independientemente de la plataforma. Aunque, normalmente, SOAP es usado junto con HTTP para su transporte, SOAP puede utilizar cualquier protocolo de transporte (por ejemplo SMTP). Para ms detalles visitar http://www.w3.org/TR/SOAP/.

Por su parte, una aplicacin cliente que quiera crear una instancia de una clase remota tambin tiene que registrarse. Para que un cliente pueda hablar con la parte servidora de una clase remota, escuchando en un TcpServer Channel, debera crear un TcpClientChannel. Si el cliente quiere usar new para instanciar un objeto remoto, debe registrar la clase remota en el dominio de aplicacin local. RegisterWellKnownClientType registra una clase en el cliente correspondiente a una clase RemotingConfiguration.RegisterWellKnown ServiceType en el servidor. El siguiente cdigo muestra cmo hacerlo para el caso de ClaseRemota:
TcpClientChannel channel = new Tcp ClientChannel(); ChannelServices.RegisterChannel(channel); RemotingConfiguration.RegisterWell KnownClientType( typeof(ClaseRemota), // Tipo de la clase remota tcp://localhost:1234/ClaseRemota // URL de la clase remota );

Interoperabilidad vs. rendimiento en .NET Remoting


La figura 1 muestra las posibilidades de explotacin ofrecidas por .NET Remoting. En la parte servidora podemos tener servidores configurados con un canal TCP que son utilizados por clientes locales dentro de una LAN. En ese caso, para la transmisin de datos se usa el mecanismo ms eficiente, transmisin en binario. Por otro lado, en la parte servidora podemos tener un servidor con un canal HTTP que ha sido activado por IIS. La informacin transmitida entre este servidor y sus potenciales clientes se realiza por medio del estndar SOAP. Obsrvese que esta configuracin IIS + canal HTTP/SOAP es ideal para situaciones donde deseamos alojar un servicio detrs de un cortafuegos que slo tolera conexiones remotas va HTTP en el puerto 80. Al utilizar SOAP los clientes no tienen porque necesariamente haberse programado en .NET Remoting. Clientes web estndar desarrollados bien con .NET u otros lenguajes como Java o Python podran utilizarse. Consecuentemente, si queremos interoperabilidad adoptaremos una solucin basada en canales HTTP y SOAP. Si queremos mximo rendimiento utilizaremos TCP y formateo binario. La primera opcin ser ideal cuando queremos que nuestro servicio sea consumido por clientes externos y se encuentre protegido

Canales en .NET Remoting


Para hacer que una clase remota sea accesible por clientes, el proceso servidor tiene que crear y registrar un canal (channel). Un canal es un conducto para transportar los mensajes desde y hacia los objetos remotos. La misin de un canal es tomar datos, crear un paquete segn las especificaciones de un protocolo y enviar el paquete a otro ordenador. Cuando un cliente invoca remotamente un mtodo, los parmetros y otros detalles referidos a la invocacin
http://digital.revistasprofesionales.com

Una vez que el cliente y el servidor han efectuado sus registros correspondientes se crea la instancia de ClaseRemota:

29

SOLO PROGRAMADORES n 124

MIDDLEWARE

a este problema es el registro declarativo en .NET. Este mecanismo toma informacin de un fichero que es procesado al invocar al mtodo esttico RemoteConfiguration.Configure. Modificar el cliente para consumir el objeto Reloj alojado ahora en otra mquina sera tan sencillo como editar su fichero de configuracin asociado ClienteReloj.exe.config.

Transfiriendo objetos como argumentos en .NET Remoting


A veces es necesario pasar a un mtodo como parmetro de entrada o salida un objeto. Cuando el objeto es pasado por valor, el marco de Remoting se encarga de hacer una copia completa del objeto para que pueda ser enviado a travs de un canal. En el framework .NET existen dos formateadores de serializacin que se encargan de codificar y decodificar los mensajes: .NET binario (System.Runtime.Serialization. Formatters.Binary) y SOAP (System.Runtime. Serialization.Formatters.SOAP). Si un objeto tiene una gran cantidad de informacin (el contenido de una tabla de una BBDD), ser adecuado pasarlo por referencia, y luego utilizar la referencia recibida en el cliente para ir progresivamente, segn demanda, recuperando el contenido del mismo. cdigo para registrar canales y clases remotas. En consecuencia, si deseamos cambiar la direccin IP o el puerto en el que escucha un servicio debemos recompilar el cdigo. La solucin

Figura 1. Arquitectura de .NET Remoting.

tras un cortafuegos. La segunda ser adecuada para el desarrollo de aplicaciones distribuidas eficientes a utilizar dentro de una LAN.

Creacin de proxies
Para generar un proxy de un objeto remoto no es siempre necesario ni conveniente utilizar
Reloj.cs

Nuestra primera aplicacin con .NET Remoting


Apliquemos los conceptos aprendidos hasta el momento desarrollando un sencillo servicio distribuido que devuelve la hora actual en .NET Remoting. En primer lugar, creamos una clase que hereda de System.MarshalByRefObject (vase el listado 1). A continuacin, creamos la clase Servidor Reloj que usa un canal TCP para recibir peticiones dirigidas al objeto remoto Reloj activado en el servidor con modo de comportamiento SingleCall (vase el listado 2). Finalmente, creamos la clase ClienteReloj que simplemente se conecta a travs de un canal TCP con el objeto remoto Reloj e invoca su mtodo ObtenerHoraActual (vase el listado 3). La figura 2 muestra esta aplicacin en ejecucin.

LISTADO 1
// compilar: csc /t:library Reloj.cs using System; public class Reloj: MarshalByRefObject { public string ObtenerHoraActual() { return DateTime.Now.ToLongTimeString(); } }

LISTADO 2

ServidorReloj.cs

Configuracin declarativa
Las clases ServidorReloj y ClienteReloj usan informacin de configuracin embebida en el

// compilar: csc /r:Reloj.dll ServidorReloj.cs using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; class ServidorReloj { static void Main() { TcpServerChannel channel = new TcpServerChannel(1234); ChannelServices.RegisterChannel(channel); RemotingConfiguration.RegisterWellKnownServiceType( typeof(Reloj), Reloj, WellKnownObjectMode.SingleCall); Console.WriteLine(Pulsar INTRO para continuar ...); Console.ReadLine(); } }

SOLO PROGRAMADORES n 124

30

http://digital.revistasprofesionales.com

MIDDLEWARE

Programacin distribuida en .NET (II)

ConversorRomanoArabe con canal TCP


En el fichero IConversorRomanoArabe.cs (adjunto en el CD-ROM) hemos colocado las clases ConversorRomanoArabeConstants y Usuario, y la interfaz IConversorRomanoArabe La clase . ConversorRomanoArabeConstants declara todas las constantes utilizadas para el desarrollo de este servicio. Por ejemplo la enumeracin NumeroRomanoEnum es un mapa de valores en romano a decimales (rabes):
ClienteReloj.cs
public enum NumeroRomanoEnum {I=1, V=5, X=10, L=50, C=100, D=500, M=1000}

Figura 2. Ejecucin de la aplicacin distribuida Reloj.

LISTADO 3

// csc /r:Reloj.dll ClienteReloj.cs using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; class ClienteReloj { static void Main() { TcpClientChannel channel = new TcpClientChannel(); ChannelServices.RegisterChannel(channel); RemotingConfiguration.RegisterWellKnownClientType( typeof(Reloj), tcp://localhost:1234/Reloj); Reloj reloj = new Reloj(); Console.WriteLine(reloj.ObtenerHoraActual()); } }

new. El uso de new obliga al cliente a tener acceso a la implementacin del objeto remoto (su dll o exe) para generar su proxy. La clase System.Activator ofrece un par de mtodos estticos que nos permiten instanciar proxies de objetos remotos simplemente teniendo acceso a su interfaz: GetObject se usa para activar objetos en la parte servidora. CreateInstance se usa para activar objetos en la parte cliente. Si utilizamos cualquiera de los mtodos en System.Activator ya no ser necesario usar RegisterActivatedClientType o Register WellKnownClientType. Por ejemplo, hasta ahora hemos visto que para crear una instancia de un proxy en la parte cliente haramos:
RemotingConfiguration.RegisterWell KnownClientType(typeof(Reloj), tcp://localhost:1234/Reloj); Reloj r = new Reloj();

remoto sin poseer otro conocimiento que su URL y una interfaz que soporta el tipo:
IReloj r = (IReloj)Activator.GetObject (typeof(IReloj), tcp://localhost:1234 /Reloj);

O bien:
object[] url = {new UrlAttribute(tcp: //localhost:1234)}; IReloj r = (IReloj)Activator.Create Instance(typeof(IReloj), null, url);

Transformando el ConversorRomanoArabe a .NET Remoting


Vamos a utilizar ahora los conceptos mostrados sobre .NET Remoting para transformar la aplicacin de conversin de nmeros romanos a rabes (vista en la entrega anterior), y viceversa, a una aplicacin en .NET Remoting. Los pasos que seguiremos sern: 1. Transformacin del conversor a un servidor .NET Remoting con canal TCP, configurado de manera programtica. 2. Transformacin del conversor a un servidor .NET Remoting con canales TCP y HTTP, configurado declarativamente. 3. Activacin del servidor de conversin mediante IIS.

O bien:
RemotingConfiguration.RegisterActiva tedClientType(typeof(Reloj), tcp:// localhost:1234); Reloj r = new Reloj();

Sin embargo, con GetObject y CreateInstance se puede activar un objeto


http://digital.revistasprofesionales.com

La clase Usuario es un objeto serializable, est marcado por el atributo [Serializable], que sirve para encapsular los detalles de logeo de un usuario que desea utilizar el servicio ConversorRomanoArabe. El listado 4 muestra su cdigo. En el listado 5 se muestra la interfaz que define el contrato ofrecido por el servicio de conversin. Todo cliente (ConversorRomanoArabeClient) deber ajustarse a ese contrato para poder comunicarse con el objeto remoto que implementa tal interfaz (ConversorRomanoArabe). A diferencia de nuestra anterior implementacin del servicio mediante sockets (esta implementacin fue vista en la primera entrega del curso), hemos incluido un par de mtodos Login y Logoff, que debern invocarse antes y despus de acabar de consumir el servicio, respectivamente. Login devuelve un token de autenticacin que ser enviado junto con cada peticin de conversin. De esa manera, evitaremos que usuarios no autorizados tengan acceso a nuestro valioso servicio distribuido. La implementacin del servicio Conversor RomanoArabe en .NET Remoting se muestra en el listado 6. Esta clase remota hereda como siempre de MarshalByRefObject e implementa la interfaz IConversorRomanoArabe. El constructor de esta clase simplemente inicializa una tabla que mapea nombres de usuario a contraseas (usuarios) y una lista con los tokens asignados a clientes autorizados. El mtodo Login simplemente verifica que el nombre de usuario y contrasea pasados existen en la tabla usuarios, y en caso afirmativo genera un token de autorizacin para el cliente. Este token deber ser utilizado por dicho cliente cada vez que requiera una conversin, es decir, use el servicio ConversorRomanoArabe. El listado 7 muestra cmo antes de efectuarse la conversin se verifica que el token pasado como argumento es vlido.

31

SOLO PROGRAMADORES n 124

MIDDLEWARE

LISTADO 4

Clase Usuario

[Serializable] public class Usuario { private string nombreUsuario; private string contrasea; public Usuario(string nombreUsuario, string contrasea) { this.nombreUsuario = nombreUsuario; this.contrasea = contrasea; } public string NombreUsuario { get { return this.nombreUsuario; } set { this.nombreUsuario = value; } } public string Contrasea { get { return this.contrasea; } set { this.contrasea = value; } } }

Figura 3. Cliente del servicio ConversorRomanoArabe programado con .NET Remoting.

ArabeServer tan slo tendremos que colocar la siguiente sentencia para configurar el canal y modos de activacin de este servicio:
RemotingConfiguration.Configure (ConversorRomanoArabeServer.exe. config);

LISTADO 5

Interfaz IConversorRomanoArabe

public interface IConversorRomanoArabe { bool Login(Usuario usuario, out string token); bool Logoff(string token); string ArabeARomano(string token, int num); int RomanoAArabe(string token, string numRomano); }

Esta sentencia simplemente indica que el fichero ConversorRomanoArabeServer.exe.config (vase el listado 10) contiene la configuracin del servidor. Obsrvese que ahora este servidor es accesible a travs de tanto un canal TCP en el puerto 1234 como un canal HTTP en el puerto 8080. Por otra parte, las modificaciones necesarias para permitir la programacin declarativa del cliente seran:
RemotingConfiguration.Configure (ConversorRomanoArabeClient.exe. config);

El listado 8 muestra cmo de manera programtica se configura el tipo de canal, puerto y modo de comportamiento del servicio ConversorRomanoArabe. En este caso utilizamos un canal de tipo TCP y activamos el objeto en el servidor tras recibir una invocacin del cliente. Todos los clientes comparten la misma instancia del servidor, ya que el modo de comportamiento del objeto es Singleton. Finalmente, en el listado 9 mostramos el cdigo de un cliente que utiliza el servicio ConversorRomanoArabe. La figura 3 muestra un cliente de .NET Remoting utilizando el servicio ConversorRomanoArabe.

LISTADO 6

Constructor y mtodo Login de ConversorRomanoArabe

namespace ConversorRomanoArabe { public class ConversorRomanoArabe: MarshalByRefObject, IConversorRomanoArabe { private Hashtable usuarios; private ArrayList tokens; public ConversorRomanoArabe() { this.usuarios = new Hashtable(); this.usuarios.Add(solop, solop); this.tokens = new ArrayList(); } public bool Login(Usuario usuario, out string token) { if (this.usuarios.ContainsKey(usuario.NombreUsuario) && (string)this.usuarios[usuario.NombreUsuario] == usuario.Contrasea) { token = usuario.NombreUsuario + : + usuario.Contrasea + System.DateTime.Now; this.tokens.Add(token); return true; } else { token = ; return false; } } // ... } }

ConversorRomanoArabe con canal HTTP declarativo


Analicemos ahora cmo modificar el conversor para que de manera declarativa, tan slo modificando un par de ficheros de configuracin y sin recompilar, consigamos modificar el tipo de canal o puerto utilizado por Conversor RomanoArabe. En la clase ConversorRomano

SOLO PROGRAMADORES n 124

32

http://digital.revistasprofesionales.com

MIDDLEWARE

Programacin distribuida en .NET (II)

LISTADO 7

Modificacin del mtodo ArabeARomano de ConversorRomanoArabe

public class ConversorRomanoArabe: MarshalByRefObject, IConversorRomanoArabe { // ... public string ArabeARomano(string token, int num) { if (this.tokens.Contains(token)) { // ... Implementacin del mtodo } else { throw new ApplicationException(El token pasado no es vlido); } } }

LISTADO 8

Bloque Main del ConversorRomanoArabeServer

public class ConversorRomanoArabeServer { static void Main() { TcpServerChannel channel = new TcpServerChannel(1234); ChannelServices.RegisterChannel(channel); RemotingConfiguration.RegisterWellKnownServiceType( typeof(ConversorRomanoArabe), ConversorRomanoArabe, WellKnownObjectMode.Singleton); Console.WriteLine(Pulsar Enter para continuar ...); Console.ReadLine(); } } WellKnownClientTypeEntry[] serviceMetadata = RemotingConfiguration. GetRegisteredWellKnownClientTypes(); IConversorRomanoArabe conversor = (IConversorRomanoArabe)Activator.Get Object(typeof(IConversorRomanoArabe), serviceMetadata[0].ObjectUrl); // ... cdigo que usa el conversor

con IIS es an mejor, dado que podemos hacer que nuestro servidor transparentemente escu-

che a travs del puerto 80 normalmente abierto en todos los cortafuegos. En primer lugar, usaremos el gestor de IIS (inetmgr) para crear un directorio virtual. Haremos clic con el botn derecho del ratn sobre Sitios Web por Defecto y seleccionaremos Nuevo -> Directorio Virtual. Introduciremos el nombre Conversor RomanoArabe y lo asociaremos a un directorio de nuestro disco duro en el que hemos colocado el cdigo fuente de la aplicacin (como siempre, disponible en el CD-ROM). A continuacin crearemos un fichero web.config en ese directorio con el contenido mostrado en el listado 12. La figura 4 ilustra la configuracin del directorio virtual con inetmgr. El cdigo para el servicio Conversor RomanoArabe ser el mismo que hasta ahora. La nica salvedad es que ahora no necesitaremos definir la clase Conversor RomanoArabeServer, ya que la activacin del servicio la realizar IIS. Por otro lado, el cdigo del cliente tampoco cambiar, tan slo el fichero de configuracin ConversorRomanoArabeClient.exe.config requerir una mnima modificacin para utilizar la nueva URI del objeto remoto ahora acti-

LISTADO 9

Clase ConversorRomanoArabeClient

De nuevo, se hace uso de un fichero de configuracin (vase el listado 11) para determinar los parmetros de conexin al componente servidor. En este caso se elige utilizar el canal HTTP. Recordar que a travs de la programacin declarativa podremos cambiar la ubicacin (direccin IP) y nmero de puerto del servidor sin necesidad de recompilar el cdigo del servidor o los clientes.

class ConversorRomanoArabeClient { static void Main() { TcpClientChannel channel = new TcpClientChannel(); ChannelServices.RegisterChannel(channel); IConversorRomanoArabe conversor = (IConversorRomanoArabe)Activator.GetObject( typeof(IConversorRomanoArabe), tcp://localhost:1234/ConversorRomanoArabe); string token; if (conversor.Login(new Usuario(solop, solop), out token)) { string numRomano = conversor.ArabeARomano(token, 1295); Console.WriteLine(El nmero rabe 1295 convertido a romano es: + numRomano); conversor.Logoff(token); } } }

ConversorRomanoArabe activado por IIS


Como ltima mejora de nuestro conversor vamos a hacer que el servidor web IIS lo active en demanda al recibir conexiones de clientes. De esta manera nos evitamos la tediosa tarea de tener que manualmente arrancar el servidor, y de tenerlo que mantener en ejecucin incluso cuando nadie lo est utilizando. Una alternativa a la activacin va IIS podra haber sido la creacin de un servicio Windows con este servidor .NET Remoting. No obstante, la activacin
http://digital.revistasprofesionales.com

LISTADO 10

Fichero de configuracin ConversorRomanoArabeServer.exe.config

<configuration> <system.runtime.remoting> <application> <service> <wellknown mode=Singleton type=ConversorRomanoArabe.ConversorRomanoArabe, ConversorRomanoArabeServer objectUri=ConversorRomanoArabe /> </service> <channels> <channel ref=http server port=8080 /> <channel ref=tcp server port=1234 /> </channels> </application> </system.runtime.remoting> </configuration>

33

SOLO PROGRAMADORES n 124

MIDDLEWARE

LISTADO 11

Fichero de configuracin ConversorRomanoArabeClient.exe.config

Figura 4. Directorio virtual ConversorRomanoArabe en IIS.

<configuration> <system.runtime.remoting> <application> <client> <wellknown type=ConversorRomanoArabe.IConversorRomanoArabe, IConversorRomanoArabe url=http://localhost:8080/ConversorRomanoArabe /> </client> <channels> <channel ref=http client /> </channels> </application> </system.runtime.remoting> </configuration>

vado por IIS en el puerto 80 y bajo el contexto ConversorRomanoArabeServer. A continuacin mostramos la nica modificacin con respecto a la anterior versin del fichero:
<client> <wellknown type=ConversorRomano Arabe.IConversorRomanoArabe, IConversorRomanoArabe url=http: //localhost/ConversorRomanoArabe/ ConversorRomanoArabe.rem /> </client>

LISTADO 12

Fichero web.config para el Directorio Virtual ConversorRomanoArabe

<configuration> <system.runtime.remoting> <application> <service> <wellknown mode=Singleton type=ConversorRomanoArabe.ConversorRomanoArabe, ConversorRomanoArabeServer objectUri=ConversorRomanoArabe.rem/> </service> </application> </system.runtime.remoting> </configuration> csc /t:library /out:bin\Conversor RomanoArabeServer.dll /r:bin\IConversor RomanoArabe.dll ConversorRomanoArabe Server.cs

Algo importante a resear es que deberemos colocar la dll con el cdigo del objeto remoto en el subdirectorio bin del directorio donde est colocado el web.config, ya que es donde lo busca IIS. Es decir, asumiendo que los ficheros .cs estn en el mismo directorio que el web.config, compilaremos los ficheros IConversorRomanoArabe.cs y ConversorRomanoArabeServer.cs del siguiente modo:
csc /t:library /out:bin\IConversor RomanoArabe.dll IConversorRomanoArabe.cs

Para ms detalles sobre cmo compilar y ejecutar todos los ejemplos de esta entrega consltense los ficheros LEEME.txt que acompaan al cdigo de este artculo en el CD-ROM.

Conclusiones
En este artculo hemos ilustrado las caractersticas principales del framework para programacin distribuida orientada a objetos .NET

Remoting: modos de activacin, modos de comportamiento, canales de comunicacin, y transferencia de objetos como parmetros. Para demostrar estos conceptos hemos transformado el ConversorRomanoArabe de la anterior entrega a un servicio distribuido programado en .NET Remoting. En la siguiente entrega, describiremos otras caractersticas ms avanzadas de .NET Remoting como leasing o creacin de servicios web con .NET Remoting. Adems, revisaremos .NET Enterprise Services, la solucin en .NET para el desarrollo de aplicaciones distribuidas de alto rendimiento y elevada disponibilidad, anloga a J2EE en Java.

2.0 en Visual Studio 2005


Una de las novedades ms interesantes de la nueva versin de es la incorporacin de las pginas maestras. En la prxima entrega del coleccionable descubriremos cmo las pginas maestras pueden abreviar el ciclo de desarrollo de una aplicacin web, todo ello desde el nuevo entorno Visual Studio 2005.
Patrocinado por: Autor:

Francisco Charte

MIDDLEWARE

XAML (IV)
ERICH R. BHLER (MVP en .NET Framework)

El acceso a orgenes de datos es una caracterstica deseable para cualquier aplicacin. Esto nos conduce a un problema, no siempre bien resuelto: Cmo mostrar estos datos al usuario? La solucin que ofrece XAML es elegante y seguro que muchos quedarn sorprendidos despus de practicar con ella.
Introduccin
En los artculos anteriores aprendimos a emplear los controles nativos de XAML para conformar una interfaz grfica y vimos cmo modificar su apariencia. Bsicamente esta tarea se lleva adelante mediante estilos visuales, los que hacen posible personalizar la conformacin total o parcial de un control, tanto sea para definir uno nuevo o para alterar alguna faceta del mismo. Todo esto gracias al fabuloso lenguaje de marcacin XAML que ser incluido en la prxima versin del sistema operativo de Microsoft, aunque el lector puede ya hacer uso de esta tecnologa descargando e instalando Avalon Community Technology Preview del sitio MSDN. Esto har que pueda prescindir de complejas lneas de cdigo de programacin para finalmente remitirse a etiquetas para crear una interfaz de usuario; ya puede crear su anhelado botn redondo o la lista con elementos de imgenes con hipervnculos. Ahora bien, ser necesario conocer cmo anidar cada uno de los miembros para as obtener un resultado consistente. En este penltimo artculo del curso sobre programacin de interfaces con XAML ir ms all y explicar cmo enlazar XAML a datos para finalmente desembocar en una de las caractersticas que a mi parecer es de las ms destacables y poderosas, llamada Estilo de Datos. Tambin mostraremos cmo crear aplicaciones ejecutables de Avalon para comenzar a cerrar

el crculo de tecnologas y herramientas. Sin embargo, antes vamos a hablar sobre las capacidades de este nuevo estndar para la conexin a datos, algo que hemos dejado hasta el momento para ofrecer primero una buena base en los temas bsicos de XAML.

El enlace a datos
Cuando se piensa en el enlace a datos, todos imaginamos una aplicacin que obtiene informacin de alguna parte y posteriormente la exhibe. Por supuesto que esto involucra mucho ms que este simple punto de vista, ya que por debajo existen traslados de paquetes de bytes desde el origen hasta la interfaz grfica, manejadores de base de datos, transformaciones, redes, etc. Afortunadamente, pocos de estos procesos nos interesan ya que en XAML esta tarea se resuelve de forma sencilla, aunque no por ello deje de ser poderosa y flexible. Adems de la complejidad de actores que mencion anteriormente los datos pueden ser de tipos variados; cuando digo esto no me refiero a que el origen sea un motor SQL Server u Oracle, sino a formatos realmente dispares, como podra ser un documento XML, el valor de una propiedad de un objeto o una base de datos. Tambin se cuentan con varias alternativas de cmo manipular la informacin, se puede indicar que los datos vendrn del origen a la interfaz grfica pero nunca volvern a ste o incluso ser bidireccional. Los eventos juegan necesariamente un papel importante ya que hacen posible recibir notificaciones de cundo la conexin est abierta, que ha llegado la informacin, as como tambin modificar la misma para que sea representada de una forma diferente a la original (transformaciones). Todo esto que he mencionado parece muy complejo en trminos generales, pero el lector comprobar en las prximas pginas que no lo es tanto.

La clase Bind
La nueva infraestructura provee una clase llamada Bind la cual es vista dentro del lenguahttp://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

36

MIDDLEWARE

XAML (IV)

Algunas de las clases del espacio System.Windows.Data


je declarativo XAML como una etiqueta de igual nombre. Esta es la responsable de vincular un elemento con datos, por lo que interactuar con sus propiedades har posible un control total sobre el enlace. Todas las clases relacionadas con consumo de informacin se encuentran dentro del espacio System.Windows.Data. El cuadro Algunas de las clases del espacio System.Windows.Data nos muestra un pequeo resumen de ellas, ya que su totalidad abarca ms de 30 estructuras, aunque en realidad solamente se emplean 2 o 3 a no ser que desee realizar alguna implementacin con caractersticas realmente avanzadas. Como podemos apreciar se tienen 3 posibles modelos de conexin y consumo de datos, uno orientado al tpico modelo relacional, otro a un documento XML, y el ltimo que hace posible enlazarse con propiedades de objetos, cosa que es de mucha utilidad cuando se est trabajando en .NET Framework. El siguiente cdigo contiene un pequeo ejemplo de cmo indicar un campo a consumir:
<Image.Source> <Bind DataSource={DatosLibros} Path=Imagen/> </Image.Source>

Clase Bind

Descripcin

Define un objeto que contendr la declaracin de enlace entre un elemento de la interfaz grfica y un origen de datos. Representa un enlace con datos. Se puede enlazar con propiedades de ObjectDataSource otros objetos como origen/destino de datos. SqlDataSource Proveedor especfico para enlazar con Microsoft SQL Server. Si se desea consumir informacin en formato XML, es sta la opcin XmlDataSource que se deber emplear (lo veremos aqu ms adelante).

Propiedades de Bind
Propiedad BindType Descripcin TwoWays: Modifica la interfaz o el origen si alguno de ellos cambia. OneWay: Solamente actualiza la interfaz grfica cuando el origen cambia. OneTime: Solamente actualiza la interfaz grfica al inicio de la aplicacin. Permite especificar una transformacin para los datos al ser trados a la Converter interfaz grfica o al ser llevados al origen de datos. IsAsync Indica cundo los valores se debern obtener/escribir en forma asncrona. Es de tipo coleccin y permite establecer reglas de validacin a aplicar en ValidationRules el momento de enviar los datos. ocasiones sea necesario indicar una ruta que apunte al nodo especfico dentro de la jerarqua. Esto no es un problema con Bind ya que ofrece el miembro XPath que permite definir el criterio de seleccin. El siguiente fragmento de cdigo nos muestra cmo indicar un nodo inmediato de la jerarqua utilizando esta propiedad, aunque esto podra ser una ruta como por ejemplo la senda de un directorio de MSDOS (/Imagen/VersionBlancoy Negro):
<Image.Source> <Bind DataSource={DatosLibros} <Image Source=*Bind(XPath=Imagen; Datasource={DatosLibros})/>

Ms adelante nos centraremos en la forma de establecer el origen de datos. Como puede apreciarse en el cdigo anterior, se declara una etiqueta de imagen y posteriormente se anida una segunda de tipo Bind. sta utiliza la propiedad DataSource que indica el nombre del origen de datos. Por su parte Path apunta al elemento deseado (del que nos interesa su valor) que es llamado Imagen. Bsicamente esto obtendr el contenido del miembro y lo pondr en el control, exhibindose finalmente dentro del mismo. Por supuesto que existen muchas alternativas a la hora de vincular un control a datos, pero por una cuestin de espacio solamente me remitir a ver aquellas opciones que nos sern de utilidad para explicar ms adelante las caractersticas de Estilo de Datos. Como se mencion anteriormente hay varios tipos de origen, como por ejemplo un documento XML. En este formato la informacin viene organizada de forma jerrquica, lo que hace que en algunas
http://digital.revistasprofesionales.com

Hemos visto cmo vincular un enlace con un control simple aunque tambin es posible hacer lo mismo con una lista de elementos (Listbox). Ello brinda la posibilidad de exhibir varios miembros en vez de uno solo. Para esto es necesario bajar por la jerarqua de Listbox hasta toparnos con la coleccin de elementos de la lista y all establecer el enlace. Veamos cmo se hace esto en el siguiente fragmento de cdigo:
<ListBox> <ListBox.Items> <CollectionContainer> <CollectionContainer.Collection> <Bind DataSource={DatosLibros} XPath=Libro/> </CollectionContainer.Collection> </CollectionContainer> </ListBox.Items> </ListBox>

XPath=Imagen/> </Image.Source>

Existe tambin una forma ms econmica desde el punto de vista de la escritura, el atajo en cuestin hace lo mismo desde el punto de vista funcional pero usando una sola lnea. S que a algunos programadores les gusta tener todo compacto en vez de emplear propiedades complejas (etiquetas anidadas). En general yo evito esta opcin ya que mi criterio le quita legibilidad al cdigo, pero no obstante es bueno que el lector lo conozca. Para utilizar esta sintaxis habr que asignar directamente en la propiedad donde se desea mostrar el resultado un asterisco seguido de la palabra Bind y luego entre parntesis todos los valores para el enlace separados por punto y coma. La siguiente lnea nos muestra cmo hacerlo:

Antes de pasar a detallar todo lo relacionado con la conformacin de la conexin, veamos en el cuadro Propiedades de Bind algunas de las propiedades que ofrece Bind para personalizar la forma en que los datos sern tratados.

Estableciendo el origen de datos


Como ya se ha dicho, todas las clases relacionadas con un enlace a datos se

37

SOLO PROGRAMADORES n 124

MIDDLEWARE

LISTADO 1
encuentran dentro del espacio System. Windows.Data. El cuadro Algunas de las clases del espacio System.Windows.Data nos mostr un pequeo resumen de los miembros all contenidas ya que su totalidad abarca ms de 30 estructuras. Bsicamente se proveen 3 tipos diferentes de enlace, uno que es el tradicional (SqlDataSource), para vincular estructuras XML (XmlDataSource), y lo ms interesante para consumir un objeto creado por nosotros mismos (ObjectData Source). Comencemos por lo bsico, el listado 1 nos muestra un documento XML con informacin sobre libros. Por una cuestin de comodidad esta informacin la incluir dentro del mismo documento XAML que define la interfaz grfica, sobre todo para no tener que hacer referencia a archivos externos. A esto se le llama isla de datos ya que los mismos se encuentran dentro de un nico documento. Debido que el formato es XML se tendr que emplear la estructura XMLDataSource (vase el listado 2).

Nuestra lista de libros

<Libros> <Libro ISBN=84-481-3271-8 EnAlmacen=si> <Titulo>Gua de migracin y actualizacin a Visual Basic .NET</Titulo> <Imagen>Guia.jpg</Imagen> </Libro> <Libro ISBN=84-451-3251-8 EnAlmacen=si> <Titulo>Cocinando con .NET framework y XAML en 5 minutos</Titulo> <Imagen>Cocinando.jpg</Imagen> </Libro> <Libro ISBN=44-586-5231-4 EnAlmacen=si> <Titulo>Cenando con .NET framework y con otras tecnologas</Titulo> <Imagen>Cenando.jpg</Imagen> </Libro> <Libro ISBN=74-341-3474-3 EnAlmacen=in> <Titulo>Woman .NET una historia de amor en el ciberframework</Titulo> <Imagen>Mujer.jpg</Imagen> </Libro> </Libros>

LISTADO 2

Accediendo a nuestra lista de libros

<DockPanel xmlns=http://schemas.microsoft.com/2003/xaml xmlns:def=Definition> <DockPanel.Resources> <XmlDataSource def:Name=DatosLibros XPath=/Libros> <Libros xmlns=> <Libro ISBN=84-481-3271-8 Stock=in> <Titulo>Gua de migracin y actualizacin a Visual Basic .NET</Titulo> <Imagen>Guia.jpg</Imagen> </Libro> ... </DockPanel>

XPath indica el nodo en el documento por el que se desea filtrar as como el nombre que se emplear para la conexin. Con esto basta para que el enlace est completo. Por supuesto que el documento que alimenta al origen puede estar en un archivo independiente. Para ello solamente hay que indicar en el origen (Source) el nombre del archivo:
<XmlDataSource def:Name=DatosLibros Source=MisLibros.xml XPath= /Libros/>

Como ve la diferencia en sintaxis es muy pequea, pero nos permite utilizar un archivo independiente en vez de la isla XML.

Estilo de Datos
Cuando exhibimos datos por ejemplo dentro de un control de lista, en realidad estamos acostumbrados a que sean mostrados como elementos de texto uno debajo del otro. Esto no est mal, aunque parece que esto ha resultado un poco aburrido al grupo de arquitectos de XAML, por lo que han dado un paso ms all a esta aproximacin. Ahora cuando se enlazan los datos a un elemento de la
http://digital.revistasprofesionales.com

Figura 1. La tecnologa Estilo de Datos permite definir la forma en la que queremos presentar los datos obtenidos del origen.
SOLO PROGRAMADORES n 124

38

MIDDLEWARE

XAML (IV)

LISTADO 3

Definicin del estilo MiEstilo

<DockPanel.Resources> <Style def:Name=MiEstilo> <ContentPresenter/> <Style.VisualTree> <DockPanel xmlns=http://schemas.microsoft.com/2003/xaml Width=100% Height=100% DockPanel.Dock=Left> <Text FontSize=Small Foreground=Black> <Text.TextContent> <Bind XPath=Titulo/> </Text.TextContent> </Text> <DockPanel Margin=5 5 5 5 DockPanel.Dock=Left Width=200> <Image Width=100 Height=150> <Image.Source> <Bind XPath=Imagen/> </Image.Source> </Image> </DockPanel> </DockPanel> </Style.VisualTree> </Style> </DockPanel.Resources>

Esto nos asegura que la nueva definicin visual ser utilizada por los elementos contenidos as se carguen de un origen o utilizando las primitivas del control de lista. El tercer y ltimo paso consiste en indicar cmo localizar el origen de datos, para ello simplemente se deber adicionar dentro de la coleccin de elementos la etiqueta Bind indicando el nombre de la conexin mediante DataSource:
<ListBox ItemStyle={MiEstilo}> <ListBox.Items> <CollectionContainer> <CollectionContainer.Collection> <Bind DataSource={DatosLibros} XPath=Libro/> </CollectionContainer.Collection> </CollectionContainer> </ListBox.Items> </ListBox>

interfaz grfica es posible indicar una plantilla de visualizacin especfica. Por ejemplo, el primer campo a ser mostrado en la ListBox lo podramos plasmar como un texto, pero el segundo al ser una imagen emplearamos un control Picture, mientras que el tercero lo mostraramos como hipervnculo. Para cubrir esta necesidad se cuenta con una nueva tecnologa que hace posible definir una plantilla que transformar los datos de origen a un tipo de visualizacin especfico. Como puede ver la tecnologa de Estilo de Datos es una mezcla entre caractersticas avanzadas de presentacin e informacin. La figura 1 muestra un control de ListBox que he modificado para que su apariencia sea adecuada a los datos suministrados por el origen. Bsicamente los pasos a seguir son siempre los siguientes tres: 1. Crear un estilo para los datos (cmo stos sern mostrados). 2. Asociar el control con el estilo creado previamente. 3. Conectar el control al origen de datos.

Estableciendo el estilo
El primer paso entonces es definir un estilo para los datos. En la entrega anterior ya se explic que todo estilo debe ser definido como un elemento de la coleccin de recursos. El listado 3 nos muestra una apariencia personalizada llamada MiEstilo donde se emplean varios controles para exhibir los diferentes elementos del origen de datos; cada uno de ellos cumple un rol meramente esttico. Sin
http://digital.revistasprofesionales.com

embargo, hay que prestar atencin a las lneas que se encuentran resaltadas. La totalidad de la etiqueta Bind ser reemplazada por el valor del campo definido en la propiedad XPath. El ttulo ser insertado dentro de un contenedor de texto, mientras que con el segundo elemento (Image) se har algo ms interesante ya que se utilizar este contenido para alimentar la imagen. Por ejemplo, si se tiene un valor de campo guia.gif entonces se ir al directorio actual y se cargar la imagen que tenga este nombre. En caso de no existir no se producir un error sino que se omitir la misma. La propiedad VisualTree tiene un papel crucial ya que como vimos en el captulo anterior todo lo que se escriba dentro de ella sobrescribir la apariencia predeterminada del control. El resto de paneles y etiquetas simplemente sirven para alinear los datos. Hemos culminado el primer paso, ahora tenemos que asociar el control con el estilo creado previamente, con el fin de que se comience a utilizar la nueva forma de plasmar la informacin. Evidentemente no deseamos que se aplique la apariencia a toda la lista Listbox sino a sus elementos miembros (Items). Para ello el control cuenta con una propiedad llamada ItemStyle donde se debe poner el nombre del estilo previamente definido (en este caso llamado MiEstilo). Veamos cmo:
<ListBox ItemStyle={MiEstilo}> </ListBox>

Una vez que hemos hecho esto debemos establecer de dnde obtener los datos. Como mencion anteriormente este origen ser un documento XML, por lo que se tendr que emplear la estructura XMLDataSource y nombrar al nodo de dnde obtener la informacin.

Generando una aplicacin Avalon


Cuando se tiene un documento XAML cualquiera, ste puede abrirse y modificarse ya que en realidad se trata de un archivo de texto que sigue ciertas reglas. Sin embargo existe la posibilidad de crear una aplicacin Avalon (exe) que cumpla la misma funcin que el documento y ms. Bsicamente esta tarea consiste en llevar las etiquetas y propiedades a cdigo .NET y posteriormente compilarlo. Cada etiqueta se transformar en una instancia de una clase, mientras que las propiedades sern convertidas a lneas de cdigo que configuren cada uno de sus valores. No obstante la ventaja ms notoria es que para tener cdigo asociado a eventos del documento en alguno de los lenguajes de .NET Framework (lgica detrs de escenas) se deber utilizar forzosamente esta aproximacin. Aqu se tendrn entonces 2 archivos, uno que ser el archivo XAML en s con la definicin de la interfaz grfica y otro con la

39

SOLO PROGRAMADORES n 124

MIDDLEWARE

LISTADO 4

El archivo de informacin

<?xml version=1.0 encoding=utf-8?> <Project DefaultTargets=Build xmlns=http://schemas.microsoft.com/developer/msbuild/2003> <! MSBUILD Project File > <PropertyGroup> <DefaultClrNameSpace>Nombre_del_espacio_de_nombres</DefaultClrNameSpace> <AssemblyName>Nombre_de_mi_Ensamblado</AssemblyName> <TargetType>winexe</TargetType> <Configuration>Release</Configuration> <BuildSystem>MSBuild</BuildSystem> <HostInBrowser>False</HostInBrowser> <ProductVersion>8.0.40209</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{55DF4C82-60B1-401E-9A8D-AF62DCA542AF}</ProjectGuid> </PropertyGroup> <Import Project=$(MSBuildBinPath)\Microsoft.CSharp.targets /> <Import Project=$(MSBuildBinPath)\Microsoft.WinFX.targets /> <ItemGroup> <ApplicationDefinition Include=<Nombre del archivo de aplicacin>.xaml /> <!Archivos a compilar > <Page Include=<Nombre de la pgina a compilar>.xaml /> </ItemGroup> </Project>

lgica bajo la nomenclatura <Nombre de archivo>.XAML.CS (o VB para el caso de ser Visual Basic .NET). Desde este cdigo ser posible interactuar/modificar las caractersticas del documento, as como prescindir del primero para crear la interfaz desde cero. Por ejemplo, en vez de emplear la etiqueta Bind se podran escribir las lneas de cdigo necesarias para efectuar el enlace en el momento en que se cargue el documento. La herramienta que lleva adelante la compilacin se denomina MSBUILD, la que es en realidad el nuevo sistema de compilacin para las aplicaciones .NET y futuras versiones de Visual Studio. Simplemente se deber invocar a esta aplicacin desde la lnea de comandos, estando siempre sobre la carpeta con el documento XAML a compilar. Se requieren siempre 2 archivos que le indiquen al compilador cmo realizar su trabajo: Archivo de aplicacin (CualquierNombre .xaml) Archivo con informacin de proyecto (nombredelProyecto.cs/vb) El archivo de aplicacin puede contener ms datos, pero el mnimo requerido debe indicar el documento XAML de inicio que tendr que mostrarse al abrirse la aplicacin:
<NavigationApplication xmlns=http:// schemas.microsoft.com/2003/xaml xmlns:def=Definition StartupUri= [Aqu el nombre de la pgina XAML de inicio].xaml>

</NavigationApplication>

El archivo con informacin del proyecto puede resultar un poco ms aterrador a primera vista ya que contiene mucha informacin casi incomprensible para el ojo humano. Sin embargo, ver que la mayor parte de las etiquetas siempre permanecen constantes (vea esto en el listado 4).

Se han destacado los valores que habr que modificar, el resto podrn dejarse con los tipos propuestos. El valor del espacio de nombres (DefaultClrName Space), por ejemplo, lo utilizaremos ms adelante cuando queramos escribir cdigo detrs de escenas, por lo que volveremos sobre este atributo. El resto de los miembros son auto-descriptivos, por lo que no requieren de explicacin alguna. Sin embargo en el caso de ProjectGuid es obligatorio obtener un nmero identificador nico para el proyecto, lo que sera igual al DNI de una persona. Para ello hay que utilizar la aplicacin guidgen que se encuentra en la carpeta \Common7\Tools dentro de Visual Studio. sta crear un nuevo identificador el que ser nico en el tiempo y en el espacio (vase la figura 2). Una vez completada la tarea tendr los 2 documentos con informacin de aplicacin mas la/las pginas XAML. Bastar ejecutar MSBUILD dentro de la carpeta para que se genere el ejecutable correspondiente a la interfaz definida en XAML.

Figura 2. Generando un identificador para el proyecto.

SOLO PROGRAMADORES n 124

40

http://digital.revistasprofesionales.com

MIDDLEWARE

XAML (IV)

LISTADO 5

Modificaciones en el documento XAML

<Canvas xmlns=http://schemas.microsoft.com/2003/xaml xmlns:def=Definition def:Class=Espacio_de_nombres_del_Ensamblado.MiClase def:CodeBehind=MiArchivo.xaml.cs ID=MiControl> <Button ID=MiBotn Click=MiProcedimientoParaMiBotn>Hola Mundo!</Button> Aqu otros controles... </Canvas>

LISTADO 6
// Estos son los espacios de nombres comnmente utilizados por un panel. using System; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Navigation; using System.Windows.Shapes;

Archivo con lgica de negocio

namespace Espacio_de_nombres_del_Ensamblado { public partial class MiClase : DockPanel { private void MiProcedimientoParaMiBotn(object sender, RoutedEventArgs e) {} } }

Asociando cdigo detrs de escenas a un evento


Como se mencion anteriormente es relativamente sencillo escribir cdigo que est asociado a los diferentes eventos de una pgina XAML; esto es similar a la aproximacin que utiliza ASP.NET. Se tendrn entonces 2 archivos, uno con la definicin de la interfaz grfica mientras que otro ser el encargado de contener la lgica. Para llevar esto adelante es necesario modificar el primer elemento de la jerarqua del documento XAML para indicarle a MSBUILD dnde localizar la lgica (vea esto en el listado 5). Mientras que el atributo def:Class indica el espacio de nombres del ensamblado (vase DefaultClrNameSpace en el archivo de

proyecto) y de la clase a la que deber pertenecer el archivo de cdigo, def: CodeBehind especifica el nombre y dnde localizar al mismo. Por su parte es recomendable adicionar a todos los controles un nombre mediante el atributo ID, con el fin de que luego se pueda hacer referencia a ellos desde cdigo. Tambin debe asignarse a los nombres de los eventos a capturar cul ser el procedimiento que contendr su implementacin. El cdigo del listado 6 muestra un esqueleto clsico de lgica. Como se puede apreciar se indica el nombre del ensamblado as como tambin de la clase, la cual en este caso hereda las caractersticas del panel DockPanel. Este procedimiento se enganchar automticamente con la ejecucin del clic del botn.

Qu hay que tener para ejecutar XAML?


En el futuro nuestras interfaces XAML estarn automticamente soportadas por el nuevo subsistema grfico Avalon de Longhorn, la prxima versin del sistema operativo de Microsoft (vanse los artculos dedicados a Longhorn en los nmeros 122 y 123 de Slo Programadores). Sin embargo, mientras tanto es posible compilar y ejecutar nuestras interfaces XAML con soluciones alternativas, como las que siguen: Visor XAML de XAMLON y tambin conversor de Flash a este formato. Es posible descargar la aplicacin desde http:// www.xamlon.com. Visor de XAML de Mobiform, que por el momento es la nica aplicacin con soporte a la librera grfica Avalon y adems con un editor grfico incorporado. Puede descargarse desde http:// www.mobiform.com. Visor XAML de Microsoft, contenido dentro del paquete Public November 2004 Avalon Community Technology Preview, disponible para descarga desde el site de Microsoft para desarrolladores.

Conclusiones
Y hasta aqu hemos llegado en esta cuarta entrega, en el prximo y ltimo captulo de la serie hablaremos de cmo animar una interfaz grfica, cosa muy sencilla pero a la vez muy impactante, as como alguna de las caractersticas 3D de XAML.

Figura 3. Ejecutando MSBUILD dentro de la carpeta transformaremos el documento XAML en un ensamblado EXE de .NET Framework.

http://digital.revistasprofesionales.com

41

SOLO PROGRAMADORES n 124

REDES

Sistemas de mensajera con Java Message Service (I)


EDUARDO MILLN MARTNEZ

Artculo publicado en colaboracin con javaHispano

La especificacin de mensajera JMS nos permite construir sistemas de mensajera asncronos con un alto grado de robustez y sencillez. Adems, hoy en da existen en el mercado soluciones JMS de cdigo abierto que proporcionan un grado de madurez suficiente como para ser utilizados en aplicaciones corporativas.
Introduccin
Comunicaciones asncronas
Como es sabido, la comunicacin asncrona, tambin llamada no bloqueante, es aquella en la que el emisor enva un mensaje y contina con su funcionamiento normal sin esperar a que el receptor lo procese. El caso contrario es la comunicacin sncrona, en la que el emisor enva el mensaje y espera (se bloquea) hasta que recibe la respuesta o transcurre el tiempo de espera. Los sistemas de mensajera (MOM, Message Oriented Middleware) se encargan de proporcionar este tipo de comunicacin entre aplicaciones corporativas de una forma sencilla, robusta y fiable. Son mucho ms ampliamente escalables que aquellos basados en conexiones directas o a travs de llamadas a procedimientos remotos (RPC), y uno de los campos en los que son ms utilizados es en el control de flujo (workflow) de informacin de sistemas. En sistemas MOM los participantes de la comunicacin no tienen que preocuparse de esperar una respuesta del recipiente, ni siquiera de dnde se encuentra ste, ya que pueden confiar en la infraestructura de mensajera que se encarga de asegurar su entrega. JMS o Java Message Service es la nica API de mensajera soportada por J2EE. Los sistemas de mensajera han ido evolucionando desde simples colas asncronas hasta sistemas elaborados con publicadores, suscriptores, distri-

buidores, formateo de mensajes, capacidades de proporcionar calidad de servicio, etc. Dentro de estos sistemas se conoce a los clientes de mensajera en JMS como clientes JMS, al propio sistema como proveedor JMS, y a la aplicacin JMS como al conjunto de clientes y proveedores (normalmente uno) que forman el sistema. El cliente JMS que produce el mensaje es conocido como productor y el que lo recibe se conoce como consumidor, aunque un mismo cliente JMS puede actuar a la vez de los dos modos.

Modelos estndar de mensajera


JMS nos proporciona dos modelos distintos de mensajera, publicacin/suscripcin y comunicacin punto a punto mediante colas. Se suelen abreviar con pub/sub para el primer modelo y p2p para el segundo. A grandes rasgos, el modelo publicacin/suscripcin est pensado para una comunicacin uno a muchos mientras que el modelo punto a punto lo est para comunicaciones uno a uno. Podemos sugerir para el modelo pub/sub el servicio de suscripciones de esta revista. Pensemos en que los lectores se apuntan a una lista mediante una suscripcin y los responsables les envan su ejemplar cada mes. Todos y cada uno de ellos reciben una copia de la revista, y no es necesario que los lectores se conozcan entre s. Para el segundo modelo, podemos pensar en un sistema de colas tpico, como puede ser las colas en las cajas de un supermercado. En este caso, los clientes buscan una sola de las cajas disponibles, hacen cola hasta que llega su turno y son atendidos por el/la cajero/a. En la figura 1 podemos apreciar el esquema del modelo pub/sub. En este modelo un productor enva un mensaje a un canal virtual llamado tpico. Los consumidores pueden suscribirse a dicho tpico, con lo que recibiran una copia del mensaje; todos los mensajes enviados a un tpico son entregados a todos los receptores. En este modelo se conoce al productor como publicador y al consumidor como suscriptor. Un aspecto importante en este modelo es que el publicador no conoce nada acerca de los suscriptores, no sabe dnde se encuentran, ni cuantos hay ni lo que hacen con los mensajes. Asimismo, los receptores no pueden
http://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

42

REDES

Sistemas de mensajera con Java Message Service (I)

Figura 1. Modelo pub/sub de mensajera JMS.

Figura 2. Modelo point-to-point de mensajera JMS.

examinar los mensajes pendientes, y tienen que consumirlos tal cual les llegan. Los aspectos importantes de este modelo son los siguientes: No existe acoplamiento entre productores y consumidores, pueden ser aadidos dinmicamente. Cada suscriptor recibe su propia copia del mensaje. Los suscriptores reciben el mensaje sin tener que solicitarlo. Los mensajes publicados en un tpico son automticamente entregados a los suscriptores. Veamos ahora el modelo punto a punto en la figura 2. Este modelo se basa en otro esquema. Los clientes JMS envan mensajes a travs de canales virtuales llamados colas. Aqu se conoce a los productores como emisores y a los consumidores como receptores. Se trata de un modelo en el cual los receptores chequean la cola para ver si han recibido algn mensaje, contrariamente a lo que suceda en el anterior modelo (aunque es el comportamiento por defecto, se puede aproximar al modelo anterior mediante configuracin). En una cola puede haber ms de un receptor esperando mensajes, aunque solamente uno de ellos va a consumir cada mensaje. Como observamos en la figura 2, el productor se encarga de generar el mensaje y el sistema JMS entrega el mensaje a uno y slo uno de los potenciales receptores. La especificacin no define las reglas que deben seguirse para la distribucin de los
http://digital.revistasprofesionales.com

mensajes entre los receptores, as que cada fabricante realiza su propia implementacin. Este modelo ofrece otras herramientas, como el explorador de colas mediante el cual el receptor es capaz de examinar los mensajes pendientes antes de consumirlos, de forma que puede descartar alguno de ellos. Esta es una caracterstica diferenciadora del anterior modelo, adems de las que explicamos a continuacin: Los mensajes se intercambian a travs de colas. Cada mensaje se entrega a un slo receptor. Los mensajes llegan ordenados, a medida que se consumen se van eliminando de la cola. No existe acoplamiento entre emisores y receptores, se pueden aadir dinmicamente, ya que esta es una caracterstica general de los sistemas de mensajera. El porqu de la existencia de ambos modelos tiene su explicacin en los orgenes de la especificacin JMS. Inicialmente se pens como una solucin para sustituir las APIs de los sistemas de mensajera existentes. En el momento del anlisis, unos fabricantes de sistemas utilizaban un modelo y el resto el otro modelo. As pues, JMS tuvo que dar opcin a ambos modelos para que la industria lo aceptase. En realidad la especificacin no exige que las implementaciones proporcionen los dos, aunque los proveedores de JMS lo ofrecen. Fundamentalmente, todo lo que se puede hacer con un modelo tambin se puede

hacer con el otro. Podemos establecer una analoga en relacin a qu lenguaje de programacin preferimos, sea el que sea, seguro que podremos conseguir el mismo resultado. De la misma forma, la eleccin del modelo pub/sub o p2p se convierte en una cuestin de preferencias. Ante la existencia de los dos modelos, surge la duda de cundo elegir uno u otro. La decisin va a depender de los distintos mritos que aporta cada uno. Si se trata de una aplicacin en la que nos interesa repartir mensajes a distintos destinatarios sin importarnos si estn conectados o no, el modelo pub/sub puede servirnos. Si por el contrario es importante saber que los mensajes llegan, como puede ser el caso de una conversacin uno a uno, quizs sea ms interesante utilizar el modelo p2p. La variedad de los datos a transmitir tambin puede ser un punto a tener en cuenta. Podemos aprovecharnos de la facilidad de tpicos que nos ofrece el modelo pub/sub para segregar los diferentes mensajes entre los potenciales destinatarios. El modelo p2p es ms adecuado cuando se quiere que el receptor procese el mensaje una sola vez. Otra ventaja, mencionada anteriormente, es que disponemos de un explorador de colas que nos permite echar una ojeada a la cola para ver los mensajes que esperan ser consumidos.

OpenJMS. Instalacin y configuracin


OpenJMS es una implementacin libre de la especificacin Java Message Service API 1.0.2. La pgina del proyecto es http://openjms. sourceforge.net.

Instalacin
La instalacin de OpenJMS es muy sencilla, nicamente necesitaremos tener instalado previamente el JRE (en su caso el J2SDK si deseamos modificar el cdigo fuente del proyecto) y seguir unos sencillos pasos. El archivo de instalacin es nicamente una estructura de directorios que contiene todo lo necesario para ejecutar OpenJMS en nuestra maquina. El primer paso consiste en descomprimir el archivo de instalacin que est disponible en formato .zip y .tar.gz. La estructura de directorios generada al descomprimir el archivo debe ser la mostrada en la figura 3. La carpeta bin contiene archivos .sh y .bat para iniciar, detener, y administrar en servidor

43

SOLO PROGRAMADORES n 124

REDES

Figura 4. Consola del sistema con el servidor OpenJMS en funcionamiento. Figura 3. Estructura de directorios de OpenJMS.

LISTADO 1

Fichero de configuracin de OpenJMS

OpenJMS. La carpeta config contiene el archivo openjms.xml el cual indica la configuracin por omisin del servidor OpenJMS. La carpeta config/db contiene scripts SQL para bases de datos OpenJMS. La carpeta config/examples contiene varios ejemplos de archivos de configuracin para otras necesidades de funcionamiento del servidor. La carpeta docs contiene toda la documentacin del proyecto, incluyendo informacin ms detallada de esta instalacin. La carpeta lib contiene los archivos .jar requeridos para ejecutar el servidor OpenJMS y aquellos requeridos por programas cliente que usan OpenJMS. La carpeta src/examples contiene el cdigo fuente de varios archivos de ejemplo. Adems de esto, hay que crear las siguientes variables de entorno: JAVA_HOME: El directorio raz de instalacin del JRE. OPENJMS_HOME: El directorio raz de instalacin de OpenJMS. Para probar si la instalacin se realiz satisfactoriamente iniciamos el servidor desde la lnea de comandos. Para Windows:
cd %OPENJMS_HOME%\bin startup

<?xml version=1.0?> <! NOTA: Esta configuracin muestra los elementos ms relevantes cuando se utiliza un conector RMI. > <Configuration> <! Opcional. Representa la configuracion por omisin> <ServerConfiguration host=localhost embeddedJNDI=true /> <! Requerido cuando se usa un conector RMI > <Connectors> <Connector scheme=rmi> <ConnectionFactories> <QueueConnectionFactory name=JmsQueueConnectionFactory /> <TopicConnectionFactory name=JmsTopicConnectionFactory /> </ConnectionFactories> </Connector> </Connectors> <! Requerido > <DatabaseConfiguration> <JdbmDatabaseConfiguration name=openjms.db /> </DatabaseConfiguration> <! Requerido > <AdminConfiguration script=${openjms.home}\bin\startup.bat /> <! Opcional. Si no se especifica, no se crearan destinos > <AdministeredDestinations> <AdministeredTopic name=charla> <Subscriber name=sub1 /> <Subscriber name=sub2 /> </AdministeredTopic> <AdministeredQueue name=queue1 /> <AdministeredQueue name=queue2 /> <AdministeredQueue name=queue3 /> </AdministeredDestinations> <! Opcional. Si no se especifica, no se crearan usuarios> <Users> <User name=admin password=openjms /> </Users> </Configuration>

Para UNIX:
cd $OPENJMS_HOME/bin startup.sh

Debe aparecer un mensaje indicndonos que el servidor se encuentra ya disponible (vase la figura 4). Para detener el servidor ejecutamos, en el caso de plataformas Windows:
cd %OPENJMS_HOME%\bin shutdown

Para UNIX:
cd $OPENJMS_HOME/bin shutdown.sh

Configuracin
La configuracin de OpenJMS se realiza a travs de la modificacin del archivo

openjms.xml. Simplemente se van agregando los elementos de configuracin que necesitemos para el entorno sobre el cual ejecutaremos el servidor; dichos elementos pueden ser para configurar las bases de datos que vamos a utilizar, la seguridad, configuracin de tpicos para publicacin/
http://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

44

Slo Programadores en Formato Digital


Con el respaldo de ms de diez aos de publicacin mensual y sin interrupciones Entra en http://digital.revistasprofesionales.com
Suscripcin anual a Slo Programadores por slo 27 euros y a Slo Programadores y Mundo Linux por slo 40 euros
Regalo de un CD-ROM con el archivo de los 12 ejemplares de la temporada 2003-04

REDES

Opciones de configuracin del servidor OpenJMS


Configuracin JDBC Descripcin OpenJMS se puede configurar para usar bases de datos JDBC para implementar persistencia de mensajes. OpenJMS proporciona opciones de conectividad sobre varios protoConectores OpenJMS colos, utilizando conectores. OpenJMS utiliza JNDI para hacer disponibles al cliente: fbricas de JNDI conexiones, tpicos, y colas. OpenJMS permite configurar la fbrica de conexiones con distintas Fbricas de conexin opciones. OpenJMS proporciona mecanismos para implementar autenticacin Seguridad de conexiones. Los destinos son registrados con JNDI por el servidor OpenJMS para Destinos que estn disponibles a los clientes. OpenJMS permite configurar al detalle la manera en que se ejecutaGarbage collection r el recolector de basura. Configuracin de seguridad. OpenJMS proporciona configuraciones para realizar autenticacin de conexiones. Para ello se utilizan 2 elementos de configuracin, <SecurityConfiguration> y <Users>. El listado 4 muestra cmo utilizar dichos elementos para habilitar la autenticacin de conexiones. Como podemos observar, OpenJMS proporciona una amplia gama de caractersticas de configuracin, lo que lo convierten en un servidor JMS muy verstil. La finalidad de este apartado es mostrar un panorama general de las opciones de configuracin de OpenJMS. Para conocer con mayor detalle la informacin para la configuracin, puedes recurrir a la pgina del proyecto en Internet.

LISTADO 2

Ejemplo de configuracin JDBC

<DatabaseConfiguration> <RdbmsDatabaseConfiguration driver=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:oci8:@myhost user=openjms password=openjms /> </DatabaseConfigura>

Ejemplo con el modelo pub/sub y OpenJMS


Como ejemplo de aplicacin JMS ofrecemos el tpico chat. Se trata de una sola clase java ClienteJMSChat.java, que acta tanto como suscriptor como publicador de un tpico de mensajes JMS. Por tanto, se trata de un ejemplo del modelo de publicacin/ suscripcin. Hay que decir que el ejemplo aqu propuesto es realmente exagerado, el hecho de utilizar un sistema robusto como JMS para una aplicacin de chat es quiz excesivo, pero sirva como ilustracin. Los mtodos de nuestra clase son los siguientes: main(). Conocido mtodo principal para hacer que la clase sea ejecutable. initialize(String, String, String). Mtodo de instancia para la inicializacin de la clase como su propio nombre indica. Veremos su contenido a continuacin. show(). Muestra el mensaje recibido desde el sistema JMS. debug(). Mtodo para ver mensajes de depuracin. Separado de show() por conveniencia, aunque realmente hacen lo mismo. chatIt(String). Enva un mensaje al tpico JMS. onMessage(Message). Mtodo que debe implementar la clase para recibir mensajes JMS. close(). Cierra la conexin JMS abierta. En la ejecucin del ejemplo, el programa nos va a ir sacando trazas por pantalla, que ayudarn a comprenderlo mejor.
http://digital.revistasprofesionales.com

LISTADO 3

Ejemplo de configuracin de un conector RMI

<Connectors> <Connector scheme=rmi> <ConnectionFactories> <QueueConnectionFactory name=QueueConnectionFactory/> <TopicConnectionFactory name=TopicConnectionFactory/> </ConnectionFactories> </Connector> </Connectors>

LISTADO 4

Ejemplo de configuracin para habilitar autenticacin de conexiones

<SecurityConfiguration securityEnabled=true/> <Users> <User name=admin password=openjms/> <User name=user1 password=password1/> <User name=user2 password=password2/> </Users>

suscripcin y ms opciones. Como ejemplo vemos en el listado 1 el archivo de configuracin utilizado para ejecutar el ejemplo que acompaa a este artculo. Podemos observar las instrucciones ms relevantes para una configuracin con un conector RMI, que es la que viene con OpenJMS por omisin al momento de instalarlo. Los posibles elementos de configuracin de este archivo se pueden ver en la tabla Opciones de configuracin del servidor OpenJMS. A continuacin vamos a repasar algunos ejemplos de estos elementos de configuracin. Configuracin JDBC. En el listado 2 se muestra un ejemplo de configuracin JDBC. Actualmente OpenJMS

esta configurado para ser compatible con JDBC 2.0 y varios sistemas de bases de datos. Adems de agregar este fragmento de cdigo a nuestro archivo de configuracin, es necesario agregar al CLASSPATH la ruta de nuestro driver JDBC. Configuracin de Conectores OpenJMS. OpenJMS proporciona conectividad a travs de varios protocolos utilizando conectores. El listado 3 muestra un ejemplo de configuracin para habilitar un conector RMI. Los conectores soportados actualmente por OpenJMS son: RMI, TCP, TCPS, HTTP, HTTPS, Embedded. Una ventaja importante de OpenJMS es que nos permite definir mltiples conectores a nuestro servidor.

SOLO PROGRAMADORES n 124

46

REDES

Sistemas de mensajera con Java Message Service (I)

La funcin main()
Pasemos a examinar la funcin principal main(). En primer lugar observamos que salta una excepcin si el nmero de argumentos pasados es inferior a tres. Los argumentos que hay que pasar son: el primero el tpico al cual queremos conectar, el segundo el nombre de usuario que vamos a utilizar y el tercero la contrasea del usuario (obviamente no se permiten en este caso contraseas en blanco). Ms adelante veremos cmo hay que configurar el servidor JMS para que est disponible el tpico para el cliente. A continuacin instanciamos un objeto de la clase ClienteJMSChat y la inicializamos con los argumentos anteriores. Una vez hecho esto obtenemos el stream de la entrada estndar para poder leer los mensajes que el usuario

LISTADO 5

Parte principal del mtodo main()

ClienteJMSChat chat = new ClienteJMSChat(); //Argumentos: topic - nombre de usuario - contrasea chat.initialize(args[0], args[1], args[2]); //Leer los mensajes desde la consola BufferedReader consola = new java.io.BufferedReader( new InputStreamReader(System.in)); //Bucle hasta que se introduzca el comando de finalizacin while (true) { String s = consola.readLine(); try { if (s.equalsIgnoreCase(EXIT_COMMAND)) { chat.close(); //Cerrar la conexin break; } else { chat.chatIt(s); } } catch (JMSException jmse) { chat.debug(Excepcion JMS: + jmse.getMessage()); break; } }

LISTADO 6

Inicializando el servicio de mensajera

//Obtener una conexin JNDI para acceder a los objetos JMS Properties properties = new Properties(); //Propiedades especficas para conectar con OpenJMS properties.put(Context.INITIAL_CONTEXT_FACTORY, CONTEXT_FACTORY); properties.put(Context.PROVIDER_URL, PROVIDER_URL); try { //Obtener contexto inicial JNDI InitialContext context = new InitialContext(properties); //Obtener la factora JMS TopicConnectionFactory conFactory = (TopicConnectionFactory) context .lookup(TOPIC_CONNECTION_FACTORY); //Crear la conexin TopicConnection conexion = conFactory.createTopicConnection( usuario, password); //Creamos dos sesiones, una para publicacin, donde se envan los // mensajes que escribimos, y otra para suscribirnos al tpico, de // forma que recibamos los mensajes que all son enviados. TopicSession sesionP = conexion.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); TopicSession sesionS = conexion.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); //Obtener el tpico JMS Topic topicObj = (Topic) context.lookup(topico); //Crear un publicador y un suscriptor JMS TopicSubscriber suscriptor = sesionS.createSubscriber(topicObj); TopicPublisher publicador = sesionP.createPublisher(topicObj); //Esta misma clase es la que recibe los mensajes suscriptor.setMessageListener(this); ... //Iniciar la conexion, a partir de aqu los mensajes pueden ser // enviados al tpico conexion.start(); } catch (NamingException ne) { throw new RuntimeException(Error JNDI, ne); } catch (JMSException jmse) { throw new RuntimeException(Error JMS, jmse); }

escribe. Todo texto que escriba el usuario es pasado al objeto instanciado llamando al mtodo chatIt() excepto en el caso de que se corresponda con el comando de salida EXIT_COMMAND (tambin configurable mediante una variable esttica) que har que el programa termine. Si durante la comunicacin ocurre un problema en la capa JMS la capturaremos con la excepcin correspondiente. En el listado 5 podemos observar la parte principal de este mtodo.

Inicializacin JMS
Los pasos para inicializar nuestro programa JMS son los siguientes: 1. Inicializar JNDI. 2. Obtener el objeto Factory JMS. 3. Crear una conexin al servidor JMS mediante el objeto Factory. 4. Obtener dos sesiones JMS, una para publicar y otra para suscribirse al tpico (recordar que nuestro programa acta con ambos roles). 5. Obtener el objeto tpico a travs de JNDI. 6. Por cada sesin, obtener un objeto publicador y suscriptor respectivamente, que actan como agentes de comunicacin. 7. Registrar en el suscriptor la clase actual para que reciba los mensajes que se publican en el tpico. 8. Por ltimo, realizar la conexin con el servidor. En el listado 6 podemos ver estos pasos. Las variables que no aparecen declaradas son variables de clase, se puede consultar el cdigo completo para ver su declaracin. En concreto y para conectar con JMS, los datos que hay que proporcionar son:

http://digital.revistasprofesionales.com

47

SOLO PROGRAMADORES n 124

REDES

CONTEXT_FACTORY = org.exolab.jms. jndi.InitialContextFactory PROVIDER_URL = rmi://localhost:1099/ (suponiendo que se conecta al host local) TOPIC_CONNECTION_FACTORY = JmsTopic ConnectionFactory;

LISTADO 7

Recepcin de un mensaje

try { TextMessage textMessage = (TextMessage) message; String text = textMessage.getText(); show(text); } catch (JMSException jmse) { jmse.printStackTrace(System.out); }

Envo y recepcin de mensajes


Como nuestra clase implementa el interface javax.jms.MessageListener, debemos crear el mtodo onMessage() que recibe los mensajes que provienen del sistema JMS cuando algn cliente enva un mensaje al tpico. Segn vemos en la implementacin, el mtodo recibe un mensaje tipo Message, se convierte a un mensaje de tipo texto y obtenemos el texto como cadena para mostrarlo en la consola (vase el listado 7). Por ltimo examinamos cmo se envan los mensajes al tpico. Simplemente creamos un mensaje tipo texto desde el objeto sesin que corresponde al publicador y establecemos la cadena del mensaje que queremos enviar. A continuacin utilizamos el objeto publicador para enviar el mensaje al tpico, como vemos en el listado 8. En el cdigo que acompaa a este artculo podemos observar que en los imports no se hace referencia a ninguna clase especfica de JMS, nicamente al obtener el contexto ini-

LISTADO 8

Envo de un mensaje

TextMessage message = sesionP.createTextMessage(); message.setText([ +usuario + ] + text); publicador.publish(message);

cial JNDI es donde especificamos datos propios de OpenJMS, pero incluso esto lo hemos aislado en una variable esttica, el cdigo fcilmente puede ser adaptado para que lea dichos datos de un archivo .properties externo, por ejemplo. Para compilar y ejecutar el ejemplo, adems del fuente necesitaremos incluir la API JMS y la implementacin OpenJMS para el cliente. Los archivos .jar que vamos a necesitar son los siguientes: jms-1.0.2a.jar: API JMS. openjms-client-0.7.6.1.jar: Implementacin para clientes OpenJMS.

Ejecutar el ejemplo
Para ejecutar el ejemplo, ofrecemos tres opciones:

Importar el proyecto en el IDE Eclipse. Utilizar Ant para compilar, crear el javadoc y ejecutarlo. Utilizar un script .bat (.sh para linux) para ejecutarlo. Para importar el proyecto a Eclipse, utilizaremos la opcin Import del men File, y especificaremos que se trata de un proyecto externo. Tambin podemos copiar el directorio dentro del workspace de Eclipse, y crear un nuevo proyecto Java con el mismo nombre, para que sea reconocido dentro del editor. Para aquellos lectores familiarizados con Ant (http://ant.apache.org) el ejemplo viene con el script correspondiente con el que podremos compilar, ejecutar el ejemplo e incluso crear el javadoc. Por ltimo, para hacerlo ms sencillo, proporcionamos los scripts para la ejecucin del ejemplo desde consola: run.bat(Windows) y run.sh (Linux). Deberemos proporcionar los parmetros necesarios a estos scripts, segn se ha explicado.

Conclusiones
Hasta la llegada de JMS, cada proveedor de mensajera defina su propia API. Mientras que cada solucin tena sus propios protocolos, la similitud lgica entre las distintas versiones eran las mismas. Esto hizo posible la existencia de JMS para estandarizar de alguna forma el desarrollo de sistemas de mensajera. JMS se convierte en una API simple y a la vez robusta, para la implementacin en nuestras aplicaciones de este tipo de sistemas, con la ventaja de que existen soluciones Open Source ya maduras como OpenJMS que podemos utilizar de una forma productiva.

Figura 5. Ejecucin del ejemplo en Eclipse.

Sobre el autor
Eduardo Milln Martnez (emillan@javahispano.org) es Ingeniero Tcnico en Telecomunicaciones por la Universidad Politcnica de Valencia. Desde diciembre del 2004 trabaja en la empresa Saytel, Premier Business Partner de IBM como consultor de desarrollo. Eduardo lleva trabajando en proyectos Java desde el ao 1998 y es socio activo de javaHispano desde 2002. Actualmente es responsable de Calidad y Administrador del sitio de proyectos de Software Libre: http://www.javahispano.net.

SOLO PROGRAMADORES n 124

48

http://digital.revistasprofesionales.com

DISEO

Together Architect, el enlace entre el problema y la solucin


JORDI BORJA (Director de Tecnologa de Borland)

Together Architect es la solucin de Borland para dar respuesta a las necesidades de todo arquitecto de software. En este artculo estudiaremos cules son estas necesidades y cmo Together Architect puede ayudar a las compaas de software a crear, mantener y comunicar los modelos conceptuales de un sistema a partir de los requisitos.
Introduccin
En el nmero anterior analizamos las necesidades, actividades y caractersticas de trabajo de los Analistas de Negocio, Analistas Funcionales, y Jefes de Proyecto, as como las soluciones proporcionadas por Borland para automatizar y agilizar su trabajo diario. En este nmero avanzaremos un poco ms en el ciclo de vida de desarrollo, e identificaremos las necesidades de perfiles como Arquitectos, Consultores Tcnicos, Analistas Programadores, o Responsables Tcnicos de Desarrollo. La caracterstica comn a todos ellos es la necesidad de trabajar paralelamente con cdigo y modelo, as como la necesidad de poder acceder a los requisitos y a los modelos de negocio. Por supuesto, tambin es necesario para todos ellos poder trabajar en grupo sobre un repositorio centralizado, en el que residan tanto los modelos como el cdigo. Por ltimo, la mayora de estos perfiles tambin necesitan poder ejecutar pruebas unitarias funcionales y pruebas de rendimiento sobre los componentes desarrollados. Borland, en su plataforma SDP (Software Delivery Platform), identifica a todos estos perfiles con el nombre genrico de Architect. En realidad, este perfil es cada da ms comn en los equipo de desarrollo, en los que los programadores clsicos,

centrados exclusivamente en el cdigo, han ido evolucionando a perfiles ms multidisciplinares que participan en varias de las fases del ciclo de vida de desarrollo, o que, como mnimo, necesitan obtener informacin de ellas. En este artculo nos referiremos a todos los roles anteriormente sealados con el nombre genrico de arquitecto.

El arquitecto y sus necesidades


La principal informacin de partida para los arquitectos es, sin duda, los requisitos de un sistema. El objetivo del arquitecto es modelar dinmicamente infraestructuras complejas y distribuidas a partir de las ltimas versiones de los requisitos funcionales, de negocio, operacionales y de arquitectura. Adicionalmente, el objetivo del arquitecto es que todos los miembros del equipo de desarrollo conozcan cul es su visin del sistema y que conozcan las decisiones y restricciones tcnicas que ha definido. As pues, para un arquitecto, lo ms importante ser poder integrar el proceso de diseo con el sistema de Gestin de Requisitos, aumentando el control de los cambios en los mismos, y pudiendo garantizar la visibilidad de sus modelos al resto del equipo. Hay que tener en cuenta, adems, que para determinados tipos de proyectos y equipos de desarrollo, es necesaria la figura del Analista de Negocio o Funcional, responsable de transformar los requisitos expresados en lenguaje natural en diagramas de negocio (casos de uso, diagramas de estado, etc.). Estos diagramas son los que en terminologa MDA (Model Driven Architecture) se han englobado bajo el nombre genrico de Computation-Independet Models (CIM). El arquitecto, en cambio, deber convertir esos diagramas en modelos computacionales, que podrn ser independientes de la plataforma (PIM) o especficos de una plataforma (PSM). En general, el arquitecto es el responsable de transformar un conjunto de especificaciones (PROBLEMA) en un sistema (SOLUCIN). Esta transformacin se realiza a travs de diferentes pasos, y en cada uno de ellos se usa un conjunto de modelos (tpicamente UML en el mundo Orientado a Objetos) que van desde una repre-

SOLO PROGRAMADORES n 124

50

http://digital.revistasprofesionales.com

DISEO

Together Architect, el enlace entre el problema y la solucin

sentacin ms abstracta del sistema a una representacin ms especfica sobre la plataforma elegida para la implementacin de la solucin. Los tres niveles de modelado definidos por MDA deben de poder ser relacionados entre s. Por ejemplo, debera ser posible poder conocer qu diagramas de clases estn relacionados con un requisito concreto, o qu diagramas de secuencia implementan un caso de uso determinado. Adems, deber ser posible que diferentes perfiles dentro de un equipo de desarrollo hayan creado cada uno de estos diagramas. Un arquitecto, como hemos comentado previamente, necesita poder trabajar de forma paralela con cdigo y modelos, disponiendo de herramientas que permitan la sincronizacin automtica entre ambas vistas. Un cambio en el modelo debe poder transmitirse automticamente al cdigo, y viceversa. Adems, como un arquitecto puede participar en proyectos en los que se utilicen de manera combinada mltiples tecnologas y lenguajes de programacin, los modelos deben poderse reutilizar para generar cdigo sobre diferentes plataformas. Adicionalmente, un arquitecto necesita aumentar la productividad, eficiencia, y predictibilidad en sus tareas de diseo. Es por ello que la reutilizacin de conocimiento a travs de blueprints, plantillas o patrones de diseo resulta imprescindible. Por ltimo, un arquitecto necesita poder generar documentacin personalizada a partir de los modelos definidos, que incluya las relaciones entre ellos, y las relaciones con los requisitos.

Integracin de Caliber en Together Architect.

Together Architect incorpora integraciones con Borland Caliber RM, Telelogic DOORS e IBM RequisitePro, con el objetivo de que los modelos de negocio sean construidos a partir de las ltimas versiones de los requisitos. Integrando con estos productos es posible gestionar la trazabilidad entre requisitos y modelos. Adicionalmente, si se ha elegido Borland Caliber RM para la Gestin de Requisitos, Together Architect incorpora un cliente embebido con toda la funcionalidad del cliente nativo, con el objetivo de que el arquitecto pueda participar en el proceso de Gestin de Requisitos.

arrollo como JBuilder, Eclipse, C++Builder o MS VS.NET. De este modo, es posible que todo el equipo de desarrollo comparta una nica visin del sistema, y que cualquier cambio en los modelos sea automticamente notificado al resto de miembros del equipo de desarrollo. Adems, los modelos relacionados con la plataforma estn completamente sincronizados con el cdigo. Esto significa que cualquier cambio que realice un programador en el cdigo Java, C#, C++, Visual Basic, etc. a travs de una refactorizacin por ejemplo, ser de igual forma visible por los perfiles que trabajen sobre el modelo.

La independencia de la tecnologa
El coste de acoplar una arquitectura a una infraestructura concreta, en un entorno tecnolgico cambiante como el actual, puede ser muy elevado. Es por ello que Together Architect posibilita crear modelos independientes de la plataforma, permitiendo una rpida adaptacin a cambios tecnolgicos o a cambios en los requisitos. Por ejemplo, en lugar de definir un sistema en base a un determinado lenguaje de programacin, Together permite crear modelos en un lenguaje formal independiente de la plataforma, para posteriormente ser convertidos a la plataforma .NET o a J2EE. El cdigo fuente es generado en un proceso de transformacin, de forma que los programadores pueden trabajar posteriormente en ese lenguaje con su entorno de desarrollo preferido.

Cohesin total
Como se ha visto, la sincronizacin y la trazabilidad son las principales caractersticas de un desarrollo en el que el modelo conceptual se ha realizado con Together. Por una parte, como hemos comentado, los requisitos estn trazados con los elementos del modelo. En segundo lugar, los diferentes modelos pueden enlazarse entre s, permitiendo, por ejemplo, asociar modelos independientes de la plataforma o de negocio con modelos dependientes de la plataforma. Por ltimo, los modelos dependientes de la plataforma estn siempre sincronizados con el cdigo. De esta forma, se consigue cohesionar al equipo de desarrollo, aumentando el control y gestin del cambio, y la visibilidad compartida del sistema. Gracias a su capacidad de mantener cdigo y modelos sincronizados, Together es la solucin ideal para realizar ingeniera inversa de sistemas, generando de ese modo modelos a partir de cdigo existente. La ingeniera inversa facilita la comprensin de un sistema y su mantenimiento. En efecto, a travs de las capacidades de refactoring, aplicacin de

Borland Together Architect


Borland Together Architect es la respuesta de Borland a todas estas necesidades y a muchas ms. Together Architect es una solucin gil de modelado diseada por Borland para ayudar a las compaas de desarrollo a crear, mantener y comunicar los modelos conceptuales de un sistema a partir de los requisitos.

MDA ya es una realidad


Con una clara orientacin al desarrollo orientado por el modelo (MDD), esta herramienta permite hacer realidad la filosofa MDA, permitiendo a los equipos de desarrollo transformar requisitos en cdigo mediante un entorno visual fcil de usar, y con soporte a todos los diagramas del lenguaje UML, incluyendo los definidos en la versin 2.0 de la especificacin y OCL (Object Constraint Language).

Visin nica del sistema


Los modelos de un sistema pueden ser compartidos por Analistas de Negocio (vase Together Designer en el nmero anterior de Slo Programadores) o por los programadores, a travs de los diversos plug-ins de Together para entornos de des-

http://digital.revistasprofesionales.com

51

SOLO PROGRAMADORES n 124

DISEO

patrones de diseo, auditora de cdigo y mtricas de diseo, Together permite valorar la calidad de un sistema, y facilitar su mantenimiento correctivo y evolutivo.

Patrones de diseo
La aplicacin de patrones de diseo permite reutilizar soluciones previamente probadas por otros para resolver problemas que se repiten entre proyectos, as como ajustar nuestras aplicaciones a las buenas prcticas de la industria. Together incorpora los patrones de diseo creacionales, estructurales y de comportamiento conocidos como GoF (Gang-of-Four), adems de proporcionar los principales patrones de diseo aplicables a la plataforma especfica de desarrollo. Pero qu ocurre si queremos definir nuestros propios patrones de diseo, o buenas prcti-

Patrones de diseo en Together.

Auditoras en Together.

go fuente antes de ser entregado, y garantizar la homogeneidad de calidad entre los diferentes miembros del equipo de desarrollo. Por defecto, Together verifica el cumplimiento de las buenas prcticas y nomenclaturas estndares para el lenguaje de programacin seleccionado, pero es posible construir un conjunto propio de reglas sintcticas y de programacin, que podr de nuevo ser utilizado y validado en las herramientas de codificacin. Algo similar ocurre con la calidad del propio diseo. Cuantificar la calidad del diseo Orientado a Objetos en trminos de acoplamiento, tamao, cohesin, complejidad, uso de herencia y polimorfismo, etc. permite conocer la calidad y eficiencia del equipo y de los procesos de desarrollo, y detectar futuros problemas de extensibilidad, flexibilidad, robustez o facilidad de mantenimiento de una solucin. Together permite aplicar mltiples mtricas cuantificativas de la calidad de un desarrollo en

cas? Ningn problema: Together es una herramienta totalmente flexible y extensible. Podemos definir nuestros propios patrones de diseo para poder ser reutilizados en otros proyectos, y de esa forma crearnos nuestro propio catlogo de patrones personalizado, que podrn tambin ser utilizados tambin desde las herramientas de desarrollo preferidas de los programadores.

Garantas de calidad
Otra de las necesidades actualmente ms importante para un arquitecto, o Responsable de Desarrollo, es el poder valorar la calidad del cdigo fuente en base a un conjunto de normativas, nomenclaturas, buenas prcticas y guas de estilo, bien universalmente aceptadas (por ejemplo, los blueprints de la plataforma J2EE) o definidos para un cliente o de forma corporativa. Together permite auditar el cdi-

Mtricas en Together.
http://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

52

DISEO

Together Architect, el enlace entre el problema y la solucin

Documentacin en Together.

trminos del uso de la Programacin Orientada a Objetos, y, cmo no, definir nuestro propio conjunto de mtricas.

Metodologas
Together es mucho ms que una herramienta de modelado. Es una herramienta completa de ingeniera que permite asegurar la calidad de un desarrollo y el cumplimiento de los requisitos de un sistema. Adems, es una herramienta que nos ofrece la flexibilidad necesaria para poder continuar utilizando cualquier proceso y metodologa de desarrollo. Desde RUP a eXtreme Programming. Tener libertad de eleccin del proceso de desarrollo, en funcin del equipo de desarrollo y del proyecto concreto es otra de las grandes ventajas de Together.

soporta diagramas no UML de gran importancia y utilidad en los desarrollos actuales, como diagramas Entidad Relacin lgicos y fsicos (estos ltimos con generacin de script SQL y sincronizacin con tablas relacionales), diagramas de XML Schemas, diagramas de modelado de procesos de negocio, modelado en color, y un largo etctera. Adems, permite la exportacin/importacin de los proyectos conforme al estndar XMI, adems de importaciones especficas de diagramas realizados mediante Rose.

discusin, vistas evolutivas y correctivas, etc. Imaginaros que se produce una peticin de cambio en el sistema: automticamente, los arquitectos responsables de atender a la peticin de cambio sern notificados en su herramienta de trabajo, y podrn enlazar los cambios que realicen en el modelo del sistema a la incidencia, permitiendo de ese modo poder conocer qu cambios se han realizado para atenderla. Del mismo modo, la planificacin del proyecto que se ha definido, por ejemplo, con MS Project, generar de forma automtica tareas para cada uno de los perfiles del proyecto, de forma que cuando abran su herramienta de modelado podrn conocer cules son las tareas que debe realizar sin necesidad de consultar el Gantt del proyecto. Adicionalmente, Together permite comparar modelos, para conocer los cambios que se han producido a lo largo del proyecto, compartir diagramas y fragmentos de los mismos entre proyectos, etc.

Conclusiones
La edicin de Together para el Arquitecto, como hemos visto, no es una solucin aislada dentro del ciclo de vida de desarrollo. Est totalmente integrada en la fase de Gestin de Requisitos, as como en la de Programacin, y proporciona cohesin y visibilidad a todo el equipo de desarrollo, gracias a la integracin de la herramienta con las soluciones de trabajo en grupo lderes en el mercado. En el prximo nmero analizaremos las soluciones de Borland para los programadores, y mostraremos cmo es posible que stos accedan desde su herramienta de codificacin a los modelos definidos por el arquitecto y cmo mantenerlos en sincrona con el cdigo.

Y el trabajo en grupo?
Together permite integrar con mltiples soluciones de control de versiones y configuraciones. En el caso de que utilicis Borland StarTeam como herramienta de trabajo en grupo, Together incluye un cliente embebido que permite no nicamente realizar las actividades tpicas de control de versiones, sino trabajar con peticiones de cambio, tareas, foros de

Documentacin
Sin embargo, para tener total flexibilidad a la hora de elegir nuestra metodologa de desarrollo, es tambin necesario que podamos decidir cmo queremos entregar y documentar nuestro sistema. Con Together, es posible generar documentacin de todo el modelo a partir de plantillas de documentacin personalizables, en formato HTML, RTF o PDF. Podemos seleccionar el formato, la informacin a incluir y el nivel de detalle. Por supuesto, podremos incluir en nuestro documento de proyecto las relaciones del modelo con el cdigo (y su documentacin estndar) y las relaciones con los requisitos de la aplicacin. Un nico documento para todo el proyecto, generado automticamente con un simple clic de ratn con la ltima informacin disponible.

UML y mucho ms
Para terminar el conjunto de capacidades de la herramienta, hay que sealar que Together
StarTeam en Together.

http://digital.revistasprofesionales.com

53

SOLO PROGRAMADORES n 124

DISEO

Diseo multiplataforma para aplicaciones C++ (y III)


GABRIEL DOS SANTOS DVILA

En esta ltima entrega nos centraremos en conocer algunas clases adicionales de ACE que nos permiten escribir cdigo portable y algunas que implementan patrones de diseo de uso bastante habitual.
Introduccin
Las dos entregas anteriores nos sirvieron para entender hasta qu punto la librera ACE puede ayudarnos a disear y escribir aplicaciones C++ multiplataforma. En la entrega que ahora nos ocupa veremos cmo trabajar con la fecha y la hora, cmo gestionar el sistema de ficheros y algunos patrones de diseo que la librera ACE nos ayudar a implementar.

Operar con fechas y horas


La funcin time() de C devuelve la cantidad de segundos que han pasado desde el primero de enero de 1970 como un entero largo de tipo time_t. La plataforma Unix provee la estructura

timeval para encapsular una fecha/hora. Lo importante es que tambin en este aspecto, diferentes sistemas operativos proveen primitivas diferentes para la gestin de estos datos. La clase ACE_Time_Value de la librera ACE provee una interfaz portable que encapsula un valor de tipo tiempo. Puede encapsular un intervalo de tiempo (por ejemplo una determinada cantidad de segundos o microsegundos) o una fecha absoluta. Esta clase permite convertir entre formatos de tiempo de diferentes plataformas. Sus funciones pblicas son: set(): Permite establecer el valor de fecha. Hay versiones sobrecargadas para cualquiera de los tipos de fecha disponibles en las distintas plataformas. sec(): Devuelve slo el componente de segundos del valor encapsulado. usec(): Devuelve slo el componente de microsegundos del valor encapsulado. msec(): Convierte el valor encapsulado (sec()+usec()) en un valor de milisegundos y devuelve este valor. Tambin posee operadores de comparacin sobrecargados para poder comparar un objeto ACE_Time_Value con otros. Para poder usar esta clase es necesario incluir el fichero ace/ Time_Value.h. Podemos obtener la hora actual del sistema de la siguiente manera:
#include <ace/Time_Value.h> #include <ace/System_Time.h> Ace_Time_Value hora_actual; ACE_System_Time::get_local_system _time(hora_actual);

Este cdigo deja en la variable hora_actual la hora del sistema.

Acceso al sistema de ficheros


La librera estndar de C++ provee clases de tipo template que nos permiten trabajar fcilmente con el contenido de un fichero e incluso crear ficheros nuevos. Utilizando estas funciones podremos abrir, cerrar, leer y escribir desde y hacia ficheros tanto en modo texto como en modo binario. El punto en el

Documentacin de la clase ACE_System_Time.

SOLO PROGRAMADORES n 124

54

http://digital.revistasprofesionales.com

DISEO

Diseo multiplataforma para aplicaciones C++ (y III)

LISTADO 1
#include <ace/OS.h> #include <string> #include <iostream>

Borrar un fichero del disco

int main(int argc, char* argv[]){ try{ if (argc<2) return -1; std::string fichero(argv[1]); std::cout << Realmente desea borrar el fichero << fichero << ?<< std::endl; std::string borrar; std::cin >> borrar; if (borrar==s){ int result= ACE_OS::unlink(fichero.c_str()); if (result<0){ std::cout << No se pudo eliminar el fichero. << Es posible que no exista. << std::endl; } return result; } return 0; }catch(...){ std::cout << Excepcin durante la ejecucin << std::endl; return -1; } }

En el listado 1 vemos el contenido del fichero main.cpp. En la funcin main() se verifica que el ejecutable haya sido invocado con un parmetro y se utiliza la funcin ACE_OS::unlink() para eliminar el fichero solicitado, no sin antes confirmar la eliminacin. Hemos de tener mucho cuidado con el uso de este programa porque en Windows no mueve los ficheros a la papelera de reciclaje sino que los borra directamente y si borramos un fichero por error slo podremos recuperarlo con una herramienta de recuperacin de ficheros borrados y un poco de suerte. La funcin ACE_OS::unlink utiliza las funciones especficas de cada sistema operativo para eliminar el fichero indicado y devuelve un nmero entero. Si devuelve un valor menor que cero significa que la llamada a la funcin fall. Esto podra ocurrir porque el fichero est siendo usado y por ello no puede eliminarse, porque no se cuenta con los permisos suficientes para borrarlo o simplemente porque el fichero no existe.

LISTADO 2
#include #include #include #include <ace/OS.h> <ace/Dirent_Selector.h> <string> <iostream>

Mostrar todos los archivos de un directorio

Listar los contenidos de un directorio


Para crear una lista de todos los archivos contenidos dentro de un directorio utilizaremos la clase ACE_Dirent_Selector. Esta clase implementa un iterador de entradas de directorio basado en la funcin scandir del API POSIX al que se le pueden pasar filtros para limitar los resultados devueltos. Nuevamente partiremos de nuestro esqueleto vaco de la primera entrega y en el fichero main.cpp escribiremos el cdigo del listado 2. El programa recibe como parmetro una ruta del sistema de ficheros (el nombre de un directorio) y muestra todos los archivos y subdirectorios contenidos en ste, incluidos los denominados . y .. que representan al directorio actual y al directorio padre del mismo. Si en lugar de un directorio se indica como parmetro un nombre de archivo, la funcin length() devolver 0 y el programa no dar ningn error. El operador [] de la clase ACE_Dirent _Selector devuelve un puntero a una estructura dirent que posee informacin sobre cada una de las entradas del directorio de la cual slo nos interesa el nombre, el cual obtenemos por medio de atributo d_name, que contiene un char* con el nombre de la entrada. Si en lugar de mostrar slo el contenido de un directorio quisiramos mostrar el de un rbol de directorios completo bastara con cambiar la funcin listar_directorio() para que funcione recursivamente de la siguiente manera:

void listar_directorio(char* directorio){ ACE_Dirent_Selector dir; dir.open(directorio); for(int i=0;i<dir.length();i++){ std::cout << std::string(dir[i]->d_name) << std::endl; } dir.close(); //No es necesario pues est en el stack //y se ejecuta en el destructor } int main(int argc, char* argv[]){ try{ if (argc<2) return -1; listar_directorio(argv[1]); }catch(...){ std::cout << Excepcin durante la ejecucin << std::endl; return -1; } return 0; }

que la librera estndar carece de funcionalidad es en el referente al trabajo con los ficheros en si en lugar de su contenido. Si necesitamos borrar ficheros o listar los ficheros dentro de un directorio no podremos hacerlos utilizando la librera estndar. La navegacin de un sistema de ficheros no es igual en Windows que en Unix y por lo tanto necesitaremos utilizar las abstracciones de ACE para realizar estas tareas de forma portable.

Borrar ficheros
El borrado de un fichero es una tarea sumamente simple utilizando ACE. Para comprobarlo haremos una copia del proyecto Esqueleto que creamos en la primera entrega y modificaremos el cdigo del mismo para que reciba un nombre de fichero como parmetro de la lnea de comandos y, luego de pedir una confirmacin, lo borre del disco.

http://digital.revistasprofesionales.com

55

SOLO PROGRAMADORES n 124

DISEO

void listar_directorio(char* directorio){ ACE_Dirent_Selector dir; std::cout << std::string(dir[i]->d_name) << std::endl; dir.open(directorio); for(int i=0;i<dir.length();i++){ if (nombre!=. && nombre!=..) listar_directorio(dir[i]->d_name); } dir.close(); }

LISTADO 3
#include #include #include #include <ace/OS.h> <ace/Dirent_Selector.h> <string> <iostream>

Filtrar la lista de archivos

int dirselector(const dirent * d){ int i=1; std::string filename(d->d_name); if (filename.find(.txt)==std::string::npos) return 0; else return 1; } void listar_directorio(char* directorio){ ACE_Dirent_Selector dir; dir.open(directorio,dirselector); for(int i=0;i<dir.length();i++){ std::cout << std::string(dir[i]->d_name) << std::endl; } dir.close(); //No es necesario pues est en el stack //y se ejecuta en el destructor } int main(int argc, char* argv[]){ try{ if (argc<2) return -1; listar_directorio(argv[1]); }catch(...){ std::cout << Excepcin durante la ejecucin << std::endl; return -1; } return 0; }

Para probar el cdigo debemos compilarlo y ejecutarlo pasando como parmetro un nombre de directorio. Si todo funciona correctamente, veremos por la salida estndar la lista de los archivos contenidos en el directorio y en todo el rbol de subdirectorios. El listado de archivos de este ejemplo incluye todas las entradas de los directorios pero es posible que en algn caso deseemos filtrar el listado mostrando slo algunas de las que aparezcan. Una posibilidad para hacer esto es agregar un sentencia if antes de mostrar el nombre por salida estndar en la funcin listar_directorio, tal como hacemos en este ejemplo para filtrar las entradas . y .. pero ACE provee una solucin similar que ya viene incorporada dentro del framework. Para lograr este objetivo debemos crear una funcin que acte como filtro y pasrsela como parmetro al mtodo open de ACE_Dirent_Selector. El primer paso ser crear una funcin con la firma:
int nombre_funcion(cons dirent* d)

nuestro caso, crearemos una funcin que muestre slo los ficheros que contengan .txt en su nombre y que filtre el resto, pero podra extenderse para filtrar cualquier cosa que deseemos. En main.cpp, antes de la funcin main(), agregaremos la siguiente funcin:
int dirselector(const dirent * d){ int i=1; std::string filename(d->d_name); if (filename.find(.txt)== std::

string::npos) return 0; else return 1; }

Esta funcin ser invocada automticamente por cada entrada de directorio detectada por ACE_Dirent_Selector y debe devolver 1 para aceptar esa entrada o 0 para filtrarla. En

La funcin dirselector extrae el nombre de la entrada de la estructura dirent, si este nombre corresponde a alguno de los elementos que no deseamos mostrar devuelve 1 y si no devuelve 0. Por ltimo, remplazaremos la invocacin al mtodo open de la clase ACE_Dirent _Selector en la funcin listar_directorio por lo siguiente:
dir.open(directorio,dirselector);

En el listado 3 podemos ver la versin final del programa con el filtro activado. Si lo compilamos y ejecutamos, slo mostrar aquellos ficheros que nos interesan.

Patrones de diseo
Dentro de las facilidades de ACE podemos encontrar no slo clases que nos permiten escribir cdigo portable sino tambin otros conjuntos de clases que implementan algu-

Listado de directorios generado por la aplicacin de ejemplo.

SOLO PROGRAMADORES n 124

56

http://digital.revistasprofesionales.com

DISEO

Diseo multiplataforma para aplicaciones C++ (y III)

Site del libro en el que se basa el diseo de ACE.

LISTADO 4

parametros.hpp, primera versin

#ifndef PARAMETROS_HPP #define PARAMETROS_HPP class parametros{ public: parametros(void); ~parametros(void); std::string leer_parametro(std::string nombre); void modificar_parametro( std::string nombre, std::string valor ); private: //crear una variable para guardar los parametros }; #endif //PARAMETROS_HPP

configuracin. El objeto que provea esta funcionalidad deber estar accesible desde toda la aplicacin y deber existir una nica instancia para tener centralizado el control de los parmetros. Tenemos aqu un excelente candidato a ser implementado como un Singleton. En primer lugar crearemos la cabecera de la clase que encapsula los parmetros (parametros.hpp, vase el listado 4) A continuacin crearemos la implementacin (parametros.cpp). No nos detendremos a describir la implementacin completa de las funciones para leer y guardar los parmetros pues no es ese el objetivo del artculo. En cambio, nos limitaremos a definir los mtodos necesarios y ver cmo convertir la clase en un Singleton (vea esto en el listado 5). Una vez escrita la clase, haremos las modificaciones necesarias para la implementacin del patrn Singleton en el fichero parametros.hpp (vase el listado 6). Como podemos ver en el cdigo hemos realizado tres modificaciones. Para implementar el patrn Singleton alcanza con la declaracin del tipo parametros_singleton. Adicionalmente hemos hecho privado el constructor de la clase parmetros y declaramos a la clase Singleton como friend para evitar que algn programador pueda crear
parametros.cpp

nos frameworks y patrones de diseo de uso habitual tambin de manera independiente de la plataforma, basndose para ello en las clases Wrapper Faade que hemos visto hasta ahora.

LISTADO 5

Singleton
El patrn Singleton define una tcnica para asegurar que slo existe una instancia de una clase determinada durante todo el tiempo de vida de un programa. Podra entenderse como el equivalente orientado a objetos de una variable global. Se utiliza en ocasiones en que un mismo objeto debe utilizarse en muchas partes del cdigo de un programa, en funciones distintas. Para ello, en lugar de pasar referencias entre funciones a la nica instancia, se emplea un Singleton que permita accederla de manera global. ACE provee clases template que permiten de manera muy sencilla transformar cualquier clase en un Singleton. Para ello crearemos en primer lugar la clase en cuestin. Supongamos que tenemos una aplicacin cuyos parmetros de configuracin se han de mantener en memoria en un lugar centralizado y queremos crear una clase para encapsular el acceso a estos parmetros de

#include parametros.hpp parametros::parametros(void){ //lee fichero de paramtros } parametros::~parametros(void){ //escribe fichero de parametros } std::string parametros::leer_parametro(std::string nombre){ //devuelve el valor de un parametro return ; } void parametros::modificar_parametro( std::string nombre, std::string valor){ //modifica el valor de un parametro }

LISTADO 6

parametros.hpp, segunda versin

#include <string> #include <ace/Singleton.h> #include <ace/Null_Mutex.h> class parametros{ friend class ACE_Singleton<parametros,ACE_Null_Mutex>; public: ~parametros(void); std::string leer_parametro(std::string nombre); void modificar_parametro( std::string nombre, std::string valor ); private: parametros(void); //crear una variable para guardar los parametros }; typedef ACE_Singleton<parametros,ACE_Null_Mutex> parametros_singleton;

http://digital.revistasprofesionales.com

57

SOLO PROGRAMADORES n 124

DISEO

instancias de la clase parmetro por su cuenta, saltendose la restriccin del Singleton. La clase template ACE_Singleton recibe dos parmetros. El primero es la clase a la que queremos convertir en Singleton y el segundo es el tipo de mecanismo de exclusin mutua a utilizar para sincronizar el acceso de los distintos threads a la nica instancia del Singleton. En aplicaciones de un nico thread se puede usar ACE_Null _Mutex, en cuyo caso no se aplicar ningn mecanismo de exclusin. Si estamos creando una aplicacin multithreaded, es necesario que la declaracin del Singleton utilice ACE_Recursive_Thread_Mutex:
typedef ACE_Singleton<parametros, ACE_Recursive_Thread_Mutex> parametros_singleton;

LISTADO 7
#include parametros.hpp #include <string> #include <iostream> int main(int argc, char* argv[]){ parametros * ptr1=parametros_singleton::instance(); parametros * ptr2=parametros_singleton::instance(); if (ptr1==ptr2){ std::cout << Ambos punteros apuntan al mismo objeto << std::endl; } //ptr1=new parametros(); return 0; }

main.cpp

LISTADO 8

Sobrescribiendo el mtodo svc()

En este caso el Singleton se encargar automticamente de sincronizar los accesos desde mltiples threads. Como nuestra aplicacin tendr un slo thread no utilizaremos mecanismo de exclusin mutua. Una vez que hemos creado la clase Singleton veremos como podemos utilizarla en un programa de prueba. El acceso a la nica instancia del Singleton se efecta a travs de un mtodo llamado instance() que devuelve un puntero a una instancia de la clase que el Singleton est encapsulando. El programa de ejemplo invoca dos veces a la funcin instance() y compara los resultados devueltos para verificar que se trata de la misma instancia (vase el listado 7). La penltima lnea de la funcin main est comentada. Esta lnea intenta crear una instancia de la clase parametros de manera directa por medio de new. Si quitamos las barras de comentario de esta lnea e intentamos compilar ese cdigo, el compilador nos devolver un error porque la clase parametros no tiene ningn constructor pblico. Por eso para que la clase ACE_Singleton pueda crear instancias ha sido declarada como friend.

int echo_svc_handler::svc () { char buffer[4096]; ssize_t bytes_received; while ((bytes_received = peer().recv(buffer, sizeof(buffer))) > 0) { std::string recibido(buffer,bytes_received); std::cout << recibido.c_str() << std::endl; peer().send_n (buffer, bytes_received); } peer().close (); return 0; }

Acceptor-Connector
Este patrn se aplica en servicios que deben cooperar y se encuentran distribuidos en distintas mquinas. Para poder trabajar en conjunto debern establecer una conexin de red entre si y el objetivo de este patrn es permitir separar la lgica requerida para establecer las conexiones de la lgica que realiza las tareas reales del servicio o lgica de aplicacin. Los roles de una aplicacin que utiliza una conexin de red pueden dividirse en dos: Rol de conexin: Determina el papel que juega en el establecimiento de una cone-

xin. Puede ser un papel activo (el que solicita la conexin) llamado Connector o un papel pasivo (el que est escuchando a la espera de peticiones) llamado Acceptor. Rol de comunicacin: Determina si el componente cumple el papel de servidor o de cliente (o ambos) durante la utilizacin de la conexin. La aplicacin de este patrn separa claramente los dos tipos de roles. Adems, una vez escrito el cdigo para establecer una conexin (ya sea de manera activa o pasiva) es muy poco probable que ste cambie. Por el contrario, el cdigo relacionado con el rol de comunicacin seguramente deber evolucionar con el tiempo y sta evolucin se ver simplificada por el patrn Acceptor-Connector. La lgica de trabajo del componente se implementa en un Service Handler o Gestor de Servicios. Tambin es importante destacar que si bien este artculo se refiere a la aplicacin de este patrn en conexiones de red por ser el ejemplo ms claro y fcil de comprender, el mismo puede aplicarse a cualquier tipo de comunicacin entre procesos y ACE provee la flexibilidad para hacerlo. La clase ACE_Svc_Service_Handler provee la base para implementar el cdigo del comportamiento de la aplicacin. Esta es una clase template cuyos parmetros son el tipo de Stream (o corriente de datos) que se utilizar para conectarse con el componen-

te remoto y el mecanismo de sincronizacin de threads a utilizar. Si quisiramos implementar el servidor echo de la primera entrega de esta serie usando este patrn, comenzaramos por declarar la clase handler del servicio:
class echo_svc_handler : public ACE_Svc_Handler<ACE_SOCK_Stream, ACE_INET_Addr, ACE_NULL_SYNCH>{ public: int svc (); };

Esta clase hereda de la clase ACE_Svc _Handler. El parmetro ACE_SOCK _Stream de la clase template indica que los datos hacia el otro extremo de la conexin se enviarn a travs de un objeto de esa clase, ACE_INET_Adrr describe el tipo de direccin que identificar el otro extremo de la conexin y el parmetro ACE_NULL _SYNCH sirve para indicar que no se ha de hacer ningn control de sincronizacin de threads. Para la implementacin del comportamiento de la clase, slo necesitamos sobrescribir el mtodo virtual svc() de ACE_Svc_Handler de la manera en que se muestra en el listado 8. Hay varios mtodos de ACE_Svc_Handler que podemos sobrescribir: open(): Inicializacin del servicio. svc(): Ejecuta el trabajo del servicio. close(): Finalizacin de las tareas del servicio.

SOLO PROGRAMADORES n 124

58

http://digital.revistasprofesionales.com

DISEO

Diseo multiplataforma para aplicaciones C++ (y III)

En la documentacin de ACE podemos encontrar un detalle de todos los mtodos disponibles. Para acceder al stream que nos comunica con el otro extremo de la conexin usamos la funcin peer() de la clase ACE_Svc_Handler, que nos devuelve una referencia a un objeto de tipo ACE_SOCK _Stream o ms precisamente del tipo especificado como primer parmetro de la clase template. A diferencia del ejemplo de la primera entrega, en este servidor echo no aparece el cdigo relacionado con aceptar y establecer la conexin mezclado con el cdigo necesario para que el servidor haga su trabajo lo cual mejora la separacin de responsabilidades. Por ltimo debemos escribir el cdigo para que nuestro servidor echo comience a escuchar y acepte conexiones. Este cdigo sera similar al siguiente:
typedef ACE_Acceptor<echo_svc_handler, ACE_SOCK_ACCEPTOR> echo_acceptor; ACE_INET_Addr port_to_listen(7); echo_acceptor acceptor(port_to_listen);

Documentacin de la clase ACE_Reactor.

Al recibir una direccin en su constructor el acceptor comienza inmediatamente a escuchar en ella. Por cada peticin que el acceptor reciba, crea una instancia de la clase echo_svc_handler e invoca al mtodo svc(). De esta manera, habr una instancia independiente para gestionar cada peticin, eso s, todas en el mismo thread. El cdigo explicado en este ejemplo es mucho ms limpio y elegante an que el de la primera entrega, que ya representaba una mejora significativa sobre el mtodo de programacin estndar. He aqu la utilidad de los patrones de diseo.

Reactor
El patrn de diseo Reactor simplifica el desarrollo de aplicaciones orientadas a eventos. Estos eventos pueden ser disparados por seales del sistema operativo, algn mecanismo de comunicacin entre procesos (tambin conocidos como IPC por sus siglas en ingls) o simplemente por el paso del tiempo. As como el objetivo del patrn AcceptorConnector es separar la responsabilidad de establecer la conexin de red del cdigo de trabajo de la aplicacin, el patrn Reactor tiene como principal objetivo separar cdigo que detecta la ocurrencia del evento deseado del cdigo de trabajo de la aplicacin. Estos aspectos estn encapsulados por las clases ACE_Reactor y ACE_Event_Handler respectivamente.

La clase abstracta ACE_Reactor provee una interfaz portable para un conjunto de subclases que encapsulan llamadas a funciones como WaitForMultipleObjects() de Windows o select() de Unix, logrando de esta manera una implementacin completamente multiplataforma de este patrn de diseo. Un ACE_Reactor monitorea algn evento determinado y mantiene una lista de objetos interesados en ser notificados cuando el mismo ocurra. La clase reactor se encarga de notificar a todos los objetos interesados cuando ocurre el evento. Los objetos de esta lista deben ser de una clase derivada de ACE_Event _Handler. Disponemos de varias funciones para gestionar la lista de event handlers registrados: register_handler(): Permite agregar un handler a la lista. remove_handler(): Permite eliminar un handler de la lista. suspend_handler(): Permite detener temporalmente el envo de notificaciones a un handler determinado. resume_hander(): Reinicia el envo de notificaciones a un handler suspendido. Hay 3 subclases concretas de la clase ACE_Reactor: ACE_Select_Reactor encapsula el uso de la funcin select() de Unix. ACE_WFMO_Reactor encapsula la funcin WaitForMultipleObjects(). ACE_TP_Reactor() permite extender el patrn a un pool de threads. La funcin handle_events() hace que el reactor comience a monitorear el evento seleccionado. Como ya hemos mencionado el cdigo especfico de la aplicacin es encapsulado

por una subclase de ACE_Event_Handler. Esta clase base define mtodos virtuales cuyo nombre comienza con handle_ y que deben ser anulados en la subclase para implementar el comportamiento requerido: handle_input(): Se utiliza cuando el reactor moniterea una conexin de red a la espera de datos. handle_signal(): Se utiliza cuando el reactor monitorea una seal del sistema operativo como con WaitForMultipleObjects() por ejemplo. handle_close(): Sirve para colocar aqu el cdigo necesario para liberar cualquier recurso que el event handler tuviera en uso. handle_timeout(): Es llamado cuando el reactor est monitoreando un temporizador y ocurre cuando el temporizador alcanza el tiempo indicado.

Conclusiones
A lo largo de estas tres entregas hemos cubierto una parte de la funcionalidad de ACE. Esta librera no slo posee un excelente diseo de arquitectura sino que nos facilita la creacin de un diseo igual de bueno en nuestro propio cdigo. Un buen diseo, flexible y claro, debera ser siempre uno de nuestros objetivos a la hora de disear una aplicacin. ACE es adems muy eficiente y compatible con una amplia variedad de compiladores y sistemas operativos. Esto agregado a la enorme cantidad de funcionalidad que provee la convierte en una opcin ideal para la implementacin de aplicaciones en las cuales la independencia de la plataforma es una necesidad.

http://digital.revistasprofesionales.com

59

SOLO PROGRAMADORES n 124

DUDAS

Preguntas y respuestas
ADOLFO ALADRO GARCA

En una aplicacin en C/C++ para Windows, existe alguna forma de hacer que se llame a una funcin con un retardo determinado, sin necesidad de utilizar threads o procesos? En el API de Windows existe la funcin SetTimer, la cual permite establecer un temporizador. Este mecanismo puede emplearse precisamente para hacer que la llamada a una funcin se ejecute con un cierto retardo. Por ejemplo:
SetTimer(hwnd, IDT_TIMER1, 5000, NULL);

Caractersticas de los componentes de una interfaz


Propiedad FileChooser.ancestorInputMap FileChooser.cancelButtonMnemonic FileChooser.detailsViewIcon FileChooser.directoryOpenButtonMnemonic FileChooser.helpButtonMnemonic FileChooser.homeFolderIcon FileChooser.listViewIcon FileChooser.newFolderIcon FileChooser.openButtonMnemonic FileChooser.saveButtonMnemonic FileChooser.upFolderIcon FileChooser.updateButtonMnemonic FileView.computerIcon FileView.directoryIcon FileView.fileIcon FileView.floppyDriveIcon FileView.hardDrive ventana principal de la aplicacin se define de la siguiente manera:
LRESULT CALLBACK WindowProcedure ( HWND UINT hwnd, uMsg, } } ... }

La llamada anterior recibe cuatro parmetros. El primero es el manejador de la ventana principal de la aplicacin. El segundo es una constante define que permite identificar al temporizador. El tercer parmetro indica el nmero de milisegundos que transcurrirn antes de que salte el temporizador. Finalmente, el ltimo parmetro es un puntero a la funcin responsable de procesar los mensajes del temporizador. Cuando este parmetro es NULL los mensajes llegan al procedimiento de ventana principal de la aplicacin. Cada vez que el temporizador salta el sistema hace llegar a la funcin de procesamiento un mensaje del tipo WM_TIMER. El parmetro wParam del mensaje representa el identificador del temporizador y el parmetro lParam es un puntero a la funcin de procesamiento que se pas como parmetro. As por ejemplo si el procedimiento de

Objeto InputMap Integer Icon Integer Integer Integer Icon Icon Icon Integer Integer Icon Integer Icon Icon Icon Icon

WPARAM wParam, LPARAM lParam ) { ... }

Estoy desarrollando un Applet firmado que emplea un componente JFileChooser para que el usuario pueda salvar unos ficheros y me gustara poder personalizar el componente para que algunos botones no salieran, o salieran con los iconos que yo quiero, etc. He estado revisando el API y no encuentro ningn mtodo que me permita hacer estas cosas, es posible? En principio la capacidad de personalizacin del componente JFileChooser es bastante limitada en lo que al API se refiere. No obstante s que existe un buen nmero de propiedades que puedes establecer empleando la clase UIManager. Esta clase sirve, entre otras muchas cosas, para fijar las caractersticas relativas al aspecto, y en algunos casos incluso al comportamiento de los componentes que se emplean en una aplicacin o Applet Java. La
http://digital.revistasprofesionales.com

Los mensajes procedentes de los temporizadores pueden procesarse tal y como se muestra a continuacin:
switch (uMsg) { ... case WM_TIMER:

Documentacin de la funcin SetTimer (http://msdn.microsoft.com/library/default .asp?url=/library/en-us/winui/winui/ windowsuserinterface/windowing/timers/ timerreference/timerfunctions/settimer.asp).

{ if (wParam==IDT_TIMER1) { KillTimer(hwnd, IDT_TIMER1);

SOLO PROGRAMADORES n 124

60

Luchas contra el caos?


ahora puedes solucionarlo !!

Consigue por slo 6 euros un archivador de revistas valorado en 5,41 euros y un archivador de cds valorado en 4,20 euros. Haz tu pedido llamando al telfono 91 304 87 64, por fax al 91 327 13 03 o por correo electrnico a rpsuscripciones@revistasprofesionales.com, indicando tus datos personales y la forma de pago (giro postal, domiciliacin bancaria, tarjeta de crdito o contrareembolso*).

REVISTAS PROFESIONALES - C/ Valentn Beato, 42 - 3 plta. - 28037 Madrid


*en opcin contrareembolso se cobrar un suplemento de 5 euros por gastos de envo En opcin domiciliacin bancaria, se ruega aporten los datos completos de la entidad bancaria (nombre, direccin y nmero de cuenta completo)

DUDAS

LISTADO 1

Explorando componentes

public static void getComponents(Component component, ArrayList alComponents) { alComponents.add(component); if (component instanceof Container) { Container container = (Container)component; Component[] components = container.getComponents(); if (components!=null) { int iComponentsLength = components.length; if (iComponentsLength>0) { for(int i=0; i<iComponentsLength; i++) { getComponents(components[i], alComponents); } } } } }

Aspecto de un componente JFileChooser al que se le ha eliminado el botn de detalles.

LISTADO 2

Cambios en los componentes

Y posteriormente se muestra la lista de la siguiente forma:


int iSize = alComponents.size(); for (int i=0; i<iSize; i++) { Component component = (Component) alComponents.get(i); System.err.println(component); }

if (component instanceof AbstractButton) { Icon icon = ((AbstractButton)component).getIcon(); if (icon!=null) { String sIconClassName = icon.getClass().getName(); if (sIconClassName.indexOf(MetalIconFactory$FileChooserDetailViewIcon)!=-1) { component.getParent().remove(component); } } }

tabla Caractersticas de los componentes de una interfaz muestra un resumen de esto. La primera columna contiene el nombre de la propiedad y la segunda el tipo de objeto que espera recibir. Obsrvese tambin que el primer grupo de propiedades se refieren al componente JFileChooser propiamente dicho, mientras que el segundo grupo se refieren no a un componente sino a la clase FileSystemView, que es la que se emplea para mostrar los directorios y ficheros dentro de un componente JFileChooser. El mtodo put de la clase UIManager se define como sigue:
public static Object put(Object key, Object value)

El primer parmetro es un objeto que sirve para identificar la propiedad que se desea establecer, y el segundo es otro objeto con el valor de dicha propiedad. As por ejemplo, si antes de crear una instancia del componente JFileChooser se ejecuta una lnea como la que sigue:
UIManager.put ( FileChooser.detailsViewIcon, new ImageIcon(my_detailsviewicon.gif); );

Con el mecanismo descrito anteriormente se pueden personalizar algunos aspectos de la apariencia de un componente JFileChooser pero realmente no se pueden hacer cosas tales como eliminar uno de los botones. Para este tipo de tareas tampoco existen mtodos en el API. La nica solucin pasa por deconstruir el componente paso a paso, hasta dar con todos los componentes que a su vez forman parte de l, y entonces llevar a cabo la personalizacin que sea necesaria. El mtodo del listado 1 permite explorar todos los componentes que forman parte de un componente dado. El primer parmetro representa el componente a explorar y el segundo parmetro es un objeto de tipo ArrayList donde se irn almacenando las referencias de todos los componentes encontrados. En primer lugar se aade a la lista el componente que se pasa como parmetro. Si ese componente es una instancia de la clase Container entonces significa que puede contener otros componentes. La coleccin de componentes que contiene se obtiene empleando el mtodo getComponents. Esta coleccin se recorre y se llama recursivamente de nuevo a la misma funcin para cada uno de los elementos. Si se emplea esta funcin haciendo:
JFileChooser jFileChooser = new JFileChooser(); ArrayList alComponents = new ArrayList(); getComponents(jFileChooser, alComponents);

Se obtiene una lista de todos los componentes que forman parte de un objeto de tipo JFileChooser. Esta lista tiene el siguiente aspecto:
javax.swing.JFileChooser[...] javax.swing.JPanel[...] javax.swing.JPanel[...] javax.swing.JButton[...] javax.swing.Box$Filler[...] ...

El icono que aparecer en el botn de detalles del componente ser el correspondiente a la imagen my_detailsviewicon.gif.

Evidentemente, una vez que se tiene acceso a cada uno de los componentes individuales, se pueden hacer cualquier tipo de cambios, como por ejemplo el que se muestra en el listado 2. En este ejemplo se parte del supuesto que se est empleando el look&feel llamado metal. Si la clase del icono que emplean un botn contiene la cadena de texto MetalI conFactory$FileChooserDetailViewIcon significa que se trata del botn de detalles y entonces se elimina del componente simplemente utilizando el mtodo remove de su padre. Finalmente, este mecanismo es tan potente como peligroso ya que en realidad se estn accediendo a las propiedades internas de un componente JFileChooser, lo que significa que no slo podemos cambiarlo sino que adems podemos hacer que deje de funcionar correctamente.
http://digital.revistasprofesionales.com

SOLO PROGRAMADORES n 124

62

LIBROS

Desarrollo web con PHP


Desarrollo web con PHP y MySQL
AUTORES: Luke Welling, Laura Thomson EDITORIAL: ANAYA ISBN: 84-415-1569-7 PGINAS: 911 LUGAR Y AO DE PUBLICACIN: Madrid, 2003 IDIOMA: Castellano OBSERVACIONES: Incluye CD-ROM con el cdigo fuente de los ejemplos y herramientas para el desarrollo

PHP y MySQL son conocidas tecnologas de cdigo abierto que resultan muy tiles para disear de forma rpida y eficaz aplicaciones web dirigidas a bases de datos. Como el lector sabr, PHP es un potente lenguaje de secuencia de comandos diseado especficamente para crear aplicaciones web

con distintas prestaciones de forma rpida y segura. MySQL es una base de datos rpida y fiable que se integra a la perfeccin con PHP y que resulta muy adecuada para aplicaciones dinmicas basadas en Internet. Este libro ensea a utilizar estas herramientas de forma conjunta para obtener aplicaciones web eficaces e interactivas, desde los formularios de pedidos ms sencillos hasta los sitios de comercio electrnico ms complejos y seguros. Los temas tratados en esta obra podran resumirse en el diseo de bases de datos, creacin de sitios de comercio electrnico, construccin de un carrito de la compra, creacin de gestores de listas de correo, creacin de foros web, generacin dinmica de documentos PDF etc.

Desarrollo con PHP, Apache y MySQL


AUTORES: Michael K. Glass, Yann Le Scouarnec, Elizabeth Naramore, Gary Mailer, Jeremy Stolz, Jason Gerner EDITORIAL: ANAYA ISBN: 84-415-1755-X PGINAS: 704 LUGAR Y AO DE PUBLICACIN: Madrid, 2004 IDIOMA: Castellano

El principal objetivo de este libro es ofrecer una pequea muestra de lo que un diseador web puede realizar con la ayuda de PHP, Apache y MySQL. Esta obra pretende guiar en la creacin de sitios web utilizando el modelo AMP (Apache, MySQL y PHP) de cdigo abierto. El lector apren-

der a instalar PHP, Apache y MySQL, aprender a crear pginas web con PHP, aprender a administrar y a proteger bases de datos y, por ltimo, aprender a integrar sus creaciones en plataformas de comercio electrnico con otras tecnologas. Cuando el lector haya terminado, podr crear sitios web dinmicos y bien diseados con la ayuda de herramientas de cdigo abierto. A modo de resumen, diremos que los temas que aborda esta libro son el lenguaje PHP, cmo acceder a una base de datos, creacin de formularios, formas de permitir a los usuarios el acceso a la informacin de la base de datos, creacin de aplicaciones de comercio electrnico, etc.

PHP 5
AUTOR: Francisco Charte Ojeda EDITORIAL: ANAYA ISBN: 84-415-1770-3 PGINAS: 655 LUGAR Y AO DE PUBLICACIN: Madrid, 2004 IDIOMA: Castellano OBSERVACIONES: Incluye CD-ROM con el software necesario para llevar a cabo proyectos en PHP 5 sobre diferentes sistemas operativos

PHP se ha convertido en el estndar para la creacin de pginas de servidor y aplicaciones web, constituyendo la nueva versin la renovacin ms importante de los ltimos aos. Este libro describe

todas las novedades que incorpora PHP y demuestra su uso en la prctica, con proyectos reales de nivel profesional. Los primeros captulos del libro ayudarn al lector a instalar PHP 5 sobre windows, GNU/Linux y Mac OS X, ya sea con Apache 1.3, Apache 2.0 o Internet Information Server. Despus, captulo a captulo, el lector ir configurando las extensiones necesarias para cada tipo de proyecto. Los temas que aborda este libro se centran en el estudio de la sintaxis de PHP 5, acceso a bases de datos, uso de cookies, XML y SOAP para la creacin de servicios web con PHP, creacin de un servicio de chat, generacin de informes, etc.

SOLO PROGRAMADORES n 124

64

http://digital.revistasprofesionales.com

CD-ROM

Contenido del CD-ROM


Fuentes
Juegos de calidad comercial en J2ME (III)
El lector estar notando, despus de leer esta tercera entrega del curso sobre programacin avanzada sobre mviles Nokia, que realmente se puede hacer todo o casi todo desde una aplicacin J2ME si se conoce el API del terminal destino. El CD-ROM incluye, en este apartado, cdigos de ejemplo para manejar la luz de la pantalla, la vibracin del telfono, la cmara de fotos, el sonido, etc.

Programacin
OpenJMS 0.7.6.1
Este es el servidor de mensajera utilizado en la serie de artculos Sistemas de mensajera con Java Message Service. OpenJMS proporciona una implementacin del API JMS robusta y profesional, es de fcil instalacin y es libre.

OpenSTA 1.4.2
Conocer los niveles de carga de trabajo y estrs que nuestra aplicacin web puede soportar es til para detectar, en ltima instancia, los puntos dbiles o los cuellos de botella. OpenSTA es un avanzado sistema que nos permite definir un script con la navegacin deseada, y luego aplicar fuertes cargas de trabajo contra nuestro site.

Aspect# 2.1.0.0 Programacin distribuida en .NET (II)


En esta segunda entrega sobre programacin distribuida en .NET nos hemos centrado en la solucin .NET Remoting. El lector encontrar en el CD-ROM, en la seccin dedicada a este artculo, los ejemplos que se han ido comentando as como las instrucciones para su compilacin y ejecucin. La Programacin Orientada a Aspectos, pese a ser desconocida por muchos, en realidad ya est al orden del da, y en este sentido hemos querido acercar este mundo al lector. Aspect# es un framework que permite programar bajo este paradigma a los programadores C#.

NUnit 2.2.0
NUnit debera ser una herramienta de inters para aquellos programadores .NET que quieran hacer pruebas extremas sobre el cdigo que escriben.

XAML (IV)
A estas alturas, y despus de 4 entregas sobre XAML, podramos decir que ya casi somos unos expertos. Los ejemplos propuestos en este punto ilustran cmo conformar interfaces grficas XAML obteniendo la informacin de distintos orgenes de datos.

Yet Another Forum.net 0.9.9


Para quienes estn desarrollando un portal con ASP.NET, puede ser de gran ayuda un recurso como YAF. Este paquete de software contiene una implementacin completa de un foro de discusin escrito en ASP.NET, C# y con SQL Server. La idea es que cualquiera debera poder incluir en su portal web ASP.NET este foro de manera directa.

Log4J 1.2.9
Log4J es una aplicacin que permite gestionar de forma elegante, mediante ficheros de configuracin externos, los tan famosos printf (o la instruccin de turno para escribir por la salida estndar) que nos ayudan, en tiempo de desarrollo y pruebas, a controlar la ejecucin de nuestro programa.

Sistemas de mensajera con Java Message Service (I)


Esta primera entrega ha servido para introducir al lector en el mundo de la mensajera y, concretamente, a la API JMS. El ejemplo que se incluye en esta seccin del CD-ROM es de lo ms ilustrativo, adems se ofrecen distintas formas de ejecucin del mismo: Importando el proyecto desde Eclipse, con Ant o por lnea de comandos.

NHibernate 0.7.0.0
NHibernate es la alternativa a Hibernate en el mundo .NET. Como el lector sabr, puesto que en el nmero 120 de Slo Programadores fue objeto de estudio, Hibernate es la solucin para la persistencia de objetos en BBDD relacionales del mundo Java. Por su parte, NHibernate es su homlogo del mundo .NET.

Remoting.Corba 1.3.1
Tal como se ha descrito en el artculo Programacin distribuida en .NET (II), Remoting.Corba permite agregar a nuestro entorno .NET la capacidad de comunicarse con objetos mediante CORBA.

Diseo multiplataforma para aplicaciones C++ (y III)


Seguramente el lector, antes de leer este artculo, desconoca cmo hacer un programa C++ que trabajara con el sistema de ficheros (listando directorios, borrando ficheros, etc.) y que dicho programa fuera compilable en distintas plataformas (Windows, Linux, etc.). Los ejemplos ofrecidos en este punto demuestran cmo hacer esto, y adems nos ensean a implementar el patrn de diseo Singleton con la librera ACE.

JSP Standard Tag Library 1.1


El desarrollo con la tecnologa JSP ha sido muchas veces criticado por producir cdigo muy poco legible, mantenible y elegante, al mezclar cdigo Java con lenguaje de marcas HTML. JSTL pretende ofrecer una solucin a este problema, ya que permite tener por un lado el cdigo de la presentacin y por otro lado el cdigo de la lgica de negocio.

Joda-Time 1.0
Este producto ha sido presentado en la seccin de la comunidad javaHispano. Su objetivo es ofrecer a la comunidad Java una librera que haga ms sencilla y eficiente la gestin de la fecha y la hora desde aplicaciones Java.

SOLO PROGRAMADORES n 124

66

http://digital.revistasprofesionales.com

Potrebbero piacerti anche