JOE

Introdução.

JOE resolve as limitações de formulários em HTML utlizando scripts CGI, através de um verdadeiro ambiente cliente para aplicações. Os benefícios recebidos pelo usuário através do acesso à aplicações cliente/servidor independem da sua localização na Web. Os benefícios para os desenvolvedores consiste em se poder utilizar o mesmo tipo de modelagem para ambas aplicações internas e externas distribuídas, ou seja, para a Internet/Intranet.

As aplicações desenvolvidas com JOE fornecem ao usuário:

- Menus e diálogos dinâmicos.

- Validação na entrada dos dados instantânea.

- Atualizações e alertas assíncronos do servidor.

Applets baseados em JOE são mais dinâmicos que formulários HTML e são reutilizáveis por autores de páginas Web. Por exemplo, um applet que mostra informação em tempo-real da bolsa de valores de um servidor de dados. Este applet pode ser reutilizadas em várias Web pages.

Um exemplo de código utilizando JOE.

JOE extende a modelagem de objetos do ambiente Java para incluir invocação e instanciamento de objetos remotos. Estes objetos remotos podem literalmente residir em qualquer lugar na Internet e não precisam ter sido escritos em Java. Por exemplo, estes podem ser objetos em C++. Joe fornece independência de local e neutralidade de linguagem.

JOE utiliza o ambiente NEO como ambiente robusto e rico de objetos remotos. Embora os Applets e aplicações JOE utilizem objetos NEO (servidores), desenvolvedores não precisam saber sobre as características do sistema NEO. Essencialmente, desenvolvedores precisam somente saber as definições de interface dos objetos NEO que eles querem utilizar. As classes e ferramentas do JOE, cuidam do resto, habilitando a desenvolvedores de JOE construir clientes Web de servidores remotos imediatamente.

O código a seguir ilustra a diferença entre Java rodando localmente sem conexão a nenhum servidor e em seguida JOE estabelecendo uma conexão com um servidor através da Internet com um servidor remoto implementado em C++. Embora o exemplo de JOE invoque um método em um objeto C++ remoto, repare que nenhum código em C++ é necessário.


	import java.awt.Graphics;
	import java.awt.Font;
	import java.awt.Color;

	public class NovoHello extends java.applet.Applet{
		Font f = new Font("TimesRoman", Font.BOLD, 36);

		public void init()
		{
			resize(150, 25);
		}

		public void paint(Graphics g)
		{
			g.setFont(f);
			g.setColor(Color.blue);
			g.drawString("Hello, World", 50, 25);
		}
	}

O exemplo acima roda somente em um ambiente local. Nenhuma invocação de objeto remoto foi feita. O próximo exemplo introduz código JOE, que habilita uma sessão cliente/servidor completa através da Web.

	import sunw.services.*; /** Inclui serviços de acesso aos objetos remotos no applet**/

	import java.awt.Graphics;
	import java.awt.Font;
	import java.awt.Color;

	public class NovoHello extends sunw.services.JOEApplet{  /**Herda do applet JOE padrão**/

		sunw.corba.ObjectRef obj; /** Declara uma referência genérica a um objeto CORBA
					      Isto é usado para armazenar o resultado retornado
					      quando está realizando uma busca no espaço de nomes
					      procurando por um dado objeto.
					  **/

			
		Hello.HelloWorldRef hiThere; /** Declara uma referência com tipo a um objeto CORBA.
					         Esta referência será utilizada para manipular
						 o objeto remoto do Java.
						**/


		Font f = new Font("TimesRoman", Font.BOLD, 36);

		public void init()
		{
			super.init();
			resize(150, 25);

			obj = find("HelloWorldServer"); /** Obtém uma referência de um servidor
							    nomeado pelo NEO Naming Service.
							**/

			hithere = Hello.HelloWorldStub.narrow(obj);/** Realiza uma operação
								       para mudar a referência
								       genérica retornada pelo
								       Naming Service para uma
								       referência de tipo do
								       servidor
									**/ 	

		}

		public void paint(Graphics g)
		{
			g.setFont(f);
			g.setColor(Color.blue);
			g.drawString(hithere.sayHello(), 50, 25);/** Invoca um método em um 
								     objeto remoto não-java.
								**/		
		}
	}

O exemplo acima mostrou que algumas poucas alterações são necessária para tornar uma aplicação Java ou um Applet em um cliente Web. O processo de desenvolvimento do JOE é simples:

- Obter uma interface para um objeto CORBA remoto escrito em OMG IDL e rodar o compilador JOE IDL-to-Java para gerar a interface Java para o objeto remoto.

- Escrever o código do cliente em Java utilizando a interface Java para o objeto remoto e JOE para acessar o objeto remoto.

- Compilar a aplicação ou Applet com o compilador Java.

- Rodar o código.

Definindo Interfaces para Objetos Remotos utilizando OMG IDL.

A interface para objetos remotos CORBA, como objetos NEO, são definidos utilizando-se a Object Management Group Interface Definition Language. IDL é um padrão da indústria que define interfaces para objetos. As descrições IDL são traduzidas para definições de classe Java pelo compilador do JOE IDL-to-Java. Uma classe Java contém stubs que cooperam junto com um Object Request Broker (ORB) para habilitar a chamada de objetos remotos como se fossem objetos Java locais. Os stubs Java manipulam todos os aspectos da invocação de objetos remotos incluindo a condução dos dados, tradução de parâmetros, comunicação pela rede e ativamento do servidor remotamente.

Acesso de Objetos Remotos

Um stub Java é automaticamente gerado pelo compilador JOE IDL-to-Java. O stub fornece comunicação com tipo e transparente com os objetos NEO. Por exemplo, o HelloWorldServer do código do segundo exemplo. Instâncias particulares de objetos NEO (servidores) são registrados por nome. Para utilizar um servidor é preciso localizá-lo. O NEO Naming Service permite a aplicações clientes procurarem dinamicamente servidores. JOE passa um nome e recebe de volta a referência do objeto que o Applet precisa para os métodos do objeto. A referência ao objeto retornada pelo Naming Service é usada como um objeto Java local é usado.

Object Request Broker(ORB)

JOE inclui um Object Request Broker o qual conecta Applets Java com objetos NEO rodando em qualquer máquina na Internet. O JOE ORB é automaticamente carregado nos browsers da Web junto com os Applets Java e subsequentemente estabelece e gerencia conexões entre objetos Java locais e objetos NEO remotos.

Comunicação Bidirecional

JOE fornece uma sessão cliente/servidor completa. JOE tem que fornecer não somente acesso do Java para objetos remotos(cliente para servidor) mas também fornecer acesso do objeto remoto para o Java(servidor para cliente). Comunicações do servidor para o cliente (Callbacks) são essenciais em aplicações onde atualizações tais como alertas e alarmes devem ser trazidos para imediata atenção do usuário. Em adição, devido a clientes não terem mais que demandar por atualizações, a eficiência da rede é superior. Para usar Callbacks, JOE cria uma interface IDL para um objeto Java que pode ser chamado de um objeto NEO. O NEO Event Service pode ser utilizado para invocar o objeto Java quando uma informação pertinente é atualizada pelo servidor.