import (not working)
This commit is contained in:
145
pom.xml
Normal file
145
pom.xml
Normal file
@@ -0,0 +1,145 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>uk.org.mafoo.cpomssummariser</groupId>
|
||||
<artifactId>cpomssummariser</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<name>cpomssummariser</name>
|
||||
<!-- FIXME change it to the project's website -->
|
||||
<url>http://www.example.com</url>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.release>17</maven.compiler.release>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.junit</groupId>
|
||||
<artifactId>junit-bom</artifactId>
|
||||
<version>5.11.0</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- Optionally: parameterized tests support -->
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-params</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi</artifactId>
|
||||
<version>5.3.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi-ooxml</artifactId>
|
||||
<version>5.3.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jxls</groupId>
|
||||
<artifactId>jxls-jexcel</artifactId>
|
||||
<version>1.0.9</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.dhatim</groupId>
|
||||
<artifactId>fastexcel-reader</artifactId>
|
||||
<version>0.18.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.dhatim</groupId>
|
||||
<artifactId>fastexcel</artifactId>
|
||||
<version>0.18.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
|
||||
<plugins>
|
||||
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
|
||||
<plugin>
|
||||
<artifactId>maven-clean-plugin</artifactId>
|
||||
<version>3.4.0</version>
|
||||
</plugin>
|
||||
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
|
||||
<plugin>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<version>3.3.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.13.0</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>3.4.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-install-plugin</artifactId>
|
||||
<version>3.1.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-deploy-plugin</artifactId>
|
||||
<version>3.1.2</version>
|
||||
</plugin>
|
||||
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
|
||||
<plugin>
|
||||
<artifactId>maven-site-plugin</artifactId>
|
||||
<version>3.12.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-project-info-reports-plugin</artifactId>
|
||||
<version>3.6.1</version>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<!-- Build an executable JAR -->
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>3.1.0</version>
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifest>
|
||||
<addClasspath>true</addClasspath>
|
||||
<mainClass>uk.org.mafoo.cpomssummariser.App</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!-- Add the assemble plugin with standard configuration -->
|
||||
<plugin>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifest>
|
||||
<mainClass>uk.org.mafoo.cpomssummariser.App</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
<descriptorRefs>
|
||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||
</descriptorRefs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
</build>
|
||||
</project>
|
||||
66
src/main/java/uk/org/mafoo/cpomssummariser/App.java
Normal file
66
src/main/java/uk/org/mafoo/cpomssummariser/App.java
Normal file
@@ -0,0 +1,66 @@
|
||||
package uk.org.mafoo.cpomssummariser;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import org.apache.poi.xssf.usermodel.*;
|
||||
import org.apache.poi.ss.usermodel.*;
|
||||
|
||||
/**
|
||||
* Hello world!
|
||||
*/
|
||||
public class App {
|
||||
|
||||
public static void xlsxtest(String filename) throws IOException {
|
||||
FileInputStream file = new FileInputStream(new File(filename));
|
||||
//Create Workbook instance holding reference to .xlsx file
|
||||
XSSFWorkbook workbook = new XSSFWorkbook(file);
|
||||
|
||||
//Get first/desired sheet from the workbook
|
||||
XSSFSheet sheet = workbook.getSheetAt(0);
|
||||
|
||||
//Iterate through each rows one by one
|
||||
Iterator<Row> rowIterator = sheet.iterator();
|
||||
while (rowIterator.hasNext()) {
|
||||
|
||||
Row row = rowIterator.next();
|
||||
|
||||
//For each row, iterate through all the columns
|
||||
Iterator<Cell> cellIterator = row.cellIterator();
|
||||
System.out.print(" | ");
|
||||
while (cellIterator.hasNext()) {
|
||||
|
||||
Cell cell = cellIterator.next();
|
||||
|
||||
//Check the cell type and format accordingly
|
||||
switch (cell.getCellType()) {
|
||||
case NUMERIC:
|
||||
System.out.print(cell.getNumericCellValue());
|
||||
break;
|
||||
case STRING:
|
||||
System.out.print(cell.getStringCellValue());
|
||||
break;
|
||||
default:
|
||||
System.out.print(cell.getNumericCellValue());
|
||||
}
|
||||
|
||||
System.out.print(" | ");
|
||||
|
||||
}
|
||||
System.out.println("");
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
String filename = "testdata.xlsx";
|
||||
if(args.length > 0) filename = args[0];
|
||||
FileInputStream file = new FileInputStream(filename);
|
||||
List<List<String>> data = Loader.loadXlsx(file);
|
||||
// System.out.println(data);
|
||||
|
||||
List<Record> records = Parser.parse(data);
|
||||
Summariser summariser = new Summariser(records);
|
||||
|
||||
System.out.println("Ending...");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package uk.org.mafoo.cpomssummariser.DataModel;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public record Category(String superior, String name, Map<String,List<CategoryGroupData>> data) {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package uk.org.mafoo.cpomssummariser.DataModel;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class CategoryGroupData {
|
||||
|
||||
String group;
|
||||
Map<String, Integer> sex;
|
||||
Integer SEND;
|
||||
Integer PP;
|
||||
|
||||
public CategoryGroupData(String group, Map<String, Integer> sex, Integer SEND, Integer PP) {
|
||||
this.group = group;
|
||||
this.sex = sex;
|
||||
this.SEND = SEND;
|
||||
this.PP = PP;
|
||||
}
|
||||
|
||||
public CategoryGroupData(String group) {
|
||||
this(
|
||||
group,
|
||||
new HashMap<String, Integer>(),
|
||||
0,
|
||||
0
|
||||
);
|
||||
this.sex.put("Male", 0);
|
||||
this.sex.put("Female", 0);
|
||||
// System.out.println("[CategoryGroupData] Created new group: " + group);
|
||||
}
|
||||
|
||||
public void incrementPP() {
|
||||
this.PP += 1;
|
||||
}
|
||||
|
||||
public void incrementSEND() {
|
||||
this.SEND += 1;
|
||||
}
|
||||
|
||||
public void incrementSexValue(String sex) {
|
||||
assert(sex.equals("Male") || sex.equals("Female"));
|
||||
this.sex.put(sex, this.sex.get(sex) + 1);
|
||||
}
|
||||
|
||||
public int getPP() {
|
||||
return this.PP.intValue();
|
||||
}
|
||||
|
||||
public int getSEND() {
|
||||
return this.SEND.intValue();
|
||||
}
|
||||
|
||||
public int getSexValue(String sex) {
|
||||
assert(sex.equals("Male") || sex.equals("Female"));
|
||||
return this.sex.get(sex).intValue();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
stringBuilder.append("Group="); stringBuilder.append(this.group); stringBuilder.append(" ");
|
||||
stringBuilder.append("Male="); stringBuilder.append(this.getSexValue("Male")); stringBuilder.append(" ");
|
||||
stringBuilder.append("Female="); stringBuilder.append(this.getSexValue("Female")); stringBuilder.append(" ");
|
||||
stringBuilder.append("SEND="); stringBuilder.append(this.getSEND()); stringBuilder.append(" ");
|
||||
stringBuilder.append("PP="); stringBuilder.append(this.getPP()); stringBuilder.append(" ");
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package uk.org.mafoo.cpomssummariser.DataModel;
|
||||
|
||||
public enum Groups {
|
||||
YEAR_7,
|
||||
YEAR_8,
|
||||
YEAR_9,
|
||||
YEAR_10,
|
||||
YEAR_11,
|
||||
YEAR_12,
|
||||
YEAR_13
|
||||
}
|
||||
65
src/main/java/uk/org/mafoo/cpomssummariser/Loader.java
Normal file
65
src/main/java/uk/org/mafoo/cpomssummariser/Loader.java
Normal file
@@ -0,0 +1,65 @@
|
||||
package uk.org.mafoo.cpomssummariser;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
|
||||
public class Loader {
|
||||
public static List<List<String>> loadXlsx(FileInputStream fd) throws IOException {
|
||||
return loadXlsx(fd, true);
|
||||
}
|
||||
|
||||
public static List<List<String>> loadXlsx(FileInputStream fd, boolean forceGroupToInteger) throws IOException {
|
||||
List<List<String>> data = new ArrayList<>();
|
||||
|
||||
XSSFWorkbook workbook = new XSSFWorkbook(fd);
|
||||
|
||||
// Get first/desired sheet from the workbook
|
||||
XSSFSheet sheet = workbook.getSheetAt(0);
|
||||
|
||||
// Iterate through each rows one by one
|
||||
Iterator<Row> rowIterator = sheet.iterator();
|
||||
while (rowIterator.hasNext()) {
|
||||
|
||||
Row row = rowIterator.next();
|
||||
List<String> rowdata = new ArrayList<String>();
|
||||
|
||||
// For each row, iterate through all the columns
|
||||
Iterator<Cell> cellIterator = row.cellIterator();
|
||||
|
||||
while (cellIterator.hasNext()) {
|
||||
|
||||
Cell cell = cellIterator.next();
|
||||
|
||||
// Check the cell type and format accordingly
|
||||
switch (cell.getCellType()) {
|
||||
case NUMERIC:
|
||||
if(forceGroupToInteger) {
|
||||
rowdata.add( "" + ((int)cell.getNumericCellValue()) );
|
||||
} else {
|
||||
rowdata.add("" + cell.getNumericCellValue());
|
||||
}
|
||||
break;
|
||||
case STRING:
|
||||
rowdata.add(cell.getStringCellValue());
|
||||
break;
|
||||
default:
|
||||
rowdata.add(cell.getStringCellValue());
|
||||
}
|
||||
|
||||
// rowdata.add(cell.getStringCellValue());
|
||||
}
|
||||
|
||||
data.add(rowdata);
|
||||
}
|
||||
workbook.close();
|
||||
return data;
|
||||
}
|
||||
}
|
||||
23
src/main/java/uk/org/mafoo/cpomssummariser/Parser.java
Normal file
23
src/main/java/uk/org/mafoo/cpomssummariser/Parser.java
Normal file
@@ -0,0 +1,23 @@
|
||||
package uk.org.mafoo.cpomssummariser;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class Parser {
|
||||
private static final int expected = 5;
|
||||
|
||||
public static List<Record> parse(List<List<String>> in) {
|
||||
List<Record> out = new ArrayList<Record>();
|
||||
for (List<String> row : in) {
|
||||
if (row.get(0).equals("Sex")) continue;
|
||||
// System.out.println("Parsing: " + String.join(" :: ", row));
|
||||
|
||||
int missing = expected - row.size();
|
||||
while(missing-- > 0) row.add(""); // Fill in the gaps
|
||||
|
||||
Record r = new Record(row.get(0), row.get(1), row.get(2), row.get(3), row.get(4));
|
||||
out.add(r);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
}
|
||||
101
src/main/java/uk/org/mafoo/cpomssummariser/Record.java
Normal file
101
src/main/java/uk/org/mafoo/cpomssummariser/Record.java
Normal file
@@ -0,0 +1,101 @@
|
||||
package uk.org.mafoo.cpomssummariser;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class Record {
|
||||
|
||||
private final String p_sex;
|
||||
private final String p_group;
|
||||
private final Map<String, List<String>> p_categories;
|
||||
private final boolean p_send;
|
||||
private final boolean p_pp;
|
||||
|
||||
private static final String topLevelCategories[] = {
|
||||
"Cause for Concern - Green form",
|
||||
"Bullying/ Friendship Related Issues"
|
||||
};
|
||||
|
||||
private static List<String> p_groups = new ArrayList<String>();
|
||||
|
||||
private Map<String, List<String>> splitCategories(String str) {
|
||||
Map<String, List<String>> categories = new HashMap<String, List<String>>();
|
||||
for (String cat : topLevelCategories) {
|
||||
categories.put(cat, new ArrayList<String>());
|
||||
}
|
||||
|
||||
String currentTopLevelCategory = null;
|
||||
for (String cat : str.split(", ")) {
|
||||
if (cat.equals("Categories")) continue; // Skip the header line
|
||||
if (categories.containsKey(cat)) {
|
||||
currentTopLevelCategory = cat;
|
||||
} else {
|
||||
assert(currentTopLevelCategory != null);
|
||||
categories.get(currentTopLevelCategory).add(cat);
|
||||
}
|
||||
}
|
||||
|
||||
return categories;
|
||||
}
|
||||
|
||||
private boolean boolstrToBool(String str) {
|
||||
if(str == "Yes")
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
public Record (String sex, String group, String categories, String send, String pp) {
|
||||
this.p_sex = sex;
|
||||
this.p_group = "Year " + group;
|
||||
this.p_categories = splitCategories(categories);
|
||||
this.p_send = boolstrToBool(send);
|
||||
this.p_pp = boolstrToBool(pp);
|
||||
|
||||
if(! p_groups.contains(group)) p_groups.add("Year " + group);
|
||||
}
|
||||
|
||||
protected String getSex() {
|
||||
return p_sex;
|
||||
}
|
||||
|
||||
protected String getGroup() {
|
||||
return p_group;
|
||||
}
|
||||
|
||||
protected Map<String, List<String>> getCategories() {
|
||||
return p_categories;
|
||||
}
|
||||
|
||||
protected boolean getSEND() {
|
||||
return p_send;
|
||||
}
|
||||
|
||||
protected boolean getPP() {
|
||||
return p_pp;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return Map.of(
|
||||
"Sex", getSex(),
|
||||
"Group", getGroup(),
|
||||
"Categories", getCategories(),
|
||||
"SEND", getSEND(),
|
||||
"PP", getPP()
|
||||
).toString();
|
||||
}
|
||||
|
||||
public static List<String> getGroups() {
|
||||
return Collections.unmodifiableList(p_groups);
|
||||
}
|
||||
|
||||
public static List<String> getTopLevelCategories() {
|
||||
return new ArrayList<String>(Arrays.asList(topLevelCategories));
|
||||
}
|
||||
}
|
||||
57
src/main/java/uk/org/mafoo/cpomssummariser/Summariser.java
Normal file
57
src/main/java/uk/org/mafoo/cpomssummariser/Summariser.java
Normal file
@@ -0,0 +1,57 @@
|
||||
package uk.org.mafoo.cpomssummariser;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import uk.org.mafoo.cpomssummariser.DataModel.CategoryGroupData;
|
||||
|
||||
public class Summariser {
|
||||
|
||||
List<Record> records;
|
||||
Map<String, Map<String, CategoryGroupData>> data = new HashMap<String, Map<String, CategoryGroupData>>();
|
||||
|
||||
public Summariser(List<Record> records) {
|
||||
this.records = records;
|
||||
|
||||
// Prepare the top-level data structure
|
||||
for (String c : Record.getTopLevelCategories()) {
|
||||
Map<String, CategoryGroupData> cat = new HashMap<String, CategoryGroupData>();
|
||||
for (String g : Record.getGroups()) {
|
||||
cat.put(g, new CategoryGroupData(g));
|
||||
}
|
||||
data.put(c, cat);
|
||||
System.out.println("[Summariser] Created: " + c);
|
||||
}
|
||||
process();
|
||||
|
||||
}
|
||||
|
||||
Map<String, CategoryGroupData> data_getOrCreate(String cat) {
|
||||
if(! data.containsKey(cat)) {
|
||||
Map<String, CategoryGroupData> tmp = new HashMap<String, CategoryGroupData>();
|
||||
for (String g : Record.getGroups()) {
|
||||
tmp.put(g, new CategoryGroupData(g));
|
||||
}
|
||||
data.put(cat, tmp);
|
||||
}
|
||||
return data.get(cat);
|
||||
}
|
||||
|
||||
public void process() {
|
||||
for (Record record : records) {
|
||||
System.out.println("--> " + record);
|
||||
for (Entry<String, List<String>> category : record.getCategories().entrySet()) {
|
||||
for (String subcat : category.getValue()) {
|
||||
String group = record.getGroup();
|
||||
Map<String, CategoryGroupData> x = data_getOrCreate(subcat);
|
||||
CategoryGroupData blob = x.get(group);
|
||||
if(record.getSEND()) blob.incrementSEND();
|
||||
if(record.getPP()) blob.incrementPP();
|
||||
blob.incrementSexValue(record.getSex());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
19
src/test/java/uk/org/mafoo/cpomssummariser/AppTest.java
Normal file
19
src/test/java/uk/org/mafoo/cpomssummariser/AppTest.java
Normal file
@@ -0,0 +1,19 @@
|
||||
package uk.org.mafoo.cpomssummariser;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* Unit test for simple App.
|
||||
*/
|
||||
public class AppTest {
|
||||
|
||||
/**
|
||||
* Rigorous Test :-)
|
||||
*/
|
||||
@Test
|
||||
public void shouldAnswerWithTrue() {
|
||||
assertTrue(true);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user