Search code examples
tomcatjsfprimefacestreetabletreetablecelleditor

Primefaces TreeTable with CellEditor extreme slow / freeze


im using a TreeTable with 15 columns and 12 contains a cellEditor. After 29 rows i cant expand any further nodes and the site seems to be broken (no buttons are working). After removing some cellEditor i can add more rows until the site is broken again. If i remove all cellEditors its working fine. If i add only a few its wokring fine but extrem slow. this behaviour is only on my server ( running linux with a tomcat 7), locally everything is running fine.

Im using PF 11.0.4 and Mojarra 2.3.14. Tested on Tomcat 7 and Tomcat 8.

here is a simple version as i said this only works locally

My xhtml:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>PrimeFaces Test</title>
<h:outputScript name="test.js" />
<h:outputStylesheet name="test.css" />
</h:head>
<h:body>
<h1>#{testView.string}</h1>
<h:form id="frmTest">
    <p:treeTable id="table" var="prozess" editable="true" editMode="cell"
        editInitEvent="dblclick" value="#{testView.root}"
        widgetVar="proTable" emptyMessage="Kein Prozess gefunden"
        scrollHeight="70vh" scrollable="true">
        <p:column>
            <p:cellEditor>
                <f:facet name="input">
                    <p:inputText value="#{prozess}" />
                </f:facet>
                <f:facet name="output">
                    <h:outputText value="#{prozess}" />
                </f:facet>
            </p:cellEditor>
        </p:column>
        <p:column>
            <p:cellEditor>
                <f:facet name="input">
                    <p:inputText value="#{prozess}" />
                </f:facet>
                <f:facet name="output">
                    <h:outputText value="#{prozess}" />
                </f:facet>
            </p:cellEditor>
        </p:column>
        <p:column>
            <p:cellEditor>
                <f:facet name="input">
                    <p:inputText value="#{prozess}" />
                </f:facet>
                <f:facet name="output">
                    <h:outputText value="#{prozess}" />
                </f:facet>
            </p:cellEditor>
        </p:column>
        <p:column>
            <p:cellEditor>
                <f:facet name="input">
                    <p:inputText value="#{prozess}" />
                </f:facet>
                <f:facet name="output">
                    <h:outputText value="#{prozess}" />
                </f:facet>
            </p:cellEditor>
        </p:column>
        <p:column>
            <p:cellEditor>
                <f:facet name="input">
                    <p:inputText value="#{prozess}" />
                </f:facet>
                <f:facet name="output">
                    <h:outputText value="#{prozess}" />
                </f:facet>
            </p:cellEditor>
        </p:column>
        <p:column>
            <p:cellEditor>
                <f:facet name="input">
                    <p:inputText value="#{prozess}" />
                </f:facet>
                <f:facet name="output">
                    <h:outputText value="#{prozess}" />
                </f:facet>
            </p:cellEditor>
        </p:column>
        <p:column>
            <p:cellEditor>
                <f:facet name="input">
                    <p:inputText value="#{prozess}" />
                </f:facet>
                <f:facet name="output">
                    <h:outputText value="#{prozess}" />
                </f:facet>
            </p:cellEditor>
        </p:column>
        <p:column>
            <p:cellEditor>
                <f:facet name="input">
                    <p:inputText value="#{prozess}" />
                </f:facet>
                <f:facet name="output">
                    <h:outputText value="#{prozess}" />
                </f:facet>
            </p:cellEditor>
        </p:column>
        <p:column>
            <p:cellEditor>
                <f:facet name="input">
                    <p:inputText value="#{prozess}" />
                </f:facet>
                <f:facet name="output">
                    <h:outputText value="#{prozess}" />
                </f:facet>
            </p:cellEditor>
        </p:column>
        <p:column>
            <p:cellEditor>
                <f:facet name="input">
                    <p:inputText value="#{prozess}" />
                </f:facet>
                <f:facet name="output">
                    <h:outputText value="#{prozess}" />
                </f:facet>
            </p:cellEditor>
        </p:column>
    </p:treeTable>
</h:form>
</h:body>
</html>

My bean:

package org.primefaces.test;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.math.BigDecimal;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Named;

import org.primefaces.model.CheckboxTreeNode;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import org.primefaces.model.charts.ChartData;
import org.primefaces.model.charts.donut.DonutChartDataSet;
import org.primefaces.model.charts.donut.DonutChartModel;

import lombok.Data;

@Data
@Named
@ViewScoped
public class TestView implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = -8053071088222244162L;
private String string;
private TreeNode<String> root;

@PostConstruct  
public void init() {
    setString("Welcome to PrimeFaces!!!");
    buildDoc();
}

public void buildDoc(){
    root = new DefaultTreeNode<String>();
    for(int i = 0;i<100;i++){
        DefaultTreeNode<String> noroot = new DefaultTreeNode<String>("Node"+i,root);
        for(int j=0;j<20;j++){
            new DefaultTreeNode<String>("Node"+j,noroot);
        }
    }
}

public String getString() {
    return string;
}

public void setString(String string) {
    this.string = string;
}

/**
 * @return the root
 */
public TreeNode<String> getRoot() {
    return root;
}

/**
 * @param root the root to set
 */
public void setRoot(TreeNode<String> root) {
    this.root = root;
}


}

Solution

  • Problem was a firewall at my server installation, closed every connection with more than 500 params