api java do scs tecgraf puc-rio maio de 2011. a api do scs a api fica encapsulada em uma classe...
TRANSCRIPT
![Page 1: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/1.jpg)
API Java do SCS
Tecgraf PUC-Riomaio de 2011
![Page 2: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/2.jpg)
A API do SCS
• A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente• Definindo suas facetas, receptáculos e
ComponentId
• Um componente SCS-Java é representado por uma interface Java ComponentContext
• Existem classes auxiliares
![Page 3: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/3.jpg)
Criação de um Componente
• São necessários alguns passos:
1.Implementar suas facetas
2.Descrever as facetas
3.Descrever os receptáculos
4.Utilizar a API para instanciar e montar o componente
![Page 4: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/4.jpg)
Implementação de uma Faceta
![Page 5: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/5.jpg)
Criação de Facetas
• Uma faceta SCS nada mais é do que uma implementação de uma interface CORBA
• O SCS adiciona algumas convenções, mas a implementação da interface se dá da mesma forma• Por herança ou delegação
public class MyFacetServant extends MyFacetPOA { }
![Page 6: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/6.jpg)
Criação de Facetas
• A API do SCS se responsabiliza por instanciar as facetas
• Devido a isso, é necessária a definição de um construtor obrigatório, que recebe uma referência ao componente ao qual a faceta pertence
• É possível não utilizar essa facilidade, o que elimina a necessidade desse construtor
public class MyFacetServant extends MyFacetPOA { private ComponentContext context; public MyFacetServant(ComponentContext context) { this.context = context; }}
![Page 7: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/7.jpg)
Criação de Facetas
• Método _get_component()– Inicialmente criado para o CCM e CORBA 3.0– Presente na especificação de CORBA 2.3.x
• Suportado em Java pelo JacORB mas não pelo ORB da Sun
– Fornece a interface mais básica de um componente, a partir de qualquer outra de suas interfaces. Isso geralmente permite obter uma interface que acesse outras interfaces
• No SCS, a interface mais básica é a IComponent, da qual pode-se obter as outras facetas do componente
![Page 8: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/8.jpg)
Criação de Facetas
• Definição do método _get_component()– Basta retornar o resultado do método auxiliar getIComponent
existente na interface ComponentContext
– Opcional, mas uma mensagem de aviso será impressa caso o método não seja implementado
– Possibilidade do método ser adicionado automaticamente no futuro
• Desistimos da idéia por enquanto pois estamos investigando outras soluções para versões futuras do SCS
//@Override public org.omg.CORBA.Object _get_component() { return context.getIComponent(); }
![Page 9: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/9.jpg)
Criação de Facetas
• Exemplo de faceta completa
public class MyFacetServant extends MyFacetPOA {
private ComponentContext context;
public MyFacetServant(ComponentContext context) { this.context = context; }
//@Override public org.omg.CORBA.Object _get_component() { return context.getIComponent(); }
...}
![Page 10: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/10.jpg)
Descrição das Facetas de um Componente
![Page 11: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/11.jpg)
Descrição de Facetas
• Facetas são normalmente descritas por FacetDescriptions, mas na API Java as descrevemos através da classe ExtendedFacetDescription
• Dessa forma fornecemos apenas metadados, o que traz algumas vantagens:• A API torna-se capaz de instanciar as facetas para o
usuário• É possível externalizar a definição da faceta, permitindo
mudanças tanto na faceta como no componente sem a recompilação de código
![Page 12: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/12.jpg)
Descrição de Facetas
• Classe ExtendedFacetDescription– Similar à FacetDescription– Utilizada quando se deseja instanciar um
componente utilizando somente metadados– Adiciona o campo class, que indica qual classe deve
ser instanciada como a faceta– Não pede o campo obj_ref– Mantém os campos name e interface_name– Não estende FacetDescription porque essa é uma
classe Java gerada pelo compilador IDL como final
![Page 13: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/13.jpg)
Descrição de Facetas
• Definição dos metadados de facetas
ExtendedFacetDescription[] extDescs = new ExtendedFacetDescription[1];ExtendedFacetDescription extDesc = new ExtendedFacetDescription( MyFacetServant.class.getSimpleName(), MyFacetHelper.id(), MyFacetServant.class.getCanonicalName());extDescs[0] = extDesc;
![Page 14: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/14.jpg)
Descrição dos Receptáculos de um Componente
![Page 15: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/15.jpg)
Descrição de Receptáculos
• Receptáculos são descritos por ReceptacleDescriptions• Essa classe já é naturalmente composta apenas por
metadados• É possível externalizar a definição do receptáculo,
permitindo mudanças tanto no receptáculo como no componente sem a recompilação de código
• Atualmente não é possível fornecer uma classe própria para representar um receptáculo• A classe Receptacle é sempre instanciada
automaticamente, pela API
![Page 16: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/16.jpg)
Descrição de Receptáculos
• Classe Receptacle– Implementação base de um receptáculo
• Nessa versão não há suporte para uma implementação do usuário
– Objeto apenas local
![Page 17: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/17.jpg)
Descrição de Facetas
• Definição dos metadados de receptáculos
• O terceiro parâmetro é o campo is_multiplex• O quarto parâmetro, o conjunto de conexões
connections, será ignorado. Portanto, pode-se passar null
ReceptacleDescription[] recDescriptions = new ReceptacleDescription[1];
recDescriptions[0] = new ReceptacleDescription (“MyReceptacle", ExpectedFacetHelper.id(), true, null);
![Page 18: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/18.jpg)
Uso da API para Instanciar e Montar um Componente
![Page 19: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/19.jpg)
Criação do ComponentId
• Definição do ComponentId• Idêntico ao demonstrado na IDL
ComponentId cpId = new ComponentId( “MyComponentName”, (byte) 1, (byte) 0, (byte) 0, “solaris10 linux26 windows”);
![Page 20: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/20.jpg)
Uso da API
• Classe ComponentBuilder– API básica, responsável pela construção de um
componente– Tem estado, composto pelo ORB e POA
recebidos em seu único construtor• ComponentBuilder(POA poa, ORB orb)
ORB orb = ...;POA poa = ...;ComponentBuilder builder = new ComponentBuilder(poa, orb);
![Page 21: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/21.jpg)
ComponentBuilder
– Instancia um componente e suas facetas• Método newComponent recebe:
‒ Descrições estendidas das facetas‒ Descrições dos receptáculos‒ Identificador do componente (ComponentId)
• Overload com versões simplificadas
ComponentContext newComponent( ExtendedFacetDescription[] facetExtDescs, ReceptacleDescription[] receptacleDescs, ComponentId id, ComponentContext context)
![Page 22: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/22.jpg)
ComponentBuilder
– O método newComponent pode opcionalmente receber uma instância de uma classe que estenda ComponentContextImpl, fornecida pelo usuário. Essa instância será utilizada no lugar de uma instância padrão de ComponentContextImpl
– Retorna um ComponentContext• Facetas e receptáculos instanciados• Mapas de metadados preenchidos• Se não foram especificadas, as facetas básicas são
adicionadas
![Page 23: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/23.jpg)
• Utilização da API– Exemplo deixando a criação do
ComponentContext a cargo do ComponentBuilder
– As descrições de receptáculos, nesse caso, são opcionais devido a um overload do método
ComponentBuilder
ComponentContext context = builder.newComponent( extDescs, receptDescs, cpId );
![Page 24: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/24.jpg)
ComponentBuilder
• Utilização da API– Exemplo fornecendo o próprio
ComponentContext– A implementação será uma do usuário, não a
implementação padrão ComponentContextImpl
ComponentContext context = new ComponentContextImpl(builder, cpId);builder.newComponent( extDescs, receptDescs, cpId, context );
![Page 25: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/25.jpg)
ComponentBuilder
– Outros métodos• Map<String, String> deactivateComponent (ComponentContext context)
– Destrói os objetos CORBA e nulifica os facet_ref. Retorna um mapa com as facetas que não puderam ser desativadas e o erro associado
• static String componentIdToString(ComponentId compid)
– Retorna uma versão em string de um identificador de componente• POA getPOA()
– Retorna o POA ao qual os objetos CORBA criados por este ComponentBuilder estão associados
• ORB getORB()– Retorna o ORB ao qual os objetos CORBA criados por este
ComponentBuilder estão associados
![Page 26: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/26.jpg)
O Componente
![Page 27: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/27.jpg)
O Componente Java
• Interface ComponentContext– Atua como um envólucro que facilita o uso do
componente como uma entidade única e não apenas um aglomerado de facetas e receptáculos
• Representação local do componente• Acesso a todas as facetas (incluindo as básicas) e
receptáculos• Guarda os metadados, como descrições e
identificador do componente (ComponentId)
![Page 28: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/28.jpg)
Interface Java ComponentContext
• public abstract ComponentId getComponentId()– Retorna o identificador do componente
• public abstract Map<String, FacetDescription> getFacetDescs()– Retorna um mapa com todas as descrições de facetas
• public abstract Map<String, ExtendedFacetDescription> getExtendedFacetDescs()
– Retorna um mapa com todas as descrições estendidas de facetas
• public abstract Map<String, ReceptacleDescription> getReceptacleDescs()– Retorna um mapa com todas as descrições de receptáculos
![Page 29: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/29.jpg)
Interface Java ComponentContext
• public abstract Map<String, Object> getFacets()– Retorna um mapa com todos os objetos CORBA que
implementam as facetas• public abstract Map<String, Receptacle>
getReceptacles()– Retorna um mapa com todos os receptáculos (objetos JAVA,
não CORBA!)• public abstract ComponentBuilder getBuilder()
– Retorna o construtor utilizado para criar o componente e seus objetos CORBA
• public abstract org.omg.CORBA.Object getIComponent()– Retorna o objeto CORBA da faceta IComponent
![Page 30: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/30.jpg)
O Componente Java
• ComponentContextImpl– Implementação padrão para a interface Java
ComponentContext– Pode ser estendida para adicionar outros dados
de uso global no componente• Dados acessados por mais de uma faceta• Dados referentes ao componente em si, não a uma
faceta específica• Métodos
![Page 31: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/31.jpg)
• Como obter uma faceta a partir de outra?
• Como acessar uma faceta conectada a um receptáculo?
Exemplos
context.getReceptacles().get(“ReceptacleName”).getConnections()
context.getFacets().get(“FacetName”)
context.getReceptacleDescs().get(“ReceptacleName”).connections
context.getFacetDescs().get(“FacetName”).facet_ref
![Page 32: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/32.jpg)
Outras Funcionalidades
![Page 33: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/33.jpg)
ComponentBuilder
• É possível fornecer facetas já instanciadas ‒ Descrições das facetas (incluem o servant)‒ Descrições dos receptáculos‒ Identificador do componente (ComponentId)
‒ Vantagens• Total controle sobre a criação das facetas, como seus
construtores• Possibilidade de utilizar o mesmo objeto Java para
implementar várias facetas (objeto monolítico)‒ Desvantagens
• Maior amarração na definição do componente• Programador fica responsável por acesso das facetas ao seu
contexto
ComponentContext newComponent( FacetDescription[] facetDescs, ReceptacleDescription[] receptacleDescs, ComponentId id, ComponentContext context)
![Page 34: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/34.jpg)
Criação de FacetDescriptions
– Caso utilize FacetDescription (fornecendo as implementações de facetas)
ComponentContext context = new ComponentContextImpl(builder, cpId);FacetDescription[] facetDescs = new FacetDescription[1];FacetDescription facetDesc = new FacetDescription( MyFacetServant.class.getSimpleName(), MyFacetHelper.id(), new MyFacetServant(...));facetDescs[0] = facetDesc;
![Page 35: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/35.jpg)
Aplicação Exemplo
![Page 36: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/36.jpg)
Exemplo passo-a-passo
• Veremos um exemplo, passo-a-passo, de desenvolvimento de uma aplicação SCS usando Java
• Para desenvolver a aplicação, usaremos o JacORB como ORB tanto para o cliente quanto para o servidor, e as bibliotecas do SCS
![Page 37: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/37.jpg)
Exemplo de Aplicação
StockSeller
StockServer StockExchange
StockLoggerExchangePrinter
• O componente StockSeller implementa duas facetas: StockServer e StockExchange• O componente StockSeller tem um receptáculo para componentes que implementem
a faceta ExchangePrinter• O componente StockLogger implementa a faceta ExchangePrinter
![Page 38: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/38.jpg)
Passo 1: Alterando a IDL
// StockMarket.idl// O módulo StockMarket consiste das definições// úteis para desenvolvimento de aplicações// que lidam com mercado de ações.module StockMarket {
...
// A interface ExchangePrinter é a interface que // representa uma impressora de negociações de ações. interface ExchangePrinter { // Imprime que houve uma negociação da ação indicada. // A saída utilizada para impressão não é especificada. // Exemplos de saídas: tela, arquivo, clients remotos. void print(in StockSymbol symbol); };
// A interface StockExchange é a interface que permite // a compra de ações. interface StockExchange { // Usa os componentes ExchangePrinter que estejam // conectados para imprimir a negociaçao efetuada. boolean buyStock(in StockSymbol symbol); };};
![Page 39: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/39.jpg)
Passo 2: Implementando as facetas
• Precisaremos alterar a classe StockServerImpl para que ela se torne uma Faceta SCS
• Além disso, precisaremos implementar as facetas StockExchange e ExchangePrinter
![Page 40: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/40.jpg)
Implementando uma faceta
• Facetas são interfaces CORBA e, portanto, sua implementação segue as mesmas regras que vimos nos exemplos de CORBA
• A implementação SCS-Java exige também que facetas implementem um construtor que receba um ComponentContext (Contexto de Componentes).
![Page 41: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/41.jpg)
StockServerImpl/** * StockServerImpl implementa a interface IDL StockServer */public class StockServerImpl extends StockServerPOA { /** * Construtor * @param context o contexto do componente dono da faceta. */ public StockServerImpl(ComponentContext context) { } /** * Retorna o valor corrente a determinada ação do mercado, dado o * símbolo que a representa. */ @Override public float getStockValue(String symbol) { } /** * Retorna a sequência com todos os símbolos que definem as ações * de mercado mantidas por esse StockServer. */ @Override public String[] getStockSymbols() { } /** * Obtém a faceta IComponent do componente. * @return a faceta IComponent */ public org.omg.CORBA.Object _get_component() { }}
![Page 42: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/42.jpg)
StockExchangeImpl/** * StockExchangeImpl implementa a interface IDL StockExchange */public class StockExchangeImpl extends StockExchangePOA {
/** * Construtor * * @param context o contexto do componente dono da faceta. */ public StockExchangeImpl(ComponentContext context) { }
/** * Quando uma ação é negociada, seu valor aumenta em uma taxa de 10%. * Usa os componentes StockLogger que estejam conectados para imprimir * a negociaçao efetuada. */ @Override public boolean buyStock(String symbol) { }
/** * Obtém a faceta IComponent do componente. * * @return a faceta Icomponent */ public org.omg.CORBA.Object _get_component() { }}
![Page 43: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/43.jpg)
DisplayExchangePrinter /** * DisplayExchangePrinterImpl implementa a interface IDL ExchangePrinter. * Essa implementação usa o display (console) para mostrar a negociação de * cada ação do mercado. */public class DisplayExchangePrinterImpl extends ExchangePrinterPOA {
/** * Construtor * * @param context o contexto do componente dono da faceta. */ public DisplayExchangePrinterImpl(ComponentContext context) { }
/** * Imprime que houve uma negociação da ação indicada. A saída utilizada * para impressão não é especificada. Exemplos de saídas: tela, arquivo, * clients remotos. */ @Override public void print(String text) { }
/** * Obtém a faceta IComponent do componente. * * @return a faceta Icomponent */ public org.omg.CORBA.Object _get_component() { }}
![Page 44: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/44.jpg)
Passo 3: Criando o componente StockSeller
• O componente StockSeller oferece as facetas StockServer e StockExchange
• O componente StockSeller possui um receptáculo para conectar um ou mais compontes que implementem a faceta ExchangePrinter
![Page 45: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/45.jpg)
Inicia o ORB e ativa o POA
• A inicialização do ORB e ativação do POA, ao iniciar o servidor, são iguais ao que já usamos nos exemplos anteriores.
• O servidor deve, após criar o componente, deixar o ORB aguardando as requisições
/* * As propriedades que informam o uso do JacORB como ORB. */Properties orbProps = new Properties(); orbProps.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB"); orbProps.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton"); /* Inicializa o ORB */ ORB orb = ORB.init(args, orbProps); /* Obtém a referência para o POA e inicializa o POA */ POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate();...orb.run();
![Page 46: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/46.jpg)
Cria a descrição das facetas
• A classe ExtendedFacetDescription é usada para criar as descrições das facetas
ExtendedFacetDescription[] facetDescriptions = new ExtendedFacetDescription[2];
facetDescriptions[0] = new ExtendedFacetDescription( "StockServer", StockServerHelper.id(), "StockMarket.StockServerImpl");
facetDescriptions[1] = new ExtendedFacetDescription("StockExchange", StockExchangeHelper.id(), "StockMarket.StockExchangeImpl");
![Page 47: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/47.jpg)
Cria a descrição dos receptáculos
• A classe ReceptacleDescription é usada para criar as descrições dos receptáculos
ReceptacleDescription[] recDescriptions = new ReceptacleDescription[1];
recDescriptions[0] = new ReceptacleDescription ("ExchangePrinter", ExchangePrinterHelper.id(), true, null);
![Page 48: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/48.jpg)
Cria o identificador do componente
• Todo componente precisa ter um identificador, que é descrito usando a classe ComponentId
ComponentId componentId = new ComponentId("StockSeller", (byte) 1, (byte) 0, (byte) 0, "Java");
![Page 49: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/49.jpg)
Cria o componente com um ComponentBuilder
• A classe ComponentBuilder é usada para construir um componente a partir da descrição de suas facetas e receptáculos
• O método newComponent retorna o contexto ComponentContext do componente recém criado
ComponentBuilder builder = new ComponentBuilder(poa, orb);
ComponentContext context = builder.newComponent(facetDescriptions, recDescriptions, componentId);
![Page 50: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/50.jpg)
Salva o IOR em um arquivo
• Nessa solução, ainda usaremos um arquivo para gravar a referência para o objeto CORBA
• Note que estamos usando a referência para um IComponent
org.omg.CORBA.Object obj = context.getIComponent(); IComponent component = IComponentHelper.narrow(obj);PrintWriter ps = new PrintWriter(new FileOutputStream(new File(“seller.ior”))); ps.println(orb.object_to_string(component)); ps.close();
![Page 51: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/51.jpg)
Passo 4: Criando o componente StockLogger
• O componente StockLogger oferece a faceta ExchangePrinter
• O código StockLoggerMain.java é responsável por criar o componente SCS StockLogger
• Em nosso exemplo, o código que o conecta ao componente StockSeller é uma aplicação separada
• A criação do componente StockLogger é similar ao que fizemos para criar o StockSeller, exceto que não há receptáculos
![Page 52: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/52.jpg)
Passo 5: Recupera as referências dos componentes para conectá-los
• A referência para o componente StockSeller é lida do arquivo seller.ior
• A referência para o componente StockSeller é lida do arquivo logger.ior
/* * Lê o IOR do componente StockSeller do arquivo seller.ior */ BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(“seller.ior”))); String ior_seller = reader.readLine();
/* * Lê o IOR do componente StockLogger do arquivo logger.ior * parâmetro 2. */ reader = new BufferedReader(new InputStreamReader(new FileInputStream(“logger.ior”)));String ior_logger = reader.readLine();
![Page 53: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/53.jpg)
Obtém as facetas IReceptacles do StockSeller e ExchangePrinter do StockLogger
• Precisaremos da faceta ExchangePrinter do componente StockLogger, pois é essa faceta que será conectada ao receptáculo do StockSeller
• O componente tem métodos para recuperar suas facetas
/* Obtém a referência para component StockSeller. */ org.omg.CORBA.Object obj = orb.string_to_object(ior_seller); IComponent stockSeller = IComponentHelper.narrow(obj);
/* Obtém a referência para component StockLogger. */ obj = orb.string_to_object(ior_logger); IComponent stockLogger = IComponentHelper.narrow(obj);
/* Obtém a referência para IReceptacles do StockSeller */ IReceptacles irStockSeller = IReceptaclesHelper.narrow(stockSeller.getFacet(IReceptaclesHelper.id()));
/* Obtém a referência para ExchangePrinter do StockLogger */ExchangePrinter printer = ExchangePrinterHelper.narrow(stockLogger.getFacet(ExchangePrinterHelper.id()));
![Page 54: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/54.jpg)
Faz a conexão da faceta ExchangePrinter do StockLogger no receptáculo do StockSeller
• Usamos a faceta IReceptacles de StockSeller para fazer a conexão de componentes
• O método connect faz a conexão do componente StockLogger usando sua faceta ExchangePrinter
/* * Faz a conexão do componente StockLogger nos receptáculos de * StockSeller. Note que a faceta ExchangePrinter do componente é usada * para a conexão. */ irStockSeller.connect("ExchangePrinter", printer);
![Page 55: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/55.jpg)
Passo 6: Usando os componentes conectados ao receptáculo do StockSeller
• A implementação do método buyStock pela faceta StockExchange do componente StockSeller deve chamar o método print da faceta ExchangePrinter conectada a esse mesmo componte.
![Page 56: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/56.jpg)
Obtém o receptáculo correspondente a ExchangePrinter
• O contexto do componente possui o método getReceptacles que retorna os receptáculos do componente
• A classe Receptacle permite então recuperar as conexões• As descrições das conexões são recuperadas com o método getConnections de Receptacle
• O campo objref de ConnectionDescription possui a referência para a faceta do componente conectado
public boolean buyStock(String symbol) { … Receptacle receptacle = context.getReceptacles().get("ExchangePrinter"); if (receptacle == null) { … } List<ConnectionDescription> connections = receptacle.getConnections(); for (ConnectionDescription connection : connections) { ExchangePrinter printer = ExchangePrinterHelper.narrow(connection.objref); printer.print("Ação " + symbol + " foi negociada"); } ...}
![Page 57: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/57.jpg)
Passo 7: Usando o componente StockSeller
• O cliente usa o componente StockSeller através de suas facetas
• O StockMarketClient.java possui a etapa de inicialização do ORB que já vimos nos exemplos anteriores
• O que muda é o uso das facetas do componente para invocar as funções
![Page 58: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/58.jpg)
Obtendo a referência para o componente StockSeller
• O cliente recupera a referência para o componente StockSeller lendo do arquivo seller.ior
/* * Lê o IOR do componente StockSeller do arquivo seller.ior * parâmetro. */ BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(“seller.ior”)));String ior_seller = reader.readLine();
/* Obtém a referência para component StockSeller. */ org.omg.CORBA.Object ior = orb.string_to_object(ior_seller); IComponent stockSeller = IComponentHelper.narrow(ior);
![Page 59: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/59.jpg)
Obtendos as facetas StockServer e StockExchange do componente StockSeller
• Tendo o componente, as facetas StockServer e StockExchange são recuperadas, pelo nome ou pela interface
/* Obtém a faceta StockServer */ org.omg.CORBA.Object obj = stockSeller.getFacetByName("StockServer"); StockServer stockServerFacet = StockServerHelper.narrow(obj);
/* Obtém a faceta StockExchange */ obj = stockSeller.getFacetByName("StockExchange"); StockExchange stockExchangeFacet = StockExchangeHelper.narrow(obj);
![Page 60: API Java do SCS Tecgraf PUC-Rio maio de 2011. A API do SCS A API fica encapsulada em uma classe chamada ComponentBuilder, utilizada para “montar” um componente](https://reader036.vdocuments.pub/reader036/viewer/2022070507/570638521a28abb8238f9725/html5/thumbnails/60.jpg)
Invocando as funções disponibilizadas em cada faceta
• O cliente faz as chamadas aos métodos usando as respectivas facetas
/* Obtém os símbolos de todos as ações. */ String[] stockSymbols = stockServerFacet.getStockSymbols();
/* Mostra as ações de mercado com seus respectivos valores */ for (int i = 0; i < stockSymbols.length; i++) { System.out.println(stockSymbols[i] + " " + stockServerFacet.getStockValue(stockSymbols[i])); }
if (stockSymbols.length > 0) { String first = stockSymbols[0]; System.out.println("--Compra a ação :" + first); boolean success = stockExchangeFacet.buyStock(first); if (success) { System.out.println("--Ação " + first + " depois da negociação: " + stockServerFacet.getStockValue(first)); } else { System.out.println("--Não foi possivel negociar a ação " + first); } }