From 0dfc15c7abae1ebfe220ed3cd0fd034aaddae745 Mon Sep 17 00:00:00 2001 From: Matthew Slowe Date: Sun, 12 Oct 2025 15:51:38 +0100 Subject: [PATCH] import (not working) --- pom.xml | 145 ++++++++++++++++++ .../uk/org/mafoo/cpomssummariser/App.java | 66 ++++++++ .../cpomssummariser/DataModel/Category.java | 8 + .../DataModel/CategoryGroupData.java | 67 ++++++++ .../cpomssummariser/DataModel/Groups.java | 11 ++ .../uk/org/mafoo/cpomssummariser/Loader.java | 65 ++++++++ .../uk/org/mafoo/cpomssummariser/Parser.java | 23 +++ .../uk/org/mafoo/cpomssummariser/Record.java | 101 ++++++++++++ .../org/mafoo/cpomssummariser/Summariser.java | 57 +++++++ .../uk/org/mafoo/cpomssummariser/AppTest.java | 19 +++ 10 files changed, 562 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/uk/org/mafoo/cpomssummariser/App.java create mode 100644 src/main/java/uk/org/mafoo/cpomssummariser/DataModel/Category.java create mode 100644 src/main/java/uk/org/mafoo/cpomssummariser/DataModel/CategoryGroupData.java create mode 100644 src/main/java/uk/org/mafoo/cpomssummariser/DataModel/Groups.java create mode 100644 src/main/java/uk/org/mafoo/cpomssummariser/Loader.java create mode 100644 src/main/java/uk/org/mafoo/cpomssummariser/Parser.java create mode 100644 src/main/java/uk/org/mafoo/cpomssummariser/Record.java create mode 100644 src/main/java/uk/org/mafoo/cpomssummariser/Summariser.java create mode 100644 src/test/java/uk/org/mafoo/cpomssummariser/AppTest.java diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..7286ac4 --- /dev/null +++ b/pom.xml @@ -0,0 +1,145 @@ + + + 4.0.0 + + uk.org.mafoo.cpomssummariser + cpomssummariser + 1.0-SNAPSHOT + + cpomssummariser + + http://www.example.com + + + UTF-8 + 17 + + + + + + org.junit + junit-bom + 5.11.0 + pom + import + + + + + + + org.junit.jupiter + junit-jupiter-api + test + + + + org.junit.jupiter + junit-jupiter-params + test + + + + org.apache.poi + poi + 5.3.0 + + + org.apache.poi + poi-ooxml + 5.3.0 + + + org.jxls + jxls-jexcel + 1.0.9 + + + org.dhatim + fastexcel-reader + 0.18.1 + + + org.dhatim + fastexcel + 0.18.1 + + + + + + + + + maven-clean-plugin + 3.4.0 + + + + maven-resources-plugin + 3.3.1 + + + maven-compiler-plugin + 3.13.0 + + + maven-surefire-plugin + 3.3.0 + + + maven-jar-plugin + 3.4.2 + + + maven-install-plugin + 3.1.2 + + + maven-deploy-plugin + 3.1.2 + + + + maven-site-plugin + 3.12.1 + + + maven-project-info-reports-plugin + 3.6.1 + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.0 + + + + true + uk.org.mafoo.cpomssummariser.App + + + + + + + maven-assembly-plugin + + + + uk.org.mafoo.cpomssummariser.App + + + + jar-with-dependencies + + + + + + + diff --git a/src/main/java/uk/org/mafoo/cpomssummariser/App.java b/src/main/java/uk/org/mafoo/cpomssummariser/App.java new file mode 100644 index 0000000..8757c07 --- /dev/null +++ b/src/main/java/uk/org/mafoo/cpomssummariser/App.java @@ -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 rowIterator = sheet.iterator(); + while (rowIterator.hasNext()) { + + Row row = rowIterator.next(); + + //For each row, iterate through all the columns + Iterator 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> data = Loader.loadXlsx(file); + // System.out.println(data); + + List records = Parser.parse(data); + Summariser summariser = new Summariser(records); + + System.out.println("Ending..."); + } +} diff --git a/src/main/java/uk/org/mafoo/cpomssummariser/DataModel/Category.java b/src/main/java/uk/org/mafoo/cpomssummariser/DataModel/Category.java new file mode 100644 index 0000000..b9ebf64 --- /dev/null +++ b/src/main/java/uk/org/mafoo/cpomssummariser/DataModel/Category.java @@ -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> data) { + +} diff --git a/src/main/java/uk/org/mafoo/cpomssummariser/DataModel/CategoryGroupData.java b/src/main/java/uk/org/mafoo/cpomssummariser/DataModel/CategoryGroupData.java new file mode 100644 index 0000000..d2170d1 --- /dev/null +++ b/src/main/java/uk/org/mafoo/cpomssummariser/DataModel/CategoryGroupData.java @@ -0,0 +1,67 @@ +package uk.org.mafoo.cpomssummariser.DataModel; + +import java.util.HashMap; +import java.util.Map; + +public class CategoryGroupData { + + String group; + Map sex; + Integer SEND; + Integer PP; + + public CategoryGroupData(String group, Map 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(), + 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(); + } +} diff --git a/src/main/java/uk/org/mafoo/cpomssummariser/DataModel/Groups.java b/src/main/java/uk/org/mafoo/cpomssummariser/DataModel/Groups.java new file mode 100644 index 0000000..e397cf6 --- /dev/null +++ b/src/main/java/uk/org/mafoo/cpomssummariser/DataModel/Groups.java @@ -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 +} diff --git a/src/main/java/uk/org/mafoo/cpomssummariser/Loader.java b/src/main/java/uk/org/mafoo/cpomssummariser/Loader.java new file mode 100644 index 0000000..aff2f25 --- /dev/null +++ b/src/main/java/uk/org/mafoo/cpomssummariser/Loader.java @@ -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> loadXlsx(FileInputStream fd) throws IOException { + return loadXlsx(fd, true); + } + + public static List> loadXlsx(FileInputStream fd, boolean forceGroupToInteger) throws IOException { + List> 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 rowIterator = sheet.iterator(); + while (rowIterator.hasNext()) { + + Row row = rowIterator.next(); + List rowdata = new ArrayList(); + + // For each row, iterate through all the columns + Iterator 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; + } +} diff --git a/src/main/java/uk/org/mafoo/cpomssummariser/Parser.java b/src/main/java/uk/org/mafoo/cpomssummariser/Parser.java new file mode 100644 index 0000000..f12173e --- /dev/null +++ b/src/main/java/uk/org/mafoo/cpomssummariser/Parser.java @@ -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 parse(List> in) { + List out = new ArrayList(); + for (List 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; + } +} diff --git a/src/main/java/uk/org/mafoo/cpomssummariser/Record.java b/src/main/java/uk/org/mafoo/cpomssummariser/Record.java new file mode 100644 index 0000000..c9319fb --- /dev/null +++ b/src/main/java/uk/org/mafoo/cpomssummariser/Record.java @@ -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> 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 p_groups = new ArrayList(); + + private Map> splitCategories(String str) { + Map> categories = new HashMap>(); + for (String cat : topLevelCategories) { + categories.put(cat, new ArrayList()); + } + + 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> 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 getGroups() { + return Collections.unmodifiableList(p_groups); + } + + public static List getTopLevelCategories() { + return new ArrayList(Arrays.asList(topLevelCategories)); + } +} diff --git a/src/main/java/uk/org/mafoo/cpomssummariser/Summariser.java b/src/main/java/uk/org/mafoo/cpomssummariser/Summariser.java new file mode 100644 index 0000000..6444ef1 --- /dev/null +++ b/src/main/java/uk/org/mafoo/cpomssummariser/Summariser.java @@ -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 records; + Map> data = new HashMap>(); + + public Summariser(List records) { + this.records = records; + + // Prepare the top-level data structure + for (String c : Record.getTopLevelCategories()) { + Map cat = new HashMap(); + for (String g : Record.getGroups()) { + cat.put(g, new CategoryGroupData(g)); + } + data.put(c, cat); + System.out.println("[Summariser] Created: " + c); + } + process(); + + } + + Map data_getOrCreate(String cat) { + if(! data.containsKey(cat)) { + Map tmp = new HashMap(); + 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> category : record.getCategories().entrySet()) { + for (String subcat : category.getValue()) { + String group = record.getGroup(); + Map x = data_getOrCreate(subcat); + CategoryGroupData blob = x.get(group); + if(record.getSEND()) blob.incrementSEND(); + if(record.getPP()) blob.incrementPP(); + blob.incrementSexValue(record.getSex()); + } + } + } + } + +} diff --git a/src/test/java/uk/org/mafoo/cpomssummariser/AppTest.java b/src/test/java/uk/org/mafoo/cpomssummariser/AppTest.java new file mode 100644 index 0000000..829600e --- /dev/null +++ b/src/test/java/uk/org/mafoo/cpomssummariser/AppTest.java @@ -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); + } +}