package tutorial.spring25.helper; import java.util.List; import java.util.Locale; import java.util.StringTokenizer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.stereotype.Component; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.ObjectError; import tutorial.spring25.common.ParseError; import tutorial.spring25.model.Person; import tutorial.spring25.validator.PersonValidator; @Component public class PersonCSVParser { private static final int PERSON_NUM_FIELDS = 2; private String delimiter = ","; private MessageSource messageSource; public void setDelimiter(String delimiter) { this.delimiter = delimiter; } @Autowired(required=true) public void setMessageSource(MessageSource messageSource) { this.messageSource = messageSource; } /** * parse strings of data into list of Person. * Check for : * * @param data list of string to be parsed * @param result list of person generated from data * @param errors bad data information * */ @SuppressWarnings("unchecked") public void parse(List data, List result, List errors) { int counter = 0; for(String text : data){ counter++; // skip blank lines if(null == text || "".equals(text.trim()) || text.trim().length() < 1) { continue; } StringTokenizer tokenizer = new StringTokenizer(text, delimiter); // check for malformed data if(tokenizer.countTokens() != PERSON_NUM_FIELDS) { errors.add(new ParseError(counter, text, messageSource.getMessage("parseerror.reason.malformed", new Object[]{2,tokenizer.countTokens()}, Locale.getDefault()))); continue; } final Person person = new Person(); person.setName(tokenizer.nextToken()); person.setEmail(tokenizer.nextToken()); // check using validator final PersonValidator personValidator = new PersonValidator(); final BeanPropertyBindingResult bindErrors = new BeanPropertyBindingResult(person, "person"); personValidator.validate(person, bindErrors); if(bindErrors.hasErrors()) { List bindErrorContent = bindErrors.getAllErrors(); for (ObjectError objectError : bindErrorContent) { errors.add(new ParseError(counter, text, messageSource.getMessage(objectError.getCode(), objectError.getArguments(), Locale.getDefault()))); } continue; } result.add(person); } } }