de.fau.osr.gui.Controller.GuiController.java Source code

Java tutorial

Introduction

Here is the source code for de.fau.osr.gui.Controller.GuiController.java

Source

/*
 * This file is part of ReqTracker.
 *
 * Copyright (C) 2015 Taleh Didover, Florian Gerdes, Dmitry Gorelenkov,
 *     Rajab Hassan Kaoneka, Katsiaryna Krauchanka, Tobias Polzer,
 *     Gayathery Sathya, Lukas Tajak
 *
 * ReqTracker is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * ReqTracker is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with ReqTracker.  If not, see <http://www.gnu.org/licenses/>.
 */
package de.fau.osr.gui.Controller;

import java.awt.EventQueue;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Supplier;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import javax.swing.JList;

import org.eclipse.jgit.api.errors.GitAPIException;

import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;

import de.fau.osr.bl.RequirementsTraceabilityMatrixByImpact;
import de.fau.osr.bl.Tracker;
import de.fau.osr.core.db.CSVFileDataSource;
import de.fau.osr.core.db.CompositeDataSource;
import de.fau.osr.core.db.DBDataSource;
import de.fau.osr.core.db.DataSource;
import de.fau.osr.core.db.HibernateUtil;
import de.fau.osr.core.db.VCSDataSource;
import de.fau.osr.core.vcs.impl.GitVcsClient;
import de.fau.osr.core.vcs.interfaces.VcsClient;
import de.fau.osr.gui.Authentication.Login;
import de.fau.osr.gui.Components.PathDEsJTree;
import de.fau.osr.gui.Model.Collection_Model_Impl;
import de.fau.osr.gui.Model.I_Collection_Model;
import de.fau.osr.gui.Model.TrackerAdapter;
import de.fau.osr.gui.Model.DataElements.Commit;
import de.fau.osr.gui.Model.DataElements.Configuration;
import de.fau.osr.gui.Model.DataElements.DataElement;
import de.fau.osr.gui.Model.DataElements.PathDE;
import de.fau.osr.gui.Model.DataElements.Requirement;
import de.fau.osr.gui.View.Cleaner;
import de.fau.osr.gui.View.GuiViewElementHandler;
import de.fau.osr.gui.View.PopupManager;
import de.fau.osr.gui.View.TracabilityMatrix_View;
import de.fau.osr.gui.View.TraceabilityMatrixByImpactViewHandlerPanel;
import de.fau.osr.gui.View.ElementHandler.ElementHandler;
import de.fau.osr.gui.View.ElementHandler.Linkage_ElementHandler;
import de.fau.osr.gui.View.ElementHandler.Requirement_Detail_ElementHandler;
import de.fau.osr.gui.View.ElementHandler.Requirement_ElementHandler;
import de.fau.osr.gui.View.Presenter.Presenter;
import de.fau.osr.gui.View.Presenter.Presenter_Commit;
import de.fau.osr.gui.View.Presenter.Presenter_Requirement;
import de.fau.osr.gui.util.filtering.FilterByExactString;
import de.fau.osr.util.AppProperties;
import de.fau.osr.util.parser.CommitMessageParser;

/**
 * Using a MVC-Pattern for the GUI. The Controller class fetches the data from
 * the Modell and passes it to the View. Additional it eventually sets Events to
 * the GUI-Elements, so that an action can call the appropriate controller
 * method, within which the data is fetched again ...
 */
public class GuiController {
    // Whether the user gets another chance to input correct data
    enum RetryStatus {
        Retry, Exit, Cancel
    }

    private static final int MAX_RETRIES = 3;
    private RetryStatus Status;

    GuiViewElementHandler elementHandler;
    Cleaner cleaner;
    PopupManager popupManager = new PopupManager();
    TracabilityMatrix_View tracability_view = new TracabilityMatrix_View();

    I_Collection_Model i_Collection_Model;

    JList<Presenter> requirements_JList;
    JList<Presenter> commitMessages_JList;

    /**
     * <tt>PathDE</tt>'s in a tree component
     */
    PathDEsJTree PathDEsJTree;

    JList<Presenter> requirements2Lines_JList;
    JList<Presenter> code_JList;

    // filtering/finding a specific reqiurementID
    Predicate<Requirement> requirementIDFiltering;
    private Configuration configuration = null;

