Acabo de reler um código que escrevi e achei a solução tão maluca e útil rs que vale a pena ser comentada. O objetivo é implementar uma versão simples do HttpResponse cujo comportamento seja minimamente próximo a versão original, sem no entanto precisar extender um NullObject do HttpResponse. A solução de sempre... proxy dinâmico.
Agora o método que fabrica o HttpResponse. O resultado do response será colocado no printWriter. É bom notar que o Response praticamente implementa a interface do PrintWriter então o código poderia ser melhorado para usar isso.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class DynamicProxy implements InvocationHandler{ private Set<method> set = new HashSet<method>(); private Object target; private String getTarget; public DynamicProxy(Object target, String getTarget){ Method[] methods = target.getClass().getMethods(); set.addAll(Arrays.asList(methods)); this .getTarget = getTarget; this .target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (set.contains(method)){ return method.invoke(target, args); } else { if (method.toString().equals(getTarget)){ return target; } } return null ; } } </method></method> |
Agora o método que fabrica o HttpResponse. O resultado do response será colocado no printWriter. É bom notar que o Response praticamente implementa a interface do PrintWriter então o código poderia ser melhorado para usar isso.
1 2 3 4 5 6 7 8 | private HttpServletResponse createHttpResponse(StringWriter stringWriter) { // Ninjutsu! PrintWriter printWriter = new PrintWriter(stringWriter); DynamicProxy dynamicProxy = new DynamicProxy(printWriter, "public abstract java.io.PrintWriter javax.servlet.ServletResponse.getWriter() throws java.io.IOException" ); HttpServletResponse response = (HttpServletResponse) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[] { HttpServletResponse. class }, dynamicProxy); return response; |
Comentários
Me chamo Fábia e preciso conversar com você sobre um programa de computador.
Poderia me passar seu e-mail ou qq outro meio de contato?
Obrigada,
Fábia.