• Nenhum resultado encontrado

6 OS MÓDULOS FUNCIONAIS DA ARQUITETURA SBI

6.3 Gerenciador de Serviços

6.3.2 Classes para montagem e execução de composições

Para o atendimento do requisito RF5 (suporte a composições de serviços), o Gerenciador de Serviços prevê ainda um conjunto de classes para a criação e orquestração de composições de WSS baseadas em fluxos de dados. Essas classes permitem que tomadores de decisão possam definir composições de serviços para realizar processamentos diversos, tomando como ponto de partida os dados reunidos em suas análises. Até o momento, esse conjunto de classes suporta, através da Arquitetura SBI, a ferramenta para definição de composições, descrita em Sell et al. (2004b), e a ferramenta OntoDSS, descrita na Seção 7.2.

Uma composição é definida através de um objeto da classe

DataFlowComposition, uma extensão da classe Composition, conforme

ilustrado na Figura 23. A classe DataFlowComposition reúne várias informações sobre a composição criada pelo usuário, incluindo: seu nome (i.e., atributo name); a ontologia (i.e., atributo ontology), onde serão depositados os construtores semânticos correspondentes, conforme descrito na Seção 5.4 (Ontologia de Serviços); os repositórios de dados de entrada e de saída dos serviços reunidos na composição (i.e., compositionInput e compositionOutput respectivamente); informação sobre quais serviços estão sendo executados e qual o status de cada serviço (i.e., runningThreadNames e threadStatus respectivamente); além de outras informações sobre o estado da composição e sobre a coleção de serviços adicionados à composição (i.e.,

orchestrationRunning, orchestrationWaiting e componentServices). Essas

informações são manipuladas por um conjunto de métodos utilizados para a adição de serviços à composição (i.e., addComponent) ou para orquestração e encerramento da execução da composição (i.e., métodos perform e terminate respectivamente).

Uma composição definida segundo este modelo reúne uma coleção de serviços que aguardam valores para suas entradas e valores produzidos como saída dos seus processamentos. Esses valores são reunidos em uma classe chamada Repository, a qual funciona como uma lista de objetos da classe

RoleValuePair. A classe RoleValuePair identifica o nome de um parâmetro de

cd da t a f low

Com posi t i on + r unning: St r ing = "Running" + idle: St r ing = "Idle"

+ wait ingFor Input : St r ing = "Wait ing f or input " + wait ingFor Ot her s: St r ing = "Wait ing f or in... + wait ingOnBr anches: St r ing = "Wait ing on br a... # r epor t : JTex t Ar ea

Role V a lue P a ir

+ r ole: St r ing + v alue: St r ing

+ RoleValuePair (St r ing, St r ing)

D a t a Flow Com posit ion

- name: St r ing - ont ology : St r ing

- composit ionInput : Reposit or y - composit ionOut put : Reposit or y - component Thr eads: Vect or - r unningThr eadNames: Vect or - t hr eadSt at us: Vect or - accept ableInput Roles: Vect or - or chest r at ionIsRunning: boolean - or chest r at ionIsWait ing: boolean - out put Ready : boolean = f alse ~ component Ser v ices: Vect or ~ r epor t : JTex t Ar ea

+ Dat aFlowComposit ion()

+ Dat aFlowComposit ion(St r ing, St r ing) + addComponent (Ser v iceComponent ) : v oid + per f or m(St r ing, St r ing) : v oid

+ t er minat e(long) : boolean + clear () : v oid

+ set Composit ionInput (RoleValuePair ) : v oid ~ get Composit ionInput (St r ing) : St r ing ~ set Composit ionOut put (RoleValuePair ) : v oid + out put Ready () : boolean

+ get Composit ionOut put (St r ing) : St r ing + wait For Input Request () : v oid + accept ableInput RoleNames() : Vect or ~ set RunningThr ead(St r ing) : v oid ~ set Thr eadSt at us(St r ing, St r ing) : v oid + get Thr eadSt at us(St r ing) : St r ing ~ r emov eRunningThr ead(St r ing) : v oid + mediat or sFor AllInput sPr ov ided() : boolean + set Repor t ingTex t Ar ea(JTex t Ar ea) : v oid + get Ont ology Name() : St r ing

+ load() : Dat aFlowComposit ion + get Component sNames() : Vect or

