Unknown macro: {center}
Portal OpenBus

Data Service

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Implementando Servidor DataService 1.2

Repositório GIT do DataService

Configuração para projetos Maven

URL do servidor Nexus do Tecgraf: http://maven.tecgraf.puc-rio.br:8081/nexus

...

Code Block
languagexml
<dependency>
  <groupId>br.puc-rio.tecgraf.openbus</groupId>
  <artifactId>data_service-core-v1.2</artifactId>
  <version>1.2.1.0</version>
</dependency>
 
<dependency>
   <groupId>br.puc-rio.tecgraf.openbus</groupId>
   <artifactId>data_service-project-v1.2</artifactId>
   <version>1.2.0.1</version>
</dependency>

Definição da regra de formação do DataKey

O datakey deve ser definido pelo implementador do servidor DataService. No datakey pode-se inserir qualquer informação que o serviço entenda como importante para identificar o dado. Pode-se, por exemplo, usar como parte da chave o caminho do dado no sistema de arquivos ou a chave do dado em um banco de dados. O datakey também pode conter informações suficientes para identificar o dado num barramento OpenBus.

...

  • Versão 1.2, um servidor que se autentica no OpenBus com a entidade openspiritserver_treinamento_brasil, organiza suas fontes de dados como o nome de instâncias de banco em um outro software de acesso a dados (OpenWorks2003) e identifica o dado de acordo com a chave de acesso ao dado nesse outro software (tag <key> em notação xml).

    Code Block
    languagexml
    v1_02;openspiritserver_treinamento_brasil;OpenWorks2003;<key en="EpiSeismic_PostStack2d" mv="2.9" dn="MyDomainExample" tn="OpenWorks" tv="2003" pn="MyProject"><sen="Seismic2D" id="1"/><a n="project" ei="1">osp2d</a><a n="filename" ei="1">line1234798.2v2_glb</a></key>

Codificação e serialização do DataKey

datakey é definido como um vetor de bytes, então é importante se preocupar com a codificação de caracteres. Em nossos exemplos usamos a codificação de caracteres US-ASCII. A depender do ambiente de execução do servidor DataService e da definição do identificador do dado pode ser necessário usar UTF-8, ISO-8859-1 ou outra codificação.

...

  • Serialização de um DataKey em Base64:

    Code Block
    import org.apache.commons.codec.binary.Base64;
    ...
    byte[] datakey = "v1_02;dataserver_treinamento_brasil;/tmp/sandbox;primeiro_arquivo.txt".getBytes("ASCII");
    System.out.println(new String(Base64.encodeBase64(datakey)));
    //RESULTADO: djFfMDI7ZGF0YXNlcnZlcl90cmVpbmFtZW50b19icmFzaWw7L3RtcC9zYW5kYm94O3ByaW1laXJvX2FycXVpdm8udHh0
  • Desserialização de uma string Base64 para um DataKey:

    Code Block
    import org.apache.commons.codec.binary.Base64;
    ...
    //ENTRADA: djFfMDI7ZGF0YXNlcnZlcl90cmVpbmFtZW50b19icmFzaWw7L3RtcC9zYW5kYm94O3ByaW1laXJvX2FycXVpdm8udHh0
    byte[] datakey = Base64.decodeBase64(input);
    System.out.println(new String(datakey));
    //RESULTADO: v1_02;dataserver_treinamento_brasil;/tmp/sandbox;primeiro_arquivo.txt

Exemplo de preenchimento da estrutura que descreve um dado

Um dado é descrito através da estrutura do DataDescription. Essa estrutura pode ser obtida tanto através da interface DataService (método getDataDescription) quanto da interface IHierarchicalNavigationDataService (getRoots, getChildren, getParent). Um DataDescription é definido em CORBA IDL pela seguinte estrutura:

...

