de.sub.goobi.helper.BatchStepHelper.java Source code

Java tutorial

Introduction

Here is the source code for de.sub.goobi.helper.BatchStepHelper.java

Source

/*
 * (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 de.sub.goobi.helper;

import de.sub.goobi.config.ConfigCore;
import de.sub.goobi.export.dms.ExportDms;
import de.sub.goobi.forms.AktuelleSchritteForm;
import de.sub.goobi.metadaten.MetadatenImagesHelper;
import de.sub.goobi.metadaten.MetadatenVerifizierung;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import javax.faces.model.SelectItem;
import javax.naming.AuthenticationException;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.goobi.production.cli.helper.WikiFieldHelper;
import org.goobi.production.enums.PluginType;
import org.goobi.production.flow.jobs.HistoryAnalyserJob;
import org.goobi.production.plugin.PluginLoader;
import org.goobi.production.plugin.interfaces.IValidatorPlugin;
import org.goobi.production.properties.AccessCondition;
import org.goobi.production.properties.ProcessProperty;
import org.goobi.production.properties.PropertyParser;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.kitodo.data.database.beans.History;
import org.kitodo.data.database.beans.Process;
import org.kitodo.data.database.beans.Property;
import org.kitodo.data.database.beans.Task;
import org.kitodo.data.database.beans.User;
import org.kitodo.data.database.exceptions.DAOException;
import org.kitodo.data.database.helper.enums.HistoryTypeEnum;
import org.kitodo.data.database.helper.enums.PropertyType;
import org.kitodo.data.database.helper.enums.TaskEditType;
import org.kitodo.data.database.helper.enums.TaskStatus;
import org.kitodo.data.database.persistence.TaskDAO;
import org.kitodo.data.exceptions.DataException;
import org.kitodo.services.ServiceManager;

public class BatchStepHelper {
    private List<Task> steps;
    private static final Logger logger = LogManager.getLogger(BatchStepHelper.class);
    private Task currentStep;
    private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private List<ProcessProperty> processPropertyList;
    private ProcessProperty processProperty;
    private Map<Integer, PropertyListObject> containers = new TreeMap<>();
    private Integer container;
    private String myProblemStep;
    private String mySolutionStep;
    private String problemMessage;
    private String solutionMessage;
    private String processName = "";
    private String addToWikiField = "";
    private String script;
    private final ServiceManager serviceManager = new ServiceManager();
    private final WebDav myDav = new WebDav();
    private List<String> processNameList = new ArrayList<>();

    /**
     * Constructor.
     *
     * @param steps
     *            list of tasks
     */
    public BatchStepHelper(List<Task> steps) {
        this.steps = steps;
        for (Task s : steps) {
            this.processNameList.add(s.getProcess().getTitle());
        }
        if (steps.size() > 0) {
            this.currentStep = steps.get(0);
            this.processName = this.currentStep.getProcess().getTitle();
            loadProcessProperties(this.currentStep);
        }
    }

    public List<Task> getSteps() {
        return this.steps;
    }

    public void setSteps(List<Task> steps) {
        this.steps = steps;
    }

    public Task getCurrentStep() {
        return this.currentStep;
    }

    public void setCurrentStep(Task currentStep) {
        this.currentStep = currentStep;
    }

    /*
     * properties
     */

    public ProcessProperty getProcessProperty() {
        return this.processProperty;
    }

    public void setProcessProperty(ProcessProperty processProperty) {
        this.processProperty = processProperty;
    }

    public List<ProcessProperty> getProcessProperties() {
        return this.processPropertyList;
    }

    public int getPropertyListSize() {
        return this.processPropertyList.size();
    }

    public List<String> getProcessNameList() {
        return this.processNameList;
    }

    public void setProcessNameList(List<String> processNameList) {
        this.processNameList = processNameList;
    }

    public String getProcessName() {
        return this.processName;
    }

    /**
     * Set process' name.
     *
     * @param processName
     *            String
     */
    public void setProcessName(String processName) {
        this.processName = processName;
        for (Task s : this.steps) {
            if (s.getProcess().getTitle().equals(processName)) {
                this.currentStep = s;
                loadProcessProperties(this.currentStep);
                break;
            }
        }
    }

    /**
     * Save current property.
     */
    public void saveCurrentProperty() {
        List<ProcessProperty> ppList = getContainerProperties();
        for (ProcessProperty pp : ppList) {
            this.processProperty = pp;
            if (!this.processProperty.isValid()) {
                Helper.setFehlerMeldung("Property " + this.processProperty.getName() + " is not valid");
                return;
            }
            if (this.processProperty.getProzesseigenschaft() == null) {
                Property processProperty = new Property();
                processProperty.getProcesses().add(this.currentStep.getProcess());
                this.processProperty.setProzesseigenschaft(processProperty);
                this.serviceManager.getProcessService().getPropertiesInitialized(this.currentStep.getProcess())
                        .add(processProperty);
            }
            this.processProperty.transfer();

            Process p = this.currentStep.getProcess();
            List<Property> props = p.getProperties();
            for (Property processProperty : props) {
                if (processProperty.getTitle() == null) {
                    serviceManager.getProcessService().getPropertiesInitialized(p).remove(processProperty);
                }
            }
            for (Process process : this.processProperty.getProzesseigenschaft().getProcesses()) {
                if (!this.serviceManager.getProcessService().getPropertiesInitialized(process)
                        .contains(this.processProperty.getProzesseigenschaft())) {
                    this.serviceManager.getProcessService().getPropertiesInitialized(process)
                            .add(this.processProperty.getProzesseigenschaft());
                }
            }
            try {
                this.serviceManager.getProcessService().save(this.currentStep.getProcess());
                Helper.setMeldung("Property saved");
            } catch (DataException e) {
                logger.error(e);
                Helper.setFehlerMeldung("Properties could not be saved");
            }
        }
    }

    /**
     * Save current property for all.
     */
    public void saveCurrentPropertyForAll() {
        boolean error = false;
        List<ProcessProperty> ppList = getContainerProperties();
        for (ProcessProperty pp : ppList) {
            this.processProperty = pp;
            if (!this.processProperty.isValid()) {
                Helper.setFehlerMeldung("Property " + this.processProperty.getName() + " is not valid");
                return;
            }
            if (this.processProperty.getProzesseigenschaft() == null) {
                Property processProperty = new Property();
                processProperty.getProcesses().add(this.currentStep.getProcess());
                this.processProperty.setProzesseigenschaft(processProperty);
                this.serviceManager.getProcessService().getPropertiesInitialized(this.currentStep.getProcess())
                        .add(processProperty);
            }
            this.processProperty.transfer();

            Property processProperty = new Property();
            processProperty.setTitle(this.processProperty.getName());
            processProperty.setValue(this.processProperty.getValue());
            processProperty.setContainer(this.processProperty.getContainer());

            for (Task s : this.steps) {
                Process process = s.getProcess();
                if (!s.equals(this.currentStep)) {
                    if (processProperty.getTitle() != null) {
                        boolean match = false;
                        for (Property processPe : process.getProperties()) {
                            if (processPe.getTitle() != null) {
                                if (processProperty.getTitle().equals(processPe.getTitle())
                                        && processProperty.getContainer() == null ? processPe.getContainer() == null
                                                : processProperty.getContainer().equals(processPe.getContainer())) {
                                    processPe.setValue(processProperty.getValue());
                                    match = true;
                                    break;
                                }
                            }
                        }
                        if (!match) {
                            Property property = new Property();
                            property.setTitle(processProperty.getTitle());
                            property.setValue(processProperty.getValue());
                            property.setContainer(processProperty.getContainer());
                            property.setType(processProperty.getType());
                            property.getProcesses().add(process);
                            this.serviceManager.getProcessService().getPropertiesInitialized(process).add(property);
                        }
                    }
                } else {
                    if (!process.getProperties().contains(this.processProperty.getProzesseigenschaft())) {
                        this.serviceManager.getProcessService().getPropertiesInitialized(process)
                                .add(this.processProperty.getProzesseigenschaft());
                    }
                }

                List<Property> props = process.getProperties();
                for (Property nextProcessProperty : props) {
                    if (nextProcessProperty.getTitle() == null) {
                        this.serviceManager.getProcessService().getPropertiesInitialized(process)
                                .remove(nextProcessProperty);
                    }
                }

                try {
                    this.serviceManager.getProcessService().save(process);
                } catch (DataException e) {
                    error = true;
                    logger.error(e);
                    Helper.setFehlerMeldung("Properties for process " + process.getTitle() + " could not be saved");
                }
            }
        }
        if (!error) {
            Helper.setMeldung("Properties saved");
        }
    }

    private void loadProcessProperties(Task s) {
        this.containers = new TreeMap<>();
        this.processPropertyList = PropertyParser.getPropertiesForStep(s);
        List<Process> pList = new ArrayList<>();
        for (Task step : this.steps) {
            pList.add(step.getProcess());
        }
        for (ProcessProperty pt : this.processPropertyList) {
            if (pt.getProzesseigenschaft() == null) {
                Property processProperty = new Property();
                processProperty.getProcesses().add(s.getProcess());
                pt.setProzesseigenschaft(processProperty);
                this.serviceManager.getProcessService().getPropertiesInitialized(s.getProcess())
                        .add(processProperty);
                pt.transfer();
            }
            if (!this.containers.keySet().contains(pt.getContainer())) {
                PropertyListObject plo = new PropertyListObject(pt.getContainer());
                plo.addToList(pt);
                this.containers.put(pt.getContainer(), plo);
            } else {
                PropertyListObject plo = this.containers.get(pt.getContainer());
                plo.addToList(pt);
                this.containers.put(pt.getContainer(), plo);
            }
        }

        for (Process p : pList) {
            for (Property processProperty : p.getProperties()) {
                if (!this.containers.keySet().contains(processProperty.getContainer())) {
                    this.containers.put(processProperty.getContainer(), null);
                }
            }
        }
    }

    public Map<Integer, PropertyListObject> getContainers() {
        return this.containers;
    }

    /**
     * Get container size.
     *
     * @return size
     */
    public int getContainersSize() {
        if (this.containers == null) {
            return 0;
        }
        return this.containers.size();
    }

    /**
     * Get sorted properties.
     *
     * @return list of sorted properties
     */
    public List<ProcessProperty> getSortedProperties() {
        Comparator<ProcessProperty> comp = new ProcessProperty.CompareProperties();
        Collections.sort(this.processPropertyList, comp);
        return this.processPropertyList;
    }

    /**
     * Get containerless properties.
     *
     * @return list of containerless properties
     */
    public List<ProcessProperty> getContainerlessProperties() {
        List<ProcessProperty> answer = new ArrayList<>();
        for (ProcessProperty pp : this.processPropertyList) {
            if (pp.getContainer() == 0 && pp.getName() != null) {
                answer.add(pp);
            }
        }
        return answer;
    }

    public Integer getContainer() {
        return this.container;
    }

    /**
     * Set container.
     *
     * @param container
     *            Integer
     */
    public void setContainer(Integer container) {
        this.container = container;
        if (container != null && container > 0) {
            this.processProperty = getContainerProperties().get(0);
        }
    }

    /**
     * Get container properties.
     *
     * @return list of container properties
     */
    public List<ProcessProperty> getContainerProperties() {
        List<ProcessProperty> answer = new ArrayList<>();

        if (this.container != null && this.container > 0) {
            for (ProcessProperty pp : this.processPropertyList) {
                if (pp.getContainer() == this.container && pp.getName() != null) {
                    answer.add(pp);
                }
            }
        } else {
            answer.add(this.processProperty);
        }

        return answer;
    }

    /**
     * Duplicate container for single.
     *
     * @return empty String
     */
    public String duplicateContainerForSingle() {
        Integer currentContainer = this.processProperty.getContainer();
        List<ProcessProperty> plist = new ArrayList<>();
        // search for all properties in container
        for (ProcessProperty pt : this.processPropertyList) {
            if (pt.getContainer() == currentContainer) {
                plist.add(pt);
            }
        }
        int newContainerNumber = 0;
        if (currentContainer > 0) {
            newContainerNumber++;
            // find new unused container number
            boolean search = true;
            while (search) {
                if (!this.containers.containsKey(newContainerNumber)) {
                    search = false;
                } else {
                    newContainerNumber++;
                }
            }
        }
        // clone properties
        for (ProcessProperty pt : plist) {
            ProcessProperty newProp = pt.getClone(newContainerNumber);
            this.processPropertyList.add(newProp);
            this.processProperty = newProp;
            saveCurrentProperty();
        }
        loadProcessProperties(this.currentStep);

        return "";
    }

    private void saveStep() {
        Process p = this.currentStep.getProcess();
        List<Property> props = p.getProperties();
        for (Property processProperty : props) {
            if (processProperty.getTitle() == null) {
                this.serviceManager.getProcessService().getPropertiesInitialized(p).remove(processProperty);
            }
        }
        try {
            this.serviceManager.getProcessService().save(this.currentStep.getProcess());
        } catch (DataException e) {
            logger.error(e);
        }
    }

    /**
     * Duplicate container for all.
     *
     * @return empty String
     */
    public String duplicateContainerForAll() {
        Integer currentContainer = this.processProperty.getContainer();
        List<ProcessProperty> plist = new ArrayList<>();
        // search for all properties in container
        for (ProcessProperty pt : this.processPropertyList) {
            if (pt.getContainer() == currentContainer) {
                plist.add(pt);
            }
        }

        int newContainerNumber = 0;
        if (currentContainer > 0) {
            newContainerNumber++;
            boolean search = true;
            while (search) {
                if (!this.containers.containsKey(newContainerNumber)) {
                    search = false;
                } else {
                    newContainerNumber++;
                }
            }
        }
        // clone properties
        for (ProcessProperty pt : plist) {
            ProcessProperty newProp = pt.getClone(newContainerNumber);
            this.processPropertyList.add(newProp);
            this.processProperty = newProp;
            saveCurrentPropertyForAll();
        }
        loadProcessProperties(this.currentStep);
        return "";
    }

    /**
     * Error management for single.
     */
    public String reportProblemForSingle() {

        this.myDav.uploadFromHome(this.currentStep.getProcess());
        reportProblem();
        this.problemMessage = "";
        this.myProblemStep = "";
        saveStep();
        AktuelleSchritteForm asf = (AktuelleSchritteForm) Helper.getManagedBeanValue("#{AktuelleSchritteForm}");
        return asf.filterAlleStart();
    }

    /**
     * Error management for all.
     */
    public String reportProblemForAll() {
        for (Task s : this.steps) {
            this.currentStep = s;
            this.myDav.uploadFromHome(this.currentStep.getProcess());
            reportProblem();
            saveStep();
        }
        this.problemMessage = "";
        this.myProblemStep = "";
        AktuelleSchritteForm asf = (AktuelleSchritteForm) Helper.getManagedBeanValue("#{AktuelleSchritteForm}");
        return asf.filterAlleStart();
    }

    private void reportProblem() {
        Date myDate = new Date();
        this.currentStep.setProcessingStatusEnum(TaskStatus.LOCKED);
        this.currentStep.setEditTypeEnum(TaskEditType.MANUAL_SINGLE);
        currentStep.setProcessingTime(new Date());
        User ben = (User) Helper.getManagedBeanValue("#{LoginForm.myBenutzer}");
        if (ben != null) {
            currentStep.setProcessingUser(ben);
        }
        this.currentStep.setProcessingBegin(null);

        try {
            Task temp = null;
            for (Task s : this.currentStep.getProcess().getTasks()) {
                if (s.getTitle().equals(this.myProblemStep)) {
                    temp = s;
                }
            }
            if (temp != null) {
                temp.setProcessingStatusEnum(TaskStatus.OPEN);
                temp = serviceManager.getTaskService().setCorrectionStep(temp);
                temp.setProcessingEnd(null);

                Property processProperty = new Property();
                processProperty.setTitle(Helper.getTranslation("Korrektur notwendig"));
                processProperty.setValue("[" + this.formatter.format(new Date()) + ", "
                        + serviceManager.getUserService().getFullName(ben) + "] " + this.problemMessage);
                processProperty.setType(PropertyType.messageError);
                processProperty.getProcesses().add(this.currentStep.getProcess());
                this.currentStep.getProcess().getProperties().add(processProperty);

                String message = Helper.getTranslation("KorrekturFuer") + " " + temp.getTitle() + ": "
                        + this.problemMessage + " (" + serviceManager.getUserService().getFullName(ben) + ")";
                this.currentStep.getProcess()
                        .setWikiField(WikiFieldHelper.getWikiMessage(this.currentStep.getProcess(),
                                this.currentStep.getProcess().getWikiField(), "error", message));

                this.serviceManager.getTaskService().save(temp);
                this.serviceManager.getProcessService().getHistoryInitialized(this.currentStep.getProcess())
                        .add(new History(myDate, temp.getOrdering().doubleValue(), temp.getTitle(),
                                HistoryTypeEnum.taskError, temp.getProcess()));
                /*
                 * alle Schritte zwischen dem aktuellen und dem Korrekturschritt
                 * wieder schliessen
                 */
                @SuppressWarnings("unchecked")
                List<Task> alleSchritteDazwischen = Helper.getHibernateSession().createCriteria(Task.class)
                        .add(Restrictions.le("ordering", this.currentStep.getOrdering()))
                        .add(Restrictions.gt("ordering", temp.getOrdering())).addOrder(Order.asc("ordering"))
                        .createCriteria("process").add(Restrictions.idEq(this.currentStep.getProcess().getId()))
                        .list();
                for (Task task : alleSchritteDazwischen) {
                    task.setProcessingStatusEnum(TaskStatus.LOCKED);
                    task = serviceManager.getTaskService().setCorrectionStep(task);
                    task.setProcessingEnd(null);
                }
            }
            /*
             * den Prozess aktualisieren, so dass der Sortierungshelper
             * gespeichert wird
             */
        } catch (DataException e) {
            logger.error(e);
        }
    }

    /**
     * Get previous tasks for problem reporting.
     *
     * @return list of selected items
     */
    @SuppressWarnings("unchecked")
    public List<SelectItem> getPreviousStepsForProblemReporting() {
        List<SelectItem> answer = new ArrayList<>();
        List<Task> alleVorherigenSchritte = Helper.getHibernateSession().createCriteria(Task.class)
                .add(Restrictions.lt("ordering", this.currentStep.getOrdering())).addOrder(Order.desc("ordering"))
                .createCriteria("process").add(Restrictions.idEq(this.currentStep.getProcess().getId())).list();
        for (Task s : alleVorherigenSchritte) {
            answer.add(new SelectItem(s.getTitle(), serviceManager.getTaskService().getTitleWithUserName(s)));
        }
        return answer;
    }

    /**
     * Get next tasks for problem solution.
     *
     * @return list of selected items
     */
    @SuppressWarnings("unchecked")
    public List<SelectItem> getNextStepsForProblemSolution() {
        List<SelectItem> answer = new ArrayList<>();
        List<Task> alleNachfolgendenSchritte = Helper.getHibernateSession().createCriteria(Task.class)
                .add(Restrictions.gt("ordering", this.currentStep.getOrdering()))
                .add(Restrictions.eq("priority", 10)).addOrder(Order.asc("ordering")).createCriteria("process")
                .add(Restrictions.idEq(this.currentStep.getProcess().getId())).list();
        for (Task s : alleNachfolgendenSchritte) {
            answer.add(new SelectItem(s.getTitle(), serviceManager.getTaskService().getTitleWithUserName(s)));
        }
        return answer;
    }

    /**
     * Solve problem for single.
     *
     * @return String
     */
    public String solveProblemForSingle() {
        try {
            solveProblem();
            saveStep();
            this.solutionMessage = "";
            this.mySolutionStep = "";

            AktuelleSchritteForm asf = (AktuelleSchritteForm) Helper.getManagedBeanValue("#{AktuelleSchritteForm}");
            return asf.filterAlleStart();
        } catch (AuthenticationException e) {
            Helper.setFehlerMeldung(e.getMessage());
            return "";
        }
    }

    /**
     * Solve problem for all.
     *
     * @return String
     */
    public String solveProblemForAll() {
        try {
            for (Task s : this.steps) {
                this.currentStep = s;
                solveProblem();
                saveStep();
            }
            this.solutionMessage = "";
            this.mySolutionStep = "";

            AktuelleSchritteForm asf = (AktuelleSchritteForm) Helper.getManagedBeanValue("#{AktuelleSchritteForm}");
            return asf.filterAlleStart();
        } catch (AuthenticationException e) {
            Helper.setFehlerMeldung(e.getMessage());
            return "";
        }
    }

    private void solveProblem() throws AuthenticationException {
        User ben = (User) Helper.getManagedBeanValue("#{LoginForm.myBenutzer}");
        if (ben == null) {
            throw new AuthenticationException("userNotFound");
        }
        Date now = new Date();
        this.myDav.uploadFromHome(this.currentStep.getProcess());
        this.currentStep.setProcessingStatusEnum(TaskStatus.DONE);
        this.currentStep.setProcessingEnd(now);
        this.currentStep.setEditTypeEnum(TaskEditType.MANUAL_SINGLE);
        currentStep.setProcessingTime(new Date());
        currentStep.setProcessingUser(ben);

        try {
            Task temp = null;
            for (Task s : this.currentStep.getProcess().getTasks()) {
                if (s.getTitle().equals(this.mySolutionStep)) {
                    temp = s;
                }
            }
            if (temp != null) {
                /*
                 * alle Schritte zwischen dem aktuellen und dem Korrekturschritt
                 * wieder schliessen
                 */
                @SuppressWarnings("unchecked")
                List<Task> alleSchritteDazwischen = Helper.getHibernateSession().createCriteria(Task.class)
                        .add(Restrictions.ge("ordering", this.currentStep.getOrdering()))
                        .add(Restrictions.le("ordering", temp.getOrdering())).addOrder(Order.asc("ordering"))
                        .createCriteria("process").add(Restrictions.idEq(this.currentStep.getProcess().getId()))
                        .list();
                for (Task task : alleSchritteDazwischen) {
                    task.setProcessingStatusEnum(TaskStatus.DONE);
                    task.setProcessingEnd(now);
                    task.setPriority(0);
                    if (task.getId().intValue() == temp.getId().intValue()) {
                        task.setProcessingStatusEnum(TaskStatus.OPEN);
                        task = serviceManager.getTaskService().setCorrectionStep(task);
                        task.setProcessingEnd(null);
                        task.setProcessingTime(now);
                    }
                    this.serviceManager.getTaskService().save(task);
                }

                Property processProperty = new Property();
                processProperty.setTitle(Helper.getTranslation("Korrektur durchgefuehrt"));
                processProperty.setValue("[" + this.formatter.format(new Date()) + ", "
                        + serviceManager.getUserService().getFullName(ben) + "] "
                        + Helper.getTranslation("KorrekturloesungFuer") + " " + temp.getTitle() + ": "
                        + this.solutionMessage);
                processProperty.getProcesses().add(this.currentStep.getProcess());
                processProperty.setType(PropertyType.messageImportant);
                this.currentStep.getProcess().getProperties().add(processProperty);

                String message = Helper.getTranslation("KorrekturloesungFuer") + " " + temp.getTitle() + ": "
                        + this.solutionMessage + " (" + serviceManager.getUserService().getFullName(ben) + ")";
                this.currentStep.getProcess()
                        .setWikiField(WikiFieldHelper.getWikiMessage(this.currentStep.getProcess(),
                                this.currentStep.getProcess().getWikiField(), "info", message));
                /*
                 * den Prozess aktualisieren, so dass der Sortierungshelper
                 * gespeichert wird
                 */
            }
        } catch (DataException e) {
            logger.error(e);
        }
    }

    public String getProblemMessage() {
        return this.problemMessage;
    }

    public void setProblemMessage(String problemMessage) {
        this.problemMessage = problemMessage;
    }

    public String getMyProblemStep() {
        return this.myProblemStep;
    }

    public void setMyProblemStep(String myProblemStep) {
        this.myProblemStep = myProblemStep;
    }

    public String getSolutionMessage() {
        return this.solutionMessage;
    }

    public void setSolutionMessage(String solutionMessage) {
        this.solutionMessage = solutionMessage;
    }

    public String getMySolutionStep() {
        return this.mySolutionStep;
    }

    public void setMySolutionStep(String mySolutionStep) {
        this.mySolutionStep = mySolutionStep;
    }

    /**
     * sets new value for wiki field.
     *
     * @param inString
     *            input String
     */
    public void setWikiField(String inString) {
        this.currentStep.getProcess().setWikiField(inString);
    }

    public String getWikiField() {
        return this.currentStep.getProcess().getWikiField();
    }

    public String getAddToWikiField() {
        return this.addToWikiField;
    }

    public void setAddToWikiField(String addToWikiField) {
        this.addToWikiField = addToWikiField;
    }

    /**
     * Add to wiki field.
     */
    public void addToWikiField() {
        if (addToWikiField != null && addToWikiField.length() > 0) {
            User user = (User) Helper.getManagedBeanValue("#{LoginForm.myBenutzer}");
            String message = this.addToWikiField + " (" + serviceManager.getUserService().getFullName(user) + ")";
            this.currentStep.getProcess().setWikiField(WikiFieldHelper.getWikiMessage(this.currentStep.getProcess(),
                    this.currentStep.getProcess().getWikiField(), "user", message));
            this.addToWikiField = "";
            try {
                this.serviceManager.getProcessService().save(this.currentStep.getProcess());
            } catch (DataException e) {
                logger.error(e);
            }
        }
    }

    /**
     * Add to wiki field for all.
     */
    public void addToWikiFieldForAll() {
        if (addToWikiField != null && addToWikiField.length() > 0) {
            User user = (User) Helper.getManagedBeanValue("#{LoginForm.myBenutzer}");
            String message = this.addToWikiField + " (" + serviceManager.getUserService().getFullName(user) + ")";
            for (Task s : this.steps) {
                s.getProcess().setWikiField(WikiFieldHelper.getWikiMessage(s.getProcess(),
                        s.getProcess().getWikiField(), "user", message));
                try {
                    this.serviceManager.getProcessService().save(s.getProcess());
                } catch (DataException e) {
                    logger.error(e);
                }
            }
            this.addToWikiField = "";
        }
    }

    public String getScript() {
        return this.script;
    }

    public void setScript(String script) {
        this.script = script;
    }

    /**
     * Execute script.
     */
    public void executeScript() throws DataException {
        for (Task step : this.steps) {
            if (serviceManager.getTaskService().getAllScripts(step).containsKey(this.script)) {
                String scriptPath = serviceManager.getTaskService().getAllScripts(step).get(this.script);
                serviceManager.getTaskService().executeScript(step, scriptPath, false);
            }
        }
    }

    /**
     * Export DMS.
     */
    public void exportDMS() {
        for (Task step : this.steps) {
            ExportDms export = new ExportDms();
            try {
                export.startExport(step.getProcess());
            } catch (Exception e) {
                Helper.setFehlerMeldung("Error on export", e.getMessage());
                logger.error(e);
            }
        }
    }

    /**
     * Not sure.
     *
     * @return String
     */
    public String batchDurchBenutzerZurueckgeben() {

        for (Task s : this.steps) {

            this.myDav.uploadFromHome(s.getProcess());
            s.setProcessingStatusEnum(TaskStatus.OPEN);
            if (serviceManager.getTaskService().isCorrectionStep(s)) {
                s.setProcessingBegin(null);
            }
            s.setEditTypeEnum(TaskEditType.MANUAL_MULTI);
            currentStep.setProcessingTime(new Date());
            User ben = (User) Helper.getManagedBeanValue("#{LoginForm.myBenutzer}");
            if (ben != null) {
                currentStep.setProcessingUser(ben);
            }

            try {
                this.serviceManager.getProcessService().save(s.getProcess());
            } catch (DataException e) {
                logger.error(e);
            }
        }
        AktuelleSchritteForm asf = (AktuelleSchritteForm) Helper.getManagedBeanValue("#{AktuelleSchritteForm}");
        return asf.filterAlleStart();
    }

    /**
     * Not sure.
     *
     * @return String
     */
    public String batchDurchBenutzerAbschliessen() throws DAOException, DataException {

        // for (ProcessProperty pp : this.processPropertyList) {
        // this.processProperty = pp;
        // saveCurrentPropertyForAll();
        // }
        for (Task s : this.steps) {
            boolean error = false;
            if (s.getValidationPlugin() != null && s.getValidationPlugin().length() > 0) {
                IValidatorPlugin ivp = (IValidatorPlugin) PluginLoader.getPluginByTitle(PluginType.Validation,
                        s.getValidationPlugin());
                if (ivp != null) {
                    ivp.setStep(s);
                    if (!ivp.validate()) {
                        error = true;
                    }
                } else {
                    Helper.setFehlerMeldung("ErrorLoadingValidationPlugin");
                }
            }

            if (s.isTypeImagesWrite()) {
                try {
                    HistoryAnalyserJob.updateHistory(s.getProcess());
                } catch (Exception e) {
                    Helper.setFehlerMeldung("Error while calculation of storage and images", e);
                }
            }

            if (s.isTypeCloseVerify()) {
                if (s.isTypeMetadata() && ConfigCore.getBooleanParameter("useMetadatenvalidierung")) {
                    MetadatenVerifizierung mv = new MetadatenVerifizierung();
                    mv.setAutoSave(true);
                    if (!mv.validate(s.getProcess())) {
                        error = true;
                    }
                }
                if (s.isTypeImagesWrite()) {
                    MetadatenImagesHelper mih = new MetadatenImagesHelper(null, null);
                    try {
                        if (!mih.checkIfImagesValid(s.getProcess().getTitle(),
                                serviceManager.getProcessService().getImagesOrigDirectory(false, s.getProcess()))) {
                            error = true;
                        }
                    } catch (Exception e) {
                        Helper.setFehlerMeldung("Error on image validation: ", e);
                    }
                }

                loadProcessProperties(s);

                for (ProcessProperty prop : processPropertyList) {

                    if (prop.getCurrentStepAccessCondition().equals(AccessCondition.WRITEREQUIRED)
                            && (prop.getValue() == null || prop.getValue().equals(""))) {
                        List<String> parameter = new ArrayList<>();
                        parameter.add(prop.getName());
                        parameter.add(s.getProcess().getTitle());
                        Helper.setFehlerMeldung(Helper.getTranslation("BatchPropertyEmpty", parameter));
                        error = true;
                    } else if (!prop.isValid()) {
                        List<String> parameter = new ArrayList<>();
                        parameter.add(prop.getName());
                        parameter.add(s.getProcess().getTitle());
                        Helper.setFehlerMeldung(Helper.getTranslation("BatchPropertyValidation", parameter));
                        error = true;
                    }
                }
            }
            if (!error) {
                this.myDav.uploadFromHome(s.getProcess());
                TaskDAO taskDAO = new TaskDAO();
                Task task = taskDAO.find(s.getId());
                task.setEditTypeEnum(TaskEditType.MANUAL_MULTI);
                serviceManager.getTaskService().close(s, true);
            }
        }
        AktuelleSchritteForm asf = (AktuelleSchritteForm) Helper.getManagedBeanValue("#{AktuelleSchritteForm}");
        return asf.filterAlleStart();
    }

    /**
     * Get script' names.
     *
     * @return list of names
     */
    public List<String> getScriptnames() {
        List<String> answer = new ArrayList<>();
        answer.addAll(serviceManager.getTaskService().getAllScripts(getCurrentStep()).keySet());
        return answer;
    }

    public List<Integer> getContainerList() {
        return new ArrayList<>(this.containers.keySet());
    }
}