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 Set set = 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.