Funcionou 100% Lucas, excelente.
Muito obrigado mesmo.
Aproveitei e incluí a propriedade “message” no mesmo esquema do total (que é um campo opcional do ExtJS 3.3), desculpe se não usei a convenção de nomes certa :
Interface :
[code]
package br.com.caelum.vraptor.util.extjs;
import br.com.caelum.vraptor.View;
public interface IFixedExtJson extends View {
public abstract IFixedExtJson from(Object object);
public abstract IFixedExtJson exclude(String... names);
public abstract IFixedExtJson include(String... fields);
public abstract IFixedExtJson selected(Object value);
public abstract IFixedExtJson serialize();
public abstract IFixedExtJson success();
public abstract IFixedExtJson success(boolean success);
public abstract IFixedExtJson total(Integer total);
public abstract IFixedExtJson message(String message);
}[/code]
Implementação :
[code]
package br.com.caelum.vraptor.util.extjs;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import br.com.caelum.vraptor.interceptor.TypeNameExtractor;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.serialization.ProxyInitializer;
import br.com.caelum.vraptor.serialization.xstream.XStreamSerializer;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
import com.thoughtworks.xstream.io.json.JsonWriter;
@Component
public class FixedExtJson implements IFixedExtJson {
private static class ExtJSWrapper {
private Object data;
private List<Object> list;
private Boolean success;
private String message;
private Integer total;
private Object selected;
public ExtJSWrapper(Object object) {
if (object instanceof Collection) {
this.list = new ArrayList<Object>((Collection)object);
} else {
this.data = object;
}
}
}
private XStreamSerializer serializer;
private XStream xstream;
private ExtJSWrapper wrapper;
public FixedExtJson(HttpServletResponse response, TypeNameExtractor extractor, ProxyInitializer initializer) throws IOException {
xstream = new XStream(new JsonHierarchicalStreamDriver() {
@Override
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, new char[0], "", JsonWriter.DROP_ROOT_MODE) {
@Override
public void addAttribute(String key, String value) {
if (!key.equals("class")) {
super.addAttribute(key, value);
}
}
};
}
});
xstream.aliasField("data", ExtJSWrapper.class, "list");
serializer = new XStreamSerializer(xstream, response.getWriter(), extractor, initializer);
}
/* (non-Javadoc)
* @see br.com.caelum.vraptor.util.extjs.IFixedExtJson#from(java.lang.Object)
*/
@Override
public IFixedExtJson from(Object object) {
wrapper = new ExtJSWrapper(object);
serializer.from(object);
return this;
}
/* (non-Javadoc)
* @see br.com.caelum.vraptor.util.extjs.IFixedExtJson#exclude(java.lang.String)
*/
@Override
public IFixedExtJson exclude(String... names) {
serializer.exclude(names);
return this;
}
/* (non-Javadoc)
* @see br.com.caelum.vraptor.util.extjs.IFixedExtJson#include(java.lang.String)
*/
@Override
public IFixedExtJson include(String... fields) {
serializer.include(fields);
return this;
}
/* (non-Javadoc)
* @see br.com.caelum.vraptor.util.extjs.IFixedExtJson#selected(java.lang.Object)
*/
@Override
public IFixedExtJson selected(Object value) {
wrapper.selected = value;
return this;
}
/* (non-Javadoc)
* @see br.com.caelum.vraptor.util.extjs.IFixedExtJson#serialize()
*/
@Override
public IFixedExtJson serialize() {
serializer.from(wrapper).recursive().serialize();
return this;
}
/* (non-Javadoc)
* @see br.com.caelum.vraptor.util.extjs.IFixedExtJson#success()
*/
@Override
public IFixedExtJson success() {
wrapper.success = true;
return this;
}
/* (non-Javadoc)
* @see br.com.caelum.vraptor.util.extjs.IFixedExtJson#success(boolean)
*/
@Override
public IFixedExtJson success(boolean success) {
wrapper.success = success;
return this;
}
/* (non-Javadoc)
* @see br.com.caelum.vraptor.util.extjs.IFixedExtJson#total(java.lang.Integer)
*/
@Override
public IFixedExtJson total(Integer total) {
wrapper.total = total;
return this;
}
/* (non-Javadoc)
* @see br.com.caelum.vraptor.util.extjs.IFixedExtJson#message(java.lang.String)
*/
@Override
public IFixedExtJson message(String message) {
wrapper.message = message;
return this;
}
}[/code]
Teste :
result.use(FixedExtJson.class)
.from(usuariodao.lista())
.success(true)
.exclude("senha")
.message("Funcionou com sucesso")
.total(1)
.serialize();
Resultado :