1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.orangesignal.csv.io;
18
19 import java.io.Closeable;
20 import java.io.Flushable;
21 import java.io.IOException;
22 import java.util.Arrays;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.SortedMap;
26 import java.util.TreeMap;
27
28 import com.orangesignal.csv.CsvWriter;
29 import com.orangesignal.csv.filters.CsvValueFilter;
30
31
32
33
34
35
36
37 public class CsvColumnPositionMapWriter implements Closeable, Flushable {
38
39
40
41
42 private CsvWriter writer;
43
44
45
46
47 private CsvValueFilter filter;
48
49
50
51
52
53
54
55
56
57
58 public CsvColumnPositionMapWriter(final CsvWriter writer) {
59 if (writer == null) {
60 throw new IllegalArgumentException("CsvWriter must not be null");
61 }
62 this.writer = writer;
63 }
64
65
66
67
68
69
70
71 private void ensureOpen() throws IOException {
72 if (writer == null) {
73 throw new IOException("CsvWriter closed");
74 }
75 }
76
77
78
79
80 @Override
81 public void flush() throws IOException {
82 synchronized (this) {
83 ensureOpen();
84 writer.flush();
85 }
86 }
87
88 @Override
89 public void close() throws IOException {
90 synchronized (this) {
91 ensureOpen();
92 writer.close();
93 writer = null;
94 }
95 }
96
97
98
99
100
101
102
103
104
105
106
107 public boolean write(final Map<Integer, String> map) throws IOException {
108 synchronized (this) {
109 ensureOpen();
110
111
112 if (map == null) {
113 writer.writeValues(null);
114 return true;
115 }
116
117 final List<String> values = convert(map);
118 if (filter != null && !filter.accept(values)) {
119 return false;
120 }
121 writer.writeValues(values);
122 return true;
123 }
124 }
125
126 private List<String> convert(final Map<Integer, String> map) {
127 final String[] values = new String[getMaxColumnPosition(map) + 1];
128 for (final Map.Entry<Integer, String> e : map.entrySet()) {
129 final int pos = e.getKey();
130 if (pos >= 0) {
131 values[pos] = e.getValue();
132 }
133 }
134 return Arrays.asList(values);
135 }
136
137 private static int getMaxColumnPosition(final Map<Integer, String> map) {
138 final SortedMap<Integer, String> sortedMap;
139 if (map instanceof SortedMap) {
140 sortedMap = (SortedMap<Integer, String>) map;
141 } else {
142 sortedMap = new TreeMap<Integer, String>(map);
143 }
144 return Math.max(sortedMap.lastKey().intValue(), 0);
145 }
146
147
148
149
150
151
152
153
154
155 public CsvValueFilter getFilter() {
156 return filter;
157 }
158
159
160
161
162
163
164 public void setFilter(final CsvValueFilter filter) {
165 synchronized (this) {
166 this.filter = filter;
167 }
168 }
169
170 }