Data Service Tecgraf PUC-Rio maio de 2011 Motivação • Aplicações científicas tem como característica a elevada complexidade de seus dados e dos algoritmos que os manipulam • representação complexa • grande volume de dados • Necessidade de compartilhamento de dados entre as aplicações Data Service • 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 Princípios básicos • Representação dos dados de forma estruturada • os dados podem ser representados da forma mais adequada para as aplicações • navegação x armazenamento • Diferentes visões sobre os dados • um mesmo dado pode oferecer diferentes visões • 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 O Serviço de Dados • 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 Descritores dos Dados • 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 valuetype DataDescription { /** A chave unívoca do dado. */ public DataKey fKey; /** O nome simbólico do dado. */ public string fName; /** As visões oferecidas pelo dado. */ public StringSeq fViews; /** Metadados (opcionais) do dado. */ public MetadataSeq fMetadata; }; • A navegação hierárquica é feita sobre descritores dos dados. • O descritor deve ter informações suficientes para que um determinado dado seja identificado. Descritores dos Dados valuetype DataDescription { /** A chave unívoca do dado. */ public DataKey fKey; /** O nome simbólico do dado. */ public string fName; /** As visões oferecidas pelo dado. */ public StringSeq fViews; /** Metadados (opcionais) do dado. */ public MetadataSeq fMetadata; }; typedef sequence<octet> OctetSeq; typedef OctetSeq DataKey; • 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. Descritores dos Dados valuetype DataDescription { /** A chave unívoca do dado. */ public DataKey fKey; /** O nome simbólico do dado. */ public string fName; /** As visões oferecidas pelo dado. */ public StringSeq fViews; /** Metadados (opcionais) do dado. */ public MetadataSeq fMetadata; }; • O campo fName possui um nome simbólico para o dado. Descritores dos Dados valuetype DataDescription { /** A chave unívoca do dado. */ public DataKey fKey; /** O nome simbólico do dado. */ public string fName; /** As visões oferecidas pelo dado. */ public StringSeq fViews; /** Metadados (opcionais) do dado. */ public MetadataSeq fMetadata; }; • O campo fViews possui a lista das visões que o dado possui. • Tipicamente utiliza-se o repository ID como identificador da visão. Descritores dos Dados valuetype DataDescription { /** A chave unívoca do dado. */ public DataKey fKey; /** O nome simbólico do dado. */ public string fName; /** As visões oferecidas pelo dado. */ public StringSeq fViews; /** Metadados (opcionais) do dado. */ public MetadataSeq fMetadata; }; struct Metadata { string fName; /**< \brief O nome. */ any fValue; /**< \brief O valor. */ }; typedef sequence<Metadata> MetadataSeq; • O campo fMetadata permite qualquer informação adicional • Par nome e valor onde o valor pode ser de qualquer tipo básico (any). Visão do Dado • É 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 é sobre um dado em particular. • Do ponto de vista do cliente, a visão é o dado. abstract 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 • 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 não-estruturada de um dado para a transferência de seu conteúdo através de um socket. */ valuetype UnstructuredData supports DataView { public DataKey fKey; /* O identificador unívoco do dado. */ 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 */ }; Exemplo de transferência de dado usando a visão não estruturada A biblioteca FTC implementa abstrações para transferência de dados por socket. byte[] data = ...; UnstructuredData view = (UnstructuredData) dataService.getDataView(fileKey, UnstructuredDataHelper.id()); DataKey dataKey = new DataKey(view.fKey); RemoteFileChannel rfc = new RemoteFileChannelImpl( dataKey.getDataId().getBytes(Utils.CHARSET_ENCODING), view.fWritable, view.fHost, view.fPort, view.fAccessKey); rfc.open(false); rfc.write(data); rfc.close(); Facetas definidas pelo Serviço de Dados • IHierarchicalNavigationDataService • responsável pela navegação pelos dados • IHierarchicalManagementDataService • responsável pela criação, atualização e remoção de dados, no próprio data source. • IHierarchicalTransferDataService • responsável pela transferência de dados entre data sources diferentes. • IHierarchicalDataService • interface de conveniência que herda todas as funcionalidades das outras três IHierarchicalNavigationDataService 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); IHierarchicalNavigationDataService • 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 acesso DataDescriptionSeq getChildren(in DataKey fKey) raises (ServiceFailure, InvalidDataKey, DataNotFound, DataAccessDenied); IHierarchicalNavigationDataService • O método getParent obtém o descritor dos 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 acesso DataDescription getParent(in DataKey fKey) raises (ServiceFailure, InvalidDataKey, DataNotFound, DataAccessDenied IHierarchicalNavigationDataService • 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 DataDescription getDataDescription(in DataKey fKey) raises (ServiceFailure, InvalidDataKey, DataNotFound, DataAccessDenied); IHierarchicalNavigationDataService • 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. UnknownViewInterface uma visão desconhecida foi solicitada DataAccessDenied caso o usuário não tenha permissão DataView getDataView(in DataKey fKey, in string fViewInterface) raises (ServiceFailure, InvalidDataKey, DataNotFound, UnknownViewInterface, DataAccessDenied); IHierarchicalNavigationDataService • 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. UnknownViewInterface uma visão desconhecida foi solicitada DataAccessDenied caso o usuário não tenha permissão DataViewSeq getDataViewSeq(in DataKeySeq fKeys, in string fViewInterface) raises (ServiceFailure, InvalidDataKey, DataNotFound, UnknownViewInterface, DataAccessDenied); IHierarchicalManagementDataService IHierarchicalManagementDataService • 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 DataKey createData(in DataKey fPrototype, in DataDescription fParentKey) raises (ServiceFailure, InvalidDataKey, DataNotFound, InvalidPrototype, DataAccessDenied) IHierarchicalManagementDataService • 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. UnknownViews o dado não possua visões para o novo dado. 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 DataKey copyData(in DataKey fSourceKey, in DataKey fParentKey) raises (ServiceFailure, UnknownViews, InvalidDataKey, DataNotFound, DataAccessDenied); IHierarchicalManagementDataService • 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. UnknownViews o dado não possua visões para o novo dado. 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 void moveData(in DataKey fKey, in DataKey fNewParentKey) raises (ServiceFailure, UnknownViews, InvalidDataKey, DataNotFound, DataAccessDenied); IHierarchicalManagementDataService • 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. UnknownViews o dado não possua visões para o novo dado. 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 void updateData(in DataKey fKey, in DataKey fSourceKey) raises (ServiceFailure, UnknownViews, InvalidDataKey, DataNotFound, DataAccessDenied); IHierarchicalManagementDataService • 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 void deleteData(in DataKey fKey) raises (ServiceFailure, InvalidDataKey, DataNotFound,DataAccessDenied); IHierarchicalTransferDataService IHierarchicalTransferDataService • 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. UnknownViews o dado não possua visões para o novo dado. 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 DataKey copyDataFrom(in DataKey fSourceKey, in DataKey fParentKey) raises (ServiceFailure, UnknownViews, InvalidDataKey, DataNotFound, DataAccessDenied) IHierarchicalTransferDataService • 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. UnknownViews o dado não possua visões para o novo dado. 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 void updateDataFrom(in DataKey fKey, in DataKey fSourceKey) raises (ServiceFailure, UnknownViews, InvalidDataKey, DataNotFound, DataAccessDenied);