]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.excel.poi/src/org/simantics/excel/poi/parser/ColumnResolver.java
1aaec8039c8dc455afd1cbd51411657c60e3cc73
[simantics/interop.git] / org.simantics.excel.poi / src / org / simantics / excel / poi / parser / ColumnResolver.java
1 package org.simantics.excel.poi.parser;\r
2 \r
3 import java.util.HashMap;\r
4 import java.util.HashSet;\r
5 import java.util.Map;\r
6 import java.util.Map.Entry;\r
7 import java.util.Set;\r
8 \r
9 import org.apache.poi.ss.usermodel.Cell;\r
10 import org.apache.poi.ss.usermodel.Row;\r
11 \r
12 public class ColumnResolver {\r
13         \r
14         private enum Type {SINGLE,MULTI};\r
15         \r
16         private Map<String,int[]> values = new HashMap<String, int[]>();\r
17         private Map<String,Type> types = new HashMap<String, Type>();\r
18         private Set<String> optional = new HashSet<String>();\r
19         private Set<String> resolved = new HashSet<String>();\r
20         \r
21         public void addSingleColumn(String id) {\r
22                 addSingleColumn(id, true);\r
23         }\r
24         \r
25         public void addSingleColumn(String id, boolean required) {\r
26                 types.put(id, Type.SINGLE);\r
27                 if (!required)\r
28                         this.optional.add(id);\r
29         }\r
30         \r
31         public void addMultiColumn(String id) {\r
32                 addMultiColumn(id, true);\r
33         }\r
34         \r
35         public void addMultiColumn(String id, boolean required) {\r
36                 types.put(id, Type.MULTI);\r
37                 if (!required)\r
38                         this.optional.add(id);\r
39         }\r
40         \r
41         \r
42         public int getSingleColumn(String id) {\r
43                 int[] val = values.get(id);\r
44                 if (val == null)\r
45                         return -1;\r
46                 if (val.length == 0)\r
47                         return -1;\r
48                 return val[0];\r
49         }\r
50         \r
51         public int[] getMultiColumn(String id) {\r
52                 return values.get(id);\r
53         }\r
54         \r
55         public boolean resolve(Row row) {\r
56                 return resolve(row, true);\r
57         }\r
58         \r
59         public boolean resolve(Row row, boolean ignoreCase) {\r
60                 values.clear();\r
61                 resolved.clear();\r
62                 if (row == null) {\r
63                         return false;\r
64                 }\r
65         \r
66                 for (int i = 0; i <= row.getLastCellNum(); i++) {\r
67                         Cell cell = row.getCell(i);\r
68                         if (cell == null)\r
69                                 continue;\r
70                         int colIndex = cell.getColumnIndex();\r
71                         String value = cell.getStringCellValue();\r
72                         for (Entry<String, Type> col : types.entrySet()) {\r
73                                 String id = col.getKey();\r
74                                 if (id.equals(value) || ignoreCase && id.equalsIgnoreCase(value)) {\r
75                                         if (col.getValue() == Type.SINGLE) {\r
76                                                 values.put(id, new int[]{colIndex});\r
77                                         } else {\r
78                                                 int curr[] = values.get(id);\r
79                                                 if (curr == null) {\r
80                                                         values.put(id, new int[]{colIndex});\r
81                                                 } else {\r
82                                                         int n[] = new int[curr.length+1];\r
83                                                         System.arraycopy(curr, 0, n, 0, curr.length);\r
84                                                         n[curr.length] = colIndex;\r
85                                                         values.put(id, n);\r
86                                                 }\r
87                                                 \r
88                                         }\r
89                                         resolved.add(id);\r
90                                         break;\r
91                                 }\r
92                         }\r
93                 }\r
94                 // check that required columns have been resolved\r
95                 for (Entry<String, Type> col : types.entrySet()) {\r
96                         if (!optional.contains(col.getKey())) {\r
97                                 if (!resolved.contains(col.getKey()))\r
98                                         return false;\r
99                         }\r
100                 }\r
101                 return true;\r
102                         \r
103         }\r
104         \r
105 \r
106 }\r