/* * 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.bl; import de.fau.osr.util.matrix.MatrixIndex; import de.fau.osr.util.matrix.SymmetricMatrix; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * This class represents a traceability matrix for requirements * @author Gayathery Sathya */ public class RequirementsTraceabilityMatrix { Logger logger = LoggerFactory.getLogger(RequirementsTraceabilityMatrix.class); ArrayList<String> requirements; SymmetricMatrix<RequirementsRelation> traceabilityMatrix; private final Object lockObject = new Object(); public RequirementsTraceabilityMatrix(Collection<String> requirements) { super(); this.requirements = new ArrayList<String>(requirements); traceabilityMatrix = new SymmetricMatrix<RequirementsRelation>(requirements.size()); } /** * method to get the requirements for traceability in an ordered form * @return */ public List<String> getOrderedRequirementsArrayForTraceability(){ final ArrayList<String> OrderedRequirementsArrayForTraceability = requirements; return OrderedRequirementsArrayForTraceability; } /** * method to get the actual traceability matrix with relationships * @return */ public SymmetricMatrix<RequirementsRelation> getTraceabilityMatrixForRequirements(){ final SymmetricMatrix<RequirementsRelation> finalTraceabilityMatrix = traceabilityMatrix; return finalTraceabilityMatrix; } /** * method to populate the symmetric matrix with the elements of type "RequirementsRelation" * based on relationship between Requirements * @param fileRequirementList * @param filePath path of the file for which traceability is processed * @throws IndexOutOfBoundsException */ public void populateMatrix(List<String> fileRequirementList, String filePath) throws IndexOutOfBoundsException{ logger.debug(" Process populatematrix():"+fileRequirementList.size()); ArrayList<String> relatedFileList = new ArrayList<String>(); relatedFileList.add(filePath); try { ArrayList<String> dependantRequirements = (ArrayList<String>) fileRequirementList; int size=dependantRequirements.size(); MatrixIndex mIndex = new MatrixIndex(-1, -1); for(int i = 0 ; i< size ; i++){ mIndex.setRowIndex(getRequirementIndex(dependantRequirements.get(i))); for(int j=i+1;j<size;j++){ mIndex.setColumnIndex(getRequirementIndex(dependantRequirements.get(j))); synchronized(lockObject){ MatrixIndex mIndexForPassing = new MatrixIndex(mIndex); RequirementsRelation requirementsRelation = traceabilityMatrix.getAt(mIndexForPassing); if (requirementsRelation == null) requirementsRelation = new RequirementsRelation(); requirementsRelation.incrementRelations(1, relatedFileList); traceabilityMatrix.setAt(mIndexForPassing, requirementsRelation); } } } }catch(IndexOutOfBoundsException e){ throw e; } catch(Exception e){ logger.error(e.getMessage()); } } /** * Gets the index of the requirement from the main requirement Arraylist 'requirements' * @param requirement requirement id * @return it returns the index of the requirement id in the list */ private int getRequirementIndex(String requirement){ int index = requirements.indexOf(requirement); if (index < 0) logger.error("Requirement "+ requirement + " not in master requirement."); return index; } }