| Author |
Message |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/08/2008 12:38:56
|
trgpwild
Joined: 07/02/2008 20:55:55
Messages: 65
Offline
|
Galera, to com um probleminha aki. Ja tentei de tudo aki mas nada funciona.
To implementando filtros, ja tentei usar o FormatFilter soh naum tentei o Formattable por motivos de desacoplamento e gostaria muito se alguém pudesse me dizer quais sao todos os passos que devo tomar para fazer funcionar uma conversao(formatacao) no output da minha action. To gerando xml pro ajax e gostaria que o valor da data ja viesse certinho.
Pode ser algo q estou eskecendo de colocar no ApplicationManager tb.. eu realmente naum faço idéia, por isso venho recorrer a vcs... muito obrigado.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/08/2008 10:32:30
|
saoj
Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline
|
Formatter é igual Converter só que afeta o Output e não o Input.
Brinca aí, liga o Debug Mode que não tem porque não funcionar...
|
Sergio Oliveira
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/08/2008 12:23:00
|
trgpwild
Joined: 07/02/2008 20:55:55
Messages: 65
Offline
|
seria algo assim?
Code:
class DateFormatterFilter extends FormatFilter {
@Override
public void initFormatters() {
add("campo", new DateFormatter("dd/MM/yyyy"));
}
}
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/08/2008 12:24:14
|
trgpwild
Joined: 07/02/2008 20:55:55
Messages: 65
Offline
|
Preciso usar o OVFilter pra fazer funcionar o codigo postado acima?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/08/2008 12:35:50
|
trgpwild
Joined: 07/02/2008 20:55:55
Messages: 65
Offline
|
Ou eu teria que usar ioc de alguma forma? se sim, por favor, como? muito obrigado.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/08/2008 12:53:50
|
IceW0lf
![[Avatar]](/images/avatar/7cbbc409ec990f19c78c75bd1e06f215.jpg)
Joined: 16/03/2006 08:33:38
Messages: 1546
Location: Brasília
Offline
|
Para outputs utilize.
Ultimo post.
http://forum.mentaframework.org/posts/list/45/402.page
Já para conversão dentro de actions você pode seguir:
http://www.mentaframework.org/conversion.jsp
Há uma diferença importante entre os dois.
O Formatter serve para transformar Objeto em uma String formatada e o Convertter faz o inverso.
Não tem grande segredo nao.
|
Leiber Wallace
Voixy ::: Soluções em Telecomunicações |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/08/2008 13:05:16
|
trgpwild
Joined: 07/02/2008 20:55:55
Messages: 65
Offline
|
O meu DateFormatterFilter esta certo intaum?
Preciso colocar o OVFilter no ApplicationManager pra ele jogar o campo data no output? se sim, antes ou depois do filtro?
Eu ja tinha olhado esses posts antes, mas como agora naum esclareceram minha duvida ja que as coisas naum estao funcionando como funcionaram para o ConverterFilter
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/08/2008 02:32:58
|
trgpwild
Joined: 07/02/2008 20:55:55
Messages: 65
Offline
|
Ae galera, eu debuguei o codigo aki e constatei que a seguinte linha dentro da classe org.mentawai.filter.FormatFilter não está funcionando:
Code:
Object toFormat = output.getValue(field);
e antes que alguem pergunte, a String 'field' está preenchida com o nome do campo de data da minha classe bean 'Pessoa' sim
E devido a validação abaixo, ela naum da prosseguimento na formatacao:
Code:
if (toFormat == null) continue;
Eu soh naum entendi o por que disto... se alguem souber, ficarei agradecido se puder me explicar, muito obrigado.
Obs.: Estou estudando o mentawai por completo para o meu TCC na fatec e logo após meu estudo estar completo partirei para o JSF, meu objetivo é mostrar quais os beneficios de se utilizar uma framework action-based em certos casos e outra Component-based em outros casos.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/08/2008 18:33:37
|
saoj
Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline
|
Ué, vc tem que colocar o valor no output para o filtro pegar e formatar...
|
Sergio Oliveira
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/08/2008 00:50:47
|
trgpwild
Joined: 07/02/2008 20:55:55
Messages: 65
Offline
|
Segue meus codigos:
PessoaAction:
Code:
public String lista() throws Exception {
output.setValue(AjaxConsequence.KEY, pessoaDAO.lista());
return SUCCESS;
}
ApplicationManager:
Code:
action("pessoa", PessoaAction.class, "lista")
.on(SUCCESS, new AjaxConsequence(new BeanCollectionAjaxRenderer("raiz", "pessoa", pessoa, null, "ISO-8859-1")))
.filter(new AuthorizationFilter(new Permission("read"), new Permission("write"), new Permission("delete")))
.filter(new PessoaFormatFilter("dd/MM/yyyy"));
Filtro:
Code:
package org.extjsmentawai.utils.formatter;
import org.mentawai.formatter.DateFormatter;
public class PessoaFormatFilter extends FormatFilter {
private String style;
public PessoaFormatFilter(String style) {
this.style = style;
}
@Override
public void initFormatters() {
add("dataNascimento", new DateFormatter(style));
}
}
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/09/2008 19:11:09
|
trgpwild
Joined: 07/02/2008 20:55:55
Messages: 65
Offline
|
Ae pessoal, descobri pq naum tava funcionando. O filtro de formatacao naum funcionam para Collections eu teria que implementar um renderer que usasse os Formatters do FormatterManager.... acho q é isso.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/09/2008 14:03:46
|
trgpwild
Joined: 07/02/2008 20:55:55
Messages: 65
Offline
|
Olá Sergio e equipe Mentawai,
Resolvi implementar um filtro para formatar atributos especificos da minha Collection no ouput dela. Preciso disso pois estou trabalhando somente com ajax.
Eu consegui implementar ateh metade da solução, o resto eu ainda naum consegui por falta de conhecimento nas reflections... talvez exista uma forma mais facil de resolver isso, por isso estou postando logo abaixo meu filtro... se alguem tiver alguma opniao... me falem por favor.
Code:
package org.extjsmentawai.utils.formatter;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.mentawai.core.Filter;
import org.mentawai.core.FilterException;
import org.mentawai.core.InvocationChain;
import org.mentawai.core.Output;
import org.mentawai.formatter.Formatter;
import org.mentawai.formatter.FormatterManager;
import org.mentawai.util.InjectionUtils;
public abstract class FormatCollectionFilter implements Filter {
private boolean isLoaded = false;
private String key;
private Map<String, Object> formatters = new HashMap<String, Object>();
public FormatCollectionFilter(String key) {
this.key = key;
}
private Map<String, Object> getFormatters() {
if (isLoaded) return formatters;
synchronized(this) {
if (!isLoaded) {
initFormatters();
isLoaded = true;
}
}
return formatters;
}
public abstract void initFormatters();
public void add(String field, Formatter formatter) {
formatters.put(field, formatter);
}
private Object getFieldValue(Class<? extends Object> klass, String field, Object bean) throws Exception {
Method method = InjectionUtils.findMethodToGet(klass, field);
if (method == null) throw new Exception("Cannot find method to get: " + klass + " / " + field);
return method.invoke(bean, (Object[]) null);
}
@SuppressWarnings("unchecked")
public String filter(InvocationChain chain) throws Exception {
String result = chain.invoke();
Output output = chain.getAction().getOutput();
Object obj = output.getValue(key);
if (obj instanceof Collection) {
Collection coll = (Collection) obj;
for(Iterator iter = coll.iterator(); iter.hasNext();) {
Object bean = iter.next();
Class<? extends Object> klass = bean.getClass();
Map<String, Object> formatters = getFormatters();
Iterator<String> iterFormat = formatters.keySet().iterator();
while(iterFormat.hasNext()) {
String field = iterFormat.next();
Object toFormat = getFieldValue(klass, field, bean);
if (toFormat == null) continue;
Object o = formatters.get(field);
Formatter f = null;
if (o instanceof String) {
String s = (String) o;
f = FormatterManager.getFormatter(s);
if (f == null) throw new FilterException("Cannot find a formatter with this name: " + s);
} else if (o instanceof Formatter) {
f = (Formatter) o;
}
String formatted = f.format(toFormat, chain.getAction().getLocale());
System.out.println(formatted);
}
}
/**
* Proximo passo criar o objeto lista com os atributos formatados
*/
//output.setValue(key, coll);
}
return result;
}
}
Eu tinha pensado em extender a classe FormatFilter, mas estava tudo private intaum tive que reescrever tudo novamente... Abraço.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/09/2008 16:41:42
|
trgpwild
Joined: 07/02/2008 20:55:55
Messages: 65
Offline
|
Bom, eu dei uma estudada no pacote reflection e vi que é realmente muito fácil trabalhar com ele, mas infelizmente percebi que minha empreitada não tinha sentido, pois eu teria que transformar atributos que naum eram string em strings, logo teria que criar uma classe especifica para isso e acho q o java naum da essa flexibilidade toda... terei que fazer a formatacao no meu renderer mesmo, como se estivesse formatando em um jsp mesmo.... Valews pessoal....
Se eu estiver enganado em algum ponto, por favor me digam... ateh mais...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/10/2008 16:48:20
|
trgpwild
Joined: 07/02/2008 20:55:55
Messages: 65
Offline
|
Olá saoj e pessoal,
To postando minha versao de BeanCollectionAjaxRenderer, detalhe que se os métodos, printCR, printTab fossem publicos eu poderia ter usado herança, mesmo assim seria legal vcs deixarem essa classe de rederização de Collection com opção de formatação dinâmica, eu gostei bastante da solução que criei e espero que ajude outras pessoas, Abraços pessoal... esse framework é o melhor!!!! regulo em suas entranhas com muita facilidade. Só acho q algumas classes poderiam ser reescritas de alguma forma mais favorável para sua extensao de funcionalidade.
Code:
package org.extjsmentawai.utils.renderer;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import org.mentawai.ajax.AjaxRenderer;
import org.mentawai.formatter.Formatter;
import org.mentawai.formatter.FormatterManager;
import org.mentawai.util.InjectionUtils;
@SuppressWarnings("unchecked")
public abstract class BeanCollectionFormatAjaxRenderer implements AjaxRenderer {
private String CHARSET;
private String root;
private String child;
private String[] subTagsAttrs;
private String[] attrsAttrs;
private boolean isLoaded = false;
private Map<String, Object> formatters = new HashMap<String, Object>();
private void printCR(StringBuilder sb, boolean pretty) {
if (!pretty) return;
sb.append('\n');
}
private void printTab(StringBuilder sb, boolean pretty, int x) {
if (!pretty) return;
for(int i=0;i<x;i++) sb.append(" ");
}
private Map<String, Object> getFormatters() {
if (isLoaded) return formatters;
synchronized(this) {
if (!isLoaded) {
initFormatters();
isLoaded = true;
}
}
return formatters;
}
public abstract void initFormatters();
public void add(String field, Formatter formatter) {
formatters.put(field, formatter);
}
private Object getFormattedValue(String field, Object value, Locale loc) throws Exception {
Map<String, Object> formatters = getFormatters();
Iterator<String> iter = formatters.keySet().iterator();
while(iter.hasNext()) {
String nameFormatter = iter.next();
if (nameFormatter.equals(field)) {
Object o = formatters.get(nameFormatter);
Formatter f = null;
if (o instanceof String) {
String s = (String) o;
f = FormatterManager.getFormatter(s);
if (f == null) throw new Exception("Cannot find a formatter with this name: " + s);
} else if (o instanceof Formatter) {
f = (Formatter) o;
}
value = f.format(value, loc);
}
}
return value;
}
public String encode(Object obj, Locale loc, boolean pretty) throws Exception {
if (CHARSET.equals("") || CHARSET == null) CHARSET = "UTF-8";
if (!(obj instanceof Collection)) throw new IllegalArgumentException("Object is not a Collection: " + obj);
if (!(obj instanceof Collection)) throw new IllegalArgumentException("Object is not a Collection: " + obj);
Collection coll = (Collection) obj;
StringBuilder sb = new StringBuilder();
sb.append("<?xml version='1.0' encoding='").append(CHARSET).append("' ?>").append((char)13);
sb.append('<').append(root).append('>');
printCR(sb, pretty);
for(Iterator iter = coll.iterator(); iter.hasNext();) {
Object bean = iter.next();
Class<? extends Object> klass = bean.getClass();
printTab(sb, pretty, 1);
sb.append('<').append(child);
if (attrsAttrs != null) {
for (int i = 0; i < attrsAttrs.length; i++) {
String attrName = attrsAttrs[i];
Method method = InjectionUtils.findMethodToGet(klass, attrName);
if (method == null) throw new Exception("Cannot find method to get: " + klass + " / " + attrName);
Object value = getFormattedValue(attrName, method.invoke(bean, (Object[]) null),loc);
sb.append(' ').append(attrName).append("=\"").append(value).append("\"");
}
} else {
sb.append(' ');
}
sb.append('>');
printCR(sb, pretty);
if (subTagsAttrs != null) {
for (int i = 0; i < subTagsAttrs.length; i++) {
String attrName = subTagsAttrs[i];
Method method = InjectionUtils.findMethodToGet(klass, attrName);
if (method == null) throw new Exception("Cannot find method to get: " + klass + " / " + attrName);
printTab(sb, pretty, 2);
Object value = getFormattedValue(attrName, method.invoke(bean, (Object[]) null),loc);
sb.append('<').append(attrName).append('>').append(value).append("</").append(attrName).append('>');
printCR(sb, pretty);
}
}
printTab(sb, pretty, 1);
sb.append("</").append(child).append('>');
printCR(sb, pretty);
}
sb.append("</").append(root).append('>');
printCR(sb, pretty);
return sb.toString();
}
public BeanCollectionFormatAjaxRenderer(String rootTag, String childTag, String[] subTagsAttrs, String[] attrsAttrs, String CHARSET) {
this.root = rootTag;
this.child = childTag;
this.attrsAttrs = attrsAttrs;
this.subTagsAttrs = subTagsAttrs;
this.CHARSET = CHARSET;
}
public String getCharset() {
return CHARSET;
}
public String getContentType() {
return TEXT_XML;
}
}
|
|
|
 |
|
|