    /**
     * Called to start the initially starts the program. Setting up GUI and
     * displaying the initial data: All Requirements from external
     * tool/DB(jira...)
     */
    public GuiController() {
        Status = RetryStatus.Retry;

        EventQueue.invokeLater(new Runnable() {

            public void run() {

                /* for (int i = 0; true; i++) {
                if(!popupManager.Authentication()){
                    Status = RetryStatus.Exit;
                    handleError();
                }
                    
                File repoFile = null;
                try {
                    repoFile = popupManager.Repo_OpeningDialog();
                } catch (IOException e1) {
                    System.exit(0);
                }
                    
                try {
                    Pattern reqPatternString = Pattern.compile(popupManager
                            .Pattern_OpeningDialog(AppProperties
                                    .GetValue("RequirementPattern")));
                    i_Collection_Model = reInitModel(null, null, repoFile,
                            reqPatternString);
                    break;
                } catch (PatternSyntaxException | IOException e) {
                    if (i >= MAX_RETRIES) {
                        Status = RetryStatus.Exit;
                    }
                    popupManager.showErrorDialog(e.getMessage());
                    handleError();
                } catch (Exception e) {
                    Status = RetryStatus.Exit;
                    popupManager.showErrorDialog("Fatal Error:\n"
                            + e.getMessage());
                    handleError();
                }
                 }*/

                elementHandler = new GuiViewElementHandler(GuiController.this);
                cleaner = new Cleaner(elementHandler);

            }
        });
    }

    public I_Collection_Model getI_Collection_Model() {
        return this.i_Collection_Model;
    }

    public Predicate<Requirement> getRequirementIDFiltering() {
        return requirementIDFiltering;
    }

    public void setRequirementIDFiltering(FilterByExactString requirementIDFiltering) {
        this.requirementIDFiltering = requirementIDFiltering;
    }

    /**
     * Navigation: ->Requirements Clear: All Setting: Requirements Using:
     * getRequirements
     */
    public void requirementsFromDB() {
        cleaner.clearAll();

        Supplier<Collection<? extends DataElement>> fetching = () -> {
            try {
                return i_Collection_Model.getRequirements(requirementIDFiltering);
            } catch (IOException e) {
                popupManager.showErrorDialog("Internal Storage Error");
                return new ArrayList<DataElement>();
            }
        };

        ElementHandler specificElementHandler = elementHandler.getRequirement_ElementHandler();

        Runnable buttonAction = () -> {
            commitsFromRequirement();
            filesFromRequirement();
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);
    }

    public void requirementsFromDBForRequirementTab() {
        Supplier<Collection<? extends DataElement>> fetching = () -> {
            try {
                return i_Collection_Model.getRequirements(requirementIDFiltering);
            } catch (IOException e) {
                popupManager.showErrorDialog("Internal Storage Error");
                return new ArrayList<DataElement>();
            }
        };

        Requirement_Detail_ElementHandler detail_handler = elementHandler.getRequirement_Detail_ElementHandler();
        Requirement_ElementHandler tabAndReqsList_elementHandler = elementHandler
                .getRequirement_ElementHandlerRequirementTab();

        Runnable buttonAction = () -> {
            Collection<DataElement> dataElements = tabAndReqsList_elementHandler.getSelection(new Visitor_Swing());
            Presenter[] presenters = Transformer.transformDataElementsToPresenters(dataElements);

            detail_handler.setScrollPane_Content(presenters);
        };

        Transformer.process(tabAndReqsList_elementHandler, buttonAction, fetching);

        detail_handler.setListenerOnSaveClick(e1 -> {
            Collection<DataElement> selectedReqs = tabAndReqsList_elementHandler.getSelection(new Visitor_Swing());
            if (selectedReqs.size() < 1) {
                popupManager.showErrorDialog("select a requirement");
                return;
            }

            Requirement lastSelected = (Requirement) Iterables.getLast(selectedReqs);

            String id = lastSelected.getID();
            String title = detail_handler.getTitle().getText();
            String description = detail_handler.getDescription().getText();

            String resultMsg = "Saved!";
            if (!getI_Collection_Model().updateRequirement(id, title, description)) {
                resultMsg = "Failed!";
            }
            popupManager.showInformationDialog(resultMsg);
        }

        );
    }

