Skip to content
Open
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
12 changes: 12 additions & 0 deletions create_excel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import openpyxl

workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = "Sheet1"
sheet.cell(row=1, column=1, value="ID")
sheet.cell(row=1, column=2, value="Value")
sheet.cell(row=2, column=1, value="1")
sheet.cell(row=2, column=2, value="10")
sheet.cell(row=3, column=1, value="2")
sheet.cell(row=3, column=2, value="20")
workbook.save("src/test/resources/test.xlsx")
21 changes: 21 additions & 0 deletions create_excel_multi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import openpyxl

workbook = openpyxl.Workbook()
sheet1 = workbook.active
sheet1.title = "Sheet1"
sheet1.cell(row=1, column=1, value="ID")
sheet1.cell(row=1, column=2, value="Value")
sheet1.cell(row=2, column=1, value="1")
sheet1.cell(row=2, column=2, value="10")
sheet1.cell(row=3, column=1, value="2")
sheet1.cell(row=3, column=2, value="20")

sheet2 = workbook.create_sheet("Sheet2")
sheet2.cell(row=1, column=1, value="ID")
sheet2.cell(row=1, column=2, value="Value")
sheet2.cell(row=2, column=1, value="3")
sheet2.cell(row=2, column=2, value="30")
sheet2.cell(row=3, column=1, value="4")
sheet2.cell(row=3, column=2, value="40")

workbook.save("src/test/resources/test_multi.xlsx")
17 changes: 17 additions & 0 deletions create_excel_multi_inconsistent.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import openpyxl

workbook = openpyxl.Workbook()
sheet1 = workbook.active
sheet1.title = "Sheet1"
sheet1.cell(row=1, column=1, value="ID")
sheet1.cell(row=1, column=2, value="Value")
sheet1.cell(row=2, column=1, value="1")
sheet1.cell(row=2, column=2, value="10")

sheet2 = workbook.create_sheet("Sheet2")
sheet2.cell(row=1, column=1, value="ID")
sheet2.cell(row=1, column=2, value="Value2")
sheet2.cell(row=2, column=1, value="3")
sheet2.cell(row=2, column=2, value="30")

workbook.save("src/test/resources/test_multi_inconsistent.xlsx")
21 changes: 21 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,21 @@
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>jackson2-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>5.1.1</version>
</dependency>

<!-- Workflow dependencies -->
<dependency>
Expand Down Expand Up @@ -156,6 +171,12 @@
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.23.1</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
150 changes: 5 additions & 145 deletions src/main/java/io/jenkins/plugins/reporter/provider/Csv.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@

import hudson.Extension;
import io.jenkins.plugins.reporter.Messages;
import io.jenkins.plugins.reporter.model.Item;
import io.jenkins.plugins.reporter.model.Provider;
import io.jenkins.plugins.reporter.model.ReportDto;
import io.jenkins.plugins.reporter.model.ReportParser;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor;

Expand All @@ -24,7 +21,7 @@
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

