001 package nl.cwi.sen1.visplugin.csvexport;
002
003 import java.io.IOException;
004 import java.nio.charset.Charset;
005
006 import nl.cwi.sen1.relationstores.types.RElem;
007 import nl.cwi.sen1.relationstores.types.RElemElements;
008 import nl.cwi.sen1.relationstores.types.RTuple;
009 import nl.cwi.sen1.relationstores.types.RType;
010 import nl.cwi.sen1.relationstores.types.RTypeColumnTypes;
011
012 import com.csvreader.CsvWriter;
013
014 /**
015 * CSV export functionality for RTuples
016 * @author Chris Woolderink
017 * @author Antoine Savelkoul
018 */
019 public class Exporter {
020
021 /**
022 * Enumeration used to indicate which part of a RTuple should be exported to CSV
023 * @author Antoine Savelkoul
024 * @author Chris Woolderink
025 * @date 14-03-2007
026 */
027 public enum ExportSelection {
028 DATA_ONLY,
029 DATA_WITH_HEADERS
030 }
031
032 /**
033 * Writes the content of a RTuple to an CSV formatted file
034 * @param rTuple the RTuple to be exported
035 * @param fileName the name of the output file
036 * @param selection indicates which information has to be exported
037 * @author Antoine Savelkoul
038 * @author Chris Woolderink
039 * @date 13-03-2007
040 */
041 public static void exportToFile(RTuple rTuple, String fileName, ExportSelection selection) throws IOException {
042 CsvWriter csvWriter = new CsvWriter(fileName,',',Charset.forName("UTF-8"));
043 export(rTuple, csvWriter, selection);
044 csvWriter.close();
045 }
046
047 /**
048 * Writes the content of a RTupe to a CSV writer
049 * @param rTuple the RTuple to be exported
050 * @param csvWriter the CSV writer to produce the output
051 * @param selection indicates which information has to be exported
052 * @author Antoine Savelkoul
053 * @author Chris Woolderink
054 * @date 13-03-2007
055 */
056 public static void export(RTuple rTuple, CsvWriter csvWriter, ExportSelection selection) throws IOException {
057 RType rType = rTuple.getRtype();
058 RTypeColumnTypes columnTypes = rType.getColumnTypes();
059
060 if( selection == ExportSelection.DATA_WITH_HEADERS ) {
061 exportColumnTypes(columnTypes, csvWriter);
062 }
063 exportData(rTuple, csvWriter);
064 }
065
066 /**
067 * Writes the data of an rTuple to the CvsWriter
068 * @param rTuple the RTuple to be exported
069 * @param csvWriter the CSV writer to produce the output
070 * @author Antoine Savelkoul
071 * @author Chris Woolderink
072 * @date 13-03-2007
073 */
074 private static void exportData( RTuple rTuple, CsvWriter csvWriter ) throws IOException {
075 RElem value = rTuple.getValue();
076 RElemElements valueElements = value.getElements();
077
078 RType rType = rTuple.getRtype();
079 RTypeColumnTypes columnTypes = rType.getColumnTypes();
080
081 int columnCount = columnTypes.getLength();
082 int rowCount = valueElements.getLength();
083 String[] rowData = new String[columnCount];
084
085 for(int row = 0; row < rowCount; row++) {
086
087 RElem tuple = valueElements.getRElemAt(row);
088 RElemElements tupleElements = tuple.getElements();
089
090 for(int column = 0; column < columnCount; column++) {
091 // Read all cells from the row
092 RElem elem = tupleElements.getRElemAt(column);
093 rowData[column] = RElemToString(elem);
094 }
095 // Write the row to the output stream
096 csvWriter.writeRecord(rowData);
097 }
098 }
099
100 /**
101 * Writes the data types as headers to the CvsWriter
102 * @param columnTypes column types information that will be used as headers
103 * @param writer The CSV writer to produce the output
104 * @author Antoine Savelkoul
105 * @author Chris Woolderink
106 * @date 13-03-2007
107 */
108 private static void exportColumnTypes( RTypeColumnTypes columnTypes, CsvWriter writer ) throws IOException {
109 int numColumns = columnTypes.getLength();
110 String[] columnNames = new String[numColumns];
111
112 // Copies each of the type names to the array
113 for(int columnNum = 0; columnNum < numColumns; columnNum++) {
114 RType columnType = columnTypes.getRTypeAt(columnNum);
115 columnNames[columnNum] = columnType.toString();
116 }
117 writer.writeRecord( columnNames );
118 }
119
120 /**
121 * Converts the value of a simple RElem to a String
122 * @param elem the RElem to be converted
123 * @return the converted RElem
124 * @author Antoine Savelkoul
125 * @author Chris Woolderink
126 * @date 13-03-2007
127 */
128 private static String RElemToString(RElem elem) {
129
130 if( elem.isStr() ) {
131 return elem.getStrCon();
132 }
133
134 if( elem.isInt() ) {
135 return Integer.toString( elem.getInteger().getNatCon() );
136 }
137
138 if( elem.isBool() ) {
139 return elem.getBoolCon().toString();
140 }
141
142 if( elem.isLoc() ) {
143 return elem.getLocation().toString();
144 }
145
146 return elem.toString();
147 }
148 }