Code Block
import tecgraf.openbus.data_service.core.v1_02.DataDescription;
import tecgraf.openbus.data_service.core.v1_02.DefaultView;
import tecgraf.openbus.data_service.core.v1_02.Metadata;
import tecgraf.openbus.data_service.core.v1_02.UnstructuredDataViewHelper;
...
DataDescription desc = new DataDescription();
desc.fKey = "v1_02;dataserver_treinamento_brasil;/tmp/sandbox;primeiro_arquivo.txt".getBytes("ASCII");
desc.fName = "primeiro_arquivo.txt";
desc.fDefaultView = new DefaultView("", null); // DefaultView vazio
desc.fOthersViews = new String[] { UnstructuredDataViewHelper.id() }; // UnstructuredDataView como visão adicional

Any mimetype = orb.create_any();
mimetype.insert_string("text/plain");
Any charset = orb.create_any();
charset.insert_string("US-ASCII");

desc.fMetadata = new Metadata[] {
    new Metadata("mimetype", mimetype),
    new Metadata("charset", charset)
};

A visão para dados não-estruturados (UnstructuredDataView)

Uma forma de usar a API DataService com dados não-estruturados é fornecer uma visão UnstructuredDataView. Através dela é possível indicar o endereço de um máquina servidora (hostname e porta) e uma chave de acesso (AccessKey) que permitirá à máquina servidora reconhecer sobre qual dado se trata.

...

  • HTTP e FTP: o campo fPort pode indicar 80 e 21, respectivamente. O campo fAccessKey pode ser o caminho para o arquivo e pode encapsular algum token de autenticação. O campo fWritable pode se é possível fazer um PUT ou apenas um GET.
  • RTP e RTSP: provavelmente apenas os campos fHost e fPort serão necessários, mas o campo fAccessKey pode ser o caminho para o stream e ser útil para implementar um controle de acesso ao stream.

Implementando Servidor FTC 1.1

O Tecgraf/PUC-Rio define e implementa o protocolo FTC (File Transfer Channels) para acessar remotamente arquivos através da abstração de canais de uma forma multi-linguagem. Essa abstração de canais é semelhante aos canais do Java NIO e permite um controle preciso sobre leituras e escritas favorecendo a escalabilidade. As linguagens suportadas pelo FTC são: C++, Java e Lua. C# passou a ser suportada a partir da versão 1.4 do FTC.

Nesse tutorial será exemplificada a implementação de um servidor FTC 1.1 em Java.

Repositório GIT do FTC

https://git.tecgraf.puc-rio.br/ftc/ftc-core/tree/01_01_07

Configuração para projetos Maven

Code Block
languagexml
<dependency>
   <groupId>br.puc-rio.tecgraf.ftc</groupId>
   <artifactId>ftc</artifactId>
   <version>1.1.7</version>
</dependency>

Provendo arquivos através de um Servidor FTC

Deve-se começar implementando a interface tecgraf.ftc.server.FileServerOwner. O método createFileChannel será invocado pela biblioteca do FTC quando for solicitado um canal para o arquivo e possui os seguintes parâmetros:

...

Code Block
// thread para tratar as requisições do protocolo FTC
final Thread ftcServerThread = new Thread() {
    public void run() {
        ftcServer.dispatch();
    }
};
// disparo da thread para o servidor FTC
ftcServerThread.start();
...
// captura do sinal de aborto de um processo em Java e parada adequada do servidor FTC e da thread adicional
Runtime.getRuntime().addShutdownHook(
        new Thread() {
            public void run() {
                // parando o atendimento de requisições FTC
                ftcServer.stop();
				try {
				    // esperando a thread do servidor FTC terminar
				    ftcServerThread.join();
				} catch (InterruptedException e) {
				    e.printStackTrace();
				}
            }
        });

Combinando um Servidor FTC com um Servidor DataService

Provimento da visão UnstructuredDataView a partir de canais do FTC

É possível combinar um servidor FTC com o DataService através do preenchimento da visão UnstructuredDataView. No momento da criação da UnstructuredDataView será preciso criar um canal para o arquivo.

...

Code Block
languagejava
public FileChannelAccessInfo createFileChannelInfo(Object requester, byte[] fileId, byte[] accessKey) throws InvalidArraySize;

Exceções previstas na API do DataService

É importante atenção ao usar as exceções prevista na API do DataService pois elas possuem campos e por isso devem ser construídas corretamente para evitar erros na serialização em CORBA. Em Java, o compilador de IDL gera construtores com parâmetros adicionais para cada campo presente na exceção.

...