[RESOLVIDO] JSF 1.1 Criar conversor

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(&lt;Expressão&gt;);

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(),&quot;;&quot;);
		StringBuffer elTraduzida = new StringBuffer();
		for (int i=0; i &lt;= 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 &lt; token.countTokens()) {
				elTraduzida.append(&quot;;&quot;);
				
			}
		}				
		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;
	}

}
  

Esqueça, isso é impossível fazer em qualquer versão do JSF.

Se você na sua classe TAG invocar ="#{mbean.lista}", com certeza ele acha pq o JSF conhece mBean, porem o atributo var = “item” , so existe naquele mundinho da randerização da lista. A Tag não tem como saber que item é um apaelido dado a uma linha de “#{mbean.lista}”

A solução seria vc colocar no value da tua tag #{mbean.lista(0).nome} ao invés de #{item.nome}, porem vc teria outro problema. Não há como identificar na tua classe tag o indice da linha que esta sendo enviada a tag para converter.

Ou seja, impossível.

Meu, eu estou determinado a achar uma solução. Como componentes como o inputText conseguem entender o valor da variavel item ?

Eu acho que se eu conseguir pelo menos passar o valor o valor do indice da linha para a classe tag, ai eu consigo recuperar o valor do item de outra forma

&lt;t:dataList id="lista" var="item" value="#{helloWorldBacking.lista}" preserveRowStates="true" rowIndexVar="rowIndex"&gt;

Sera que da para recuperar o valor de rowIndex na classe tag ?

FIZ A BUSCA DO ITEM NO CONVERSOR E NÃO NA TAG.