]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.excel.poi/src/org/simantics/excel/poi/parser/ColumnResolver.java
Excel parsing interface
[simantics/interop.git] / org.simantics.excel.poi / src / org / simantics / excel / poi / parser / ColumnResolver.java
diff --git a/org.simantics.excel.poi/src/org/simantics/excel/poi/parser/ColumnResolver.java b/org.simantics.excel.poi/src/org/simantics/excel/poi/parser/ColumnResolver.java
new file mode 100644 (file)
index 0000000..1aaec80
--- /dev/null
@@ -0,0 +1,106 @@
+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