@RequestMapping(value = "search")
  public String search(
      Model model, @RequestParam("id") String jarid, @RequestParam("q") final String query) {
    model.addAttribute("id", jarid);
    model.addAttribute("query", query);

    if (Database.get(jarid) == null) {
      return null;
    }

    FileItem path = (FileItem) Database.get(jarid).getObj();
    model.addAttribute("jarFile", path);
    try {
      ClassMap classMap =
          ClassMap.build(new JarFile(new File(path.getFullName()).getCanonicalPath()));

      classMap.rebuildConfig(new RenameConfig(), null);

      model.addAttribute("classMap", classMap);

      final Set<String> matches = new TreeSet<String>();
      ClassWalker walker =
          new ClassWalker() {

            @Override
            public void walk(ClassInfo classInfo) {
              if (classInfo.getClassShortName().equals(query)) {
                matches.add(classInfo.getClassName());
              }
            }
          };

      classMap.walk(walker);

      if (matches.size() == 1) {
        model.addAttribute("clz", matches.iterator().next());
        return "redirect:/jarviewer/view.htm";
      }
      model.addAttribute("matches", matches);

    } catch (IOException e) {
      e.printStackTrace();
    }
    return "/jarviewer/search";
  }