IDL Tecgraf PUC-Rio maio de 2011 IDL • Interface Definition Language • Linguagem neutra • Define a interface dos objetos CORBA struct Book { string author; string title; }; typedef sequence<Book> BookSeq; interface Biblioteca { boolean addBook(in Book pbook); BookSeq getBooks(); Book getBook(in string title); }; Mapeamento de IDL para uma linguagem de programação • OMG define especificações para mapeamento de IDL em diversas linguagens • Cada especificação define como traduzir a descrição feita em IDL para o código gerado (stubs e skeletons) em uma determinada linguagem de programação. Conteúdo • Elementos principais da IDL: • • • • • Interface Tipos primitivos Tipos estruturados (user-defined) Tipo ANY Módulos Interface • O tipo de um objeto CORBA é definido como uma interface IDL. • Uma interface IDL pode conter atributos e operações • Atributos são simplesmente “açúcar sintático” para operações de get e set. • Um atributo readonly representa uma operação de estilo get. Interface interface Account { void deposit (in double amount); void withdraw (in double amount) raises (insufficientFunds); double getTotal(); readonly attribute AccountDetails details; }; • A interface Account representa um objeto CORBA que possui as operações deposit e withdraw • O atributo details representa uma operação de consulta ao valor AccountDetails. Herança de Interface • Uma interface pode estender uma outra interface interface Account { ... }; interface Savings : Account { //Inherits all Account definitions //then adds Savings definitions ... }; Operações da interface - parâmetros • Os parâmetros de uma operação possuem uma direção, que pode ser: • in: o parâmetro é passado do cliente para o servidor • out: o parâmetro é passado de volta para o cliente • inout: o parâmetro é passado em ambas as direções void deposit (in double amount); Operações da interface – retorno • As operações de uma interface IDL definem um valor de retorno. • Se a operação não possuir valor de retorno, o tipo void deve ser utilizado. void deposit (in double amount); double getTotal(); Operações da interface - exceções • Uma operação pode lançar (raise) uma exceção se algo não ocorrer conforme esperado. • Existem mais de 30 tipos de exceções prédefinidas e o desenvolvedor pode definir novos tipos de exceções (user-defined) exception insufficientFunds { }; interface Account { ... void withdraw(in double amount) raises(insufficientFunds); }; Operações da Interface – tipos dos parâmetros e do valor de retorno • Os parâmetros de uma operação e o valor de retorno possuem tipos, que podem ser: • tipos primitivos (ex: boolean, string, long, etc) • tipos user-defined struct AccountDetails { ... }; interface Account { ... void deposit (in double amount); double getTotal(); readonly attribute AccountDetails details; }; Tipos primitivos Tipo IDL Significado boolean boolean value (0 ou 1): TRUE or FALSE char 8-bits character (Ex: ISO latin-1) wchar 16-bits character octet 8-bits (byte) string ISO Latin-1(tamanho não definido) wstring conjunto de wchar (tamanho não definido) short integer-signed 16 bits (-215 … 215-1) unsigned short integer-unsigned 16 bits (0…216-1) long integer-signed 32 bits unsigned long integer-unsigned 32 bits long long integer-signed 64 bits unsigned long long integer-unsigned 64 bits float IEEE single-precision floating point (32 bits) double IEEE double-precision floating point (64 bits) fixed Número de ponto fixo até 31 dígitos Tipos user-defined • • • • • • • struct sequence array typedef enum union valuetype struct • Permite definir um tipo que agrupa valores de outros tipos, primitivos ou estruturados. struct AccountDetails { string name; StringSeq address; long account_number; double current_balance; }; sequence • Representa uma sequência de valores de um determinado tipo. • É como um array uni-dimensional que pode ter um tamanho máximo ou não. sequence<string> address; sequence<string, 30> address; array • Assim como sequence, representa uma sequência de valores de um determinado tipo. • Diferente de sequence, a dimensão do array é fixada na definição do tipo, portanto, não pode ser alterada em tempo de execução. • Pode ter várias dimensões EmployeeRecord Employees[100]; long shares[1000]; string spreadsheet[100][100]; typedef • Define um novo nome para um tipo existente • É bastante comum usar typedef para nomear um tipo definido como sequence ou array typedef short id; typedef sequence<string> StringSeq; enum • Permite definir um tipo para representar uma lista enumerada. enum TrafficLight { red, yellow, green }; union • É usado para definir um tipo cujo valor pode ser um dentro os tipos especificados union Foo case 1: case 2: case 3: }; switch(short) { boolean boolVal; long longVal; string stringVal; enum PersonKind {A_GUEST, AN_EMPLOYEE, OTHER}; union Person switch (PersonKind) { case A_GUEST :GuestRecord guest_record; case AN_EMPLOYEE: EmployeeRecord employee_record; default: string description; }; valuetype • Usado para definir um objeto-por-valor que combina um struct (variáveis de estado) com operações valuetype Date { public short year; public short month; public short date; public void next_day(); public void previous_day(); }; valuetype • Uma das vantagens do valuetype é que ele pode ser retornado como null • A introdução do conceito de valuetype em CORBA tornou possível a definição de objetos com referências recursivas, o que não era possível usando apenas struct. valuetype Node { public long id; public Node next; }; abstract valuetype • O valuetype pode ser definido como abstrato e, nesse caso, não pode ter estado, apenas operações. • Objetos do tipo abstract value type não podem ser instanciados. valuetype • Podem ser estendidos usando herança valuetype Time : Date { public short minutes; public short seconds; void next_time(); void previous_time(); }; abstract interface • Assim como abstract value type, possui apenas as operações e não possui estado. • Representa uma entidade que, em tempo de execução, pode ser uma interface regular ou um objeto por valor (valuetype). • Dependendo do tipo real da entidade em tempo de execução é escolhida a semântica usada na passagem de parâmetro: por referência ou por valor. abstract interface abstract interface Describable { string get_description(); }; interface Example { void display (in Describable anObject); }; interface Account : Describable {// by reference // Métodos de Account }; valuetype Currency supports Describable {// by value // Métodos de Currency }; Tipo Any • Pode armazenar valores de qualquer tipo de dado representável em IDL. • O tipo de seu conteúdo só pode ser verificado em tempo de execução. struct NameValuePair { string name; any value; }; Módulos • Permite definir espaços de nomes para as interfaces e tipos definidos no arquivo IDL • Podem ser aninhados module tecgraf { module openbus { module DRMAA { ... }