Post on 07-Apr-2016
Tecgraf PUC-Riosetembro de 2013
IDL
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 mapeamentos 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
Interfaceinterface Account { void deposit (in double amount); void withdraw (in double amount) raises (insufficientFunds); double getTotal(); readonly attribute AccountDetails details; };
• A interface Account será implementada por um objeto CORBA que possua 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 primitivosTipo IDL Significadoboolean 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 switch(short) { case 1: boolean boolVal; case 2: long longVal; case 3: 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 {...}