Coverage Summary for Class: ProcessListBaseView (org.kitodo.production.forms)

Class Class, % Method, % Line, %
ProcessListBaseView 100% (1/1) 13,5% (7/52) 15,1% (28/186)


 /*
  * (c) Kitodo. Key to digital objects e. V. <contact@kitodo.org>
  *
  * This file is part of the Kitodo project.
  *
  * It is licensed under GNU General Public License version 3 or later.
  *
  * For the full copyright and license information, please read the
  * GPL3-License.txt file that was distributed with this source code.
  */
 
 package org.kitodo.production.forms;
 
 import com.itextpdf.text.DocumentException;
 
 import java.io.IOException;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.kitodo.api.dataformat.PhysicalDivision;
 import org.kitodo.api.dataformat.Workpiece;
 import org.kitodo.config.ConfigCore;
 import org.kitodo.config.enums.ParameterCore;
 import org.kitodo.data.database.beans.Process;
 import org.kitodo.data.database.exceptions.DAOException;
 import org.kitodo.data.exceptions.DataException;
 import org.kitodo.export.ExportDms;
 import org.kitodo.production.dto.ProcessDTO;
 import org.kitodo.production.enums.ChartMode;
 import org.kitodo.production.enums.ObjectType;
 import org.kitodo.production.helper.Helper;
 import org.kitodo.production.helper.WebDav;
 import org.kitodo.production.model.LazyProcessDTOModel;
 import org.kitodo.production.process.ProcessMetadataStatistic;
 import org.kitodo.production.services.ServiceManager;
 import org.kitodo.production.services.data.ProcessService;
 import org.kitodo.production.services.dataformat.MetsService;
 import org.primefaces.PrimeFaces;
 import org.primefaces.component.datatable.DataTable;
 import org.primefaces.event.data.PageEvent;
 import org.primefaces.model.charts.hbar.HorizontalBarChartModel;
 import org.primefaces.model.charts.pie.PieChartModel;
 
 public class ProcessListBaseView extends BaseForm {
 
     private static final Logger logger = LogManager.getLogger(ProcessListBaseView.class);
     private ChartMode chartMode;
     private HorizontalBarChartModel stackedBarModel;
     private PieChartModel pieModel;
     private Map<String,Integer> statisticResult;
     private List<ProcessMetadataStatistic> processMetadataStatistics = new ArrayList<>();
     private int numberOfGlobalImages;
     private int numberOfGlobalStructuralElements;
     private int numberOfGlobalMetadata;
     List<? extends Object> selectedProcessesOrProcessDTOs = new ArrayList<>();
     private final String doneDirectoryName = ConfigCore.getParameterOrDefaultValue(ParameterCore.DONE_DIRECTORY_NAME);
     DeleteProcessDialog deleteProcessDialog = new DeleteProcessDialog();
 
     private final HashMap<Integer, Boolean> exportable = new HashMap<>();
 
     boolean allSelected = false;
     HashSet<Integer> excludedProcessIds = new HashSet<>();
 
     /**
      * Constructor.
      */
     public ProcessListBaseView() {
         super();
         super.setLazyDTOModel(new LazyProcessDTOModel(ServiceManager.getProcessService()));
     }
 
     /**
      * Gets excludedProcessIds.
      *
      * @return value of excludedProcessIds
      */
     public HashSet<Integer> getExcludedProcessIds() {
         return excludedProcessIds;
     }
 
     /**
      * Sets excludedProcessIds.
      *
      * @param excludedProcessIds value of excludedProcessIds
      */
     public void setExcludedProcessIds(HashSet<Integer> excludedProcessIds) {
         this.excludedProcessIds = excludedProcessIds;
     }
 
     /**
      * Gets allSelected.
      *
      * @return value of allSelected
      */
     public boolean isAllSelected() {
         return allSelected;
     }
 
     /**
      * Sets allSelected.
      *
      * @param allSelected value of allSelected
      */
     public void setAllSelected(boolean allSelected) {
         this.allSelected = allSelected;
         excludedProcessIds.clear();
     }
 
     /**
      * Returns the list of the processes currently selected in the user interface.
      * Converts ProcessDTO instances to Process instances in case of displaying search results.
      *
      * @return value of selectedProcesses
      */
     @SuppressWarnings("unchecked")
     public List<Process> getSelectedProcesses() {
         List<Process> selectedProcesses = new ArrayList<>();
         ProcessService processService = ServiceManager.getProcessService();
         if (allSelected) {
             try {
                 this.selectedProcessesOrProcessDTOs = processService.findByQuery(processService.getQueryForFilter(
                                 this.isShowClosedProcesses(), isShowInactiveProjects(), getFilter())
                         .mustNot(processService.createSetQueryForIds(new ArrayList<>(excludedProcessIds))), false);
             } catch (DataException e) {
                 logger.error(e.getMessage());
             }
         }
         if (selectedProcessesOrProcessDTOs.size() > 0) {
             if (selectedProcessesOrProcessDTOs.get(0) instanceof ProcessDTO) {
                 // list contains ProcessDTO instances
                 try {
                     selectedProcesses = ServiceManager.getProcessService()
                             .convertDtosToBeans((List<ProcessDTO>) selectedProcessesOrProcessDTOs);
                 } catch (DAOException e) {
                     Helper.setErrorMessage(ERROR_LOADING_MANY,
                             new Object[]{ObjectType.PROCESS.getTranslationPlural()}, logger, e);
                 }
             } else if (selectedProcessesOrProcessDTOs.get(0) instanceof Process) {
                 // list contains Process instances
                 selectedProcesses = (List<Process>) selectedProcessesOrProcessDTOs;
             }
         }
         return selectedProcesses;
     }
 
     /**
      * Get stackedBarModel.
      *
      * @return value of stackedBarModel
      */
     public HorizontalBarChartModel getStackedBarModel() {
         return stackedBarModel;
     }
 
     /**
      * Shows the state of volumes from the selected processes.
      */
     public void showDurationOfTasks() {
         chartMode = ChartMode.BAR;
         stackedBarModel = ServiceManager.getProcessService().getBarChartModel(getSelectedProcesses());
         PrimeFaces.current().executeScript("PF('statisticsDialog').show();");
         PrimeFaces.current().ajax().update("statisticsDialog");
     }
 
     /**
      * Shows the state of volumes from the selected processes.
      */
     public void showStateOfVolume() {
         chartMode = ChartMode.PIE;
         statisticResult = ServiceManager.getProcessService().getProcessTaskStates(getSelectedProcesses());
         pieModel = ServiceManager.getProcessService().getPieChardModel(statisticResult);
         PrimeFaces.current().executeScript("PF('statisticsDialog').show();");
         PrimeFaces.current().ajax().update("statisticsDialog");
     }
 
     /**
      * Shows the number of images, metadata and structuralElements.
      */
     public void showProcessMetadataStatistic() {
         chartMode = ChartMode.METADATA_STATISTIC;
         processMetadataStatistics = new ArrayList<>();
         resetGlobalStatisticValues();
         Workpiece workpiece;
         for (Process selectedProcess : getSelectedProcesses()) {
             try {
                 URI metadataFilePath = ServiceManager.getFileService().getMetadataFilePath(selectedProcess);
                 workpiece = ServiceManager.getMetsService().loadWorkpiece(metadataFilePath);
             } catch (IOException e) {
                 Helper.setErrorMessage(ERROR_LOADING_ONE,
                         new Object[] {ObjectType.PROCESS.getTranslationSingular(), selectedProcess.getId() }, logger, e);
                 return;
             }
             int numberOfProcessImages = (int) Workpiece.treeStream(workpiece.getPhysicalStructure())
                     .filter(physicalDivision -> Objects.equals(physicalDivision.getType(), PhysicalDivision.TYPE_PAGE)).count();
             this.numberOfGlobalImages += numberOfProcessImages;
             int numberOfProcessStructuralElements = (int) Workpiece.treeStream(workpiece.getLogicalStructure()).count();
             this.numberOfGlobalStructuralElements += numberOfProcessStructuralElements;
             int numberOfProcessMetadata = Math
                     .toIntExact(MetsService.countLogicalMetadata(workpiece));
             this.numberOfGlobalMetadata += numberOfProcessMetadata;
 
             processMetadataStatistics.add(new ProcessMetadataStatistic(selectedProcess.getTitle(),
                     numberOfProcessImages, numberOfProcessStructuralElements, numberOfProcessMetadata));
         }
         PrimeFaces.current().executeScript("PF('statisticsDialog').show();");
         PrimeFaces.current().ajax().update("statisticsDialog");
     }
 
     /**
      * Return whether to display bar model or not.
      *
      * @return whether to display bar model or not
      */
     public boolean showBarModel() {
         return ChartMode.BAR.equals(chartMode);
     }
 
     /**
      * Return whether to display pie model or not.
      *
      * @return whether to display pie model or not
      */
     public boolean showPieModel() {
         return ChartMode.PIE.equals(chartMode);
     }
 
     /**
      * Return whether to display metadata statistics or not.
      *
      * @return whether to display metadata statistics or not
      */
     public boolean showProcessMetadataStatisticTable() {
         return ChartMode.METADATA_STATISTIC.equals(chartMode);
     }
 
     /**
      * Get statistic result.
      *
      * @return statistic result
      */
     public Map<String, Integer> getStatisticResult() {
         return statisticResult;
     }
 
     /**
      * Get pie model.
      *
      * @return pie model
      */
     public PieChartModel getPieModel() {
         return pieModel;
     }
 
     /**
      * Set pie model.
      *
      * @param pieModel as org.primefaces.model.charts.piePieChardModel
      */
     public void setPieModel(PieChartModel pieModel) {
         this.pieModel = pieModel;
     }
 
     /**
      * Get process metadata statistics.
      *
      * @return process metadata statistics
      */
     public List<ProcessMetadataStatistic> getProcessMetadataStatistics() {
         return processMetadataStatistics;
     }
 
     /**
      * Get relative image amount.
      *
      * @param numberOfImages number of images
      * @return relative image amount
      */
     public int getRelativeImageAmount(int numberOfImages) {
         return numberOfImages == 0 ? 0 : numberOfImages * 100 / this.numberOfGlobalImages;
     }
 
     /**
      * Get relative structural element amount.
      *
      * @param numberOfStructuralElements number of structural elements
      * @return relative structural element amount
      */
     public int getRelativeStructuralElementAmount(int numberOfStructuralElements) {
         return numberOfStructuralElements == 0 ? 0
                 : numberOfStructuralElements * 100 / this.numberOfGlobalStructuralElements;
     }
 
     /**
      * Get relative metadata amount.
      *
      * @param numberOfMetadata number of metadata
      * @return relative metadata amount
      */
     public int getRelativeMetadataAmount(int numberOfMetadata) {
         return numberOfMetadata == 0 ? 0 : numberOfMetadata * 100 / this.numberOfGlobalMetadata;
     }
 
     /**
      * Return whether closed processes should be displayed or not.
      *
      * @return parameter controlling whether closed processes should be displayed or
      *         not
      */
     public boolean isShowClosedProcesses() {
         return ((LazyProcessDTOModel)this.lazyDTOModel).isShowClosedProcesses();
     }
 
     /**
      * Set whether closed processes should be displayed or not.
      *
      * @param showClosedProcesses
      *            boolean flag signaling whether closed processes should be
      *            displayed or not
      */
     public void setShowClosedProcesses(boolean showClosedProcesses) {
         ((LazyProcessDTOModel)this.lazyDTOModel).setShowClosedProcesses(showClosedProcesses);
     }
 
     /**
      * Set whether inactive projects should be displayed or not.
      *
      * @param showInactiveProjects
      *            boolean flag signaling whether inactive projects should be
      *            displayed or not
      */
     public void setShowInactiveProjects(boolean showInactiveProjects) {
         ((LazyProcessDTOModel)this.lazyDTOModel).setShowInactiveProjects(showInactiveProjects);
     }
 
     /**
      * Return whether inactive projects should be displayed or not.
      *
      * @return parameter controlling whether inactive projects should be displayed
      *         or not
      */
     public boolean isShowInactiveProjects() {
         return ((LazyProcessDTOModel)this.lazyDTOModel).isShowInactiveProjects();
     }
 
     /**
      * Export DMS for selected processes.
      */
     public void exportDMSForSelection() {
         exportDMSForProcesses(getSelectedProcesses());
     }
 
     /**
      * Generate result set.
      */
     public void generateResult() {
         try {
             ServiceManager.getProcessService().generateResult(this.filter, this.isShowClosedProcesses(),
                     this.isShowInactiveProjects());
         } catch (IOException e) {
             Helper.setErrorMessage(ERROR_CREATING, new Object[] {Helper.getTranslation("resultSet") }, logger, e);
         }
     }
 
     /**
      * Generate result as PDF.
      */
     public void generateResultAsPdf() {
         try {
             ServiceManager.getProcessService().generateResultAsPdf(this.filter, this.isShowClosedProcesses(),
                     this.isShowInactiveProjects());
         } catch (IOException | DocumentException e) {
             Helper.setErrorMessage(ERROR_CREATING, new Object[] {Helper.getTranslation("resultPDF") }, logger, e);
         }
     }
 
     /**
      * Download to home for selected processes.
      */
     public void downloadToHomeForSelection() {
         try {
             ProcessService.downloadToHome(this.getSelectedProcesses());
             Helper.setMessage("createdInUserHomeAll");
         } catch (DAOException e) {
             Helper.setErrorMessage("Error downloading processes to home directory!");
         }
     }
 
     /**
      * Upload selected processes from home.
      */
     public void uploadFromHomeForSelection() {
         ProcessService.uploadFromHome(this.getSelectedProcesses());
         Helper.setMessage("directoryRemovedSelected");
     }
 
     /**
      * Upload all processes from home.
      */
     public void uploadFromHomeForAll() {
         WebDav myDav = new WebDav();
         List<URI> folder = myDav.uploadAllFromHome(doneDirectoryName);
         myDav.removeAllFromHome(folder, URI.create(doneDirectoryName));
         Helper.setMessage("directoryRemovedAll", doneDirectoryName);
     }
 
     void resetGlobalStatisticValues() {
         this.numberOfGlobalStructuralElements = 0;
         this.numberOfGlobalImages = 0;
         this.numberOfGlobalMetadata = 0;
     }
 
     private void exportDMSForProcesses(List<Process> processes) {
         ExportDms export = new ExportDms();
         for (Process processToExport : processes) {
             try {
 
                 export.startExport(processToExport);
             } catch (DataException e) {
                 Helper.setErrorMessage(ERROR_EXPORTING,
                         new Object[] {ObjectType.PROCESS.getTranslationSingular(), processToExport.getId() }, logger, e);
             }
         }
     }
 
     /**
      * If processes are generated with calendar.
      *
      * @param processDTO
      *            the process dto to check.
      * @return true if processes are created with calendar, false otherwise
      */
     public boolean createProcessesWithCalendar(ProcessDTO processDTO) {
         try {
             return ProcessService.canCreateProcessWithCalendar(processDTO);
         } catch (IOException | DAOException e) {
             Helper.setErrorMessage(ERROR_READING, new Object[] {ObjectType.PROCESS.getTranslationSingular() }, logger,
                     e);
         }
         return false;
     }
 
     /**
      * If a process can be created as child.
      *
      * @param processDTO
      *            the process dto to check.
      * @return true if processes can be created as child, false otherwise
      */
     public boolean createProcessAsChildPossible(ProcessDTO processDTO) {
         try {
             return ProcessService.canCreateChildProcess(processDTO);
         } catch (IOException | DAOException e) {
             Helper.setErrorMessage(ERROR_READING, new Object[] {ObjectType.PROCESS.getTranslationSingular() }, logger,
                     e);
         }
         return false;
     }
 
     /**
      * Download to home for single process. First check if this volume is currently
      * being edited by another user and placed in his home directory, otherwise
      * download.
      */
     public void downloadToHome(int processId) {
         try {
             ProcessService.downloadToHome(new WebDav(), processId);
         } catch (DAOException e) {
             Helper.setErrorMessage("Error downloading process " + processId + " to home directory!");
         }
     }
 
     /**
      * Starts generation of xml logfile for current process.
      */
     public void createXML(ProcessDTO processDTO) {
         try {
             ProcessService.createXML(ServiceManager.getProcessService().getById(processDTO.getId()), getUser());
         } catch (IOException | DAOException e) {
             Helper.setErrorMessage("Error creating log file in home directory", logger, e);
         }
     }
 
     /**
      * Export METS.
      */
     public void exportMets(int processId) {
         try {
             ProcessService.exportMets(processId);
         } catch (DAOException | DataException | IOException e) {
             Helper.setErrorMessage("An error occurred while trying to export METS file for process "
                     + processId, logger, e);
         }
     }
 
     /**
      * Export DMS.
      */
     public void exportDMS(int id) {
         ExportDms export = new ExportDms();
         try {
             export.startExport(ServiceManager.getProcessService().getById(id));
         } catch (DataException e) {
             Helper.setErrorMessage(ERROR_EXPORTING,
                     new Object[] {ObjectType.PROCESS.getTranslationSingular(), id }, logger, e);
         } catch (DAOException e) {
             Helper.setErrorMessage(ERROR_LOADING_ONE,
                     new Object[] {ObjectType.PROCESS.getTranslationSingular(), id }, logger, e);
         }
     }
 
     /**
      * Downloads a docket for process.
      */
     public void downloadDocket(int id) {
         try {
             ServiceManager.getProcessService().downloadDocket(ServiceManager.getProcessService().getById(id));
         } catch (IOException | DAOException e) {
             Helper.setErrorMessage(e.getLocalizedMessage(), logger, e);
         }
     }
 
     /**
      * Upload from home for single process.
      */
     public void uploadFromHome(ProcessDTO processDTO) {
         try {
             WebDav myDav = new WebDav();
             myDav.uploadFromHome(ServiceManager.getProcessService().getById(processDTO.getId()));
             Helper.setMessage("directoryRemoved", processDTO.getTitle());
         } catch (DAOException e) {
             Helper.setErrorMessage(ERROR_LOADING_ONE,
                     new Object[] {ObjectType.PROCESS.getTranslationSingular(), processDTO.getId() }, logger, e);
         }
     }
 
     /**
      * Delete Process.
      *
      * @param processDTO
      *            process to delete.
      */
     public void delete(ProcessDTO processDTO) {
         try {
             Process process = ServiceManager.getProcessService().getById(processDTO.getId());
             if (process.getChildren().isEmpty()) {
                 try {
                     ProcessService.deleteProcess(process);
                 } catch (DataException | IOException e) {
                     Helper.setErrorMessage(ERROR_DELETING, new Object[] {ObjectType.PROCESS.getTranslationSingular() },
                             logger, e);
                 }
             } else {
                 this.deleteProcessDialog = new DeleteProcessDialog();
                 this.deleteProcessDialog.setProcess(process);
                 PrimeFaces.current().executeScript("PF('deleteChildrenDialog').show();");
             }
         } catch (DAOException e) {
             Helper.setErrorMessage(ERROR_DELETING, new Object[] {ObjectType.PROCESS.getTranslationSingular() }, logger,
                     e);
         }
     }
 
     /**
      * Return delete process dialog.
      *
      * @return delete process dialog
      */
     public DeleteProcessDialog getDeleteProcessDialog() {
         return this.deleteProcessDialog;
     }
 
     /**
      * Check and return whether process with given ID can be exported or not.
      *
      * @param processId process ID
      * @return whether process with given ID can be exported or not
      */
     public boolean canBeExported(int processId) {
         try {
             if (!exportable.containsKey(processId)) {
                 exportable.put(processId, ProcessService.canBeExported(processId));
             }
             return exportable.get(processId);
         } catch (IOException | DAOException e) {
             Helper.setErrorMessage(e);
             return false;
         }
     }
 
     /**
      * Returns the list of currently selected processes. This list is used both when displaying search results 
      * and when displaying the process list, which is why it may contain either instances of Process or 
      * instances of ProcessDTO.
      * 
      * @return list of instances of Process or ProcessDTO
      */
     public List<? extends Object> getSelectedProcessesOrProcessDTOs() {
         return selectedProcessesOrProcessDTOs;
     }
 
     public void setSelectedProcessesOrProcessDTOs(List<? extends Object> selectedProcessesOrProcessDTOs) {
         this.selectedProcessesOrProcessDTOs = selectedProcessesOrProcessDTOs;
     }
 
     /**
      * Update selection and first row to show in datatable on PageEvent.
      * @param pageEvent PageEvent triggered by data tables paginator
      */
     public void onPageChange(PageEvent pageEvent) {
         this.setFirstRow(((DataTable) pageEvent.getSource()).getFirst());
         if (allSelected) {
             PrimeFaces.current()
                     .executeScript("PF('processesTable').selectAllRows();");
             excludedProcessIds.forEach(processId -> PrimeFaces.current()
                     .executeScript("PF('processesTable').unselectRow($('tr[data-rk=\"" + processId + "\"]'), true);"));
         }
     }
 
     /**
      * Returns the number of global images of the process list base view.
      * 
      * @return the number of global images
      */
     public int getNumberOfGlobalImages() {
         return numberOfGlobalImages;
     }
 
     /**
      * Returns the number of global structural elements of the process list base
      * view.
      * 
      * @return the number of global structural elements
      */
     public int getNumberOfGlobalStructuralElements() {
         return numberOfGlobalStructuralElements;
     }
 
     /**
      * Returns the number of global metadata of the process list base view.
      * 
      * @return the number of global metadata
      */
     public int getNumberOfGlobalMetadata() {
         return numberOfGlobalMetadata;
     }
 
     /**
      * Returns the number of global process metadata statistics of the process
      * list base view.
      * 
      * @return the number of global process metadata statistics
      */
     public int getNumberOfGlobalProcessMetadataStatistics() {
         return processMetadataStatistics.size();
     }
 }