2014-02-19 2 views
0

Я хочу создать Log-File-Reader. У меня есть поле Upload и dataTable. Сначала я выбираю Log-File a Upload it. Затем программа Разделяет каждую строку Log-File в отдельных переменных. Теперь Log-File должен быть строкой для строки в таблице. Но я не знаю, как я должен помещать строки в таблицу. Он работает, когда я определяю Static bevore Lines. Но теперь, когда строки не определены static, они не обновляют таблицу.PrimeFaces добавляет строку в DataTable

Вот мой index.xhtml:

<h:form xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 
    <title>LogReader</title> 
</h:head> 
<h:body> 
    <p:accordionPanel dynamic="true" cache="true" activeIndex="1" multiple="false"> 
     <p:tab title="Upload File"> 
      <h:panelGrid> 
       <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}" mode="advanced" dragDropSupport="false" 
       update="messages" fileLimit="1" allowTypes="/(\.|\/)(log|txt|)$/" /> 

       <p:growl id="messages" showDetail="true"/> 
      </h:panelGrid> 
     </p:tab> 
    </p:accordionPanel> 

    <p:dataTable id="dataTable" var="log" value="#{fileUpload.logsSmall}" widgetVar="dataTable" 
       emptyMessage="No Log found with given criteria" filteredValue="#{tableBean.filteredLogs}" 
       rowKey="#{log.datetime}" paginator="true" rows="20" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15,20,50,100" selection="#{tableBean.selectedLog}" selectionMode="single"> 

    <f:facet name="header"> 
     <p:outputPanel> 
      <h:outputText value="Search all fields:" /> 
      <p:inputText id="globalFilter" onkeyup="dataTable.filter();" style="width:150px" /> 
     </p:outputPanel> 
    </f:facet> 

    <p:column id="datetimeColumn" filterBy="datetime" sortBy="datetime" 
      headerText="DateTime" footerText="" 
      filterMatchMode="contains"> 
     <h:outputText value="#{log.datetime}" /> 
    </p:column> 

    <p:column id="levelColumn" filterBy="level" 
      headerText="LogLevel" footerText="" 
      filterOptions="#{tableBean.levelOptions}" 
      filterMatchMode="exact" sortBy="level"> 
     <h:outputText value="#{log.level}" /> 
    </p:column> 

    <p:column id="categoryColumn" filterBy="category" sortBy="category" 
      headerText="Category" footerText="" 
      filterMatchMode="contains"> 
     <h:outputText value="#{log.category}" /> 
    </p:column> 

    <p:column id="messageColumn" filterBy="message" sortBy="message" 
      headerText="Message" footerText="" filterMatchMode="contains"> 
     <h:outputText value="#{log.message}" /> 
    </p:column> 
</p:dataTable> 
</h:body> 

Вот мой TableBean:

package com.rausch.logreader; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.UUID; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.bean.ViewScoped; 
import javax.faces.model.SelectItem; 

import com.rausch.logreader.Log; 

@ViewScoped 
@ManagedBean(name = "tableBean") 
@SessionScoped 

public class TableBean implements Serializable { 

    private final static String[] level; 

    private SelectItem[] levelOptions; 

    private List<Log> filteredLogs; 

    private int i = 0; 

    private Log selectedLog; 

    private Log[] selectedLogs; 


    static { 
     level = new String[5]; 
     level[0] = "DEBUG"; 
     level[1] = "INFO"; 
     level[2] = "WARN"; 
     level[3] = "ERROR"; 
     level[4] = "FATAL"; 

    } 


    public TableBean() { 
     levelOptions = createLevelOptions(level); 
    } 

    public Log getSelectedLog() { 
     return selectedLog; 
    } 

    public void setSelectedLog(Log selectedLog) { 
     this.selectedLog = selectedLog; 
    } 

    public void listAdd(List<Log> list, String datetime, String level, String category, String message){ 
     list.add(new Log(datetime, level, category, message)); 
    } 


    public List<Log> getFilteredLogs() { 
     return filteredLogs; 
    } 

    public void setFilteredLogs(List<Log> filteredCars) { 
     this.filteredLogs = filteredCars; 
    } 

    private SelectItem[] createLevelOptions(String[] data) { 
     SelectItem[] options = new SelectItem[data.length + 1]; 

     options[0] = new SelectItem("", "Select"); 
     for(int i = 0; i < data.length; i++) { 
      options[i + 1] = new SelectItem(data[i], data[i]); 
     } 

     return options; 
    } 

    public SelectItem[] getLevelOptions() { 
     return levelOptions; 
    } 
} 

А вот мой FileUploadController:

import java.util.List; 
import javax.faces.application.FacesMessage; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.bean.ViewScoped; 
import javax.faces.context.FacesContext; 

