não dá pra fazer em um passo só, pq o index retorna void
a idéia é esse Linker receber um proxifier no construtor e gerar um proxy no buildLinkTo que captura o método invocado e os parâmetros e no getUrl usa essas informações para passar para o Router.
Se precisar de mais ajuda dá um toque.
d34d_d3v1l
Legal…
Acho que entendi a ideia…
Mas vou precisar de uma aulinha sua !!
Você se impota?
Eu fiz um esboço… Mas fiz seguindo tuas palavras e sem entender
muito bem o que estou fazendo… O que é horrível
Então… O que o Proxifier retorna? (Não me diga um Object ! kkk)
Como que funciona ? Quem que vai pegar o retorno dele?
Se eu quiser fazer uns testes de unidade no Linker, como injeto componentes do VRaptor no meu test?
Ta aqui o que eu fiz até agora:
@ComponentpublicclassLinker{privateLoggerlogger=Logger.getLogger(Linker.class);privateProxifierproxifier;privateRouterrouter;privateClass<?>clazz;privateMethodinvokedMethod;privateObject[]arguments;publicLinker(Proxifierproxifier,Routerrouter){this.proxifier=proxifier;this.router=router;proxifier.proxify(Linker.class,newMethodInvocation<Linker>(){@OverridepublicObjectintercept(Linkerproxy,Methodmethod,Object[]args,SuperMethodsuperMethod){invokedMethod=method;arguments=args;returnnull;}});}publicStringgetURI(){returnrouter.urlFor(clazz,invokedMethod,arguments);}public<T>TbuildLinkTo(Class<T>clazz){this.clazz=clazz;try{returnclazz.newInstance();}catch(InstantiationExceptione){logger.error("Can´t instanciate class: "+clazz.getSimpleName(),e);e.printStackTrace();}catch(IllegalAccessExceptione){logger.error("Error on "+clazz.getSimpleName(),e);e.printStackTrace();}returnnull;}}
Obrigado
Lucas_Cavalcanti
O proxifier retorna um proxy da classe que vc passou…
e daí vc passa um interceptor que executa o código que vc quiser. Nesse caso o que vc quer fazer é capturar o método.
a sua classe está quase pronta, só que ao invés do proxifier.proxify estar no construtor ele tem que estar no buildLinkTo:
para testar, vc tem que passar um proxifier de verdade (é meio difícil de testar), pode ser o new JavassistProxifier(), e passar um mock do Router. Daí vc verifica que ele chamou o urlFor passando a classe e o método esperados.
d34d_d3v1l
Lucas Cavalcanti:
O proxifier retorna um proxy da classe que vc passou…
e daí vc passa um interceptor que executa o código que vc quiser. Nesse caso o que vc quer fazer é capturar o método.
a sua classe está quase pronta, só que ao invés do proxifier.proxify estar no construtor ele tem que estar no buildLinkTo:
ta… mas o que o meu método intercept tem que retornar? Pq eu to retornando null…
Aqui com as modificações que vc falou