• Nenhum resultado encontrado

2.3 PEWS

2.3.1 A Linguagem de Composição

No contexto de PEWS, predicados são extensões que podem ser aplicadas a path

expressions com o intuito de aumentar sua expressividade. Podemos ver o aumento no ní-

vel de expressividade com o seguinte exemplo: usando apenas path expressions, desejamos que um uma ação a ocorra zero ou mais vezes, sendo seguida de uma operação paralela simples entre b e c. Através do operador de sequência Ş.Ť, do operador de paralelismo Ş||Ť e do operador que indica zero ou mais vezes Ş∗Ť, podemos representar essa expressão

da seguinte forma:

a∗ . (b || c)

Com esse nível de expressividade, não podemos especiĄcar, por exemplo, condições para execução das operações. O uso de predicados nos permite especiĄcar diversas carac- terísticas às path expressions. Por exemplo, desejamos que ou a operação b ou a operação

cseja executada, de acordo com a avaliação de um condição P, onde se P retorna um valor true, b é executado, e se P retorna um valor false, c é executado. Vejamos o exemplo abaixo:

a∗ . ([P]b || [not P] c)

Como vemos acima, houve um aumento na expressividade da path expression com a extensão dada pelo uso de predicados, sendo esta a proposta de PEWS. A sintaxe PEWS é deĄnida pela seguinte gramática [4]:

(1) interface = JportType def∗ pathK

(2) path = JopnameK | Jpath ‘.’ pathK | Jpath ‘+’ pathK Jpath ‘k’ pathK Jpath∗K J‘{’ path ‘}’K

J‘[’ pred ‘]’ pathK

(3) pred = J ‘true’ K | J ‘false’ K | J ‘not’ pred K |

J pred boolOp predK | J arith-expr relOp arith-expr K

(4) def = J ‘def’ var ‘=’ arith-expr K

(5) portType = J operation+ K

(6) operation = J opname ‘(’ opArg ‘)’ K

(7) opArg = J‘in:’ msgName K | J ’out:‘ msgName K | J‘in-out:’ msgName ‘,’ msgName K | J‘out-in:’ msgName ‘,’ msgName K

(8) msgName = -

(9) opName = -

(10) arith-expr = JvarK | Jarith-expr arithOp arith-exprK | J‘now()’K J‘act (’ opname ‘).val’K | J ‘act (’ opname ‘).time’ K | J ‘term (’ opname ‘).val’K | J‘term (’ opname ‘).time’K

(11) boolOp = -

(12) relOp = -

(13) arithOp = -

(14) var = -

Os símbolos não terminais que contém um Ś-Š no lado direito da transformação não têm sua especiĄcação deĄnida aqui. Entretanto, podemos ter uma noção do signiĄcado

2.3. PEWS 35 dos mesmos pela lógica da gramática. Por exemplo, boolOp indica operadores booleanos, ou seja, operador de conjunção (and) e disjunção (or), enquanto arithOp representa os operadores aritméticos, ou seja, soma (+), subtração (-), e assim por diante.

Uma interface tem sua deĄnição como sendo um conjunto de uma ou mais opera- ções (portType), uma sequência de deĄnições (def), seguido de uma path expression (path). O elemento portType é o responsável por descrever uma ou mais interface de chamada de serviços, ou seja, os bindings de uma ou mais operações (representadas por operation+), onde são descritos o nome do serviço e os argumentos de entrada e de saída referentes a este serviço (indicado por (6) e (7)). Já na deĄnição def, é possível declarar variáveis inteiras para que sejam usadas posteriormente nos predicados, onde o valor das variáveis é obtido pela avaliação de expressões aritméticas que envolvem contadores pre- deĄnidos, sendo eles: req, act e term [4]. Cada um deles possui um par de inteiros, val e time, onde o primeiro representa o próprio contador, e o segundo indica o momento em que o contador foi modiĄcado. A semântica destes contadores está fora do escopo deste trabalho.

A abstração path pode representar: chamadas a serviços (JopnameK), operações seqüenciais (Jpath . pathK), escolhas (Jpath + pathK), operações paralelas (Jpath || pathK), zero ou mais operações sequenciais de um objeto (Jpath∗K), repetições paralelas

(J{path}K) e operações com predicados (J[pred] pathK), conceituadas a seguir:

• JopnameKŰ Representa uma chamada a um determinado serviço, de nome opname; • Jpath1 . path2K Ű Representa uma sequência de operações, onde as operações presentes em path2 só terão sua execução iniciada no momento em que todas as operações de path1 Ąnalizarem;

• Jpath1 + path2KŰ Escolha entre a execução de path1 e path2, cuja decisão pode ser determinada por predicados;

• Jpath1 || path2KŰ Operação paralela entre path1 e path2, onde as operações de ambos podem ser executadas simultaneamente;

• JpathK Ű Representa a execução sequencial de zero ou mais vezes das operações

deĄnidas por path;

• J{path}KŰ Repetição paralela da operação path;

Para ilustrar o uso de alguns desses operadores, apresentaremos um exemplo adap- tado, retirado de [4]. Como o uso de contadores pré-deĄnidos está fora do escopo deste trabalho, adaptamos o exemplo para que o uso destes contadores seja dispensável.

Exemplo: Consideremos um armazém, cujas operações englobam receber um pe-

dido, enviar uma conta, receber um pagamento e enviar o recibo, representados respec- tivamente por order, bill, payment e receipt. Suponha que, após o recebimento do pedido, o pagamento deve ser feito dentro de 48 horas após a conta ser enviada. Se o prazo não for respeitado, todo o processo é abortado. Considerando tpay como a variável que contém o intervalo de tempo entre o recebimento do pedido e o pagamento, uma possível path expression, utilizando a sintaxe de PEWS mostrada acima, é a seguinte:

(order.bill.([tpay ≤ 48h] payment.receipt + [tpay > 48h] abortOperation))∗ As operações order e bill são realizadas sequencialmente. Logo após, são utili- zados predicados antes da execução das operações payment.receipt e abortOperation, representando uma escolha. Sendo eles avaliados, as operações executadas corresponderão à guarda cujo resultado da avaliação retornar true. Se o valor da variável tpay é menor ou igual a 48h, as operações payment e receipt são executadas; caso contrário, o operação abortOperation (que representa o cancelamento do processo) é executada.

PEWS possui uma variante chamada XPEWS [4], que é a versão de PEWS na linguagem XML. PEWS possui um front-end e um back-end, onde o front-end é um editor PEWS implementado como uma extensão para a plataforma Eclipse que inclui um veriĄcador de tipos e um gerador para transformação de PEWS em XPEWS. O back-end tem a capacidade de gerar classes Java a partir de um programa XPEWS e adicionar restrições comportamentais a documentos WSDL. Não entraremos em detalhes sobre a sintaxe de XPEWS, pois não é o foco do nosso trabalho.