001 package jp.osdl.jbento2.chart; 002 003 import java.io.File; 004 import java.io.FileReader; 005 import java.io.IOException; 006 import java.io.Reader; 007 import java.util.Arrays; 008 import java.util.List; 009 010 import org.apache.commons.io.IOUtils; 011 import org.jfree.data.general.AbstractDataset; 012 013 public abstract class DataSetBuilderBase implements DataSetBuilder { 014 015 private String srcFile; 016 private String[] categories; 017 private String endOfData; 018 019 public AbstractDataset createDataSet(File srcFile) throws IOException { 020 021 AbstractDataset dataset = newDataset(); 022 023 // read srcFile 024 Reader reader = null; 025 List lines = null; 026 try { 027 reader = new FileReader(srcFile); 028 lines = IOUtils.readLines(reader); 029 if (lines.isEmpty()) { 030 throw new IllegalArgumentException("srcFile"); 031 } 032 } finally { 033 IOUtils.closeQuietly(reader); 034 } 035 036 // find first line 037 int firstLineIndex = getFirstLineIndex(lines); 038 if (firstLineIndex == -1) { 039 throw new IllegalArgumentException("srcFile"); 040 } 041 String firstLine = (String)lines.get(firstLineIndex); 042 043 // initialize categories 044 String[] columns = splitLine(firstLine); 045 if (categories == null) { 046 categories = new String[columns.length - 1]; 047 System.arraycopy(columns, 1, categories, 0, columns.length - 1); 048 } 049 int[] categoryIndexes = getCategoryIndexes(categories, columns); 050 051 // process body 052 for (int i = firstLineIndex + 1; i < lines.size(); i++) { 053 String line = (String)lines.get(i); 054 if (endOfData != null && line.startsWith(endOfData)) { 055 break; 056 } 057 String[] data = splitLine(line); 058 if (data.length != columns.length) { 059 continue; 060 } 061 for (int j = 0; j < categories.length; j++) { 062 add(dataset, data[0], categories[j], data[categoryIndexes[j]]); 063 } 064 } 065 066 return dataset; 067 } 068 069 abstract protected AbstractDataset newDataset(); 070 071 abstract protected void add( 072 AbstractDataset dataset, String row, String column, String value); 073 074 public String[] getCategories() { 075 return categories; 076 } 077 078 public void setCategories(String[] categories) { 079 this.categories = categories; 080 } 081 082 public String getEndOfData() { 083 return endOfData; 084 } 085 086 public void setEndOfData(String endOfData) { 087 this.endOfData = endOfData; 088 } 089 090 public String getSrcFile() { 091 return srcFile; 092 } 093 094 public void setSrcFile(String srcFile) { 095 this.srcFile = srcFile; 096 } 097 098 private int getFirstLineIndex(List lines) { 099 for (int i = 0; i < lines.size(); i++) { 100 String line = (String)lines.get(i); 101 if (line != null && line.split(",").length != 0) { 102 return i; 103 } 104 } 105 return -1; 106 } 107 108 private String[] splitLine(String line) { 109 String[] result = line.split(","); 110 for (int i = 0; i < result.length; i++) { 111 result[i] = result[i].trim(); 112 } 113 return result; 114 } 115 116 private int[] getCategoryIndexes(String[] categories, String[] columns) { 117 int[] result = new int[categories.length]; 118 List list = Arrays.asList(columns); 119 for (int i = 0; i < categories.length; i++) { 120 String category = categories[i]; 121 int index = list.indexOf(category); 122 if (index == -1) { 123 throw new IllegalArgumentException( 124 "category " + category + " is not found in " + srcFile); 125 } 126 result[i] = index; 127 } 128 return result; 129 } 130 131 }