Coverage Summary for Class: TemplateForm (org.kitodo.production.forms)
Class |
Class, %
|
Method, %
|
Line, %
|
TemplateForm |
0%
(0/1)
|
0%
(0/34)
|
0%
(0/134)
|
/*
* (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 java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.kitodo.data.database.beans.Docket;
import org.kitodo.data.database.beans.Project;
import org.kitodo.data.database.beans.Ruleset;
import org.kitodo.data.database.beans.Task;
import org.kitodo.data.database.beans.Template;
import org.kitodo.data.database.beans.User;
import org.kitodo.data.database.beans.Workflow;
import org.kitodo.data.database.exceptions.DAOException;
import org.kitodo.data.exceptions.DataException;
import org.kitodo.exceptions.WorkflowException;
import org.kitodo.production.enums.ObjectType;
import org.kitodo.production.helper.Helper;
import org.kitodo.production.model.LazyDTOModel;
import org.kitodo.production.services.ServiceManager;
import org.kitodo.production.services.data.TemplateService;
import org.kitodo.production.services.workflow.WorkflowControllerService;
import org.kitodo.production.workflow.model.Converter;
@Named("TemplateForm")
@SessionScoped
public class TemplateForm extends TemplateBaseForm {
private static final Logger logger = LogManager.getLogger(TemplateForm.class);
private Template template;
private List<Project> assignedProjects = new ArrayList<>();
private Task task;
private boolean showInactiveTemplates = false;
private static final String TITLE_USED = "templateTitleAlreadyInUse";
private final String templateListPath = MessageFormat.format(REDIRECT_PATH, "projects");
private final String templateEditPath = MessageFormat.format(REDIRECT_PATH, "templateEdit");
private List<String> templateFilters;
private List<String> selectedTemplateFilters;
private static final String DEACTIVATED_TEMPLATES_FILTER = "deactivatedTemplates";
/**
* Constructor.
*/
public TemplateForm() {
super.setLazyDTOModel(new LazyDTOModel(ServiceManager.getTemplateService()));
}
/**
* Initialize list of template filters (currently only 'deactivated templates').
*/
@PostConstruct
public void init() {
templateFilters = new LinkedList<>();
templateFilters.add(DEACTIVATED_TEMPLATES_FILTER);
selectedTemplateFilters = new LinkedList<>();
}
/**
* Check if inactive templates should be shown.
*
* @return true or false
*/
public boolean isShowInactiveTemplates() {
return this.showInactiveTemplates;
}
/**
* Set if inactive templates should be shown.
*
* @param showInactiveTemplates
* true or false
*/
public void setShowInactiveTemplates(boolean showInactiveTemplates) {
this.showInactiveTemplates = showInactiveTemplates;
ServiceManager.getTemplateService().setShowInactiveTemplates(showInactiveTemplates);
}
/**
* Create new template.
*
* @return page
*/
public String newTemplate() {
this.template = new Template();
this.template.setTitle("");
this.template.setClient(ServiceManager.getUserService().getSessionClientOfAuthenticatedUser());
this.assignedProjects.clear();
return templateEditPath + "&id=" + (Objects.isNull(this.template.getId()) ? 0 : this.template.getId());
}
/**
* Duplicate the selected template.
*
* @param itemId
* ID of the template to duplicate
* @return page address; either redirect to the edit template page or return
* 'null' if the template could not be retrieved, which will prompt
* JSF to remain on the same page and reuse the bean.
*/
public String duplicate(Integer itemId) {
try {
Template baseTemplate = ServiceManager.getTemplateService().getById(itemId);
this.template = ServiceManager.getTemplateService().duplicateTemplate(baseTemplate);
this.assignedProjects.clear();
this.assignedProjects.addAll(template.getProjects());
this.setSaveDisabled(false);
return templateEditPath;
} catch (DAOException e) {
Helper.setErrorMessage(ERROR_DUPLICATE, new Object[] {ObjectType.TEMPLATE.getTranslationSingular() },
logger, e);
return this.stayOnCurrentPage;
}
}
/**
* Save template and redirect to list view.
*
* @return url to list view
*/
public String save() {
if (isTitleValid()) {
try {
prepareTasks();
} catch (DAOException | DataException | IOException e) {
Helper.setErrorMessage("errorDiagram", new Object[] {this.template.getWorkflow().getTitle() },
logger, e);
return this.stayOnCurrentPage;
} catch (WorkflowException e) {
Helper.setErrorMessage("errorDiagram",
new Object[] {this.template.getWorkflow().getTitle(), e.getMessage() }, logger, e);
return this.stayOnCurrentPage;
}
this.template.getProjects().clear();
this.template.getProjects().addAll(assignedProjects);
try {
ServiceManager.getTemplateService().save(this.template, true);
template = ServiceManager.getTemplateService().getById(this.template.getId());
new WorkflowControllerService().activateNextTasks(template.getTasks());
} catch (DataException | IOException | DAOException e) {
Helper.setErrorMessage(ERROR_SAVING, new Object[] {ObjectType.TEMPLATE.getTranslationSingular() },
logger, e);
return this.stayOnCurrentPage;
}
} else {
return this.stayOnCurrentPage;
}
return templateListPath;
}
private boolean isTitleValid() {
String templateTitle = this.template.getTitle();
if (StringUtils.isNotBlank(templateTitle)) {
List<Template> templates = ServiceManager.getTemplateService().getTemplatesWithTitleAndClient(templateTitle,
this.template.getClient().getId());
int count = templates.size();
if (count > 1) {
Helper.setErrorMessage(ERROR_OCCURRED, TITLE_USED);
return false;
} else if (count == 1) {
Integer templateId = this.template.getId();
if (Objects.nonNull(templateId) && templates.get(0).getId().equals(templateId)) {
return true;
}
Helper.setErrorMessage(ERROR_OCCURRED, TITLE_USED);
return false;
}
return true;
}
Helper.setErrorMessage(ERROR_INCOMPLETE_DATA, "templateTitleEmpty");
return false;
}
/**
* Remove template if there is no assigned processes.
*/
public void delete() {
if (!this.template.getProcesses().isEmpty()) {
Helper.setErrorMessage("processAssignedError");
} else {
try {
if (Objects.nonNull(this.template.getWorkflow())) {
this.template.getWorkflow().getTemplates().remove(this.template);
this.template.setWorkflow(null);
}
ServiceManager.getTemplateService().remove(this.template);
} catch (Exception e) {
Helper.setErrorMessage(ERROR_DELETING, new Object[] {ObjectType.TEMPLATE.getTranslationSingular() },
logger, e);
}
}
}
/**
* Save task and redirect to processEdit view.
*
* @return url to templateEdit view
*/
public String saveTaskAndRedirect() {
saveTask(this.task, this.template, ObjectType.TEMPLATE.getTranslationSingular(),
ServiceManager.getTemplateService());
return templateEditPath + "&id=" + (Objects.isNull(this.template.getId()) ? 0 : this.template.getId());
}
/**
* Get diagram image for current template.
*
* @return diagram image file
*/
public InputStream getTasksDiagram() {
if (Objects.nonNull(this.template.getWorkflow())) {
return ServiceManager.getTemplateService().getTasksDiagram(this.template.getWorkflow().getTitle());
}
return ServiceManager.getTemplateService().getTasksDiagram("");
}
/**
* Get list of dockets for select list.
*
* @return list of dockets
*/
public List<Docket> getDockets() {
return ServiceManager.getDocketService().getAllForSelectedClient();
}
/**
* Get list of projects for select list.
*
* @return list of SelectItem objects
*/
public List<Project> getProjects() {
return ServiceManager.getProjectService().getAllForSelectedClient();
}
/**
* Get list of rulesets for select list.
*
* @return list of ruleset
*/
public List<Ruleset> getRulesets() {
return ServiceManager.getRulesetService().getAllForSelectedClient();
}
/**
* Get list of workflows for select list.
*
* @return list of workflows
*/
public List<Workflow> getWorkflows() {
return ServiceManager.getWorkflowService().getAvailableWorkflows();
}
/**
* Check if user is not assigned to the project. Used for disabling projects.
*
* @param project
* for check
* @return false if user is assigned to this project, otherwise true
*/
public boolean isUserNotAssignedToProject(Project project) {
for (User user : project.getUsers()) {
if (user.getId().equals(ServiceManager.getUserService().getCurrentUser().getId())) {
return false;
}
}
return true;
}
/**
* Set template by id.
*
* @param id
* of template to set
*/
public void setTemplateById(int id) {
try {
setTemplate(ServiceManager.getTemplateService().getById(id));
} catch (DAOException e) {
Helper.setErrorMessage(ERROR_LOADING_ONE, new Object[] {ObjectType.TEMPLATE.getTranslationSingular(), id },
logger, e);
}
}
/**
* Method being used as viewAction for template edit form. If the given
* parameter 'id' is '0', the form for creating a new template will be
* displayed.
*
* @param id
* of the template to load
*/
public void loadTemplate(int id) {
try {
if (id != 0) {
setTemplate(ServiceManager.getTemplateService().getById(id));
} else {
newTemplate();
}
setSaveDisabled(false);
} catch (DAOException e) {
Helper.setErrorMessage(ERROR_LOADING_ONE, new Object[] {ObjectType.TEMPLATE.getTranslationSingular(), id },
logger, e);
}
}
/**
* Method being used as viewAction for task form.
*
* @param id
* of the task to load
*/
public void loadTask(int id) {
try {
if (id != 0) {
setTask(ServiceManager.getTaskService().getById(id));
}
setSaveDisabled(true);
} catch (DAOException e) {
Helper.setErrorMessage(ERROR_LOADING_ONE, new Object[] {ObjectType.TASK.getTranslationSingular(), id },
logger, e);
}
}
/**
* Get template.
*
* @return value of template
*/
public Template getTemplate() {
return template;
}
/**
* Set template.
*
* @param template
* as Template
*/
public void setTemplate(Template template) {
this.template = template;
this.assignedProjects.clear();
this.assignedProjects.addAll(template.getProjects());
}
/**
* Get assignedProjects.
*
* @return value of assigned projects
*/
public List<Project> getAssignedProjects() {
return assignedProjects;
}
/**
* Set assignedProjects.
*
* @param assignedProjects
* as assignedProjects
*/
public void setAssignedProjects(List<Project> assignedProjects) {
this.assignedProjects = assignedProjects;
}
/**
* Get task.
*
* @return value of task
*/
public Task getTask() {
return task;
}
/**
* Set task.
*
* @param task
* as Task
*/
public void setTask(Task task) {
this.task = task;
}
private void prepareTasks() throws DAOException, IOException, WorkflowException, DataException {
List<Task> templateTasks = new ArrayList<>(this.template.getTasks());
if (!templateTasks.isEmpty()) {
this.template.getTasks().clear();
TemplateService templateService = ServiceManager.getTemplateService();
templateService.save(template, true);
}
if (Objects.nonNull(template.getWorkflow())) {
Converter converter = new Converter(this.template.getWorkflow().getTitle());
converter.convertWorkflowToTemplate(this.template);
}
}
/**
* Check and return whether the template with the provided ID 'templateId' is used by any processes.
*
* @param templateId
* ID of template to check
* @return whether template is used by any processes or not
*/
public boolean isTemplateUsed(int templateId) {
try {
return !ServiceManager.getProcessService().findByTemplate(templateId).isEmpty();
} catch (DataException e) {
Helper.setErrorMessage(e);
return false;
}
}
/**
* Check and return whether the current template is used by any processes.
*
* @return whether the current template is used by any processes or not
*/
public boolean isCurrentTemplateInUse() {
if (Objects.nonNull(this.template) && Objects.nonNull(this.template.getId()) && this.template.getId() > 0) {
return isTemplateUsed(this.template.getId());
} else {
return false;
}
}
/**
* Get templateFilters.
*
* @return value of templateFilters
*/
public List<String> getTemplateFilters() {
return templateFilters;
}
/**
* Set templateFilters.
*
* @param templateFilters as list of Strings
*/
public void setTemplateFilters(List<String> templateFilters) {
this.templateFilters = templateFilters;
}
/**
* Get selectedTemplateFilters.
*
* @return value of selectedTemplateFilters
*/
public List<String> getSelectedTemplateFilters() {
return selectedTemplateFilters;
}
/**
* Set selectedTemplateFilters.
*
* @param selectedTemplateFilters as list of Strings
*/
public void setSelectedTemplateFilters(List<String> selectedTemplateFilters) {
this.selectedTemplateFilters = selectedTemplateFilters;
}
/**
* Event listener for template filter changed event.
*/
public void templateFiltersChanged() {
setShowInactiveTemplates(selectedTemplateFilters.contains(DEACTIVATED_TEMPLATES_FILTER));
}
}