Inteceptors

7 respostas
louds

Estou eu implementando suporte a interceptor stacks e me deparei com um probleminha que não achei solução prática.

Os interceptors funcionam como decoradores, ou seja, eles fazem ‘wrapping’ nos objetos em questão.

Meu problema todo é como implementar isso sem usar DP.

Por exemplo:

interface X { void m0(); void m1(); }
interface Y { void m2(); void m3(); }

class Interceptor1 implements X {
   X x;
   Interceptor1(X x) { this.x = x; }
   void m0() { x.m0(); }
   void m1() { x.m1(); }
}

class Interceptor2 implements Y {
   Y y;
   Interceptor2(Y y) { this.y = y; }
   void m2() { y.m2(); }
   void m3() { y.m3(); }
}

class MyClass implements X, Y {
   void m0() { System.out.println("MyClass"); }
   void m1() { System.out.println("MyClass"); }
   void m2() { System.out.println("MyClass"); }
   void m3() { System.out.println("MyClass"); }
}

Qual meu problema? Quero poder aplicar os dois interceptadores em MyClass sem usar 1 tonelada de DP, só um pouco de instrumentação de código/bytecode.

7 Respostas

cv1

Que tal:

// // classe gerada por vc automaticamente // combinando Interceptor1 e Interceptor2 // class Interceptor1_2 implements X, Y { X x; Y y; Interceptor1_2(X x, Y y) { this.x = x; this.y = y; } void m0() { x.m0(); } void m1() { x.m1(); } void m2() { y.m2(); } void m3() { y.m3(); } }

danieldestro

Algo que eu vejo/leio constantemente, porém não tenho certeza:

No Java é possível gerar código e rodar? Digo, em runtime!

cv1

Como vc acha que o EJB CMP funciona? Eh uma classe abstrata que o appserver estende e implementa pra vc :wink:

louds

“danieldestro”:
Algo que eu vejo/leio constantemente, porém não tenho certeza:

No Java é possível gerar código e rodar? Digo, em runtime!

Sim, usando classloader voce pode fazer todo tipo de coisa.

Cv, meu exemplo não mostra o problema que estou tento, falha minha.

Meu problema é quando tenho 2 interceptors para a mesma interface ou um interceptor para múltiplas interfaces.

Talvez construindo 1 pilha de interceptors por interface funcione, mas tenho minhas dúvidas se isso não poderia causar furos ou loops na sequencia de interceptação

danieldestro

Não gosto de EJB, além do que sei muito pouco sobre eles. Gosto menos ainda agora. Heheheehe

louds

Principalmente pq nem pra te gerar a parte chata, como as interfaces, eles prestam…

cv1

Hmm… acho que eh o unico jeito… a menos que vc consiga uma situacao mais ou menos assim:

Caller->foo() :arrow: InterceptorA.foo() :arrow: InterceptorB.foo() :arrow: Callee.foo()

Criado 18 de dezembro de 2003
Ultima resposta 18 de dez. de 2003
Respostas 7
Participantes 3