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

Este principio en sí mismo es claro, debe de estar separados el cliente del servidor a través de interfaces uniformes, es decir el cliente no sabe nada de como se almacena la información, ni como se esta obteniendo. Por su lado los servidores no saben nada de la manera en la que se esta presentado la información.
 
No manejan estado recursos disponibles
El servidor no debe de contener ningún contexto sobre el cliente que esta haciendo la solicitud. Cada solicitud del cliente debe contener toda la información necesaria para poder procesar la solicitud en el servidor, lo padre de esto es que te permite crear aplicaciones mas escalables sin que tengas que estarte preocupando por el como debe de responder tu servidor a la perdida de la sesión de un cliente por falta de conectividad.
 

Capaces de almacenarse en caché

Ya que como principio en el WWW los clientes no tienen un mecanismo de almacenar las respuestas en caché. Las respuestas deben implicita o explicitamente definirse a si mismas como almacenables en caché o no, para evitar que los clientes hagan uso inapropiado de información regresada por una solicitud.
 
Sistemas en capas
Un cliente no debe de saber si esta conectado directamente a un servidor final o a un intermediario. un servidor intermediario te puede ayudar a balancear las cargas y la escalabilidad de tu aplicación.
 
Código bajo demanda (opcional)
Los servidores pueden ser capaces de extender la funcionalidad de un cliente transfiriendole algo de lógica que puedan ejecutar, por ejemplo Java Applets o JavaScript.
 
Interface Uniforme
Son recursos individuales que deben de estar incluídos dentro de la solicitud. un ejmplo de esto es el siguiente:

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:

 

image

 

  • En la parte superior izquierda busca el “Database  Explorer” y presiona el botón de “Connect to Database”
  • En Server Name escribe .\Sqlexpress (esto va a seleccionar la instancia en el servidor local de SQL Express)
  • Selecciona la base de datos Northwind
  • Presiona el botón de OK

 

 

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”

 

  • Al presionar OK te va a aparecer un asistente que te va a ayudar para crear la colección de clases a partir de mapear el modelo de entidades. image
    • Selecciona la opción de “Generate from database”
    • Escoge la base de Northwind y en  la parte Inferior verifica que el nombre de la conexión sea “NorthwindEntities” esto es importante ya que este será el nombre con el que se generará el modelo de entidades.
    • Presiona Next y dentro de Tablas selecciona las siguientes:
      • Orders
      • OrderDetails
      • Products
    • Dentro de Stored Procedure selecciona:
      • CustOrderDetails
      • CustOrderHist
  • Presiona el botón de Finish

 

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:

  • Presiona Ctrl + Shift + A para agregar un nuevo elemento.
    • Selecciona la categoría Web
    • Busca la plantilla ADO.NET Data Service
    • Presiona OK

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: 

  1. Reemplazar [[class name]] con el nombre de nuestra clase NorthwindEntities
  2. Configurar las Reglas de Acceso a las entidades
    1. config.SetEntitySetAccessRule("*", EntitySetRights.AllRead)  (puede ser de solo lectura,image lectura y escritura, lectura multiple etc.)
  3. Configurar las reglas de operación del servicio.
    1. config.SetServiceOperationAccessRule("*", ServiceOperationRights.All)  (puede ser solo lectura, lectura y escritura etc.)

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”

imageAl 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:

  • org.restlet.jar
  • org.restlet.ext.dataservices.jar
  • org.restlet.ext.atom.jar 
  • org.restlet.ext.xml.jar 
  • org.restlet.ext.freemarker.jar 
  • org.freemarker.jar

 

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);

      }

}

image

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.

  • org.restlet.jar
  • org.restlet.ext.dataservices.jar
  • org.restlet.ext.atom.jar 
  • org.restlet.ext.xml.jar 
  • org.restlet.ext.freemarker.jar 
  • org.freemarker.jar
  • 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