View Javadoc
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  }