@Override
  protected ModelAndView onSubmit(
      HttpServletRequest request, HttpServletResponse response, Object object, BindException errors)
      throws Exception {
    AnagraficaObjectDTO anagraficaObjectDTO = (AnagraficaObjectDTO) object;

    if (request.getParameter("cancel") != null) {
      return new ModelAndView(listView);
    }

    EO anagraficaObject;
    List<TP> tipProprieta;
    if (anagraficaObjectDTO.getObjectId() != null) {
      anagraficaObject =
          applicationService.get(clazzAnagraficaObject, anagraficaObjectDTO.getObjectId());
      tipProprieta =
          applicationService.getListTipologieProprietaFirstLevel(clazzTipologiaProprieta);
    } else {
      anagraficaObject = clazzAnagraficaObject.newInstance();
      tipProprieta = applicationService.getTipologiaOnCreation(clazzTipologiaProprieta);
    }

    AnagraficaUtils.reverseDTO(anagraficaObjectDTO, anagraficaObject, tipProprieta);

    anagraficaObject.pulisciAnagrafica();
    applicationService.saveOrUpdate(clazzAnagraficaObject, anagraficaObject);
    saveMessage(request, getText("action.anagrafica.edited", request.getLocale()));

    return new ModelAndView(detailsView, "id", anagraficaObject.getId());
  }
  @Override
  protected Map referenceData(HttpServletRequest request, Object command, Errors errors)
      throws Exception {
    Map<String, Object> map = new HashMap<String, Object>();
    AnagraficaObjectDTO anagraficaObjectDTO = (AnagraficaObjectDTO) command;

    List<TP> tipProprieta;
    if (anagraficaObjectDTO.getObjectId() != null) {
      tipProprieta =
          applicationService.getListTipologieProprietaFirstLevel(clazzTipologiaProprieta);
    } else {
      tipProprieta = applicationService.getTipologiaOnCreation(clazzTipologiaProprieta);
    }

    map.put("tipologieProprieta", tipProprieta);
    map.put("simpleNameAnagraficaObject", clazzAnagraficaObject.getSimpleName());
    return map;
  }
  @Override
  protected void onBindAndValidate(HttpServletRequest request, Object command, BindException errors)
      throws Exception {

    super.onBindAndValidate(request, command, errors);
    IAnagraficaObjectDTO dto = (IAnagraficaObjectDTO) command;
    EO anagraficaObject = clazzAnagraficaObject.newInstance();

    List<TP> tipProprieta;
    if (dto.getObjectId() != null) {
      tipProprieta =
          applicationService.getListTipologieProprietaFirstLevel(clazzTipologiaProprieta);
    } else {
      tipProprieta = applicationService.getTipologiaOnCreation(clazzTipologiaProprieta);
    }

    // bind delle modifiche utente
    AnagraficaUtils.reverseDTO(dto, anagraficaObject, tipProprieta);
    // ricalcolo le formule
    formulaManager.ricalcolaFormule(anagraficaObject);
    // inserisco nel DTO i nuovi valori
    AnagraficaUtils.fillDTO(dto, anagraficaObject, tipProprieta);
  }
  @Override
  protected Object formBackingObject(HttpServletRequest request) throws Exception {

    AnagraficaObjectDTO anagraficaObjectDTO = new AnagraficaObjectDTO();

    String paramAnagraficaObjectId = request.getParameter("id");
    Integer anagraficaId;
    EO object;
    List<TP> tipProprieta;

    if (paramAnagraficaObjectId != null) {
      anagraficaId = Integer.parseInt(paramAnagraficaObjectId);
      object = applicationService.get(clazzAnagraficaObject, anagraficaId);
      tipProprieta =
          applicationService.getListTipologieProprietaFirstLevel(clazzTipologiaProprieta);
      anagraficaObjectDTO.setObjectId(anagraficaId);
    } else {
      tipProprieta = applicationService.getTipologiaOnCreation(clazzTipologiaProprieta);
      object = clazzAnagraficaObject.newInstance();
    }

    AnagraficaUtils.fillDTO(anagraficaObjectDTO, object, tipProprieta);
    return anagraficaObjectDTO;
  }