public class Csv extends Provider {
public class Csv extends Tabular {

private static final long serialVersionUID = 9141170397250309265L;

Expand All @@ -48,31 +45,20 @@ public ReportParser createParser() {
/** Descriptor for this provider. */
@Symbol("csv")
@Extension
public static class Descriptor extends Provider.ProviderDescriptor {
public static class Descriptor extends ProviderDescriptor {
/** Creates the descriptor instance. */
public Descriptor() {
super(ID);
}
}

public static class CsvCustomParser extends ReportParser {
public static class CsvCustomParser extends Tabular.TabularParser {

private static final long serialVersionUID = -8689695008930386640L;

private final String id;

private List<String> parserMessages;

public CsvCustomParser(String id) {
super();
this.id = id;
this.parserMessages = new ArrayList<String>();
}

public String getId() {
return id;
super(id);
}


private char detectDelimiter(File file) throws IOException {
// List of possible delimiters
Expand Down Expand Up @@ -106,7 +92,6 @@ private char detectDelimiter(File file) throws IOException {
return detectedDelimiter;
}


@Override
public ReportDto parse(File file) throws IOException {
// Get delimiter
Expand All @@ -125,135 +110,10 @@ public ReportDto parse(File file) throws IOException {
.with(schema)
.readValues(file);

ReportDto report = new ReportDto();
report.setId(getId());
report.setItems(new ArrayList<>());

final List<String> header = it.next();
final List<List<String>> rows = it.readAll();

int rowCount = 0;
final int headerColumnCount = header.size();
int colIdxValueStart = 0;

if (headerColumnCount >= 2) {
rowCount = rows.size();
} else {
parserMessages.add(String.format("skipped file - First line has %d elements", headerColumnCount + 1));
}

/** Parse all data rows */
for (int rowIdx = 0; rowIdx < rowCount; rowIdx++) {
String parentId = "report";
List<String> row = rows.get(rowIdx);
Item last = null;
boolean lastItemAdded = false;
LinkedHashMap<String, Integer> result = new LinkedHashMap<>();
boolean emptyFieldFound = false;
int rowSize = row.size();

/** Parse untill first data line is found to get data and value field */
if (colIdxValueStart == 0) {
/** Col 0 is assumed to be string */
for (int colIdx = rowSize - 1; colIdx > 1; colIdx--) {
String value = row.get(colIdx);

if (NumberUtils.isCreatable(value)) {
colIdxValueStart = colIdx;
} else {
if (colIdxValueStart > 0) {
parserMessages
.add(String.format("Found data - fields number = %d - numeric fields = %d",
colIdxValueStart, rowSize - colIdxValueStart));
}
break;
}
}
}

String valueId = "";
/** Parse line if first data line is OK and line has more element than header */
if ((colIdxValueStart > 0) && (rowSize >= headerColumnCount)) {
/** Check line and header size matching */
for (int colIdx = 0; colIdx < headerColumnCount; colIdx++) {
String id = header.get(colIdx);
String value = row.get(colIdx);

/** Check value fields */
if ((colIdx < colIdxValueStart)) {
/** Test if text item is a value or empty */
if ((NumberUtils.isCreatable(value)) || (StringUtils.isBlank(value))) {
/** Empty field found - message */
if (colIdx == 0) {
parserMessages
.add(String.format("skipped line %d - First column item empty - col = %d ",
rowIdx + 2, colIdx + 1));
break;
} else {
emptyFieldFound = true;
/** Continue next column parsing */
continue;
}
} else {
/** Check if field values are present after empty cells */
if (emptyFieldFound) {
parserMessages.add(String.format("skipped line %d Empty field in col = %d ",
rowIdx + 2, colIdx + 1));
break;
}
}
valueId += value;
Optional<Item> parent = report.findItem(parentId, report.getItems());
Item item = new Item();
lastItemAdded = false;
item.setId(valueId);
item.setName(value);
String finalValueId = valueId;
if (parent.isPresent()) {
Item p = parent.get();
if (!p.hasItems()) {
p.setItems(new ArrayList<>());
}
if (p.getItems().stream().noneMatch(i -> i.getId().equals(finalValueId))) {
p.addItem(item);
lastItemAdded = true;
}
} else {
if (report.getItems().stream().noneMatch(i -> i.getId().equals(finalValueId))) {
report.getItems().add(item);
lastItemAdded = true;
}
}
parentId = valueId;
last = item;
} else {
Number val = 0;
if (NumberUtils.isCreatable(value)) {
val = NumberUtils.createNumber(value);
}
result.put(id, val.intValue());
}
}
} else {
/** Skip file if first data line has no value field */
if (colIdxValueStart == 0) {
parserMessages.add(String.format("skipped line %d - First data row not found", rowIdx + 2));
continue;
} else {
parserMessages
.add(String.format("skipped line %d - line has fewer element than title", rowIdx + 2));
continue;
}
}
/** If last item was created, it will be added to report */
if (lastItemAdded) {
last.setResult(result);
} else {
parserMessages.add(String.format("ignored line %d - Same fields already exists", rowIdx + 2));
}
}
// report.setParserLog(parserMessages);
return report;
return parse(header, rows);
}
}
}
Loading
Loading