+ wr it eAndRename(Ser v er Descr ipt ion, St r ing, St r ing) : v oid + wr it e(Ser v er Descr ipt ion) : v oid

Re posit or y

- hashTable: Hasht able - isLock ed: boolean

+ Reposit or y ()

~ set RoleValuePair (RoleValuePair ) : v oid ~ get Value(St r ing) : St r ing

~ allRoleNames() : Vect or

~ r emov eRoleValuePair (St r ing) : v oid ~ isEmpt y () : boolean

- composit ionInput - composit ionOut put

Figura 23 - Ilustração das classes utilizadas para a definição de uma composição

Como descrito na Seção 5.4, o modelo de composição desta tese prevê componentes de controle e componentes de serviço. Os componentes de controle prescrevem como será encaminhado o fluxo de dados na composição, e os componentes de serviço descrevem os Goals e Web services relacionados na composição. Ambos os componentes são filhos da classe

descreve à qual composição um componente está atrelado, além do método

perform que executa o componente.

A classe ServiceComponent mantém em suas propriedades informações sobre um Goal ou Web service definido na Ontologia de Serviços, como a sua identificação (i.e., através da propriedade invocable), além das ligações definidas na composição entre o componente corrente e os outros componentes ou das suas ligações com as entradas e saída da composição. Essas ligações são definidas por meio dos métodos setInternalBinding,

setConditionalBinding, setBindingToCompositionInput e setBindingToCompositionOutput. A classe IfThenElse descreve uma condição

(i.e., uma expressão condicional definida pela propriedade condition) e suas ligações condicionais definidas através dos métodos addThenBindingMediator e addElseBindingMediator.

As descrições de ligações da classe ServiceComponent e da classe

IfThenElse são feitas através de objetos da classe GInvMediator. A classe GInvMediator descreve quais as saídas (mediationOutputRoleNames) do

componente origem (i.e., o nome de um ServiceComponent ou

ControlComponent identificado pela propriedade source) serão fornecidas para

as entradas identificadas pela propriedade mediationOutputRoleNames do componente destino (identificado pela propriedade target). Esta classe descreve ainda, opcionalmente, um Goal ou Web service que realizará uma transformação entre a saída do primeiro componente e a entrada do segundo.

Todos os objetos da classe ServiceComponent são transformados em

threads (WIKIPEDIA, 2004c) através de objetos da classe ComponentThread.

Tais objetos prevêem um controle para verificar a cada segundo se o seu repositório de dados de entrada (i.e., objeto da classe Repository identificado através de sua propriedade repository) já possui todos os dados necessários para preencher seus parâmetros de entrada. Quando um ServiceComponent possui todos os dados necessários, ele é executado acionando-se o Goal ou o

Web service descrito pela propriedade invocable. O resultado do ServiceComponent é então processado pelos Mediators definidos nas

propriedades internalBindings, conditionalBindings e bindingToCompositionOutput do ServiceComponent. Os Mediators acionados

preencherão os repositórios dos componentes associados ao componente que acabou de ser executado, e esse processo continua até que todos os componentes da composição tenham sido executados, produzindo a saída da composição. Esse processo é ilustrado na Figura 25.

cd da t a f low

GI nv GI nv Med i a t or

# sour ce: St r ing # t ar get : St r ing # mediat ionGoal: St r ing # mediat ionOnt ology : St r ing # ser v er Desc: Ser v er Descr ipt ion # mediat ionInput RoleNames: Vect or # mediat ionOut put RoleNames: Vect or # mediat ionPar amet er s: Vect or # mediat or Name: St r ing # belongsTo: Composit ion # count er : int = 0 + GInv GInv Mediat or ()

+ GInv GInv Mediat or (St r ing, St r ing, St r ing, St r ing, Ser v er Descr ipt ion) + sour ce() : St r ing

+ t ar get () : St r ing + mediat ionGoal() : St r ing ~ get GoalName() : St r ing + get Name() : St r ing

+ set Mediat ionInput RoleName(St r ing) : v oid + get Mediat ionInput RoleNames() : Vect or + set Mediat ionOut put RoleName(St r ing) : v oid + get Mediat ionOut put RoleNames() : Vect or + set Mediat ionPar amet er () : v oid + get Mediat ionPar amet er s() : Vect or + set Or chest r at ion(Composit ion) : v oid + mediat e(Vect or , St r ing, St r ing) : Vect or - conv er t ToSt r ing(Document ) : St r ing - conv er t ToXML(St r ing) : Document + get Ocml() : St r ing

