package org.jboss.windup.tooling;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.model.LinkModel;
import org.jboss.windup.graph.model.resource.FileModel;
import org.jboss.windup.reporting.model.ClassificationModel;
import org.jboss.windup.reporting.model.InlineHintModel;
import org.jboss.windup.reporting.model.QuickfixModel;
import org.jboss.windup.reporting.model.ReplacementQuickfixModel;
import org.jboss.windup.reporting.model.TransformationQuickfixModel;
import org.jboss.windup.reporting.model.source.SourceReportModel;
import org.jboss.windup.reporting.service.ClassificationService;
import org.jboss.windup.reporting.service.InlineHintService;
import org.jboss.windup.reporting.service.ReportService;
import org.jboss.windup.reporting.service.SourceReportService;
import org.jboss.windup.tooling.data.Classification;
import org.jboss.windup.tooling.data.ClassificationImpl;
import org.jboss.windup.tooling.data.Hint;
import org.jboss.windup.tooling.data.HintImpl;
import org.jboss.windup.tooling.data.IssueCategoryImpl;
import org.jboss.windup.tooling.data.Link;
import org.jboss.windup.tooling.data.LinkImpl;
import org.jboss.windup.tooling.data.Quickfix;
import org.jboss.windup.tooling.data.QuickfixImpl;
import org.jboss.windup.tooling.data.ReportLink;
import org.jboss.windup.tooling.data.ReportLinkImpl;
import org.jboss.windup.util.exception.WindupException;
/**
* Contains an implementation of {@link ExecutionResults} that loads its results from a {@link GraphContext}.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
* @author <a href="mailto:hotmana76@gmail.com">Marek Novotny</a>
* @author <a href="mailto:zizka@seznam.cz">Ondrej Zizka</a>
*/
@XmlRootElement(name = "execution-results")
public class ExecutionResultsImpl implements ExecutionResults
{
private static final long serialVersionUID = 1L;
private final ToolingXMLService toolingXMLService;
private final List<Classification> classifications;
private final List<Hint> hints;
private final List<ReportLink> reportLinks;
private String windupStopOnRequestMessage;
public ExecutionResultsImpl()
{
this.toolingXMLService = null;
this.windupStopOnRequestMessage = null;
this.classifications = Collections.emptyList();
this.hints = Collections.emptyList();
this.reportLinks = Collections.emptyList();
}
public ExecutionResultsImpl(GraphContext graphContext, ToolingXMLService toolingXMLService)
{
this.toolingXMLService = toolingXMLService;
this.classifications = getClassifications(graphContext);
this.hints = getHints(graphContext);
this.reportLinks = getReportLinks(graphContext);
}
private static List<ReportLink> getReportLinks(GraphContext graphContext)
{
final List<ReportLink> reportLinks = new ArrayList<>();
SourceReportService sourceReportService = new SourceReportService(graphContext);
ReportService reportService = new ReportService(graphContext);
for (SourceReportModel sourceReportModel : sourceReportService.findAll())
{
ReportLinkImpl reportLink = new ReportLinkImpl();
reportLink.setInputFile(sourceReportModel.getSourceFileModel().asFile());
Path reportPath = reportService.getReportDirectory().resolve(sourceReportModel.getReportFilename());
reportLink.setReportFile(reportPath.toFile());
reportLinks.add(reportLink);
}
return reportLinks;
}
private static List<Hint> getHints(GraphContext graphContext)
{
final List<Hint> hints = new ArrayList<>();
InlineHintService hintService = new InlineHintService(graphContext);
for (InlineHintModel hintModel : hintService.findAll())
{
HintImpl hint = new HintImpl(hintModel.asVertex().getId());
hint.setFile(hintModel.getFile().asFile());
hint.setTitle(hintModel.getTitle());
hint.setHint(hintModel.getHint());
hint.setIssueCategory(new IssueCategoryImpl(hintModel.getIssueCategory()));
hint.setEffort(hintModel.getEffort());
hint.setColumn(hintModel.getColumnNumber());
hint.setLineNumber(hintModel.getLineNumber());
hint.setLength(hintModel.getLength());
hint.setSourceSnippit(hintModel.getSourceSnippit());
hint.setRuleID(hintModel.getRuleID());
hint.setQuickfixes(asQuickfixes(hintModel.getQuickfixes()));
hint.setLinks(asLinks(hintModel.getLinks()));
hints.add(hint);
}
return hints;
}
private static List<Classification> getClassifications(GraphContext graphContext)
{
final List<Classification> classifications = new ArrayList<>();
ClassificationService classificationService = new ClassificationService(graphContext);
for (ClassificationModel classificationModel : classificationService.findAll())
{
for (FileModel fileModel : classificationModel.getFileModels())
{
ClassificationImpl classification = new ClassificationImpl(classificationModel.asVertex().getId());
classification.setClassification(classificationModel.getClassification());
classification.setDescription(classificationModel.getDescription());
classification.setEffort(classificationModel.getEffort());
classification.setRuleID(classificationModel.getRuleID());
classification.setIssueCategory(new IssueCategoryImpl(classificationModel.getIssueCategory()));
classification.setFile(fileModel.asFile());
classification.setLinks(asLinks(classificationModel.getLinks()));
classifications.add(classification);
classification.setQuickfixes(asQuickfixes(classificationModel.getQuickfixes()));
}
}
return classifications;
}
private static List<Link> asLinks(Iterable<LinkModel> linkModels)
{
List<Link> links = new ArrayList<>();
for (LinkModel linkModel : linkModels)
{
LinkImpl link = new LinkImpl();
link.setDescription(linkModel.getDescription());
link.setUrl(linkModel.getLink());
links.add(link);
}
return links;
}
private static List<Quickfix> asQuickfixes(Iterable<QuickfixModel> quickfixModels)
{
List<Quickfix> fixes = new ArrayList<>();
for (QuickfixModel quickfixModel : quickfixModels)
{
QuickfixImpl quickfix = new QuickfixImpl();
quickfix.setType(org.jboss.windup.tooling.data.QuickfixType.valueOf(quickfixModel.getQuickfixType().name()));
quickfix.setName(quickfixModel.getName());
if (quickfixModel instanceof ReplacementQuickfixModel)
{
ReplacementQuickfixModel replacementQuickfixModel = (ReplacementQuickfixModel)quickfixModel;
quickfix.setNewline(replacementQuickfixModel.getNewline());
quickfix.setReplacement(replacementQuickfixModel.getReplacement());
quickfix.setSearch(replacementQuickfixModel.getSearch());
}
if (quickfixModel instanceof TransformationQuickfixModel)
{
TransformationQuickfixModel transformationQuickfixModel = (TransformationQuickfixModel)quickfixModel;
quickfix.setTransformationID(transformationQuickfixModel.getTransformationID());
FileModel fileModel = transformationQuickfixModel.getFile();
if (fileModel != null)
{
quickfix.setFile(fileModel.asFile());
}
}
fixes.add(quickfix);
}
return fixes;
}
@Override
@XmlAttribute(name = "stopMessage")
public String getWindupStopOnRequestMessage()
{
return this.windupStopOnRequestMessage;
}
@Override
@XmlElementWrapper(name = "classifications")
@XmlElement(name = "classification", type = ClassificationImpl.class)
public List<Classification> getClassifications()
{
return classifications;
}
@Override
@XmlElementWrapper(name = "hints")
@XmlElement(name = "hint", type = HintImpl.class)
public List<Hint> getHints()
{
return hints;
}
@Override
@XmlElementWrapper(name = "report-links")
@XmlElement(name = "report-link", type = ReportLinkImpl.class)
public List<ReportLink> getReportLinks()
{
return reportLinks;
}
@Override
public void serializeToXML(Path path)
{
try (OutputStream outputStream = new FileOutputStream(path.toFile()))
{
toolingXMLService.serializeResults(this, outputStream);
}
catch (IOException e)
{
throw new WindupException("Failed to serialize results due to I/O Error: " + e.getMessage(), e);
}
}
}