Drag Drop primefaces DataTable para treeView(Drag na linha do dataTable e Drop no nó da tree)

Pessoal não sei ao certo se servirá para vocês mais fiz um código e acho que pode ajudar algumas pessoas que estão com dificuldades do drag drop no primefaces! Peguem o que vocês quiserem e se acharem que da pra melhorar por favor coloquem ai! Abraços

Aqui o .xhtml


    <h:body>

        <h:form onmouseover="carregar();" id="form">

            <p:dataTable  rowKey="teste" var="dado"  rendered="true" editable="true" emptyMessage="Sem resultados." 
                          filterEvent="enter" value="#{AplicacaoMBean.model}" 
                          id="dTableDados">

                <p:column headerText="Ano" sortBy="#{dado.ano}" style="width:50px;text-align:center;" 
                          id="colunaDadosAno">

                    <h:outputText value="#{dado.ano}" id="labelDadosAno" />

                </p:column>

                <p:column headerText="Cor" sortBy="#{dado.cor}" style="width:50px;text-align:center;" 
                          id="colunaDadosCor">

                    <h:outputText value="#{dado.cor}" id="labelDadosCor" />

                </p:column>

                <p:column headerText="Modelo" sortBy="#{dado.modelo}" style="width:50px;text-align:center;" 
                          id="colunaDadosModelo">

                    <h:outputText value="#{dado.modelo}" id="labelDadosModelo" />

                </p:column>

            </p:dataTable>

            <p:tree id="tree" value="#{AplicacaoMBean.root}" var="node">

                <p:treeNode>

                    <p:droppable tolerance="pointer"  for="no" >

                        <p:ajax update="tree" event="drop" listener="#{AplicacaoMBean.colocarNo}"/>

                        <h:outputText id="no" value="#{node}"/>

                    </p:droppable>

                </p:treeNode>

            </p:tree>

            <p:commandButton update="@form" actionListener="#{AplicacaoMBean.limparTabelas}" value="Limpar Tabelas"/>

        </h:form>

        <script>
            
            function carregar() {
                
                $(document).ready(function() {
                    
                    //this will hold reference to the tr we have dragged and its helper
                    var c = {};
                    
                    $("#form\\:dTableDados tbody tr").draggable({
                        helper: "clone",
                        start: function(event, ui) {
                            c.tr = this;
                            c.helper = ui.helper;
                        }
                        
                    });
                    
                });
                
                $(function() {
                    
                    $("#form\\:dTableDados tbody tr").draggable(
                            {cursor: "move", cursorAt: {top: 10, left: 120}}
                    
                    );
                    
                });
                
                $(function() {
                    $('#form\\:dTableDados tbody tr').each(function(index, element)
                            
                            {
                                $(element).attr('id', 'dTableDados:' + index + ':tr');
                                
                            });
                    
                });
                
            }
            
        </script>

    </h:body>

Aqui o MBean

import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.ListDataModel;
import org.primefaces.event.DragDropEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

@ManagedBean(name = "AplicacaoMBean")
@SessionScoped
public class AplicacaoMBean {

    private ListDataModel model;
    private TreeNode root;

    /**
     * Creates a new instance of AplicacaoMBean
     */
    public AplicacaoMBean() {

        limparTabelas();

    }

    public ListDataModel getModel() {
        return model;
    }

    public void colocarNo(DragDropEvent dropEvent) {

        String idDrop = dropEvent.getDropId();
        String idDrag = dropEvent.getDragId();

        TreeNode drop = carregaNode(root, idDrop);

        Integer contadorLista = 0;

        Integer idEvento = Integer.parseInt(limpaDragDropId(idDrag, ":"));

        String nomeDrop = "";
        String corDrop = "";
        String miliDrop = "";

        for (Object e : model) {

            if (idEvento == contadorLista) {

                nomeDrop = ((Carro) e).getModelo();
                corDrop = ((Carro) e).getCor();
                miliDrop = String.valueOf(System.currentTimeMillis());
                break;

            }

            contadorLista++;

        }

        new DefaultTreeNode(nomeDrop + " - " + corDrop + " = " + miliDrop, drop);

    }

    /**
     * Metodo para limpar os textos do componente DRAG & DROP
     *
     * @param idDragDrop id componente
     * @return string limpa somente numeros, caso tree separados por _
     */
    public static String limpaDragDropId(String idDragDrop, String separador) {

        String retorno = "";

        String[] arrayDragDrop = idDragDrop.split(separador);

        for (String string : arrayDragDrop) {

            String[] arrayRetorno = string.split("_");

            for (String string1 : arrayRetorno) {

                if (validaStringNumero(string1)) {

                    if (retorno.length() > 0) {

                        retorno += "_" + string1;

                    } else {

                        retorno = string1;

                    }

                }

            }

        }

        return retorno;

    }

    public static boolean validaStringNumero(String s) {

        return s.matches("[0-9]*");

    }

    private TreeNode carregaNode(TreeNode treeNode, String idEvento) {

        idEvento = limpaDragDropId(idEvento, ":");

        String[] splitIdEvento = idEvento.split("_");

        for (Integer i = 0; i < splitIdEvento.length; i++) {

            treeNode = treeNode.getChildren().get(Integer.parseInt(splitIdEvento[i]));

        }

        return treeNode;

    }

    public void setModel(ListDataModel model) {
        this.model = model;
    }

    public TreeNode getRoot() {
        return root;
    }

    public void setRoot(TreeNode root) {
        this.root = root;
    }

    public void limparTabelas() {

        List<Carro> carros = new ArrayList<Carro>();

        carros.add(new Carro("1987", "Verde", "Gol"));
        carros.add(new Carro("2000", "Azul", "Palio"));
        carros.add(new Carro("2008", "Amarelo", "Uno"));

        model = new ListDataModel(carros);

        root = new DefaultTreeNode("root", null);
        TreeNode Estoque = new DefaultTreeNode("Estoque", root);
        TreeNode Vendido = new DefaultTreeNode("Vendido", root);
        TreeNode Defeito = new DefaultTreeNode("Defeito", root);

    }
}

Aqui a classe Carro


package br.com.objetos;

public class Carro {

    private String cor;
    private String ano;
    private String modelo;

    public Carro(String ano, String cor, String modelo) {

        this.ano = ano;
        this.cor = cor;
        this.modelo = modelo;

    }

    public String getCor() {
        return cor;
    }

    public void setCor(String cor) {
        this.cor = cor;
    }

    public String getAno() {
        return ano;
    }

    public void setAno(String ano) {
        this.ano = ano;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }
}

É isso ai Abraços