1 package org.kuali.common.devops.logic.function;
2
3 import static com.google.common.collect.Sets.newTreeSet;
4 import static org.kuali.common.util.base.Precondition.checkNotNull;
5
6 import java.util.List;
7 import java.util.Locale;
8 import java.util.SortedSet;
9
10 import org.kuali.common.devops.metadata.model.format.TagListFormatAnnotationFormatterFactory;
11 import org.kuali.common.devops.table.TableCellDescriptor;
12 import org.kuali.common.util.spring.convert.DefaultConversionService;
13 import org.kuali.common.util.spring.format.CsvStringFormatter;
14 import org.springframework.core.convert.ConversionService;
15 import org.springframework.core.convert.TypeDescriptor;
16 import org.springframework.format.Formatter;
17
18 import com.google.common.base.Function;
19 import com.google.common.base.Joiner;
20 import com.google.common.base.Optional;
21 import com.google.common.collect.ImmutableList;
22 import com.google.common.collect.Lists;
23 import com.google.common.collect.Table;
24
25 public final class ToCsvFunction<R, C> implements Function<Table<? extends Comparable<R>, ? extends Comparable<C>, TableCellDescriptor<Object>>, List<String>> {
26
27 private final Joiner joiner = Joiner.on(',');
28 private final ConversionService converter = getConversionService();
29 private final Formatter<String> formatter = CsvStringFormatter.create();
30 private final TypeDescriptor targetType = TypeDescriptor.valueOf(String.class);
31 private final Locale locale = Locale.getDefault();
32
33 public static final ConversionService getConversionService() {
34 DefaultConversionService service = new DefaultConversionService();
35 service.addFormatterForFieldAnnotation(new TagListFormatAnnotationFormatterFactory());
36 return service;
37 }
38
39 @Override
40 public List<String> apply(Table<? extends Comparable<R>, ? extends Comparable<C>, TableCellDescriptor<Object>> table) {
41 checkNotNull(table, "table");
42 SortedSet<Comparable<R>> rowKeys = newTreeSet(table.rowKeySet());
43 SortedSet<Comparable<C>> colKeys = newTreeSet(table.columnKeySet());
44 List<String> lines = Lists.newArrayList();
45 lines.add(getHeader(colKeys));
46 for (Comparable<R> rowKey : rowKeys) {
47 List<String> tokens = Lists.newArrayList();
48 for (Comparable<C> colKey : colKeys) {
49 TableCellDescriptor<Object> descriptor = table.get(rowKey, colKey);
50 String token = getToken(descriptor);
51 tokens.add(token);
52 }
53 String joined = joiner.join(tokens);
54 lines.add(joined);
55 }
56 return ImmutableList.copyOf(lines);
57 }
58
59 protected String getToken(TableCellDescriptor<Object> descriptor) {
60 TypeDescriptor sourceType = new TypeDescriptor(descriptor.getField());
61 Optional<Object> value = descriptor.getFieldValue();
62 String converted = (String) converter.convert(value.orNull(), sourceType, targetType);
63 return formatter.print(converted, locale);
64 }
65
66 protected String getHeader(SortedSet<Comparable<C>> colKeys) {
67 List<String> tokens = Lists.newArrayList();
68 for (Comparable<C> colKey : colKeys) {
69 tokens.add(colKey.toString());
70 }
71 return joiner.join(tokens);
72 }
73
74 }