    public void requirementsFromDBForManagementTab() {

        Supplier<Collection<? extends DataElement>> fetching = () -> {
            try {
                return i_Collection_Model.getRequirements(requirementIDFiltering);
            } catch (IOException e) {
                popupManager.showErrorDialog("Internal Storage Error");
                return new ArrayList<DataElement>();
            }
        };

        ElementHandler specificElementHandler = elementHandler.getRequirement_Handler_ManagementTab();

        Runnable buttonAction = () -> {
            ArrayList<? extends DataElement> dataElements = new ArrayList<DataElement>(
                    specificElementHandler.getSelection(new Visitor_Swing()));
            elementHandler.getLinkage_ElementHandler().setRequirement(
                    (Presenter_Requirement) dataElements.get(dataElements.size() - 1).visit(new Visitor_Swing()));
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);
    }

    public void commitsFromDBForManagementTab() {
        Supplier<Collection<? extends DataElement>> fetching = () -> {
            return i_Collection_Model.getCommitsFromDB();
        };

        ElementHandler specificElementHandler = elementHandler.getCommit_Handler_ManagementTab();

        Runnable buttonAction = () -> {
            ArrayList<? extends DataElement> dataElements = new ArrayList<DataElement>(
                    specificElementHandler.getSelection(new Visitor_Swing()));
            elementHandler.getLinkage_ElementHandler().setCommit(
                    (Presenter_Commit) dataElements.get(dataElements.size() - 1).visit(new Visitor_Swing()));
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);
    }

    /**
     * initialize linkage management tab
     */
    public void initLinkageManagementTab() {
        requirementsFromDBForManagementTab();
        commitsFromDBForManagementTab();

        Linkage_ElementHandler linkageHandler = elementHandler.getLinkage_ElementHandler();

        linkageHandler
                .setOnClickAddLinkage(e -> addLinkage(linkageHandler.getRequirement(), linkageHandler.getCommit()));
    }

    /**
     * Navigation: ->Requirements->Commit Clear: Files/Code/ImpactPercentage
     * Setting: Commits Using: getCommitsByRequirement
     */
    void commitsFromRequirement() {
        cleaner.clearFiles();
        cleaner.clearCode();

        Supplier<Collection<? extends DataElement>> fetching = () -> {
            Collection<DataElement> dataElements = elementHandler.getRequirement_ElementHandler()
                    .getSelection(new Visitor_Swing());
            try {
                return i_Collection_Model.getCommitsByRequirement((Collection) dataElements);
            } catch (IOException e) {
                popupManager.showErrorDialog("Internal Storage Error");
                return new ArrayList<DataElement>();
            }
        };

        ElementHandler specificElementHandler = elementHandler.getCommit_ElementHandler();

        Runnable buttonAction = () -> {
            filesByCommitAndRequirement();
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);
    }

    /**
     * Navigation: ->Requirements->File Clear: Code/ImpactPercentage Setting:
     * Files Using: getFilesFromRequirement
     */
    void filesFromRequirement() {
        cleaner.clearCode();

        Supplier<List<? extends DataElement>> fetching1 = () -> {
            Collection<DataElement> dataElements = elementHandler.getRequirement_ElementHandler()
                    .getSelection(new Visitor_Swing());
            try {
                return i_Collection_Model.getFilesByRequirement((Collection) dataElements);
            } catch (IOException e) {
                popupManager.showErrorDialog("Internal Storage Error");
                return new ArrayList<DataElement>();
            }
        };

        Supplier<List<? extends DataElement>> fetching2 = () -> {
            Collection<DataElement> reqs = elementHandler.getRequirement_ElementHandler()
                    .getSelection(new Visitor_Swing());
            try {
                // !!! getFilesByRequirement is called 2nd time :-(
                List<? extends DataElement> paths = i_Collection_Model.getFilesByRequirement((Collection) reqs);
                return i_Collection_Model.getImpactForRequirementAndFile((Collection) reqs, (List) paths);
            } catch (IOException e) {
                popupManager.showErrorDialog("Internal Storage Error");
                return new ArrayList<DataElement>();
            }
        };

        ElementHandler specificElementHandler = elementHandler.getPathDE_ElementHandler();

        Runnable buttonAction = () -> {
            this.commitsFromRequirementAndFile();
            this.codeFromFile();
        };

        Transformer.process(specificElementHandler, buttonAction, fetching1, fetching2);
    }

