public String getBookDetailsAsString(String id) {
    Book book = hBookDetails.get(id);
    String json = "";
    ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
    JSONObject ret = new JSONObject();

    ret.put("id", book.getId());
    ret.put("author", book.getAuthor());
    ret.put("name", book.getName());
    ret.put("description", book.getDescription());
    ret.put("category", book.getCategory());
    ret.put("price", book.getPrice());
    ret.put("isNew", book.getIsNew());

    try {

      json = ow.writeValueAsString(book.getComments());
      ret.put("comments", new JSONArray(json));

    } catch (IOException e) {
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace();
    }

    return ret.toString();
  }
  public String getInitialization() {
    Locale locale = threadLocale.getLocale();

    JSONObject spec = new JSONObject();

    DateFormatSymbols symbols = new DateFormatSymbols(locale);

    spec.put("months", new JSONArray((Object[]) symbols.getMonths()));

    StringBuilder days = new StringBuilder();

    String[] weekdays = symbols.getWeekdays();

    Calendar c = Calendar.getInstance(locale);

    int firstDay = c.getFirstDayOfWeek();

    // DatePicker needs them in order from monday to sunday.

    for (int i = Calendar.MONDAY; i <= Calendar.SATURDAY; i++) {
      days.append(weekdays[i].substring(0, 1));
    }

    days.append(weekdays[Calendar.SUNDAY].substring(0, 1));

    spec.put("days", days.toString().toLowerCase(locale));

    // jQuery DatePicker widget expects 0 to be sunday. Calendar defines SUNDAY as 1, MONDAY as 2,
    // etc.
    spec.put("firstDay", firstDay - 1);

    // set language
    spec.put("language", locale.getLanguage());

    // TODO: Skip localization if locale is English?

    return String.format("Tapestry.DateField.initLocalization(%s);", spec.toString(compactJSON));
  }