Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement AxivionSuite tool which queries the Axivion Dashboard for violations #20

Merged
merged 13 commits into from
Mar 29, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package io.jenkins.plugins.analysis.warnings.axivion;

/**
* Supported issue kinds by Axivion Suite.
*/
enum AxIssueKind {
AV("architecture violations", DefaultTransformations::createAVIssue),
CL("clones", DefaultTransformations::createCLIssue),
CY("cycles", DefaultTransformations::createCYIssue),
DE("dead entities", DefaultTransformations::createDEIssue),
MV("metric violations", DefaultTransformations::createMVIssue),
SV("style violations", DefaultTransformations::createSVIssue);

private final String plural;
private final AxIssueTransformation transformation;

AxIssueKind(final String plural,
final AxIssueTransformation transformation) {
this.plural = plural;
this.transformation = transformation;
}

public String plural() {
return plural;
}

public AxIssueTransformation getTransformation() {
return transformation;
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package io.jenkins.plugins.analysis.warnings.axivion;

import edu.hm.hafner.analysis.Issue;

/**
* Transformation function which converts Axivion-Dashboard violations to warnings-ng {@link Issue} ones.
*/
@FunctionalInterface
interface AxIssueTransformation {

/**
* Transforms raw json-based Axivion-Dashboard violations to {@link Issue}'s.
*
* @param raw
* payload of a single dashboard violation
*
* @return warnings-plugins view of a violation
*/
Issue transform(AxRawIssue raw);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package io.jenkins.plugins.analysis.warnings.axivion;

import net.sf.json.JSONObject;

/**
* Represents a location-aware violation in json format.
*/
final class AxRawIssue {

private final String dashboardUrl;
private final String projectDir;
private final JSONObject payload;
private final AxIssueKind kind;

AxRawIssue(final String dashboardUrl, final String baseDir, final JSONObject payload,
final AxIssueKind kind) {
this.dashboardUrl = dashboardUrl;
this.projectDir = baseDir;
this.payload = payload;
this.kind = kind;
}

String getDashboardUrl() {
return dashboardUrl;
}

String getProjectDir() {
return projectDir;
}

JSONObject getPayload() {
return payload;
}

AxIssueKind getKind() {
return kind;
}

String getKindName() {
return getKind().name();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.jenkins.plugins.analysis.warnings.axivion;

import net.sf.json.JSONObject;

/**
* Strategy how to retrieve issues from the Axivion dashboard.
*/
interface AxivionDashboard {

/**
* Loads issues for given issue kind.
*
* @param kind
* kind to look for {@link AxIssueKind}
*/
JSONObject getIssues(AxIssueKind kind);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package io.jenkins.plugins.analysis.warnings.axivion;

import java.io.Serializable;

import edu.hm.hafner.analysis.Issue;
import edu.hm.hafner.analysis.Report;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
* Is aware of how to parse json payloads according to different issue kinds.
*/
class AxivionParser implements Serializable {

private static final long serialVersionUID = -1055658369957572701L;

private final String projectUrl;
private final String baseDir;

AxivionParser(
final String projectUrl,
final String baseDir) {
this.baseDir = baseDir;
this.projectUrl = projectUrl;
}

/**
* Converts given json structure to {@link Issue}'s and stores them in the given report.
*
* @param report
* the report to store issues in
* @param kind
* issue kind to parse
* @param payload
* json payload to parse
*/
void parse(final Report report, final AxIssueKind kind, final JSONObject payload) {
JSONArray jsonArray = payload.optJSONArray("rows");
if (jsonArray != null) {
report.logInfo("Importing %s %s", jsonArray.size(), kind.plural());
jsonArray.stream()
.filter(JSONObject.class::isInstance)
.map(JSONObject.class::cast)
.map(issueAsJson -> new AxRawIssue(projectUrl, baseDir, issueAsJson, kind))
.map(issue -> kind.getTransformation().transform(issue))
.forEach(report::add);
}
}
}
Loading