    /**
     * Navigation: ->Requirements->File->Commit ->File->Requirement->Commit
     * Clear: Setting: Commits Using: commitsFromRequirementAndFile
     */
    void commitsFromRequirementAndFile() {

        Supplier<Collection<? extends DataElement>> fetching = () -> {
            Collection<DataElement> requirements = elementHandler.getRequirement_ElementHandler()
                    .getSelection(new Visitor_Swing());
            Collection<DataElement> files = elementHandler.getPathDE_ElementHandler()
                    .getSelection(new Visitor_Swing());
            try {
                return i_Collection_Model.getCommitsByRequirementAndFile((Collection) requirements,
                        (Collection) files);
            } catch (IOException e) {
                popupManager.showErrorDialog("Internal storing Error");
                return new ArrayList<DataElement>();
            }
        };

        ElementHandler specificElementHandler = elementHandler.getCommit_ElementHandler();

        Runnable buttonAction = () -> {
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);
    }

    /**
     * Navigation: ->Files->Code Clear: ImpactPercentage Setting: Code Using:
     * getChangeDataFromFileIndex
     *
     * Just displays latest file content.
     */
    void codeFromFile() {
        cleaner.clearCode();

        Supplier<Collection<? extends DataElement>> fetching = () -> {

            Collection<DataElement> files = elementHandler.getPathDE_ElementHandler()
                    .getSelection(new Visitor_Swing());
            try {
                return i_Collection_Model.getAnnotatedLinesByFile((Collection) files);
            } catch (IOException | GitAPIException e) {
                popupManager.showErrorDialog("Internal storing Error" + e);
                return new ArrayList<DataElement>();
            }
        };

        Collection<DataElement> requirements = elementHandler.getRequirement_ElementHandler()
                .getSelection(new Visitor_Swing());

        Transformer.setVisitor(new Visitor_Swing(requirements));

        ElementHandler specificElementHandler = elementHandler.getCode_ElementHandler();

        Runnable buttonAction = () -> {
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);

        specificElementHandler = elementHandler.getImpact_ElementHandler();
        Transformer.setVisitor(new Visitor_Swing());

        Transformer.process(specificElementHandler, buttonAction, fetching);
    }

    //
    //    /**
    //     * Navigation: ->File->Code->Requirements Clear: Commits Setting:
    //     * Requirements Using: getRequirementsForBlame
    //     * 
    //     * @param file
    //     * @param codeIndex
    //     */
    //    void requirementsFromCode() {
    //        cleaner.clearCommits();
    //
    //        Supplier<Collection<? extends DataElement>> fetching = () -> {
    //            try {
    //                return i_Collection_Model.AnnotatedLinesFromFile(files);
    //            } catch (IOException | GitAPIException e) {
    //                popupManager.showErrorDialog("Internal storing Error" + e);
    //                return new ArrayList<DataElement>();
    //            }
    //        };
    //
    //        ElementHandler specificElementHandler = elementHandler
    //                .getRequirement_ElementHandler();
    //
    //        Runnable buttonAction = () -> {
    //        };
    //
    //        Transformer.process(specificElementHandler, buttonAction, fetching);
    //    }
    //
    /**
     * Navigation: ->Files Clear: All Setting: Files Using: getAllPathDEs
     */
    public void filesFromDB() {

        cleaner.clearAll();

        Supplier<Collection<? extends DataElement>> fetching = i_Collection_Model::getFilePaths;

        ElementHandler specificElementHandler = elementHandler.getPathDE_ElementHandler();

        Runnable buttonAction = () -> {
            requirementsFromFile();
            commitsFromFile();
            codeFromFile();
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);
    }

