@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;
  }
 @Override
 protected ServletRequestDataBinder createBinder(HttpServletRequest request, Object command)
     throws Exception {
   ServletRequestDataBinder servletRequestDataBinder = super.createBinder(request, command);
   AnagraficaObjectDTO commandDTO = (AnagraficaObjectDTO) command;
   for (String shortName : commandDTO.getAnagraficaProperties().keySet()) {
     TP tipologiaProprieta =
         applicationService.findPropertiesDefinitionByShortName(
             clazzTipologiaProprieta, shortName);
     PropertyEditor propertyEditor =
         tipologiaProprieta.getRendering().getPropertyEditor(applicationService);
     if (propertyEditor instanceof FilePropertyEditor) {
       ((FilePropertyEditor) propertyEditor)
           .setExternalAuthority(String.valueOf(commandDTO.getParentId()));
       ((FilePropertyEditor) propertyEditor)
           .setInternalAuthority(String.valueOf(tipologiaProprieta.getId()));
     }
     if (tipologiaProprieta.getRendering() instanceof WidgetCombo) {
       WidgetCombo<P, TP> combo = (WidgetCombo<P, TP>) tipologiaProprieta.getRendering();
       for (int i = 0; i < 100; i++) {
         for (TP subtp : combo.getSottoTipologie()) {
           PropertyEditor subPropertyEditor =
               subtp.getRendering().getPropertyEditor(applicationService);
           if (subPropertyEditor instanceof FilePropertyEditor) {
             ((FilePropertyEditor) subPropertyEditor)
                 .setExternalAuthority(String.valueOf(commandDTO.getParentId()));
             ((FilePropertyEditor) subPropertyEditor)
                 .setInternalAuthority(String.valueOf(subtp.getId()));
           }
           String path =
               "anagraficaProperties["
                   + shortName
                   + "]["
                   + i
                   + "].object.anagraficaProperties["
                   + subtp.getShortName()
                   + "]";
           servletRequestDataBinder.registerCustomEditor(
               ValoreDTO.class, path, new ValoreDTOPropertyEditor(subPropertyEditor));
           servletRequestDataBinder.registerCustomEditor(
               Object.class, path + ".object", subPropertyEditor);
           logger.debug(
               "Registrato Wrapper del property editor: "
                   + propertyEditor
                   + " per il path (combo): "
                   + path);
           logger.debug(
               "Registrato property editor: "
                   + propertyEditor
                   + " per il path (combo): "
                   + path
                   + ".object");
         }
       }
     } else {
       String path = "anagraficaProperties[" + shortName + "]";
       servletRequestDataBinder.registerCustomEditor(
           ValoreDTO.class, path, new ValoreDTOPropertyEditor(propertyEditor));
       // per le checkbox
       servletRequestDataBinder.registerCustomEditor(
           Object.class, path + ".object", propertyEditor);
       logger.debug(
           "Registrato Wrapper del property editor: " + propertyEditor + " per il path: " + path);
       logger.debug(
           "Registrato property editor: " + propertyEditor + " per il path: " + path + ".object");
     }
   }
   return servletRequestDataBinder;
 }