Dificuldade em realizar upload usando JSF e Apache Trinidad

Olá pessoal,

Estou tendo dificuldade para implementar um sistema de upload para o meu sistema. Estou usando JSF, Facelets e o Apache MyFaces Trinidad para realizar o upload dos arquivos. Na minha tela de cadastro de usuário tenho uma tag <tr:inputFile id=“foto” value="#{usuariosC.arquivo}" /> do Trinidad. Tenho também uma classe UsuarioController que possui um atributo, chamado arquivo, do tipo UploadedFile.

O usuário preenche a tela de cadastro e ao salvar era para o upload da foto ser realizado. Entretanto, percebo que o atributo arquivo, configurado na tag <tr:inputFile id=“arquivo” value="#{usuariosC.arquivo}" /> está ficando com valor nulo, por isso não passa pela condição if(arquivo != null) do método uploadDaImagem da classe UsuarioController.

Pessoal, vocês poderiam me dizer porque é que o valor de arquivo está ficando nulo, mesmo eu carregando o caminho da imagem na tag tr:inputFile ???

A seguir os códigos implementados.

Formulário de cadastro do usuário.

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:tr="http://myfaces.apache.org/trinidad">
    
    <body>
        
        <ui:composition template="./template_admin.xhtml">
            
            <ui:define name="titulo">
                Cadastro de usuários
            </ui:define>

            <ui:define name="conteudo">
                <div id="formulario">
                    <fieldset>
                        <legend>Formulário de Cadastro de Usuários</legend>
                            <p>
                                <table border="0" cellpadding="0" cellspacing="0">
                                    <tr>
                                        <td>
                                            <label>Matrícula:</label>
                                        </td>
                                        <td>
                                            <input class="campo" requiredMessage="O campo Matrícula é obrigatório" required="true" jsfc="h:inputText" value="#{usuariosC.usuario.matricula}" id="matricula" name="matricula" type="text">
                                                <f:convertNumber/>
                                            </input>
                                            <h:message for="matricula" errorStyle="color:red"/>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td>
                                            <label>Nome:</label>
                                        </td>
                                        <td>
                                            <input class="campo" requiredMessage="O campo Nome é obrigatório" required="true" jsfc="h:inputText" value="#{usuariosC.usuario.nome}" id="nome" name="nome" type="text"/>
                                                <h:message for="nome" errorStyle="color:red"/>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td>
                                            <label>Sobrenome:</label>
                                        </td>
                                        <td>
                                            <input class="campo" requiredMessage="O campo Sobrenome é obrigatório" required="true" jsfc="h:inputText" value="#{usuariosC.usuario.sobrenome}" id="sobrenome" name="sobrenome" type="text"/>
                                                <h:message for="sobrenome" errorStyle="color:red"/>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td>
                                            <label>Foto:</label>
                                        </td>
                                        <td>
                                            <tr:inputFile id="foto" value="#{usuariosC.arquivo}"/>
                                            <h:message for="foto"/>                                            
                                        </td>
                                    </tr>
                                    <tr>
                                        <td>
                                            <label>Telefone:</label>
                                        </td>
                                        <td>
                                            <input class="campo" requiredMessage="O campo Telefone é obrigatório" required="true" jsfc="h:inputText" value="#{usuariosC.usuario.telefone}" id="telefone" name="telefone" type="text"/>
                                                <h:message for="telefone" errorStyle="color:red"/>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td>
                                            <label>Celular:</label>
                                        </td>
                                        <td>
                                            <input class="campo" requiredMessage="O campo Celular é obrigatório" required="true" jsfc="h:inputText" value="#{usuariosC.usuario.celular}" id="celular" name="celular" type="text"/>
                                                <h:message for="celular" errorStyle="color:red"/>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td>
                                            <label>Email:</label>
                                        </td>
                                        <td>
                                            <input class="campo" requiredMessage="O campo Email é obrigatório" required="true" jsfc="h:inputText" value="#{usuariosC.usuario.email}" id="email" name="email" type="text"/>
                                                <h:message for="email" errorStyle="color:red"/>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td>
                                        <!-- aqui deve ficar vazio. -->
                                        <br />
                                        </td>
                                        <td>
                                            <input action="#{usuariosC.salvar}" jsfc="h:commandButton" value="Salvar" name="submit" type="submit" />
                                            <input immediate="true" jsfc="h:commandButton" value="Cancelar" name="submit" type="reset" />
                                        </td>
                                    </tr>
                                </table>
                            </p>
                    </fieldset>
                </div>
            </ui:define>

        </ui:composition>
        
    </body>
</html>

Classe UsuarioController

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package biblioteca.gmf.web.controller;

import biblioteca.gmf.bd.bean.Pesquisa;
import biblioteca.gmf.bd.bean.Usuarios;
import biblioteca.gmf.bd.dao.imp.UsuariosDaoImp;
import biblioteca.gmf.web.utils.FacesUtils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.servlet.ServletContext;
import org.apache.myfaces.trinidad.model.UploadedFile;
/*import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.myfaces.custom.fileupload.StorageStrategy;
import org.apache.myfaces.custom.fileupload.UploadedFile;*/

/**
 *
 * @author suporte
 */
public class UsuariosController {

    private Usuarios usuario;

    private Pesquisa pesquisa;

    private DataModel model;
    private UploadedFile arquivo;
    