    /**
     * Navigation: ->File->Requirement Clear: Setting: Requirement Using:
     * getRequirementsByFile
     */
    void requirementsFromFile() {

        Supplier<Collection<? extends DataElement>> fetching = () -> {
            Collection<DataElement> files = elementHandler.getPathDE_ElementHandler()
                    .getSelection(new Visitor_Swing());
            //cast collection of DataElements to PathDEs
            ArrayList<PathDE> PathDEs = new ArrayList<>();
            for (DataElement de : files) {
                PathDEs.add((PathDE) de);
            }

            try {
                return i_Collection_Model.getRequirementsByFile(PathDEs);
            } catch (IOException e) {
                popupManager.showErrorDialog("File not found!");
                return new ArrayList<DataElement>();
            }
        };

        ElementHandler specificElementHandler = elementHandler.getRequirement_ElementHandler();

        Runnable buttonAction = () -> {
            commitsFromRequirementAndFile();
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);
    }

    /**
     * Navigation: ->File->Commit Clear: Setting: Commits Using:
     * getCommitsByFile
     */
    void commitsFromFile() {

        Supplier<Collection<? extends DataElement>> fetching = () -> {
            Collection<DataElement> files = elementHandler.getPathDE_ElementHandler()
                    .getSelection(new Visitor_Swing());
            return i_Collection_Model.getCommitsByFile((Collection) files);
        };

        ElementHandler specificElementHandler = elementHandler.getCommit_ElementHandler();

        Runnable buttonAction = () -> {
            requirementsFromFileAndCommit();
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);
    }

    /**
     * Navigation: ->Files->Commit->Requirement Clear: Setting: Requirement
     * Using: getRequirementsFromFileAndCommit
     */
    void requirementsFromFileAndCommit() {

        Supplier<Collection<? extends DataElement>> fetching = () -> {
            Collection<DataElement> files = elementHandler.getPathDE_ElementHandler()
                    .getSelection(new Visitor_Swing());
            Collection<DataElement> commits = elementHandler.getCommit_ElementHandler()
                    .getSelection(new Visitor_Swing());
            try {
                return i_Collection_Model.getRequirementsByFileAndCommit((Collection) commits, (Collection) files);
            } catch (IOException e) {
                popupManager.showErrorDialog("Internal storing Error");
                return new ArrayList<DataElement>();
            }
        };

        ElementHandler specificElementHandler = elementHandler.getRequirement_ElementHandler();

        Runnable buttonAction = () -> {
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);

    }

    /**
     * Navigation: ->Commits Clear: All Setting: Commits Using: getCommits
     */
    @Deprecated
    public void commitsFromDB() {
        cleaner.clearAll();

        Supplier<Collection<? extends DataElement>> fetching = () -> {
            return i_Collection_Model.getCommitsFromDB();
        };

        ElementHandler specificElementHandler = elementHandler.getCommit_ElementHandler();

        Runnable buttonAction = () -> {
            filesFromCommit();
            requirementsFromCommit();
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);
    }

    /**
     * Navigation: ->Commit->Files Clear: Code/ImpactPercentage Setting: Files
     * Using: getFilesByCommit
     */
    @Deprecated
    void filesFromCommit() {
        cleaner.clearCode();

        Supplier<List<? extends DataElement>> fetching1 = () -> {
            Collection<DataElement> commits = elementHandler.getCommit_ElementHandler()
                    .getSelection(new Visitor_Swing());
            try {
                return i_Collection_Model.getFilesByCommit((Collection) commits);
            } catch (FileNotFoundException e) {
                popupManager.showErrorDialog("Internal storing Error");
                return new ArrayList<DataElement>();
            }
        };

        Supplier<List<? extends DataElement>> fetching2 = () -> {
            Collection<DataElement> dataElements = elementHandler.getRequirement_ElementHandler()
                    .getSelection(new Visitor_Swing());
            Collection<DataElement> commits = elementHandler.getCommit_ElementHandler()
                    .getSelection(new Visitor_Swing());
            try {
                List<? extends DataElement> paths = i_Collection_Model.getFilesByCommit((Collection) commits);
                return i_Collection_Model.getImpactForRequirementAndFile((Collection) dataElements, (List) paths);
            } catch (IOException e) {
                popupManager.showErrorDialog("Internal Storage Error");
                return new ArrayList<DataElement>();
            }
        };

        ElementHandler specificElementHandler = elementHandler.getPathDE_ElementHandler();

        Runnable buttonAction = () -> {
            codeFromFile();
        };

        Transformer.process(specificElementHandler, buttonAction, fetching1, fetching2);
    }

