versão 1 - julho/2013
Tecgraf PUC-RioNovembro de 2013
Data Service
versão 1 - julho/2013
Motivação
• Aplicações científicas têm como característica a elevada complexidade de seus dados e dos algoritmos que as manipulam• representação complexa• grande volume de dados
• Necessidade de compartilhamento de dados entre as aplicações
versão 1 - julho/2013
• Oferece um conjunto de funcionalidades para acesso e manipulação dos dados armazenados em Provedores de Dados (data sources)
• Flexível para atender às diferentes características dos servidores de dados e às diferentes necessidades dos clientes
• Aplicações se integram de maneira uniforme a diferentes provedores de dados, com apenas uma implementação
Data Service
versão 1 - julho/2013
• Representação dos dados de forma estruturada• os dados podem ser representados da forma mais
adequada às aplicações• navegação x armazenamento
• Diferentes visões sobre os dados• um mesmo dado pode oferecer diferentes visões• visões podem ser específicas ao domínio de utilização
daquele dado• Navegação hierárquica
• a navegação é feita de forma hierárquica• Navegação por descritores (meta-informações)
• a navegação não é feita sobre o próprio dado, mas sobre uma hierarquia de descritores
Princípios Básicos
versão 1 - julho/2013
• Define os tipos e as facetas para navegação hierárquica pelos dados oferecidos.
module tecgraf {
module openbus { /** * \brief Módulo do Serviço de Dados Estruturados. */
module data_service {
...
}; // data_service }; // openbus}; // tecgraf
O Serviço de Dados
versão 1 - julho/2013
• A navegação pelos dados é feita usando descritores que possuem meta-informação sobre os dados• descrição dos dados representados• indica quais as visões o dado representado
oferece• a aplicação usa apenas a visão que lhe
interessa• possui uma chave que identifica univocamente
o dado representado• É utilizada no descritor e nas visões como identificador• Pode ser persistida
Descritores dos Dados
versão 1 - julho/2013
• A navegação hierárquica é feita sobre descritores dos dados
• O descritor deve ter informações suficientes para que um determinado dado seja identificado
valuetype DataDescription { /** A chave unívoca do dado. */ DataKey fKey; /** O nome simbólico do dado. */ string fName; /** A visão padrão do dado (opcional). */ DefaultView fDefaultView; /** As outras visões oferecidas pelo dado, ou seja, as visões diferentes da visão padrão. */ StringSeq fOthersViews; /** Metadados (opcionais) do dado. */ MetadataSeq fMetadata;};
Descritores dos Dados
versão 1 - julho/2013
• A chave fKey é criada pelo serviço• Identificador unívoco• Identifica, além do dado em si, o serviço do qual o dado se
originou
valuetype DataDescription { /** A chave unívoca do dado. */ DataKey fKey; /** O nome simbólico do dado. */ string fName; /** A visão padrão do dado (opcional). */ DefaultView fDefaultView; /** As outras visões oferecidas pelo dado, ou seja, as visões diferentes da visão padrão. */ StringSeq fOthersViews; /** Metadados (opcionais) do dado. */ MetadataSeq fMetadata;};
typedef sequence<octet> OctetSeq;typedef OctetSeq DataKey;
Descritores dos Dados
versão 1 - julho/2013
• O campo fName possui um nome simbólico para o dado
valuetype DataDescription { /** A chave unívoca do dado. */ DataKey fKey; /** O nome simbólico do dado. */ string fName; /** A visão padrão do dado (opcional). */ DefaultView fDefaultView; /** As outras visões oferecidas pelo dado, ou seja, as visões diferentes da visão padrão. */ StringSeq fOthersViews; /** Metadados (opcionais) do dado. */ MetadataSeq fMetadata;};
Descritores dos Dados
versão 1 - julho/2013
• O campo fDefaultView possui a visão padrão do dado
• Tipicamente utiliza-se o repository ID como identificador da visão
valuetype DataDescription { /** A chave unívoca do dado. */ DataKey fKey; /** O nome simbólico do dado. */ string fName; /** A visão padrão do dado (opcional). */ DefaultView fDefaultView; /** As outras visões oferecidas pelo dado, ou seja, as visões diferentes da visão padrão. */ StringSeq fOthersViews; /** Metadados (opcionais) do dado. */ MetadataSeq fMetadata;};
Descritores dos Dados
versão 1 - julho/2013
• O campo fOthersViews possui a lista das outras visões do dado
valuetype DataDescription { /** A chave unívoca do dado. */ DataKey fKey; /** O nome simbólico do dado. */ string fName; /** A visão padrão do dado (opcional). */ DefaultView fDefaultView; /** As outras visões oferecidas pelo dado, ou seja, as visões diferentes da visão padrão. */ StringSeq fOthersViews; /** Metadados (opcionais) do dado. */ MetadataSeq fMetadata;};
Descritores dos Dados
versão 1 - julho/2013
• O campo fMetadata permite qualquer informação adicional • Par nome e valor onde o valor pode ser de qualquer tipo básico (any)
valuetype DataDescription { /** A chave unívoca do dado. */ DataKey fKey; /** O nome simbólico do dado. */ string fName; /** A visão padrão do dado (opcional). */ DefaultView fDefaultView; /** As outras visões oferecidas pelo dado, ou seja, as visões diferentes da visão padrão. */ StringSeq fOthersViews; /** Metadados (opcionais) do dado. */ MetadataSeq fMetadata;};struct Metadata { string fName; /**< \brief O nome. */ any fValue; /**< \brief O valor. */};typedef sequence<Metadata> MetadataSeq;
Descritores dos Dados
versão 1 - julho/2013
• É um conjunto de atributos e operações que apresentam o dado de acordo com um domínio ou uma necessidade específica
• Os servidores de dados implementam suas próprias visões
• Uma visão existe sobre um dado em particular• Do ponto de vista do cliente, a visão é o dadoabstract interface DataView { /** Obtém o identificador unívoco do dado. */ DataKey getKey() /** Obtém o nome da interface. Deve-se utilizar o * "Repository ID" como retorno. */ string getInterfaceName();};
Visão do Dado
versão 1 - julho/2013
• O DataService já define uma visão para dados não estruturados
• Com essa visão é possível transferir dados locais para o data source através de socket/** Visão de um dado por valor. */valuetype ValueTypeDataView supports DataView { public DataKey fKey; /* O identificador unívoco do dado */ };
/** Visão não-estruturada de um dado para a transferência de seu conteúdo através de um socket. */valuetype UnstructuredDataView : ValueTypeDataView { public string fHost; /* O nome do host de origem do dado */ public unsigned long fPort; /* A porta do host de origem */ public OctetSeq fAccessKey; /* A chave de acesso ao dado */ public boolean fWritable; /* Se é possível alterar o dado */};
Visão do Dado
versão 1 - julho/2013
• Para transferir os dados propriamente ditos, utilizamos um protocolo / biblioteca próprios, chamado FTC (File Transfer Protocol)
• Um protocolo é necessário para fornecer uma forma padronizada de transferência de arquivos
• A motivação maior por trás de um protocolo próprio é termos controle sobre ele, podendo inclusive inserir nossos próprios mecanismos de segurança, como o de autenticação do OpenBus
Transferência de Dados e o Protocolo FTC
versão 1 - julho/2013
• Outras motivações incluem:• Simplicidade• Facilidade de implementação em diversas linguagens• Não ficar preso à necessidade de expor um sistema de arquivos (nem sempre será o caso de sistemas que provêem dados através do barramento)• Flexibilidade: transferência de dados através de outras formas, como fluxos ou canais
Transferência de Dados e o Protocolo FTC
versão 1 - julho/2013
• A biblioteca FTC (versão C# atual 1.4.0.0, mas utilizaremos a 1.1.2 nos exercícios) implementa abstrações para transferência de dados por socket
byte[] data = …; string unstructuredDataViewIDLType = Repository.GetRepositoryID(typeof (UnstructuredDataView)); UnstructuredDataView view = (UnstructuredDataView) dataService.getDataView(fileKey, unstructuredDataViewIDLType); RemoteDataChannel rdc = new RemoteDataChannel(view.fKey, view.fWritable, view.fHost, view.fPort, view.fAccessKey); rdc.Open(false); // bool indica se é um acesso somente leitura rdc.Write(data); rdc.Close();
Exemplo de transferência de dado usando a visãonão estruturada
versão 1 - julho/2013
• Como dito anteriormente, visões podem ser utilizadas para representar um dado em diferentes domínios
• O DataService já fornece um tipo de visão, não-estruturada, a todos os dados
• Aplicações podem definir novos domínios que exijam novos tipos de visão
• Exemplo:• O framework CSBase define o conceito de área de projeto, que é um repositório de dados. Aplicações CSBase utilizam áreas de projeto para armazenar dados a ser utilizados em sua execução• Portanto, o domínio CSBase refere-se à gerência de projetos e define dois tipos de dado: “projeto” e “item de projeto”
Visão do Dado
versão 1 - julho/2013
• Exemplo:• Projetos têm metadados como:
• Dono do projeto• Descrição do projeto• Caminho absoluto• Nome do software que provê o projeto• Data de criação• Lista de usuários que podem ler e lista de usuários que podem escrever na área do projeto• Entre outros
Visão do Dado
versão 1 - julho/2013
• Exemplo:• Itens de projeto têm metadados como:
• Dono do item• Descrição do item• Caminho absoluto• Indicador se o item é um contêiner ou não• Tamanho• Se pode ser lido e se pode ser escrito• Data de criação• Entre outros
Visão do Dado
versão 1 - julho/2013
• Um certo dado do CSBase que seja um item de projeto, pode então prover uma visão que permita acesso a esses metadados a clientes interessados
• Clientes interessados em manipulá-los como dados quaisquer, no entanto, podem vê-lo como um dado não-estruturado, sem depender do domínio do CSBase e suas bibliotecas
Visão do Dado
versão 1 - julho/2013
…valuetype ProjectItemDataView : tecgraf::openbus::data_service::core::v1_02::ValueTypeDataView { public string fOwner; public string fDescription; public string fPath; public string fType; public long long fSize; public boolean fIsContainer; public boolean fCanRead; public boolean fCanWrite; public tecgraf::openbus::data_service::core::v1_02::TimeStamp fCreationDate; public tecgraf::openbus::data_service::core::v1_02::TimeStamp fModificationDate;};…
IDL project.idl
versão 1 - julho/2013
• IDataService• Permite a obteção de descrições e visões de
dados a partir de suas chaves unívocas• IHierarchicalNavigationDataService
• Permite a navegação pelos dados• IHierarchicalManagementDataService
• Permite a criação, atualização e remoção de dados, no próprio data source
• IHierarchicalTransferDataService• Permite a transferência de dados entre data
sources diferentes
Facetas definidas pelo Serviço de Dados
versão 1 - julho/2013
IDataService
versão 1 - julho/2013
DataDescription getDataDescription(in DataKey fKey) raises (ServiceFailure, InvalidDataKey, DataNotFound, DataAccessDenied);
• O método getDataDescription obtém o descritor de um determinado dado
• O parâmetro de entrada é a chave do dado que se deseja o descritor
• Pode lançar as exceções:• ServiceFailure caso ocorra uma falha na operação• InvalidDataKey caso a chave do dado não seja válida• DataNotFound caso o dado não seja encontrado• DataAccessDenied caso o usuário não tenha permissão
de acesso
IDataService
versão 1 - julho/2013
DataView getDataView(in DataKey fKey, in string fViewInterface) raises (ServiceFailure, InvalidDataKey, DataNotFound, UnsupportedView, DataAccessDenied);
• O método getDataView obtém uma visão de um dado• Os parâmetros de entrada são a chave do dado e o
nome da visão desejada• Pode lançar as exceções:
• ServiceFailure caso ocorra uma falha na operação• InvalidDataKey caso a chave do dado não seja válida• DataNotFound caso o dado não seja encontrado• UnsupportedView uma visão não suportada foi solicitada• DataAccessDenied caso o usuário não tenha permissão
IDataService
versão 1 - julho/2013
• O método getDataViewSeq obtém um conjunto de visões para um conjunto de dados. As visões retornadas implementam a mesma interface
• Os parâmetros são as chaves dos dados e o nome da visão• Pode lançar as exceções:
• ServiceFailure caso ocorra uma falha na operação• InvalidDataKey caso a chave do dado não seja válida• DataNotFound caso o dado não seja encontrado• UnsupportedView uma visão não suportada foi solicitada• DataAccessDenied caso o usuário não tenha permissão
DataViewSeq getDataViewSeq(in DataKeySeq fKeys, in string fViewInterface) raises (ServiceFailure, InvalidDataKey, DataNotFound, UnsupportedView, DataAccessDenied);
IDataService
versão 1 - julho/2013
IHierarchicalNavigationDataService
versão 1 - julho/2013
IHierarchicalNavigationDataService
• O método getRoots obtém os descritores dos dados que representam as raízes da hierarquia
• É utilizado pelas aplicações que utilizam o serviço para iniciar a navegação nos dados
• Pode lançar as exceções:• ServiceFailure caso ocorra uma falha na operação • DataAccessDenied caso o usuário não tenha
permissão de acesso
DataDescriptionSeq getRoots() raises (ServiceFailure, DataAccessDenied);
versão 1 - julho/2013
• O método getChildren obtém os descritores dos dados descendentes de um determinado dado
• O parâmetro de entrada é a chave do dado que se deseja os descendentes
• Pode lançar as exceções:• ServiceFailure caso ocorra uma falha na operação• InvalidDataKey caso a chave do dado não seja válida• DataNotFound caso o dado não seja encontrado• DataAccessDenied caso o usuário não tenha permissão
de acessoDataDescriptionSeq getChildren(in DataKey fKey) raises (ServiceFailure, InvalidDataKey, DataNotFound, DataAccessDenied);
IHierarchicalNavigationDataService
versão 1 - julho/2013
• O método getParent obtém o descritor do ascendente de um determinado dado
• O parâmetro de entrada é a chave do dado que se deseja o ascendente
• Pode lançar as exceções:• ServiceFailure caso ocorra uma falha na operação• InvalidDataKey caso a chave do dado não seja válida• DataNotFound caso o dado não seja encontrado • DataAccessDenied caso o usuário não tenha permissão
de acessoDataDescription getParent(in DataKey fKey) raises (ServiceFailure, InvalidDataKey, DataNotFound, DataAccessDenied
IHierarchicalNavigationDataService
versão 1 - julho/2013
IHierarchicalManagementDataService
versão 1 - julho/2013
• O método createData cria um dado a partir de informações contidas em um descritor protótipo
• Nem todos os campos precisam estar presentes na descrição do dado (ex: o campo dataKey)
• Pode lançar as exceções:• ServiceFailure caso ocorra uma falha na operação• InvalidDataKey caso a chave do dado não seja válida• DataNotFound caso o dado não seja encontrado• InvalidPrototype caso o protótipo seja inválido• DataAccessDenied caso o usuário não tenha permissão• DataAlreadyExist caso o dado já exista• InvalidContainer caso o dado pai não possa conter dados• UnsupportedOperation caso a operação não seja implementada
pelo serviçoDataKey createData(in DataKey fPrototype, in DataDescription fParentKey) raises (ServiceFailure, InvalidDataKey, DataNotFound, InvalidPrototype, DataAccessDenied, DataAlreadyExist, InvalidContainer, UnsupportedOperation)
IHierarchicalManagementDataService
versão 1 - julho/2013
• O método copyData copia um dado para uma determinada localização
• Recebe como parâmetros a chave do dado de origem e a chave do dado (pai) onde o novo dado (filho) será criado
• Pode lançar as exceções:• ServiceFailure caso ocorra uma falha na operação• InvalidDataKey caso a chave do dado não seja válida• DataNotFound caso o dado não seja encontrado• DataAccessDenied caso o usuário não tenha permissão• DataAlreadyExist caso o dado já exista• InvalidContainer caso o dado pai não possa conter dados• UnsupportedOperation caso a operação não seja
implementada pelo serviçoDataKey copyData(in DataKey fSourceKey, in DataKey fParentKey) raises (ServiceFailure, InvalidDataKey, DataNotFound, DataAccessDenied, DataAlreadyExist, InvalidContainer, UnsupportedOperation);
IHierarchicalManagementDataService
versão 1 - julho/2013
• O método moveData move um dado para uma determinada localização
• Recebe como parâmetros a chave do dado de origem e a chave do dado (pai) onde o novo dado (filho) será criado
• Pode lançar as exceções:• ServiceFailure caso ocorra uma falha na operação• InvalidDataKey caso a chave do dado não seja válida• DataNotFound caso o dado não seja encontrado• DataAccessDenied caso o usuário não tenha permissão• DataAlreadyExist caso o dado já exista• InvalidContainer caso o dado pai não possa conter dados• UnsupportedOperation caso a operação não seja
implementada pelo serviçovoid moveData(in DataKey fKey, in DataKey fNewParentKey) raises (ServiceFailure, InvalidDataKey, DataNotFound, DataAccessDenied, DataAlreadyExist, InvalidContainer, UnsupportedOperation);
IHierarchicalManagementDataService
versão 1 - julho/2013
• O método updateData atualiza um dado a partir do conteúdo de um outro dado qualquer
• Recebe como parâmetros a chave do dado que se deseja atualizar e a chave do dado de origem
• Pode lançar as exceções:• ServiceFailure caso ocorra uma falha na operação• AbsentViews caso o dado de origem não possua visões
conhecidas para a atualização• InvalidDataKey caso a chave do dado não seja válida• DataNotFound caso o dado não seja encontrado• DataAccessDenied caso o usuário não tenha permissão• UnsupportedOperation caso a operação não seja
implementada pelo serviçovoid updateData(in DataKey fKey, in DataKey fSourceKey) raises (ServiceFailure, AbsentViews, InvalidDataKey, DataNotFound, DataAccessDenied, UnsupportedOperation);
IHierarchicalManagementDataService
versão 1 - julho/2013
• O método deleteData remove um dado• Recebe como parâmetro a chave do dado que se
deseja remover• Pode lançar as exceções:
• ServiceFailure caso ocorra uma falha na operação• InvalidDataKey caso a chave do dado não seja válida• DataNotFound caso o dado não seja encontrado• DataAccessDenied caso o usuário não tenha permissão• UnsupportedOperation caso a operação não seja
implementada pelo serviço
void deleteData(in DataKey fKey) raises (ServiceFailure, InvalidDataKey, DataNotFound, DataAccessDenied, UnsupportedOperation);
IHierarchicalManagementDataService
versão 1 - julho/2013
IHierarchicalTransferDataService
versão 1 - julho/2013
• O método copyDataFrom copia um dado proveniente de outro data source para uma determinada localização
• Recebe como parâmetros a chave do dado de origem e a chave do dado (pai) onde o novo dado (filho) será criado
• Pode lançar as exceções:• ServiceFailure caso ocorra uma falha na operação• InvalidDataKey caso a chave do dado não seja válida• DataNotFound caso o dado não seja encontrado• DataAccessDenied caso o usuário não tenha permissão• AbsentViews caso o dado de origem não possua visões conhecidas para a
atualização• UnavailableDataService caso o servidor de origem do dado não esteja
disponível• DataAlreadyExist caso o dado já exista• InvalidContainer caso o dado pai não possa conter dados• UnsupportedOperation caso a operação não seja implementada pelo
serviçoDataKey copyDataFrom(in DataKey fSourceKey, in DataKey fParentKey) raises (ServiceFailure, AbsentViews, InvalidDataKey, DataNotFound, DataAccessDenied, UnavailableDataService, DataAlreadyExist,
InvalidContainer, UnsupportedOperation)
IHierarchicalTransferDataService
versão 1 - julho/2013
• O método updateDataFrom atualiza um dado a partir do conteúdo de um dado proveniente de outro data source
• Recebe como parâmetros a chave do dado que se deseja atualizar e a chave do dado de origem
• Pode lançar as exceções:• ServiceFailure caso ocorra uma falha na operação• AbsentViews caso o dado de origem não possua visões
conhecidas para a atualização• InvalidDataKey caso a chave do dado não seja válida• DataNotFound caso o dado não seja encontrado• DataAccessDenied caso o usuário não tenha permissão• UnavailableDataService caso o servidor de origem do dado
não esteja disponívelvoid updateDataFrom(in DataKey fKey, in DataKey fSourceKey) raises (ServiceFailure, AbsentViews, InvalidDataKey, DataNotFound, DataAccessDenied, UnavailableDataService);
IHierarchicalTransferDataService
versão 1 - julho/2013
As Bibliotecas Core e Project
versão 1 - julho/2013
• Representa e permite manipular dados de uma forma genérica, não estruturada
• Inclui a implementação do valuetype UnstructuredDataView
• Inclui uma classe para facilitar a manipulação do Datakey• DataKeyWrapper
Core
versão 1 - julho/2013
• Representa e permite manipular dados relacionados à gerência de projetos, do domínio CSBase ou outros domínios compatíveis• Onde, nesses domínios, um projeto é algo similar
a um repositório para dados utilizados por aplicações e/ou algoritmos
• Inclui a implementação dos valuetypes ProjectDataView e ProjectItemDataView
• Esses valuetypes representam visões diferentes para dados, sendo abstrações para projetos e itens de projetos respectivamente
Project
Top Related