diff options
Diffstat (limited to 'plugins/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityJob.java')
-rw-r--r-- | plugins/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityJob.java | 488 |
1 files changed, 244 insertions, 244 deletions
diff --git a/plugins/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityJob.java b/plugins/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityJob.java index e63134e07d8..1bb22e62850 100644 --- a/plugins/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityJob.java +++ b/plugins/org.eclipse.osee.define/src/org/eclipse/osee/define/traceability/ImportTraceabilityJob.java @@ -1,245 +1,245 @@ -/*******************************************************************************
- * Copyright (c) 2004, 2007 Boeing.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Boeing - initial API and implementation
- *******************************************************************************/
-package org.eclipse.osee.define.traceability;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.regex.Pattern;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.osee.define.DefinePlugin;
-import org.eclipse.osee.define.traceability.data.RequirementData;
-import org.eclipse.osee.framework.core.enums.CoreAttributeTypes;
-import org.eclipse.osee.framework.core.exception.OseeArgumentException;
-import org.eclipse.osee.framework.core.exception.OseeCoreException;
-import org.eclipse.osee.framework.core.model.Branch;
-import org.eclipse.osee.framework.jdk.core.type.CountingMap;
-import org.eclipse.osee.framework.jdk.core.type.HashCollection;
-import org.eclipse.osee.framework.jdk.core.type.Pair;
-import org.eclipse.osee.framework.jdk.core.util.Collections;
-import org.eclipse.osee.framework.jdk.core.util.Lib;
-import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream;
-import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelXmlWriter;
-import org.eclipse.osee.framework.jdk.core.util.io.xml.ISheetWriter;
-import org.eclipse.osee.framework.plugin.core.util.AIFile;
-import org.eclipse.osee.framework.plugin.core.util.OseeData;
-import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
-import org.eclipse.osee.framework.skynet.core.utility.Requirements;
-import org.eclipse.osee.framework.skynet.core.word.WordUtil;
-import org.eclipse.swt.program.Program;
-
-/**
- * @author Ryan D. Brooks
- */
-public class ImportTraceabilityJob extends Job {
- private static final Pattern filePattern = Pattern.compile(".*\\.(java|ada|ads|adb|c|h)");
- private static final TraceabilityExtractor traceExtractor = TraceabilityExtractor.getInstance();
-
- private final File file;
- private final RequirementData requirementData;
- private final ArrayList<String> noTraceabilityFiles;
- private final CountingMap<Artifact> reqsTraceCounts;
- private final HashCollection<Artifact, String> requirementToCodeUnitsMap;
- private final HashSet<String> codeUnits;
- private final CharBackedInputStream charBak;
- private final ISheetWriter excelWriter;
- private int pathPrefixLength;
- private final boolean writeOutResults;
-
- public ImportTraceabilityJob(File file, Branch branch, boolean writeOutResults) throws CoreException, IOException {
- super("Importing Traceability");
- this.file = file;
- this.requirementData = new RequirementData(branch);
- noTraceabilityFiles = new ArrayList<String>(200);
- reqsTraceCounts = new CountingMap<Artifact>();
- codeUnits = new HashSet<String>();
- requirementToCodeUnitsMap = new HashCollection<Artifact, String>(false, LinkedList.class);
- charBak = new CharBackedInputStream();
- excelWriter = new ExcelXmlWriter(charBak.getWriter());
- this.writeOutResults = writeOutResults;
- }
-
- @Override
- public IStatus run(IProgressMonitor monitor) {
- IStatus toReturn = Status.CANCEL_STATUS;
- try {
- monitor.beginTask("Importing From " + file.getName(), 100);
- monitor.worked(1);
-
- toReturn = requirementData.initialize(monitor);
- if (toReturn.getSeverity() == IStatus.OK) {
- if (monitor.isCanceled() != true) {
- if (writeOutResults) {
- excelWriter.startSheet("srs <--> code units", 6);
- excelWriter.writeRow("Req in DB", "Code Unit", "Requirement Name", "Requirement Trace Mark in Code");
- }
-
- if (file.isFile()) {
- for (String path : Lib.readListFromFile(file, true)) {
- monitor.subTask(path);
- handleDirectory(new File(path));
- if (monitor.isCanceled() == true) {
- break;
- }
- }
- } else if (file.isDirectory()) {
- handleDirectory(file);
- } else {
- throw new IllegalStateException("unexpected file system type");
- }
-
- if (writeOutResults && monitor.isCanceled() != true) {
- excelWriter.endSheet();
-
- writeNoTraceFilesSheet();
- writeTraceCountsSheet();
-
- excelWriter.endWorkbook();
- IFile iFile = OseeData.getIFile("CodeUnit_To_SRS_Trace.xml");
- AIFile.writeToFile(iFile, charBak);
- Program.launch(iFile.getLocation().toOSString());
- }
-
- if (monitor.isCanceled() != true) {
- toReturn = Status.OK_STATUS;
- } else {
- toReturn = Status.CANCEL_STATUS;
- }
- }
- }
- } catch (IOException ex) {
- toReturn = new Status(Status.ERROR, DefinePlugin.PLUGIN_ID, -1, ex.getLocalizedMessage(), ex);
- } catch (OseeCoreException ex) {
- toReturn = new Status(Status.ERROR, DefinePlugin.PLUGIN_ID, -1, ex.getLocalizedMessage(), ex);
- } finally {
- monitor.done();
- }
- return toReturn;
- }
-
- private void handleDirectory(File directory) throws IOException, OseeCoreException {
- if (directory == null || directory.getParentFile() == null) {
- throw new OseeArgumentException("The path " + directory + " is invalid.");
- }
-
- pathPrefixLength = directory.getParentFile().getAbsolutePath().length();
-
- for (File sourceFile : Lib.recursivelyListFiles(directory, filePattern)) {
- List<String> traceMarks = traceExtractor.getTraceMarksFromFile(sourceFile);
-
- int matchCount = 0;
- String relativePath = sourceFile.getPath().substring(pathPrefixLength);
- codeUnits.add(relativePath);
- for (String traceMark : traceMarks) {
- handelReqTrace(relativePath, traceMark);
- matchCount++;
- }
- if (matchCount == 0) {
- noTraceabilityFiles.add(relativePath);
- }
- }
- }
-
- private void writeNoTraceFilesSheet() throws IOException {
- excelWriter.startSheet("no match files", 1);
- for (String path : noTraceabilityFiles) {
- excelWriter.writeRow(path);
- }
- excelWriter.endSheet();
- }
-
- private void writeTraceCountsSheet() throws IOException, OseeCoreException {
- excelWriter.startSheet("trace counts", 3);
- excelWriter.writeRow("SRS Requirement from Database", "Trace Count", "Partitions");
- excelWriter.writeRow("% requirement coverage", null, "=1-COUNTIF(C2,"0")/COUNTA(C2)");
-
- for (Artifact artifact : requirementData.getDirectSwRequirements()) {
- excelWriter.writeRow(artifact.getName(), String.valueOf(reqsTraceCounts.get(artifact)), Collections.toString(
- ",", artifact.getAttributesToStringList(Requirements.PARTITION)));
- }
-
- excelWriter.endSheet();
- }
-
- private void handelReqTrace(String path, String traceMark) throws OseeCoreException, IOException {
- String foundStr;
- Artifact reqArtifact = null;
-
- if (traceExtractor.isValidTraceMark(traceMark) != true) {
- foundStr = "invalid trace mark";
- } else {
- reqArtifact = requirementData.getRequirementFromTraceMark(traceMark);
- if (reqArtifact == null) {
- Pair<String, String> structuredRequirement = traceExtractor.getStructuredRequirement(traceMark);
- if (structuredRequirement != null) {
- reqArtifact = requirementData.getRequirementFromTraceMark(structuredRequirement.getFirst());
-
- if (reqArtifact == null) {
- foundStr = "no match in DB";
- } else {
- // for local data and procedures search requirement text for traceMark
- // example local data [{SUBSCRIBER}.ID] and example procedure {CURSOR_ACKNOWLEDGE}.NORMAL
- String textContent =
- WordUtil.textOnly(
- reqArtifact.getSoleAttributeValue(CoreAttributeTypes.WORD_TEMPLATE_CONTENT, "")).toUpperCase();
- if (textContent.contains(traceExtractor.getCanonicalRequirementName(structuredRequirement.getSecond()))) {
- foundStr = "req body match";
- } else {
- foundStr = "paritial match";
- }
- }
- } else {
- foundStr = "no match in DB";
- }
- } else {
- foundStr = fullMatch(reqArtifact);
- }
- }
-
- String name = null;
- if (reqArtifact != null) {
- name = reqArtifact.getName();
- requirementToCodeUnitsMap.put(reqArtifact, path);
- }
-
- if (writeOutResults) {
- excelWriter.writeRow(foundStr, path, name, traceMark);
- }
- }
-
- private String fullMatch(Artifact reqArtifact) {
- reqsTraceCounts.put(reqArtifact);
- return "full match";
- }
-
- public HashCollection<Artifact, String> getRequirementToCodeUnitsMap() {
- return requirementToCodeUnitsMap;
- }
-
- /**
- * @return the codeUnits
- */
- public HashSet<String> getCodeUnits() {
- return codeUnits;
- }
-
- public RequirementData getRequirementData() {
- return requirementData;
- }
+/******************************************************************************* + * Copyright (c) 2004, 2007 Boeing. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.define.traceability; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.regex.Pattern; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.osee.define.DefinePlugin; +import org.eclipse.osee.define.traceability.data.RequirementData; +import org.eclipse.osee.framework.core.enums.CoreAttributeTypes; +import org.eclipse.osee.framework.core.exception.OseeArgumentException; +import org.eclipse.osee.framework.core.exception.OseeCoreException; +import org.eclipse.osee.framework.core.model.Branch; +import org.eclipse.osee.framework.jdk.core.type.CountingMap; +import org.eclipse.osee.framework.jdk.core.type.HashCollection; +import org.eclipse.osee.framework.jdk.core.type.Pair; +import org.eclipse.osee.framework.jdk.core.util.Collections; +import org.eclipse.osee.framework.jdk.core.util.Lib; +import org.eclipse.osee.framework.jdk.core.util.io.CharBackedInputStream; +import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelXmlWriter; +import org.eclipse.osee.framework.jdk.core.util.io.xml.ISheetWriter; +import org.eclipse.osee.framework.plugin.core.util.AIFile; +import org.eclipse.osee.framework.plugin.core.util.OseeData; +import org.eclipse.osee.framework.skynet.core.artifact.Artifact; +import org.eclipse.osee.framework.skynet.core.utility.Requirements; +import org.eclipse.osee.framework.skynet.core.word.WordUtil; +import org.eclipse.swt.program.Program; + +/** + * @author Ryan D. Brooks + */ +public class ImportTraceabilityJob extends Job { + private static final Pattern filePattern = Pattern.compile(".*\\.(java|ada|ads|adb|c|h)"); + private static final TraceabilityExtractor traceExtractor = TraceabilityExtractor.getInstance(); + + private final File file; + private final RequirementData requirementData; + private final ArrayList<String> noTraceabilityFiles; + private final CountingMap<Artifact> reqsTraceCounts; + private final HashCollection<Artifact, String> requirementToCodeUnitsMap; + private final HashSet<String> codeUnits; + private final CharBackedInputStream charBak; + private final ISheetWriter excelWriter; + private int pathPrefixLength; + private final boolean writeOutResults; + + public ImportTraceabilityJob(File file, Branch branch, boolean writeOutResults) throws CoreException, IOException { + super("Importing Traceability"); + this.file = file; + this.requirementData = new RequirementData(branch); + noTraceabilityFiles = new ArrayList<String>(200); + reqsTraceCounts = new CountingMap<Artifact>(); + codeUnits = new HashSet<String>(); + requirementToCodeUnitsMap = new HashCollection<Artifact, String>(false, LinkedList.class); + charBak = new CharBackedInputStream(); + excelWriter = new ExcelXmlWriter(charBak.getWriter()); + this.writeOutResults = writeOutResults; + } + + @Override + public IStatus run(IProgressMonitor monitor) { + IStatus toReturn = Status.CANCEL_STATUS; + try { + monitor.beginTask("Importing From " + file.getName(), 100); + monitor.worked(1); + + toReturn = requirementData.initialize(monitor); + if (toReturn.getSeverity() == IStatus.OK) { + if (monitor.isCanceled() != true) { + if (writeOutResults) { + excelWriter.startSheet("srs <--> code units", 6); + excelWriter.writeRow("Req in DB", "Code Unit", "Requirement Name", "Requirement Trace Mark in Code"); + } + + if (file.isFile()) { + for (String path : Lib.readListFromFile(file, true)) { + monitor.subTask(path); + handleDirectory(new File(path)); + if (monitor.isCanceled() == true) { + break; + } + } + } else if (file.isDirectory()) { + handleDirectory(file); + } else { + throw new IllegalStateException("unexpected file system type"); + } + + if (writeOutResults && monitor.isCanceled() != true) { + excelWriter.endSheet(); + + writeNoTraceFilesSheet(); + writeTraceCountsSheet(); + + excelWriter.endWorkbook(); + IFile iFile = OseeData.getIFile("CodeUnit_To_SRS_Trace.xml"); + AIFile.writeToFile(iFile, charBak); + Program.launch(iFile.getLocation().toOSString()); + } + + if (monitor.isCanceled() != true) { + toReturn = Status.OK_STATUS; + } else { + toReturn = Status.CANCEL_STATUS; + } + } + } + } catch (IOException ex) { + toReturn = new Status(Status.ERROR, DefinePlugin.PLUGIN_ID, -1, ex.getLocalizedMessage(), ex); + } catch (OseeCoreException ex) { + toReturn = new Status(Status.ERROR, DefinePlugin.PLUGIN_ID, -1, ex.getLocalizedMessage(), ex); + } finally { + monitor.done(); + } + return toReturn; + } + + private void handleDirectory(File directory) throws IOException, OseeCoreException { + if (directory == null || directory.getParentFile() == null) { + throw new OseeArgumentException("The path " + directory + " is invalid."); + } + + pathPrefixLength = directory.getParentFile().getAbsolutePath().length(); + + for (File sourceFile : Lib.recursivelyListFiles(directory, filePattern)) { + List<String> traceMarks = traceExtractor.getTraceMarksFromFile(sourceFile); + + int matchCount = 0; + String relativePath = sourceFile.getPath().substring(pathPrefixLength); + codeUnits.add(relativePath); + for (String traceMark : traceMarks) { + handelReqTrace(relativePath, traceMark); + matchCount++; + } + if (matchCount == 0) { + noTraceabilityFiles.add(relativePath); + } + } + } + + private void writeNoTraceFilesSheet() throws IOException { + excelWriter.startSheet("no match files", 1); + for (String path : noTraceabilityFiles) { + excelWriter.writeRow(path); + } + excelWriter.endSheet(); + } + + private void writeTraceCountsSheet() throws IOException, OseeCoreException { + excelWriter.startSheet("trace counts", 3); + excelWriter.writeRow("SRS Requirement from Database", "Trace Count", "Partitions"); + excelWriter.writeRow("% requirement coverage", null, "=1-COUNTIF(C2,"0")/COUNTA(C2)"); + + for (Artifact artifact : requirementData.getDirectSwRequirements()) { + excelWriter.writeRow(artifact.getName(), String.valueOf(reqsTraceCounts.get(artifact)), Collections.toString( + ",", artifact.getAttributesToStringList(Requirements.PARTITION))); + } + + excelWriter.endSheet(); + } + + private void handelReqTrace(String path, String traceMark) throws OseeCoreException, IOException { + String foundStr; + Artifact reqArtifact = null; + + if (traceExtractor.isValidTraceMark(traceMark) != true) { + foundStr = "invalid trace mark"; + } else { + reqArtifact = requirementData.getRequirementFromTraceMark(traceMark); + if (reqArtifact == null) { + Pair<String, String> structuredRequirement = traceExtractor.getStructuredRequirement(traceMark); + if (structuredRequirement != null) { + reqArtifact = requirementData.getRequirementFromTraceMark(structuredRequirement.getFirst()); + + if (reqArtifact == null) { + foundStr = "no match in DB"; + } else { + // for local data and procedures search requirement text for traceMark + // example local data [{SUBSCRIBER}.ID] and example procedure {CURSOR_ACKNOWLEDGE}.NORMAL + String textContent = + WordUtil.textOnly( + reqArtifact.getSoleAttributeValue(CoreAttributeTypes.WORD_TEMPLATE_CONTENT, "")).toUpperCase(); + if (textContent.contains(traceExtractor.getCanonicalRequirementName(structuredRequirement.getSecond()))) { + foundStr = "req body match"; + } else { + foundStr = "paritial match"; + } + } + } else { + foundStr = "no match in DB"; + } + } else { + foundStr = fullMatch(reqArtifact); + } + } + + String name = null; + if (reqArtifact != null) { + name = reqArtifact.getName(); + requirementToCodeUnitsMap.put(reqArtifact, path); + } + + if (writeOutResults) { + excelWriter.writeRow(foundStr, path, name, traceMark); + } + } + + private String fullMatch(Artifact reqArtifact) { + reqsTraceCounts.put(reqArtifact); + return "full match"; + } + + public HashCollection<Artifact, String> getRequirementToCodeUnitsMap() { + return requirementToCodeUnitsMap; + } + + /** + * @return the codeUnits + */ + public HashSet<String> getCodeUnits() { + return codeUnits; + } + + public RequirementData getRequirementData() { + return requirementData; + } }
\ No newline at end of file |