~ get Mediat ionPar amet er sInOcml() : St r ing

Thread Com pon e nt Thr e a d

- component : Ser v iceComponent - t er minat ed: boolean = f alse - user name: St r ing - passwor d: St r ing

~ Component Thr ead(Ser v iceComponent , St r ing, St r ing, St r ing) + t er minat e() : v oid

+ r un() : v oid

Com posi t i onCom ponent

~ belongsTo: Dat aFlowComposit ion ~ name: St r ing

~ Composit ionComponent () ~ perf orm ( St ring, St ring) : v oid

~ s et Orches t rat ion( Dat aFlowCom pos it ion) : v oid ~ get Ocm l( ) : St ring

+ get Name() : St r ing

Cont r ol Com p onent

+ Cont r olComponent () ~ per f or m(St r ing, St r ing) : v oid

~ s et Orches t rat ion( Dat aFlowCom pos it ion) : v oid ~ get Ocm l( ) : St ring

I f The nElse

- condit ion: St r ing ~ r eposit or y : Reposit or y - ocmlPar am: Vect or - f uncName: St r ing - if Count er : int = 0 - name: St r ing ~ elseMediat or s: Vect or ~ t henMediat or s: Vect or - belongsTo: Dat aFlowComposit ion ~ If ThenElse(St r ing)

+ addThenBindingMediat or (GInv GInv Mediat or , Ser v iceComponent ) : v oid + addElseBindingMediat or (GInv GInv Mediat or , Ser v iceComponent ) : v oid + addThenBindingToOut put (GInv GInv Mediat or ) : v oid

+ addElseBindingToOut put (GInv GInv Mediat or ) : v oid ~ ev aluat e(St r ing, St r ing) : boolean

~ set Or chest r at ion(Dat aFlowComposit ion) : v oid ~ get ThenMediat or s() : Vect or

~ get ElseMediat or s() : Vect or + get Name() : St r ing ~ get Ocml() : St r ing

Se r v ice Com po ne nt

- inv ocable: St r ing - ont ology : St r ing - er r or HandlingSer v ice: St r ing - int er nalBindings: Vect or - condit ionalBindings: Vect or - bindingToComposit ionInput : Vect or - bindingToComposit ionOut put : Vect or - t er minat ed: boolean = f alse - ser v er Desc: Ser v er Descr ipt ion ~ r eposit or y : Reposit or y

- input Mediat or s: Vect or = new Vect or (5,2) + Ser v iceComponent (Ser v er Descr ipt ion, St r ing, St r ing) ~ set Input Mediat or (GInv GInv Mediat or ) : v oid - get Input Mediat or s() : Vect or

+ set Int er nalBinding(GInv GInv Mediat or , Ser v iceComponent ) : v oid + set Int er nalBinding(GInv GInv Mediat or , Cont r olComponent ) : v oid + set BindingToComposit ionInput (GInv GInv Mediat or ) : v oid + set BindingToComposit ionOut put (GInv GInv Mediat or ) : v oid + cr eat eIf ThenElse(St r ing) : If ThenElse

+ set Condit ionalBinding(If ThenElse) : v oid + inv ocable() : St r ing

~ per f or m(St r ing, St r ing) : v oid

- pullDat aThr oughMediat or (GInv GInv Mediat or , St r ing, St r ing) : v oid ~ set Or chest r at ion(Dat aFlowComposit ion) : v oid

~ allInput sPr ov idedBy Mediat or s() : boolean ~ get Ocml() : St r ing

~ t er minat e() : v oid

- component

Figura 24 - Ilustração das classes utilizadas para a definição de Control Components, Service Components e Mediators em uma composição

a ct Se r v ice Com pone nt Início Re t or ne a s e nt r a da s do se r v iço Espe r e 1 se gundo Todas as ent r adas est ão no r eposit ór io?

Ex e cut e os m e dia dor e s de f inidos e m int e r na lBindings

Ex e cut e os m e dia dor e s de f inidos e m condit iona lBindings

Ex e cut e os m e dia dor e s de f inidos e m

bindingToCom posit ionO ut put

Fim Pr ocesso int er r ompido? [T] [T] [F] [F]

Figura 25 - Fluxo de processamento em um Service Component