import parser.BeanParser;
import java.io.*;
import java.lang.reflect.Field;
import java.util.*;
/**
* Date: 2010-11-08
*/
public class Parser {
private Set parsers = new HashSet();
private Class<?> clazz;
private List<Field> afields;
private List results = new ArrayList();
public static void main(String[] args) {
Parser parser = new Parser();
parser.addBean(new SampleBean());
long t = System.currentTimeMillis();
List result = parser.parse("data/file.txt");
System.out.println("t = " + (System.currentTimeMillis() - t) / 1000.0);
}
private void addBean(SampleBean sampleBean) {
clazz = sampleBean.getClass();
parsers.add(new BeanParser().decode(sampleBean.getClass()));
}
private List parse(String s) {
File file = new File(s);
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
BeanParser parser = (BeanParser) parsers.iterator().next();
while ((line = reader.readLine()) != null) {
List<Object> objects = parseLine(line, parser);
Object bean = createBean(clazz);
fillValues(bean, objects);
results.add(bean);
}
} catch (FileNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return null; //To change body of created methods use File | Settings | File Templates.
}
private void fillValues(Object bean, List<Object> objects) {
List<Field> afields = getAnnotatedFields(clazz);
for (int i = 0; i < afields.size(); i++) {
try {
afields.get(i).set(bean, objects.get(i));
} catch (IllegalAccessException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
private List<Field> getAnnotatedFields(Class<?> clazz) {
if (afields == null) {
Field[] fields1 = clazz.getDeclaredFields();
List<Field> fields = new ArrayList<Field>();
for (Field f : fields1) {
Parsed annotation = f.getAnnotation(Parsed.class);
fields.add(f);
}
afields = fields;
}
return afields; //To change body of created methods use File | Settings | File Templates.
}
private Object createBean(Class<?> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IllegalAccessException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return null;
}
private List<Object> parseLine(String line, BeanParser parser) {
return parser.parse(line);
// applyValues()
}
}