    public UploadedFile getArquivo() {
        return arquivo;
    }

    public void setArquivo(UploadedFile arquivo) {
        this.arquivo = arquivo;
    }

       
    public String novoUsuario()
    {
        this.usuario = new Usuarios();

        return "novoUsuario";
    }

    public Usuarios getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuarios usuario) {
        this.usuario = usuario;
    }


    public DataModel getTodas() throws Exception
    {
        UsuariosDaoImp dao = new UsuariosDaoImp();

        model = new ListDataModel(dao.todosOsUsuarios());

        return model;
    }

    /*public ArrayList getListaDeSelectItemDeUsuarios() throws Exception
    {
        UsuariosDAO dao = new UsuariosDAO();
        return dao.ListaDeSelectedItemDeUsuarios();
    }*/

    public Usuarios getUsuarioFromEditOrDelete()
    {
        usuario = (Usuarios) model.getRowData();

        return usuario;
    }

    public String editar()
    {
        usuario = getUsuarioFromEditOrDelete();
        setUsuario(usuario);
        return "editar";
    }

    public String excluir() throws Exception
    {
        UsuariosDaoImp dao = new UsuariosDaoImp();
        usuario = getUsuarioFromEditOrDelete();
        dao.excluir(usuario);
        return "sucesso";
    }

    public String salvar() throws Exception
    {
        UsuariosDaoImp dao = new UsuariosDaoImp();

        if(usuario.getId() == null)
        {
            uploadDaImagem();
            dao.salvar(usuario);
        }
        else
        {
            dao.atualizar(usuario);
        }

        return "sucesso";
    }

     public String mostrarUsuarioPesquisado()
    {
        return "usuarioPesquisado";
    }

    public Pesquisa getPesquisa() {
        return pesquisa;
    }

    public void setPesquisa(Pesquisa pesquisa) {
        this.pesquisa = pesquisa;
    }

     public DataModel getUsuarioDaPesquisa() throws Exception
    {
        UsuariosDaoImp dao = new UsuariosDaoImp();
        PesquisaDeLivroController p = new PesquisaDeLivroController();

        List<Usuarios> list = new ArrayList<Usuarios>();

        switch(pesquisa.getOpcao())
        {
            case 1:
            {
                list = dao.procurarUsuarioPorNome(pesquisa.getValorDaPesquisa());


                break;
            }
            case 2:
            {
                list = dao.procurarUsuarioPorSobrenome(pesquisa.getValorDaPesquisa());

                break;
            }
        }
        model =  new ListDataModel(list);

        return model;
    }

    public String novaPesquisaDeUsuario()
    {
        this.pesquisa = new Pesquisa();
        return "novaPesquisaDeUsuario";
    }

    public void uploadDaImagem()
    {
        try
        {
            FacesContext context = FacesContext.getCurrentInstance();

            //pega informações do contexto para conseguir
            //o caminho físico necessário para fazer o upload
            //do arquivo.
            ServletContext sc = (ServletContext) context.getExternalContext().getContext();            

            //verifica se há um arquivo para salvar
            if(arquivo != null)
            {

                //tipo de arquivo
                String tipoDeArquivo = arquivo.getContentType();

                //verifica se é o tipo de arquivo permitido
                if(tipoDeArquivo.equals("image/jpeg")
                        || tipoDeArquivo.equals("image/pjpeg")
                        || tipoDeArquivo.equals("image/gif"))
                {
                    InputStream stream = arquivo.getInputStream();

                    int fSize = (int) arquivo.getLength();
                    byte[] buffer = new byte[(int) fSize];
                    String nomeArquivo = this.separaNomeImagem(arquivo.getFilename());

                    //chama o método que salva o arquivo
                    Boolean salvarImagem = this.salvarArquivoNoDisco(buffer,
                            stream,nomeArquivo,fSize,sc.getRealPath("/imagens"));

                    if(!salvarImagem)
                    {
                        FacesUtils.mensErro("Problema no carregamento do arquivo");
                    }

                    usuario.setFoto(nomeArquivo);
                    
                }
                else
                {
                    FacesUtils.mensErro("São somente aceitos os tipos de arquivo JPEG,PJPEG ou GIF");
                }
            }
            
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }

    }

    public boolean salvarArquivoNoDisco(byte[] buf,InputStream stream,
            String nomeArquivo, int size, String path)
            throws FileNotFoundException,IOException
    {
        nomeArquivo = this.separaNomeImagem(nomeArquivo);

        File file = new File(path + "/" + nomeArquivo);

        FileOutputStream output = new FileOutputStream(file);

        try
        {
            while(true)
            {
                int count = stream.read(buf,0,size);
                if(count == -1)
                {
                    break;
                }
                output.write(buf,0,count);
            }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
            return false;
        }
        finally
        {
            output.flush();
            output.close();
            stream.close();
        }

        return true;
    }

    //separa o caminho físico do nome do arquivo
    private String separaNomeImagem(String nomeImagem)
    {
        if(nomeImagem.lastIndexOf("\\") >= -1)
        {
            nomeImagem = nomeImagem.substring(nomeImagem.lastIndexOf("\\") + 1);
        }
        else if(nomeImagem.lastIndexOf("/") >= -1)
        {
            nomeImagem = nomeImagem.substring(nomeImagem.lastIndexOf("/") + 1);
        }

        return nomeImagem;
    }

}