package bg.bozho.ikratko.web;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import bg.bozho.ikratko.Checker;
import bg.bozho.ikratko.Checker.Mistake;
import bg.bozho.ikratko.Checker.Result;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.common.base.Joiner;
@Controller
public class HomeController {
@Autowired
private DatastoreService datastoreService;
@Autowired
private Checker checker;
@RequestMapping("/")
public String home() {
return "index";
}
@RequestMapping("/submit")
public String submit(@RequestParam String text, Model model) {
boolean singleWord = !text.trim().contains(" ");
if (singleWord) {
model.addAttribute("error", "singleWord");
}
Result result = checker.process(text, true);
List<String> mistakenWords = new ArrayList<String>(result.getMistakes().size());
List<String> otherMisspelledWords = new ArrayList<String>(result.getOtherSpellingMistakes().size());
for (Mistake mistake : result.getMistakes()) {
mistakenWords.add(mistake.getWord());
}
for (Mistake mistake : result.getOtherSpellingMistakes()) {
otherMisspelledWords.add(mistake.getWord());
}
// don't store single-word attempts
if (!singleWord) {
Entity check = new Entity("check");
check.setUnindexedProperty("text", text);
check.setUnindexedProperty("results", Joiner.on(", ").join(mistakenWords));
check.setUnindexedProperty("incorrect", Boolean.FALSE);
check.setProperty("date", System.currentTimeMillis());
Key key = datastoreService.put(check);
model.addAttribute("resultId", key.getId());
}
model.addAttribute("mistakes", result.getMistakes());
model.addAttribute("otherMistakes", Joiner.on(", ").join(otherMisspelledWords));
model.addAttribute("properNames", Joiner.on(", ").join(result.getProperNames()));
model.addAttribute("isCorrect", result.getMistakes().isEmpty());
model.addAttribute("input", text);
return "results";
}
@RequestMapping("/reportIncorrectResult")
@ResponseBody
public void reportIncorrectResult(@RequestParam long resultId) throws EntityNotFoundException {
Entity check = datastoreService.get(KeyFactory.createKey("check", resultId));
check.setUnindexedProperty("incorrect", Boolean.TRUE);
datastoreService.put(check);
}
}