    /**
     * Navigation: Req->Commit-> Clear: Code/ImpactPercentage Setting: Files
     * Using: getFilesByCommit
     */
    void filesByCommitAndRequirement() {
        cleaner.clearCode();

        Supplier<List<? extends DataElement>> fetching1 = () -> {
            Collection<DataElement> commits = elementHandler.getCommit_ElementHandler()
                    .getSelection(new Visitor_Swing());
            Collection<DataElement> reqs = elementHandler.getRequirement_ElementHandler()
                    .getSelection(new Visitor_Swing());
            try {
                return i_Collection_Model.getFilesByCommitAndRequirement((Collection) commits, (Collection) reqs);
            } catch (FileNotFoundException e) {
                popupManager.showErrorDialog("Internal storing Error");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return new ArrayList<DataElement>();
        };

        Supplier<List<? extends DataElement>> fetching2 = () -> {
            Collection<DataElement> reqs = elementHandler.getRequirement_ElementHandler()
                    .getSelection(new Visitor_Swing());
            Collection<DataElement> commits = elementHandler.getCommit_ElementHandler()
                    .getSelection(new Visitor_Swing());
            try {
                List<? extends DataElement> paths = i_Collection_Model
                        .getFilesByCommitAndRequirement((Collection) commits, (Collection) reqs);
                return i_Collection_Model.getImpactForRequirementAndFile((Collection) reqs, (List) paths);
            } catch (IOException e) {
                popupManager.showErrorDialog("Internal Storage Error");
                return new ArrayList<DataElement>();
            }
        };

        ElementHandler specificElementHandler = elementHandler.getPathDE_ElementHandler();

        Runnable buttonAction = () -> {
            codeFromFile();
        };

        Transformer.process(specificElementHandler, buttonAction, fetching1, fetching2);
    }

    /**
     * Navigation: ->Commits->Requirements Clear: Setting: Requirements Using:
     * getRequirementsByCommit
     */
    void requirementsFromCommit() {

        Supplier<Collection<? extends DataElement>> fetching = () -> {
            Collection<DataElement> commits = elementHandler.getCommit_ElementHandler()
                    .getSelection(new Visitor_Swing());
            try {
                return i_Collection_Model.getRequirementsByCommit((Collection) commits);
            } catch (IOException e) {
                popupManager.showErrorDialog("Internal storing Error");
                return new ArrayList<DataElement>();
            }
        };

        ElementHandler specificElementHandler = elementHandler.getRequirement_ElementHandler();

        Runnable buttonAction = () -> {
            codeFromFile();
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);
    }

    /**
     * For button AddLinkage
     */
    public void requirementsAndCommitsFromDB() {
        cleaner.clearAll();

        Supplier<Collection<? extends DataElement>> fetching = () -> {
            try {
                return i_Collection_Model.getRequirements(requirementIDFiltering);
            } catch (IOException e) {
                popupManager.showErrorDialog("Internal storing Error");
                return new ArrayList<DataElement>();
            }
        };

        ElementHandler specificElementHandler = elementHandler.getRequirement_ElementHandler();

        Runnable buttonAction = () -> {
            RequirementToLinkage();
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);

        fetching = () -> {
            return i_Collection_Model.getCommitsFromDB();
        };

        specificElementHandler = elementHandler.getCommit_ElementHandler();

        buttonAction = () -> {
            CommitToLinkage();
        };

        Transformer.process(specificElementHandler, buttonAction, fetching);

        elementHandler.getLinkage_ElementHandler().switchButtonAction();
        elementHandler.getLinkage_ElementHandler().setDataLayerChanged(true);
    }

    void RequirementToLinkage() {
        DataElement requirement = elementHandler.getRequirement_ElementHandler().getSelection(new Visitor_Swing())
                .iterator().next();
        elementHandler.getLinkage_ElementHandler()
                .setRequirement((Presenter_Requirement) requirement.visit(new Visitor_Swing()));
    }

    void CommitToLinkage() {
        DataElement commit = elementHandler.getCommit_ElementHandler().getSelection(new Visitor_Swing()).iterator()
                .next();
        elementHandler.getLinkage_ElementHandler().setCommit((Presenter_Commit) commit.visit(new Visitor_Swing()));
    }

    /**
     * For now only terminated the application if the user retried some input to
     * often. Later on should handle all actions that have to be completed
     * before exit.
     */
    void handleError() {
        if (Status == RetryStatus.Exit) {
            System.exit(1);
        }
    }

    /**
     * For reconfiguring the repository to a new path while the application is
     * running Once this method is successful, the application refers to the new
     * repository
     */

    void reConfigureRepository() throws IOException {
        I_Collection_Model guiModelTrial = i_Collection_Model;
        for (int i = 0; i <= MAX_RETRIES; i++) {
            if (i == MAX_RETRIES) {
                Status = RetryStatus.Cancel;
                popupManager.showErrorDialog("Maximum retries exceeded");
                return;
            }
            File repoFile = null;
            try {
                repoFile = popupManager.Repo_OpeningDialog();
            } catch (IOException e1) {

            }
            if (repoFile == null) {
                Status = RetryStatus.Cancel;
                return;
            }
            try {
                guiModelTrial = reInitModel(null, null, repoFile, i_Collection_Model.getCurrentRequirementPattern(),
                        false);
                popupManager.showInformationDialog("Repository Path modified to " + repoFile.getPath());
                break;
            } catch (IOException | RuntimeException e) {

                popupManager.showErrorDialog(e.getMessage());
                handleError();
            }
        }
        i_Collection_Model = guiModelTrial;
        requirementsFromDB();
    }

    /**
     * For reconfiguring the requirement pattern to a new pattern while the
     * application is running Once this method is successful, the application
     * refers to the new requirement pattern
     */
    void reConfigureRequirementPattern() throws IOException {
        I_Collection_Model guiModelTrial = i_Collection_Model;
        for (int i = 0; true; i++) {
            if (i == MAX_RETRIES) {
                Status = RetryStatus.Cancel;
                popupManager.showErrorDialog("Maximum retries exceeded");
                return;
            }
            Pattern reqPattern;
            try {
                reqPattern = Pattern.compile(popupManager
                        .Pattern_OpeningDialog(i_Collection_Model.getCurrentRequirementPattern().toString()));
            } catch (Exception e) {
                // todo error message about bad pattern
                Status = RetryStatus.Cancel;
                return;
            }

            try {
                guiModelTrial = reInitModel(null, null, new File(i_Collection_Model.getCurrentRepositoryPath()),
                        reqPattern, false);
                popupManager.showInformationDialog("Requirement Pattern modified to " + reqPattern);
                break;
            } catch (RuntimeException | IOException e) {
                popupManager.showErrorDialog(e.getMessage());
                handleError();
            }
        }
        i_Collection_Model = guiModelTrial;
        requirementsFromDB();

    }

    /**
     * method to divert configuration calls
     */
    public void reConfigure() throws IOException {
        switch (popupManager.Configure_OptionDialog()) {
        // these values have to be replaced by some enums
        case 0:
            reConfigureRepository();
            break;
        case 1:
            reConfigureRequirementPattern();
            break;
        }

    }

    /**
     * initialize model again. If any arg is null, the default value will be
     * used
     * 
     * @param vcs
     *            vcs client
     * @param ds
     *            data source
     * @param repoFile
     *            path to git repo
     * @param reqPattern
     *            pattern to parse req id from commit messages
     * @return model to use
     */
    private Collection_Model_Impl reInitModel(VcsClient vcs, DataSource ds, File repoFile, Pattern reqPattern,
            boolean isIndexEnabled) throws IOException {

        if (repoFile == null) {
            repoFile = new File(AppProperties.GetValue("DefaultRepoPath"));
        }

        if (vcs == null) {
            vcs = new GitVcsClient(repoFile.toString());
        }

        if (reqPattern == null) {
            reqPattern = Pattern.compile(AppProperties.GetValue("RequirementPattern"));
        }

        if (ds == null) {
            CSVFileDataSource csvDs = new CSVFileDataSource(
                    new File(repoFile.getParentFile(), AppProperties.GetValue("DefaultPathToCSVFile")));
            VCSDataSource vcsDs = new VCSDataSource(vcs, new CommitMessageParser(reqPattern));
            DBDataSource dbDs = new DBDataSource();
            ds = new CompositeDataSource(dbDs, csvDs, vcsDs);
        }
        Collection_Model_Impl model;
        if (isIndexEnabled)
            model = new Collection_Model_Impl(new TrackerAdapter(new Tracker(vcs, ds, repoFile), true));
        else
            model = new Collection_Model_Impl(new TrackerAdapter(new Tracker(vcs, ds, repoFile), false));

        model.setCurrentRequirementPattern(reqPattern);
        return model;
    }

    public void addLinkage(Requirement requirement, Commit commit) {
        try {
            i_Collection_Model.addRequirementCommitLinkage(requirement, commit);
            popupManager.showInformationDialog("Successfully Added!");
        } catch (Exception e) {
            popupManager.showErrorDialog(e.getMessage());
            return;
        } finally {
            cleaner.clearAll();
        }
    }

    void getTraceabilityMatrix() {
        try {
            tracability_view.showTraceabilityMatrix(i_Collection_Model.getRequirementsTraceability());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void getTraceabilityMatrixByImpact() {
        try {
            RequirementsTraceabilityMatrixByImpact tr = i_Collection_Model.getRequirementsTraceabilityByImpact();
            tracability_view.showTraceabilityMatrixByImpactProgressBar(tr);
            tr.Process();
            tracability_view.showTraceabilityMatrixByImpact(tr);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**This method enables showing of traceability matrix in the tabbed view
     * @param traceabilityMatrixByImpactViewHandlerPanel
     */
    public void showTraceabilityMatrixByImpactInTabbedView(
            TraceabilityMatrixByImpactViewHandlerPanel traceabilityMatrixByImpactViewHandlerPanel) {
        try {
            RequirementsTraceabilityMatrixByImpact tr = i_Collection_Model.getRequirementsTraceabilityByImpact();
            tracability_view.showTraceabilityMatrixByImpactProgressBar(tr);
            traceabilityMatrixByImpactViewHandlerPanel.setInternalGenerationEnable(false);
            traceabilityMatrixByImpactViewHandlerPanel.setExportEnable(false);
            //traceabilityMatrixByImpactViewHandlerPanel.eraseTable();
            tr.Process();
            tracability_view.showTraceabilityMatrixByImpactInTabbedView(tr,
                    traceabilityMatrixByImpactViewHandlerPanel);
            traceabilityMatrixByImpactViewHandlerPanel.setInternalGenerationEnable(true);
            traceabilityMatrixByImpactViewHandlerPanel.setExportEnable(true);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    protected void finalize() throws Throwable {
        try {
            HibernateUtil.shutdown();
        } finally {
            super.finalize();
        }
    }

    public boolean configureApplication(Configuration configuration) {
        try {
            HibernateUtil.shutdown();

            if (!Login.authenticate(configuration.getDbUsername(), configuration.getDbPassword())) {
                popupManager.showErrorDialog("Cannot connect to database.Please check the database credentials");
            }

            File repoFile = new File(configuration.getRepoPath());
            Pattern reqPatternString = Pattern.compile(configuration.getReqPattern());
            i_Collection_Model = reInitModel(null, null, repoFile, reqPatternString, configuration.isEnableIndex());
            popupManager.showInformationDialog("Configuration successfull");

            cleaner = new Cleaner(elementHandler);

            elementHandler.doInitialization();

            requirementsFromDB();
            requirementsFromDBForRequirementTab();
            initLinkageManagementTab();
            this.configuration = configuration;
        } catch (PatternSyntaxException | IOException e) {
            e.printStackTrace();
            popupManager.showErrorDialog("Some problem in application configuration");
            return false;
        } catch (RuntimeException e) {
            popupManager.showErrorDialog("Cannot connect to database.Please check the database credentials");
            return false;
        }

        return true;
    }

    public void refresh() {
        try {
            File repoFile = new File(configuration.getRepoPath());
            Pattern reqPatternString = Pattern.compile(configuration.getReqPattern());
            i_Collection_Model = reInitModel(null, null, repoFile, reqPatternString, configuration.isEnableIndex());
        } catch (IOException e) {
            popupManager.showErrorDialog("Could not refresh linkage: " + e.getMessage());
            return;
        }
        elementHandler.doInitialization();
        requirementsFromDB();
        requirementsFromDBForRequirementTab();
        initLinkageManagementTab();
    }
}