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.
public class DynamicProxy implements InvocationHandler{ private Setset = new HashSet (); 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; } }
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.
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.