blob: d339a1c7bc6331fd9d40a9a8e12b82715646b65f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Parasoft.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Janusz Studzizba - initial API and implementation
* Dariusz Oszczedlowski - initial API and implementation
* Magdalena Gniewek - initial API and implementation
* Michal Wlodarczyk - initial API and implementation
*******************************************************************************/
package org.eclipse.opencert.webapp.reports.export.docx;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.Collection;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.wml.P;
import org.eclipse.opencert.webapp.reports.containers.BaseAssetComplianceStatus;
import org.eclipse.opencert.webapp.reports.containers.ComplianceDetails;
import org.eclipse.opencert.webapp.reports.containers.visitors.ComplianceDetailsTraverser;
import org.eclipse.opencert.webapp.reports.manager.BaseActivityManager;
import org.eclipse.opencert.webapp.reports.manager.BaseArtefactManager;
import org.eclipse.opencert.webapp.reports.manager.BaseRequirementManager;
import org.eclipse.opencert.webapp.reports.manager.compliance.ComplianceDetailsManager;
import org.eclipse.opencert.webapp.reports.manager.compliance.ComplianceDetailsStatusDocxVisitor;
import org.eclipse.opencert.webapp.reports.manager.compliance.ComplianceManager;
import org.eclipse.opencert.webapp.reports.manager.compliance.ComplianceStatusDataRowProcessor;
import org.eclipse.opencert.webapp.reports.util.BaselineElementType;
import org.eclipse.opencert.webapp.reports.util.SpringContextHelper;
import org.eclipse.opencert.apm.baseline.baseline.BaseActivity;
import org.eclipse.opencert.apm.baseline.baseline.BaseArtefact;
import org.eclipse.opencert.apm.baseline.baseline.BaseRequirement;
import com.vaadin.data.util.HierarchicalContainer;
public class ComplianceEstimationReportDocxGenerator implements IDocxGenerator
{
private final String _docTemplateBasePath;
public ComplianceEstimationReportDocxGenerator(String basePath)
{
_docTemplateBasePath = basePath;
}
@Override
public ByteArrayInputStream generateProjectBaselineReport(long baselineFrameworkID, long projectID) throws Docx4JException
{
DocxBuilder docxBuilder = initDocxFromTemplate(baselineFrameworkID, projectID);
final ComplianceManager<BaseAssetComplianceStatus> complianceManager = new ComplianceManager<BaseAssetComplianceStatus>(new ComplianceStatusDataRowProcessor(false));
HierarchicalContainer hcBaseAssets = complianceManager.readBaseAssetDataFromDb(baselineFrameworkID);
fillDocxFromComplianceData(docxBuilder, hcBaseAssets, complianceManager);
final ByteArrayInputStream result = docxBuilder.getResult();
return result;
}
private DocxBuilder initDocxFromTemplate(long baselineFrameworkID, long projectID) throws Docx4JException
{
final String templatePath = _docTemplateBasePath + File.separator + "ComplianceEstimationReportTemplate.docx";
final DocxBuilder docxBuilder = new DocxBuilder(new File(templatePath), baselineFrameworkID, projectID,true);
// ugly fix - for unknown reasons *first* usage of HEADER does not work, the subsequent usages work
docxBuilder.appendHeaderNL("", DocxBuilder.HeaderStyle.HEADER_5);
return docxBuilder;
}
private void fillDocxFromComplianceData(DocxBuilder docxBuilder, HierarchicalContainer hcBaseAssets, ComplianceManager<BaseAssetComplianceStatus> complianceManager)
{
Collection<?> allBaseAssetIDs = hcBaseAssets.getItemIds();
Set<Object> itemIDsProcessed = new HashSet<>();
fillDocxFromBaseAssetsComplianceData(docxBuilder, hcBaseAssets, allBaseAssetIDs, itemIDsProcessed, complianceManager);
}
private void fillDocxFromBaseAssetsComplianceData(DocxBuilder docxBuilder, HierarchicalContainer hcBaseAssets, Collection<?> allBaseAssetIDs,
Set<Object> itemIDsProcessed, ComplianceManager<BaseAssetComplianceStatus> complianceManager)
{
for (Object itemID : allBaseAssetIDs)
{
if (itemIDsProcessed.contains(itemID)) {
continue;
}
if (!(itemID instanceof BaseAssetComplianceStatus)) {
throw new IllegalArgumentException();
}
itemIDsProcessed.add(itemID);
fillDocxForBaseAsset(docxBuilder, (BaseAssetComplianceStatus)itemID, complianceManager);
Collection<?> children = hcBaseAssets.getChildren(itemID);
if (children == null || children.size() == 0) {
continue;
}
fillDocxFromBaseAssetsComplianceData(docxBuilder, hcBaseAssets, children, itemIDsProcessed, complianceManager);
}
}
private void fillDocxForBaseAsset(DocxBuilder docxBuilder, BaseAssetComplianceStatus item, ComplianceManager<BaseAssetComplianceStatus> complianceManager)
{
final long itemCdoID = item.getItemId();
final String baselineItemName = item.getName().getValue();
docxBuilder.appendHeaderNL(baselineItemName, DocxBuilder.HeaderStyle.HEADER_1);
String itemType = complianceManager.findBaselineElementTypeById(itemCdoID);
final ComplianceDetailsManager complianceDetailsManager = new ComplianceDetailsManager();
List<ComplianceDetails> complianceDetailsData = null;
if (BaselineElementType.BASE_ARTEFACT.equals(itemType))
{
BaseArtefactManager baseArtefactManager = (BaseArtefactManager)SpringContextHelper.getBeanFromWebappContext(BaseArtefactManager.SPRING_NAME);
BaseArtefact baseArtefact = baseArtefactManager.getBaseArtefact(itemCdoID);
if (baseArtefact != null) {
complianceDetailsData = complianceDetailsManager.readComplianceDetailsData(baseArtefact, itemCdoID, baselineItemName, true);
}
}
if (BaselineElementType.BASE_ACTIVITY.equals(itemType))
{
BaseActivityManager baseActivityManager = (BaseActivityManager)SpringContextHelper.getBeanFromWebappContext(BaseActivityManager.SPRING_NAME);
BaseActivity baseActivity = baseActivityManager.getBaseActivity(itemCdoID);
if (baseActivity != null) {
complianceDetailsData = complianceDetailsManager.readComplianceDetailsData(baseActivity, itemCdoID, baselineItemName, true);
}
}
if (BaselineElementType.BASE_REQUIREMENT.equals(itemType))
{
BaseRequirementManager baseRequirementManager = (BaseRequirementManager)SpringContextHelper.getBeanFromWebappContext(BaseRequirementManager.SPRING_NAME);
BaseRequirement baseRequirement = baseRequirementManager.getBaseRequirement(itemCdoID);
if (baseRequirement != null) {
complianceDetailsData = complianceDetailsManager.readComplianceDetailsData(baseRequirement, itemCdoID, baselineItemName, true);
}
}
if (complianceDetailsData != null) {
appendComplianceDetailsBaseAsset(complianceDetailsData, docxBuilder);
}
}
private void appendComplianceDetailsBaseAsset(List<ComplianceDetails> complianceDetailsAll, DocxBuilder docxBuilder)
{
if (complianceDetailsAll == null || complianceDetailsAll.size() == 0) {
final String txt = "There is no compliace evidence for this safety standard requirement.";
final P p = docxBuilder.startParagraph();
docxBuilder.appendNL(p);
docxBuilder.appendText(p, txt, EnumSet.of(DocxBuilder.FontStyle.ITALIC, DocxBuilder.FontStyle.BOLD), DocxBuilder.FontColor.RED);
docxBuilder.appendNL(p);
docxBuilder.finishParagraph(p);
return;
}
final ComplianceDetailsStatusDocxVisitor docxVisitor = new ComplianceDetailsStatusDocxVisitor(docxBuilder);
ComplianceDetailsTraverser<Integer> cdTraverser = new ComplianceDetailsTraverser<Integer>(docxVisitor);
cdTraverser.traverseComplianceDetails(complianceDetailsAll);
}
@Override
public String getReportName() {
return "ComplianceReport_";
}
@Override
public InputStream generateRefFrameworkToRefFrameworkReport(
long frombaselineFrameworkID, long tobaselineFrameworkID)
throws Docx4JException {
// TODO Auto-generated method stub
return null;
}
}