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 {
...
}
Download

Interface - Tecgraf JIRA / Confluence - PUC-Rio