Pessoal eu quero criar um conversor para alterar o attributo title de um componente outputtext que esta dentro de um data list.
Eu até conseguir criar um classe handler que recebe parametros e invoca um conversor mas quando eu estou dentro de um dataList ou dataTable não funciona.
Um exemplo do que eu quero fazer
<t:dataList var="item" value="#{mbean.lista}">
<h:outputText id="nomeComponente" value="#{item.nome}">
<xpto:conversorA title="#{messageBundle.title_nome}" value="#{item.nome};#{item.sexo};#{item.idade}/>
</h:outputText>
</t:dataList>
Pois bem : neste componente conversorA no title eu passaria uma key do messagebundle com a mensagem que aparecera no title, porém essa mensagem possui o seguinte valor : mensagem parte 1 nome {0}, parte 2 sexo {1} e parte 3 idade {2},[b] que eu passo atraves da key title_nome “#{messageBundle.title_nome}”.
Value seriam os valores que irao ser colocados noa parametros da mensagem {0}, {1}, {2}.
Pois bem criei uma classe de tag que deveria pegar o valor da EL #{item.><alguma coisa}, recuperar o valor dela e passar para um converter. O problema é que se passo uma expressão assim #{mbean.attributoDoBean} na classe TAG consigo pegar o valor referente a expressão. Exemplo se passar a expressão #{mbean.lista}" no codigo abaixo eu consigo obter toda a lista do dataList.
ValueBinding bindingTitle = app.createValueBinding(<Expressão>);
Porém se a expressão acima ao inves de ser do tipo #{mbean.lista}" ou qualquer tipo que seja managedBean.attributo e for #{item.nome}, é como se o JSF não conseguisse entender o que é o item, porem se eu usar a expressão "#{mbean.lista}" ele me traz toda a lista do dataList.
Alguem sabe como fazer para recuperar so a expressão referente aos dados de uma linha ou coluna de um dataList ou data table atraves da EL numa classe TAG.
Abaixo minha classe TAG
import java.util.StringTokenizer;
import javax.el.ValueExpression;
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.el.ValueBinding;
import javax.faces.webapp.ConverterTag;
import javax.faces.webapp.UIComponentTag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
/**
* Classe da tag converter.tld
*
* @author rogerio
*
*/
public class ConversorATag extends ConverterTag {
private static final long serialVersionUID = -1222364535599564179L;
private ValueExpression title;
private ValueExpression value;
public void setTitle(ValueExpression newValue) {
this.title = newValue;
}
public void setValue(ValueExpression newValue) {
this.value = newValue;
}
public void doTag() {
PageContext pcontext = super.pageContext;
}
/**
* Executa o conversor passando os apramtros capturados da tela
* Esta implementação é válida somente para o JSF 1.1
*/
public Converter createConverter() throws JspException {
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
/*
* Caso não seja fornecido uam expressão e sim um valor literal não posso executar o createValueBinding
*/
String elTitleTraduzido;
if (UIComponentTag.isValueReference(title.getExpressionString())) {
ValueBinding bindingTitle = app.createValueBinding(title.getExpressionString());
elTitleTraduzido = (String) bindingTitle.getValue(context);
} else {
elTitleTraduzido = title.getExpressionString();
}
/*
* Value pode receber varias EL separadas , por isso tem que se fazer uma iteração para separar as ELs e recuperar seus
* valores separadamente
*/
StringTokenizer token = new StringTokenizer(value.getExpressionString(),";");
StringBuffer elTraduzida = new StringBuffer();
for (int i=0; i <= token.countTokens(); i++) {
String tokenValue = token.nextToken();
if (UIComponentTag.isValueReference(tokenValue)) {
ValueBinding bindingValue = app.createValueBinding(tokenValue); //Se for um item de lista sempre vem nulo pq ?
bindingValue.getType(context);
elTraduzida.append(bindingValue.getValue(context));
} else {
elTraduzida.append(tokenValue);
}
if (i < token.countTokens()) {
elTraduzida.append(";");
}
}
ConversorA converter = new ConversorA();
converter.setTitle(elTitleTraduzido);
converter.setValue(elTraduzida.toString());
return converter;
}
/**
* Limpa o estado da tag de forma que possa ser reutilizada
*/
public void release() {
this.title = null;
this.value = null;
}
}