Cuando platique con @xbenek sobre crear un puente de interoperabilidad entre tecnologías Microsoft y Java, lo primero que me paso por la mente fue el pensar en los problemas había tenido o que había escuchado cuando la gente estaba teniendo proyectos de este tipo, uno de los principales era el acceso a las clases y objetos que estaban generados en .NET y la otra era el acceso a los datos en sí, una manera de solucionar este dilema es usando por el lado de .NET el Entity Framework que te permite exponer clases y entidades en formato ATOM o JSON usando REST y por parte de Java Restlet que te permite acceder a este tipo de servicios.
Existen varios proyectos que pueden verse beneficiados de arquitecturas como REST (Representational state transfer) donde la idea principal está en la manera en la que se hacen las peticiones al Servidor desde el cliente, las peticiones se hacen basadas en el recurso que te interesa, por ejemplo si quieres ver los productos de una tienda de la categoría bebidas, debería de ser suficiente con ir a la página http://latienda/productos/bebidas o si quisieras ver todas las cervezas podrías ir a http://latienda/productos/bebidas/cervezas el servidor es el que se encarga de encontrar el recurso adecuado a lo mejor lo que hace es buscar la página cervezas.htm entonces si pensamos que cervezas.htm es la representación de un recurso sin embargo el cliente esta accediendo a un sitio diferente, lo que hace el servidor es transferir el estado del recurso para poderse adaptar a la solicitud que esta haciendo el cliente, –>Transferencia del Estado de la representación (REST).
La arquitectura de REST tiene que cumplir con estos 6 principios.
Cliente-servidor
Capaces de almacenarse en caché
Te recomiendo que leas este post de Roger L. Costello que explica de una manera muy sencilla lo que es REST
Vamos a crear una aplicación usando el Entity Framework de .NET la manera mas fácil de instalar Visual Studio Express y SQL Server es usando el Web Platform Installer que te permite instalar y configurar todas las herramientas y aplicaciones (puedes instalar wordpress, mySql, Joomla, etc desde el mismo instalador).
Una vez terminada la instalación agrega la base de datos de ejemplo de Northwind y ya con eso tenemos todo para crear la aplicación que va a exponer la información de la base de datos, para esto sigamos estos pasos:
Abre el Visual Web Developer y crea un nuevo proyecto de tipo ASP.NET Web Application, el siguiente paso es crear una conexión a la base de datos:
En el Explorador de nuestra solución vamos a crear un nuevo elemento de tipo ADO.NET Entity Data Model, para esto da un click con el botón derecho sobre el nombre de tu solución y selecciona “Add New Item” o presiona las teclas Ctrl + Shift + A, esto abrirá el selector de plantillas, del lado derecho selecciona la Categoría “DATA” y del lado derecho escoge ADO.NET Entity Data Model en el nombre escribe “Northwind”
Lo que hace el Entity Framework es mapear la base de datos a Clases con la estructura de la base de datos y los Stored Procedures a Métodos o Funciones, obviamente la gran ventaja de utilizar este modelo de desarrollo está en la facilidad de programación, ya que ahora podríamos usar LINQ para hacer consultas en lugar de sentencias de SQL, (después les explico un poco mas lo que puedes hacer con LINQ) por lo pronto lo interesante es que estamos manejando objetos y no datos, lo cual nos va a facilitar poder accederlos posteriormente.
Ahora vamos a exponer a través de Servicios REST esta clase, para ello vamos a seguir estos pasos:
La plantilla que nos genera va a heredar DataService de la clase NorthwindEntities (que generamos con Entity Framework anteriormente). Para configurar el servicio hay 3 cosas que debemos hacer:
Listo, con esto estamos exponiendo nuestra base de datos a traves de servicios web que soportan REST, para probarlo dale un click con el boton derecho al WebDataservice.svc y selecciona la opcion “VIew in Browser”
Al ejecutarlo te va a mostrar un XML en formato Atom, lo interesante de esto es que como el web service es REST acepta operaciónes a traves de métodos POST y GET, además seguro te diste cuenta de los tags href, esto significa que si quisieras hacer una consulta por las órdenes de compra solo tendrías que ir a la página
http://localhost:60203/WebDataService1.svc/PurchaseOrderHeader
Si quieres consultar un una orden en específico puedes ir a la página
http://localhost:60203/WebDataService1.svc/PurchaseOrderHeader(1)
¿ Recuerdas que las ordenes de compra estaban ligadas con el detalle de la compra? bueno, como al final de cuentas son objetos, los detalles que tenga relacionados una orden de compra automaticamente se vuelven en propiedades de este objeto y por lo tanto tambien puedes consultarlo
http://localhost:60203/WebDataService1.svc/PurchaseOrderHeader(1)/PurchaseOrderDetail
Hasta ahora vimos como crear una aplicación que exponga datos usando Entity Framework, algo para resaltar es que usando los ADO .Net Dataservices podrías exponer clases que tengan las capacidades de Iquery y ISerialize.
Ahora vamos a consumir estos servicios en JAVA para esto vamos a usar el framework RESTlet que puedes descargar desde http://www.restlet.org/downloads/ estos son los pasos que necesitas seguir para comenzar a utilizar RESTlet (en este caso yo estoy usando Eclipse, pero podrías usar cualquier IDE)
Lo primero que tenemos que hacer es generar las clases auxiliares que nos van a ayudar a conectarnos al web service, para esto lo puedes hacer de dos maneras, a traves de un comando o programandolo:
java -cp org.restlet.jar;org.restlet.ext.xml.jar;org.restlet.ext.atom.jar;org.restlet.ext.freemarker.jar;org.restlet.ext.dataservices.jar;org.freemarker.jar org.restlet.ext.dataservices.Generator http://restlet.cloudapp.net/TestAssociationOneToOne.svc/ EFDemo
Yo lo hice programando una clase es importante referenciar estos jars:
import org.restlet.ext.dataservices.Generator;
public class rest {
public static void main(String[] args) {
String[] arguments = { "http://ogdi.cloudapp.net/v1/dc/", "EFDemo" };
Generator.main(arguments);
}
Al ejecutarlo nos va a generar una serie de archivos (las clases auxiliares) que nos van a ayudar a conectarnos con el servicio, ahora lo que tienes que hacer es crear un nuevo proyecto y agreguemos las referencias a los jars.
Despues importa los recursos que creamos en el paso anterior, dale un click al nombre de tu proyecto con el botón derecho y selecciona la opción de “Import” en la categoría “General” Selecciona “FileSystem” presiona Next y navega a la carpeta donde se generaron los archivos java, seleccionalos todos y presiona el botón “Finish”
Ahora vamos a crear una nueva Clase, vas a necesitar importar los siguientes Namespaces:
import northwindModel.Categories;
import org.restlet.ext.dataservices.Query;
Para traernos los datos ejecutemos este código:
public static void main(String[] args) throws Exception { // creamos la sesión en servicio NorthwindModelSession session = new NorthwindModelSession(); //hacemos la busqueda Query<Categories> query = session.createCategoriesQuery("/Categories");
if (query != null) { //recorremos la colección y desplegamos los resultados for (Categories categoria : query) { System.out.println("*** Categorías"); System.out.println("Categoria :" + categoria.getCategoryName()); System.out.println("Descripción :" + categoria.getDescription()); System.out.println("id: " + categoria.getCategoryId());
} } }
El resultado será algo como esto:
*** Categorías Categoria :Bebidas Descripción :Soft drinks, coffees, teas, beers, and ales id: 1 *** Categorías Categoria :Condiments Descripción :Sweet and savory sauces, relishes, spreads, and seasonings id: 2 *** Categorías Categoria :Confections Descripción :Desserts, candies, and sweet breads id: 3 *** Categorías Categoria :Dairy Products Descripción :Cheeses id: 4 *** Categorías Categoria :Grains/Cereals Descripción :Breads, crackers, pasta, and cereal id: 5 *** Categorías Categoria :Meat/Poultry Descripción :Prepared meats id: 6 *** Categorías Categoria :Produce Descripción :Dried fruit and bean curd id: 7
Como vimos en este ejemplo el integrar Java con .NET puede facilitarse al acceder servicios generados a través del Entity Framework, usando estos servicios puedes actualizar, borrar y crear elementos, te recomiento que leas el tutorial de Restlet donde explican las otras funciones que puedes ejecutar usando este framework. Hay varias opciones en cuanto al IDE de Microsoft, Visual Web Developer Express (gratuito), Visual Web Developer Express 2010 (gratuito) o si quieres la versión Professional, puedes descargar las versiones de evalución desde http://www.microsoft.com/visualstudio/en-us/products/2010/default.mspx si eres estudiante (a través del programa Dreamspark), o emprendedor (a través de Bizspark) tienes acceso al software gratis, buscame por twitter @jaimesanchez o por mail a jaime.sanchez@microsoft.com si tienes mas dudas.
Referencias Wikipedia, Xfront, tutorial de Restlet