--- /dev/null
+package org.simantics.excel.poi.parser;\r
+\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.Map;\r
+import java.util.Map.Entry;\r
+import java.util.Set;\r
+\r
+import org.apache.poi.ss.usermodel.Cell;\r
+import org.apache.poi.ss.usermodel.Row;\r
+\r
+public class ColumnResolver {\r
+ \r
+ private enum Type {SINGLE,MULTI};\r
+ \r
+ private Map<String,int[]> values = new HashMap<String, int[]>();\r
+ private Map<String,Type> types = new HashMap<String, Type>();\r
+ private Set<String> optional = new HashSet<String>();\r
+ private Set<String> resolved = new HashSet<String>();\r
+ \r
+ public void addSingleColumn(String id) {\r
+ addSingleColumn(id, true);\r
+ }\r
+ \r
+ public void addSingleColumn(String id, boolean required) {\r
+ types.put(id, Type.SINGLE);\r
+ if (!required)\r
+ this.optional.add(id);\r
+ }\r
+ \r
+ public void addMultiColumn(String id) {\r
+ addMultiColumn(id, true);\r
+ }\r
+ \r
+ public void addMultiColumn(String id, boolean required) {\r
+ types.put(id, Type.MULTI);\r
+ if (!required)\r
+ this.optional.add(id);\r
+ }\r
+ \r
+ \r
+ public int getSingleColumn(String id) {\r
+ int[] val = values.get(id);\r
+ if (val == null)\r
+ return -1;\r
+ if (val.length == 0)\r
+ return -1;\r
+ return val[0];\r
+ }\r
+ \r
+ public int[] getMultiColumn(String id) {\r
+ return values.get(id);\r
+ }\r
+ \r
+ public boolean resolve(Row row) {\r
+ return resolve(row, true);\r
+ }\r
+ \r
+ public boolean resolve(Row row, boolean ignoreCase) {\r
+ values.clear();\r
+ resolved.clear();\r
+ if (row == null) {\r
+ return false;\r
+ }\r
+ \r
+ for (int i = 0; i <= row.getLastCellNum(); i++) {\r
+ Cell cell = row.getCell(i);\r
+ if (cell == null)\r
+ continue;\r
+ int colIndex = cell.getColumnIndex();\r
+ String value = cell.getStringCellValue();\r
+ for (Entry<String, Type> col : types.entrySet()) {\r
+ String id = col.getKey();\r
+ if (id.equals(value) || ignoreCase && id.equalsIgnoreCase(value)) {\r
+ if (col.getValue() == Type.SINGLE) {\r
+ values.put(id, new int[]{colIndex});\r
+ } else {\r
+ int curr[] = values.get(id);\r
+ if (curr == null) {\r
+ values.put(id, new int[]{colIndex});\r
+ } else {\r
+ int n[] = new int[curr.length+1];\r
+ System.arraycopy(curr, 0, n, 0, curr.length);\r
+ n[curr.length] = colIndex;\r
+ values.put(id, n);\r
+ }\r
+ \r
+ }\r
+ resolved.add(id);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ // check that required columns have been resolved\r
+ for (Entry<String, Type> col : types.entrySet()) {\r
+ if (!optional.contains(col.getKey())) {\r
+ if (!resolved.contains(col.getKey()))\r
+ return false;\r
+ }\r
+ }\r
+ return true;\r
+ \r
+ }\r
+ \r
+\r
+}\r