@Override
  protected <R extends XMLRenderer<T>, D extends T> ModelAndView update(
      String xmlCrudParameters, Class<R> renderedType, Class<D> delegatedType) {
    logger.trace(
        "Request for update " + getModelName() + " with parameters " + xmlCrudParameters + "!!!");

    try {
      R rendered = read(xmlCrudParameters, renderedType, delegatedType);

      getCrudService().update(beforeUpdate(rendered.getDelegated()));

      return getXMLViewer(
          getInfo(
              getMessages()
                  .getMessage(
                      GeneralProperties.class.getName()
                          + "."
                          + GeneralProperties.INFO_TITLE.name()),
              getMessages()
                  .getMessage(
                      GeneralProperties.class.getName()
                          + "."
                          + GeneralProperties.UPDATE_SUCCEED.name(),
                      getModelName())));
    } catch (Exception e) {
      return handleException(
          e, GeneralProperties.class.getName() + "." + GeneralProperties.UPDATE_FAILED.name());
    }
  }
  protected ModelAndView delete(ID id) {
    try {
      getCrudService().remove(id);

      return getXMLViewer(
          getInfo(
              getMessages()
                  .getMessage(
                      GeneralProperties.class.getName()
                          + "."
                          + GeneralProperties.INFO_TITLE.name()),
              getMessages()
                  .getMessage(
                      GeneralProperties.class.getName()
                          + "."
                          + GeneralProperties.DELETE_SUCCEED.name(),
                      getModelName())));
    } catch (Exception e) {
      return handleException(
          e, GeneralProperties.class.getName() + "." + GeneralProperties.DELETE_FAILED.name());
    }
  }
  protected ModelAndView copy(T domainObject) {
    try {
      getCrudService().copy(beforeCopy(domainObject));

      return getXMLViewer(
          getInfo(
              getMessages()
                  .getMessage(
                      GeneralProperties.class.getName()
                          + "."
                          + GeneralProperties.INFO_TITLE.name()),
              getMessages()
                  .getMessage(
                      GeneralProperties.class.getName()
                          + "."
                          + GeneralProperties.COPY_SUCCEED.name(),
                      getModelName())));
    } catch (Exception e) {
      return handleException(
          e, GeneralProperties.class.getName() + "." + GeneralProperties.COPY_FAILED.name());
    }
  }