import org.primefaces.event.FileUploadEvent; 
import org.primefaces.model.UploadedFile; 

@ViewScoped 
@ManagedBean(name = "fileUploadController") 
@SessionScoped 

public class FileUploadController { 

    public List<Log> logsSmall; 
    public void handleFileUpload(FileUploadEvent event) { 

     FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded."); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 

     try { 
      copyFile(event.getFile().getFileName(), event.getFile().getInputstream()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private String destination="C:\\Java\\"; 

    public void copyFile(String fileName, InputStream in) { 
     try {   
      // write the inputStream to a FileOutputStream 
      OutputStream out = new FileOutputStream(new File(destination + fileName)); 

      int read; 
      byte[] bytes = new byte[1024]; 

      while ((read = in.read(bytes)) != -1) { 
       out.write(bytes, 0, read); 
      } 

      in.close(); 
      out.flush(); 
      out.close(); 

      readFile(destination + fileName); 
     } catch (IOException e) { 
       System.out.println(e.getMessage()); 
     } 
    } 


    public void readFile(String filePath){ 
       try 
     { 
      String sCurrentLine; 


      BufferedReader br = new BufferedReader(new FileReader(filePath));   
      String output; 
      String datetime = ""; 
      String level = ""; 
      String category = ""; 
      String message; 

      TableBean table = new TableBean(); 

      while ((sCurrentLine = br.readLine()) != null) { 
       //System.out.println(sCurrentLine.charAt(4) + "" + sCurrentLine.charAt(7) + sCurrentLine.charAt(13) + "" +sCurrentLine.charAt(16)); 
       if(sCurrentLine.length()<1){     
       } 
       else{ 
        if (sCurrentLine.length() >= 16 && sCurrentLine.charAt(4)=='-' && sCurrentLine.charAt(7)=='-' && sCurrentLine.charAt(13)==':' && sCurrentLine.charAt(16)==':'){ 
         output = ""; 
         message = ""; 
         String[] leerzeichen = sCurrentLine.split(" "); 

         datetime = leerzeichen[0] + " " + leerzeichen[1]; 
         level = leerzeichen[2]; 
         category = leerzeichen[4]; 

         int arraylength = leerzeichen.length; 

         for (int l=5; l<arraylength; l++){ 
          message = message.concat(leerzeichen[l] + " "); 
         } 
         output = datetime + level + category + message; 
        } else { 
         message = sCurrentLine;  
         output = message; 
        } 
        logsSmall = new ArrayList<Log>(); 
        table.listAdd(logsSmall, datetime, level, category, message); 
        System.out.println(output); 
       } 

      } 


     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

Извините за мой плохой английский , Я пытаюсь спросить по-другому: Я хочу иметь программу, где я могу загрузить файл * .log и прочитать его в таблице. Я открываю xhtml, и есть пустая таблица. Чем я загружаю файл с помощью <: pFileUpload. Контроллер загрузки файлов принимает файл журнала и разбивает каждую строку на значения (дата, время, уровень, категория и сообщение). Затем скрипт должен добавить новую строку в таблицу ширину данных в строке журнала. Затем он переходит к следующей строке и анализирует текст. В конце таблицы должна отображаться содержимое файла журнала. Проблема в том, что таблица не перезагружается. Или я не знаю, как я должен перезагрузить его. Когда я загружаю файл, скрипт корректно читает каждую строку Log-File. Но таблица остается пустой.

ответ

0

Я совершенно не понимаю, что у вас есть вопрос, что я вижу в некотором понимании того, как использовать бобы для управления представлением.

Во-первых, вы одновременно объявляете @ViewScoped и @SessionScoped. Должно быть только одно.

Во-вторых, дело об определении управляемых компонентов - это то, что вам не нужно управлять созданием или уничтожением на них, система делает. Вот почему они называются управляемыми. Таким образом:

TableBean table = new TableBean(); 

бесполезно. Вы создаете экземпляр объекта внутри funcion. Вне этой функции объект недоступен, поскольку аннотации не учитываются при создании объекта в коде.

Я бы один управляемый компонент, который обрабатывает события на представлении, как это:

@ViewScoped 
@ManagedBean(name = "logViewController") 

public class LogViewController{ 

private List<Log> filteredLogs; 
private List<Log> logsSmall; 
public void handleFileUpload(FileUploadEvent event) {....} 

// other private functions 
//public getters and setters 
} 

Кроме того, если вы работаете с Java 7, может быть, вы хотите посмотреть на новую file I/O.

+0

Я редактирую свой вопрос, поэтому, надеюсь, вы понимаете, в чем моя проблема :) – sagschni

Смежные вопросы