@Override
  protected Map<String, Object> referenceData(
      HttpServletRequest request, Object command, Errors errors, int page) throws Exception {
    UserSessionData usd = getUserSessionData(request);
    Map<String, Object> referenceData = new HashMap<String, Object>();
    int currentPage = getCurrentPage(request);

    log.debug("referenceData: Current page in refData " + currentPage);

    referenceData.put("dirtyFlag", usd.isDirty() ? "true" : "false");
    referenceData.put("ImageUrlBuilder", urlBuilder);
    referenceData.put("allSizes", imageSizeDefMgr.getAllImageSizes());
    referenceData.put("page", currentPage);

    MasterImageMetaData mimd = usd.getMimd();

    if (usd.getPages() == null) {
      log.debug("referenceData: no pages defined yet");
      setPagesDynamically(request, null);
    }
    int pageCount = usd.getPages().length;
    log.debug("Page count is " + pageCount);
    referenceData.put("pagecount", pageCount);

    if (currentPage == 0) {
      String sizedDivStyle = "none";
      if (StringUtils.isNotBlank(mimd.getImageKey())) {
        sizedDivStyle = "block";
      }
      referenceData.put("sizedDivStyle", sizedDivStyle);
      referenceData.put("allDisplaySizes", buildAllSizesList(mimd));
      referenceData.put("metadata", buildMasterImageDisplay(mimd));
    }

    if (currentPage > 0 && currentPage < getPageCount(request, command) - 1) {
      SizedImageMetaData simd = getCurrentSizedImage(mimd, currentPage - 1);
      referenceData.put("SizedImage", simd);
      Map<String, String> cropbox = buildCropBox(simd);
      referenceData.put("cropbox", cropbox);
      ImageSizeDefinition isd = simd.getSizeDefinition();
      referenceData.put("sizecode", isd.getCode());
      referenceData.put("sizelabel", isd.getLabel());
      referenceData.put("definedHeight", isd.getHeight());
      referenceData.put("definedWidth", isd.getWidth());

      Map<String, String> displayImage = buildDisplayImage(usd);
      referenceData.put("displayImage", displayImage);

    } else if (currentPage == getPageCount(request, command) - 1) { // this is the confirm page.

      Map<String, String> displayImage = buildDisplayImage(usd);
      referenceData.put("displayImage", displayImage);
      List<Map<String, String>> sizedImagesDisplay =
          buildAllSizedImagesDisplay(mimd.getSizedImages());
      referenceData.put("sizedImages", sizedImagesDisplay);
    }

    return referenceData;
  }
  protected List<Map<String, String>> buildAllSizesList(MasterImageMetaData mimd) {
    List<Map<String, String>> allSizes = new ArrayList<Map<String, String>>();
    Map<String, SizedImageMetaData> sizedImages = mimd.getSizedImages();

    for (ImageSizeDefinition size : imageSizeDefMgr.getAllImageSizes()) {
      Map<String, String> sizeData = new HashMap<String, String>();
      sizeData.put("code", size.getCode());
      sizeData.put("label", size.getLabel());
      if (sizedImages.containsKey(size.getCode())) {
        sizeData.put("checked", "checked");
      }
      allSizes.add(sizeData);
    }

    return allSizes;
  }
  public void init() throws Exception {
    if (imageCacheManager == null) {
      imageCacheManager = ImageCacheManagerLocator.getImageCacheManager();
    }
    if (imageSizeDefMgr == null) {
      imageSizeDefMgr = ImageSizeDefinitionManagerLocator.getImageSizeDefinitionManager();
    }

    // these should be initialized from the Spring bean defn.
    Validate.notNull(imageResizeMgr);
    Validate.notNull(urlBuilder);
    Validate.notNull(imagePersistenceManager);

    log.debug(
        "ImageEditorWizard: ----------------------------  Starting the ImageEditorWizard controller....----------------------------");
    // Most pages possible for the wizard:

    int maxSize = 2 + imageSizeDefMgr.getAllImageSizes().size();
    String[] wizardPages = new String[maxSize];
    wizardPages[0] = MAIN_PAGE;
    wizardPages[maxSize - 1] = CONFIRM_PAGE;
    for (int i = 1; i < maxSize - 1; i++) {
      wizardPages[i] = SIZE_PAGE;
    }

    setPages(wizardPages);

    String outputWp = "";
    for (int j = 0; j < wizardPages.length; j++) outputWp += "[" + wizardPages[j] + "]  ";

    log.debug(
        "ImageEditorWizard: ----------------------------  Wizard Pages: "
            + outputWp
            + "  ----------------------------");
    log.debug(
        "ImageEditorWizard: ----------------------------  Wizard Pages length: "
            + wizardPages.length
            + "  ----------------------------");
  }